2 Commits

Author SHA1 Message Date
weicw-dshsa 40fed38f83 fix(小程序): 修正 v-for :key 表达式告警,恢复列表 wx:key
非 h5 平台的 :key 只接受简单属性名,模板字面量与运算表达式会被编译器
整条丢弃(uni-template-compiler 的 getForKey:Identifier 走 *this 或原名,
MemberExpression 取属性名,其余一律 warning + 返回空串)。

所以这批告警不只是文案问题:产物里对应的 <block wx:for> 后面确实没有
wx:key,列表项因此失去复用标识,增删时会整段重建节点。本次按编译器
接受的写法逐一改正,共 13 个文件。

改法:
- 纯 URL 字符串数组(打卡/门头/小票/凭证/巡店照片)直接用元素自身
  :key="img",编译为 wx:key="*this"
- 对象数组用其已有唯一字段:连锁/门店 item.id、抄送用户 user.id、
  审计销量行 detail.key、编辑销量项 detail._key
- 本身无唯一字段的巡店列表补 _key:task/detail 沿用 visit.vue 已验证的
  _rowKey(自增 seed,增删稳定),records 与 AuditVisitReportItem 用序号

sales.vue 另有一处隐蔽问题:row 是 {item, index} 包装对象,
:key="row.item._key || row.index" 即便写成简单形式也会生成 wx:key="_key",
在 row 上取不到值。改为在 visibleSalesItems 里把 key 提到包装对象顶层,
_key 缺失时用序号兜底。create.vue 的销量摘要同样补 __key 兜底,避免重复 key。

注:task/detail 的 storeList 提交走 sanitizeStoreList() 显式白名单,
_rowKey 不会外泄到后端。

验证:HBuilderX cli 重新编译 —— 编译成功,非 h5 平台 :key 告警 0 条
(修改前满屏 40+ 条),产物中 wx:for 与 wx:key 数量逐文件相等。
2026-10-12 18:18:11 +08:00
weicw-dshsa 876847ccbb feat(自主填报): 销量填写拆为独立页并按原型改版
甲方反馈原销量填写功能难看、不好用,按原型图改版。

改造前,销量填写是自主填报页内的一个区块(新增商品 → 底部弹层选品 →
回列表手输数量),与原型差异大。现拆为独立页面。

新页 packageUser/self-report/sales:
- 视觉对齐原型:搜索框 + 筛选、新增商品 + 批量填写、卡片式列表
  (序号徽标/封面/分类/厂家/编码/规格胶囊/数量步进器/删除)、底部提交
- 新增搜索(按名称或编码过滤清单)
- 新增分类筛选(弹层选择,可清空)
- 新增批量填写(弹层一次录入多项数量)

自主填报页(create.vue):
- 销量区块改为入口卡片 + 摘要列表,明细编辑移入新页
- 提交按钮文案「提交销量」改为「提交填报」——该页提交的是整单
  (打卡/门头照/销量/小票/小结/评分/定位),原标题名不副实
- 删除已迁移到新页的商品库选择逻辑(约 270 行)及废弃样式

页面间交接(util/sales-handoff.js):
- 工程无全局状态管理,页面间只能靠 storage 传递
- 仅负责一次性交接,消费后即清;持久化草稿统一由自主填报页的
  整单草稿负责(其 buildDraftPayload 已含 salesItems),避免两份状态互相覆盖
- 换连锁/换门店后清空销量明细与交接数据

修复:
- 数量步进器改用纯文本按钮。原用 u-icon 时点击无效——该组件根节点自带
  @tap,会吃掉落在图标上的点击;同页「删除」按钮因带文字才正常
- 数量输入限制为非负整数。type=number 在部分机型仍可输入 . / e / -,
  故增加输入清洗与失焦兜底;采用「取开头连续数字」而非「删掉所有非数字」,
  后者会把 1.5 抹成 15、1e3 抹成 13,属静默的数据污染

提交结构 salesGroups 未变,后端与审核端无需调整。

Co-Authored-By: Claude <noreply@anthropic.com>
2026-10-11 18:47:03 +08:00