From 99adb3dfc1252b0b625864bd86d50921ec8652c2 Mon Sep 17 00:00:00 2001 From: xiaoqu-ai Date: Tue, 20 Oct 2026 18:29:06 +0800 Subject: [PATCH] =?UTF-8?q?feat(mcp):=20properties=20=E6=B5=81=E5=AF=BC?= =?UTF-8?q?=E5=87=BA=E7=89=A9=E4=B8=9A=E6=89=80=E5=B1=9E=E9=94=80=E5=94=AE?= =?UTF-8?q?=20sale=5Fuser=5Fid=20/=20sale=5Fuser=5Fname?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 物业表的所属销售列是 userId / userName(实体未映射),此前一直取不到。 - ProperytMapper.selectPropertyOwners:显式 SQL 按 id 批量取 userId/userName - PropertiesSyncEntity 批量富化,**独立查询 + try/catch 容错**:列名或数据异常 只丢归属,不影响 properties 变更流 - 流字段:sale_user_id / sale_user_name(缺失时回落到 create_id) 依据:PermissionService.resolveRowScope 用 properyt.create_id=user.id 判定销售可见物业, 说明物业归属销售;本次直接取物业表的 userId 列,命中即为该物业的所属销售。 --- .../iiv/agent/mapper/m0/ProperytMapper.java | 48 ++++++++++++------- .../agent/mcp/sync/PropertiesSyncEntity.java | 41 ++++++++++++++-- .../iiv/agent/mcp/sync/SyncChangeSchemas.java | 3 +- 3 files changed, 72 insertions(+), 20 deletions(-) diff --git a/xiaoqu-agent-service/src/main/java/me/iiv/agent/mapper/m0/ProperytMapper.java b/xiaoqu-agent-service/src/main/java/me/iiv/agent/mapper/m0/ProperytMapper.java index 62830dc..224c8f7 100644 --- a/xiaoqu-agent-service/src/main/java/me/iiv/agent/mapper/m0/ProperytMapper.java +++ b/xiaoqu-agent-service/src/main/java/me/iiv/agent/mapper/m0/ProperytMapper.java @@ -1,16 +1,32 @@ -package me.iiv.agent.mapper.m0; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import me.iiv.agent.entity.m0.Properyt; - -/** - *

- * 物业表 Mapper 接口 - *

- * - * @author codegen - * @since 2026-09-08 - */ -public interface ProperytMapper extends BaseMapper { - -} +package me.iiv.agent.mapper.m0; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import me.iiv.agent.entity.m0.Properyt; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 物业表 Mapper 接口 + *

+ * + * @author codegen + * @since 2026-09-08 + */ +public interface ProperytMapper extends BaseMapper { + + /** + * 按 id 批量取物业的"所属销售"。 + * + *

来源是物业表的 userId / userName 两列(实体未映射,故用显式 SQL)。 + * 独立查询 + 调用方容错:列名或数据异常只丢归属,不影响 properties 变更流。

+ */ + @Select("") + List> selectPropertyOwners(@Param("ids") List ids); +} diff --git a/xiaoqu-agent-service/src/main/java/me/iiv/agent/mcp/sync/PropertiesSyncEntity.java b/xiaoqu-agent-service/src/main/java/me/iiv/agent/mcp/sync/PropertiesSyncEntity.java index 7e1dcd3..a7a0491 100644 --- a/xiaoqu-agent-service/src/main/java/me/iiv/agent/mcp/sync/PropertiesSyncEntity.java +++ b/xiaoqu-agent-service/src/main/java/me/iiv/agent/mcp/sync/PropertiesSyncEntity.java @@ -64,22 +64,57 @@ public class PropertiesSyncEntity extends AbstractSyncEntity implements SyncEnti agents.put(agent.getId(), agent); } } + // 物业"所属销售":优先物业表 userId/userName(实体未映射,独立查询 + 容错)。 + Map ownerIds = new java.util.HashMap<>(); + Map ownerNames = new java.util.HashMap<>(); + try { + List ids = new java.util.ArrayList<>(); + for (Properyt row : list) { + if (row.getId() != null) { + ids.add(row.getId()); + } + } + if (!ids.isEmpty()) { + for (Map owner : properytMapper.selectPropertyOwners(ids)) { + Object pid = owner.get("property_id"); + if (pid == null) { + continue; + } + Long propertyId = Long.valueOf(String.valueOf(pid)); + Object uid = owner.get("user_id"); + Object uname = owner.get("user_name"); + if (uid != null) { + ownerIds.put(propertyId, String.valueOf(uid)); + } + if (uname != null) { + ownerNames.put(propertyId, String.valueOf(uname)); + } + } + } + } catch (Exception enrichmentError) { + // 列名/权限异常时只丢归属,不能让整条 properties 流失败。 + org.slf4j.LoggerFactory.getLogger(PropertiesSyncEntity.class) + .warn("物业所属销售富化失败,跳过归属: {}", enrichmentError.getMessage()); + } List rows = new ArrayList<>(); for (Properyt row : list) { long mt = ChangesEngine.effectiveTs(row.getModifyTime(), row.getCreateTime()); - rows.add(new SyncRow(toItem(row, mt, agents.get(row.getAgentId())), mt, row.getId())); + rows.add(new SyncRow(toItem(row, mt, agents.get(row.getAgentId()), + ownerIds.get(row.getId()), ownerNames.get(row.getId())), mt, row.getId())); } return rows; } - private Map toItem(Properyt row, long mt, me.iiv.agent.entity.m0.Agent agent) { + private Map toItem(Properyt row, long mt, me.iiv.agent.entity.m0.Agent agent, + String ownerUserId, String ownerUserName) { boolean deleted = row.getSoftDelete() != null && row.getSoftDelete() == 1; Date effective = row.getModifyTime() != null ? row.getModifyTime() : row.getCreateTime(); return SyncChangeSchemas.toMap(new SyncChangeSchemas.PropertyChange( stableId(row.getId()), row.getCustomerId(), row.getName(), row.getJinideName(), row.getIdentificationNumber(), row.getSerialnumber(), stableId(row.getSupervisorId()), stableId(row.getAgentId()), - stableId(row.getCreateId()), + ownerUserId == null ? stableId(row.getCreateId()) : ownerUserId, + ownerUserName, agent == null ? null : stableId(agent.getSaleId()), agent == null ? null : agent.getSaleName(), deleted ? "INACTIVE" : "ACTIVE", diff --git a/xiaoqu-agent-service/src/main/java/me/iiv/agent/mcp/sync/SyncChangeSchemas.java b/xiaoqu-agent-service/src/main/java/me/iiv/agent/mcp/sync/SyncChangeSchemas.java index cf2d606..03d2617 100644 --- a/xiaoqu-agent-service/src/main/java/me/iiv/agent/mcp/sync/SyncChangeSchemas.java +++ b/xiaoqu-agent-service/src/main/java/me/iiv/agent/mcp/sync/SyncChangeSchemas.java @@ -49,7 +49,8 @@ final class SyncChangeSchemas { @JsonProperty("external_customer_no") String externalCustomerNo, @JsonProperty("supervisor_id") String supervisorId, @JsonProperty("agent_id") String agentId, - @JsonProperty("create_id") String createId, + @JsonProperty("sale_user_id") String saleUserId, + @JsonProperty("sale_user_name") String saleUserName, @JsonProperty("sale_id") String saleId, @JsonProperty("sale_name") String saleName, String status,