记在这里的债都是有意欠的,不是忘了。每条写清:是什么、为什么先欠着、 什么条件下该还。
question="1",API 由序号映射到原候选",
而当前前端提交的是选项全部内容拼接的文本(公司名 + 信用代码 + 状态 + 负责人)。status: found)的流程,
选中一家,确认返回的是选定公司后的结果而不是又弹候选列表。
若循环,两条路:①改回提交序号(序号取自当前显示顺序);②后端扩语义识别全字段文本。provider_failure,status: found 一次都没出现过,因此从未验证。answer.text 与 summary.text 首句重复answer.text(渲染在消息正文)又放进 summary.text 的开头,
实测两者首句逐字相同,用户会看到同一段话出现两次。还清了:用户 2026-09-24 明确要求「部门筛选只包含 JSON 里面存在的所有部门」—— 前端不再用那份硬编码的部门列表,改为从惠企政策库(
政策所属部门)现算 (打开部门菜单/面板时算一次;选中项若不在新清单里自动退回「全部部门」)。 于是"固定列表 vs 数据取值口径不一致"这个根因消失了:清单里不会再有库里没有的部门, 也不会漏掉库里新增的部门。验证见verify-policy-library.mjs第 7 节(35/35)。⚠️ 早先"不要当 bug 修"的告诫已被这条用户指示取代 —— 别再按老口径改回固定列表。
Question.message 字段未被渲染QuestionCard 的 Question 接口里定义了 message 字段,
但模板从未渲染它 —— 适配层写的提示文案一直不可见。height: 100dvh 没有 100vh 兜底(BusinessAssistantMobile.vue)——
dvh 是较新的单位(Chrome 108+ / Safari 15.4+),国产浏览器内核多基于更老的版本
→ 该声明被整条丢弃 → 容器高度塌陷,而外层是 overflow: hidden → 内容被裁掉text-size-adjust: 100% —— 移动端浏览器会按各自策略自动放大文字,
各家不同 → 同一份文案在不同手机上长度不同(也是"不同浏览器不一样"的直接来源)width: max-content 决定「单行省略 vs 换行」:
updateMaxWidthReached() 用 getBoundingClientRect() 比卡片与父容器宽度。
而字体首选 "HarmonyOS Sans SC"(手机多无此字体 → 回退到系统字体)→ 字宽不同
→ 测量结果不同 → 该换行时判成"没撑满" → 单行 nowrap 撑出屏幕chrome://inspect
最省事)—— 没有这个只能猜dvh 加 vh 兜底、全局 text-size-adjust: 100%、
给 flex 链补 min-width: 0is-max-width-reached
与 width: max-content。现在这套先天不稳定(字体/时机/内核都会影响测量)browserslist;
项目当前没有任何 browserslist / postcss 降级配置,而代码里用了
dvh(4) / gap(151) / inset(22) / backdrop-filter(24) 等较新特性dvh 仍无 vh 兜底、
仍无 text-size-adjust、思考卡片仍靠 JS 测量切样式,padding-bottom: 180px 也仍是写死的)。
换台手机、或用户调大系统字号,仍可能变样;方案 A/B/C 依然有效,等用户决定要不要做。/dms/content/selectContentList 发任意查询,就能读到 DMS 的全部数据:1887 会话、
1888 企业工商信息、1889 问答记录,包括别家企业的。src/network/api/dms/service-token.ts):
服务账号(user_yszs_web)账号+密码内置在前端源码里 ⇒ 公开产物里能直接抠出密码,
任何人可以自己登录 DMS;token 也落在浏览器内存里(可被 devtools/XSS 取走)。service-token.ts(前端)与 harness/tools/dms-login.mjs(node 侧)→ 重新构建。docs/plans/active/dms-api-replacement.md 里
"前端直连还是后端转发"那道待拍板的问题是同一件事,这里给出了必须选后端的理由;.env.production 里没有 VITE_DMS_API(2026-09-24 起只剩开发/生产两份 env,
见 progress.md 续 38)⇒ 生产包里 getDmsApiBaseUrl() 返回空串,后果两条:
①uploadDmsAttachment 直接抛「未配置 DMS 接口地址,无法上传附件」→ 附件整体不可用;
②DMS 会话/问答/反馈请求走 client.ts 的「未配置就跳过」,静默不落库。.env.production 现在也有 VITE_DMS_API="/dms"(与 dev 同值,
前缀直通,见 #11 的新前缀方案)⇒ "未配置"这条消失。/dms/ 转发到 DMS 主机 http://121.43.55.7:10081
并在转发时注入 token 头(前端不持有 token)。
进展:用户 2026-09-24 给了后端网关的 token 端点
GET http://121.43.55.7:10011/proxy/verify/getALYToken→{code:200, content:"<token>"}, 前端已改为调它(同源/api/…,dev 走 vite 代理)。前端侧不再需要 AK/SK, vite 里那段自签中间件已删除。 剩下的(部署侧,仍未做): ① nginx 把/api/转发到http://121.43.55.7:10011/(去掉前缀,与/api/同法)。② 生产 env 要配—— ✅ 2026-09-28 已消:appkey 直接内置进VITE_NLS_APPKEYsrc/utils/runtime-config.ts的NLS_APPKEY_BUILTIN(用户要求「直接写入使用的地方, 不再放在环境变量里」)⇒ 生产不再需要注入,空 appkey 导致识别失败的风险也没了。 详见../reference/asr-nls.md。
10.235.245.174、AI 对话 10.249.33.148 —— 两个都没给端口。VITE_CHAT_API 还指着测试后端 http://192.168.2.23:8000
(.env.production 里就写着"生产部署时请改为实际后端地址");
②根本没有 VITE_DMS_API → getDmsApiBaseUrl() 返回空串,附件弹「未配置 DMS 接口地址」、
会话/问答静默不落库(与 #9 是同一件事,#9 是 DMS 那一半)。8000(对话)/ 10081(DMS),还是别的;VITE_CHAT_API="/chat-api"、VITE_DMS_API="/dms")→ 部署侧 nginx 分别转到
两台机器;DMS 那条还要注入 token(前端不持有 token)。这也正是 #8 的暴露面所在
(token 不分调用者 → 站点可访问 = DMS 数据可读,接入前应一并解决);http://10.249.33.148:<端口>)→ 生产页面是 HTTPS
(VITE_PARENT_ORIGIN = https://aixq.shqp.gov.cn/),直连 http://10.x 会被浏览器
按混合内容拦掉,除非页面本身就跑在 http 下。vite.config.ts 的 server.proxy 只对 npm run dev 生效,npm run build 的产物里
没有任何代理逻辑;生产要转发只能靠部署侧 nginx。npm run preview 会复用同一份 server.proxy(vite 5.4.21 源码:proxy: preview?.proxy ?? server.proxy)
→ "本地 preview 能通、上生产 404" 就是这个原因,别被它当成"生产已通"。*_TARGET 只有 dev 代理读vite.config.ts(用户要求「不要加环境变量」)。
产物只认 VITE_CHAT_API / VITE_DMS_API / VITE_IP_API / VITE_NLS_TOKEN_API 的最终值。/dms/**(DMS + 政策库 json,直通并注入 token)· /api/**(网关:语音 token + 取 IP,剥前缀)。
nginx 照这两条配即可,不再需要补 /dms 前缀。10.249.33.148:8000/80、10.235.245.174:10081/80 均超时
(生产网段)→ 配完只能由部署侧实测,本机无法端到端验证。.env.production 的 DMS/网关同源路径已于 2026-09-29 配好
(见 #9),剩下的仍是部署侧:地址/端口、nginx 转发规则、以及"要不要给后端上 HTTPS"。
用户 2026-09-28 指示暂缓,等重新发起。asr_hub 中转,换成阿里云 NLS 直连
(协议与实现见 ../reference/asr-nls.md)。exp 2034-12-29)已随旧实现删除;
② token 改由后端网关 /proxy/verify/getALYToken 签发,前端不持有任何云凭据。c_credit_code 只放真实信用代码」后,访客行也带着
对话提到的那家公司的代码;而 fetchDmsSessions(读「我的会话」)按 c_credit_code 查、
且只在登录后调用 → 那家公司登录后会看到陌生访客的会话。fetchDmsSessions 增加一道过滤 —— 排除「明确是访客」的行
(c_is_login === "0")。只排除显式访客行(c_is_login 缺失的历史行照旧返回),
因此可见范围与改造前完全一致。c_is_login === "1")不再允许访客对话改写
它的公司字段 —— 否则退登后再问到别的公司,会把这行改到那家公司名下、而 c_is_login
仍是 "1",既串台又会被读侧当登录行返回。verify-dms-chat-storage.mjs 打真实 DMS,两个方向都断言(访客行查不到 /
登录行查得到),且实测「拿掉过滤该断言立刻失败」——是真守卫。{thread_id, question},多一个字段 422,
旧协议的 transmission.files / file_pos 发不出去 —— 上传入口虽然活着,
但附件只能把 OSS 地址拼进 question 文本(方案②),模型会把 URL 当正文读,
本地消息、会话标题、DMS 记录也都跟着被 URL 污染。pictures: string[] —— 图片 URL 列表(后端自己去取图,须公网可达)files: string[] —— 非图片文件 URL 列表[{url,name}] 会被 422 invalid_request 拒掉);
带上 pictures 问「这张图片里是什么」,模型确实描述出了图的内容(不是收下就忽略);
空数组与不传都接受。toChatAttachmentUrls() 按 isImage 拆成两个列表随请求体发出;
地址不再拼进 question。旧函数 buildQuestionWithAttachments 按约定注释保留。thread_id + question ——
既不多传无意义字段,也让「后端若回滚」只影响带附件的那几轮。harness/tools/verify-attachment-question.mjs 19/19(拆分纯逻辑 + 真正发出的
请求体 + 「旧函数无活跃调用点」的源码级断言);字段生效是打真实后端探针实测的。token-streaming.md:「完整校验后绑定真实链接,随最终替换出现」;
「answer_end 无论 status 是 completed 还是 fallback,均用 text 覆盖已有内容……
不能只停止光标而保留草稿」### 高新技术企业认定… → ### 一、高新技术企业认定…)、
把纯文本渠道换成了 markdown 链接(- 国家高新技术企业认定管理工作网先行注册… →
- [查看办事指南](https://zwdt.sh.gov.cn/…))。链接只在最终校验后才绑定,草稿必然没有。status: fallback 那一类更直接:草稿被判不可用 → 换成降级答复
(「已查到相关资料,但这次未能完成答复整理。您可以查看下方原文资料,或稍后重试。」)/api/chat 原始载荷,比对 concat(answer_delta) 与 answer_end.text
的公共前缀长度(harness/tools/probe-answer-tail-timing.mjs 可改造成此用途)。