feat(elevator): 租户访客默认楼层策略表与 UC-01 求交

- 新增 tenant_visitor_floor_policy DDL(docs/sql)
- MyBatis:TenantVisitorFloorPolicyMapper/Dao 按 businessId 读启用策略
- PersonRuleServiceImpl.addVisitor:未传 floorIds 时组织 floorList 与 allow_zone_ids 求交;无交集 76260532;无楼层 76260531;显式 floorIds 不读表;ServiceException 原样抛出

Made-with: Cursor
This commit is contained in:
反编译工作区
2026-04-24 11:11:06 +08:00
parent 717b9a9240
commit 25cff4d132
8 changed files with 526 additions and 2 deletions
@@ -0,0 +1,14 @@
package cn.cloudwalk.elevator.person.dao;
import cn.cloudwalk.elevator.person.dto.TenantVisitorFloorPolicyDto;
public interface TenantVisitorFloorPolicyDao {
/**
* 查询租户级启用中的 INTERSECT_ALLOWLIST 策略(building_id 为空)。
*
* @param businessId 机构 ID
* @return 无配置时 null
*/
TenantVisitorFloorPolicyDto selectEnabledTenantDefault(String businessId);
}
@@ -0,0 +1,71 @@
package cn.cloudwalk.elevator.person.dto;
/**
* 租户访客楼层策略(表 tenant_visitor_floor_policy 行映射)。
*/
public class TenantVisitorFloorPolicyDto {
private String id;
private String businessId;
private String policyType;
private String allowZoneIds;
private String buildingId;
private Integer enabled;
private Long policyVersion;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getBusinessId() {
return businessId;
}
public void setBusinessId(String businessId) {
this.businessId = businessId;
}
public String getPolicyType() {
return policyType;
}
public void setPolicyType(String policyType) {
this.policyType = policyType;
}
public String getAllowZoneIds() {
return allowZoneIds;
}
public void setAllowZoneIds(String allowZoneIds) {
this.allowZoneIds = allowZoneIds;
}
public String getBuildingId() {
return buildingId;
}
public void setBuildingId(String buildingId) {
this.buildingId = buildingId;
}
public Integer getEnabled() {
return enabled;
}
public void setEnabled(Integer enabled) {
this.enabled = enabled;
}
public Long getPolicyVersion() {
return policyVersion;
}
public void setPolicyVersion(Long policyVersion) {
this.policyVersion = policyVersion;
}
}
@@ -0,0 +1,19 @@
package cn.cloudwalk.elevator.person.impl;
import cn.cloudwalk.elevator.person.dao.TenantVisitorFloorPolicyDao;
import cn.cloudwalk.elevator.person.dto.TenantVisitorFloorPolicyDto;
import cn.cloudwalk.elevator.person.mapper.TenantVisitorFloorPolicyMapper;
import javax.annotation.Resource;
import org.springframework.stereotype.Repository;
@Repository
public class TenantVisitorFloorPolicyDaoImpl implements TenantVisitorFloorPolicyDao {
@Resource
private TenantVisitorFloorPolicyMapper tenantVisitorFloorPolicyMapper;
@Override
public TenantVisitorFloorPolicyDto selectEnabledTenantDefault(String businessId) {
return this.tenantVisitorFloorPolicyMapper.selectEnabledTenantDefault(businessId);
}
}
@@ -0,0 +1,12 @@
package cn.cloudwalk.elevator.person.mapper;
import cn.cloudwalk.elevator.person.dto.TenantVisitorFloorPolicyDto;
import org.apache.ibatis.annotations.Param;
public interface TenantVisitorFloorPolicyMapper {
/**
* 租户级默认策略:building_id 为空,启用,INTERSECT_ALLOWLIST。
*/
TenantVisitorFloorPolicyDto selectEnabledTenantDefault(@Param("businessId") String businessId);
}
@@ -0,0 +1,22 @@
<?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="cn.cloudwalk.elevator.person.mapper.TenantVisitorFloorPolicyMapper">
<select id="selectEnabledTenantDefault" resultType="cn.cloudwalk.elevator.person.dto.TenantVisitorFloorPolicyDto">
SELECT id,
business_id AS businessId,
policy_type AS policyType,
allow_zone_ids AS allowZoneIds,
building_id AS buildingId,
enabled AS enabled,
policy_version AS policyVersion
FROM tenant_visitor_floor_policy
WHERE business_id = #{businessId,jdbcType=VARCHAR}
AND enabled = 1
AND policy_type = 'INTERSECT_ALLOWLIST'
AND (building_id IS NULL OR building_id = '')
ORDER BY updated_at DESC, policy_version DESC
LIMIT 1
</select>
</mapper>