瀏覽代碼

Merge branch 'main' of http://43.137.10.199:81/hfln/hfln-portal-service

hxd 3 月之前
父節點
當前提交
27e351dbd8
共有 28 個文件被更改,包括 979 次插入69 次删除
  1. 80 0
      portal-service-application/src/main/java/com/hfln/portal/application/controller/web/WebTenantController.java
  2. 44 0
      portal-service-common/src/main/java/com/hfln/portal/common/dto/data/tenant/TenantDto.java
  3. 37 0
      portal-service-common/src/main/java/com/hfln/portal/common/dto/data/tenant/TenantInfoDto.java
  4. 36 0
      portal-service-common/src/main/java/com/hfln/portal/common/request/tenant/BuildingAddReq.java
  5. 38 0
      portal-service-common/src/main/java/com/hfln/portal/common/request/tenant/FloorAddReq.java
  6. 42 0
      portal-service-common/src/main/java/com/hfln/portal/common/request/tenant/TenantAddReq.java
  7. 24 0
      portal-service-common/src/main/java/com/hfln/portal/common/request/tenant/TenantQueryReq.java
  8. 28 0
      portal-service-common/src/main/java/com/hfln/portal/common/vo/BaseDto.java
  9. 39 0
      portal-service-domain/src/main/java/com/hfln/portal/domain/customer/AdminUserType.java
  10. 42 0
      portal-service-domain/src/main/java/com/hfln/portal/domain/customer/OprLogType.java
  11. 38 0
      portal-service-domain/src/main/java/com/hfln/portal/domain/customer/TinfoType.java
  12. 8 1
      portal-service-domain/src/main/java/com/hfln/portal/domain/exception/ErrorEnum.java
  13. 3 5
      portal-service-domain/src/main/java/com/hfln/portal/domain/gateway/WebGateway.java
  14. 26 0
      portal-service-domain/src/main/java/com/hfln/portal/domain/gateway/WebTenantGateway.java
  15. 186 0
      portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/gateway/impl/WebTenantGatewayImpl.java
  16. 12 0
      portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/mapper/TblTenantInfoMapper.java
  17. 2 2
      portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/mapper/TblTenantMapper.java
  18. 15 0
      portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/po/AdminUserInfo.java
  19. 6 15
      portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/po/TblOprLog.java
  20. 0 46
      portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/po/TblOrg.java
  21. 63 0
      portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/po/TblTenant.java
  22. 48 0
      portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/po/TblTenantInfo.java
  23. 9 0
      portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/service/TblOprLogService.java
  24. 16 0
      portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/service/TblTenantInfoService.java
  25. 15 0
      portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/service/TblTenantService.java
  26. 26 0
      portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/service/impl/TblOprLogServiceImpl.java
  27. 40 0
      portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/service/impl/TblTenantInfoServiceImpl.java
  28. 56 0
      portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/service/impl/TblTenantServiceImpl.java

+ 80 - 0
portal-service-application/src/main/java/com/hfln/portal/application/controller/web/WebTenantController.java

@@ -0,0 +1,80 @@
+package com.hfln.portal.application.controller.web;
+
+import cn.hfln.framework.catchlog.CatchAndLog;
+import cn.hfln.framework.dto.ApiResult;
+import com.hfln.portal.common.dto.data.tenant.TenantDto;
+import com.hfln.portal.common.dto.data.tenant.TenantInfoDto;
+import com.hfln.portal.common.request.tenant.BuildingAddReq;
+import com.hfln.portal.common.request.tenant.FloorAddReq;
+import com.hfln.portal.common.request.tenant.TenantAddReq;
+import com.hfln.portal.common.request.tenant.TenantQueryReq;
+import com.hfln.portal.common.vo.PageRecord;
+import com.hfln.portal.domain.gateway.WebTenantGateway;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.io.IOException;
+
+@RestController
+@CatchAndLog
+@Tag(name = "web端租户相关")
+@Slf4j
+@RequestMapping("/web/tenant")
+public class WebTenantController {
+
+    @Autowired
+    private WebTenantGateway webTenantGateway;
+
+    @PostMapping("/add")
+    @Operation(summary = "添加租户")
+    public ApiResult<Void> addTenant(@Valid @RequestBody TenantAddReq req) throws IOException {
+        webTenantGateway.addTenant(req);
+        return ApiResult.success();
+    }
+
+    @PostMapping("/query")
+    @Operation(summary = "查询租户")
+    public ApiResult<PageRecord<TenantDto>> queryTenant(@Valid @RequestBody TenantQueryReq req) throws IOException {
+        return ApiResult.success(webTenantGateway.queryTenant(req));
+    }
+
+    @GetMapping("/del")
+    @Operation(summary = "删除租户 逻辑待定")
+    public ApiResult<Void> del(@Valid @RequestParam Long req) throws IOException {
+//        webTenantGateway.del(req);
+        return ApiResult.success();
+    }
+
+    @PostMapping("/addBuilding")
+    @Operation(summary = "添加租户小区楼栋信息")
+    public ApiResult<Void> addBuilding(@Valid @RequestBody BuildingAddReq req) throws IOException {
+        webTenantGateway.addBuilding(req);
+        return ApiResult.success();
+    }
+
+    @PostMapping("/addFloor")
+    @Operation(summary = "添加租户单元楼层信息")
+    public ApiResult<Void> addFloor(@Valid @RequestBody FloorAddReq req) throws IOException {
+        webTenantGateway.addFloor(req);
+        return ApiResult.success();
+    }
+
+    @GetMapping("/queryInfo")
+    @Operation(summary = "删除租户楼栋,楼层信息")
+    public ApiResult<TenantInfoDto> queryInfo(@Valid @RequestParam Long tinfoId) throws IOException {
+
+        return ApiResult.success(webTenantGateway.queryInfo(tinfoId));
+    }
+
+    @GetMapping("/delInfo")
+    @Operation(summary = "删除租户楼栋,楼层信息")
+    public ApiResult<Void> delInfo(@Valid @RequestParam Long tinfoId) throws IOException {
+        webTenantGateway.delInfo(tinfoId);
+        return ApiResult.success();
+    }
+
+}

+ 44 - 0
portal-service-common/src/main/java/com/hfln/portal/common/dto/data/tenant/TenantDto.java

@@ -0,0 +1,44 @@
+package com.hfln.portal.common.dto.data.tenant;
+
+import com.hfln.portal.common.vo.BaseDto;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.List;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+@Schema(description = "租户")
+public class TenantDto extends BaseDto {
+
+    @Schema(description = "主键id")
+    private Long tenantId;
+
+    @Schema(description = "租户代码")
+    private String tenantCode;
+
+    @Schema(description = "租户名称")
+    private String tenantName;
+
+    @Schema(description = "父租户 ID")
+    private Long parentId;
+
+    @Schema(description = "租户类型")
+    private String tenantType;
+
+    @Schema(description = "排序号")
+    private Integer sort;
+
+    @Schema(description = "租户地址--省")
+    private String province;
+    @Schema(description = "租户地址--市")
+    private String city;
+    @Schema(description = "租户地址--区")
+    private String district;
+    @Schema(description = "租户地址--详细地址")
+    private String address;
+
+    @Schema(description = "子信息")
+    List<TenantInfoDto> children;
+}

+ 37 - 0
portal-service-common/src/main/java/com/hfln/portal/common/dto/data/tenant/TenantInfoDto.java

@@ -0,0 +1,37 @@
+package com.hfln.portal.common.dto.data.tenant;
+
+import com.hfln.portal.common.vo.BaseDto;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.List;
+
+/**
+ * 租户机构信息表
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class TenantInfoDto extends BaseDto {
+
+    @Schema(description = "主键 ID")
+    private Long tinfoId;
+
+    @Schema(description = "租户 ID")
+    private Long tenantId;
+
+    @Schema(description = "信息类型")
+    private String tinfoType;
+
+    @Schema(description = "信息名称")
+    private String tinfoName;
+
+    @Schema(description = "父信息 ID")
+    private Long parentId;
+
+    @Schema(description = "排序号")
+    private Integer sort;
+
+    @Schema(description = "子信息")
+    List<TenantInfoDto> children;
+} 

+ 36 - 0
portal-service-common/src/main/java/com/hfln/portal/common/request/tenant/BuildingAddReq.java

@@ -0,0 +1,36 @@
+package com.hfln.portal.common.request.tenant;
+
+import com.hfln.portal.common.vo.BaseVO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+@Data
+public class BuildingAddReq extends BaseVO {
+
+    @Schema(description = "租户id")
+    @NotNull(message = "租户id不能为空")
+    private Long tenantId;
+
+    @Schema(description = "小区楼栋信息")
+    @NotEmpty(message = "小区楼栋信息不能为空")
+    private List<BuildingInfo> buildingInfos;
+
+    @Data
+    @Valid
+    public static class BuildingInfo {
+
+        @Schema(description = "小区楼栋名称")
+        @NotBlank(message = "小区楼栋名称不能为空")
+        private String tinfoName;
+
+        @Schema(description = "排序号")
+        private Integer sort;
+    }
+
+}

+ 38 - 0
portal-service-common/src/main/java/com/hfln/portal/common/request/tenant/FloorAddReq.java

@@ -0,0 +1,38 @@
+package com.hfln.portal.common.request.tenant;
+
+import com.hfln.portal.common.vo.BaseVO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+@Data
+public class FloorAddReq extends BaseVO {
+
+    @Schema(description = "租户id")
+    @NotNull(message = "租户id不能为空")
+    private Long tenantId;
+
+    @Schema(description = "小区楼栋ID")
+    @NotNull(message = "小区楼栋ID不能为空")
+    private Long parentId;
+
+    @Schema(description = "单元楼层信息")
+    @NotEmpty(message = "单元楼层信息不能为空")
+    private List<FloorInfo> floorInfos;
+
+    @Data
+    public static class FloorInfo {
+
+        @Schema(description = "楼层名称")
+        @NotBlank(message = "楼层名称不能为空")
+        private String tinfoName;
+
+        @Schema(description = "排序号")
+        private Integer sort;
+    }
+
+}

+ 42 - 0
portal-service-common/src/main/java/com/hfln/portal/common/request/tenant/TenantAddReq.java

@@ -0,0 +1,42 @@
+package com.hfln.portal.common.request.tenant;
+
+import com.hfln.portal.common.vo.BaseVO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+@Data
+public class TenantAddReq extends BaseVO {
+
+    @Schema(description = "主键id, 有就是更新,没有就是新增")
+    private Long TenantId;
+
+    @Schema(description = "租户代码")
+    @NotBlank(message = "租户代码不能为空")
+    private String tenantCode;
+
+    @Schema(description = "租户名称")
+    @NotBlank(message = "租户名称不能为空")
+    private String tenantName;
+
+    @Schema(description = "父租户 ID")
+    private Long parentId;
+
+    @Schema(description = "租户类型")
+    @NotBlank(message = "租户类型不能为空")
+    private String tenantType;
+
+    @Schema(description = "排序号")
+    private Integer sort;
+
+    @Schema(description = "租户地址--省")
+    private String province;
+    @Schema(description = "租户地址--市")
+    private String city;
+    @Schema(description = "租户地址--区")
+    private String district;
+    @Schema(description = "租户地址--详细地址")
+    private String address;
+
+}

+ 24 - 0
portal-service-common/src/main/java/com/hfln/portal/common/request/tenant/TenantQueryReq.java

@@ -0,0 +1,24 @@
+package com.hfln.portal.common.request.tenant;
+
+import com.hfln.portal.common.vo.PageVo;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Data
+public class TenantQueryReq extends PageVo {
+
+    @Schema(description = "租户代码")
+    private String tenantCode;
+
+    @Schema(description = "租户名称")
+    private String tenantName;
+
+//    @Schema(description = "父租户 ID")
+//    private Long parentId;
+
+    @Schema(description = "租户类型")
+    private String tenantType;
+
+    @Schema(description = "是否启用级联查询 楼栋,楼层信息")
+    private boolean enabled = false;
+}

+ 28 - 0
portal-service-common/src/main/java/com/hfln/portal/common/vo/BaseDto.java

@@ -0,0 +1,28 @@
+package com.hfln.portal.common.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+public class BaseDto implements Serializable {
+
+    @Schema(description = "创建人")
+    private Long createId;
+
+
+    @Schema(description = "修改人")
+    private Long updateId;
+
+    @Schema(description = "创建时间")
+    private LocalDateTime createTime;
+
+    @Schema(description = "更新时间")
+    private LocalDateTime updateTime;
+
+    @Schema(description = "删除标记:0-未删除,1-已删除")
+    private Integer isDeleted;
+
+    @Schema(description = "备注")
+    private String remark;
+}

+ 39 - 0
portal-service-domain/src/main/java/com/hfln/portal/domain/customer/AdminUserType.java

@@ -0,0 +1,39 @@
+package com.hfln.portal.domain.customer;
+
+/**
+ * 登录设备类型
+ *
+ * @author Frank Zhang
+ * @date 2018-01-08 11:09 AM
+ */
+public enum AdminUserType {
+    ADMIN("admin", "超级管理员"),
+    MANAGER("manager", "后台管理员"),
+    USER_ADMIN("user_admin", "用户超级管理员"),
+    USER_MANAGER("user_manager", "用户超级管理员"),
+    ;
+
+    String code;
+    String desc;
+
+    AdminUserType(String code, String desc) {
+        this.code = code;
+        this.desc = desc;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+
+    public void setDesc(String desc) {
+        this.desc = desc;
+    }
+}

+ 42 - 0
portal-service-domain/src/main/java/com/hfln/portal/domain/customer/OprLogType.java

@@ -0,0 +1,42 @@
+package com.hfln.portal.domain.customer;
+
+/**
+ * 操作日志类型
+ *
+ * @author Frank Zhang
+ * @date 2018-01-08 11:09 AM
+ */
+public enum OprLogType {
+    DEL_TENANT_INFO("del_tenant_info", "删除租户楼栋,楼层信息"),
+
+
+
+    ADD_TENANT("add_tenant", "添加租户"),
+    MOD_TENANT("mod_tenant", "更新租户"),
+
+    ;
+
+    String code;
+    String desc;
+
+    OprLogType(String code, String desc) {
+        this.code = code;
+        this.desc = desc;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+
+    public void setDesc(String desc) {
+        this.desc = desc;
+    }
+}

+ 38 - 0
portal-service-domain/src/main/java/com/hfln/portal/domain/customer/TinfoType.java

@@ -0,0 +1,38 @@
+package com.hfln.portal.domain.customer;
+
+/**
+ * 租户信息类型
+ *
+ * @author Frank Zhang
+ * @date 2018-01-08 11:09 AM
+ */
+public enum TinfoType {
+    COMMUNITY_BUILDING("community_building", "小区楼栋"),
+    UNIT_FLOOR("unit_floor", "单元楼层"),
+
+    ;
+
+    String code;
+    String desc;
+
+    TinfoType(String code, String desc) {
+        this.code = code;
+        this.desc = desc;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+
+    public void setDesc(String desc) {
+        this.desc = desc;
+    }
+}

+ 8 - 1
portal-service-domain/src/main/java/com/hfln/portal/domain/exception/ErrorEnum.java

@@ -16,6 +16,7 @@ public enum ErrorEnum implements ErrorEnumInterface{
     USER_NOT_FOUND( "10001", "用户不存在"),
     MOBILE_EXISTS("10002", "手机号已存在"),
     MOBILE_NOT_SIGN("10003", "手机号未注册"),
+    DATA_NOT_EXISTS("10004", "数据不存在!"),
 
 
     /**
@@ -108,7 +109,13 @@ public enum ErrorEnum implements ErrorEnumInterface{
      */
     MENU_NAME_EXISTS("12001","菜单名称已存在!"),
     MENU_NOT_EXISTS("12002","菜单不存在!"),
-    MENU_PARENT_NOT_SELF("12003","父级菜单不能为自身!")
+    MENU_PARENT_NOT_SELF("12003","父级菜单不能为自身!"),
+
+    /**
+     * 租户相关
+     */
+    TENANT_IS_ALREADY_EXIST("13001", "租户已经存在!"),
+
     ;
 
     private final String errorCode;

+ 3 - 5
portal-service-domain/src/main/java/com/hfln/portal/domain/gateway/WebGateway.java

@@ -10,10 +10,8 @@ import com.hfln.portal.common.request.web.*;
 import com.hfln.portal.common.response.admin.AdminLoginRes;
 import com.hfln.portal.common.vo.PageRecord;
 import com.hfln.portal.common.vo.UploadRes;
-import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.multipart.MultipartFile;
 
-import javax.validation.Valid;
 import java.io.IOException;
 import java.util.List;
 
@@ -41,15 +39,15 @@ public interface WebGateway {
      */
     void reset(AdminResetParam param);
 
-    void addAccount(@Valid AddAccountParam param);;
+    void addAccount(AddAccountParam param);;
 
 
     /**
      * web角色相关
      */
-    void addRole(@Valid AddRoleParam param);
+    void addRole(AddRoleParam param);
 
-    void disableRole(@RequestParam String roleCode);
+    void disableRole(String roleCode);
 
     List<RoleListDTO> roleList();
 

+ 26 - 0
portal-service-domain/src/main/java/com/hfln/portal/domain/gateway/WebTenantGateway.java

@@ -0,0 +1,26 @@
+package com.hfln.portal.domain.gateway;
+
+import com.hfln.portal.common.dto.data.tenant.TenantDto;
+import com.hfln.portal.common.dto.data.tenant.TenantInfoDto;
+import com.hfln.portal.common.request.tenant.BuildingAddReq;
+import com.hfln.portal.common.request.tenant.FloorAddReq;
+import com.hfln.portal.common.request.tenant.TenantAddReq;
+import com.hfln.portal.common.request.tenant.TenantQueryReq;
+import com.hfln.portal.common.vo.PageRecord;
+
+public interface WebTenantGateway {
+
+
+    void addTenant(TenantAddReq req);
+
+    PageRecord<TenantDto> queryTenant(TenantQueryReq req);
+
+    void addBuilding(BuildingAddReq req);
+
+    void addFloor(FloorAddReq req);
+
+    void delInfo(Long tinfoId);
+
+    TenantInfoDto queryInfo(Long tinfoId);
+}
+

+ 186 - 0
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/gateway/impl/WebTenantGatewayImpl.java

@@ -0,0 +1,186 @@
+package com.hfln.portal.infrastructure.gateway.impl;
+
+import cn.hfln.framework.extension.BizException;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.hfln.portal.common.dto.data.tenant.TenantDto;
+import com.hfln.portal.common.dto.data.tenant.TenantInfoDto;
+import com.hfln.portal.common.request.tenant.BuildingAddReq;
+import com.hfln.portal.common.request.tenant.FloorAddReq;
+import com.hfln.portal.common.request.tenant.TenantAddReq;
+import com.hfln.portal.common.request.tenant.TenantQueryReq;
+import com.hfln.portal.common.vo.PageRecord;
+import com.hfln.portal.domain.customer.OprLogType;
+import com.hfln.portal.domain.customer.TinfoType;
+import com.hfln.portal.domain.customer.util.CopyUtils;
+import com.hfln.portal.domain.exception.ErrorEnum;
+import com.hfln.portal.domain.gateway.WebTenantGateway;
+import com.hfln.portal.infrastructure.po.TblTenant;
+import com.hfln.portal.infrastructure.po.TblTenantInfo;
+import com.hfln.portal.infrastructure.service.TblOprLogService;
+import com.hfln.portal.infrastructure.service.TblTenantInfoService;
+import com.hfln.portal.infrastructure.service.TblTenantService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Service
+public class WebTenantGatewayImpl implements WebTenantGateway {
+
+    @Autowired
+    private TblTenantService tblTenantService;
+
+    @Autowired
+    private TblTenantInfoService tblTenantInfoService;
+
+    @Autowired
+    private TblOprLogService tblOprLogService;
+
+    @Override
+    @Transactional
+    public void addTenant(TenantAddReq req) {
+
+        if (req.getTenantId() == null) {
+
+            // 新增租户
+            List<TblTenant> tenantList = tblTenantService.queryByCodeOrName(req.getTenantCode(), req.getTenantName());
+            if (!CollectionUtils.isEmpty(tenantList)) {
+                throw new BizException(ErrorEnum.TENANT_IS_ALREADY_EXIST.getErrorCode(), ErrorEnum.TENANT_IS_ALREADY_EXIST.getErrorMessage());
+            }
+
+            TblTenant saveTenant = CopyUtils.copy(req, TblTenant.class);
+            tblTenantService.save(saveTenant);
+
+            tblOprLogService.saveLog(OprLogType.ADD_TENANT.getCode(), saveTenant);
+        } else {
+
+            List<TblTenant> tenantList = tblTenantService.queryByCodeOrName(req.getTenantCode(), req.getTenantName());
+            if (CollectionUtils.isEmpty(tenantList) || tenantList.size() > 2 || !tenantList.get(0).getTenantId().equals(req.getTenantId())) {
+                throw new BizException(ErrorEnum.TENANT_IS_ALREADY_EXIST.getErrorCode(), ErrorEnum.TENANT_IS_ALREADY_EXIST.getErrorMessage());
+            }
+            // 更新租户
+            TblTenant tenant = tblTenantService.getById(req.getTenantId());
+            BeanUtils.copyProperties(req,  tenant);
+            tblTenantService.updateById(tenant);
+
+            tblOprLogService.saveLog(OprLogType.MOD_TENANT.getCode(), tenant);
+        }
+
+    }
+
+    @Override
+    public PageRecord<TenantDto> queryTenant(TenantQueryReq req) {
+
+        // 执行分页查询
+        Page<TblTenant> tenantList = tblTenantService.queryTenantList(req);
+        // 换为目标VO
+        List<TenantDto> targets = CopyUtils.copyList(tenantList.getRecords(), TenantDto.class);
+        if (!req.isEnabled() || CollectionUtils.isEmpty(targets)) {
+            return CopyUtils.copyPage(tenantList, targets);
+        }
+
+        // 如果需要级联查询 查询三级信息 租户信息 --》 楼栋信息 --》 楼层信息
+        List<TblTenantInfo> list = tblTenantInfoService.queryByTenantIds(targets.stream().map(TenantDto::getTenantId).collect(Collectors.toList()));
+        Map<Long, Map<String, List<TblTenantInfo>>> map = list.stream().collect(Collectors.groupingBy(
+                info -> Optional.ofNullable(info.getTenantId()).orElse(-1L),
+                Collectors.groupingBy(
+                        info -> Optional.ofNullable(info.getTinfoType()).orElse("DEFAULT"),
+                        Collectors.toList()
+                )
+        ));
+
+        for (TenantDto target : targets) {
+            Map<String, List<TblTenantInfo>> tenantInfoMap = map.get(target.getTenantId());
+            if (!CollectionUtils.isEmpty(tenantInfoMap)) {
+
+                List<TblTenantInfo> buildings = tenantInfoMap.get(TinfoType.COMMUNITY_BUILDING.getCode());
+                List<TblTenantInfo> floors = tenantInfoMap.get(TinfoType.UNIT_FLOOR.getCode());
+                Map<Long, List<TblTenantInfo>> floorMap = new HashMap<>();
+                if (!CollectionUtils.isEmpty(floors)) {
+                    floorMap = floors.stream().collect(Collectors.groupingBy(TblTenantInfo::getParentId));
+                }
+
+                if (!CollectionUtils.isEmpty(buildings)) {
+                    List<TenantInfoDto> buildingList = new ArrayList<>();
+                    for (TblTenantInfo building : buildings) {
+                        TenantInfoDto copy = CopyUtils.copy(building, TenantInfoDto.class);
+                        copy.setChildren(CopyUtils.copyList(floorMap.get(building.getTinfoId()), TenantInfoDto.class));
+                        buildingList.add(copy);
+                    }
+                    target.setChildren(buildingList);
+                }
+            }
+        }
+        return CopyUtils.copyPage(tenantList, targets);
+    }
+
+    @Override
+    @Transactional
+    public void addBuilding(BuildingAddReq req) {
+
+        List<TblTenantInfo> saveList = new ArrayList<>();
+        req.getBuildingInfos().forEach(buildingInfo -> {
+            TblTenantInfo tblBuilding = new TblTenantInfo();
+            BeanUtils.copyProperties(buildingInfo, tblBuilding);
+
+            tblBuilding.setTenantId(req.getTenantId());
+            tblBuilding.setTinfoType(TinfoType.COMMUNITY_BUILDING.getCode());
+
+            saveList.add(tblBuilding);
+        });
+        tblTenantInfoService.saveBatch(saveList);
+    }
+
+    @Override
+    @Transactional
+    public void addFloor(FloorAddReq req) {
+
+        List<TblTenantInfo> saveList = new ArrayList<>();
+        req.getFloorInfos().forEach(buildingInfo -> {
+            TblTenantInfo floorInfo = new TblTenantInfo();
+            BeanUtils.copyProperties(buildingInfo, floorInfo);
+
+            floorInfo.setTenantId(req.getTenantId());
+            floorInfo.setTinfoType(TinfoType.UNIT_FLOOR.getCode());
+            floorInfo.setParentId(req.getParentId());
+            saveList.add(floorInfo);
+        });
+        tblTenantInfoService.saveBatch(saveList);
+    }
+
+    @Override
+    @Transactional
+    public void delInfo(Long tinfoId) {
+
+        TblTenantInfo byId = tblTenantInfoService.getById(tinfoId);
+        if (byId == null) {
+            throw new BizException(ErrorEnum.DATA_NOT_EXISTS.getErrorCode(), ErrorEnum.DATA_NOT_EXISTS.getErrorMessage());
+        }
+        tblOprLogService.saveLog(OprLogType.DEL_TENANT_INFO.getCode(), byId);
+
+        tblTenantInfoService.delById(tinfoId);
+    }
+
+    @Override
+    public TenantInfoDto queryInfo(Long tinfoId) {
+
+        TblTenantInfo byId = tblTenantInfoService.getById(tinfoId);
+        if (byId == null) {
+            throw new BizException(ErrorEnum.DATA_NOT_EXISTS.getErrorCode(), ErrorEnum.DATA_NOT_EXISTS.getErrorMessage());
+        }
+
+        if (TinfoType.UNIT_FLOOR.getCode().equals(byId.getTinfoType())) {
+            return CopyUtils.copy(byId, TenantInfoDto.class);
+        }
+        TenantInfoDto tenantInfoDto = CopyUtils.copy(byId, TenantInfoDto.class);
+        List<TblTenantInfo> children = tblTenantInfoService.queryByParentId(tinfoId);
+        tenantInfoDto.setChildren(CopyUtils.copyList(children, TenantInfoDto.class));
+        return tenantInfoDto;
+    }
+}

+ 12 - 0
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/mapper/TblTenantInfoMapper.java

@@ -0,0 +1,12 @@
+package com.hfln.portal.infrastructure.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.hfln.portal.infrastructure.po.TblTenantInfo;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 租户组织信息表 Mapper 接口
+ */
+@Mapper
+public interface TblTenantInfoMapper extends BaseMapper<TblTenantInfo> {
+} 

+ 2 - 2
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/mapper/TblOrgMapper.java → portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/mapper/TblTenantMapper.java

@@ -1,12 +1,12 @@
 package com.hfln.portal.infrastructure.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.hfln.portal.infrastructure.po.TblOrg;
+import com.hfln.portal.infrastructure.po.TblTenant;
 import org.apache.ibatis.annotations.Mapper;
 
 /**
  * 组织机构表 Mapper 接口
  */
 @Mapper
-public interface TblOrgMapper extends BaseMapper<TblOrg> {
+public interface TblTenantMapper extends BaseMapper<TblTenant> {
 } 

+ 15 - 0
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/po/AdminUserInfo.java

@@ -21,6 +21,21 @@ public class AdminUserInfo extends BasePO {
     private Long userId;
 
     /**
+     * 租户ID
+     */
+    private Long tenantId;
+
+    /**
+     * 用户类型
+     */
+    private String userType;
+
+    /**
+     * 用户名
+     */
+    private String userName;
+
+    /**
      * 账户
      */
     private String account;

+ 6 - 15
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/po/TblOprLog.java

@@ -1,9 +1,10 @@
 package com.hfln.portal.infrastructure.po;
 
-import com.baomidou.mybatisplus.annotation.*;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
-import java.time.LocalDateTime;
 
 /**
  * 操作日志表
@@ -25,24 +26,14 @@ public class TblOprLog extends BasePO {
     private String userId;
 
     /**
-     * 操作内容
-     */
-    private String operation;
-
-    /**
      * 操作类型
      */
-    private String operationType;
+    private String oprType;
 
     /**
-     * 操作结果
-     */
-    private String operationResult;
-
-    /**
-     * 操作时间
+     * 操作内容
      */
-    private LocalDateTime operationTime;
+    private String operation;
 
     /**
      * IP 地址

+ 0 - 46
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/po/TblOrg.java

@@ -1,46 +0,0 @@
-package com.hfln.portal.infrastructure.po;
-
-import com.baomidou.mybatisplus.annotation.*;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-/**
- * 组织机构表
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-@TableName("tbl_org")
-public class TblOrg extends BasePO {
-
-    /**
-     * 主键 ID
-     */
-    @TableId(value = "org_id", type = IdType.ASSIGN_ID)
-    private Long orgId;
-
-    /**
-     * 组织编码
-     */
-    private String orgCode;
-
-    /**
-     * 组织名称
-     */
-    private String orgName;
-
-    /**
-     * 父组织 ID
-     */
-    private Long parentId;
-
-    /**
-     * 组织类型
-     */
-    private String orgType;
-
-    /**
-     * 排序号
-     */
-    private Integer sort;
-
-} 

+ 63 - 0
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/po/TblTenant.java

@@ -0,0 +1,63 @@
+package com.hfln.portal.infrastructure.po;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 租户机构表
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("tbl_tenant")
+public class TblTenant extends BasePO {
+
+    /**
+     * 主键 ID
+     */
+    @TableId(value = "tenant_id", type = IdType.ASSIGN_ID)
+    private Long tenantId;
+
+    /**
+     * 租户代码
+     */
+    private String tenantCode;
+
+    /**
+     * 租户名称
+     */
+    private String tenantName;
+
+    /**
+     * 父租户 ID
+     */
+    private Long parentId;
+
+    /**
+     * 租户类型
+     */
+    private String tenantType;
+
+    /**
+     * 排序号
+     */
+    private Integer sort;
+
+    /**
+     * 租户地址--省
+     */
+    private String province;
+    /**
+     * 租户地址--市
+     */
+    private String city;
+    /**
+     * 租户地址--区
+     */
+    private String district;
+    /**
+     * 租户地址--详细地址
+     */
+    private String address;
+
+} 

+ 48 - 0
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/po/TblTenantInfo.java

@@ -0,0 +1,48 @@
+package com.hfln.portal.infrastructure.po;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 租户机构信息表
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("tbl_tenant_info")
+public class TblTenantInfo extends BasePO {
+
+    /**
+     * 主键 ID
+     */
+    @TableId(value = "tinfo_id", type = IdType.ASSIGN_ID)
+    private Long tinfoId;
+
+    /**
+     * 租户 ID
+     */
+    private Long tenantId;
+
+    /**
+     * 信息类型
+     */
+    private String tinfoType;
+
+    /**
+     * 信息名称
+     */
+    private String tinfoName;
+
+    /**
+     * 父信息 ID
+     */
+    private Long parentId;
+
+    /**
+     * 排序号
+     */
+    private Integer sort;
+
+} 

+ 9 - 0
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/service/TblOprLogService.java

@@ -0,0 +1,9 @@
+package com.hfln.portal.infrastructure.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.hfln.portal.infrastructure.po.TblOprLog;
+
+public interface TblOprLogService extends IService<TblOprLog> {
+
+    void saveLog(String code, Object byId);
+}

+ 16 - 0
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/service/TblTenantInfoService.java

@@ -0,0 +1,16 @@
+package com.hfln.portal.infrastructure.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.hfln.portal.infrastructure.po.TblTenantInfo;
+
+import java.util.List;
+
+public interface TblTenantInfoService extends IService<TblTenantInfo> {
+
+
+    void delById(Long tinfoId);
+
+    List<TblTenantInfo> queryByParentId(Long tinfoId);
+
+    List<TblTenantInfo> queryByTenantIds(List<Long> tenantIds);
+}

+ 15 - 0
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/service/TblTenantService.java

@@ -0,0 +1,15 @@
+package com.hfln.portal.infrastructure.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.hfln.portal.common.request.tenant.TenantQueryReq;
+import com.hfln.portal.infrastructure.po.TblTenant;
+
+import java.util.List;
+
+public interface TblTenantService extends IService<TblTenant> {
+
+    List<TblTenant> queryByCodeOrName(String tenantCode, String tenantName);
+
+    Page<TblTenant> queryTenantList(TenantQueryReq req);
+}

+ 26 - 0
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/service/impl/TblOprLogServiceImpl.java

@@ -0,0 +1,26 @@
+package com.hfln.portal.infrastructure.service.impl;
+
+import com.alibaba.fastjson2.JSON;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.hfln.portal.infrastructure.mapper.TblOprLogMapper;
+import com.hfln.portal.infrastructure.po.TblOprLog;
+import com.hfln.portal.infrastructure.service.TblOprLogService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+
+@Service
+@Slf4j
+public class TblOprLogServiceImpl extends ServiceImpl<TblOprLogMapper, TblOprLog> implements TblOprLogService {
+
+    @Override
+    public void saveLog(String code, Object obj) {
+        TblOprLog tblOprLog = new TblOprLog();
+        tblOprLog.setOprType(code);
+        tblOprLog.setOperation(JSON.toJSONString(obj));
+        // userId ip todo
+        tblOprLog.setUserId("1");
+
+        this.baseMapper.insert(tblOprLog);
+    }
+}

+ 40 - 0
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/service/impl/TblTenantInfoServiceImpl.java

@@ -0,0 +1,40 @@
+package com.hfln.portal.infrastructure.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.hfln.portal.infrastructure.mapper.TblTenantInfoMapper;
+import com.hfln.portal.infrastructure.po.BasePO;
+import com.hfln.portal.infrastructure.po.TblTenantInfo;
+import com.hfln.portal.infrastructure.service.TblTenantInfoService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+
+@Service
+@Slf4j
+public class TblTenantInfoServiceImpl extends ServiceImpl<TblTenantInfoMapper, TblTenantInfo> implements TblTenantInfoService {
+
+    @Override
+    public void delById(Long tinfoId) {
+        this.baseMapper.deleteById(tinfoId);
+    }
+
+    @Override
+    public List<TblTenantInfo> queryByParentId(Long tinfoId) {
+
+        LambdaQueryWrapper<TblTenantInfo> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(TblTenantInfo::getParentId, tinfoId);
+        queryWrapper.eq(TblTenantInfo::getIsDeleted, BasePO.DeleteFlag.NOT_DELETED);
+        return this.baseMapper.selectList(queryWrapper);
+    }
+
+    @Override
+    public List<TblTenantInfo> queryByTenantIds(List<Long> tenantIds) {
+        LambdaQueryWrapper<TblTenantInfo> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.in(TblTenantInfo::getTenantId, tenantIds);
+        queryWrapper.eq(TblTenantInfo::getIsDeleted, BasePO.DeleteFlag.NOT_DELETED);
+        return this.baseMapper.selectList(queryWrapper);
+    }
+}

+ 56 - 0
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/service/impl/TblTenantServiceImpl.java

@@ -0,0 +1,56 @@
+package com.hfln.portal.infrastructure.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.hfln.portal.common.request.tenant.TenantQueryReq;
+import com.hfln.portal.infrastructure.mapper.TblTenantMapper;
+import com.hfln.portal.infrastructure.po.BasePO;
+import com.hfln.portal.infrastructure.po.TblTenant;
+import com.hfln.portal.infrastructure.service.TblTenantService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+
+import java.util.List;
+
+
+@Service
+@Slf4j
+public class TblTenantServiceImpl extends ServiceImpl<TblTenantMapper, TblTenant> implements TblTenantService {
+
+
+    @Override
+    public List<TblTenant> queryByCodeOrName(String tenantCode, String tenantName) {
+        LambdaQueryWrapper<TblTenant> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(TblTenant::getIsDeleted, BasePO.DeleteFlag.NOT_DELETED);
+        queryWrapper.and(queryWrapper1 ->
+                queryWrapper1.eq(TblTenant::getTenantCode, tenantCode).or().eq(TblTenant::getTenantName, tenantName));
+        return this.baseMapper.selectList(queryWrapper);
+    }
+
+    @Override
+    public Page<TblTenant> queryTenantList(TenantQueryReq queryReq) {
+        Page<TblTenant> page = new Page<>(queryReq.getPageNo(), queryReq.getPageSize());
+
+        // 2. 构建查询条件
+        LambdaQueryWrapper<TblTenant> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(TblTenant::getIsDeleted, BasePO.DeleteFlag.NOT_DELETED);
+        if (StringUtils.hasText(queryReq.getTenantCode())) {
+            queryWrapper.like(TblTenant::getTenantCode, queryReq.getTenantCode());
+        }
+        if (StringUtils.hasText(queryReq.getTenantName())){
+            queryWrapper.like(TblTenant::getTenantName, queryReq.getTenantName());
+        }
+//        if (queryReq.getParentId() != null){
+//            queryWrapper.eq(TblTenant::getParentId, queryReq.getParentId());
+//        }
+        if (StringUtils.hasText(queryReq.getTenantType())){
+            queryWrapper.eq(TblTenant::getTenantType, queryReq.getTenantType());
+        }
+
+        // 4. 设置排序
+        queryWrapper.orderByDesc(TblTenant::getCreateTime);
+        return this.baseMapper.selectPage(page, queryWrapper);
+    }
+}