package com.hosea.service.app.tenant; import com.alibaba.cola.dto.PageResponse; import com.hosea.cloud.web.exception.Assert; import com.hosea.service.app.tenant.executor.TenantCmdExecute; import com.hosea.service.app.tenant.executor.TenantQueryExecute; import com.hosea.service.user.client.dto.constant.TenantErrorCode; import com.hosea.service.user.client.dto.data.TenantDTO; import com.hosea.service.user.client.dto.data.TenantUniqueDTO; import com.hosea.service.user.client.dto.request.TenantAddCmd; import com.hosea.service.user.client.dto.request.TenantListPageQuery; import com.hosea.service.user.client.dto.request.TenantUpdateCmd; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Optional; /** * 租户服务 *

*

* 职责:协调层 *

* 统一暴露业务能力入口(API粒度) *

* 事务边界控制(@Transactional) *

* 跨聚合协调(如租户创建时同步初始化权限) *

* 基础参数透传(不处理业务逻辑) *

*

* ‌关键边界控制点‌: *

* 流量方向:Controller → Service → (Cmd/Query)Execute → DomainService *

* 禁止反向调用:QueryExecute永远不能调用CmdExecute *

* 状态修改权限:只有CmdExecute可以修改领域对象状态 *

* 数据可见性:QueryExecute可以直接访问Repository但CmdExecute必须通过DomainService * * @author hosea * @date 2025-06-23 */ @Service @Transactional public class TenantService { @Resource private TenantCmdExecute tenantCmd; @Resource private TenantQueryExecute tenantQuery; /** * 查 */ public Optional get(TenantUniqueDTO unique) { Assert.notNull(unique, TenantErrorCode.NOT_NULL); return tenantQuery.of(unique); } /** * 增 */ public void add(TenantAddCmd tenant) { Assert.notNull(tenant, TenantErrorCode.NOT_NULL); tenantCmd.add(tenant); } /** * 删 */ public void update(TenantUpdateCmd tenant) { Assert.notNull(tenant, TenantErrorCode.NOT_NULL); tenantCmd.update(tenant); } /** * 租户分页列表 */ public PageResponse list(TenantListPageQuery query) { return tenantQuery.list(Optional.ofNullable(query).orElseGet(TenantListPageQuery::new)); } }