最近给客户部署了一套标准版,因为需要对接他们已有系统实现订单查询,发线一个问题,当给商品添加了自定义字段,然后通过/outapi/order/list这个接口,将自定义字段作为查询条件的时候会出现随便输入一个字符串就会显示订单的情况,通过咨询AI得出以下结论:
根因
/outapi/order/list 的链路是:route.php → StoreOrder/lst() → OutStoreOrderServices::getOrderList() → DAO 的 withSearch($where)。ThinkPHP 的 withSearch 只会应用模型上存在 searchXXXAttr 搜索器的字段,而 app/model/order/StoreOrder.php 里没有 searchCustomFormAttr,所以 custom_form 参数被静默忽略——不管你传什么,接口都在返回全量订单列表。
已做的两处修改
1. app/outapi/controller/StoreOrder.php — lst() 方法
- 参数表里加了
['custom_form', '']; - 强制校验:不传或为空 → 直接返回“请传入 custom_form 参数”,不再吐全量数据;超过 100 字符也拒绝。
2. app/model/order/StoreOrder.php — 新增 searchCustomFormAttr 搜索器
- 数据库里
custom_form是 JSON 串([{"title":"通知书号","value":"TZS001"},...]),用带双引号的完整值做 LIKE 匹配(如%"TZS001"%),引号就是边界,所以: - 同时兼容中文原样存储和
\uXXXX转义存储两种 JSON 格式,并转义了%/_防止 LIKE 通配符绕过完全匹配。
count 统计走同一个搜索器,分页数量也是过滤后的,无需改 Service 层。
crmeb\app\outapi\controller\StoreOrder.php

crmeb\app\model\order\StoreOrder.php


