diff --git a/xiaoqu-agent-service/doc/agent-mcp-tools-reference.md b/xiaoqu-agent-service/doc/agent-mcp-tools-reference.md
index 6f165a4..d643a6f 100644
--- a/xiaoqu-agent-service/doc/agent-mcp-tools-reference.md
+++ b/xiaoqu-agent-service/doc/agent-mcp-tools-reference.md
@@ -197,6 +197,88 @@
---
+## 7. mall.order.list.query
+
+查询商城订单列表(分页),对应老系统 `POST /mallGoodsOrder/listByPage`。
+
+- 分类:customer | 类型:读
+- 数据来源:m1 商城库(`xiaoqu_mall_d`)`mall_goods_order` 表
+- 行级权限(`PermissionService.applyOrderRowFilter`,移植老接口 `WrapperUtils.getSaleCompany` 语义):
+ - 总部(isagent=0):全部;
+ - 代理商(isagent=1):`sale_company_id IN (自己 + 直属下级 + warehouse_agent_auth 代管代理)`,有代管物业授权时再 `OR property_id IN (agent_manage_district_auth 代管物业)`;
+ - 销售部门非负责人:`property_id IN (自己创建的物业 + 代管代理名下物业)`,与上一条互斥。
+
+**入参**:
+
+| 参数 | 类型 | 必填 | 说明 |
+|---|---|---|---|
+| orderNo | string | 否 | 订单编号,模糊匹配 |
+| agentId | number | 否 | 代理商 id,精确匹配 |
+| propertyId | number | 否 | 物业 id,精确匹配 |
+| orderType | number | 否 | 订单类型:0=代理 1=物业 |
+| orderState | number | 否 | 订单状态(单选):0=待付款 1=待出库 2=待发货 3=已发货 4=已签收 5=已收货 6=已取消 7=已删除 |
+| payState | number | 否 | 回款状态:0=待付款 1=已付款 2=付款中 |
+| startOrderTime | string | 否 | 下单时间起,`yyyy-MM-dd` |
+| endOrderTime | string | 否 | 下单时间止,`yyyy-MM-dd`(含当天) |
+| page | number | 否 | 页码,从 1 开始,默认 1 |
+| rows | number | 否 | 每页条数,默认 20,上限 100(超出截断为 100 并在 notice 提示) |
+
+**出参 records 字段**(按 id 倒序):
+
+| 字段 | 说明 |
+|---|---|
+| id / orderNo / orderTime | 订单 id / 编号 / 下单时间(`yyyy-MM-dd HH:mm:ss`) |
+| orderType / agentName / propertyName | 订单类型 / 代理名称 / 物业名称 |
+| saleCompany | 销售公司 |
+| payMoney / paidMoney / unPayMoney | 应付 / 已付 / 未付金额 |
+| orderState / payState / warehouseState | 订单状态 / 回款状态 / 出库状态(0=未出库 1=已出库 2=部分出库) |
+| customerName | 客户名称:orderType=0 取代理金蝶名称,否则取物业金蝶名称(批量富化,同老接口) |
+
+---
+
+## 8. mall.order.detail.query
+
+按订单号查询商城订单详情(订单 + 商品明细 + 收货地址一次返回,合并老系统三个接口)。
+
+- 分类:customer | 类型:读
+- 数据来源:m1 库 `mall_goods_order` + `mall_order_details` + `mall_shipping_address`
+- 行级权限:与 `mall.order.list.query` 一致;订单不存在或无权查看时 `record=null` 并在 notice 说明(两者不区分,不泄露订单是否存在)。
+
+**入参**:
+
+| 参数 | 类型 | 必填 | 说明 |
+|---|---|---|---|
+| orderNo | string | 是 | 订单编号 |
+
+**出参**:
+
+- `record`:订单关键字段(金额类 payMoney/paidMoney/unPayMoney/totalMoney/goodsMoney/postageMoney/discountMoney,状态类 orderState/payState/orderPayState/warehouseState/orderInvoiceState,时间类 orderTime/payTime/receiptTime/signTime/createTime,及 accountsType/paymentType/goodsType/saleCompany/payNo/memo 等)+ 收货信息(reveiveName/reveiveNumber/province/city/countyseat/address,由 `address_id` 关联 `mall_shipping_address`)。
+- `items`:商品明细列表,每行含 spuNo/spuName/skuNo/count/price/payMoney/payState/warehouseState。
+
+---
+
+## 9. mall.order.logistics.query
+
+按订单号查询商城订单物流(发货信息 + 物流轨迹),对应老系统 `GET /mallGoodsOrder/getMallLogistics`。
+
+- 分类:customer | 类型:读
+- 数据来源:m1 库 `mall_order_logistics` + `mall_order_logistics_detai`
+- 行级权限:与 `mall.order.list.query` 一致;订单不存在或无权查看时 `logistics=null` 并在 notice 说明(两者不区分)。
+- **注意**:轨迹表 `logistics_order_no` 字段老系统写入时塞的是订单号而非快递单号,故按 orderNo 查询(照搬老系统语义)。物流轨迹为系统内业务节点手工写入的记录,非实时快递查询,可能不全(菜鸟定时同步已停用)。
+
+**入参**:
+
+| 参数 | 类型 | 必填 | 说明 |
+|---|---|---|---|
+| orderNo | string | 是 | 订单编号 |
+
+**出参**:
+
+- `logistics`(无物流记录时为 null):logisticsName(快递公司)/ logisticsOrderNo(快递单号)/ sendMode(0=快递 1=自送)/ state(0=已出单 1=已出库 2=已发货 3=已揽件 4=运输中 5=待取件 6=派送中 7=已签收)/ deliverName / deliverNumber / sendTime / receivingGoodsName / reveiveName / reveiveNumber / address。
+- `tracks`:轨迹列表,按时间正序,每行含 memo(轨迹描述)/ state / picList / createTime。
+
+---
+
## 附录:在线查看工具清单
```bash
diff --git a/xiaoqu-agent-service/sql/seed-dev.sql b/xiaoqu-agent-service/sql/seed-dev.sql
index 9a6bb82..a1aa9b1 100644
--- a/xiaoqu-agent-service/sql/seed-dev.sql
+++ b/xiaoqu-agent-service/sql/seed-dev.sql
@@ -15,9 +15,10 @@ SELECT '运营', 'operation', 'dev 种子:运营作用域', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM agent_scope WHERE code = 'operation');
-- 作用域-工具:sys.ping / agent.count / agent.list.query / property.list.query / agent.detail.query / property.detail.query
+-- / mall.order.list.query / mall.order.detail.query / mall.order.logistics.query
INSERT INTO scope_tool (scope_id, tool_id, create_id)
SELECT s.id, t.id, 0 FROM agent_scope s JOIN tool t
-WHERE s.code = 'operation' AND t.name IN ('sys.ping', 'agent.count', 'agent.list.query', 'property.list.query', 'agent.detail.query', 'property.detail.query')
+WHERE s.code = 'operation' AND t.name IN ('sys.ping', 'agent.count', 'agent.list.query', 'property.list.query', 'agent.detail.query', 'property.detail.query', 'mall.order.list.query', 'mall.order.detail.query', 'mall.order.logistics.query')
AND NOT EXISTS (SELECT 1 FROM scope_tool st WHERE st.scope_id = s.id AND st.tool_id = t.id);
COMMIT;
diff --git a/xiaoqu-agent-service/src/main/java/me/iiv/agent/entity/m1/MallGoodsOrder.java b/xiaoqu-agent-service/src/main/java/me/iiv/agent/entity/m1/MallGoodsOrder.java
new file mode 100644
index 0000000..aad9b2c
--- /dev/null
+++ b/xiaoqu-agent-service/src/main/java/me/iiv/agent/entity/m1/MallGoodsOrder.java
@@ -0,0 +1,248 @@
+package me.iiv.agent.entity.m1;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ *
+ * 订单(m1 商城库)
+ *
+ *
+ * @author codegen
+ * @since 2026-09-09
+ */
+@Getter
+@Setter
+@ToString
+@TableName("mall_goods_order")
+public class MallGoodsOrder implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @TableId(value = "id", type = IdType.AUTO)
+ private Long id;
+
+ /** 销售id */
+ private Long createId;
+
+ /** 创建时间 */
+ private Date createTime;
+
+ /** 修改id */
+ private Long modifyId;
+
+ /** 修改时间 */
+ private Date modifyTime;
+
+ /** 数据状态(0:启用,99:停用) */
+ private Integer softDelete;
+
+ /** 代理ID */
+ private Long agentId;
+
+ /** 物业ID */
+ private Long propertyId;
+
+ /** 站点ID */
+ private Long districtId;
+
+ /** 客户ID */
+ private Long userId;
+
+ /** 订单编号 */
+ private String orderNo;
+
+ /** 订单类型(0:代理;1:物业) */
+ private Integer orderType;
+
+ /** 结账类型(0:预付;1:月结) */
+ private Integer accountsType;
+
+ /** 支付方式 */
+ private Integer paymentType;
+
+ /** 收货地址 */
+ private Long addressId;
+
+ /** 订单状态(0:待付款;1:待出库;2:待发货;3:已发货;4:已签收;5:已收货;6:已取消;7:已删除) */
+ private Integer orderState;
+
+ /** 支付金额 */
+ private BigDecimal payMoney;
+
+ /** 已支付金额 */
+ private BigDecimal paidMoney;
+
+ /** 未支付金额 */
+ private BigDecimal unPayMoney;
+
+ /** 回款状态(0:待付款;1:已付款;2:付款中) */
+ private Integer payState;
+
+ /** 付款付款确认状态(0:未确认;1:已确认;2:延迟确认) */
+ private Integer orderPayState;
+
+ /** 退款状态(0:待退款;1:退款成功;2:退款失败;99:未知) */
+ private Integer rePayState;
+
+ /** 发票状态(0:未开票;1:已开票;2:部分开票) */
+ private Integer orderInvoiceState;
+
+ /** 订单有效时长(小时) */
+ private Integer effectiveTime;
+
+ /** 退款原因 */
+ private String reMemo;
+
+ /** 邮费 */
+ private BigDecimal postageMoney;
+
+ /** 订单备注 */
+ private String memo;
+
+ /** 应支付总金额 */
+ private BigDecimal totalMoney;
+
+ /** 商品金额 */
+ private BigDecimal goodsMoney;
+
+ /** 支付编号 */
+ private String payNo;
+
+ /** 下单时间 */
+ private Date orderTime;
+
+ /** 实际回款时间 */
+ private Date payTime;
+
+ /** 收货时间 */
+ private Date receiptTime;
+
+ /** 签收时间 */
+ private Date signTime;
+
+ /** 商品类型(0:非月结商品;1:月结商品) */
+ private Integer goodsType;
+
+ /** 账单编号(月结商品有) */
+ private String billNo;
+
+ /** 付款识别号(线下付款) */
+ private String payIdentifier;
+
+ /** 如果自行配送则有值 */
+ private String mobile;
+
+ /** 特许状态(0:未特许;1:已特许) */
+ private Integer franchiseState;
+
+ /** 优惠金额 */
+ private BigDecimal discountMoney;
+
+ /** 活动名称 */
+ private String activityName;
+
+ /** 活动编号 */
+ private String activityNo;
+
+ /** 促销编号 */
+ private String schemeNo;
+
+ /** 出库状态(0:未出库;1:已出库;2:部分出库) */
+ private Integer warehouseState;
+
+ /** 预订单编号 */
+ private String beforehandOrderNo;
+
+ /** 锁定状态(0:未锁定;1:已锁定) */
+ private Integer lockState;
+
+ /** 预订单下单人 */
+ private String placingPeople;
+
+ /** 预订单下单人 */
+ private Long placingPeopleId;
+
+ /** 代理 */
+ private String agentName;
+
+ /** 物业 */
+ private String propertyName;
+
+ /** 站点 */
+ private String districtName;
+
+ /** 下单人 */
+ private String userName;
+
+ /** 销售名称 */
+ private String createName;
+
+ /** 原始应支付金额 */
+ private BigDecimal originalPayMoney;
+
+ /** 逾期标识0:否;1:是 */
+ private Integer overdueFlag;
+
+ /** 逾期天数 */
+ private Integer overdueDays;
+
+ /** 回款周期(天) */
+ private Integer paymentCollection;
+
+ /** 最晚应回款时间 */
+ private Date lastPayTime;
+
+ /** 出库日期 */
+ private Date deliveryDate;
+
+ /** 金蝶系统内码 */
+ private Long jindieInternalId;
+
+ /** 金蝶系统采购订单内码 */
+ private Long jindiePurchaseInternalId;
+
+ /** 销售公司 */
+ private Long saleCompanyId;
+
+ /** 销售公司 */
+ private String saleCompany;
+
+ /** 发货公司 */
+ private Long deliveryCompanyId;
+
+ /** 发货公司 */
+ private String deliveryCompany;
+
+ /** 已开票金额 */
+ private BigDecimal invoiceMoney;
+
+ /** 未开票金额 */
+ private BigDecimal unInvoiceMoney;
+
+ /** 金蝶销售服务订单内码 */
+ private Long jindieServiceOrderInternalId;
+
+ /** 服务订单状态(0:未处理;1:已处理;2:无需处理) */
+ private Integer serviceOrderState;
+
+ /** 微店订单标识(0:否;1:是) */
+ private Integer weiDianOrderFlag;
+
+ /** 微店订单编号 */
+ private String weiDianOrderNo;
+
+ /** 装机单标识(0:否;1:是) */
+ private Integer installOrderFlag;
+
+ /** 营销状态(0:未营销;1:部分营销;2:已营销) */
+ private Integer marketingState;
+}
diff --git a/xiaoqu-agent-service/src/main/java/me/iiv/agent/entity/m1/MallOrderDetails.java b/xiaoqu-agent-service/src/main/java/me/iiv/agent/entity/m1/MallOrderDetails.java
new file mode 100644
index 0000000..457536a
--- /dev/null
+++ b/xiaoqu-agent-service/src/main/java/me/iiv/agent/entity/m1/MallOrderDetails.java
@@ -0,0 +1,118 @@
+package me.iiv.agent.entity.m1;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ *
+ * 订单商品详情(m1 商城库)
+ *
+ *
+ * @author codegen
+ * @since 2026-09-09
+ */
+@Getter
+@Setter
+@ToString
+@TableName("mall_order_details")
+public class MallOrderDetails implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @TableId(value = "id", type = IdType.AUTO)
+ private Long id;
+
+ /** 创建id */
+ private Long createId;
+
+ /** 创建时间 */
+ private Date createTime;
+
+ /** 修改id */
+ private Long modifyId;
+
+ /** 修改时间 */
+ private Date modifyTime;
+
+ /** 数据状态(0:启用,99:停用) */
+ private Integer softDelete;
+
+ /** spu编号 */
+ private String spuNo;
+
+ /** sku编号 */
+ private String skuNo;
+
+ /** 购买数量 */
+ private Integer count;
+
+ /** 单价 */
+ private BigDecimal price;
+
+ /** 折扣 */
+ private Double discount;
+
+ /** 订单编号 */
+ private String orderNo;
+
+ /** 商品类型(0:非月结商品;1:月结商品) */
+ private Integer goodsType;
+
+ /** sku标签 */
+ private String skuLable;
+
+ /** 商品描述 */
+ private String skuDesc;
+
+ /** 封面路径 */
+ private String picUrl;
+
+ /** spu名称 */
+ private String spuName;
+
+ /** 物料类型(0:设备;1:配件;2:耗材);历史遗留驼峰列名 */
+ @TableField("spuType")
+ private Integer spuType;
+
+ /** 出库状态(0:未出库;1:已出库) */
+ private Integer warehouseState;
+
+ /** 出库单ID */
+ private Long warehouseOutId;
+
+ /** 原始单价 */
+ private BigDecimal originalPrice;
+
+ /** 原始购买数量 */
+ private Integer originalCount;
+
+ /** 收款状态(0:未收款;1:全部收款;2:部分收款) */
+ private Integer payState;
+
+ /** 发票状态(0:未开票;1:全部开票;2:部分开票) */
+ private Integer orderInvoiceState;
+
+ /** 应支付金额 */
+ private BigDecimal payMoney;
+
+ /** 应开票金额 */
+ private BigDecimal invoiceMoney;
+
+ /** 未支付金额 */
+ private BigDecimal notPayMoney;
+
+ /** 未开票金额 */
+ private BigDecimal notInvoiceMoney;
+
+ /** 营销状态(0:未营销;1:营销中;2:已营销) */
+ private Integer marketingState;
+}
diff --git a/xiaoqu-agent-service/src/main/java/me/iiv/agent/entity/m1/MallOrderLogistics.java b/xiaoqu-agent-service/src/main/java/me/iiv/agent/entity/m1/MallOrderLogistics.java
new file mode 100644
index 0000000..ef4584c
--- /dev/null
+++ b/xiaoqu-agent-service/src/main/java/me/iiv/agent/entity/m1/MallOrderLogistics.java
@@ -0,0 +1,93 @@
+package me.iiv.agent.entity.m1;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ *
+ * 订单物流(m1 商城库)
+ *
+ *
+ * @author codegen
+ * @since 2026-09-09
+ */
+@Getter
+@Setter
+@ToString
+@TableName("mall_order_logistics")
+public class MallOrderLogistics implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @TableId(value = "id", type = IdType.AUTO)
+ private Long id;
+
+ /** 订单发货人 */
+ private Long createId;
+
+ /** 创建时间 */
+ private Date createTime;
+
+ /** 修改id */
+ private Long modifyId;
+
+ /** 发货时间 */
+ private Date modifyTime;
+
+ /** 数据状态(0:启用,99:停用) */
+ private Integer softDelete;
+
+ /** 发货方式(0:快递公司;1:自行派送) */
+ private Integer sendMode;
+
+ /** 订单编号 */
+ private String orderNo;
+
+ /** 物流公司id */
+ private Long logisticsId;
+
+ /** 物流公司编号 */
+ private String logisticsNo;
+
+ /** 物流公司名称 */
+ private String logisticsName;
+
+ /** 快递单号 */
+ private String logisticsOrderNo;
+
+ /** 自己生成的编号 */
+ private String logisticsSelfNo;
+
+ /** 派送员姓名 */
+ private String deliverName;
+
+ /** 派送手机号 */
+ private String deliverNumber;
+
+ /** 配送员id */
+ private Long userId;
+
+ /** 物流当前状态(0:已出单;1:已出库;2:已发货;3:已揽件;4:运输中;5:待取件;6:派送中;7:已签收) */
+ private Integer state;
+
+ /** 收货方公司名称 */
+ private String receivingGoodsName;
+
+ /** 收货姓名 */
+ private String reveiveName;
+
+ /** 收货手机号 */
+ private String reveiveNumber;
+
+ /** 详细地址 */
+ private String address;
+
+ private Long agentId;
+}
diff --git a/xiaoqu-agent-service/src/main/java/me/iiv/agent/entity/m1/MallOrderLogisticsDetai.java b/xiaoqu-agent-service/src/main/java/me/iiv/agent/entity/m1/MallOrderLogisticsDetai.java
new file mode 100644
index 0000000..41f5e5e
--- /dev/null
+++ b/xiaoqu-agent-service/src/main/java/me/iiv/agent/entity/m1/MallOrderLogisticsDetai.java
@@ -0,0 +1,62 @@
+package me.iiv.agent.entity.m1;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ *
+ * 订单物流轨迹(m1 商城库;表名为老系统遗留拼写 mall_order_logistics_detai)。
+ * 注意:logistics_order_no 字段在老系统写入时混用,实际存的是订单号。
+ *
+ *
+ * @author codegen
+ * @since 2026-09-09
+ */
+@Getter
+@Setter
+@ToString
+@TableName("mall_order_logistics_detai")
+public class MallOrderLogisticsDetai implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @TableId(value = "id", type = IdType.AUTO)
+ private Long id;
+
+ /** 创建id */
+ private Long createId;
+
+ /** 创建时间 */
+ private Date createTime;
+
+ /** 修改id */
+ private Long modifyId;
+
+ /** 修改时间 */
+ private Date modifyTime;
+
+ /** 数据状态(0:启用,99:停用) */
+ private Integer softDelete;
+
+ /** 快递单号(老系统写入时混用,实际多为订单号) */
+ private String logisticsOrderNo;
+
+ /** 物流详情 */
+ private String memo;
+
+ /** 物流状态(0:已出单;1:已出库;2:已发货;3:已揽件;4:运输中;5:待取件;6:派送中;7:已签收;13:上传凭证) */
+ private Integer state;
+
+ /** 订单号 */
+ private String orderNo;
+
+ /** 图片列表 */
+ private String picList;
+}
diff --git a/xiaoqu-agent-service/src/main/java/me/iiv/agent/entity/m1/MallShippingAddress.java b/xiaoqu-agent-service/src/main/java/me/iiv/agent/entity/m1/MallShippingAddress.java
new file mode 100644
index 0000000..84379aa
--- /dev/null
+++ b/xiaoqu-agent-service/src/main/java/me/iiv/agent/entity/m1/MallShippingAddress.java
@@ -0,0 +1,94 @@
+package me.iiv.agent.entity.m1;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ *
+ * 收货地址(m1 商城库)
+ *
+ *
+ * @author codegen
+ * @since 2026-09-09
+ */
+@Getter
+@Setter
+@ToString
+@TableName("mall_shipping_address")
+public class MallShippingAddress implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @TableId(value = "id", type = IdType.AUTO)
+ private Long id;
+
+ /** 创建id */
+ private Long createId;
+
+ /** 创建时间 */
+ private Date createTime;
+
+ /** 修改id */
+ private Long modifyId;
+
+ /** 修改时间 */
+ private Date modifyTime;
+
+ /** 数据状态(0:启用,99:停用) */
+ private Integer softDelete;
+
+ /** 收货姓名 */
+ private String reveiveName;
+
+ /** 收货手机号 */
+ private String reveiveNumber;
+
+ /** 客户id */
+ private Long userId;
+
+ /** 下单人 */
+ private String userName;
+
+ /** 所属站点 */
+ private Long districtId;
+
+ /** 省 */
+ private String province;
+
+ /** 市 */
+ private String city;
+
+ /** 县 */
+ private String countyseat;
+
+ /** 详细地址 */
+ private String address;
+
+ /** 备注信息 */
+ private String memo;
+
+ /** 状态 */
+ private Integer status;
+
+ /** 代理ID */
+ private Long agentId;
+
+ /** 默认标识0:否;1:是 */
+ private Integer defaultFlag;
+
+ /** 使用客户类型(0:内部人员;1:渠道商;2:直营客户) */
+ private Integer useCustomerType;
+
+ /** 使用客户ID */
+ private Long useCustomerId;
+
+ /** 使用客户名称 */
+ private String useCustomerName;
+}
diff --git a/xiaoqu-agent-service/src/main/java/me/iiv/agent/mapper/m1/MallGoodsOrderMapper.java b/xiaoqu-agent-service/src/main/java/me/iiv/agent/mapper/m1/MallGoodsOrderMapper.java
new file mode 100644
index 0000000..84699eb
--- /dev/null
+++ b/xiaoqu-agent-service/src/main/java/me/iiv/agent/mapper/m1/MallGoodsOrderMapper.java
@@ -0,0 +1,16 @@
+package me.iiv.agent.mapper.m1;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import me.iiv.agent.entity.m1.MallGoodsOrder;
+
+/**
+ *
+ * MallGoodsOrder Mapper 接口
+ *
+ *
+ * @author codegen
+ * @since 2026-09-09
+ */
+public interface MallGoodsOrderMapper extends BaseMapper {
+
+}
diff --git a/xiaoqu-agent-service/src/main/java/me/iiv/agent/mapper/m1/MallOrderDetailsMapper.java b/xiaoqu-agent-service/src/main/java/me/iiv/agent/mapper/m1/MallOrderDetailsMapper.java
new file mode 100644
index 0000000..3828aa4
--- /dev/null
+++ b/xiaoqu-agent-service/src/main/java/me/iiv/agent/mapper/m1/MallOrderDetailsMapper.java
@@ -0,0 +1,16 @@
+package me.iiv.agent.mapper.m1;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import me.iiv.agent.entity.m1.MallOrderDetails;
+
+/**
+ *
+ * MallOrderDetails Mapper 接口
+ *
+ *
+ * @author codegen
+ * @since 2026-09-09
+ */
+public interface MallOrderDetailsMapper extends BaseMapper {
+
+}
diff --git a/xiaoqu-agent-service/src/main/java/me/iiv/agent/mapper/m1/MallOrderLogisticsDetaiMapper.java b/xiaoqu-agent-service/src/main/java/me/iiv/agent/mapper/m1/MallOrderLogisticsDetaiMapper.java
new file mode 100644
index 0000000..4c59dba
--- /dev/null
+++ b/xiaoqu-agent-service/src/main/java/me/iiv/agent/mapper/m1/MallOrderLogisticsDetaiMapper.java
@@ -0,0 +1,16 @@
+package me.iiv.agent.mapper.m1;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import me.iiv.agent.entity.m1.MallOrderLogisticsDetai;
+
+/**
+ *
+ * MallOrderLogisticsDetai Mapper 接口
+ *
+ *
+ * @author codegen
+ * @since 2026-09-09
+ */
+public interface MallOrderLogisticsDetaiMapper extends BaseMapper {
+
+}
diff --git a/xiaoqu-agent-service/src/main/java/me/iiv/agent/mapper/m1/MallOrderLogisticsMapper.java b/xiaoqu-agent-service/src/main/java/me/iiv/agent/mapper/m1/MallOrderLogisticsMapper.java
new file mode 100644
index 0000000..97c6e15
--- /dev/null
+++ b/xiaoqu-agent-service/src/main/java/me/iiv/agent/mapper/m1/MallOrderLogisticsMapper.java
@@ -0,0 +1,16 @@
+package me.iiv.agent.mapper.m1;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import me.iiv.agent.entity.m1.MallOrderLogistics;
+
+/**
+ *
+ * MallOrderLogistics Mapper 接口
+ *
+ *
+ * @author codegen
+ * @since 2026-09-09
+ */
+public interface MallOrderLogisticsMapper extends BaseMapper {
+
+}
diff --git a/xiaoqu-agent-service/src/main/java/me/iiv/agent/mapper/m1/MallShippingAddressMapper.java b/xiaoqu-agent-service/src/main/java/me/iiv/agent/mapper/m1/MallShippingAddressMapper.java
new file mode 100644
index 0000000..056476b
--- /dev/null
+++ b/xiaoqu-agent-service/src/main/java/me/iiv/agent/mapper/m1/MallShippingAddressMapper.java
@@ -0,0 +1,16 @@
+package me.iiv.agent.mapper.m1;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import me.iiv.agent.entity.m1.MallShippingAddress;
+
+/**
+ *
+ * MallShippingAddress Mapper 接口
+ *
+ *
+ * @author codegen
+ * @since 2026-09-09
+ */
+public interface MallShippingAddressMapper extends BaseMapper {
+
+}
diff --git a/xiaoqu-agent-service/src/main/java/me/iiv/agent/mcp/tool/OrderTools.java b/xiaoqu-agent-service/src/main/java/me/iiv/agent/mcp/tool/OrderTools.java
new file mode 100644
index 0000000..bf86d71
--- /dev/null
+++ b/xiaoqu-agent-service/src/main/java/me/iiv/agent/mcp/tool/OrderTools.java
@@ -0,0 +1,426 @@
+package me.iiv.agent.mcp.tool;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import me.iiv.agent.entity.m0.Agent;
+import me.iiv.agent.entity.m0.Properyt;
+import me.iiv.agent.entity.m0.User;
+import me.iiv.agent.entity.m1.MallGoodsOrder;
+import me.iiv.agent.entity.m1.MallOrderDetails;
+import me.iiv.agent.entity.m1.MallOrderLogistics;
+import me.iiv.agent.entity.m1.MallOrderLogisticsDetai;
+import me.iiv.agent.entity.m1.MallShippingAddress;
+import me.iiv.agent.mapper.m0.AgentMapper;
+import me.iiv.agent.mapper.m0.ProperytMapper;
+import me.iiv.agent.mapper.m1.MallGoodsOrderMapper;
+import me.iiv.agent.mapper.m1.MallOrderDetailsMapper;
+import me.iiv.agent.mapper.m1.MallOrderLogisticsDetaiMapper;
+import me.iiv.agent.mapper.m1.MallOrderLogisticsMapper;
+import me.iiv.agent.mapper.m1.MallShippingAddressMapper;
+import me.iiv.agent.mcp.ToolObject;
+import me.iiv.agent.mcp.XqTool;
+import me.iiv.agent.permission.PermissionService;
+import me.iiv.agent.security.AuthContextHolder;
+import org.springframework.ai.tool.annotation.Tool;
+import org.springframework.ai.tool.annotation.ToolParam;
+import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
+
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeParseException;
+import java.time.format.ResolverStyle;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+/**
+ * 商城订单域工具(m1 库 xiaoqu_mall_d):仿老系统 MallGoodsOrderController。
+ * 三个工具共用 PermissionService.applyOrderRowFilter(移植 WrapperUtils.getSaleCompany 语义)。
+ */
+@Component
+public class OrderTools implements ToolObject {
+
+ private static final int DEFAULT_ROWS = 20;
+ private static final int MAX_ROWS = 100;
+ /** 商城业务时区固定 Asia/Shanghai,日期解析与时间格式化统一走该时区。 */
+ private static final ZoneId BUSINESS_ZONE = ZoneId.of("Asia/Shanghai");
+ private static final Pattern DATE_PATTERN = Pattern.compile("^\\d{4}-\\d{2}-\\d{2}$");
+ private static final DateTimeFormatter DATE_FORMATTER =
+ DateTimeFormatter.ISO_LOCAL_DATE.withResolverStyle(ResolverStyle.STRICT);
+ private static final DateTimeFormatter TIME_FORMATTER =
+ DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").withZone(BUSINESS_ZONE);
+
+ final MallGoodsOrderMapper orderMapper;
+ final MallOrderDetailsMapper orderDetailsMapper;
+ final MallShippingAddressMapper shippingAddressMapper;
+ final MallOrderLogisticsMapper logisticsMapper;
+ final MallOrderLogisticsDetaiMapper logisticsDetaiMapper;
+ final AgentMapper agentMapper;
+ final ProperytMapper properytMapper;
+ final PermissionService permissionService;
+
+ public OrderTools(MallGoodsOrderMapper orderMapper, MallOrderDetailsMapper orderDetailsMapper,
+ MallShippingAddressMapper shippingAddressMapper,
+ MallOrderLogisticsMapper logisticsMapper,
+ MallOrderLogisticsDetaiMapper logisticsDetaiMapper,
+ AgentMapper agentMapper, ProperytMapper properytMapper,
+ PermissionService permissionService) {
+ this.orderMapper = orderMapper;
+ this.orderDetailsMapper = orderDetailsMapper;
+ this.shippingAddressMapper = shippingAddressMapper;
+ this.logisticsMapper = logisticsMapper;
+ this.logisticsDetaiMapper = logisticsDetaiMapper;
+ this.agentMapper = agentMapper;
+ this.properytMapper = properytMapper;
+ this.permissionService = permissionService;
+ }
+
+ /**
+ * 订单列表,对应老接口 POST /mallGoodsOrder/listByPage。
+ * customerName 照搬老接口:orderType=0 取代理金蝶名称,否则取物业金蝶名称(批量富化,无 N+1)。
+ */
+ @XqTool(category = "customer", kind = "read")
+ @Tool(name = "mall.order.list.query", description = "查询商城订单列表(分页),数据来源 m1 商城库 mall_goods_order 表。"
+ + "行级权限:代理商身份(权限组 isagent=1)只能看自己+直属下级+授权代管代理的订单(有代管物业授权时可看对应物业订单);"
+ + "销售部门非负责人只能看自己创建及代管代理名下物业的订单;总部身份(isagent=0)可看全部。"
+ + "orderType 含义:0=代理 1=物业;orderState 含义:0=待付款 1=待出库 2=待发货 3=已发货 4=已签收 5=已收货 6=已取消 7=已删除;"
+ + "payState 含义:0=待付款 1=已付款 2=付款中;warehouseState 含义:0=未出库 1=已出库 2=部分出库。"
+ + "分页:page 从 1 开始,rows 默认 20、上限 100,超出自动截断为 100 并在返回的 notice 字段提示。"
+ + "返回 total(符合条件的总数)、records(本页记录,按 id 倒序)。")
+ public Map mallOrderListQuery(
+ @ToolParam(required = false, description = "订单编号,模糊匹配") String orderNo,
+ @ToolParam(required = false, description = "代理商 id,精确匹配") Long agentId,
+ @ToolParam(required = false, description = "物业 id,精确匹配") Long propertyId,
+ @ToolParam(required = false, description = "订单类型:0=代理 1=物业") Integer orderType,
+ @ToolParam(required = false, description = "订单状态:0=待付款 1=待出库 2=待发货 3=已发货 4=已签收 5=已收货 6=已取消 7=已删除") Integer orderState,
+ @ToolParam(required = false, description = "回款状态:0=待付款 1=已付款 2=付款中") Integer payState,
+ @ToolParam(required = false, description = "下单时间起,格式 yyyy-MM-dd") String startOrderTime,
+ @ToolParam(required = false, description = "下单时间止,格式 yyyy-MM-dd(含当天)") String endOrderTime,
+ @ToolParam(required = false, description = "页码,从 1 开始,默认 1") Integer page,
+ @ToolParam(required = false, description = "每页条数,默认 20,上限 100(超出截断为 100)") Integer rows) {
+ Date startTime = parseDate(startOrderTime, "startOrderTime");
+ Date endTimeExclusive = parseNextDayStart(endOrderTime, "endOrderTime");
+ User user = AuthContextHolder.get().getUser();
+ int pageNo = page == null || page < 1 ? 1 : page;
+ boolean truncated = rows != null && rows > MAX_ROWS;
+ int pageSize = rows == null || rows < 1 ? DEFAULT_ROWS : Math.min(rows, MAX_ROWS);
+
+ LambdaQueryWrapper wrapper = new LambdaQueryWrapper()
+ .eq(MallGoodsOrder::getSoftDelete, 0);
+ if (StringUtils.hasText(orderNo)) {
+ wrapper.like(MallGoodsOrder::getOrderNo, orderNo);
+ }
+ if (agentId != null) {
+ wrapper.eq(MallGoodsOrder::getAgentId, agentId);
+ }
+ if (propertyId != null) {
+ wrapper.eq(MallGoodsOrder::getPropertyId, propertyId);
+ }
+ if (orderType != null) {
+ wrapper.eq(MallGoodsOrder::getOrderType, orderType);
+ }
+ if (orderState != null) {
+ wrapper.eq(MallGoodsOrder::getOrderState, orderState);
+ }
+ if (payState != null) {
+ wrapper.eq(MallGoodsOrder::getPayState, payState);
+ }
+ if (startTime != null) {
+ wrapper.ge(MallGoodsOrder::getOrderTime, startTime);
+ }
+ if (endTimeExclusive != null) {
+ wrapper.lt(MallGoodsOrder::getOrderTime, endTimeExclusive);
+ }
+ permissionService.applyOrderRowFilter(wrapper, user);
+
+ Long total = orderMapper.selectCount(wrapper);
+ wrapper.select(MallGoodsOrder::getId, MallGoodsOrder::getOrderNo, MallGoodsOrder::getOrderTime,
+ MallGoodsOrder::getOrderType, MallGoodsOrder::getAgentId, MallGoodsOrder::getAgentName,
+ MallGoodsOrder::getPropertyId, MallGoodsOrder::getPropertyName,
+ MallGoodsOrder::getSaleCompany, MallGoodsOrder::getPayMoney, MallGoodsOrder::getPaidMoney,
+ MallGoodsOrder::getUnPayMoney, MallGoodsOrder::getOrderState, MallGoodsOrder::getPayState,
+ MallGoodsOrder::getWarehouseState)
+ .orderByDesc(MallGoodsOrder::getId)
+ .last("LIMIT " + (long) (pageNo - 1) * pageSize + "," + pageSize);
+ List orders = orderMapper.selectList(wrapper);
+
+ Map agentJinideNames = agentJinideNames(orders);
+ Map propertyJinideNames = propertyJinideNames(orders);
+ List