找客任务跑过,不等于销售已经拿到新机会
销售在意的是客户来源:这轮找客看了什么,哪里遇到问题,哪些材料值得继续核实。开发者还需要另一层信息:任务是否执行、发生了什么事件、怎样查到对应时段。把两层记录混在一起,容易把“任务有消息”误读成“新客户来了”。
星河卓越旗下意客AI按业务寻找匹配的公开需求,整理原文、出处和匹配依据供销售开发。本文分析其中执行记录页面的实际前端代码:它帮助查看运行过程,销售线索的业务判断仍要回到需求原文。这里讨论的是代码实现与构造输入,不是客户使用效果或线上长期运行验收。
一、先过滤,再分页
TaskEvents.tsx按平台和发生日期筛选run.events,随后调用pageItems。顺序很关键:如果先切出当前页再筛选,用户看到的只是“这一页的匹配记录”,总页数也会失真。
constevents=(run.events||[]).filter((event)=>!invalid&&(!platform||event.platform===platform)&&inDateRange(event.occurredAt,from,to),);constpages=pageItems(events,page,size);没有选择平台时保留所有平台;选择以后按相等关系匹配。页面还区分两种空状态:任务没有运行记录,或已有记录但当前条件没有匹配项。前者等待执行服务返回阶段和事件;后者应该调整筛选。两者需要给读者不同的下一步。
二、日期筛选要包含结束日
实际日期函数来自listState.ts:
exportfunctioninDateRange(value:string|null|undefined,from:string,to:string,){if(!from&&!to)returntrue;consttimestamp=Date.parse(value||"");if(!Number.isFinite(timestamp))returnfalse;conststart=from?newDate(`${from}T00:00:00`).getTime():-Infinity;constend=to?newDate(`${to}T23:59:59.999`).getTime():Infinity;returntimestamp>=start&×tamp<=end;}把结束日期设到当天23:59:59.999,可以保留当晚事件。如果只用当天00:00作为上界,销售选择“查看今天”时,几乎整天都会被漏掉。只有开始日期时不设上界,只有结束日期时不设下界。
这段代码还有一个明确取舍:没有日期条件时直接返回true,即使事件时间缺失也保留;一旦开启日期筛选,无法解析的时间会被排除。因此“全部记录”和“某天记录”的数量可能不同,不能把差额直接解释成记录丢失。
日期边界没有带时区偏移,使用浏览器本地时区。跨时区团队需要先约定看本地日还是统一业务日;不能只给界面加一个“北京时间”标签,就认为底层计算已转换。
三、筛选改变后回到第一页
页面在平台、起止日期或任务ID变化时重置页码。假如用户正在第4页,筛选后只剩2页,继续沿用第4页会产生不必要的空屏。
useEffect(()=>setPage(1),[platform,from,to,run.id]);pageItems进一步把请求页码限制在有效范围,并让空列表仍有一个可表示的第一页。以23条记录、每页10条为构造示例,请求第9页会落在第3页,返回最后3条;请求第0页会回到第1页。这里的分页是已加载数组的客户端切片,不代表服务端历史记录已经全部拉取。
四、事件级别不能冒充机会级别
页面把error显示为“错误”,warning显示为“提醒”,其余有级别的事件显示为“信息”。这个“提醒”是执行事件的严重程度,不是销售机会通知,也不能证明到期跟进提醒或桌面推送已接通。
开发者做获客产品时,最好分别回答两个问题:任务页面帮助查清运行过程;线索页面帮助核对客户需求、匹配原因和下一步。意客承担寻找与整理的价值,要通过可核对的需求材料交给销售,而不是用运行日志的数量代替线索数量。
可以直接用于评审的四个检查
- 平台筛选发生在分页之前吗?
- 当天结束时刻的记录会被保留吗?缺失日期如何处理?
- 筛选或任务改变后,页码是否回到有效位置?
- 执行警告、新增线索和跟进计划是否有各自清楚的含义?
来源:意客桌面端TaskEvents.tsx与listState.ts的当前源码。本文不展示客户资料,不把构造输入作为客户成果。
意客AI产品团队|星河卓越