Map 搜索没有返回可信候选时,派单页面该怎么继续工作

Map 搜索没有返回可信候选时,派单页面该怎么继续工作

在维修派单页面里,地图搜索通常不是终点,而是一次业务判断的输入。用户填写"空调维修",限定3公里服务半径,再按照距离和相关性挑选服务站。理想情况下,页面拿到若干候选、距离和相关性字段,调度员确认其中一个即可派单。

现实情况没有这么整齐。认证配置可能失效,网络可能中断,候选可能为空,某些结果也可能缺少距离或相关性字段。此时最差的前端处理,是为了让页面显得完整,继续展示一组固定门店和虚构距离。调度员会把演示数据当成真实结果,后续工单从一开始就带着错误地点。

更稳妥的设计,是把"自动搜索"和"完成派单"拆成两个阶段。地图服务不可用时,页面停止自动排序,保留用户刚刚输入的关键词、半径和排序意图,转入人工确认流程。业务可以继续,数据来源也保持清楚。

搜索表单不是三个孤立控件

工程o 固定了三项输入:关键词"空调维修"、半径3公里、排序规则"距离优先,再参考相关性字段"。它们共同描述一次搜索请求,任何一项变化都应该被视为新的查询条件。

ts 复制代码
@State keyword: string = '空调维修';
@State radius: string = '3 km';
@State sortRule: string = '距离优先,再参考相关性字段';
@State requestState: string = '初始配置';
@State selectedPlace: string = '东区服务站(候选 A)';

前端常见问题是只保存最终选中的服务站,却没有保存它来自哪组查询条件。调度员修改半径后,旧候选仍留在结果区;或者切换排序规则后,列表顺序改变,已选中的卡片却没有重新确认。解决办法不是增加更多提示,而是为每次检索建立明确的输入快照。
#mermaid-svg-1hyEfWR5ejJS5mTb{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-1hyEfWR5ejJS5mTb .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-1hyEfWR5ejJS5mTb .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-1hyEfWR5ejJS5mTb .error-icon{fill:#552222;}#mermaid-svg-1hyEfWR5ejJS5mTb .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-1hyEfWR5ejJS5mTb .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-1hyEfWR5ejJS5mTb .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-1hyEfWR5ejJS5mTb .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-1hyEfWR5ejJS5mTb .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-1hyEfWR5ejJS5mTb .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-1hyEfWR5ejJS5mTb .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-1hyEfWR5ejJS5mTb .marker{fill:#333333;stroke:#333333;}#mermaid-svg-1hyEfWR5ejJS5mTb .marker.cross{stroke:#333333;}#mermaid-svg-1hyEfWR5ejJS5mTb svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-1hyEfWR5ejJS5mTb p{margin:0;}#mermaid-svg-1hyEfWR5ejJS5mTb .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-1hyEfWR5ejJS5mTb .cluster-label text{fill:#333;}#mermaid-svg-1hyEfWR5ejJS5mTb .cluster-label span{color:#333;}#mermaid-svg-1hyEfWR5ejJS5mTb .cluster-label span p{background-color:transparent;}#mermaid-svg-1hyEfWR5ejJS5mTb .label text,#mermaid-svg-1hyEfWR5ejJS5mTb span{fill:#333;color:#333;}#mermaid-svg-1hyEfWR5ejJS5mTb .node rect,#mermaid-svg-1hyEfWR5ejJS5mTb .node circle,#mermaid-svg-1hyEfWR5ejJS5mTb .node ellipse,#mermaid-svg-1hyEfWR5ejJS5mTb .node polygon,#mermaid-svg-1hyEfWR5ejJS5mTb .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-1hyEfWR5ejJS5mTb .rough-node .label text,#mermaid-svg-1hyEfWR5ejJS5mTb .node .label text,#mermaid-svg-1hyEfWR5ejJS5mTb .image-shape .label,#mermaid-svg-1hyEfWR5ejJS5mTb .icon-shape .label{text-anchor:middle;}#mermaid-svg-1hyEfWR5ejJS5mTb .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-1hyEfWR5ejJS5mTb .rough-node .label,#mermaid-svg-1hyEfWR5ejJS5mTb .node .label,#mermaid-svg-1hyEfWR5ejJS5mTb .image-shape .label,#mermaid-svg-1hyEfWR5ejJS5mTb .icon-shape .label{text-align:center;}#mermaid-svg-1hyEfWR5ejJS5mTb .node.clickable{cursor:pointer;}#mermaid-svg-1hyEfWR5ejJS5mTb .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-1hyEfWR5ejJS5mTb .arrowheadPath{fill:#333333;}#mermaid-svg-1hyEfWR5ejJS5mTb .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-1hyEfWR5ejJS5mTb .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-1hyEfWR5ejJS5mTb .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-1hyEfWR5ejJS5mTb .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-1hyEfWR5ejJS5mTb .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-1hyEfWR5ejJS5mTb .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-1hyEfWR5ejJS5mTb .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-1hyEfWR5ejJS5mTb .cluster text{fill:#333;}#mermaid-svg-1hyEfWR5ejJS5mTb .cluster span{color:#333;}#mermaid-svg-1hyEfWR5ejJS5mTb div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-1hyEfWR5ejJS5mTb .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-1hyEfWR5ejJS5mTb rect.text{fill:none;stroke-width:0;}#mermaid-svg-1hyEfWR5ejJS5mTb .icon-shape,#mermaid-svg-1hyEfWR5ejJS5mTb .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-1hyEfWR5ejJS5mTb .icon-shape p,#mermaid-svg-1hyEfWR5ejJS5mTb .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-1hyEfWR5ejJS5mTb .icon-shape .label rect,#mermaid-svg-1hyEfWR5ejJS5mTb .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-1hyEfWR5ejJS5mTb .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-1hyEfWR5ejJS5mTb .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-1hyEfWR5ejJS5mTb :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 关键词
检索条件快照
服务半径
排序规则
提交 Map 搜索
候选列表
调度员确认

输入发生变化时,旧候选应该标记为过期或直接清空,避免把两轮请求拼成一份结果。页面可以保留上次选择作为参考,但必须与当前检索结果分区显示。

结果状态至少要分成五种

一个布尔值 loading 无法描述地图检索的完整过程。前端至少要区分:初始配置、请求中、有可信候选、无候选、请求失败。若业务允许人工派单,还要增加"人工确认中"和"人工已确认"。
#mermaid-svg-qjmSqk5xNBNWbilu{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-qjmSqk5xNBNWbilu .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-qjmSqk5xNBNWbilu .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-qjmSqk5xNBNWbilu .error-icon{fill:#552222;}#mermaid-svg-qjmSqk5xNBNWbilu .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-qjmSqk5xNBNWbilu .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-qjmSqk5xNBNWbilu .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-qjmSqk5xNBNWbilu .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-qjmSqk5xNBNWbilu .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-qjmSqk5xNBNWbilu .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-qjmSqk5xNBNWbilu .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-qjmSqk5xNBNWbilu .marker{fill:#333333;stroke:#333333;}#mermaid-svg-qjmSqk5xNBNWbilu .marker.cross{stroke:#333333;}#mermaid-svg-qjmSqk5xNBNWbilu svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-qjmSqk5xNBNWbilu p{margin:0;}#mermaid-svg-qjmSqk5xNBNWbilu defs #statediagram-barbEnd{fill:#333333;stroke:#333333;}#mermaid-svg-qjmSqk5xNBNWbilu g.stateGroup text{fill:#9370DB;stroke:none;font-size:10px;}#mermaid-svg-qjmSqk5xNBNWbilu g.stateGroup text{fill:#333;stroke:none;font-size:10px;}#mermaid-svg-qjmSqk5xNBNWbilu g.stateGroup .state-title{font-weight:bolder;fill:#131300;}#mermaid-svg-qjmSqk5xNBNWbilu g.stateGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-qjmSqk5xNBNWbilu g.stateGroup line{stroke:#333333;stroke-width:1;}#mermaid-svg-qjmSqk5xNBNWbilu .transition{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-qjmSqk5xNBNWbilu .stateGroup .composit{fill:white;border-bottom:1px;}#mermaid-svg-qjmSqk5xNBNWbilu .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px;}#mermaid-svg-qjmSqk5xNBNWbilu .state-note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-qjmSqk5xNBNWbilu .state-note text{fill:black;stroke:none;font-size:10px;}#mermaid-svg-qjmSqk5xNBNWbilu .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-qjmSqk5xNBNWbilu .edgeLabel .label rect{fill:#ECECFF;opacity:0.5;}#mermaid-svg-qjmSqk5xNBNWbilu .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-qjmSqk5xNBNWbilu .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-qjmSqk5xNBNWbilu .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-qjmSqk5xNBNWbilu .edgeLabel .label text{fill:#333;}#mermaid-svg-qjmSqk5xNBNWbilu .label div .edgeLabel{color:#333;}#mermaid-svg-qjmSqk5xNBNWbilu .stateLabel text{fill:#131300;font-size:10px;font-weight:bold;}#mermaid-svg-qjmSqk5xNBNWbilu .node circle.state-start{fill:#333333;stroke:#333333;}#mermaid-svg-qjmSqk5xNBNWbilu .node .fork-join{fill:#333333;stroke:#333333;}#mermaid-svg-qjmSqk5xNBNWbilu .node circle.state-end{fill:#9370DB;stroke:white;stroke-width:1.5;}#mermaid-svg-qjmSqk5xNBNWbilu .end-state-inner{fill:white;stroke-width:1.5;}#mermaid-svg-qjmSqk5xNBNWbilu .node rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-qjmSqk5xNBNWbilu .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-qjmSqk5xNBNWbilu #statediagram-barbEnd{fill:#333333;}#mermaid-svg-qjmSqk5xNBNWbilu .statediagram-cluster rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-qjmSqk5xNBNWbilu .cluster-label,#mermaid-svg-qjmSqk5xNBNWbilu .nodeLabel{color:#131300;}#mermaid-svg-qjmSqk5xNBNWbilu .statediagram-cluster rect.outer{rx:5px;ry:5px;}#mermaid-svg-qjmSqk5xNBNWbilu .statediagram-state .divider{stroke:#9370DB;}#mermaid-svg-qjmSqk5xNBNWbilu .statediagram-state .title-state{rx:5px;ry:5px;}#mermaid-svg-qjmSqk5xNBNWbilu .statediagram-cluster.statediagram-cluster .inner{fill:white;}#mermaid-svg-qjmSqk5xNBNWbilu .statediagram-cluster.statediagram-cluster-alt .inner{fill:#f0f0f0;}#mermaid-svg-qjmSqk5xNBNWbilu .statediagram-cluster .inner{rx:0;ry:0;}#mermaid-svg-qjmSqk5xNBNWbilu .statediagram-state rect.basic{rx:5px;ry:5px;}#mermaid-svg-qjmSqk5xNBNWbilu .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#f0f0f0;}#mermaid-svg-qjmSqk5xNBNWbilu .note-edge{stroke-dasharray:5;}#mermaid-svg-qjmSqk5xNBNWbilu .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-qjmSqk5xNBNWbilu .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-qjmSqk5xNBNWbilu .statediagram-note text{fill:black;}#mermaid-svg-qjmSqk5xNBNWbilu .statediagram-note .nodeLabel{color:black;}#mermaid-svg-qjmSqk5xNBNWbilu .statediagram .edgeLabel{color:red;}#mermaid-svg-qjmSqk5xNBNWbilu #dependencyStart,#mermaid-svg-qjmSqk5xNBNWbilu #dependencyEnd{fill:#333333;stroke:#333333;stroke-width:1;}#mermaid-svg-qjmSqk5xNBNWbilu .statediagramTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-qjmSqk5xNBNWbilu :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 提交检索
返回有效结果
返回空列表
认证或网络异常
调度员选择
转人工
转人工
选择服务站
初始配置
请求中
有可信候选
无候选
请求失败
自动候选已确认
人工确认中
人工已确认

这几个状态决定不同的界面。请求中禁止重复提交但允许取消;无候选显示扩大半径或调整关键词;认证失败不应建议用户不断重试,而应提示检查配置并开放人工入口;人工确认完成后,工单必须带上"人工来源"标记。

当前 工程o 用字符串展示阶段,点击"提交派单检索"后进入认证失败降级:

ts 复制代码
private runScenario(): void {
  this.selectedPlace = '东区服务站(人工确认)';
  this.requestState = '认证失败降级,已更新人工派单草稿';
}

这段代码没有伪造POI、距离或相关性,而是让页面明确进入人工确认。生产项目中,认证失败应来自真实请求的异常分支;这里的页面负责展示异常到人工流程之间的状态组织。

字段缺失不能悄悄使用默认值

距离和相关性字段的用途不同。距离回答"服务站离任务点多远",相关性回答"搜索结果与关键词有多匹配"。如果距离缺失,页面不能显示"0米";如果相关性缺失,也不能把它当作最高分排序。默认值会参与排序,随后生成一个看似合理、实际错误的候选顺序。

界面层可以把候选归为三类:字段完整,可进入自动排序;字段部分缺失,只展示并等待人工判断;关键字段全部缺失,不进入自动候选区。排序函数也应该显式处理 undefined,而不是依赖数值转换。

ts 复制代码
interface DispatchCandidate {
  name: string;
  distance?: number;
  reliability?: number;
  source: 'map' | 'manual';
}

使用可选字段以后,结果卡可以自然显示"距离暂缺""相关性暂缺"。更重要的是,后续派单逻辑可以根据 source 决定是否保留人工确认人、确认时间和备注。

人工降级不是一个"假成功"按钮

人工派单需要独立输入和确认过程。自动搜索失败后,页面可以让调度员从已有服务站目录中选择,也可以输入服务站编号,但不能直接把预设候选写成已确认结果。

一条清楚的人工流程包含:保留原检索条件、说明自动搜索为何停止、选择人工候选、显示候选来源、二次确认、写入派单草稿。若稍后恢复地图服务,可以重新检索,但不应该静默覆盖已经确认的人工选择。

工程o 的结果区同时显示"可信候选:0""距离/相关性字段:缺失"和人工确认状态。这样的布局很实用:用户不会只看到一个红色错误,也不会被一个绿色完成提示掩盖原因。输入、缺失字段和下一步都在同一屏内。

防止旧请求覆盖新请求

真实搜索通常是异步的。用户提交3公里检索后,马上改成5公里再次提交,第一轮可能后返回。如果页面没有请求标识,旧响应会覆盖新条件,列表标题显示5公里,内容却来自3公里。

前端可以为每次请求生成递增序号或查询摘要,只有最新请求允许更新当前列表:

ts 复制代码
private requestVersion: number = 0;

private async search(): Promise<void> {
  const version = ++this.requestVersion;
  const query = this.currentQuery();
  const result = await this.searchService(query);
  if (version !== this.requestVersion) {
    return;
  }
  this.applyResult(query, result);
}

取消请求、页面离开和筛选条件变化都可以推动版本号。这样结果卡永远对应当前页面所展示的输入,而不是最后到达网络层的那个响应。

列表、地图和草稿应共享同一选择模型

派单页面可能同时提供地图Marker、候选列表和右侧工单草稿。三处各自维护选择状态,会出现列表选中A、地图高亮B、草稿写入C的分裂。更合理的方式是维护一个 selectedCandidate,三种视图都从它派生。

自动候选和人工候选也应使用相同数据结构,只在 source 和字段完整度上不同。这样用户从自动列表切到人工目录时,表单不需要两套保存逻辑;审计字段则由来源类型决定。

当候选被选择后,页面不要立即提交最终工单。先把服务站、来源、距离、相关性和检索条件写入草稿,让调度员确认。地图搜索是推荐环节,最终派单仍是业务操作,两者之间保留确认层能减少误触。

测试应该覆盖哪些降级组合

除了正常候选,还要测试空列表、认证失败、网络超时、仅距离缺失、仅相关性缺失、两者都缺失,以及旧请求晚到。每个用例都从固定关键词和半径开始,观察当前请求状态、候选数量、字段显示和人工入口。

输入编辑也要覆盖:请求中修改关键词后旧结果是否清除;半径变化后已选候选是否标记过期;人工确认后再次检索是否询问覆盖;页面旋转后草稿是否仍在。只测"点击按钮出现候选卡"无法发现这些状态交叉问题。

FAQ:派单搜索页面常见问题

问题一:认证失败后要不要自动重试?

认证配置错误通常不会靠重试恢复。页面应显示配置类错误并开放人工派单;网络抖动才适合有限次数重试。两类错误不要共用"网络异常"文案。

问题二:相关性字段为空时还能按距离排序吗?

可以,但应明确当前只按距离排序,并把相关性显示为缺失。不要用0替代空值后参与综合评分,否则排序规则与页面说明不一致。

问题三:用户修改半径后,旧候选要不要保留?

可以作为历史参考保留,但当前候选区应清空或标记过期。旧结果不能继续作为新条件下的可提交选择。

问题四:人工选择的服务站能否和地图候选共用卡片?

可以共用视觉组件,但数据必须保留 source。人工项不显示伪造的距离和相关性,提交时增加确认人和备注。

问题五:为什么不直接在异常分支跳到服务站目录?

直接跳转会丢失关键词、半径和错误原因。先进入降级状态并保留输入,用户才能判断是调整条件、重试还是转人工。

问题六:搜索按钮怎样避免连续点击?

请求中禁用当前提交按钮,或者让新请求显式取消旧请求。无论采用哪种方式,都要避免多个响应无序覆盖列表。

问题七:地图与列表选择不一致怎么处理?

让两者绑定同一个 selectedCandidate。Marker点击和列表点击都只调用统一选择方法,不要分别维护两个选中索引。

问题八:模拟器运行正常后,真机还要检查什么?

检查网络切换、定位权限、地图认证、触摸选择、窗口尺寸和真实服务响应。模拟器更适合状态分支,真机用于完整服务与交互环境。

最后一句

地图搜索不可用时,派单页面不必停摆,也不能假装成功。把查询条件、请求状态、字段完整度、候选来源和人工确认拆开管理,前端就能在自动能力失效时继续支撑业务,同时保持每个字段的来路清楚。

附录

A. 开发环境要求

项目 要求
开发工具 安装能够使用 HarmonyOS 6.1.1 SDK 的 DevEco Studio
SDK HarmonyOS 6.1.1,API 24
开发语言 ArkTS
UI 框架 ArkUI,Stage 模型
构建工具 项目自带 hvigorw.bat;本项目使用过 DevEco Studio Hvigor 6.24.4
操作系统 当前工程可在 Windows 环境中使用 PowerShell 或 DevEco Studio 构建
依赖 以项目根目录和 entry 模块的 oh-package.json5 为准;当前工程未声明第三方依赖

项目的 SDK 配置位于根目录 build-profile.json5,三个版本字段保持一致:

json5 复制代码
{
  "compileSdkVersion": "6.1.1(24)",
  "compatibleSdkVersion": "6.1.1(24)",
  "targetSdkVersion": "6.1.1(24)",
  "runtimeOS": "HarmonyOS"
}

若本机没有安装 API 24 SDK,HarmonyOS 6.1.1 新增接口可能在类型检查或编译阶段不可用。此时应先通过 DevEco Studio 的 SDK Manager 安装对应 SDK,再重新同步工程。

B. 工程配置要求

页面源码位于:

text 复制代码
entry/src/main/ets/pages/batch03/DispatchRadiusSearchPage.ets

页面需要登记在 entry/src/main/resources/base/profile/main_pages.json 中:

json 复制代码
"pages/batch03/DispatchRadiusSearchPage"

entry 模块使用 Stage 模型,目标设备类型包含 phonetablet2in1。运行具体页面前,应根据源码涉及的系统能力核对权限、服务配置和输入资源;纯 UI 页面不需要额外申请与功能无关的权限。

sourceproject 目录执行以下命令可以构建 HAP:

powershell 复制代码
.\hvigorw.bat --mode module -p module=entry@default -p product=default assembleHap --no-daemon

预期结果是 Hvigor 输出 BUILD SUCCESSFUL。若使用 DevEco Studio,也可以选择 entry 模块和 default product 后直接构建或运行。连接真机时还需要配置可用的调试签名;仅执行本地未签名构建时,不等同于已经可以安装到真实设备。

C. 测试环境要求

逻辑测试建议先使用 HarmonyOS 6.1.1 API 24模拟器。测试前固定输入样本、初始状态和操作顺序,每轮只改变一个核心变量;涉及外部服务或硬件能力时,还需准备对应权限、认证、网络或测试资源。

测试时建议固定以下基线:

参数 基线值
系统镜像 HarmonyOS 6.1.1 API 24
初始状态 页面默认状态,操作前重新进入或执行重置
测试输入 使用文章约定的固定样本和固定参数
主操作 每轮只执行文章描述的一项核心操作
观察内容 输入、当前状态、结果区域、异常提示及必要回调

基线流程至少重复两轮,确认页面能够从相同起点得到稳定状态。尺寸适配测试至少覆盖横屏、竖屏或一次窗口缩放,检查主要内容、状态区域和操作控件没有互相遮挡。

D. 运行环境要求

模拟器用于检查页面启动、基础交互、状态更新、异常分支和布局适配。运行镜像应为 HarmonyOS 6.1.1 API 24,并确保目标页面已注册且能够从应用入口正常打开。

真机用于检查真实触摸、屏幕显示、性能以及模拟器无法完整提供的硬件或系统能力。设备系统需要满足工程的 compatibleSdkVersion,即 HarmonyOS 6.1.1 API 24;同时开启开发者模式和调试连接,并使用有效签名安装应用。

若页面涉及相机、麦克风、地图、网络服务、媒体文件或授权样本,应在运行前准备相应权限、认证信息和合法测试数据;不涉及外部能力的页面可直接在模拟器中完成基础交互测试。模拟器与真机使用相同的固定输入和操作顺序,便于比较两类环境中的差异。

相关推荐
长江&后浪1 小时前
华为wlan实验-三层旁挂
运维·服务器·网络·华为
HarmonyOS_SDK1 小时前
HarmonyOS SDK API诊断 Skill,一键定位功能故障问题
harmonyos
大锅盖12 小时前
Canvas 签名板里的 antialias 开关,怎样确保它真正触发重绘
华为·harmonyos
OH_TPC16 小时前
【鸿蒙优选三方库】@ohos/mpchart:让 HarmonyOS 应用的数据可视化开箱即用
华为·信息可视化·harmonyos·鸿蒙
woshihuanglaoshi21 小时前
鸿蒙技术进阶全景高级成长体系:从初中级到架构师的技能树/学习路径/项目实战/认证体系系统性方法论
学习·华为·harmonyos
轻口味1 天前
端侧 AI 赋能鸿蒙版 Obsidian:轻规划基于 HarmonyOS 7.0 图像超分特性的体验突破与开发实战
人工智能·华为·harmonyos·鸿蒙
OH_TPC1 天前
【鸿蒙优选三方库】@ohos/lottie:让 After Effects 动画在 HarmonyOS 上稳定播放
华为·harmonyos·鸿蒙
李蚊子1 天前
鸿蒙应用开发实践与上架复盘
harmonyos
2501_919749031 天前
华为鸿蒙训练口才APP—小羊口才
华为·harmonyos·鸿蒙