Browse Source
- crm-lead 新增 port/inbound:ConvertibleLeadCatalogPort(单方法)+ ConvertibleLeadView(随端口同包)+ ConvertibleLeadCatalogPortImpl (逻辑自 LeadServiceImpl 原样迁入,票 12 口径不变) - 删 ILeadService.listConvertibleLeads + LeadServiceImpl 实现 + domain/dto/ConvertibleLeadView + LeadConvertibleQueryTest (宽服务接口不再挂为外域服务的方法,商机侧不再 import ILeadService) - 商机侧 4 处改注入端口:CreateServiceImpl / IOpportunityCreateService / CreateController / 测试;占用过滤(查 opportunity.source_lead_id)留商机侧 - 验证:crm-lead 119 + crm-opportunity 165 全绿master
10 changed files with 102 additions and 61 deletions
@ -0,0 +1,26 @@ |
|||
package com.crm.lead.port.inbound; |
|||
|
|||
import java.util.List; |
|||
|
|||
/** |
|||
* 可转商机候选线索目录入站端口(票 12 数据源 / Candidate #2:商机侧消费的窄查询契约)。 |
|||
* |
|||
* <p>商机侧新建入口(oppSource=线索转入)的【关联线索】下拉数据源。此前商机侧 import |
|||
* 线索域宽服务接口 {@code ILeadService}(20+ 方法)仅为此一处查询——本端口把契约收窄到 |
|||
* 单方法,宽接口退回线索域内部(ADR-0031,对称 {@code port/outbound} 的 |
|||
* {@code OpportunityCreationPort}:出站契约 lead 声明他域实现,入站契约本域实现他域调用)。</p> |
|||
* |
|||
* <p>职责边界(同 ADR-0025):准入 = 归属用户名下 {@code status IN (已领取 3 / 跟进中 4)} |
|||
* (与转商机前置对称,线索域判定);「未被商机占用」过滤由商机侧补(本端口不知 |
|||
* opportunity 表)。</p> |
|||
*/ |
|||
public interface ConvertibleLeadCatalogPort { |
|||
|
|||
/** |
|||
* 列出该用户可关联到商机的候选线索。 |
|||
* |
|||
* @param ownerUserId 归属用户 id(商机侧传当前登录人) |
|||
* @return 轻量投影(id/名称/电话),无候选时返回空列表 |
|||
*/ |
|||
List<ConvertibleLeadView> listConvertibleLeads(Long ownerUserId); |
|||
} |
|||
@ -1,11 +1,13 @@ |
|||
package com.crm.lead.domain.dto; |
|||
package com.crm.lead.port.inbound; |
|||
|
|||
/** |
|||
* 可转商机候选线索视图(票 12:商机侧新建入口「关联线索」下拉数据源)。 |
|||
* |
|||
* <p>轻量投影,仅够下拉展示 + 回填:线索 id + 名称 + 电话。候选准入 |
|||
* (status IN 已领取/跟进中)由 {@code ILeadService.listConvertibleLeads} 在线索域判定; |
|||
* 「未被商机占用」过滤由商机侧补(查 opportunity.source_lead_id)。</p> |
|||
* (status IN 已领取/跟进中)由 {@link ConvertibleLeadCatalogPort} 在线索域判定; |
|||
* 「未被商机占用」过滤由商机侧补(查 opportunity.source_lead_id)。 |
|||
* 随端口同包(ADR-0031,对称 port/outbound 契约 cmd/exception 同包先例)—— |
|||
* 本包类型是线索域对商机侧发布的契约面,商机侧不得 import 线索域 service/domain 内部包。</p> |
|||
* |
|||
* @param id 线索 id(回填 source_lead_id) |
|||
* @param leadName 线索名称(下拉展示) |
|||
@ -0,0 +1,36 @@ |
|||
package com.crm.lead.port.inbound.impl; |
|||
|
|||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
|||
import com.crm.lead.constant.LeadConstants; |
|||
import com.crm.lead.domain.entity.Lead; |
|||
import com.crm.lead.mapper.LeadMapper; |
|||
import com.crm.lead.port.inbound.ConvertibleLeadCatalogPort; |
|||
import com.crm.lead.port.inbound.ConvertibleLeadView; |
|||
import lombok.RequiredArgsConstructor; |
|||
import org.springframework.stereotype.Service; |
|||
|
|||
import java.util.List; |
|||
|
|||
/** |
|||
* 可转商机候选线索目录端口实现(逻辑自 {@code LeadServiceImpl.listConvertibleLeads} |
|||
* 原样迁入,票 12 口径不变:归属 + status IN (已领取 3 / 跟进中 4))。 |
|||
* |
|||
* <p>窄查询契约的实现(ADR-0031):直查 {@code LeadMapper},不复用宽服务接口; |
|||
* 「未被商机占用」过滤留商机侧(本实现不知 opportunity 表)。</p> |
|||
*/ |
|||
@Service |
|||
@RequiredArgsConstructor |
|||
public class ConvertibleLeadCatalogPortImpl implements ConvertibleLeadCatalogPort { |
|||
|
|||
private final LeadMapper leadMapper; |
|||
|
|||
@Override |
|||
public List<ConvertibleLeadView> listConvertibleLeads(Long ownerUserId) { |
|||
List<Lead> leads = leadMapper.selectList(new LambdaQueryWrapper<Lead>() |
|||
.eq(Lead::getOwnerUserId, ownerUserId) |
|||
.in(Lead::getStatus, LeadConstants.STATUS_CLAIMED, LeadConstants.STATUS_FOLLOWING)); |
|||
return leads.stream() |
|||
.map(l -> new ConvertibleLeadView(l.getId(), l.getLeadName(), l.getPhone())) |
|||
.toList(); |
|||
} |
|||
} |
|||
Loading…
Reference in new issue