ソースを参照

Merge branch 'feature-tenant'

chen.cheng 2 ヶ月 前
コミット
559c24c318
85 ファイル変更1923 行追加1129 行削除
  1. 4 0
      bd-park/park-backend/park-application/src/main/java/com/huashe/park/application/web/controller/cons/PileMachineInfoController.java
  2. 3 0
      bd-park/park-backend/park-application/src/main/java/com/huashe/park/application/web/controller/system/SysCustConfigController.java
  3. 102 0
      bd-park/park-backend/park-application/src/main/java/com/huashe/park/application/web/controller/system/SysTenantController.java
  4. 49 59
      bd-park/park-backend/park-application/src/main/java/com/huashe/park/application/web/controller/system/SysUserController.java
  5. 2 2
      bd-park/park-backend/park-application/src/main/resources/application-test.yml
  6. 2 0
      bd-park/park-backend/park-application/src/main/resources/application.yml
  7. 1 0
      bd-park/park-backend/park-application/src/main/resources/i18n/messages_en.properties
  8. 2 1
      bd-park/park-backend/park-application/src/main/resources/i18n/messages_zh.properties
  9. 2 1
      bd-park/park-backend/park-collect/src/main/java/com/huashe/park/collect/event/MachineRealtimeEventListener.java
  10. 4 4
      bd-park/park-backend/park-collect/src/test/java/com/huashe/park/collect/controller/TopicControllerTest.java
  11. 4 0
      bd-park/park-backend/park-common/pom.xml
  12. 39 0
      bd-park/park-backend/park-common/src/main/java/com/huashe/park/common/animations/mybatis/MethodMetadataCache.java
  13. 3 1
      bd-park/park-backend/park-common/src/main/java/com/huashe/park/common/animations/mybatis/emuns/FieldConvert.java
  14. 0 97
      bd-park/park-backend/park-common/src/main/java/com/huashe/park/common/animations/mybatis/handler/MySqlJsonHandler.java
  15. 2 0
      bd-park/park-backend/park-core/src/main/java/com/huashe/park/core/mapper/ConsPileHoleInfoMapper.java
  16. 2 0
      bd-park/park-backend/park-core/src/main/java/com/huashe/park/core/mapper/ConsUnitInfoMapper.java
  17. 2 0
      bd-park/park-backend/park-core/src/main/java/com/huashe/park/core/mapper/ConsUnitMachineRelMapper.java
  18. 2 0
      bd-park/park-backend/park-core/src/main/java/com/huashe/park/core/mapper/MachineProcessResultMapper.java
  19. 3 0
      bd-park/park-backend/park-core/src/main/java/com/huashe/park/core/mapper/PileMachineInfoMapper.java
  20. 5 2
      bd-park/park-backend/park-core/src/main/java/com/huashe/park/core/mapper/SysCustConfigMapper.java
  21. 2 0
      bd-park/park-backend/park-core/src/main/java/com/huashe/park/core/mapper/SysCustDictDataMapper.java
  22. 0 1
      bd-park/park-backend/park-core/src/main/java/com/huashe/park/core/service/ISysCustConfigService.java
  23. 3 0
      bd-park/park-backend/park-core/src/main/java/com/huashe/park/core/service/impl/ConsUnitInfoServiceImpl.java
  24. 1 3
      bd-park/park-backend/park-core/src/main/java/com/huashe/park/core/service/impl/PileMachineInfoServiceImpl.java
  25. 13 23
      bd-park/park-backend/park-core/src/main/java/com/huashe/park/core/service/impl/SysCustConfigServiceImpl.java
  26. 0 91
      bd-park/park-backend/park-core/src/main/java/com/huashe/park/core/typehandle/MySqlJsonHandler.java
  27. 13 4
      bd-park/park-backend/park-core/src/main/resources/mapper/cons/ConsPileHoleInfoMapper.xml
  28. 6 1
      bd-park/park-backend/park-core/src/main/resources/mapper/cons/ConsUnitInfoMapper.xml
  29. 10 1
      bd-park/park-backend/park-core/src/main/resources/mapper/cons/MachineProcessMapper.xml
  30. 10 6
      bd-park/park-backend/park-core/src/main/resources/mapper/cons/MachineProcessResultMapper.xml
  31. 7 2
      bd-park/park-backend/park-core/src/main/resources/mapper/cons/PileHoleIndexRealtimeMapper.xml
  32. 7 1
      bd-park/park-backend/park-core/src/main/resources/mapper/cons/PileMachineInfoMapper.xml
  33. 66 36
      bd-park/park-backend/park-core/src/main/resources/mapper/cons/ProjectCoordinateInfoMapper.xml
  34. 24 17
      bd-park/park-backend/park-core/src/main/resources/mapper/cons/ProjectInfoMapper.xml
  35. 9 3
      bd-park/park-backend/park-core/src/main/resources/mapper/sys/SysCustConfigMapper.xml
  36. 0 3
      bd-park/park-backend/park-domain/src/main/java/com/huashe/park/domain/entity/MachineProcessResult.java
  37. 4 0
      bd-park/park-backend/park-infrastructure/pom.xml
  38. 68 0
      bd-park/park-backend/park-infrastructure/src/main/java/com/huashe/park/infrastructure/cfg/mybatis/BaseInterceptor.java
  39. 0 5
      bd-park/park-backend/park-infrastructure/src/main/java/com/huashe/park/infrastructure/cfg/mybatis/FieldConvertInterceptor.java
  40. 76 135
      bd-park/park-backend/park-infrastructure/src/main/java/com/huashe/park/infrastructure/cfg/mybatis/MybatisInterceptor.java
  41. 8 0
      bd-park/park-backend/park-infrastructure/src/main/java/com/huashe/park/infrastructure/cfg/mybatis/RegisterCustomerInterceptor.java
  42. 1 1
      bd-park/park-backend/park-infrastructure/src/main/java/com/huashe/park/infrastructure/cfg/mybatis/ResultTypeConvertInterceptor.java
  43. 81 0
      bd-park/park-backend/park-infrastructure/src/main/java/com/huashe/park/infrastructure/cfg/mybatis/TenantIdInterceptor.java
  44. 122 0
      bd-park/park-backend/park-infrastructure/src/main/java/com/huashe/park/infrastructure/cfg/mybatis/TenantSqlInterceptor.java
  45. 6 1
      bd-park/park-backend/pom.xml
  46. 9 4
      common-application/pom.xml
  47. 28 50
      common-application/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
  48. 141 131
      common-application/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java
  49. 39 70
      common-application/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUser.java
  50. 4 1
      common-application/ruoyi-framework/pom.xml
  51. 17 16
      common-application/ruoyi-framework/src/main/java/com/ruoyi/framework/security/filter/JwtAuthenticationTokenFilter.java
  52. 14 16
      common-application/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java
  53. 12 10
      common-application/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableColumnMapper.java
  54. 3 0
      common-application/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableMapper.java
  55. 69 0
      common-application/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysTenant.java
  56. 36 0
      common-application/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysTenantUsrRel.java
  57. 4 1
      common-application/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysConfigMapper.java
  58. 3 0
      common-application/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java
  59. 3 0
      common-application/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDictDataMapper.java
  60. 3 0
      common-application/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDictTypeMapper.java
  61. 3 0
      common-application/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysLogininforMapper.java
  62. 3 0
      common-application/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysMenuMapper.java
  63. 3 0
      common-application/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysNoticeMapper.java
  64. 3 0
      common-application/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysOperLogMapper.java
  65. 3 0
      common-application/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysPostMapper.java
  66. 3 0
      common-application/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleDeptMapper.java
  67. 3 0
      common-application/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMapper.java
  68. 3 0
      common-application/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMenuMapper.java
  69. 40 0
      common-application/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysTenantMapper.java
  70. 26 0
      common-application/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysTenantUsrRelMapper.java
  71. 3 0
      common-application/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java
  72. 3 0
      common-application/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserPostMapper.java
  73. 3 0
      common-application/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserRoleMapper.java
  74. 34 0
      common-application/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysTenantService.java
  75. 54 70
      common-application/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java
  76. 63 0
      common-application/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTenantDefServiceImpl.java
  77. 95 0
      common-application/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTenantServiceImpl.java
  78. 106 147
      common-application/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
  79. 89 73
      common-application/ruoyi-system/src/main/resources/mapper/system/SysConfigMapper.xml
  80. 99 0
      common-application/ruoyi-system/src/main/resources/mapper/system/SysTenantMapper.xml
  81. 43 0
      common-application/ruoyi-system/src/main/resources/mapper/system/SysTenantUsrRelMapper.xml
  82. 11 0
      prod-common/src/main/java/com/huashe/common/annotation/mybatis/IgnoreTenant.java
  83. 14 0
      prod-common/src/main/java/com/huashe/common/annotation/mybatis/Tenant.java
  84. 12 0
      prod-common/src/main/java/com/huashe/common/annotation/mybatis/TenantField.java
  85. 49 39
      prod-common/src/main/java/com/huashe/common/domain/BaseEntity.java

+ 4 - 0
bd-park/park-backend/park-application/src/main/java/com/huashe/park/application/web/controller/cons/PileMachineInfoController.java

@@ -33,6 +33,7 @@ import com.huashe.park.domain.entity.PileMachineInfo;
 import com.ruoyi.common.annotation.Anonymous;
 import com.ruoyi.common.annotation.Log;
 import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.entity.SysUser;
 import com.ruoyi.common.core.page.TableDataInfo;
 import com.ruoyi.common.enums.BusinessType;
 import com.ruoyi.common.utils.poi.ExcelUtil;
@@ -150,6 +151,9 @@ public class PileMachineInfoController extends BaseController {
             pileMachineInfo.getSn(), pileMachineInfo.getPwd());
         authenticationToken.setDetails(pileMachineInfo);
         SecurityContextHolder.getContext().setAuthentication(authenticationToken);
+        SysUser sysUser = new SysUser();
+        sysUser.setTenantId(pileMachineInfo.getTenantId());
+        machineAuth.setUser(sysUser);
         String token = tokenService.createToken(machineAuth);
         pileMachineInfo.setToken(token);
         PileMachineVO pileMachineInfoVo = new PileMachineVO();

+ 3 - 0
bd-park/park-backend/park-application/src/main/java/com/huashe/park/application/web/controller/system/SysCustConfigController.java

@@ -1,10 +1,12 @@
 package com.huashe.park.application.web.controller.system;
 
+import com.ruoyi.system.domain.SysConfig;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.validation.annotation.Validated;
 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.PutMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -52,4 +54,5 @@ public class SysCustConfigController extends BaseController {
         return toAjax(sysCustConfigService.updateConfig(config));
     }
 
+
 }

+ 102 - 0
bd-park/park-backend/park-application/src/main/java/com/huashe/park/application/web/controller/system/SysTenantController.java

@@ -0,0 +1,102 @@
+package com.huashe.park.application.web.controller.system;
+
+import java.util.List;
+
+import javax.servlet.http.HttpServletResponse;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+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.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.huashe.common.domain.AjaxResult;
+import com.ruoyi.common.annotation.Anonymous;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.system.domain.SysTenant;
+import com.ruoyi.system.service.ISysTenantService;
+
+/**
+ * 租户Controller
+ * 
+ * @author ruoyi
+ * @date 2025-04-19
+ */
+@RestController
+@RequestMapping("/system/tenant")
+public class SysTenantController extends BaseController {
+    @Autowired
+    private ISysTenantService sysTenantService;
+
+    /**
+     * 查询租户列表
+     */
+
+    @GetMapping("/list")
+    @Anonymous
+    public TableDataInfo list(SysTenant sysTenant) {
+        startPage();
+        List<SysTenant> list = sysTenantService.selectTenantList(sysTenant);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出租户列表
+     */
+    @PreAuthorize("@ss.hasPermi('system:tenant:export')")
+    @Log(title = "租户", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, SysTenant sysTenant) {
+        List<SysTenant> list = sysTenantService.selectTenantList(sysTenant);
+        ExcelUtil<SysTenant> util = new ExcelUtil<SysTenant>(SysTenant.class);
+        util.exportExcel(response, list, "租户数据");
+    }
+
+    /**
+     * 获取租户详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('system:tenant:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id) {
+        return success(sysTenantService.selectTenantById(id));
+    }
+
+    /**
+     * 新增租户
+     */
+    @PreAuthorize("@ss.hasPermi('system:tenant:add')")
+    @Log(title = "租户", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody SysTenant sysTenant) {
+        return toAjax(sysTenantService.insertTenant(sysTenant));
+    }
+
+    /**
+     * 修改租户
+     */
+    @PreAuthorize("@ss.hasPermi('system:tenant:edit')")
+    @Log(title = "租户", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody SysTenant sysTenant) {
+        return toAjax(sysTenantService.updateTenant(sysTenant));
+    }
+
+    /**
+     * 删除租户
+     */
+    @PreAuthorize("@ss.hasPermi('system:tenant:remove')")
+    @Log(title = "租户", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids) {
+        return toAjax(sysTenantService.deleteSysTenantByIds(ids));
+    }
+}

+ 49 - 59
bd-park/park-backend/park-application/src/main/java/com/huashe/park/application/web/controller/system/SysUserController.java

@@ -1,31 +1,39 @@
 package com.huashe.park.application.web.controller.system;
 
+import java.util.List;
+import java.util.stream.Collectors;
+
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.lang3.ArrayUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+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.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import com.huashe.common.domain.AjaxResult;
 import com.huashe.common.utils.StringUtils;
 import com.ruoyi.common.annotation.Log;
 import com.ruoyi.common.core.controller.BaseController;
-import com.huashe.common.domain.AjaxResult;
 import com.ruoyi.common.core.domain.entity.SysDept;
 import com.ruoyi.common.core.domain.entity.SysRole;
 import com.ruoyi.common.core.domain.entity.SysUser;
 import com.ruoyi.common.core.page.TableDataInfo;
 import com.ruoyi.common.enums.BusinessType;
 import com.ruoyi.common.utils.SecurityUtils;
-
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.system.service.ISysDeptService;
 import com.ruoyi.system.service.ISysPostService;
 import com.ruoyi.system.service.ISysRoleService;
 import com.ruoyi.system.service.ISysUserService;
-import org.apache.commons.lang3.ArrayUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-import org.springframework.web.multipart.MultipartFile;
-
-import javax.servlet.http.HttpServletResponse;
-import java.util.List;
-import java.util.stream.Collectors;
 
 /**
  * 用户信息
@@ -34,8 +42,7 @@ import java.util.stream.Collectors;
  */
 @RestController
 @RequestMapping("/system/user")
-public class SysUserController extends BaseController
-{
+public class SysUserController extends BaseController {
     @Autowired
     private ISysUserService userService;
 
@@ -53,8 +60,7 @@ public class SysUserController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:user:list')")
     @GetMapping("/list")
-    public TableDataInfo list(SysUser user)
-    {
+    public TableDataInfo list(SysUser user) {
         startPage();
         List<SysUser> list = userService.selectUserList(user);
         return getDataTable(list);
@@ -63,8 +69,7 @@ public class SysUserController extends BaseController
     @Log(title = "用户管理", businessType = BusinessType.EXPORT)
     @PreAuthorize("@ss.hasPermi('system:user:export')")
     @PostMapping("/export")
-    public void export(HttpServletResponse response, SysUser user)
-    {
+    public void export(HttpServletResponse response, SysUser user) {
         List<SysUser> list = userService.selectUserList(user);
         ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
         util.exportExcel(response, list, "用户数据");
@@ -73,8 +78,7 @@ public class SysUserController extends BaseController
     @Log(title = "用户管理", businessType = BusinessType.IMPORT)
     @PreAuthorize("@ss.hasPermi('system:user:import')")
     @PostMapping("/importData")
-    public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception
-    {
+    public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception {
         ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
         List<SysUser> userList = util.importExcel(file.getInputStream());
         String operName = getUsername();
@@ -83,8 +87,7 @@ public class SysUserController extends BaseController
     }
 
     @PostMapping("/importTemplate")
-    public void importTemplate(HttpServletResponse response)
-    {
+    public void importTemplate(HttpServletResponse response) {
         ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
         util.importTemplateExcel(response, "用户数据");
     }
@@ -93,16 +96,17 @@ public class SysUserController extends BaseController
      * 根据用户编号获取详细信息
      */
     @PreAuthorize("@ss.hasPermi('system:user:query')")
-    @GetMapping(value = { "/", "/{userId}" })
-    public AjaxResult getInfo(@PathVariable(value = "userId", required = false) Long userId)
-    {
+    @GetMapping(value = {
+        "/", "/{userId}"
+    })
+    public AjaxResult getInfo(@PathVariable(value = "userId", required = false) Long userId) {
         userService.checkUserDataScope(userId);
         AjaxResult ajax = AjaxResult.success();
         List<SysRole> roles = roleService.selectRoleAll();
-        ajax.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));
+        ajax.put("roles",
+            SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));
         ajax.put("posts", postService.selectPostAll());
-        if (StringUtils.isNotNull(userId))
-        {
+        if (StringUtils.isNotNull(userId)) {
             SysUser sysUser = userService.selectUserById(userId);
             ajax.put(AjaxResult.DATA_TAG, sysUser);
             ajax.put("postIds", postService.selectPostListByUserId(userId));
@@ -117,20 +121,16 @@ public class SysUserController extends BaseController
     @PreAuthorize("@ss.hasPermi('system:user:add')")
     @Log(title = "用户管理", businessType = BusinessType.INSERT)
     @PostMapping
-    public AjaxResult add(@Validated @RequestBody SysUser user)
-    {
+    public AjaxResult add(@Validated @RequestBody SysUser user) {
         deptService.checkDeptDataScope(user.getDeptId());
         roleService.checkRoleDataScope(user.getRoleIds());
-        if (!userService.checkUserNameUnique(user))
-        {
+        if (!userService.checkUserNameUnique(user)) {
             return error("新增用户'" + user.getUserName() + "'失败,登录账号已存在");
         }
-        else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user))
-        {
+        else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) {
             return error("新增用户'" + user.getUserName() + "'失败,手机号码已存在");
         }
-        else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user))
-        {
+        else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) {
             return error("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在");
         }
         user.setCreateBy(getUsername());
@@ -144,22 +144,18 @@ public class SysUserController extends BaseController
     @PreAuthorize("@ss.hasPermi('system:user:edit')")
     @Log(title = "用户管理", businessType = BusinessType.UPDATE)
     @PutMapping
-    public AjaxResult edit(@Validated @RequestBody SysUser user)
-    {
+    public AjaxResult edit(@Validated @RequestBody SysUser user) {
         userService.checkUserAllowed(user);
         userService.checkUserDataScope(user.getUserId());
         deptService.checkDeptDataScope(user.getDeptId());
         roleService.checkRoleDataScope(user.getRoleIds());
-        if (!userService.checkUserNameUnique(user))
-        {
+        if (!userService.checkUserNameUnique(user)) {
             return error("修改用户'" + user.getUserName() + "'失败,登录账号已存在");
         }
-        else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user))
-        {
+        else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) {
             return error("修改用户'" + user.getUserName() + "'失败,手机号码已存在");
         }
-        else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user))
-        {
+        else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) {
             return error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在");
         }
         user.setUpdateBy(getUsername());
@@ -172,10 +168,8 @@ public class SysUserController extends BaseController
     @PreAuthorize("@ss.hasPermi('system:user:remove')")
     @Log(title = "用户管理", businessType = BusinessType.DELETE)
     @DeleteMapping("/{userIds}")
-    public AjaxResult remove(@PathVariable Long[] userIds)
-    {
-        if (ArrayUtils.contains(userIds, getUserId()))
-        {
+    public AjaxResult remove(@PathVariable Long[] userIds) {
+        if (ArrayUtils.contains(userIds, getUserId())) {
             return error("当前用户不能删除");
         }
         return toAjax(userService.deleteUserByIds(userIds));
@@ -187,8 +181,7 @@ public class SysUserController extends BaseController
     @PreAuthorize("@ss.hasPermi('system:user:resetPwd')")
     @Log(title = "用户管理", businessType = BusinessType.UPDATE)
     @PutMapping("/resetPwd")
-    public AjaxResult resetPwd(@RequestBody SysUser user)
-    {
+    public AjaxResult resetPwd(@RequestBody SysUser user) {
         userService.checkUserAllowed(user);
         userService.checkUserDataScope(user.getUserId());
         user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
@@ -202,8 +195,7 @@ public class SysUserController extends BaseController
     @PreAuthorize("@ss.hasPermi('system:user:edit')")
     @Log(title = "用户管理", businessType = BusinessType.UPDATE)
     @PutMapping("/changeStatus")
-    public AjaxResult changeStatus(@RequestBody SysUser user)
-    {
+    public AjaxResult changeStatus(@RequestBody SysUser user) {
         userService.checkUserAllowed(user);
         userService.checkUserDataScope(user.getUserId());
         user.setUpdateBy(getUsername());
@@ -215,13 +207,13 @@ public class SysUserController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:user:query')")
     @GetMapping("/authRole/{userId}")
-    public AjaxResult authRole(@PathVariable("userId") Long userId)
-    {
+    public AjaxResult authRole(@PathVariable("userId") Long userId) {
         AjaxResult ajax = AjaxResult.success();
         SysUser user = userService.selectUserById(userId);
         List<SysRole> roles = roleService.selectRolesByUserId(userId);
         ajax.put("user", user);
-        ajax.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));
+        ajax.put("roles",
+            SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));
         return ajax;
     }
 
@@ -231,8 +223,7 @@ public class SysUserController extends BaseController
     @PreAuthorize("@ss.hasPermi('system:user:edit')")
     @Log(title = "用户管理", businessType = BusinessType.GRANT)
     @PutMapping("/authRole")
-    public AjaxResult insertAuthRole(Long userId, Long[] roleIds)
-    {
+    public AjaxResult insertAuthRole(Long userId, Long[] roleIds) {
         userService.checkUserDataScope(userId);
         roleService.checkRoleDataScope(roleIds);
         userService.insertUserAuth(userId, roleIds);
@@ -244,8 +235,7 @@ public class SysUserController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:user:list')")
     @GetMapping("/deptTree")
-    public AjaxResult deptTree(SysDept dept)
-    {
+    public AjaxResult deptTree(SysDept dept) {
         return success(deptService.selectDeptTreeList(dept));
     }
 }

+ 2 - 2
bd-park/park-backend/park-application/src/main/resources/application-test.yml

@@ -39,8 +39,8 @@ spring:
         username:
         password:
       # 初始连接数
-      initialSiz
-
+      initialSize: 5
+      # 最小连接池数量
       minIdle: 10
       # 最大连接池数量
       maxActive: 20

+ 2 - 0
bd-park/park-backend/park-application/src/main/resources/application.yml

@@ -12,6 +12,8 @@ ruoyi:
   addressEnabled: false
   # 验证码类型 math 数字计算 char 字符验证
   captchaType: math
+  tenant:
+    enable: true
 
 # 开发环境配置
 server:

+ 1 - 0
bd-park/park-backend/park-application/src/main/resources/i18n/messages_en.properties

@@ -39,3 +39,4 @@ cons.unit.has.no.hole=The construction unit has a designed pile hole, which cann
 machine.auth.param.error=SN, NO, and PWD cannot be empty.
 machine.auth.param.none=Authentication failed, please check the parameters.
 machine.not.assign.task=The machine has not been assigned a task.
+cons.biz.param.null=Please configure the CAD parameters first.

+ 2 - 1
bd-park/park-backend/park-application/src/main/resources/i18n/messages_zh.properties

@@ -38,4 +38,5 @@ cons.unit.delete.no.child=存在下级施工单元,不允许删除。
 cons.unit.has.no.hole=施工单元存在设计桩孔,不允许删除。
 machine.auth.param.error=SN、NO、PWD不允许为空。
 machine.auth.param.none=认证失败,请检查参数。
-machine.not.assign.task=抱歉,机械没有分配任务。
+machine.not.assign.task=抱歉,机械没有分配任务。
+cons.biz.param.null=请先配置CAD参数。

+ 2 - 1
bd-park/park-backend/park-collect/src/main/java/com/huashe/park/collect/event/MachineRealtimeEventListener.java

@@ -72,6 +72,7 @@ public class MachineRealtimeEventListener {
         pileHoleIndexRealtime.setRealLng(message.getLongitude());
         pileHoleIndexRealtime.setRealX(message.getRealX());
         pileHoleIndexRealtime.setRealY(message.getRealY());
+        pileHoleIndexRealtime.setTenantId(consPileHoleInfo.getTenantId());
         int cnt = pileHoleIndexRealtimeService.updatePileHoleIndexRealtimeByHoleIdAndMachineId(pileHoleIndexRealtime);
         String pileRedisKey = String.format(RedisKey.PILE_MACHINE_MQTT.MQTT_TOPIC_PREFIX, message.getPileId());
         if (!redisProxy.hasKey(pileRedisKey)) {
@@ -120,7 +121,7 @@ public class MachineRealtimeEventListener {
         pileHoleIndexRealtime.setSprayVolume(message.getSprayVolume());
         pileHoleIndexRealtime.setVerticalDeviation(message.getVerticalDeviation());
         pileHoleIndexRealtime.setStatus(CONS_STATUS_00.getCode());
-
+        pileHoleIndexRealtime.setTenantId(consPileHoleInfo.getTenantId());
         if (ObjectUtils.isNotEmpty(message.getEndTime())) {
             String dateFromMills = DateTimeUtil.getDateFromMills(message.getEndTime());
             pileHoleIndexRealtime.setEndTime(DateTimeUtil.parseDate(dateFromMills));

+ 4 - 4
bd-park/park-backend/park-collect/src/test/java/com/huashe/park/collect/controller/TopicControllerTest.java

@@ -54,8 +54,8 @@ class TopicControllerTest {
                 try {
                     Thread.sleep(1000);
                     machineProcess.setId(null);
-                    machineProcess.setPileId("6qgonb40");
-                    machineProcess.setMachineId("wi4mdee7");
+                    machineProcess.setPileId("5jij1lvm");
+                    machineProcess.setMachineId("nzmcaigw");
                     machineProcess.setDataTime(System.currentTimeMillis());
                     machineProcess.setUuid(Long.toString(System.currentTimeMillis()));
                     if (machineProcesses.indexOf(machineProcess) > machineProcesses.size() - 3) {
@@ -84,8 +84,8 @@ class TopicControllerTest {
                     try {
                         System.out.println(">>>>>>>>>>>>>>>>>" + result.getId());
                         result.setId(null);
-                        result.setPileId("6qgonb40");
-                        result.setMachineId("wi4mdee7");
+                        result.setPileId("5jij1lvm");
+                        result.setMachineId("nzmcaigw");
                         result.setDataTime(System.currentTimeMillis());
                         result.setStartTime(l);
                         result.setEndTime(System.currentTimeMillis());

+ 4 - 0
bd-park/park-backend/park-common/pom.xml

@@ -171,6 +171,10 @@
             <groupId>org.geotools</groupId>
             <artifactId>gt-epsg-hsql</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.huashe.common</groupId>
+            <artifactId>prod-commons</artifactId>
+        </dependency>
     </dependencies>
 
 </project>

+ 39 - 0
bd-park/park-backend/park-common/src/main/java/com/huashe/park/common/animations/mybatis/MethodMetadataCache.java

@@ -0,0 +1,39 @@
+package com.huashe.park.common.animations.mybatis;
+
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.apache.ibatis.mapping.MappedStatement;
+
+import com.huashe.common.annotation.mybatis.IgnoreTenant;
+
+public class MethodMetadataCache {
+    private static final Map<String, List<Method>> cache = new ConcurrentHashMap<>();
+
+    public static List<Method> getAnnotatedMethods(MappedStatement mappedStatement) {
+
+        return cache.computeIfAbsent(mappedStatement.getId(), key -> {
+            try {
+                String methodId = mappedStatement.getId();
+                int lastDotIndex = methodId.lastIndexOf(".");
+                String className = methodId.substring(0, lastDotIndex);
+                Class<?> mapperClass = Class.forName(className);
+                if (mapperClass.isAnnotationPresent(IgnoreTenant.class)) {
+                    return Collections.emptyList();
+                }
+                List<Method> methods = new ArrayList<>();
+                Arrays.stream(mapperClass.getMethods()).filter(f -> !f.isAnnotationPresent(IgnoreTenant.class))
+                    .forEach(methods::add);
+                return Collections.unmodifiableList(methods);
+            }
+            catch (ClassNotFoundException e) {
+                return null;
+            }
+        });
+    }
+}

+ 3 - 1
bd-park/park-backend/park-common/src/main/java/com/huashe/park/common/animations/mybatis/FieldConvert.java → bd-park/park-backend/park-common/src/main/java/com/huashe/park/common/animations/mybatis/emuns/FieldConvert.java

@@ -1,6 +1,8 @@
-package com.huashe.park.common.animations.mybatis;
+package com.huashe.park.common.animations.mybatis.emuns;
 
 
+import com.huashe.park.common.animations.mybatis.Converter;
+
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;

+ 0 - 97
bd-park/park-backend/park-common/src/main/java/com/huashe/park/common/animations/mybatis/handler/MySqlJsonHandler.java

@@ -1,97 +0,0 @@
-package com.huashe.park.common.animations.mybatis.handler;
-
-import java.sql.CallableStatement;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-
-import org.apache.ibatis.type.BaseTypeHandler;
-import org.apache.ibatis.type.JdbcType;
-import org.apache.ibatis.type.MappedTypes;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.alibaba.fastjson2.JSON;
-import com.alibaba.fastjson2.JSONObject;
-import com.alibaba.fastjson2.JSONWriter;
-
-/**
- * @author fuwu314
- * @describe:mysqlJson类型处理类
- * @date 2024/9/18
- */
-@MappedTypes(JSONObject.class)
-public class MySqlJsonHandler<T extends Object> extends BaseTypeHandler<T> {
-    private final static Logger log = LoggerFactory.getLogger(MySqlJsonHandler.class);
-
-    private Class<T> clazz;
-
-    public MySqlJsonHandler() {
-    }
-
-    public MySqlJsonHandler(Class<T> clazz) {
-        if (clazz == null)
-            throw new IllegalArgumentException("Type argument cannot be null");
-        this.clazz = clazz;
-    }
-
-    @Override
-    public void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException {
-        ps.setString(i, this.toJson(parameter));
-    }
-
-    @Override
-    public T getNullableResult(ResultSet rs, String columnName) throws SQLException {
-        return this.toObject(rs.getString(columnName), clazz);
-    }
-
-    @Override
-    public T getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
-        return this.toObject(rs.getString(columnIndex), clazz);
-    }
-
-    @Override
-    public T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
-        return this.toObject(cs.getString(columnIndex), clazz);
-    }
-
-    /**
-     * 将字符串内容转换为指定类型的对象
-     *
-     * @param content 字符串内容
-     * @param clazz 目标类型
-     * @return 目标类型的对象
-     */
-    private T toObject(String content, Class<T> clazz) {
-        if (content != null && !content.isEmpty()) {
-            try {
-                return JSON.parseObject(content, clazz);
-            }
-            catch (Exception e) {
-                log.error("解析JSON字符串出错", e);
-                return null;
-            }
-        }
-        else {
-            return null;
-        }
-    }
-
-    /**
-     * 将对象转换为JSON字符串
-     *
-     * @param object 要转换的对象
-     * @return JSON字符串
-     * @throws RuntimeException 如果转换过程中发生异常
-     */
-    private String toJson(T object) {
-        try {
-            return JSON.toJSONString(object, JSONWriter.Feature.WriteMapNullValue);
-        }
-        catch (Exception e) {
-            log.error("解析JSON字符串出错", e);
-            return "[]";
-        }
-    }
-
-}

+ 2 - 0
bd-park/park-backend/park-core/src/main/java/com/huashe/park/core/mapper/ConsPileHoleInfoMapper.java

@@ -4,6 +4,7 @@ import java.util.List;
 
 import org.apache.ibatis.annotations.Param;
 
+import com.huashe.common.annotation.mybatis.Tenant;
 import com.huashe.park.domain.dto.cons.PileRealtimeIndex;
 import com.huashe.park.domain.entity.ConsPileHoleInfo;
 
@@ -32,6 +33,7 @@ public interface ConsPileHoleInfoMapper {
      */
     public List<ConsPileHoleInfo> selectConsPileHoleInfoList(ConsPileHoleInfo consPileHoleInfo);
 
+    @Tenant(tableAlias = "cphi")
     List<PileRealtimeIndex> selectConsPileHoleRealtimeIndex(ConsPileHoleInfo consPileHoleInfo);
 
     public List<ConsPileHoleInfo> selectNonConsPileHoleInfo(ConsPileHoleInfo consPileHoleInfo);

+ 2 - 0
bd-park/park-backend/park-core/src/main/java/com/huashe/park/core/mapper/ConsUnitInfoMapper.java

@@ -4,6 +4,7 @@ import java.util.List;
 
 import org.apache.ibatis.annotations.Param;
 
+import com.huashe.common.annotation.mybatis.Tenant;
 import com.huashe.park.domain.entity.ConsUnitInfo;
 
 /**
@@ -69,6 +70,7 @@ public interface ConsUnitInfoMapper {
 
     int updateConstUnitChildren(@Param("consUnits") List<ConsUnitInfo> consUnits);
 
+    @Tenant(tableAlias = "unit")
     List<String> qryMachineAssignedUnitAncestors(Long machineId);
 
     List<ConsUnitInfo> qryConsUnitInfoByIds(@Param("ids") List<String> ids);

+ 2 - 0
bd-park/park-backend/park-core/src/main/java/com/huashe/park/core/mapper/ConsUnitMachineRelMapper.java

@@ -2,6 +2,7 @@ package com.huashe.park.core.mapper;
 
 import java.util.List;
 
+import com.huashe.common.annotation.mybatis.IgnoreTenant;
 import org.apache.ibatis.annotations.Param;
 
 import com.huashe.park.domain.entity.ConsUnitMachineRel;
@@ -12,6 +13,7 @@ import com.huashe.park.domain.entity.ConsUnitMachineRel;
  * @author ruoyi
  * @date 2025-02-17
  */
+@IgnoreTenant
 public interface ConsUnitMachineRelMapper {
     /**
      * 查询施工单元桩机关系

+ 2 - 0
bd-park/park-backend/park-core/src/main/java/com/huashe/park/core/mapper/MachineProcessResultMapper.java

@@ -2,6 +2,7 @@ package com.huashe.park.core.mapper;
 
 import java.util.List;
 
+import com.huashe.common.annotation.mybatis.Tenant;
 import com.huashe.park.domain.dto.cons.ConsUnitResult;
 import com.huashe.park.domain.entity.MachineProcessResult;
 
@@ -62,6 +63,7 @@ public interface MachineProcessResultMapper {
      */
     public int deleteMachineProcessResultByIds(Long[] ids);
 
+    @Tenant(tableAlias = "cphir")
     List<ConsUnitResult> qeyConsUnitResult(Long consUnitId);
 
 }

+ 3 - 0
bd-park/park-backend/park-core/src/main/java/com/huashe/park/core/mapper/PileMachineInfoMapper.java

@@ -3,6 +3,7 @@ package com.huashe.park.core.mapper;
 import java.util.HashMap;
 import java.util.List;
 
+import com.huashe.common.annotation.mybatis.Tenant;
 import com.huashe.park.domain.entity.PileMachineInfo;
 
 /**
@@ -64,7 +65,9 @@ public interface PileMachineInfoMapper {
 
     HashMap<String, Integer> cntMachineOnOffline();
 
+    @Tenant(tableAlias = "cpmi")
     List<PileMachineInfo> qryUnitMachine(Long consUnitId);
+    @Tenant(tableAlias = "cpmi")
     List<PileMachineInfo> selectMachineByConsUnitId(Long consUnitId);
 
 }

+ 5 - 2
bd-park/park-backend/park-core/src/main/java/com/huashe/park/core/mapper/SysCustConfigMapper.java

@@ -1,6 +1,7 @@
 package com.huashe.park.core.mapper;
 
 import com.huashe.common.annotation.DataSource;
+import com.huashe.common.annotation.mybatis.IgnoreTenant;
 import com.huashe.common.enums.DataSourceType;
 import com.huashe.park.domain.entity.CustSysConfig;
 
@@ -9,10 +10,12 @@ public interface SysCustConfigMapper {
 
     int updateConfig(CustSysConfig custSysConfig);
 
+    @IgnoreTenant
     CustSysConfig selectConfigById(Long id);
 
-    CustSysConfig checkConfigKeyUnique(String configKey);
+    @IgnoreTenant
+    CustSysConfig checkConfigKeyUnique(CustSysConfig configKey);
 
-    CustSysConfig selectConfig(CustSysConfig param);
+    CustSysConfig selectTenantConfig(CustSysConfig param);
 
 }

+ 2 - 0
bd-park/park-backend/park-core/src/main/java/com/huashe/park/core/mapper/SysCustDictDataMapper.java

@@ -3,6 +3,7 @@ package com.huashe.park.core.mapper;
 import java.util.List;
 import java.util.Map;
 
+import com.huashe.common.annotation.mybatis.IgnoreTenant;
 import org.apache.ibatis.annotations.Param;
 
 import com.huashe.common.annotation.DataSource;
@@ -14,6 +15,7 @@ import com.huashe.common.enums.DataSourceType;
  * @author ruoyi
  */
 @DataSource(DataSourceType.MASTER)
+@IgnoreTenant
 public interface SysCustDictDataMapper {
     /**
      * 根据条件分页查询字典数据

+ 0 - 1
bd-park/park-backend/park-core/src/main/java/com/huashe/park/core/service/ISysCustConfigService.java

@@ -11,7 +11,6 @@ public interface ISysCustConfigService {
 
     public int updateConfig(CustSysConfig config);
 
-    String selectConfigByKey(String configKey);
 
     CustSysConfig selectConfigObjByKey(String configKey);
 

+ 3 - 0
bd-park/park-backend/park-core/src/main/java/com/huashe/park/core/service/impl/ConsUnitInfoServiceImpl.java

@@ -269,6 +269,9 @@ public class ConsUnitInfoServiceImpl implements IConsUnitInfoService {
         File file = new File(filePath);
 
         CustSysConfig custSysConfig = sysCustConfigService.selectConfigObjByKey(cadForestCfg.getCadBizParam());
+        if (ObjectUtils.isEmpty(custSysConfig)) {
+            throw new ServiceException(MessageUtils.message("cons.biz.param.null"));
+        }
         HttpRequest form = HttpRequest.post(cadForestCfg.getCadServer() + "/upload").form("dwg_file", file)
             .form("param", custSysConfig.getCfgJson());
         String json = form.execute().body();

+ 1 - 3
bd-park/park-backend/park-core/src/main/java/com/huashe/park/core/service/impl/PileMachineInfoServiceImpl.java

@@ -272,9 +272,7 @@ public class PileMachineInfoServiceImpl implements IPileMachineInfoService {
 
     private List<ConstUnitNode> getChildList(List<ConstUnitNode> list, ConstUnitNode t) {
         List<ConstUnitNode> tlist = new ArrayList<>();
-        Iterator<ConstUnitNode> it = list.iterator();
-        while (it.hasNext()) {
-            ConstUnitNode n = it.next();
+        for (ConstUnitNode n : list) {
             if (StringUtils.isNotNull(n.getParentId()) && n.getParentId().longValue() == t.getId().longValue()) {
                 tlist.add(n);
             }

+ 13 - 23
bd-park/park-backend/park-core/src/main/java/com/huashe/park/core/service/impl/SysCustConfigServiceImpl.java

@@ -1,10 +1,10 @@
 package com.huashe.park.core.service.impl;
 
+import org.apache.commons.lang3.ObjectUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import com.huashe.common.constant.CacheConstants;
-import com.huashe.common.text.Convert;
 import com.huashe.common.utils.StringUtils;
 import com.huashe.park.core.mapper.SysCustConfigMapper;
 import com.huashe.park.core.redis.RedisProxy;
@@ -28,38 +28,21 @@ public class SysCustConfigServiceImpl implements ISysCustConfigService {
     public int updateConfig(CustSysConfig config) {
         CustSysConfig temp = sysCustConfigMapper.selectConfigById(config.getConfigId());
         if (!StringUtils.equals(temp.getConfigKey(), config.getConfigKey())) {
-            redisProxy.deleteObject(getCacheKey(temp.getConfigKey()));
+            redisProxy.deleteObject(getCacheKey(temp));
         }
 
         int row = sysCustConfigMapper.updateConfig(config);
         if (row > 0) {
-            redisProxy.setCacheObject(getCacheKey(config.getConfigKey()), config.getConfigValue());
+            redisProxy.setCacheObject(getCacheKey(config), config.getConfigValue());
         }
         return row;
     }
 
     @Override
-    public String selectConfigByKey(String configKey) {
-        String configValue = Convert.toStr(redisProxy.getCacheObject(getCacheKey(configKey)));
-        if (StringUtils.isNotEmpty(configValue)) {
-            return configValue;
-        }
-        CustSysConfig config = new CustSysConfig();
-        config.setConfigKey(configKey);
-        CustSysConfig retConfig = sysCustConfigMapper.selectConfig(config);
-        if (StringUtils.isNotNull(retConfig)) {
-            redisProxy.setCacheObject(getCacheKey(configKey), retConfig.getConfigValue());
-            return retConfig.getConfigValue();
-        }
-        return StringUtils.EMPTY;
-    }
-
-    @Override
     public CustSysConfig selectConfigObjByKey(String configKey) {
-
         CustSysConfig config = new CustSysConfig();
         config.setConfigKey(configKey);
-        return sysCustConfigMapper.selectConfig(config);
+        return sysCustConfigMapper.selectTenantConfig(config);
     }
 
     @Override
@@ -70,11 +53,18 @@ public class SysCustConfigServiceImpl implements ISysCustConfigService {
     @Override
     public boolean checkConfigKeyUnique(CustSysConfig config) {
         Long configId = StringUtils.isNull(config.getConfigId()) ? -1L : config.getConfigId();
-        CustSysConfig info = sysCustConfigMapper.checkConfigKeyUnique(config.getConfigKey());
-        return !StringUtils.isNotNull(info) || info.getConfigId() == configId;
+        CustSysConfig info = sysCustConfigMapper.checkConfigKeyUnique(config);
+        return !StringUtils.isNotNull(info) || info.getConfigId().equals(configId);
     }
 
     private String getCacheKey(String configKey) {
         return CacheConstants.SYS_CONFIG_KEY + configKey;
     }
+
+    private String getCacheKey(CustSysConfig configKey) {
+        if (!ObjectUtils.isEmpty(configKey.getTenantId())) {
+            return CacheConstants.SYS_CONFIG_KEY + configKey.getConfigKey() + ":" + configKey.getTenantId();
+        }
+        return CacheConstants.SYS_CONFIG_KEY + configKey.getConfigKey();
+    }
 }

+ 0 - 91
bd-park/park-backend/park-core/src/main/java/com/huashe/park/core/typehandle/MySqlJsonHandler.java

@@ -1,91 +0,0 @@
-package com.huashe.park.core.typehandle;
-
-
-import com.alibaba.fastjson2.JSON;
-import com.alibaba.fastjson2.JSONArray;
-import com.alibaba.fastjson2.JSONObject;
-import com.alibaba.fastjson2.JSONWriter;
-import org.apache.ibatis.type.BaseTypeHandler;
-import org.apache.ibatis.type.JdbcType;
-import org.apache.ibatis.type.MappedTypes;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.sql.CallableStatement;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-
-/**
- * @author fuwu314
- * @describe:mysqlJson类型处理类
- * @date 2024/9/18
- */
-@MappedTypes(JSONObject.class)
-public class MySqlJsonHandler<T extends Object> extends BaseTypeHandler<T> {
-    private final static Logger log = LoggerFactory.getLogger(MySqlJsonHandler.class);
-    private Class<T> clazz;
-
-    public MySqlJsonHandler(Class<T> clazz) {
-        if (clazz == null) throw new IllegalArgumentException("Type argument cannot be null");
-        this.clazz = clazz;
-    }
-
-    @Override
-    public void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException {
-        ps.setString(i, this.toJson(parameter));
-    }
-
-    @Override
-    public T getNullableResult(ResultSet rs, String columnName) throws SQLException {
-        return this.toObject(rs.getString(columnName), clazz);
-    }
-
-    @Override
-    public T getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
-        return this.toObject(rs.getString(columnIndex), clazz);
-    }
-
-    @Override
-    public T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
-        return this.toObject(cs.getString(columnIndex), clazz);
-    }
-
-    /**
-     * 将字符串内容转换为指定类型的对象
-     *
-     * @param content 字符串内容
-     * @param clazz   目标类型
-     * @return 目标类型的对象
-     */
-    private T toObject(String content, Class<T> clazz) {
-        if (content != null && !content.isEmpty()) {
-            try {
-                return JSON.parseObject(content, clazz);
-            } catch (Exception e) {
-                log.error("解析JSON字符串出错", e);
-                return null;
-            }
-        } else {
-            return null;
-        }
-    }
-
-    /**
-     * 将对象转换为JSON字符串
-     *
-     * @param object 要转换的对象
-     * @return JSON字符串
-     * @throws RuntimeException 如果转换过程中发生异常
-     */
-    private String toJson(T object) {
-        try {
-            return JSON.toJSONString(object, JSONWriter.Feature.WriteMapNullValue);
-        } catch (Exception e) {
-            log.error("解析JSON字符串出错", e);
-            return "[]";
-        }
-    }
-
-
-}

+ 13 - 4
bd-park/park-backend/park-core/src/main/resources/mapper/cons/ConsPileHoleInfoMapper.xml

@@ -23,6 +23,7 @@
         <result property="createTime" column="create_time"/>
         <result property="createBy" column="create_by"/>
         <result property="updateBy" column="update_by"/>
+        <result property="tenantId" column="tenant_id"/>
     </resultMap>
 
     <sql id="selectConsPileHoleInfoVo">
@@ -43,7 +44,8 @@
                update_time,
                create_time,
                create_by,
-               update_by
+               update_by,
+               tenant_id
         from cons_pile_hole_info
     </sql>
 
@@ -125,6 +127,7 @@
             <if test="createTime != null">create_time,</if>
             <if test="createBy != null">create_by,</if>
             <if test="updateBy != null">update_by,</if>
+            <if test="tenantId != null">tenant_id,</if>
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="byteId != null and byteId != ''">#{byteId},</if>
@@ -143,6 +146,7 @@
             <if test="createTime != null">#{createTime},</if>
             <if test="createBy != null">#{createBy},</if>
             <if test="updateBy != null">#{updateBy},</if>
+            <if test="tenantId != null">#{tenantId},</if>
         </trim>
     </insert>
     <insert id="batchInsertConsPileHoleInfo" parameterType="List" useGeneratedKeys="true" keyProperty="id">
@@ -162,12 +166,14 @@
         diameter,
         cons_unit_id,
         update_time,
-        create_time
+        create_by,
+        create_time,
+        tenant_id
         )
         values
         <foreach collection="list" item="item" separator=",">
             (
-             #{item.byteId},
+            #{item.byteId},
             #{item.holeKey},
             #{item.holeNum},
             #{item.deltaX},
@@ -181,7 +187,9 @@
             #{item.diameter},
             #{item.consUnitId},
             now(),
-            now())
+            #{item.createBy},
+            now(),
+            #{item.tenantId})
         </foreach>
         on duplicate key update
         hole_num= values(hole_num),
@@ -212,6 +220,7 @@
             <if test="createTime != null">create_time = #{createTime},</if>
             <if test="createBy != null">create_by = #{createBy},</if>
             <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="tenantId != null">tenant_id = #{tenantId},</if>
         </trim>
         where id = #{id}
     </update>

+ 6 - 1
bd-park/park-backend/park-core/src/main/resources/mapper/cons/ConsUnitInfoMapper.xml

@@ -20,6 +20,7 @@
         <result property="createTime" column="create_time"/>
         <result property="createBy" column="create_by"/>
         <result property="updateBy" column="update_by"/>
+        <result property="tenantId" column="tenant_id"/>
     </resultMap>
 
     <sql id="selectConsUnitInfoVo">
@@ -37,7 +38,8 @@
                update_time,
                create_time,
                create_by,
-               update_by
+               update_by,
+               tenant_id
         from cons_cons_unit_info
     </sql>
 
@@ -77,6 +79,7 @@
             <if test="createTime != null">create_time,</if>
             <if test="createBy != null">create_by,</if>
             <if test="updateBy != null">update_by,</if>
+            <if test="tenantId != null">tenant_id,</if>
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="byteId !=null ">#{byteId},</if>
@@ -93,6 +96,7 @@
             <if test="createTime != null">#{createTime},</if>
             <if test="createBy != null">#{createBy},</if>
             <if test="updateBy != null">#{updateBy},</if>
+            <if test="tenantId != null">#{tenantId},</if>
         </trim>
     </insert>
     <update id="updateConsUnitInfo" parameterType="ConsUnitInfo">
@@ -112,6 +116,7 @@
             <if test="createTime != null">create_time = #{createTime},</if>
             <if test="createBy != null">create_by = #{createBy},</if>
             <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="tenantId != null">tenant_id = #{tenantId},</if>
         </trim>
         where id = #{id}
     </update>

+ 10 - 1
bd-park/park-backend/park-core/src/main/resources/mapper/cons/MachineProcessMapper.xml

@@ -44,6 +44,7 @@
         <result property="id" column="id"/>
         <result property="createTime" column="create_time"/>
         <result property="recordTime" column="record_time"/>
+        <result property="tenantId" column="tenant_id"/>
     </resultMap>
 
     <sql id="selectMachineProcessVo">
@@ -84,7 +85,9 @@
                dt,
                id,
                create_time,
-               record_time, current
+               record_time,
+               `current`,
+               tenant_id
         from cons_machine_process
     </sql>
 
@@ -181,6 +184,7 @@
             <if test="dt != null">dt,</if>
             <if test="recordTime != null">record_time,</if>
             <if test="createTime != null">create_time,</if>
+            <if test="tenantId != null">tenant_id,</if>
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="consType != null">#{consType},</if>
@@ -221,6 +225,7 @@
             <if test="dt != null">#{dt},</if>
             <if test="recordTime != null">#{recordTime},</if>
             <if test="createTime != null">#{createTime},</if>
+            <if test="tenantId != null">#{tenantId},</if>
         </trim>
     </insert>
 
@@ -265,6 +270,7 @@
             <if test="dt != null">dt,</if>
             <if test="recordTime != null">record_time,</if>
             <if test="createTime != null">create_time,</if>
+            <if test="tenantId != null">tenant_id,</if>
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="consType != null">#{consType},</if>
@@ -305,6 +311,7 @@
             <if test="dt != null">#{dt},</if>
             <if test="recordTime != null">#{recordTime},</if>
             <if test="createTime != null">now(),</if>
+            <if test="tenantId != null">#{tenantId},</if>
         </trim>
         on duplicate key update
         <trim suffixOverrides=",">
@@ -348,6 +355,7 @@
             <if test="dt != null">dt = VALUES(dt),</if>
             <if test="recordTime != null">record_time = VALUES(record_time),</if>
             <if test="createTime != null">create_time = NOW(),</if>
+            <if test="tenantId != null">tenant_id = VALUES(tenant_id),</if>
         </trim>
     </insert>
 
@@ -392,6 +400,7 @@
             <if test="dt != null">dt = #{dt},</if>
             <if test="recordTime != null">record_time = #{recordTime},</if>
             <if test="createTime != null">create_time = NOW(),</if>
+            <if test="tenantId != null">tenant_id = #{tenantId},</if>
         </trim>
         where id = #{id}
     </update>

+ 10 - 6
bd-park/park-backend/park-core/src/main/resources/mapper/cons/MachineProcessResultMapper.xml

@@ -48,11 +48,8 @@
         <result property="sendEndTime" column="send_end_time"/>
         <result property="pullingStartTime" column="pulling_start_time"/>
         <result property="pullingEndTime" column="pulling_end_time"/>
+        <result property="tenantId" column="tenant_id"/>
     </resultMap>
-<!--    <resultMap id="ConsUnitResultResult" type="com.huashe.park.domain.dto.cons.ConsUnitResult">-->
-<!--        <result property="depthPress" column="depth_press"-->
-<!--                typeHandler="com.huashe.park.core.typehandle.MySqlJsonHandler"/>-->
-<!--    </resultMap>-->
     <sql id="selectMachineProcessResultVo">
         select id,
                cons_type,
@@ -97,7 +94,8 @@
                uuid,
                dt,
                create_time,
-               record_time
+               record_time,
+               tenant_id
         from cons_machine_process_result
     </sql>
 
@@ -197,6 +195,7 @@
             <if test="sendEndTime != null">send_end_time,</if>
             <if test="pullingStartTime != null">pulling_start_time,</if>
             <if test="pullingEndTime != null">pulling_end_time,</if>
+            <if test="tenantId != null">tenant_id,</if>
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="consType != null">#{consType},</if>
@@ -242,6 +241,7 @@
             <if test="sendEndTime != null">#{sendEndTime},</if>
             <if test="pullingStartTime != null">#{pullingStartTime},</if>
             <if test="pullingEndTime != null">#{pullingEndTime},</if>
+            <if test="tenantId != null">#{tenantId},</if>
         </trim>
     </insert>
     <insert id="insertMachineProcessResultOnUpdate" parameterType="MachineProcessResult" useGeneratedKeys="true"
@@ -291,6 +291,7 @@
             <if test="sendEndTime != null">send_end_time,</if>
             <if test="pullingStartTime != null">pulling_start_time,</if>
             <if test="pullingEndTime != null">pulling_end_time,</if>
+            <if test="tenantId != null">tenant_id,</if>
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="consType != null">#{consType},</if>
@@ -336,6 +337,7 @@
             <if test="sendEndTime != null">#{sendEndTime},</if>
             <if test="pullingStartTime != null">#{pullingStartTime},</if>
             <if test="pullingEndTime!= null">#{pullingEndTime},</if>
+            <if test="tenantId != null">#{tenantId},</if>
         </trim>
         ON DUPLICATE KEY UPDATE
         <trim suffixOverrides=",">
@@ -381,6 +383,7 @@
             <if test="sendEndTime != null">send_end_time = VALUES(send_end_time),</if>
             <if test="pullingStartTime != null">pulling_start_time = VALUES(pulling_start_time),</if>
             <if test="pullingEndTime != null">pulling_end_time = VALUES(pulling_end_time),</if>
+            <if test="tenantId != null">tenant_id = VALUES(tenant_id),</if>
         </trim>
 
     </insert>
@@ -431,6 +434,7 @@
             <if test="sendEndTime != null">send_end_time = #{sendEndTime},</if>
             <if test="pullingStartTime != null">pulling_start_time = #{pullingStartTime},</if>
             <if test="pullingEndTime != null">pulling_end_time = #{pullingEndTime},</if>
+            <if test="tenantId != null">tenant_id = #{tenantId},</if>
         </trim>
         where id = #{id}
     </update>
@@ -454,7 +458,7 @@
                cphir.hole_num,
                cphir.spray_pressure pressure,
                cphir.end_press,
-               cphir.depth_press depth_press
+               cphir.depth_press    depth_press
         from cons_machine_process_result cmpr
                  inner join cons_pile_hole_index_realtime cphir on
             cmpr.pile_id = cphir.hole_byte_key

+ 7 - 2
bd-park/park-backend/park-core/src/main/resources/mapper/cons/PileHoleIndexRealtimeMapper.xml

@@ -27,11 +27,11 @@
         <result property="realLng" column="real_lng"/>
         <result property="consUnitId" column="cons_unit_id"/>
         <result property="holeNum" column="hole_num"/>
-
         <result property="updateTime" column="update_time"/>
         <result property="createTime" column="create_time"/>
         <result property="createBy" column="create_by"/>
         <result property="updateBy" column="update_by"/>
+        <result property="tenantId" column="tenant_id"/>
     </resultMap>
 
     <sql id="selectPileHoleIndexRealtimeVo">
@@ -62,7 +62,8 @@
                create_time,
                create_by,
                update_by,
-               cons_unit_id
+               cons_unit_id,
+               tenant_id
         from cons_pile_hole_index_realtime
     </sql>
 
@@ -123,6 +124,7 @@
             <if test="createTime != null">create_time,</if>
             <if test="createBy != null">create_by,</if>
             <if test="updateBy != null">update_by,</if>
+            <if test="tenantId != null">tenant_id,</if>
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="holeId != null">#{holeId},</if>
@@ -152,6 +154,7 @@
             <if test="createTime != null">#{createTime},</if>
             <if test="createBy != null">#{createBy},</if>
             <if test="updateBy != null">#{updateBy},</if>
+            <if test="tenantId != null">#{tenantId},</if>
         </trim>
     </insert>
 
@@ -185,6 +188,7 @@
             <if test="createTime != null">create_time = #{createTime},</if>
             <if test="createBy != null">create_by = #{createBy},</if>
             <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="tenantId != null">tenant_id = #{tenantId},</if>
         </trim>
         where id = #{id}
     </update>
@@ -215,6 +219,7 @@
             <if test="createTime != null">create_time = #{createTime},</if>
             <if test="createBy != null">create_by = #{createBy},</if>
             <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="tenantId != null">tenant_id = #{tenantId},</if>
         </trim>
         where hole_id = #{holeId} and machine_id = #{machineId}
     </update>

+ 7 - 1
bd-park/park-backend/park-core/src/main/resources/mapper/cons/PileMachineInfoMapper.xml

@@ -26,6 +26,7 @@
         <result property="createTime" column="create_time"/>
         <result property="createBy" column="create_by"/>
         <result property="updateBy" column="update_by"/>
+        <result property="tenantId" column="tenant_id"/>
     </resultMap>
 
     <sql id="selectPileMachineInfoVo">
@@ -48,7 +49,9 @@
                update_time,
                create_time,
                create_by,
-               update_by, no
+               update_by,
+               `no`,
+               tenant_id
         from cons_pile_machine_info
     </sql>
 
@@ -96,6 +99,7 @@
             <if test="createTime != null">create_time,</if>
             <if test="createBy != null">create_by,</if>
             <if test="updateBy != null">update_by,</if>
+            <if test="tenantId != null">tenant_id,</if>
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="byteId != null and byteId != ''">#{byteId},</if>
@@ -118,6 +122,7 @@
             <if test="createTime != null">#{createTime},</if>
             <if test="createBy != null">#{createBy},</if>
             <if test="updateBy != null">#{updateBy},</if>
+            <if test="tenantId != null">#{tenantId},</if>
         </trim>
     </insert>
 
@@ -144,6 +149,7 @@
             <if test="createTime != null">create_time = #{createTime},</if>
             <if test="createBy != null">create_by = #{createBy},</if>
             <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="tenantId != null">tenant_id = #{tenantId},</if>
         </trim>
         where id = #{id}
     </update>

+ 66 - 36
bd-park/park-backend/park-core/src/main/resources/mapper/cons/ProjectCoordinateInfoMapper.xml

@@ -1,46 +1,71 @@
 <?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">
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.huashe.park.core.mapper.ProjectCoordinateInfoMapper">
-    
+
     <resultMap type="ProjectCoordinateInfo" id="ProjectCoordinateInfoResult">
-        <result property="id"    column="id"    />
-        <result property="projectId"    column="project_id"    />
-        <result property="strName"    column="str_name"    />
-        <result property="da"    column="da"    />
-        <result property="df"    column="df"    />
-        <result property="dreferenceLatitude"    column="dreference_latitude"    />
-        <result property="dcentralMeridian"    column="dcentral_meridian"    />
-        <result property="dreferenceLongitude"    column="dreference_longitude"    />
-        <result property="dprojectionHeight"    column="dprojection_height"    />
-        <result property="projectionName"    column="projection_name"    />
-        <result property="heightFittingParameter"    column="height_fitting_parameter"    />
-        <result property="constructionP4"    column="construction_p4"    />
-        <result property="createType"    column="create_type"    />
-        <result property="projectionId"    column="projection_id"    />
-        <result property="constructionP7"    column="construction_p7"    />
-        <result property="projectType"    column="project_type"    />
-        <result property="dtx"    column="dtx"    />
-        <result property="dty"    column="dty"    />
-        <result property="ntype"    column="ntype"    />
-        <result property="dtk"    column="dtk"    />
-        <result property="updateTime"    column="update_time"    />
-        <result property="createTime"    column="create_time"    />
-        <result property="createBy"    column="create_by"    />
-        <result property="updateBy"    column="update_by"    />
+        <result property="id" column="id"/>
+        <result property="projectId" column="project_id"/>
+        <result property="strName" column="str_name"/>
+        <result property="da" column="da"/>
+        <result property="df" column="df"/>
+        <result property="dreferenceLatitude" column="dreference_latitude"/>
+        <result property="dcentralMeridian" column="dcentral_meridian"/>
+        <result property="dreferenceLongitude" column="dreference_longitude"/>
+        <result property="dprojectionHeight" column="dprojection_height"/>
+        <result property="projectionName" column="projection_name"/>
+        <result property="heightFittingParameter" column="height_fitting_parameter"/>
+        <result property="constructionP4" column="construction_p4"/>
+        <result property="createType" column="create_type"/>
+        <result property="projectionId" column="projection_id"/>
+        <result property="constructionP7" column="construction_p7"/>
+        <result property="projectType" column="project_type"/>
+        <result property="dtx" column="dtx"/>
+        <result property="dty" column="dty"/>
+        <result property="ntype" column="ntype"/>
+        <result property="dtk" column="dtk"/>
+        <result property="updateTime" column="update_time"/>
+        <result property="createTime" column="create_time"/>
+        <result property="createBy" column="create_by"/>
+        <result property="updateBy" column="update_by"/>
+        <result property="tenantId" column="tenant_id"/>
     </resultMap>
 
     <sql id="selectProjectCoordinateInfoVo">
-        select id, project_id, str_name, da, df, dreference_latitude, dcentral_meridian, dreference_longitude, dprojection_height, projection_name, height_fitting_parameter, construction_p4, create_type, projection_id, construction_p7, project_type, dtx, dty, ntype, dtk, update_time, create_time, create_by, update_by from cons_project_coordinate_info
+        select id,
+               project_id,
+               str_name,
+               da,
+               df,
+               dreference_latitude,
+               dcentral_meridian,
+               dreference_longitude,
+               dprojection_height,
+               projection_name,
+               height_fitting_parameter,
+               construction_p4,
+               create_type,
+               projection_id,
+               construction_p7,
+               project_type,
+               dtx,
+               dty,
+               ntype,
+               dtk,
+               update_time,
+               create_time,
+               create_by,
+               update_by,
+               tenant_id
+        from cons_project_coordinate_info
     </sql>
 
-    <select id="selectProjectCoordinateInfoList" parameterType="ProjectCoordinateInfo" resultMap="ProjectCoordinateInfoResult">
+    <select id="selectProjectCoordinateInfoList" parameterType="ProjectCoordinateInfo"
+            resultMap="ProjectCoordinateInfoResult">
         <include refid="selectProjectCoordinateInfoVo"/>
-        <where>  
-        </where>
     </select>
-    
+
     <select id="selectProjectCoordinateInfoById" parameterType="Long" resultMap="ProjectCoordinateInfoResult">
         <include refid="selectProjectCoordinateInfoVo"/>
         where id = #{id}
@@ -73,7 +98,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="createTime != null">create_time,</if>
             <if test="createBy != null">create_by,</if>
             <if test="updateBy != null">update_by,</if>
-         </trim>
+            <if test="tenantId != null">tenant_id,</if>
+        </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="id != null">#{id},</if>
             <if test="projectId != null">#{projectId},</if>
@@ -99,7 +125,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="createTime != null">#{createTime},</if>
             <if test="createBy != null">#{createBy},</if>
             <if test="updateBy != null">#{updateBy},</if>
-         </trim>
+            <if test="tenantId != null">#{tenantId},</if>
+        </trim>
     </insert>
 
     <update id="updateProjectCoordinateInfo" parameterType="ProjectCoordinateInfo">
@@ -128,16 +155,19 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="createTime != null">create_time = #{createTime},</if>
             <if test="createBy != null">create_by = #{createBy},</if>
             <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="tenantId != null">tenant_id = #{tenantId},</if>
         </trim>
         where id = #{id}
     </update>
 
     <delete id="deleteProjectCoordinateInfoById" parameterType="Long">
-        delete from cons_project_coordinate_info where id = #{id}
+        delete
+        from cons_project_coordinate_info
+        where id = #{id}
     </delete>
 
     <delete id="deleteProjectCoordinateInfoByIds" parameterType="String">
-        delete from cons_project_coordinate_info where id in 
+        delete from cons_project_coordinate_info where id in
         <foreach item="id" collection="array" open="(" separator="," close=")">
             #{id}
         </foreach>

+ 24 - 17
bd-park/park-backend/park-core/src/main/resources/mapper/cons/ProjectInfoMapper.xml

@@ -1,29 +1,31 @@
 <?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">
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.huashe.park.core.mapper.ProjectInfoMapper">
-    
+
     <resultMap type="ProjectInfo" id="ProjectInfoResult">
-        <result property="id"    column="id"    />
-        <result property="name"    column="name"    />
-        <result property="updateTime"    column="update_time"    />
-        <result property="createTime"    column="create_time"    />
-        <result property="createBy"    column="create_by"    />
-        <result property="updateBy"    column="update_by"    />
+        <result property="id" column="id"/>
+        <result property="name" column="name"/>
+        <result property="updateTime" column="update_time"/>
+        <result property="createTime" column="create_time"/>
+        <result property="createBy" column="create_by"/>
+        <result property="updateBy" column="update_by"/>
+        <result property="tenantId" column="tenant_id"/>
     </resultMap>
 
     <sql id="selectProjectInfoVo">
-        select id, name, update_time, create_time, create_by, update_by from cons_project_info
+        select id, name, update_time, create_time, create_by, update_by, tenant_id
+        from cons_project_info
     </sql>
 
     <select id="selectProjectInfoList" parameterType="ProjectInfo" resultMap="ProjectInfoResult">
         <include refid="selectProjectInfoVo"/>
-        <where>  
-            <if test="name != null  and name != ''"> and name like concat('%', #{name}, '%')</if>
+        <where>
+            <if test="name != null  and name != ''">and name like concat('%', #{name}, '%')</if>
         </where>
     </select>
-    
+
     <select id="selectProjectInfoById" parameterType="Long" resultMap="ProjectInfoResult">
         <include refid="selectProjectInfoVo"/>
         where id = #{id}
@@ -37,14 +39,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="createTime != null">create_time,</if>
             <if test="createBy != null">create_by,</if>
             <if test="updateBy != null">update_by,</if>
-         </trim>
+            <if test="tenantId != null">tenant_id,</if>
+        </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="name != null">#{name},</if>
             <if test="updateTime != null">#{updateTime},</if>
             <if test="createTime != null">#{createTime},</if>
             <if test="createBy != null">#{createBy},</if>
             <if test="updateBy != null">#{updateBy},</if>
-         </trim>
+            <if test="tenantId != null">#{tenantId},</if>
+        </trim>
     </insert>
 
     <update id="updateProjectInfo" parameterType="ProjectInfo">
@@ -55,16 +59,19 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="createTime != null">create_time = #{createTime},</if>
             <if test="createBy != null">create_by = #{createBy},</if>
             <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="tenantId != null">tenant_id = #{tenantId},</if>
         </trim>
         where id = #{id}
     </update>
 
     <delete id="deleteProjectInfoById" parameterType="Long">
-        delete from cons_project_info where id = #{id}
+        delete
+        from cons_project_info
+        where id = #{id}
     </delete>
 
     <delete id="deleteProjectInfoByIds" parameterType="String">
-        delete from cons_project_info where id in 
+        delete from cons_project_info where id in
         <foreach item="id" collection="array" open="(" separator="," close=")">
             #{id}
         </foreach>

+ 9 - 3
bd-park/park-backend/park-core/src/main/resources/mapper/sys/SysCustConfigMapper.xml

@@ -12,10 +12,11 @@
             <if test="configKey !=null and configKey != ''">
                 and config_key = #{configKey}
             </if>
+            <if test="configType == 'Y'.toString() and tenantId  != null">and tenant_id = #{tenantId}</if>
         </where>
     </sql>
 
-    <select id="selectConfig" parameterType="CustSysConfig" resultType="CustSysConfig">
+    <select id="selectTenantConfig" parameterType="CustSysConfig" resultType="CustSysConfig">
         select *
         from sys_config
         <include refid="sqlwhereSearch"/>
@@ -30,6 +31,7 @@
             <if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
             <if test="remark != null">remark = #{remark},</if>
             <if test="cfgJson != null">cfg_json = #{cfgJson},</if>
+            <if test="configType == 'Y'.toString() and tenantId  != null">tenant_id = #{tenantId},</if>
             update_time = sysdate()
         </set>
         where config_id = #{configId}
@@ -40,8 +42,12 @@
         from sys_config where config_id = #{configId}
     </select>
 
-    <select id="checkConfigKeyUnique" parameterType="String" resultType="CustSysConfig">
+    <select id="checkConfigKeyUnique" parameterType="CustSysConfig" resultType="CustSysConfig">
         select * from sys_config
-        where config_key = #{configKey} limit 1
+        where config_key = #{configKey}
+        <if test="configType != 'Y'.toString() and tenantId !=null">
+            and tenant_id = #{tenantId}
+        </if>
+        limit 1
     </select>
 </mapper> 

+ 0 - 3
bd-park/park-backend/park-domain/src/main/java/com/huashe/park/domain/entity/MachineProcessResult.java

@@ -3,12 +3,9 @@ package com.huashe.park.domain.entity;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
 
-import com.alibaba.fastjson2.JSONObject;
 import com.huashe.common.annotation.Excel;
 import com.huashe.common.domain.BaseEntity;
 import com.huashe.park.common.animations.FixedLength;
-import com.huashe.park.common.animations.mybatis.FieldConvert;
-import com.huashe.park.common.animations.mybatis.service.JsonConverter;
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;

+ 4 - 0
bd-park/park-backend/park-infrastructure/pom.xml

@@ -53,6 +53,10 @@
             <groupId>cn.idev.excel</groupId>
             <artifactId>fastexcel</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.github.jsqlparser</groupId>
+            <artifactId>jsqlparser</artifactId>
+        </dependency>
     </dependencies>
 
 </project>

+ 68 - 0
bd-park/park-backend/park-infrastructure/src/main/java/com/huashe/park/infrastructure/cfg/mybatis/BaseInterceptor.java

@@ -0,0 +1,68 @@
+package com.huashe.park.infrastructure.cfg.mybatis;
+
+import com.huashe.common.annotation.mybatis.TenantField;
+import com.huashe.common.exception.ServiceException;
+import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.core.domain.model.LoginUser;
+import com.ruoyi.common.utils.SecurityUtils;
+import lombok.extern.slf4j.Slf4j;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+@Slf4j
+public class BaseInterceptor {
+    public void setTenantField(Object parameter, Field field) {
+        TenantField annotation = field.getAnnotation(TenantField.class);
+        if (annotation != null) {
+            field.setAccessible(true);
+            try {
+                field.set(parameter, getLoginUser().getUser().getTenantId());
+            }
+            catch (Exception e) {
+                log.error("------MybatisInterceptor field.name------{},error:", field.getName(), e);
+            }
+            field.setAccessible(false);
+        }
+    }
+
+    public LoginUser getLoginUser() {
+        LoginUser userNow = new LoginUser();
+        userNow.setUser(new SysUser() {
+            {
+                setNickName(Thread.currentThread().getName());
+            }
+        });
+        try {
+            // try catch避免线程任务出错
+            userNow = SecurityUtils.getLoginUser() != null ? SecurityUtils.getLoginUser() : null;
+        }
+        catch (ServiceException e) {
+            log.debug("------MybatisInterceptor getLoginUser------");
+        }
+        return userNow;
+    }
+
+    /**
+     * 获取类的所有属性,包括父类
+     *
+     * @param object
+     * @return
+     */
+    public Field[] getAllFields(Object object) {
+        Class<?> clazz = object.getClass();
+        if (clazz == null) {
+            return null;
+        }
+        List<Field> fieldList = new ArrayList<>();
+        while (clazz != null) {
+            fieldList.addAll(new ArrayList<>(Arrays.asList(clazz.getDeclaredFields())));
+            clazz = clazz.getSuperclass();
+        }
+        Field[] fields = new Field[fieldList.size()];
+        fieldList.toArray(fields);
+        return fields;
+    }
+}

+ 0 - 5
bd-park/park-backend/park-infrastructure/src/main/java/com/huashe/park/infrastructure/cfg/mybatis/FieldConvertInterceptor.java

@@ -1,15 +1,10 @@
 package com.huashe.park.infrastructure.cfg.mybatis;
 
-import java.util.Arrays;
-import java.util.List;
-
-import com.huashe.park.common.animations.mybatis.FieldConvert;
 import org.apache.ibatis.executor.Executor;
 import org.apache.ibatis.mapping.MappedStatement;
 import org.apache.ibatis.plugin.Interceptor;
 import org.apache.ibatis.plugin.Intercepts;
 import org.apache.ibatis.plugin.Invocation;
-import org.apache.ibatis.plugin.Plugin;
 import org.apache.ibatis.plugin.Signature;
 import org.apache.ibatis.session.ResultHandler;
 import org.apache.ibatis.session.RowBounds;

+ 76 - 135
bd-park/park-backend/park-infrastructure/src/main/java/com/huashe/park/infrastructure/cfg/mybatis/MybatisInterceptor.java

@@ -1,13 +1,9 @@
 package com.huashe.park.infrastructure.cfg.mybatis;
 
-import java.lang.reflect.Field;
-import java.util.ArrayList;
-import java.util.Arrays;
+import java.util.Collection;
 import java.util.Date;
-import java.util.List;
 
 import org.apache.ibatis.binding.MapperMethod;
-import org.apache.ibatis.binding.MapperMethod.ParamMap;
 import org.apache.ibatis.executor.Executor;
 import org.apache.ibatis.mapping.MappedStatement;
 import org.apache.ibatis.mapping.SqlCommandType;
@@ -19,11 +15,10 @@ import org.apache.ibatis.plugin.Signature;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
+import org.springframework.util.ReflectionUtils;
 
-import com.huashe.common.exception.ServiceException;
-import com.ruoyi.common.core.domain.entity.SysUser;
+import com.huashe.common.annotation.mybatis.TenantField;
 import com.ruoyi.common.core.domain.model.LoginUser;
-import com.ruoyi.common.utils.SecurityUtils;
 
 @Component
 @Intercepts({
@@ -31,7 +26,7 @@ import com.ruoyi.common.utils.SecurityUtils;
         MappedStatement.class, Object.class
     })
 })
-public class MybatisInterceptor implements Interceptor {
+public class MybatisInterceptor extends BaseInterceptor implements Interceptor {
     private static final Logger log = LoggerFactory.getLogger(MybatisInterceptor.class);
 
     @Override
@@ -40,113 +35,97 @@ public class MybatisInterceptor implements Interceptor {
         String sqlId = mappedStatement.getId();
         log.debug("------sqlId------" + sqlId);
         SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType();
-        Object parameter = invocation.getArgs()[1];
+        Object parameterObject = invocation.getArgs()[1];
         log.debug("------sqlCommandType------" + sqlCommandType);
 
-        if (parameter == null) {
+        if (parameterObject == null) {
             return invocation.proceed();
         }
-        if (SqlCommandType.INSERT == sqlCommandType) {
-            LoginUser sysUser = getLoginUser();
-            Field[] fields = getAllFields(parameter);
-            assert fields != null;
-            for (Field field : fields) {
-                try {
-                    if ("createBy".equals(field.getName())) {
-                        field.setAccessible(true);
-                        Object local_createBy = field.get(parameter);
-                        field.setAccessible(false);
-                        if (local_createBy == null || local_createBy.equals("")) {
-                            if (sysUser != null) {
-                                // 登录人账号
-                                field.setAccessible(true);
-                                field.set(parameter, sysUser.getUser().getNickName());
-                                field.setAccessible(false);
-                            }
-                        }
-                    }
-                    if ("createName".equals(field.getName())) {
-                        field.setAccessible(true);
-                        Object local_createBy = field.get(parameter);
-                        field.setAccessible(false);
-                        if (local_createBy == null || local_createBy.equals("")) {
-                            if (sysUser != null) {
-                                // 登录人账号
-                                field.setAccessible(true);
-                                field.set(parameter, sysUser.getUser().getNickName());
-                                field.setAccessible(false);
-                            }
-                        }
-                    }
-                    // 注入创建时间
-                    if ("createTime".equals(field.getName())) {
-                        field.setAccessible(true);
-                        Object local_createDate = field.get(parameter);
-                        field.setAccessible(false);
-                        if (local_createDate == null || local_createDate.equals("")) {
-                            field.setAccessible(true);
-                            field.set(parameter, new Date());
-                            field.setAccessible(false);
-                        }
-                    }
-
+        if (parameterObject instanceof MapperMethod.ParamMap) {
+            MapperMethod.ParamMap paramMap = (MapperMethod.ParamMap) parameterObject;
+            for (Object value : paramMap.values()) {
+                if (!(value instanceof Collection)) {
+                    continue;
                 }
-                catch (Exception e) {
-                    log.error("------MybatisInterceptor field.name------{},error:", field.getName(), e);
+                for (Object item : (Collection<?>) value) {
+                    injectCreateModifyInfo(item, sqlCommandType);
                 }
             }
+            return invocation.proceed();
         }
-        if (SqlCommandType.UPDATE == sqlCommandType) {
-            LoginUser sysUser = this.getLoginUser();
-            Field[] fields = null;
-            if (parameter instanceof MapperMethod.ParamMap) {
-                MapperMethod.ParamMap<?> p = (ParamMap<?>) parameter;
-                // update-begin-author:scott date:20190729 for:批量更新报错issues/IZA3Q--
-                if (p.containsKey("et")) {
-                    parameter = p.get("arg0");
-                }
-                else if (p.containsKey("arg0")) {
-                    parameter = p.get("arg0");
-                }
-                else {
-                    parameter = p.get("param1");
-                }
-                // update-end-author:scott date:20190729 for:批量更新报错issues/IZA3Q-
-
-                // update-begin-author:scott date:20190729 for:更新指定字段时报错 issues/#516-
-                if (parameter == null) {
-                    return invocation.proceed();
-                }
-                // update-end-author:scott date:20190729 for:更新指定字段时报错 issues/#516-
-
-                fields = this.getAllFields(parameter);
+        // 处理集合类型参数(List/数组)
+        if (parameterObject instanceof Collection) {
+            for (Object item : (Collection<?>) parameterObject) {
+                injectCreateModifyInfo(item, sqlCommandType);
             }
-            else {
-                fields = this.getAllFields(parameter);
+            return invocation.proceed();
+        }
+        if (parameterObject.getClass().isArray()) {
+            for (Object item : (Object[]) parameterObject) {
+                injectCreateModifyInfo(item, sqlCommandType);
             }
+            return invocation.proceed();
+        }
+        injectCreateModifyInfo(parameterObject, sqlCommandType);
+        return invocation.proceed();
+    }
 
-            for (Field field : fields) {
+    private void injectCreateModifyInfo(Object target, SqlCommandType sqlCommandType) {
+        if (target == null) {
+            return;
+        }
+        LoginUser sysUser = getLoginUser();
+        if (SqlCommandType.INSERT == sqlCommandType) {
+            ReflectionUtils.doWithFields(target.getClass(), field -> {
                 field.setAccessible(true);
-                try {
-                    if ("updateBy".equals(field.getName())) {
-                        // 获取登录用户信息
+                if (field.isAnnotationPresent(TenantField.class)) {
+                    field.set(target, sysUser.getUser().getTenantId());
+                }
+                if ("createBy".equals(field.getName())) {
+                    Object local_createBy = field.get(target);
+                    if (local_createBy == null || local_createBy.equals("")) {
                         if (sysUser != null) {
-                            // 登录账号
-                            field.set(parameter, sysUser.getUser().getNickName());
-                            field.setAccessible(false);
+                            // 登录人账号
+                            field.set(target, sysUser.getUser().getNickName());
                         }
                     }
-                    if ("updateTime".equals(field.getName())) {
-                        field.set(parameter, new Date());
-                        field.setAccessible(false);
+                }
+                if ("createName".equals(field.getName())) {
+                    Object local_createBy = field.get(target);
+                    if (local_createBy == null || local_createBy.equals("")) {
+                        if (sysUser != null) {
+                            // 登录人账号
+                            field.set(target, sysUser.getUser().getNickName());
+                        }
                     }
                 }
-                catch (Exception e) {
-                    log.error("------ MybatisInterceptor field.name------{},error:", field.getName(), e);
+                // 注入创建时间
+                if ("createTime".equals(field.getName())) {
+                    Object local_createDate = field.get(target);
+                    if (local_createDate == null || local_createDate.equals("")) {
+                        field.set(target, new Date());
+                    }
                 }
-            }
+                field.setAccessible(false);
+            });
+            return;
+        }
+        if (SqlCommandType.UPDATE == sqlCommandType) {
+            ReflectionUtils.doWithFields(target.getClass(), field -> {
+                field.setAccessible(true);
+                if ("updateBy".equals(field.getName())) {
+                    // 获取登录用户信息
+                    if (sysUser != null) {
+                        // 登录账号
+                        field.set(target, sysUser.getUser().getNickName());
+                    }
+                }
+                if ("updateTime".equals(field.getName())) {
+                    field.set(target, new Date());
+                }
+                field.setAccessible(false);
+            });
         }
-        return invocation.proceed();
     }
 
     @Override
@@ -154,42 +133,4 @@ public class MybatisInterceptor implements Interceptor {
         return Plugin.wrap(target, this);
     }
 
-    private LoginUser getLoginUser() {
-        LoginUser userNow = new LoginUser();
-        userNow.setUser(new SysUser() {
-            {
-                setNickName(Thread.currentThread().getName());
-            }
-        });
-        try {
-            // try catch避免线程任务出错
-            userNow = SecurityUtils.getLoginUser() != null ? SecurityUtils.getLoginUser() : null;
-        }
-        catch (ServiceException e) {
-            log.debug("------MybatisInterceptor getLoginUser------");
-        }
-        return userNow;
-    }
-
-    /**
-     * 获取类的所有属性,包括父类
-     *
-     * @param object
-     * @return
-     */
-    public Field[] getAllFields(Object object) {
-        Class<?> clazz = object.getClass();
-        if (clazz == null) {
-            return null;
-        }
-        List<Field> fieldList = new ArrayList<>();
-        while (clazz != null) {
-            fieldList.addAll(new ArrayList<>(Arrays.asList(clazz.getDeclaredFields())));
-            clazz = clazz.getSuperclass();
-        }
-        Field[] fields = new Field[fieldList.size()];
-        fieldList.toArray(fields);
-        return fields;
-    }
-
 }

+ 8 - 0
bd-park/park-backend/park-infrastructure/src/main/java/com/huashe/park/infrastructure/cfg/mybatis/RegisterCustomerInterceptor.java

@@ -17,6 +17,12 @@ public class RegisterCustomerInterceptor implements ApplicationListener<ContextR
     private MybatisInterceptor mybatisInterceptor;
 
     @Autowired
+    private TenantSqlInterceptor tenantSqlInterceptor;
+
+    @Autowired
+    private TenantIdInterceptor tenantIdInterceptor;
+
+    @Autowired
     private List<SqlSessionFactory> sqlSessionFactories;
 
     @Override
@@ -27,6 +33,8 @@ public class RegisterCustomerInterceptor implements ApplicationListener<ContextR
             // 这里注册只能是已经是默认转换完了在进行转换,可以转换同类型的字段比如字段的加解密
             // factory.getConfiguration().getTypeHandlerRegistry().register(new MySqlJsonHandler<>());
             // 由于mybatis拦截器使用责任链模式,有可能会导致自定义拦截器失效,因此下面方法可以将自定义拦截器重新注入到sql中
+            factory.getConfiguration().addInterceptor(tenantSqlInterceptor);
+            factory.getConfiguration().addInterceptor(tenantIdInterceptor);
             factory.getConfiguration().addInterceptor(mybatisInterceptor);
             // factory.getConfiguration().addInterceptor(new FieldConvertInterceptor());
         }

+ 1 - 1
bd-park/park-backend/park-infrastructure/src/main/java/com/huashe/park/infrastructure/cfg/mybatis/ResultTypeConvertInterceptor.java

@@ -17,7 +17,7 @@ import org.springframework.util.ReflectionUtils;
 
 import com.huashe.park.common.animations.mybatis.Converter;
 import com.huashe.park.common.animations.mybatis.ConverterCache;
-import com.huashe.park.common.animations.mybatis.FieldConvert;
+import com.huashe.park.common.animations.mybatis.emuns.FieldConvert;
 import com.huashe.park.common.animations.mybatis.FieldMetadataCache;
 
 @Intercepts(@Signature(type = ResultSetHandler.class, method = "handleResultSets", args = {

+ 81 - 0
bd-park/park-backend/park-infrastructure/src/main/java/com/huashe/park/infrastructure/cfg/mybatis/TenantIdInterceptor.java

@@ -0,0 +1,81 @@
+package com.huashe.park.infrastructure.cfg.mybatis;
+
+import java.util.Collection;
+import java.util.Map;
+
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.ibatis.executor.Executor;
+import org.apache.ibatis.mapping.MappedStatement;
+import org.apache.ibatis.mapping.SqlCommandType;
+import org.apache.ibatis.plugin.Interceptor;
+import org.apache.ibatis.plugin.Intercepts;
+import org.apache.ibatis.plugin.Invocation;
+import org.apache.ibatis.plugin.Signature;
+import org.apache.ibatis.session.ResultHandler;
+import org.apache.ibatis.session.RowBounds;
+import org.springframework.stereotype.Component;
+import org.springframework.util.ReflectionUtils;
+
+import com.huashe.common.annotation.mybatis.TenantField;
+
+@Intercepts({
+    @Signature(type = Executor.class, method = "query", args = {
+        MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class
+    })
+})
+@Component
+public class TenantIdInterceptor extends BaseInterceptor implements Interceptor {
+    @Override
+    public Object intercept(Invocation invocation) throws Throwable {
+        MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
+        SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType();
+        Object parameterObject = invocation.getArgs()[1];
+        Long tenantId = getLoginUser().getUser().getTenantId();
+        // 无租户 ID 或无参数对象直接跳过
+        if (sqlCommandType != SqlCommandType.SELECT || ObjectUtils.isEmpty(tenantId)
+            || ObjectUtils.isEmpty(parameterObject)) {
+            return invocation.proceed();
+        }
+
+        // 处理集合类型参数(List/数组)
+        if (parameterObject instanceof Collection) {
+            for (Object item : (Collection<?>) parameterObject) {
+                injectTenantId(item, tenantId);
+            }
+            return invocation.proceed();
+        }
+        if (parameterObject.getClass().isArray()) {
+            for (Object item : (Object[]) parameterObject) {
+                injectTenantId(item, tenantId);
+            }
+            return invocation.proceed();
+        }
+        injectTenantId(parameterObject, tenantId);
+
+        return invocation.proceed();
+    }
+
+    // 公共注入逻辑
+    private void injectTenantId(Object target, Long tenantId) {
+        if (target == null)
+            return;
+
+        // 处理 Map 类型
+        if (target instanceof Map) {
+            Map<?, ?> map = (Map<?, ?>) target;
+            if (!map.containsKey("tenantId")) {
+                ((Map<String, Object>) map).put("tenantId", tenantId);
+            }
+        }
+        // 处理实体对象
+        else {
+            ReflectionUtils.doWithFields(target.getClass(), field -> {
+                if (field.isAnnotationPresent(TenantField.class)) {
+                    field.setAccessible(true);
+                    field.set(target, getLoginUser().getUser().getTenantId());
+                    field.setAccessible(false);
+                }
+            });
+        }
+    }
+}

+ 122 - 0
bd-park/park-backend/park-infrastructure/src/main/java/com/huashe/park/infrastructure/cfg/mybatis/TenantSqlInterceptor.java

@@ -0,0 +1,122 @@
+package com.huashe.park.infrastructure.cfg.mybatis;
+
+import java.lang.reflect.Method;
+import java.sql.Connection;
+import java.util.List;
+import java.util.Properties;
+
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.ibatis.executor.statement.StatementHandler;
+import org.apache.ibatis.mapping.MappedStatement;
+import org.apache.ibatis.plugin.Interceptor;
+import org.apache.ibatis.plugin.Intercepts;
+import org.apache.ibatis.plugin.Invocation;
+import org.apache.ibatis.plugin.Plugin;
+import org.apache.ibatis.plugin.Signature;
+import org.apache.ibatis.reflection.MetaObject;
+import org.apache.ibatis.reflection.SystemMetaObject;
+import org.springframework.stereotype.Component;
+
+import com.huashe.common.annotation.mybatis.Tenant;
+import com.huashe.park.common.animations.mybatis.MethodMetadataCache;
+
+import net.sf.jsqlparser.expression.Expression;
+import net.sf.jsqlparser.expression.LongValue;
+import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
+import net.sf.jsqlparser.expression.operators.relational.EqualsTo;
+import net.sf.jsqlparser.parser.CCJSqlParserUtil;
+import net.sf.jsqlparser.schema.Column;
+import net.sf.jsqlparser.statement.Statement;
+import net.sf.jsqlparser.statement.select.PlainSelect;
+import net.sf.jsqlparser.statement.select.Select;
+import net.sf.jsqlparser.statement.select.SelectBody;
+
+@Intercepts({
+    @Signature(type = StatementHandler.class, method = "prepare", args = {
+        Connection.class, Integer.class
+    })
+})
+@Component
+public class TenantSqlInterceptor extends BaseInterceptor implements Interceptor {
+
+    @Override
+    public Object intercept(Invocation invocation) throws Throwable {
+        StatementHandler handler = (StatementHandler) invocation.getTarget();
+        MetaObject metaObject = SystemMetaObject.forObject(handler);
+
+        // 获取原始 SQL 和 MappedStatement
+        String originalSql = (String) metaObject.getValue("delegate.boundSql.sql");
+        MappedStatement mappedStatement = (MappedStatement) metaObject.getValue("delegate.mappedStatement");
+        Method mapperMethod = getMapperMethod(mappedStatement);
+        // 判断是否需要添加租户条件
+        if (!ObjectUtils.allNotNull(mapperMethod, getLoginUser().getUser().getTenantId())) {
+            return invocation.proceed();
+        }
+        // 解析 SQL 语法树
+        Statement stmt = CCJSqlParserUtil.parse(originalSql);
+        if (!(stmt instanceof Select)) {
+            return invocation.proceed();
+        }
+        Select select = (Select) stmt;
+        SelectBody selectBody = select.getSelectBody();
+        if (!(selectBody instanceof PlainSelect)) {
+            return invocation.proceed();
+        }
+        PlainSelect plainSelect = (PlainSelect) selectBody;
+        // 构建租户条件表达式(tenant_id = ?)
+        EqualsTo tenantCondition = new EqualsTo();
+        tenantCondition.setLeftExpression(handleColumn(mapperMethod));
+        tenantCondition.setRightExpression(new LongValue(getLoginUser().getUser().getTenantId()));
+
+        // 修改 WHERE 条件
+        Expression where = plainSelect.getWhere();
+        if (where == null) {
+            // 没有 WHERE 子句时直接添加
+            plainSelect.setWhere(tenantCondition);
+        }
+        else {
+            // 已有 WHERE 子句时用 AND 连接
+            AndExpression and = new AndExpression(where, tenantCondition);
+            plainSelect.setWhere(and);
+        }
+
+        // 生成修改后的 SQL
+        String modifiedSql = plainSelect.toString();
+        metaObject.setValue("delegate.boundSql.sql", modifiedSql);
+
+        return invocation.proceed();
+    }
+
+    private Method getMapperMethod(MappedStatement mappedStatement) {
+        String methodId = mappedStatement.getId();
+        int lastDotIndex = methodId.lastIndexOf(".");
+        String methodName = methodId.substring(lastDotIndex + 1);
+        List<Method> annotatedMethods = MethodMetadataCache.getAnnotatedMethods(mappedStatement);
+        if (methodName.endsWith("_COUNT")) {
+            methodName = methodName.replaceFirst("_COUNT", "");
+        }
+        String finalMethodName = methodName;
+        return annotatedMethods.stream().filter(method -> method.getName().equals(finalMethodName)).findFirst()
+            .orElse(null);
+    }
+
+    private Column handleColumn(Method mapperMethod) {
+        Tenant annotation = mapperMethod.getAnnotation(Tenant.class);
+        if (!ObjectUtils.isNotEmpty(annotation)) {
+            return new Column("tenant_id");
+        }
+        if (ObjectUtils.isNotEmpty(annotation.tableAlias())) {
+            return new Column(String.format("%s.%s", annotation.tableAlias(), annotation.field()));
+        }
+        return new Column(annotation.field());
+    }
+
+    @Override
+    public Object plugin(Object target) {
+        return Plugin.wrap(target, this);
+    }
+
+    @Override
+    public void setProperties(Properties properties) {
+    }
+}

+ 6 - 1
bd-park/park-backend/pom.xml

@@ -59,6 +59,7 @@
         <paho.version>1.2.5</paho.version>
         <common.collect>4.4</common.collect>
         <geotools.version>20.0</geotools.version>
+        <jsqlparser.version>4.6</jsqlparser.version>
     </properties>
 
     <!-- 依赖声明 -->
@@ -373,7 +374,11 @@
                 <artifactId>commons-collections4</artifactId>
                 <version>${common.collect}</version>
             </dependency>
-
+            <dependency>
+                <groupId>com.github.jsqlparser</groupId>
+                <artifactId>jsqlparser</artifactId>
+                <version>${jsqlparser.version}</version>
+            </dependency>
             <dependency>
                 <groupId>org.geotools</groupId>
                 <artifactId>gt-api</artifactId>

+ 9 - 4
common-application/pom.xml

@@ -2,8 +2,8 @@
 <project xmlns="http://maven.apache.org/POM/4.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	
+    <modelVersion>4.0.0</modelVersion>
+
     <groupId>com.huashe.application</groupId>
     <artifactId>common-application</artifactId>
     <version>3.8.8</version>
@@ -11,7 +11,7 @@
     <name>common-application</name>
 
     <description>公共组件-单体应用版</description>
-    
+
     <properties>
         <ruoyi.version>3.8.8</ruoyi.version>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
@@ -36,6 +36,7 @@
         <spring-security.version>5.7.12</spring-security.version>
         <spring-framework.version>5.3.39</spring-framework.version>
         <prod.commons.version>1.0-SNAPSHOT</prod.commons.version>
+        <jsqlparser.version>4.6</jsqlparser.version>
     </properties>
 
     <!-- 依赖声明 -->
@@ -224,7 +225,11 @@
                 <artifactId>prod-commons</artifactId>
                 <version>${prod.commons.version}</version>
             </dependency>
-
+            <dependency>
+                <groupId>com.github.jsqlparser</groupId>
+                <artifactId>jsqlparser</artifactId>
+                <version>${jsqlparser.version}</version>
+            </dependency>
         </dependencies>
     </dependencyManagement>
 

+ 28 - 50
common-application/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java

@@ -15,6 +15,7 @@ import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.system.service.ISysDeptService;
 import com.ruoyi.system.service.ISysPostService;
 import com.ruoyi.system.service.ISysRoleService;
+import com.ruoyi.system.service.ISysTenantService;
 import com.ruoyi.system.service.ISysUserService;
 import org.apache.commons.lang3.ArrayUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -36,13 +37,12 @@ import java.util.stream.Collectors;
 
 /**
  * 用户信息
- * 
+ *
  * @author ruoyi
  */
 @RestController
 @RequestMapping("/system/user")
-public class SysUserController extends BaseController
-{
+public class SysUserController extends BaseController {
     @Autowired
     private ISysUserService userService;
 
@@ -55,13 +55,15 @@ public class SysUserController extends BaseController
     @Autowired
     private ISysPostService postService;
 
+    @Autowired
+    private ISysTenantService tenantService;
+
     /**
      * 获取用户列表
      */
     @PreAuthorize("@ss.hasPermi('system:user:list')")
     @GetMapping("/list")
-    public TableDataInfo list(SysUser user)
-    {
+    public TableDataInfo list(SysUser user) {
         startPage();
         List<SysUser> list = userService.selectUserList(user);
         return getDataTable(list);
@@ -70,8 +72,7 @@ public class SysUserController extends BaseController
     @Log(title = "用户管理", businessType = BusinessType.EXPORT)
     @PreAuthorize("@ss.hasPermi('system:user:export')")
     @PostMapping("/export")
-    public void export(HttpServletResponse response, SysUser user)
-    {
+    public void export(HttpServletResponse response, SysUser user) {
         List<SysUser> list = userService.selectUserList(user);
         ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
         util.exportExcel(response, list, "用户数据");
@@ -80,8 +81,7 @@ public class SysUserController extends BaseController
     @Log(title = "用户管理", businessType = BusinessType.IMPORT)
     @PreAuthorize("@ss.hasPermi('system:user:import')")
     @PostMapping("/importData")
-    public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception
-    {
+    public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception {
         ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
         List<SysUser> userList = util.importExcel(file.getInputStream());
         String operName = getUsername();
@@ -90,8 +90,7 @@ public class SysUserController extends BaseController
     }
 
     @PostMapping("/importTemplate")
-    public void importTemplate(HttpServletResponse response)
-    {
+    public void importTemplate(HttpServletResponse response) {
         ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
         util.importTemplateExcel(response, "用户数据");
     }
@@ -100,12 +99,10 @@ public class SysUserController extends BaseController
      * 根据用户编号获取详细信息
      */
     @PreAuthorize("@ss.hasPermi('system:user:query')")
-    @GetMapping(value = { "/", "/{userId}" })
-    public AjaxResult getInfo(@PathVariable(value = "userId", required = false) Long userId)
-    {
+    @GetMapping(value = {"/", "/{userId}"})
+    public AjaxResult getInfo(@PathVariable(value = "userId", required = false) Long userId) {
         AjaxResult ajax = AjaxResult.success();
-        if (StringUtils.isNotNull(userId))
-        {
+        if (StringUtils.isNotNull(userId)) {
             userService.checkUserDataScope(userId);
             SysUser sysUser = userService.selectUserById(userId);
             ajax.put(AjaxResult.DATA_TAG, sysUser);
@@ -124,20 +121,14 @@ public class SysUserController extends BaseController
     @PreAuthorize("@ss.hasPermi('system:user:add')")
     @Log(title = "用户管理", businessType = BusinessType.INSERT)
     @PostMapping
-    public AjaxResult add(@Validated @RequestBody SysUser user)
-    {
+    public AjaxResult add(@Validated @RequestBody SysUser user) {
         deptService.checkDeptDataScope(user.getDeptId());
         roleService.checkRoleDataScope(user.getRoleIds());
-        if (!userService.checkUserNameUnique(user))
-        {
+        if (!userService.checkUserNameUnique(user)) {
             return error("新增用户'" + user.getUserName() + "'失败,登录账号已存在");
-        }
-        else if (StringMatchUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user))
-        {
+        } else if (StringMatchUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) {
             return error("新增用户'" + user.getUserName() + "'失败,手机号码已存在");
-        }
-        else if (StringMatchUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user))
-        {
+        } else if (StringMatchUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) {
             return error("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在");
         }
         user.setCreateBy(getUsername());
@@ -151,22 +142,16 @@ public class SysUserController extends BaseController
     @PreAuthorize("@ss.hasPermi('system:user:edit')")
     @Log(title = "用户管理", businessType = BusinessType.UPDATE)
     @PutMapping
-    public AjaxResult edit(@Validated @RequestBody SysUser user)
-    {
+    public AjaxResult edit(@Validated @RequestBody SysUser user) {
         userService.checkUserAllowed(user);
         userService.checkUserDataScope(user.getUserId());
         deptService.checkDeptDataScope(user.getDeptId());
         roleService.checkRoleDataScope(user.getRoleIds());
-        if (!userService.checkUserNameUnique(user))
-        {
+        if (!userService.checkUserNameUnique(user)) {
             return error("修改用户'" + user.getUserName() + "'失败,登录账号已存在");
-        }
-        else if (StringMatchUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user))
-        {
+        } else if (StringMatchUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) {
             return error("修改用户'" + user.getUserName() + "'失败,手机号码已存在");
-        }
-        else if (StringMatchUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user))
-        {
+        } else if (StringMatchUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) {
             return error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在");
         }
         user.setUpdateBy(getUsername());
@@ -179,10 +164,8 @@ public class SysUserController extends BaseController
     @PreAuthorize("@ss.hasPermi('system:user:remove')")
     @Log(title = "用户管理", businessType = BusinessType.DELETE)
     @DeleteMapping("/{userIds}")
-    public AjaxResult remove(@PathVariable Long[] userIds)
-    {
-        if (ArrayUtils.contains(userIds, getUserId()))
-        {
+    public AjaxResult remove(@PathVariable Long[] userIds) {
+        if (ArrayUtils.contains(userIds, getUserId())) {
             return error("当前用户不能删除");
         }
         return toAjax(userService.deleteUserByIds(userIds));
@@ -194,8 +177,7 @@ public class SysUserController extends BaseController
     @PreAuthorize("@ss.hasPermi('system:user:resetPwd')")
     @Log(title = "用户管理", businessType = BusinessType.UPDATE)
     @PutMapping("/resetPwd")
-    public AjaxResult resetPwd(@RequestBody SysUser user)
-    {
+    public AjaxResult resetPwd(@RequestBody SysUser user) {
         userService.checkUserAllowed(user);
         userService.checkUserDataScope(user.getUserId());
         user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
@@ -209,8 +191,7 @@ public class SysUserController extends BaseController
     @PreAuthorize("@ss.hasPermi('system:user:edit')")
     @Log(title = "用户管理", businessType = BusinessType.UPDATE)
     @PutMapping("/changeStatus")
-    public AjaxResult changeStatus(@RequestBody SysUser user)
-    {
+    public AjaxResult changeStatus(@RequestBody SysUser user) {
         userService.checkUserAllowed(user);
         userService.checkUserDataScope(user.getUserId());
         user.setUpdateBy(getUsername());
@@ -222,8 +203,7 @@ public class SysUserController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:user:query')")
     @GetMapping("/authRole/{userId}")
-    public AjaxResult authRole(@PathVariable("userId") Long userId)
-    {
+    public AjaxResult authRole(@PathVariable("userId") Long userId) {
         AjaxResult ajax = AjaxResult.success();
         SysUser user = userService.selectUserById(userId);
         List<SysRole> roles = roleService.selectRolesByUserId(userId);
@@ -238,8 +218,7 @@ public class SysUserController extends BaseController
     @PreAuthorize("@ss.hasPermi('system:user:edit')")
     @Log(title = "用户管理", businessType = BusinessType.GRANT)
     @PutMapping("/authRole")
-    public AjaxResult insertAuthRole(Long userId, Long[] roleIds)
-    {
+    public AjaxResult insertAuthRole(Long userId, Long[] roleIds) {
         userService.checkUserDataScope(userId);
         roleService.checkRoleDataScope(roleIds);
         userService.insertUserAuth(userId, roleIds);
@@ -251,8 +230,7 @@ public class SysUserController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:user:list')")
     @GetMapping("/deptTree")
-    public AjaxResult deptTree(SysDept dept)
-    {
+    public AjaxResult deptTree(SysDept dept) {
         return success(deptService.selectDeptTreeList(dept));
     }
 }

+ 141 - 131
common-application/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java

@@ -1,325 +1,335 @@
 package com.ruoyi.common.core.domain.entity;
 
-import java.util.Date;
-import java.util.List;
-import javax.validation.constraints.*;
-
-import com.huashe.common.domain.BaseEntity;
-import org.apache.commons.lang3.builder.ToStringBuilder;
-import org.apache.commons.lang3.builder.ToStringStyle;
 import com.huashe.common.annotation.Excel;
 import com.huashe.common.annotation.Excel.ColumnType;
 import com.huashe.common.annotation.Excel.Type;
 import com.huashe.common.annotation.Excels;
+import com.huashe.common.annotation.mybatis.TenantField;
+import com.huashe.common.domain.BaseEntity;
 import com.ruoyi.common.xss.Xss;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import javax.validation.constraints.Email;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Size;
+import java.util.Date;
+import java.util.List;
 
 /**
  * 用户对象 sys_user
- * 
+ *
  * @author ruoyi
  */
-public class SysUser extends BaseEntity
-{
+public class SysUser extends BaseEntity {
     private static final long serialVersionUID = 1L;
 
-    /** 用户ID */
+    /**
+     * 用户ID
+     */
     @Excel(name = "用户序号", type = Type.EXPORT, cellType = ColumnType.NUMERIC, prompt = "用户编号")
     private Long userId;
 
-    /** 部门ID */
+    /**
+     * 部门ID
+     */
     @Excel(name = "部门编号", type = Type.IMPORT)
     private Long deptId;
 
-    /** 用户账号 */
+    /**
+     * 用户账号
+     */
     @Excel(name = "登录名称")
     private String userName;
 
-    /** 用户昵称 */
+    /**
+     * 用户昵称
+     */
     @Excel(name = "用户名称")
     private String nickName;
 
-    /** 用户邮箱 */
+    /**
+     * 用户邮箱
+     */
     @Excel(name = "用户邮箱")
     private String email;
 
-    /** 手机号码 */
+    /**
+     * 手机号码
+     */
     @Excel(name = "手机号码", cellType = ColumnType.TEXT)
     private String phonenumber;
 
-    /** 用户性别 */
+    /**
+     * 用户性别
+     */
     @Excel(name = "用户性别", readConverterExp = "0=男,1=女,2=未知")
     private String sex;
 
-    /** 用户头像 */
+    /**
+     * 用户头像
+     */
     private String avatar;
 
-    /** 密码 */
+    /**
+     * 密码
+     */
     private String password;
 
-    /** 帐号状态(0正常 1停用) */
+    /**
+     * 帐号状态(0正常 1停用)
+     */
     @Excel(name = "帐号状态", readConverterExp = "0=正常,1=停用")
     private String status;
 
-    /** 删除标志(0代表存在 2代表删除) */
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
     private String delFlag;
 
-    /** 最后登录IP */
+    /**
+     * 最后登录IP
+     */
     @Excel(name = "最后登录IP", type = Type.EXPORT)
     private String loginIp;
 
-    /** 最后登录时间 */
+    /**
+     * 最后登录时间
+     */
     @Excel(name = "最后登录时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss", type = Type.EXPORT)
     private Date loginDate;
 
-    /** 部门对象 */
+    /**
+     * 部门对象
+     */
     @Excels({
-        @Excel(name = "部门名称", targetAttr = "deptName", type = Type.EXPORT),
-        @Excel(name = "部门负责人", targetAttr = "leader", type = Type.EXPORT)
+            @Excel(name = "部门名称", targetAttr = "deptName", type = Type.EXPORT),
+            @Excel(name = "部门负责人", targetAttr = "leader", type = Type.EXPORT)
     })
     private SysDept dept;
 
-    /** 角色对象 */
+    /**
+     * 角色对象
+     */
     private List<SysRole> roles;
 
-    /** 角色组 */
+    /**
+     * 角色组
+     */
     private Long[] roleIds;
 
-    /** 岗位组 */
+    /**
+     * 岗位组
+     */
     private Long[] postIds;
 
-    /** 角色ID */
+    /**
+     * 角色ID
+     */
     private Long roleId;
 
-    public SysUser()
-    {
+
+    @TenantField
+    private Long tenantId;
+
+    public SysUser() {
 
     }
 
-    public SysUser(Long userId)
-    {
+    public SysUser(Long userId) {
         this.userId = userId;
     }
 
-    public Long getUserId()
-    {
+    public Long getUserId() {
         return userId;
     }
 
-    public void setUserId(Long userId)
-    {
+    public void setUserId(Long userId) {
         this.userId = userId;
     }
 
-    public boolean isAdmin()
-    {
+    public boolean isAdmin() {
         return isAdmin(this.userId);
     }
 
-    public static boolean isAdmin(Long userId)
-    {
+    public static boolean isAdmin(Long userId) {
         return userId != null && 1L == userId;
     }
 
-    public Long getDeptId()
-    {
+    public Long getDeptId() {
         return deptId;
     }
 
-    public void setDeptId(Long deptId)
-    {
+    public void setDeptId(Long deptId) {
         this.deptId = deptId;
     }
 
     @Xss(message = "用户昵称不能包含脚本字符")
     @Size(min = 0, max = 30, message = "用户昵称长度不能超过30个字符")
-    public String getNickName()
-    {
+    public String getNickName() {
         return nickName;
     }
 
-    public void setNickName(String nickName)
-    {
+    public void setNickName(String nickName) {
         this.nickName = nickName;
     }
 
     @Xss(message = "用户账号不能包含脚本字符")
     @NotBlank(message = "用户账号不能为空")
     @Size(min = 0, max = 30, message = "用户账号长度不能超过30个字符")
-    public String getUserName()
-    {
+    public String getUserName() {
         return userName;
     }
 
-    public void setUserName(String userName)
-    {
+    public void setUserName(String userName) {
         this.userName = userName;
     }
 
     @Email(message = "邮箱格式不正确")
     @Size(min = 0, max = 50, message = "邮箱长度不能超过50个字符")
-    public String getEmail()
-    {
+    public String getEmail() {
         return email;
     }
 
-    public void setEmail(String email)
-    {
+    public void setEmail(String email) {
         this.email = email;
     }
 
     @Size(min = 0, max = 11, message = "手机号码长度不能超过11个字符")
-    public String getPhonenumber()
-    {
+    public String getPhonenumber() {
         return phonenumber;
     }
 
-    public void setPhonenumber(String phonenumber)
-    {
+    public void setPhonenumber(String phonenumber) {
         this.phonenumber = phonenumber;
     }
 
-    public String getSex()
-    {
+    public String getSex() {
         return sex;
     }
 
-    public void setSex(String sex)
-    {
+    public void setSex(String sex) {
         this.sex = sex;
     }
 
-    public String getAvatar()
-    {
+    public String getAvatar() {
         return avatar;
     }
 
-    public void setAvatar(String avatar)
-    {
+    public void setAvatar(String avatar) {
         this.avatar = avatar;
     }
 
-    public String getPassword()
-    {
+    public String getPassword() {
         return password;
     }
 
-    public void setPassword(String password)
-    {
+    public void setPassword(String password) {
         this.password = password;
     }
 
-    public String getStatus()
-    {
+    public String getStatus() {
         return status;
     }
 
-    public void setStatus(String status)
-    {
+    public void setStatus(String status) {
         this.status = status;
     }
 
-    public String getDelFlag()
-    {
+    public String getDelFlag() {
         return delFlag;
     }
 
-    public void setDelFlag(String delFlag)
-    {
+    public void setDelFlag(String delFlag) {
         this.delFlag = delFlag;
     }
 
-    public String getLoginIp()
-    {
+    public String getLoginIp() {
         return loginIp;
     }
 
-    public void setLoginIp(String loginIp)
-    {
+    public void setLoginIp(String loginIp) {
         this.loginIp = loginIp;
     }
 
-    public Date getLoginDate()
-    {
+    public Date getLoginDate() {
         return loginDate;
     }
 
-    public void setLoginDate(Date loginDate)
-    {
+    public void setLoginDate(Date loginDate) {
         this.loginDate = loginDate;
     }
 
-    public SysDept getDept()
-    {
+    public SysDept getDept() {
         return dept;
     }
 
-    public void setDept(SysDept dept)
-    {
+    public void setDept(SysDept dept) {
         this.dept = dept;
     }
 
-    public List<SysRole> getRoles()
-    {
+    public List<SysRole> getRoles() {
         return roles;
     }
 
-    public void setRoles(List<SysRole> roles)
-    {
+    public void setRoles(List<SysRole> roles) {
         this.roles = roles;
     }
 
-    public Long[] getRoleIds()
-    {
+    public Long[] getRoleIds() {
         return roleIds;
     }
 
-    public void setRoleIds(Long[] roleIds)
-    {
+    public void setRoleIds(Long[] roleIds) {
         this.roleIds = roleIds;
     }
 
-    public Long[] getPostIds()
-    {
+    public Long[] getPostIds() {
         return postIds;
     }
 
-    public void setPostIds(Long[] postIds)
-    {
+    public void setPostIds(Long[] postIds) {
         this.postIds = postIds;
     }
 
-    public Long getRoleId()
-    {
+    public Long getRoleId() {
         return roleId;
     }
 
-    public void setRoleId(Long roleId)
-    {
+    public void setRoleId(Long roleId) {
         this.roleId = roleId;
     }
 
+    public Long getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(Long tenantId) {
+        this.tenantId = tenantId;
+    }
+
     @Override
     public String toString() {
-        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
-            .append("userId", getUserId())
-            .append("deptId", getDeptId())
-            .append("userName", getUserName())
-            .append("nickName", getNickName())
-            .append("email", getEmail())
-            .append("phonenumber", getPhonenumber())
-            .append("sex", getSex())
-            .append("avatar", getAvatar())
-            .append("password", getPassword())
-            .append("status", getStatus())
-            .append("delFlag", getDelFlag())
-            .append("loginIp", getLoginIp())
-            .append("loginDate", getLoginDate())
-            .append("createBy", getCreateBy())
-            .append("createTime", getCreateTime())
-            .append("updateBy", getUpdateBy())
-            .append("updateTime", getUpdateTime())
-            .append("remark", getRemark())
-            .append("dept", getDept())
-            .toString();
+        return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
+                .append("userId", getUserId())
+                .append("deptId", getDeptId())
+                .append("userName", getUserName())
+                .append("nickName", getNickName())
+                .append("email", getEmail())
+                .append("phonenumber", getPhonenumber())
+                .append("sex", getSex())
+                .append("avatar", getAvatar())
+                .append("password", getPassword())
+                .append("status", getStatus())
+                .append("delFlag", getDelFlag())
+                .append("loginIp", getLoginIp())
+                .append("loginDate", getLoginDate())
+                .append("createBy", getCreateBy())
+                .append("createTime", getCreateTime())
+                .append("updateBy", getUpdateBy())
+                .append("updateTime", getUpdateTime())
+                .append("remark", getRemark())
+                .append("dept", getDept())
+                .toString();
     }
 }

+ 39 - 70
common-application/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUser.java

@@ -4,16 +4,16 @@ import com.alibaba.fastjson2.annotation.JSONField;
 import com.ruoyi.common.core.domain.entity.SysUser;
 import org.springframework.security.core.GrantedAuthority;
 import org.springframework.security.core.userdetails.UserDetails;
+
 import java.util.Collection;
 import java.util.Set;
 
 /**
  * 登录用户身份权限
- * 
+ *
  * @author ruoyi
  */
-public class LoginUser implements UserDetails
-{
+public class LoginUser implements UserDetails {
     private static final long serialVersionUID = 1L;
 
     /**
@@ -71,64 +71,54 @@ public class LoginUser implements UserDetails
      */
     private SysUser user;
 
-    public LoginUser()
-    {
+
+    public LoginUser() {
     }
 
-    public LoginUser(SysUser user, Set<String> permissions)
-    {
+    public LoginUser(SysUser user, Set<String> permissions) {
         this.user = user;
         this.permissions = permissions;
     }
 
-    public LoginUser(Long userId, Long deptId, SysUser user, Set<String> permissions)
-    {
+    public LoginUser(Long userId, Long deptId, SysUser user, Set<String> permissions) {
         this.userId = userId;
         this.deptId = deptId;
         this.user = user;
         this.permissions = permissions;
     }
 
-    public Long getUserId()
-    {
+    public Long getUserId() {
         return userId;
     }
 
-    public void setUserId(Long userId)
-    {
+    public void setUserId(Long userId) {
         this.userId = userId;
     }
 
-    public Long getDeptId()
-    {
+    public Long getDeptId() {
         return deptId;
     }
 
-    public void setDeptId(Long deptId)
-    {
+    public void setDeptId(Long deptId) {
         this.deptId = deptId;
     }
 
-    public String getToken()
-    {
+    public String getToken() {
         return token;
     }
 
-    public void setToken(String token)
-    {
+    public void setToken(String token) {
         this.token = token;
     }
 
     @JSONField(serialize = false)
     @Override
-    public String getPassword()
-    {
+    public String getPassword() {
         return user.getPassword();
     }
 
     @Override
-    public String getUsername()
-    {
+    public String getUsername() {
         return user.getUserName();
     }
 
@@ -137,130 +127,109 @@ public class LoginUser implements UserDetails
      */
     @JSONField(serialize = false)
     @Override
-    public boolean isAccountNonExpired()
-    {
+    public boolean isAccountNonExpired() {
         return true;
     }
 
     /**
      * 指定用户是否解锁,锁定的用户无法进行身份验证
-     * 
+     *
      * @return
      */
     @JSONField(serialize = false)
     @Override
-    public boolean isAccountNonLocked()
-    {
+    public boolean isAccountNonLocked() {
         return true;
     }
 
     /**
      * 指示是否已过期的用户的凭据(密码),过期的凭据防止认证
-     * 
+     *
      * @return
      */
     @JSONField(serialize = false)
     @Override
-    public boolean isCredentialsNonExpired()
-    {
+    public boolean isCredentialsNonExpired() {
         return true;
     }
 
     /**
      * 是否可用 ,禁用的用户不能身份验证
-     * 
+     *
      * @return
      */
     @JSONField(serialize = false)
     @Override
-    public boolean isEnabled()
-    {
+    public boolean isEnabled() {
         return true;
     }
 
-    public Long getLoginTime()
-    {
+    public Long getLoginTime() {
         return loginTime;
     }
 
-    public void setLoginTime(Long loginTime)
-    {
+    public void setLoginTime(Long loginTime) {
         this.loginTime = loginTime;
     }
 
-    public String getIpaddr()
-    {
+    public String getIpaddr() {
         return ipaddr;
     }
 
-    public void setIpaddr(String ipaddr)
-    {
+    public void setIpaddr(String ipaddr) {
         this.ipaddr = ipaddr;
     }
 
-    public String getLoginLocation()
-    {
+    public String getLoginLocation() {
         return loginLocation;
     }
 
-    public void setLoginLocation(String loginLocation)
-    {
+    public void setLoginLocation(String loginLocation) {
         this.loginLocation = loginLocation;
     }
 
-    public String getBrowser()
-    {
+    public String getBrowser() {
         return browser;
     }
 
-    public void setBrowser(String browser)
-    {
+    public void setBrowser(String browser) {
         this.browser = browser;
     }
 
-    public String getOs()
-    {
+    public String getOs() {
         return os;
     }
 
-    public void setOs(String os)
-    {
+    public void setOs(String os) {
         this.os = os;
     }
 
-    public Long getExpireTime()
-    {
+    public Long getExpireTime() {
         return expireTime;
     }
 
-    public void setExpireTime(Long expireTime)
-    {
+    public void setExpireTime(Long expireTime) {
         this.expireTime = expireTime;
     }
 
-    public Set<String> getPermissions()
-    {
+    public Set<String> getPermissions() {
         return permissions;
     }
 
-    public void setPermissions(Set<String> permissions)
-    {
+    public void setPermissions(Set<String> permissions) {
         this.permissions = permissions;
     }
 
-    public SysUser getUser()
-    {
+    public SysUser getUser() {
         return user;
     }
 
-    public void setUser(SysUser user)
-    {
+    public void setUser(SysUser user) {
         this.user = user;
     }
 
     @Override
-    public Collection<? extends GrantedAuthority> getAuthorities()
-    {
+    public Collection<? extends GrantedAuthority> getAuthorities() {
         return null;
     }
 }

+ 4 - 1
common-application/ruoyi-framework/pom.xml

@@ -52,7 +52,10 @@
             <groupId>com.github.oshi</groupId>
             <artifactId>oshi-core</artifactId>
         </dependency>
-
+        <dependency>
+            <groupId>com.github.jsqlparser</groupId>
+            <artifactId>jsqlparser</artifactId>
+        </dependency>
         <!-- 系统模块-->
         <dependency>
             <groupId>com.huashe.application</groupId>

+ 17 - 16
common-application/ruoyi-framework/src/main/java/com/ruoyi/framework/security/filter/JwtAuthenticationTokenFilter.java

@@ -1,40 +1,41 @@
 package com.ruoyi.framework.security.filter;
 
-import java.io.IOException;
-import javax.servlet.FilterChain;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
 import com.huashe.common.utils.StringUtils;
+import com.ruoyi.common.core.domain.model.LoginUser;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.framework.web.service.TokenService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
 import org.springframework.security.core.context.SecurityContextHolder;
 import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
 import org.springframework.stereotype.Component;
 import org.springframework.web.filter.OncePerRequestFilter;
-import com.ruoyi.common.core.domain.model.LoginUser;
-import com.ruoyi.common.utils.SecurityUtils;
-import com.ruoyi.framework.web.service.TokenService;
+
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
 
 /**
  * token过滤器 验证token有效性
- * 
+ *
  * @author ruoyi
  */
 @Component
-public class JwtAuthenticationTokenFilter extends OncePerRequestFilter
-{
+public class JwtAuthenticationTokenFilter extends OncePerRequestFilter {
     @Autowired
     private TokenService tokenService;
 
     @Override
     protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
-            throws ServletException, IOException
-    {
+            throws ServletException, IOException {
         LoginUser loginUser = tokenService.getLoginUser(request);
-        if (StringUtils.isNotNull(loginUser) && StringUtils.isNull(SecurityUtils.getAuthentication()))
-        {
+        if (StringUtils.isNotNull(loginUser) && StringUtils.isNull(SecurityUtils.getAuthentication())) {
+            String tenantId = request.getHeader("X-Tenant");
+            if (!StringUtils.isEmpty(tenantId)) {
+                loginUser.getUser().setTenantId(Long.parseLong(tenantId));
+            }
             tokenService.verifyToken(loginUser);
             UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(loginUser, null, loginUser.getAuthorities());
             authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));

+ 14 - 16
common-application/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java

@@ -6,6 +6,8 @@ import com.huashe.common.utils.StringUtils;
 import com.ruoyi.common.core.domain.entity.SysUser;
 import com.ruoyi.common.core.domain.model.LoginUser;
 import com.ruoyi.common.utils.MessageUtils;
+import com.ruoyi.system.domain.SysTenant;
+import com.ruoyi.system.service.ISysTenantService;
 import com.ruoyi.system.service.ISysUserService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -21,46 +23,42 @@ import org.springframework.stereotype.Service;
  * @author ruoyi
  */
 @Service
-public class UserDetailsServiceImpl implements UserDetailsService
-{
+public class UserDetailsServiceImpl implements UserDetailsService {
     private static final Logger log = LoggerFactory.getLogger(UserDetailsServiceImpl.class);
 
     @Autowired
     private ISysUserService userService;
-    
+
     @Autowired
     private SysPasswordService passwordService;
 
     @Autowired
     private SysPermissionService permissionService;
 
+    @Autowired
+    private ISysTenantService sysTenantService;
+
     @Override
-    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException
-    {
+    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
         SysUser user = userService.selectUserByUserName(username);
-        if (StringUtils.isNull(user))
-        {
+        if (StringUtils.isNull(user)) {
             log.info("登录用户:{} 不存在.", username);
             throw new ServiceException(MessageUtils.message("user.not.exists"));
-        }
-        else if (UserStatus.DELETED.getCode().equals(user.getDelFlag()))
-        {
+        } else if (UserStatus.DELETED.getCode().equals(user.getDelFlag())) {
             log.info("登录用户:{} 已被删除.", username);
             throw new ServiceException(MessageUtils.message("user.password.delete"));
-        }
-        else if (UserStatus.DISABLE.getCode().equals(user.getStatus()))
-        {
+        } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) {
             log.info("登录用户:{} 已被停用.", username);
             throw new ServiceException(MessageUtils.message("user.blocked"));
         }
 
         passwordService.validate(user);
-
+        SysTenant sysTenant = sysTenantService.selectTenantByUsrId(user.getUserId());
+        user.setTenantId(sysTenant.getId());
         return createLoginUser(user);
     }
 
-    public UserDetails createLoginUser(SysUser user)
-    {
+    public UserDetails createLoginUser(SysUser user) {
         return new LoginUser(user.getUserId(), user.getDeptId(), user, permissionService.getMenuPermission(user));
     }
 }

+ 12 - 10
common-application/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableColumnMapper.java

@@ -1,18 +1,20 @@
 package com.ruoyi.generator.mapper;
 
-import java.util.List;
+import com.huashe.common.annotation.mybatis.IgnoreTenant;
 import com.ruoyi.generator.domain.GenTableColumn;
 
+import java.util.List;
+
 /**
  * 业务字段 数据层
- * 
+ *
  * @author ruoyi
  */
-public interface GenTableColumnMapper
-{
+@IgnoreTenant
+public interface GenTableColumnMapper {
     /**
      * 根据表名称查询列信息
-     * 
+     *
      * @param tableName 表名称
      * @return 列信息
      */
@@ -20,7 +22,7 @@ public interface GenTableColumnMapper
 
     /**
      * 查询业务字段列表
-     * 
+     *
      * @param tableId 业务字段编号
      * @return 业务字段集合
      */
@@ -28,7 +30,7 @@ public interface GenTableColumnMapper
 
     /**
      * 新增业务字段
-     * 
+     *
      * @param genTableColumn 业务字段信息
      * @return 结果
      */
@@ -36,7 +38,7 @@ public interface GenTableColumnMapper
 
     /**
      * 修改业务字段
-     * 
+     *
      * @param genTableColumn 业务字段信息
      * @return 结果
      */
@@ -44,7 +46,7 @@ public interface GenTableColumnMapper
 
     /**
      * 删除业务字段
-     * 
+     *
      * @param genTableColumns 列数据
      * @return 结果
      */
@@ -52,7 +54,7 @@ public interface GenTableColumnMapper
 
     /**
      * 批量删除业务字段
-     * 
+     *
      * @param ids 需要删除的数据ID
      * @return 结果
      */

+ 3 - 0
common-application/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableMapper.java

@@ -1,6 +1,8 @@
 package com.ruoyi.generator.mapper;
 
 import java.util.List;
+
+import com.huashe.common.annotation.mybatis.IgnoreTenant;
 import com.ruoyi.generator.domain.GenTable;
 
 /**
@@ -8,6 +10,7 @@ import com.ruoyi.generator.domain.GenTable;
  * 
  * @author ruoyi
  */
+@IgnoreTenant
 public interface GenTableMapper
 {
     /**

+ 69 - 0
common-application/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysTenant.java

@@ -0,0 +1,69 @@
+package com.ruoyi.system.domain;
+
+import java.util.Date;
+
+public class SysTenant {
+    private Long id;
+    private String tenantName;
+    private String tenantCode;
+    private Date updateTime;
+    private Date createTime;
+    private String createBy;
+    private String updateBy;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getTenantName() {
+        return tenantName;
+    }
+
+    public void setTenantName(String tenantName) {
+        this.tenantName = tenantName;
+    }
+
+    public String getTenantCode() {
+        return tenantCode;
+    }
+
+    public void setTenantCode(String tenantCode) {
+        this.tenantCode = tenantCode;
+    }
+
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public String getCreateBy() {
+        return createBy;
+    }
+
+    public void setCreateBy(String createBy) {
+        this.createBy = createBy;
+    }
+
+    public String getUpdateBy() {
+        return updateBy;
+    }
+
+    public void setUpdateBy(String updateBy) {
+        this.updateBy = updateBy;
+    }
+}

+ 36 - 0
common-application/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysTenantUsrRel.java

@@ -0,0 +1,36 @@
+package com.ruoyi.system.domain;
+
+
+import com.huashe.common.annotation.mybatis.TenantField;
+
+public class SysTenantUsrRel {
+    private Long id;
+    @TenantField
+    private Long tenantId;
+
+    private Long usrId;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(Long tenantId) {
+        this.tenantId = tenantId;
+    }
+
+    public Long getUsrId() {
+        return usrId;
+    }
+
+    public void setUsrId(Long usrId) {
+        this.usrId = usrId;
+    }
+}

+ 4 - 1
common-application/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysConfigMapper.java

@@ -1,6 +1,8 @@
 package com.ruoyi.system.mapper;
 
 import java.util.List;
+
+import com.huashe.common.annotation.mybatis.IgnoreTenant;
 import com.ruoyi.system.domain.SysConfig;
 
 /**
@@ -8,6 +10,7 @@ import com.ruoyi.system.domain.SysConfig;
  * 
  * @author ruoyi
  */
+@IgnoreTenant
 public interface SysConfigMapper
 {
     /**
@@ -40,7 +43,7 @@ public interface SysConfigMapper
      * @param configKey 参数键名
      * @return 参数配置信息
      */
-    public SysConfig checkConfigKeyUnique(String configKey);
+    public SysConfig checkConfigKeyUnique(SysConfig configKey);
 
     /**
      * 新增参数配置

+ 3 - 0
common-application/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java

@@ -1,6 +1,8 @@
 package com.ruoyi.system.mapper;
 
 import java.util.List;
+
+import com.huashe.common.annotation.mybatis.IgnoreTenant;
 import org.apache.ibatis.annotations.Param;
 import com.ruoyi.common.core.domain.entity.SysDept;
 
@@ -9,6 +11,7 @@ import com.ruoyi.common.core.domain.entity.SysDept;
  * 
  * @author ruoyi
  */
+@IgnoreTenant
 public interface SysDeptMapper
 {
     /**

+ 3 - 0
common-application/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDictDataMapper.java

@@ -1,6 +1,8 @@
 package com.ruoyi.system.mapper;
 
 import java.util.List;
+
+import com.huashe.common.annotation.mybatis.IgnoreTenant;
 import org.apache.ibatis.annotations.Param;
 import com.ruoyi.common.core.domain.entity.SysDictData;
 
@@ -9,6 +11,7 @@ import com.ruoyi.common.core.domain.entity.SysDictData;
  * 
  * @author ruoyi
  */
+@IgnoreTenant
 public interface SysDictDataMapper
 {
     /**

+ 3 - 0
common-application/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDictTypeMapper.java

@@ -1,6 +1,8 @@
 package com.ruoyi.system.mapper;
 
 import java.util.List;
+
+import com.huashe.common.annotation.mybatis.IgnoreTenant;
 import com.ruoyi.common.core.domain.entity.SysDictType;
 
 /**
@@ -8,6 +10,7 @@ import com.ruoyi.common.core.domain.entity.SysDictType;
  * 
  * @author ruoyi
  */
+@IgnoreTenant
 public interface SysDictTypeMapper
 {
     /**

+ 3 - 0
common-application/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysLogininforMapper.java

@@ -1,6 +1,8 @@
 package com.ruoyi.system.mapper;
 
 import java.util.List;
+
+import com.huashe.common.annotation.mybatis.IgnoreTenant;
 import com.ruoyi.system.domain.SysLogininfor;
 
 /**
@@ -8,6 +10,7 @@ import com.ruoyi.system.domain.SysLogininfor;
  * 
  * @author ruoyi
  */
+@IgnoreTenant
 public interface SysLogininforMapper
 {
     /**

+ 3 - 0
common-application/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysMenuMapper.java

@@ -1,6 +1,8 @@
 package com.ruoyi.system.mapper;
 
 import java.util.List;
+
+import com.huashe.common.annotation.mybatis.IgnoreTenant;
 import org.apache.ibatis.annotations.Param;
 import com.ruoyi.common.core.domain.entity.SysMenu;
 
@@ -9,6 +11,7 @@ import com.ruoyi.common.core.domain.entity.SysMenu;
  *
  * @author ruoyi
  */
+@IgnoreTenant
 public interface SysMenuMapper
 {
     /**

+ 3 - 0
common-application/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysNoticeMapper.java

@@ -1,6 +1,8 @@
 package com.ruoyi.system.mapper;
 
 import java.util.List;
+
+import com.huashe.common.annotation.mybatis.IgnoreTenant;
 import com.ruoyi.system.domain.SysNotice;
 
 /**
@@ -8,6 +10,7 @@ import com.ruoyi.system.domain.SysNotice;
  * 
  * @author ruoyi
  */
+@IgnoreTenant
 public interface SysNoticeMapper
 {
     /**

+ 3 - 0
common-application/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysOperLogMapper.java

@@ -1,6 +1,8 @@
 package com.ruoyi.system.mapper;
 
 import java.util.List;
+
+import com.huashe.common.annotation.mybatis.IgnoreTenant;
 import com.ruoyi.system.domain.SysOperLog;
 
 /**
@@ -8,6 +10,7 @@ import com.ruoyi.system.domain.SysOperLog;
  * 
  * @author ruoyi
  */
+@IgnoreTenant
 public interface SysOperLogMapper
 {
     /**

+ 3 - 0
common-application/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysPostMapper.java

@@ -1,6 +1,8 @@
 package com.ruoyi.system.mapper;
 
 import java.util.List;
+
+import com.huashe.common.annotation.mybatis.IgnoreTenant;
 import com.ruoyi.system.domain.SysPost;
 
 /**
@@ -8,6 +10,7 @@ import com.ruoyi.system.domain.SysPost;
  * 
  * @author ruoyi
  */
+@IgnoreTenant
 public interface SysPostMapper
 {
     /**

+ 3 - 0
common-application/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleDeptMapper.java

@@ -1,6 +1,8 @@
 package com.ruoyi.system.mapper;
 
 import java.util.List;
+
+import com.huashe.common.annotation.mybatis.IgnoreTenant;
 import com.ruoyi.system.domain.SysRoleDept;
 
 /**
@@ -8,6 +10,7 @@ import com.ruoyi.system.domain.SysRoleDept;
  * 
  * @author ruoyi
  */
+@IgnoreTenant
 public interface SysRoleDeptMapper
 {
     /**

+ 3 - 0
common-application/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMapper.java

@@ -1,6 +1,8 @@
 package com.ruoyi.system.mapper;
 
 import java.util.List;
+
+import com.huashe.common.annotation.mybatis.IgnoreTenant;
 import com.ruoyi.common.core.domain.entity.SysRole;
 
 /**
@@ -8,6 +10,7 @@ import com.ruoyi.common.core.domain.entity.SysRole;
  * 
  * @author ruoyi
  */
+@IgnoreTenant
 public interface SysRoleMapper
 {
     /**

+ 3 - 0
common-application/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMenuMapper.java

@@ -1,6 +1,8 @@
 package com.ruoyi.system.mapper;
 
 import java.util.List;
+
+import com.huashe.common.annotation.mybatis.IgnoreTenant;
 import com.ruoyi.system.domain.SysRoleMenu;
 
 /**
@@ -8,6 +10,7 @@ import com.ruoyi.system.domain.SysRoleMenu;
  * 
  * @author ruoyi
  */
+@IgnoreTenant
 public interface SysRoleMenuMapper
 {
     /**

+ 40 - 0
common-application/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysTenantMapper.java

@@ -0,0 +1,40 @@
+package com.ruoyi.system.mapper;
+
+import com.huashe.common.annotation.mybatis.IgnoreTenant;
+import com.ruoyi.system.domain.SysTenant;
+
+import java.util.List;
+
+/**
+ * 用户表 数据层
+ *
+ * @author ruoyi
+ */
+
+@IgnoreTenant
+public interface SysTenantMapper {
+
+    List<SysTenant> selectTenantList(SysTenant sysTenant);
+
+    SysTenant selectTenantById(Long id);
+
+    int insertTenant(SysTenant sysTenant);
+
+    int updateTenant(SysTenant sysTenant);
+
+    /**
+     * 删除租户
+     *
+     * @param id 租户主键
+     * @return 结果
+     */
+    public int deleteSysTenantById(Long id);
+
+    /**
+     * 批量删除租户
+     *
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteSysTenantByIds(Long[] ids);
+}

+ 26 - 0
common-application/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysTenantUsrRelMapper.java

@@ -0,0 +1,26 @@
+package com.ruoyi.system.mapper;
+
+import com.huashe.common.annotation.mybatis.IgnoreTenant;
+import com.ruoyi.system.domain.SysTenantUsrRel;
+
+import java.util.List;
+
+/**
+ * 用户表 数据层
+ *
+ * @author ruoyi
+ */
+@IgnoreTenant
+public interface SysTenantUsrRelMapper {
+
+    List<SysTenantUsrRel> selectTenantUsrRelList(SysTenantUsrRel sysTenantUsrRel);
+
+    SysTenantUsrRel selectTenantUsrByUsrId(Long usrId);
+
+    int insertTenantUsrRel(SysTenantUsrRel sysTenantUsrRel);
+
+    int deleteTenantUsrRelByUsrId(Long usrId);
+
+    int deleteTenantUsrRelByUsrIds(Long[] tenantId);
+
+}

+ 3 - 0
common-application/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java

@@ -1,6 +1,8 @@
 package com.ruoyi.system.mapper;
 
 import java.util.List;
+
+import com.huashe.common.annotation.mybatis.IgnoreTenant;
 import org.apache.ibatis.annotations.Param;
 import com.ruoyi.common.core.domain.entity.SysUser;
 
@@ -9,6 +11,7 @@ import com.ruoyi.common.core.domain.entity.SysUser;
  * 
  * @author ruoyi
  */
+@IgnoreTenant
 public interface SysUserMapper
 {
     /**

+ 3 - 0
common-application/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserPostMapper.java

@@ -1,6 +1,8 @@
 package com.ruoyi.system.mapper;
 
 import java.util.List;
+
+import com.huashe.common.annotation.mybatis.IgnoreTenant;
 import com.ruoyi.system.domain.SysUserPost;
 
 /**
@@ -8,6 +10,7 @@ import com.ruoyi.system.domain.SysUserPost;
  * 
  * @author ruoyi
  */
+@IgnoreTenant
 public interface SysUserPostMapper
 {
     /**

+ 3 - 0
common-application/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserRoleMapper.java

@@ -1,6 +1,8 @@
 package com.ruoyi.system.mapper;
 
 import java.util.List;
+
+import com.huashe.common.annotation.mybatis.IgnoreTenant;
 import org.apache.ibatis.annotations.Param;
 import com.ruoyi.system.domain.SysUserRole;
 
@@ -9,6 +11,7 @@ import com.ruoyi.system.domain.SysUserRole;
  * 
  * @author ruoyi
  */
+@IgnoreTenant
 public interface SysUserRoleMapper
 {
     /**

+ 34 - 0
common-application/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysTenantService.java

@@ -0,0 +1,34 @@
+package com.ruoyi.system.service;
+
+import com.ruoyi.system.domain.SysTenant;
+
+import java.util.List;
+
+/**
+ * 用户 业务层
+ *
+ * @author ruoyi
+ */
+public interface ISysTenantService {
+    List<SysTenant> selectTenantList(SysTenant sysTenant);
+
+    SysTenant selectTenantById(Long id);
+
+    int insertTenant(SysTenant sysTenant);
+
+    int updateTenant(SysTenant sysTenant);
+
+    int deleteSysTenantByIds(Long[] ids);
+
+    int deleteSysTenantById(Long id);
+
+    int deleteSysTenantUsrByUsrId(Long usrId);
+
+    int deleteSysTenantUsrByUsrIds(Long[] usrIds);
+
+    void addUsrTenant(Long userId);
+
+    SysTenant selectTenantByUsrId(Long usrId);
+
+
+}

+ 54 - 70
common-application/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java

@@ -1,9 +1,5 @@
 package com.ruoyi.system.service.impl;
 
-import java.util.Collection;
-import java.util.List;
-import javax.annotation.PostConstruct;
-
 import com.huashe.common.annotation.DataSource;
 import com.huashe.common.constant.CacheConstants;
 import com.huashe.common.constant.UserConstants;
@@ -11,21 +7,25 @@ import com.huashe.common.enums.DataSourceType;
 import com.huashe.common.exception.ServiceException;
 import com.huashe.common.text.Convert;
 import com.huashe.common.utils.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
 import com.ruoyi.common.core.redis.RedisCache;
 import com.ruoyi.system.domain.SysConfig;
 import com.ruoyi.system.mapper.SysConfigMapper;
 import com.ruoyi.system.service.ISysConfigService;
+import org.apache.commons.lang3.ObjectUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.PostConstruct;
+import java.util.Collection;
+import java.util.List;
 
 /**
  * 参数配置 服务层实现
- * 
+ *
  * @author ruoyi
  */
 @Service
-public class SysConfigServiceImpl implements ISysConfigService
-{
+public class SysConfigServiceImpl implements ISysConfigService {
     @Autowired
     private SysConfigMapper configMapper;
 
@@ -36,45 +36,40 @@ public class SysConfigServiceImpl implements ISysConfigService
      * 项目启动时,初始化参数到缓存
      */
     @PostConstruct
-    public void init()
-    {
+    public void init() {
         loadingConfigCache();
     }
 
     /**
      * 查询参数配置信息
-     * 
+     *
      * @param configId 参数配置ID
      * @return 参数配置信息
      */
     @Override
     @DataSource(DataSourceType.MASTER)
-    public SysConfig selectConfigById(Long configId)
-    {
+    public SysConfig selectConfigById(Long configId) {
         SysConfig config = new SysConfig();
         config.setConfigId(configId);
         return configMapper.selectConfig(config);
     }
 
     /**
-     * 根据键名查询参数配置信息
-     * 
+     * 根据键名查询参数配置信息,如果是租户的配置,需要在key上追加租户ID 【key:[tenantId]】
+     *
      * @param configKey 参数key
      * @return 参数键值
      */
     @Override
-    public String selectConfigByKey(String configKey)
-    {
+    public String selectConfigByKey(String configKey) {
         String configValue = Convert.toStr(redisCache.getCacheObject(getCacheKey(configKey)));
-        if (StringUtils.isNotEmpty(configValue))
-        {
+        if (StringUtils.isNotEmpty(configValue)) {
             return configValue;
         }
         SysConfig config = new SysConfig();
         config.setConfigKey(configKey);
         SysConfig retConfig = configMapper.selectConfig(config);
-        if (StringUtils.isNotNull(retConfig))
-        {
+        if (StringUtils.isNotNull(retConfig)) {
             redisCache.setCacheObject(getCacheKey(configKey), retConfig.getConfigValue());
             return retConfig.getConfigValue();
         }
@@ -83,15 +78,13 @@ public class SysConfigServiceImpl implements ISysConfigService
 
     /**
      * 获取验证码开关
-     * 
+     *
      * @return true开启,false关闭
      */
     @Override
-    public boolean selectCaptchaEnabled()
-    {
+    public boolean selectCaptchaEnabled() {
         String captchaEnabled = selectConfigByKey("sys.account.captchaEnabled");
-        if (StringUtils.isEmpty(captchaEnabled))
-        {
+        if (StringUtils.isEmpty(captchaEnabled)) {
             return true;
         }
         return Convert.toBool(captchaEnabled);
@@ -99,69 +92,60 @@ public class SysConfigServiceImpl implements ISysConfigService
 
     /**
      * 查询参数配置列表
-     * 
+     *
      * @param config 参数配置信息
      * @return 参数配置集合
      */
     @Override
-    public List<SysConfig> selectConfigList(SysConfig config)
-    {
+    public List<SysConfig> selectConfigList(SysConfig config) {
         return configMapper.selectConfigList(config);
     }
 
     /**
      * 新增参数配置
-     * 
+     *
      * @param config 参数配置信息
      * @return 结果
      */
     @Override
-    public int insertConfig(SysConfig config)
-    {
+    public int insertConfig(SysConfig config) {
         int row = configMapper.insertConfig(config);
-        if (row > 0)
-        {
-            redisCache.setCacheObject(getCacheKey(config.getConfigKey()), config.getConfigValue());
+        if (row > 0) {
+            redisCache.setCacheObject(getCacheKey(config), config.getConfigValue());
         }
         return row;
     }
 
     /**
      * 修改参数配置
-     * 
+     *
      * @param config 参数配置信息
      * @return 结果
      */
     @Override
-    public int updateConfig(SysConfig config)
-    {
+    public int updateConfig(SysConfig config) {
         SysConfig temp = configMapper.selectConfigById(config.getConfigId());
-        if (!StringUtils.equals(temp.getConfigKey(), config.getConfigKey()))
-        {
-            redisCache.deleteObject(getCacheKey(temp.getConfigKey()));
+        if (!StringUtils.equals(temp.getConfigKey(), config.getConfigKey())) {
+            redisCache.deleteObject(getCacheKey(temp));
         }
 
         int row = configMapper.updateConfig(config);
-        if (row > 0)
-        {
-            redisCache.setCacheObject(getCacheKey(config.getConfigKey()), config.getConfigValue());
+        if (row > 0) {
+            redisCache.setCacheObject(getCacheKey(config), config.getConfigValue());
         }
         return row;
     }
 
     /**
      * 批量删除参数信息
-     * 
+     *
      * @param configIds 需要删除的参数ID
      */
     @Override
-    public void deleteConfigByIds(Long[] configIds)
-    {
-        for (Long configId : configIds)
-        {
+    public void deleteConfigByIds(Long[] configIds) {
+        for (Long configId : configIds) {
             SysConfig config = selectConfigById(configId);
-            if (StringUtils.equals(UserConstants.YES, config.getConfigType()))
-            {
+            if (StringUtils.equals(UserConstants.YES, config.getConfigType())) {
                 throw new ServiceException(String.format("内置参数【%1$s】不能删除 ", config.getConfigKey()));
             }
             configMapper.deleteConfigById(configId);
@@ -173,12 +157,10 @@ public class SysConfigServiceImpl implements ISysConfigService
      * 加载参数缓存数据
      */
     @Override
-    public void loadingConfigCache()
-    {
+    public void loadingConfigCache() {
         List<SysConfig> configsList = configMapper.selectConfigList(new SysConfig());
-        for (SysConfig config : configsList)
-        {
-            redisCache.setCacheObject(getCacheKey(config.getConfigKey()), config.getConfigValue());
+        for (SysConfig config : configsList) {
+            redisCache.setCacheObject(getCacheKey(config), config.getConfigValue());
         }
     }
 
@@ -186,8 +168,7 @@ public class SysConfigServiceImpl implements ISysConfigService
      * 清空参数缓存数据
      */
     @Override
-    public void clearConfigCache()
-    {
+    public void clearConfigCache() {
         Collection<String> keys = redisCache.keys(CacheConstants.SYS_CONFIG_KEY + "*");
         redisCache.deleteObject(keys);
     }
@@ -196,25 +177,22 @@ public class SysConfigServiceImpl implements ISysConfigService
      * 重置参数缓存数据
      */
     @Override
-    public void resetConfigCache()
-    {
+    public void resetConfigCache() {
         clearConfigCache();
         loadingConfigCache();
     }
 
     /**
      * 校验参数键名是否唯一
-     * 
+     *
      * @param config 参数配置信息
      * @return 结果
      */
     @Override
-    public boolean checkConfigKeyUnique(SysConfig config)
-    {
+    public boolean checkConfigKeyUnique(SysConfig config) {
         Long configId = StringUtils.isNull(config.getConfigId()) ? -1L : config.getConfigId();
-        SysConfig info = configMapper.checkConfigKeyUnique(config.getConfigKey());
-        if (StringUtils.isNotNull(info) && info.getConfigId().longValue() != configId.longValue())
-        {
+        SysConfig info = configMapper.checkConfigKeyUnique(config);
+        if (StringUtils.isNotNull(info) && info.getConfigId().longValue() != configId.longValue()) {
             return UserConstants.NOT_UNIQUE;
         }
         return UserConstants.UNIQUE;
@@ -222,12 +200,18 @@ public class SysConfigServiceImpl implements ISysConfigService
 
     /**
      * 设置cache key
-     * 
+     *
      * @param configKey 参数键
      * @return 缓存键key
      */
-    private String getCacheKey(String configKey)
-    {
+    private String getCacheKey(String configKey) {
         return CacheConstants.SYS_CONFIG_KEY + configKey;
     }
+
+    private String getCacheKey(SysConfig configKey) {
+        if (!ObjectUtils.isEmpty(configKey.getTenantId())) {
+            return CacheConstants.SYS_CONFIG_KEY + configKey.getConfigKey() + ":" + configKey.getTenantId();
+        }
+        return CacheConstants.SYS_CONFIG_KEY + configKey.getConfigKey();
+    }
 }

+ 63 - 0
common-application/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTenantDefServiceImpl.java

@@ -0,0 +1,63 @@
+package com.ruoyi.system.service.impl;
+
+import com.ruoyi.system.domain.SysTenant;
+import com.ruoyi.system.service.ISysTenantService;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+@ConditionalOnMissingBean(name = "sysTenantServiceImpl")
+public class SysTenantDefServiceImpl implements ISysTenantService {
+    @Override
+    public List<SysTenant> selectTenantList(SysTenant sysTenant) {
+        return new ArrayList<>();
+    }
+
+    @Override
+    public SysTenant selectTenantById(Long id) {
+        return new SysTenant();
+    }
+
+    @Override
+    public int insertTenant(SysTenant sysTenant) {
+        return 0;
+    }
+
+    @Override
+    public int updateTenant(SysTenant sysTenant) {
+        return 0;
+    }
+
+    @Override
+    public void addUsrTenant(Long userId) {
+
+    }
+
+    @Override
+    public int deleteSysTenantUsrByUsrId(Long usrId) {
+        return 0;
+    }
+
+    @Override
+    public int deleteSysTenantUsrByUsrIds(Long[] usrIds) {
+        return 0;
+    }
+
+    @Override
+    public SysTenant selectTenantByUsrId(Long usrId) {
+        return new SysTenant();
+    }
+
+    @Override
+    public int deleteSysTenantByIds(Long[] ids) {
+        return 0;
+    }
+
+    @Override
+    public int deleteSysTenantById(Long id) {
+        return 0;
+    }
+}

+ 95 - 0
common-application/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTenantServiceImpl.java

@@ -0,0 +1,95 @@
+package com.ruoyi.system.service.impl;
+
+import com.ruoyi.system.domain.SysTenant;
+import com.ruoyi.system.domain.SysTenantUsrRel;
+import com.ruoyi.system.mapper.SysTenantMapper;
+import com.ruoyi.system.mapper.SysTenantUsrRelMapper;
+import com.ruoyi.system.service.ISysTenantService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.ObjectUtils;
+
+import java.util.List;
+
+@Service("sysTenantServiceImpl")
+@ConditionalOnProperty(prefix = "ruoyi.tenant", name = "enable", havingValue = "true")
+public class SysTenantServiceImpl implements ISysTenantService {
+
+    @Autowired
+    private SysTenantMapper sysTenantMapper;
+
+    @Autowired
+    private SysTenantUsrRelMapper sysTenantUsrRelMapper;
+
+    @Override
+    public List<SysTenant> selectTenantList(SysTenant sysTenant) {
+        return sysTenantMapper.selectTenantList(sysTenant);
+    }
+
+    @Override
+    public SysTenant selectTenantById(Long id) {
+        return sysTenantMapper.selectTenantById(id);
+    }
+
+    @Override
+    public int insertTenant(SysTenant sysTenant) {
+        return sysTenantMapper.insertTenant(sysTenant);
+    }
+
+    @Override
+    public int updateTenant(SysTenant sysTenant) {
+        return sysTenantMapper.updateTenant(sysTenant);
+    }
+
+    /**
+     * 批量删除租户
+     *
+     * @param ids 需要删除的租户主键
+     * @return 结果
+     */
+    @Override
+    public int deleteSysTenantByIds(Long[] ids) {
+        return sysTenantMapper.deleteSysTenantByIds(ids);
+    }
+
+    /**
+     * 删除租户信息
+     *
+     * @param id 租户主键
+     * @return 结果
+     */
+    @Override
+    public int deleteSysTenantById(Long id) {
+        return sysTenantMapper.deleteSysTenantById(id);
+    }
+
+    @Override
+    public int deleteSysTenantUsrByUsrId(Long usrId) {
+        return sysTenantUsrRelMapper.deleteTenantUsrRelByUsrId(usrId);
+    }
+
+    @Override
+    public int deleteSysTenantUsrByUsrIds(Long[] usrIds) {
+        return sysTenantUsrRelMapper.deleteTenantUsrRelByUsrIds(usrIds);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void addUsrTenant(Long userId) {
+        sysTenantUsrRelMapper.deleteTenantUsrRelByUsrId(userId);
+        sysTenantUsrRelMapper.insertTenantUsrRel(new SysTenantUsrRel() {{
+            setUsrId(userId);
+        }});
+    }
+
+    @Override
+    public SysTenant selectTenantByUsrId(Long usrId) {
+        SysTenantUsrRel sysTenantUsrRel = sysTenantUsrRelMapper.selectTenantUsrByUsrId(usrId);
+        if (ObjectUtils.isEmpty(sysTenantUsrRel)) {
+            return new SysTenant();
+        }
+        return sysTenantMapper.selectTenantById(sysTenantUsrRel.getTenantId());
+    }
+}

+ 106 - 147
common-application/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java

@@ -1,25 +1,14 @@
 package com.ruoyi.system.service.impl;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.stream.Collectors;
-import javax.validation.Validator;
-
 import com.huashe.common.constant.UserConstants;
 import com.huashe.common.exception.ServiceException;
 import com.huashe.common.utils.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.CollectionUtils;
 import com.ruoyi.common.annotation.DataScope;
 import com.ruoyi.common.core.domain.entity.SysRole;
 import com.ruoyi.common.core.domain.entity.SysUser;
 import com.ruoyi.common.utils.SecurityUtils;
-import com.ruoyi.common.utils.bean.BeanValidators;
 import com.ruoyi.common.utils.SpringUtils;
+import com.ruoyi.common.utils.bean.BeanValidators;
 import com.ruoyi.system.domain.SysPost;
 import com.ruoyi.system.domain.SysUserPost;
 import com.ruoyi.system.domain.SysUserRole;
@@ -30,16 +19,27 @@ import com.ruoyi.system.mapper.SysUserPostMapper;
 import com.ruoyi.system.mapper.SysUserRoleMapper;
 import com.ruoyi.system.service.ISysConfigService;
 import com.ruoyi.system.service.ISysDeptService;
+import com.ruoyi.system.service.ISysTenantService;
 import com.ruoyi.system.service.ISysUserService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
+import javax.validation.Validator;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * 用户 业务层处理
- * 
+ *
  * @author ruoyi
  */
 @Service
-public class SysUserServiceImpl implements ISysUserService
-{
+public class SysUserServiceImpl implements ISysUserService {
     private static final Logger log = LoggerFactory.getLogger(SysUserServiceImpl.class);
 
     @Autowired
@@ -66,81 +66,77 @@ public class SysUserServiceImpl implements ISysUserService
     @Autowired
     protected Validator validator;
 
+    @Autowired
+    private ISysTenantService sysTenantService;
+
     /**
      * 根据条件分页查询用户列表
-     * 
+     *
      * @param user 用户信息
      * @return 用户信息集合信息
      */
     @Override
     @DataScope(deptAlias = "d", userAlias = "u")
-    public List<SysUser> selectUserList(SysUser user)
-    {
+    public List<SysUser> selectUserList(SysUser user) {
         return userMapper.selectUserList(user);
     }
 
     /**
      * 根据条件分页查询已分配用户角色列表
-     * 
+     *
      * @param user 用户信息
      * @return 用户信息集合信息
      */
     @Override
     @DataScope(deptAlias = "d", userAlias = "u")
-    public List<SysUser> selectAllocatedList(SysUser user)
-    {
+    public List<SysUser> selectAllocatedList(SysUser user) {
         return userMapper.selectAllocatedList(user);
     }
 
     /**
      * 根据条件分页查询未分配用户角色列表
-     * 
+     *
      * @param user 用户信息
      * @return 用户信息集合信息
      */
     @Override
     @DataScope(deptAlias = "d", userAlias = "u")
-    public List<SysUser> selectUnallocatedList(SysUser user)
-    {
+    public List<SysUser> selectUnallocatedList(SysUser user) {
         return userMapper.selectUnallocatedList(user);
     }
 
     /**
      * 通过用户名查询用户
-     * 
+     *
      * @param userName 用户名
      * @return 用户对象信息
      */
     @Override
-    public SysUser selectUserByUserName(String userName)
-    {
+    public SysUser selectUserByUserName(String userName) {
         return userMapper.selectUserByUserName(userName);
     }
 
     /**
      * 通过用户ID查询用户
-     * 
+     *
      * @param userId 用户ID
      * @return 用户对象信息
      */
     @Override
-    public SysUser selectUserById(Long userId)
-    {
+    public SysUser selectUserById(Long userId) {
         return userMapper.selectUserById(userId);
     }
 
     /**
      * 查询用户所属角色组
-     * 
+     *
      * @param userName 用户名
      * @return 结果
      */
     @Override
-    public String selectUserRoleGroup(String userName)
-    {
+    public String selectUserRoleGroup(String userName) {
         List<SysRole> list = roleMapper.selectRolesByUserName(userName);
-        if (CollectionUtils.isEmpty(list))
-        {
+        if (CollectionUtils.isEmpty(list)) {
             return StringUtils.EMPTY;
         }
         return list.stream().map(SysRole::getRoleName).collect(Collectors.joining(","));
@@ -148,16 +144,14 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 查询用户所属岗位组
-     * 
+     *
      * @param userName 用户名
      * @return 结果
      */
     @Override
-    public String selectUserPostGroup(String userName)
-    {
+    public String selectUserPostGroup(String userName) {
         List<SysPost> list = postMapper.selectPostsByUserName(userName);
-        if (CollectionUtils.isEmpty(list))
-        {
+        if (CollectionUtils.isEmpty(list)) {
             return StringUtils.EMPTY;
         }
         return list.stream().map(SysPost::getPostName).collect(Collectors.joining(","));
@@ -165,17 +159,15 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 校验用户名称是否唯一
-     * 
+     *
      * @param user 用户信息
      * @return 结果
      */
     @Override
-    public boolean checkUserNameUnique(SysUser user)
-    {
+    public boolean checkUserNameUnique(SysUser user) {
         Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId();
         SysUser info = userMapper.checkUserNameUnique(user.getUserName());
-        if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue())
-        {
+        if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue()) {
             return UserConstants.NOT_UNIQUE;
         }
         return UserConstants.UNIQUE;
@@ -188,12 +180,10 @@ public class SysUserServiceImpl implements ISysUserService
      * @return
      */
     @Override
-    public boolean checkPhoneUnique(SysUser user)
-    {
+    public boolean checkPhoneUnique(SysUser user) {
         Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId();
         SysUser info = userMapper.checkPhoneUnique(user.getPhonenumber());
-        if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue())
-        {
+        if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue()) {
             return UserConstants.NOT_UNIQUE;
         }
         return UserConstants.UNIQUE;
@@ -206,12 +196,10 @@ public class SysUserServiceImpl implements ISysUserService
      * @return
      */
     @Override
-    public boolean checkEmailUnique(SysUser user)
-    {
+    public boolean checkEmailUnique(SysUser user) {
         Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId();
         SysUser info = userMapper.checkEmailUnique(user.getEmail());
-        if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue())
-        {
+        if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue()) {
             return UserConstants.NOT_UNIQUE;
         }
         return UserConstants.UNIQUE;
@@ -219,33 +207,28 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 校验用户是否允许操作
-     * 
+     *
      * @param user 用户信息
      */
     @Override
-    public void checkUserAllowed(SysUser user)
-    {
-        if (StringUtils.isNotNull(user.getUserId()) && user.isAdmin())
-        {
+    public void checkUserAllowed(SysUser user) {
+        if (StringUtils.isNotNull(user.getUserId()) && user.isAdmin()) {
             throw new ServiceException("不允许操作超级管理员用户");
         }
     }
 
     /**
      * 校验用户是否有数据权限
-     * 
+     *
      * @param userId 用户id
      */
     @Override
-    public void checkUserDataScope(Long userId)
-    {
-        if (!SysUser.isAdmin(SecurityUtils.getUserId()))
-        {
+    public void checkUserDataScope(Long userId) {
+        if (!SysUser.isAdmin(SecurityUtils.getUserId())) {
             SysUser user = new SysUser();
             user.setUserId(userId);
             List<SysUser> users = SpringUtils.getAopProxy(this).selectUserList(user);
-            if (StringUtils.isEmpty(users))
-            {
+            if (StringUtils.isEmpty(users)) {
                 throw new ServiceException("没有权限访问用户数据!");
             }
         }
@@ -253,16 +236,17 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 新增保存用户信息
-     * 
+     *
      * @param user 用户信息
      * @return 结果
      */
     @Override
     @Transactional
-    public int insertUser(SysUser user)
-    {
+    public int insertUser(SysUser user) {
         // 新增用户信息
         int rows = userMapper.insertUser(user);
+
+        sysTenantService.addUsrTenant(user.getUserId());
         // 新增用户岗位关联
         insertUserPost(user);
         // 新增用户与角色管理
@@ -272,26 +256,24 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 注册用户信息
-     * 
+     *
      * @param user 用户信息
      * @return 结果
      */
     @Override
-    public boolean registerUser(SysUser user)
-    {
+    public boolean registerUser(SysUser user) {
         return userMapper.insertUser(user) > 0;
     }
 
     /**
      * 修改保存用户信息
-     * 
+     *
      * @param user 用户信息
      * @return 结果
      */
     @Override
     @Transactional
-    public int updateUser(SysUser user)
-    {
+    public int updateUser(SysUser user) {
         Long userId = user.getUserId();
         // 删除用户与角色关联
         userRoleMapper.deleteUserRoleByUserId(userId);
@@ -301,109 +283,100 @@ public class SysUserServiceImpl implements ISysUserService
         userPostMapper.deleteUserPostByUserId(userId);
         // 新增用户与岗位管理
         insertUserPost(user);
+
         return userMapper.updateUser(user);
     }
 
     /**
      * 用户授权角色
-     * 
-     * @param userId 用户ID
+     *
+     * @param userId  用户ID
      * @param roleIds 角色组
      */
     @Override
     @Transactional
-    public void insertUserAuth(Long userId, Long[] roleIds)
-    {
+    public void insertUserAuth(Long userId, Long[] roleIds) {
         userRoleMapper.deleteUserRoleByUserId(userId);
         insertUserRole(userId, roleIds);
     }
 
     /**
      * 修改用户状态
-     * 
+     *
      * @param user 用户信息
      * @return 结果
      */
     @Override
-    public int updateUserStatus(SysUser user)
-    {
+    public int updateUserStatus(SysUser user) {
         return userMapper.updateUser(user);
     }
 
     /**
      * 修改用户基本信息
-     * 
+     *
      * @param user 用户信息
      * @return 结果
      */
     @Override
-    public int updateUserProfile(SysUser user)
-    {
+    public int updateUserProfile(SysUser user) {
         return userMapper.updateUser(user);
     }
 
     /**
      * 修改用户头像
-     * 
+     *
      * @param userName 用户名
-     * @param avatar 头像地址
+     * @param avatar   头像地址
      * @return 结果
      */
     @Override
-    public boolean updateUserAvatar(String userName, String avatar)
-    {
+    public boolean updateUserAvatar(String userName, String avatar) {
         return userMapper.updateUserAvatar(userName, avatar) > 0;
     }
 
     /**
      * 重置用户密码
-     * 
+     *
      * @param user 用户信息
      * @return 结果
      */
     @Override
-    public int resetPwd(SysUser user)
-    {
+    public int resetPwd(SysUser user) {
         return userMapper.updateUser(user);
     }
 
     /**
      * 重置用户密码
-     * 
+     *
      * @param userName 用户名
      * @param password 密码
      * @return 结果
      */
     @Override
-    public int resetUserPwd(String userName, String password)
-    {
+    public int resetUserPwd(String userName, String password) {
         return userMapper.resetUserPwd(userName, password);
     }
 
     /**
      * 新增用户角色信息
-     * 
+     *
      * @param user 用户对象
      */
-    public void insertUserRole(SysUser user)
-    {
+    public void insertUserRole(SysUser user) {
         this.insertUserRole(user.getUserId(), user.getRoleIds());
     }
 
     /**
      * 新增用户岗位信息
-     * 
+     *
      * @param user 用户对象
      */
-    public void insertUserPost(SysUser user)
-    {
+    public void insertUserPost(SysUser user) {
         Long[] posts = user.getPostIds();
-        if (StringUtils.isNotEmpty(posts))
-        {
+        if (StringUtils.isNotEmpty(posts)) {
             // 新增用户与岗位管理
             List<SysUserPost> list = new ArrayList<SysUserPost>(posts.length);
-            for (Long postId : posts)
-            {
+            for (Long postId : posts) {
                 SysUserPost up = new SysUserPost();
                 up.setUserId(user.getUserId());
                 up.setPostId(postId);
@@ -415,18 +388,15 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 新增用户角色信息
-     * 
-     * @param userId 用户ID
+     *
+     * @param userId  用户ID
      * @param roleIds 角色组
      */
-    public void insertUserRole(Long userId, Long[] roleIds)
-    {
-        if (StringUtils.isNotEmpty(roleIds))
-        {
+    public void insertUserRole(Long userId, Long[] roleIds) {
+        if (StringUtils.isNotEmpty(roleIds)) {
             // 新增用户与角色管理
             List<SysUserRole> list = new ArrayList<SysUserRole>(roleIds.length);
-            for (Long roleId : roleIds)
-            {
+            for (Long roleId : roleIds) {
                 SysUserRole ur = new SysUserRole();
                 ur.setUserId(userId);
                 ur.setRoleId(roleId);
@@ -438,33 +408,32 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 通过用户ID删除用户
-     * 
+     *
      * @param userId 用户ID
      * @return 结果
      */
     @Override
     @Transactional
-    public int deleteUserById(Long userId)
-    {
+    public int deleteUserById(Long userId) {
         // 删除用户与角色关联
         userRoleMapper.deleteUserRoleByUserId(userId);
         // 删除用户与岗位表
         userPostMapper.deleteUserPostByUserId(userId);
+
+        sysTenantService.deleteSysTenantUsrByUsrId(userId);
         return userMapper.deleteUserById(userId);
     }
 
     /**
      * 批量删除用户信息
-     * 
+     *
      * @param userIds 需要删除的用户ID
      * @return 结果
      */
     @Override
     @Transactional
-    public int deleteUserByIds(Long[] userIds)
-    {
-        for (Long userId : userIds)
-        {
+    public int deleteUserByIds(Long[] userIds) {
+        for (Long userId : userIds) {
             checkUserAllowed(new SysUser(userId));
             checkUserDataScope(userId);
         }
@@ -472,47 +441,43 @@ public class SysUserServiceImpl implements ISysUserService
         userRoleMapper.deleteUserRole(userIds);
         // 删除用户与岗位关联
         userPostMapper.deleteUserPost(userIds);
+
+        sysTenantService.deleteSysTenantUsrByUsrIds(userIds);
         return userMapper.deleteUserByIds(userIds);
     }
 
     /**
      * 导入用户数据
-     * 
-     * @param userList 用户数据列表
+     *
+     * @param userList        用户数据列表
      * @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据
-     * @param operName 操作用户
+     * @param operName        操作用户
      * @return 结果
      */
     @Override
-    public String importUser(List<SysUser> userList, Boolean isUpdateSupport, String operName)
-    {
-        if (StringUtils.isNull(userList) || userList.size() == 0)
-        {
+    public String importUser(List<SysUser> userList, Boolean isUpdateSupport, String operName) {
+        if (StringUtils.isNull(userList) || userList.size() == 0) {
             throw new ServiceException("导入用户数据不能为空!");
         }
         int successNum = 0;
         int failureNum = 0;
         StringBuilder successMsg = new StringBuilder();
         StringBuilder failureMsg = new StringBuilder();
-        for (SysUser user : userList)
-        {
-            try
-            {
+        for (SysUser user : userList) {
+            try {
                 // 验证是否存在这个用户
                 SysUser u = userMapper.selectUserByUserName(user.getUserName());
-                if (StringUtils.isNull(u))
-                {
+                if (StringUtils.isNull(u)) {
                     BeanValidators.validateWithException(validator, user);
                     deptService.checkDeptDataScope(user.getDeptId());
                     String password = configService.selectConfigByKey("sys.user.initPassword");
                     user.setPassword(SecurityUtils.encryptPassword(password));
                     user.setCreateBy(operName);
                     userMapper.insertUser(user);
+                    sysTenantService.addUsrTenant(user.getUserId());
                     successNum++;
                     successMsg.append("<br/>" + successNum + "、账号 " + user.getUserName() + " 导入成功");
-                }
-                else if (isUpdateSupport)
-                {
+                } else if (isUpdateSupport) {
                     BeanValidators.validateWithException(validator, user);
                     checkUserAllowed(u);
                     checkUserDataScope(u.getUserId());
@@ -520,30 +485,24 @@ public class SysUserServiceImpl implements ISysUserService
                     user.setUserId(u.getUserId());
                     user.setUpdateBy(operName);
                     userMapper.updateUser(user);
+                    sysTenantService.addUsrTenant(user.getUserId());
                     successNum++;
                     successMsg.append("<br/>" + successNum + "、账号 " + user.getUserName() + " 更新成功");
-                }
-                else
-                {
+                } else {
                     failureNum++;
                     failureMsg.append("<br/>" + failureNum + "、账号 " + user.getUserName() + " 已存在");
                 }
-            }
-            catch (Exception e)
-            {
+            } catch (Exception e) {
                 failureNum++;
                 String msg = "<br/>" + failureNum + "、账号 " + user.getUserName() + " 导入失败:";
                 failureMsg.append(msg + e.getMessage());
                 log.error(msg, e);
             }
         }
-        if (failureNum > 0)
-        {
+        if (failureNum > 0) {
             failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
             throw new ServiceException(failureMsg.toString());
-        }
-        else
-        {
+        } else {
             successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
         }
         return successMsg.toString();

+ 89 - 73
common-application/ruoyi-system/src/main/resources/mapper/system/SysConfigMapper.xml

@@ -1,96 +1,109 @@
 <?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">
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.ruoyi.system.mapper.SysConfigMapper">
-    
+
     <resultMap type="SysConfig" id="SysConfigResult">
-    	<id     property="configId"      column="config_id"      />
-        <result property="configName"    column="config_name"    />
-        <result property="configKey"     column="config_key"     />
-        <result property="configValue"   column="config_value"   />
-        <result property="configType"    column="config_type"    />
-        <result property="createBy"      column="create_by"      />
-        <result property="createTime"    column="create_time"    />
-        <result property="updateBy"      column="update_by"      />
-        <result property="updateTime"    column="update_time"    />
+        <id property="configId" column="config_id"/>
+        <result property="configName" column="config_name"/>
+        <result property="configKey" column="config_key"/>
+        <result property="configValue" column="config_value"/>
+        <result property="configType" column="config_type"/>
+        <result property="createBy" column="create_by"/>
+        <result property="createTime" column="create_time"/>
+        <result property="updateBy" column="update_by"/>
+        <result property="updateTime" column="update_time"/>
+        <result property="tenantId" column="tenant_id"/>
     </resultMap>
-    
+
     <sql id="selectConfigVo">
-        select config_id, config_name, config_key, config_value, config_type, create_by, create_time, update_by, update_time, remark 
-		from sys_config
+        select *
+        from sys_config
     </sql>
-    
+
     <!-- 查询条件 -->
-	<sql id="sqlwhereSearch">
-		<where>
-			<if test="configId !=null">
-				and config_id = #{configId}
-			</if>
-			<if test="configKey !=null and configKey != ''">
-				and config_key = #{configKey}
-			</if>
-		</where>
-	</sql>
-    
+    <sql id="sqlwhereSearch">
+        <where>
+            <if test="configId !=null">
+                and config_id = #{configId}
+            </if>
+            <if test="configKey !=null and configKey != ''">
+                and config_key = #{configKey}
+            </if>
+        </where>
+    </sql>
+
     <select id="selectConfig" parameterType="SysConfig" resultMap="SysConfigResult">
         <include refid="selectConfigVo"/>
         <include refid="sqlwhereSearch"/>
     </select>
-    
+
     <select id="selectConfigList" parameterType="SysConfig" resultMap="SysConfigResult">
         <include refid="selectConfigVo"/>
         <where>
-			<if test="configName != null and configName != ''">
-				AND config_name like concat('%', #{configName}, '%')
-			</if>
-			<if test="configType != null and configType != ''">
-				AND config_type = #{configType}
-			</if>
-			<if test="configKey != null and configKey != ''">
-				AND config_key like concat('%', #{configKey}, '%')
-			</if>
-			<if test="params.beginTime != null and params.beginTime != ''"><!-- 开始时间检索 -->
-				and date_format(create_time,'%Y%m%d') &gt;= date_format(#{params.beginTime},'%Y%m%d')
-			</if>
-			<if test="params.endTime != null and params.endTime != ''"><!-- 结束时间检索 -->
-				and date_format(create_time,'%Y%m%d') &lt;= date_format(#{params.endTime},'%Y%m%d')
-			</if>
-		</where>
+            <if test="configName != null and configName != ''">
+                AND config_name like concat('%', #{configName}, '%')
+            </if>
+            <if test="configType != null and configType != ''">
+                AND config_type = #{configType}
+            </if>
+            <if test="configKey != null and configKey != ''">
+                AND config_key like concat('%', #{configKey}, '%')
+            </if>
+            <if test="params.beginTime != null and params.beginTime != ''"><!-- 开始时间检索 -->
+                and date_format(create_time,'%Y%m%d') &gt;= date_format(#{params.beginTime},'%Y%m%d')
+            </if>
+            <if test="params.endTime != null and params.endTime != ''"><!-- 结束时间检索 -->
+                and date_format(create_time,'%Y%m%d') &lt;= date_format(#{params.endTime},'%Y%m%d')
+            </if>
+            <if test="params.configName != null and params.configName != ''">
+                and config_name like concat('%', #{params.configName}, '%')
+            </if>
+            <if test="tenantId  != null and tenantId != ''">
+                and (tenant_id is null or tenant_id = #{tenantId})
+            </if>
+        </where>
     </select>
-    
+
     <select id="selectConfigById" parameterType="Long" resultMap="SysConfigResult">
         <include refid="selectConfigVo"/>
         where config_id = #{configId}
     </select>
-	
-    <select id="checkConfigKeyUnique" parameterType="String" resultMap="SysConfigResult">
+
+    <select id="checkConfigKeyUnique" parameterType="SysConfig" resultMap="SysConfigResult">
         <include refid="selectConfigVo"/>
-        where config_key = #{configKey} limit 1
+        where config_key = #{configKey}
+        <if test="configType != 'Y'.toString() and tenantId !=null">
+            and tenant_id = #{tenantId}
+        </if>
+        limit 1
     </select>
-    
+
     <insert id="insertConfig" parameterType="SysConfig">
         insert into sys_config (
-			<if test="configName != null and configName != '' ">config_name,</if>
-			<if test="configKey != null and configKey != '' ">config_key,</if>
-			<if test="configValue != null and configValue != '' ">config_value,</if>
-			<if test="configType != null and configType != '' ">config_type,</if>
-			<if test="createBy != null and createBy != ''">create_by,</if>
-			<if test="remark != null and remark != ''">remark,</if>
- 			create_time
+        <if test="configName != null and configName != '' ">config_name,</if>
+        <if test="configKey != null and configKey != '' ">config_key,</if>
+        <if test="configValue != null and configValue != '' ">config_value,</if>
+        <if test="configType != null and configType != '' ">config_type,</if>
+        <if test="createBy != null and createBy != ''">create_by,</if>
+        <if test="remark != null and remark != ''">remark,</if>
+        <if test="configType != 'Y'.toString() and tenantId != null and tenantId != ''">tenant_id,</if>
+        create_time
         )values(
-			<if test="configName != null and configName != ''">#{configName},</if>
-			<if test="configKey != null and configKey != ''">#{configKey},</if>
-			<if test="configValue != null and configValue != ''">#{configValue},</if>
-			<if test="configType != null and configType != ''">#{configType},</if>
-			<if test="createBy != null and createBy != ''">#{createBy},</if>
-			<if test="remark != null and remark != ''">#{remark},</if>
- 			sysdate()
-		)
+        <if test="configName != null and configName != ''">#{configName},</if>
+        <if test="configKey != null and configKey != ''">#{configKey},</if>
+        <if test="configValue != null and configValue != ''">#{configValue},</if>
+        <if test="configType != null and configType != ''">#{configType},</if>
+        <if test="createBy != null and createBy != ''">#{createBy},</if>
+        <if test="remark != null and remark != ''">#{remark},</if>
+        <if test="configType != 'Y'.toString() and tenantId != null and tenantId != ''">#{tenantId},</if>
+        sysdate()
+        )
     </insert>
-	 
+
     <update id="updateConfig" parameterType="SysConfig">
-        update sys_config 
+        update sys_config
         <set>
             <if test="configName != null and configName != ''">config_name = #{configName},</if>
             <if test="configKey != null and configKey != ''">config_key = #{configKey},</if>
@@ -98,20 +111,23 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="configType != null and configType != ''">config_type = #{configType},</if>
             <if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
             <if test="remark != null">remark = #{remark},</if>
- 			update_time = sysdate()
+            <if test="configType == 'Y'.toString() and tenantId != null and tenantId != ''">tenant_id = null,</if>
+            update_time = sysdate()
         </set>
         where config_id = #{configId}
     </update>
-	
+
     <delete id="deleteConfigById" parameterType="Long">
-        delete from sys_config where config_id = #{configId}
+        delete
+        from sys_config
+        where config_id = #{configId}
     </delete>
-    
+
     <delete id="deleteConfigByIds" parameterType="Long">
-        delete from sys_config where config_id in 
+        delete from sys_config where config_id in
         <foreach item="configId" collection="array" open="(" separator="," close=")">
-        	#{configId}
+            #{configId}
         </foreach>
     </delete>
-    
+
 </mapper>

+ 99 - 0
common-application/ruoyi-system/src/main/resources/mapper/system/SysTenantMapper.xml

@@ -0,0 +1,99 @@
+<?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.ruoyi.system.mapper.SysTenantMapper">
+
+    <resultMap type="SysTenant" id="SysTenantResult">
+        <id property="id" column="id"/>
+        <result property="tenantName" column="tenant_name"/>
+        <result property="tenantCode" column="tenant_code"/>
+        <result property="updateTime" column="update_time"/>
+        <result property="createTime" column="create_time"/>
+        <result property="createBy" column="create_by"/>
+        <result property="updateBy" column="update_by"/>
+    </resultMap>
+
+    <sql id="selectTenantVo">
+        select id, tenant_name, tenant_code, update_time, create_time, create_by, update_by
+        from sys_tenant
+    </sql>
+
+    <select id="selectTenantList" parameterType="SysTenant" resultMap="SysTenantResult">
+        <include refid="selectTenantVo"/>
+        <where>
+            <if test="tenantName != null and tenantName != ''">
+                AND tenant_name like concat('%', #{tenantName},'%')
+            </if>
+            <if test="tenantCode != null and tenantCode != ''">
+                AND tenant_code like concat('%', #{tenantCode},'%')
+            </if>
+        </where>
+    </select>
+
+    <select id="selectTenantById" parameterType="Long" resultMap="SysTenantResult">
+        <include refid="selectTenantVo"/>
+        where
+        id = #{id}
+        limit 1
+    </select>
+
+    <insert id="insertTenant" parameterType="SysTenant">
+        insert into sys_tenant
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="tenantName != null and tenantName != ''">
+                tenant_name,
+            </if>
+            <if test="tenantCode != null and tenantCode != ''">
+                tenant_code,
+            </if>
+            <if test="updateTime != null">
+                update_time,
+            </if>
+            <if test="createTime != null">
+                create_time,
+            </if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="tenantName != null and tenantName != ''">
+                #{tenantName},
+            </if>
+            <if test="tenantCode != null and tenantCode != ''">
+                #{tenantCode},
+            </if>
+            <if test="updateTime != null">
+                #{updateTime},
+            </if>
+            <if test="createTime != null">
+                #{createTime},
+            </if>
+        </trim>
+    </insert>
+    <update id="updateTenant" parameterType="SysTenant">
+        update sys_tenant
+        <trim prefix="set" suffixOverrides=",">
+            <if test="tenantName != null and tenantName != ''">
+                tenant_name = #{tenantName},
+            </if>
+            <if test="tenantCode != null and tenantCode != ''">
+                tenant_code = #{tenantCode},
+            </if>
+            <if test="updateTime != null">
+                update_time = #{updateTime},
+            </if>
+            <if test="createTime != null"></if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteSysTenantById" parameterType="Long">
+        delete from sys_tenant where id = #{id}
+    </delete>
+
+    <delete id="deleteSysTenantByIds" parameterType="String">
+        delete from sys_tenant where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper> 

+ 43 - 0
common-application/ruoyi-system/src/main/resources/mapper/system/SysTenantUsrRelMapper.xml

@@ -0,0 +1,43 @@
+<?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.ruoyi.system.mapper.SysTenantUsrRelMapper">
+    <resultMap type="SysTenantUsrRel" id="SysTenantResult">
+        <id property="id" column="id"/>
+        <result property="tenantId" column="tenant_id"/>
+        <result property="usrId" column="user_id"/>
+    </resultMap>
+    <sql id="selectTenantVo">
+        select id, usr_id, tenant_id
+        from sys_tenant_usr_rel
+    </sql>
+    <select id="selectTenantUsrRelList" parameterType="SysTenant" resultMap="SysTenantResult">
+        <include refid="selectTenantVo"/>
+        <where>
+            <if test="tenantId != null and tenantId != ''">
+                AND tenant_id = #{tenantId}
+            </if>
+        </where>
+    </select>
+    <select id="selectTenantUsrByUsrId" parameterType="Long" resultMap="SysTenantResult">
+        select id, usr_id, tenant_id
+        from sys_tenant_usr_rel
+        where usr_id = #{usrId} limit 1
+    </select>
+    <insert id="insertTenantUsrRel" parameterType="SysTenant">
+        insert into sys_tenant_usr_rel(tenant_id, usr_id)
+        values (#{tenantId}, #{usrId})
+    </insert>
+    <delete id="deleteTenantUsrRelByUsrId" parameterType="Long">
+        delete
+        from sys_tenant_usr_rel
+        where usr_id = #{usrId}
+    </delete>
+    <delete id="deleteTenantUsrRelByUsrIds" parameterType="Long">
+        delete from sys_tenant_usr_rel where usr_id in
+        <foreach collection="array" item="usrId" open="(" separator="," close=")">
+            #{usrId}
+        </foreach>
+    </delete>
+</mapper> 

+ 11 - 0
prod-common/src/main/java/com/huashe/common/annotation/mybatis/IgnoreTenant.java

@@ -0,0 +1,11 @@
+package com.huashe.common.annotation.mybatis;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.METHOD, ElementType.TYPE})
+public @interface IgnoreTenant {
+}

+ 14 - 0
prod-common/src/main/java/com/huashe/common/annotation/mybatis/Tenant.java

@@ -0,0 +1,14 @@
+package com.huashe.common.annotation.mybatis;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.METHOD)
+public @interface Tenant {
+    String field() default "tenant_id";
+
+    String tableAlias() default "";
+}

+ 12 - 0
prod-common/src/main/java/com/huashe/common/annotation/mybatis/TenantField.java

@@ -0,0 +1,12 @@
+package com.huashe.common.annotation.mybatis;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.FIELD)
+public @interface TenantField {
+    String alias() default "tenantId";
+}

+ 49 - 39
prod-common/src/main/java/com/huashe/common/domain/BaseEntity.java

@@ -3,6 +3,7 @@ package com.huashe.common.domain;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonInclude;
+import com.huashe.common.annotation.mybatis.TenantField;
 
 import java.io.Serializable;
 import java.util.Date;
@@ -14,32 +15,45 @@ import java.util.Map;
  *
  * @author ruoyi
  */
-public class BaseEntity implements Serializable
-{
+public class BaseEntity implements Serializable {
     private static final long serialVersionUID = 1L;
 
-    /** 搜索值 */
+    /**
+     * 搜索值
+     */
     @JsonIgnore
     private String searchValue;
 
-    /** 创建者 */
+    /**
+     * 创建者
+     */
     private String createBy;
 
-    /** 创建时间 */
+    /**
+     * 创建时间
+     */
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date createTime;
 
-    /** 更新者 */
+    /**
+     * 更新者
+     */
     private String updateBy;
 
-    /** 更新时间 */
+    /**
+     * 更新时间
+     */
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date updateTime;
 
-    /** 备注 */
+    /**
+     * 备注
+     */
     private String remark;
 
-    /** 请求参数 */
+    /**
+     * 请求参数
+     */
     @JsonInclude(JsonInclude.Include.NON_EMPTY)
     private Map<String, Object> params;
 
@@ -47,77 +61,65 @@ public class BaseEntity implements Serializable
 
     private String endRecTime;
 
-    public String getSearchValue()
-    {
+    @TenantField
+    private Long tenantId;
+
+    public String getSearchValue() {
         return searchValue;
     }
 
-    public void setSearchValue(String searchValue)
-    {
+    public void setSearchValue(String searchValue) {
         this.searchValue = searchValue;
     }
 
-    public String getCreateBy()
-    {
+    public String getCreateBy() {
         return createBy;
     }
 
-    public void setCreateBy(String createBy)
-    {
+    public void setCreateBy(String createBy) {
         this.createBy = createBy;
     }
 
-    public Date getCreateTime()
-    {
+    public Date getCreateTime() {
         return createTime;
     }
 
-    public void setCreateTime(Date createTime)
-    {
+    public void setCreateTime(Date createTime) {
         this.createTime = createTime;
     }
 
-    public String getUpdateBy()
-    {
+    public String getUpdateBy() {
         return updateBy;
     }
 
-    public void setUpdateBy(String updateBy)
-    {
+    public void setUpdateBy(String updateBy) {
         this.updateBy = updateBy;
     }
 
-    public Date getUpdateTime()
-    {
+    public Date getUpdateTime() {
         return updateTime;
     }
 
-    public void setUpdateTime(Date updateTime)
-    {
+    public void setUpdateTime(Date updateTime) {
         this.updateTime = updateTime;
     }
 
-    public String getRemark()
-    {
+    public String getRemark() {
         return remark;
     }
 
-    public void setRemark(String remark)
-    {
+    public void setRemark(String remark) {
         this.remark = remark;
     }
 
-    public Map<String, Object> getParams()
-    {
-        if (params == null)
-        {
+    public Map<String, Object> getParams() {
+        if (params == null) {
             params = new HashMap<>();
         }
         return params;
     }
 
-    public void setParams(Map<String, Object> params)
-    {
+    public void setParams(Map<String, Object> params) {
         this.params = params;
     }
 
@@ -137,4 +139,12 @@ public class BaseEntity implements Serializable
     public void setEndRecTime(String endRecTime) {
         this.endRecTime = endRecTime;
     }
+
+    public Long getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(Long tenantId) {
+        this.tenantId = tenantId;
+    }
 }