weicw-dshsa
|
8816dd2867
|
fix(visit): 修复客户拜访页定位时好时坏
根因:定位链路用区县「中文名」查 sys_area,重名区县(白云区=广州/贵阳、
朝阳区=北京/长春、南山区=深圳/鹤岗…)命中多条,后端 getOne 默认
throwEx=true 抛 TooManyResultsException,页面表现为「有时能定位、有时不能」
——取决于用户当前所在区县名是否唯一。
改动:
- 新增 util/geo.js(纯函数):buildGeocodeUrl / normalizeAdcode /
parseGeocodeResult / formatLocationText
· 天地图 postStr 补 URL 编码:实测未编码时接口返回 HTTP 400
「参数格式错误」(admin 端 merchantEdit.vue 已是正确写法)
· 严格校验响应结构,限流(429)/参数错误(400) 一律返回 null
· 补直辖市 city 为空时用省名兜底(天地图对上海/北京/天津/重庆返回 city:"")
- util/index.js:抽出 locateOnce / fetchGeocode / resolveAreaInfo 共用
· 清除两处模块作用域的 this.areaId 误用(严格模式下抛 TypeError 会让
Promise 永久悬空,locating 再也回不到 false,即「反复点没反应」)
· 优先按天地图 county_code(去 156 前缀 = sys_area.id)精确查询,
从根上绕开重名;按中文名仅作降级,并注释其歧义风险
· 行政区划查不到不再阻断定位:返回 null,仍给出经纬度与地址
(area_id/city_id/province_id 全仓库无消费方)
- api/request.js:get/del 不再吞掉非 2xx 的 reject,避免调用方状态永久悬空
- pages/visit/index.vue:fetchLocation 加 15s 超时兜底 + 运行号丢弃迟到结果,
保证失败后仍可重试;静默失败也给出可见提示
- 新增 util/geo.test.mjs(10 个单测),package.json 补 test 脚本
验证:前端单测 10/10;真实天地图 + 生产后端端到端 5 个重名区县全部可正常
定位(后端修复尚未部署即已生效)。
|
2026-10-16 21:23:48 +08:00 |
|
weicw-dshsa
|
945cf9c104
|
refactor(UI): 首页 tab 与自主填报入口图标改用 uview 矢量图标
e192296 把纯白透明底图片图标垫了深色底块反衬,解决了「白底上看不见」,
但本质是靠底色绕开图源问题,选中态也就只能靠加深底色表达。
改用 u-icon 矢量图标后可直接着色:
- 首页 tab:未选中灰色 #6b7280,选中白色;图标按语义取
order / clock / checkmark-circle
- 自主填报入口:未选中浅绿底 + 绿色图标,选中深绿底 + 白色图标;
store/visit 取 home-fill / car-fill
顺带删掉两处为图片补正尺寸的样式(.tab-icon-wrap 白圆底、
.type-icon/.type-icon-store 的宽高补正),矢量图标不需要。
图标名已对照 uview 图标库校验(u-icon 会自动补 uicon- 前缀)。
|
2026-10-12 18:22:25 +08:00 |
|
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
|
e192296ea7
|
feat(UI): 首页与个人中心按原型改版,修复纯白图标在白底上不可见
一、首页两个入口按钮改版(用户反馈「太小了」)
原为「裸图标 + 单行文字」的矮按钮(min-height 76rpx),改为
「白色圆角图标块 + 右侧主副两行文字」的大卡片(padding 22rpx 20rpx):
- 自主填报:便捷填报,快速提交
- 填报记录:历史记录,随时查看
主按钮渐变由 #f97316→#ef4444 改为 #f9863c→#f2620f 并加橙色投影。
结构对齐 create.vue 已有的 sales-entry-* 卡片。
二、个人中心三张卡片改版(用户提供原型图)
- 积分卡:改为「绿底图标块 + 大号数字 + 我的积分」,右侧新增
「积分明细 ›」胶囊按钮;去掉原先那条突兀的 20px 绿色粗顶边。
数字字号 30rpx → 40rpx。
- 自主填报 / 客户拜访:由单行居中文字改为「图标块 + 主标题 + 副标题」,
副标题分别为「及时上报、真实记录」「拜访记录、有效跟进」。
- 药审核:改为整行卡片(图标 + 药审核/待审核任务 + 红色数字徽标 + 箭头),
徽标数据来自新增接口 /yxe/yxe-audit/pending-count(见 yxe-java 侧提交),
仅 can_auth === 1 时拉取,退出登录时清零。
三、修复纯白图标在近白底上不可见(用户反馈「图片是白色的看不清」)
根因不在 opacity 或主题色,而是图源本身就是纯白图形 + 透明背景:
文件 颜色构成 内容占画布
0fd31838....png (驻店) 透明 + #FFFFFF 75% x 50%
f5fbb2e4....png (跑店) 白色及半透明白 88% x 88%
9c6c9884....png (新任务) 纯白 90% x 90%
eebe6469....png (已完成) 纯白 -
而承载它们的底色分别是 #f8fafc(选择页卡片)与平均亮度 250/255 的
近白底图(首页 tab),白图标贴白底自然完全看不见。此类图标只适合
放在深色/彩色底上,同一张 0fd31838....png 在个人中心药审核卡里
配金色底时一直正常,故长期未暴露。
改法:统一垫一层绿色圆角底块反衬白色图形
- select.vue:新增 .type-icon-wrap(未选中 #2fc6a7→#1aa88c,
选中加深为 #16a085→#0e7a66 + 投影,顺带强化选中态)
- index.vue:新增 .tab-icon-wrap(未激活绿圆底;激活时置
background:none,避免两层绿有色差露出一圈描边)
顺带修一个隐藏问题:两张填报图源的内容占比差很多,同尺寸渲染会让
驻店图标明显偏小,故为 store 单独放大(.type-icon-store 92rpx)。
验证:用 Pillow 按 rpx→px 实际比例合成修复前后对比图逐张核对,
确认修复前未激活图标完全不可见、修复后清晰、激活态无色差边。
模板标签、style 括号、类名定义/引用均通过脚本校验。
注:f5fbb2e4....png 渲染出来实际是「时钟」形状,用在「跑店填报」
语义是否合适待确认,本次只解决可见性,未更换图标资源。
|
2026-10-12 16:11:58 +08:00 |
|
weicw-dshsa
|
2992f4ee49
|
fix(药分享): 修正 page-meta 位置并兜底接口返回,修复首屏报错
问题一:<page-meta> 渲染层报错“只能是页面内的第一个节点”
page-meta 原先嵌在根 view 内,位置在根节点的孙级。而编译器
uni-template-compiler/lib/template/generate.js 的 parsePageMeta 只检查
根节点的直接 children,匹配不到就不做“提升为第一个节点”的处理;
加上 webpack-uni-app-loader/page-meta.js 只要模板含 <page-meta 就会
无条件外包一层 <view>,最终渲染成
<view class="data-v-xxx"><view class="share-page">...<page-meta>
导致微信报错。改为让 page-meta 与业务根 view 平级、放在最前,
经真实编译器验证产物第一个标签已是 <page-meta>。
问题二:onShow 抛 Cannot read properties of undefined (reading 'list')
直接诱因是后端 /yxe/yxe-share-detail/page?groupByProduct=true 报错
(见 yxe-java 侧提交),返回体 code=1 且不带 data,getProductList 里
data.list 抛异常并中断整个 onShow,页面数据全部不渲染。
本次在小程序侧做防御性兜底,避免任一接口失败就整页白屏:
- getProductList / getTodayShare / getShareUserData / getUserData /
getRule / getShareData 均按要求校验再赋值
- getShareData 改用 slice() 排序,避免就地改动接口返回的数组;
amount 缺失按 0 处理,避免 NaN 让排序结果不稳定
|
2026-10-12 14:49:18 +08:00 |
|
weicw-dshsa
|
2ff8d42207
|
fix(自主填报): 修正重提跳转按填报类型、补 wx:key 并清理废弃 API 调用
一、填报记录「重新提交」跳错表单(用户反馈)
records.vue 原先按 activeType(当前 tab)决定跳驻店还是跑店表单,
但列表请求无守卫:切 tab 会连发请求且响应顺序不保证,
旧响应回来会盖掉当前 tab 的数据,导致 tab 与实际数据错位。
此时点「重新提交」会拿 A 表的 id 去打开 B 表的表单
(两表 id 各自从 1 开始,撞号常见,故不报错、只静默进错页面)。
改法:把填报类型钉在记录上,而不是靠 tab 状态猜
- fetchList 拉到数据后给每条记录打 reportType
- 新增 recordType(item):优先取记录自带类型,异常数据回退当前 tab
- 归一化、筛选、卡片标题/副标题、展开详情形态、重新提交跳转全部改走它
- 列表请求加自增 listRequestId 守卫,丢弃过期响应(loading 同理)
二、visit.vue 缺 wx:key 告警
小程序 wx:key 只接受简单属性路径,模板字面量写法
(:key="`store-${idx}`")会被编译器静默丢弃,四处循环因此无 key。
按项目既有 _rowKey 模式改:
- 巡店列表 :key="item._rowKey",新增 buildStoreKey/ensureStoreKeys
(重提与草稿的旧数据无该字段,加载时补齐;提交走显式白名单,不外泄)
- 照片 :key="photo",两个 picker :key="item.id"
三、getSystemInfoSync 废弃告警
该调用在 AppNavbar 的 render(getSafeTop)里,每渲染一次告警一次。
改为挂载时取一次并缓存,优先用新接口 uni.getWindowInfo,
取不到再回退旧接口;select.vue 同源调用一并处理。
注:uview 组件库内部 u-overlay/u-popup 的 mode 传 null 告警
(u-popup 的 position computed 无 else 分支)未改,
uni_modules 已被 gitignore 且会被依赖重装覆盖,属组件库问题。
|
2026-10-12 13:47:03 +08:00 |
|
weicw-dshsa
|
aff1e52e3e
|
feat(自主填报): 拆分驻店/跑店填报并新增跑店填报页
「自主填报」原本只有一种表单。本次拆成两种类型:
1. 新增选择填报类型页 packageUser/self-report/select
- 按设计稿:hero 页头 + 两张类型卡(驻店填报 / 跑店填报)+ 确认选择
- 入口(首页、我的)由直接进 create 改为先进 select
2. 原自主填报页改为「驻店填报」
- 仅改导航标题,表单内容不变
3. 新增跑店填报页 packageUser/self-report/visit
- 复制现有跑店/巡店任务(pages/task/detail 的 cateId=4 分支)的填报页并改造:
保留巡店列表与下方内容,去掉列表上方的任务卡片/总进度/任务详情;
打卡、摆台照、销量、小票、门店评分一并不保留
- 巡店列表内「连锁筛选」「门店筛选」是两个并列的独立输入框,
各自弹各自的选择器(不串联),样式与驻店填报逐项对齐;
换连锁会清空已选门店
- 每条巡店可新增/删除,独立获取定位 + 打卡拍照(最多 9 张)
- 定位不强制(巡店任务里是强制的,这里放开)
- 底部「保存草稿」+「提交填报」,草稿交互与驻店填报一致:
进页面询问是否加载、提交成功后清除;storage key 与驻店分开
- 驳回后重新提交复用同一页面(mode=resubmit)
4. 填报记录页加「驻店 / 跑店」类型切换
- 两表分表查询,各自分页;跑店卡片展示门店数、巡店列表(门店/定位/照片)
- 连锁与门店关键词筛选落到巡店列表的每一行
5. 药审核加「跑店填报」类型
- 新增 AuditVisitReportItem,展开时按 id 拉详情(列表不下发 store_list)
- 跑店没有销量小计,审核通过需手填奖金,故补奖金输入弹层
顺带重构:
- 门店解析(扁平列表 / 连锁嵌套两种结构的兼容、门店明细不入页面 data
的性能处理)抽到 util/store-picker,create 与 visit 共用一份,
避免两页各自维护导致解析口径不一致
|
2026-10-11 22:50:15 +08:00 |
|
weicw-dshsa
|
4fa29ea4c6
|
refactor(visit): 拜访对象类型「门店」改为「地点」
- 类型选项:门店 -> 地点(图标改用 map)
- 字段标签:姓名/门店 -> 姓名/地点
- 默认 visitType 同步为「地点」,与 tab 的 value 保持一致
- placeholder、校验提示、顶部提示文案一并调整
「门店经理」选项保留不变。
|
2026-10-11 20:51:48 +08:00 |
|
weicw-dshsa
|
da5bf8733e
|
feat(visit): 客户拜访页按新原型重构为多卡片表单
参照设计稿将 pages/visit/index 拆分为 4 张表单卡片 + 历史记录卡片:
- 我的信息:姓名,进页面自动带出账号 realName,可编辑
- 拜访对象:类型(门店/门店经理/其他 胶囊 tab)、姓名/门店、连锁
- 拜访信息:定位信息(点击重新定位 + 经纬度副行)、拜访日期(默认当天)
- 其他信息:沟通内容(500 字 + 实时计数)、拍照上传、活动小结
一并修复:
- 必填星号原用 ::before 伪元素,小程序对 <text> 伪元素支持不稳,改为
显式 <text class="field-star">
- 必填标签原复用全局类名 .required,而 common.scss 中的 .required 经
@extend .pos-a 带上 position:absolute / left:-9px / top:15px,导致标签
脱离文档流堆叠到卡片左上角。改用 .is-required 并在样式处加注释说明。
配色沿用项目主题变量,未照搬设计稿颜色。历史记录展开详情增加拜访
类型与拜访日期两行。
|
2026-10-11 20:47:31 +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 |
|
weicw-dshsa
|
9eaa168d72
|
feat(填报记录): 被驳回记录支持修改后重新提交
- records.vue:已驳回记录卡片底部新增“重新提交”按钮,跳转
create?id=<id>&mode=resubmit;同时补上驳回原因展示
(原 normalizeRecord 未提取 rejectReason,列表页看不到驳回理由)
- create.vue:复用同一表单页做编辑模式,onLoad 读 id/mode,
回填门店、日期、打卡照、摆台照、小票、销量、小结、评分、定位;
标题与按钮切换为“重新提交填报/重新提交”,隐藏保存草稿
(草稿 key 与新增共用,会互相覆盖)
- 提交走 resubmit 接口,成功后返回列表,onShow 自动刷新为待审核
- api/self-report.js:新增 selfReportResubmitReq
|
2026-10-11 17:05:12 +08:00 |
|
weicw-dshsa
|
4556114b4d
|
fix(审核): 阻断位置型 chainId 占位符写入 yxe_self_report
normalizeMerchantChain 的兜底链以 `chain_${index}` 结尾,该值是数组下标而非
连锁标识。审核员改门店时 saveMerchantEdit 会把 chain.id 直接写入 chainId,
落库后按连锁筛选(YxeSelfReportMapper.xml: a.chain_id = #{param.chainId}
等值匹配)就再也筛不出这条记录。
存量数据已出现 chain_3/chain_6 等脏值,导致 5 条已通过记录按连锁筛选时
永久漏查。本次修复:
- 兜底链结尾改用连锁名(与提交端 create.vue 的 `?? chainName` 对齐)
- saveMerchantEdit 写入前拦截 `chain_` 前缀,退回连锁名
后端 MerchantServiceImpl.groupByChain 已返回稳定 chainId,正常路径不再回退。
|
2026-10-11 16:34:30 +08:00 |
|
weicw-dshsa
|
575b4a723a
|
perf(门店选择): 门店明细移出页面 data,修复首屏卡顿
门店接口 /shop/merchant/groupByChain 一次返回 8105 家门店(约 1.1MB)。
此前把门店明细原样放进页面 data,data 树膨胀到 1118KB,导致此后每次
setData 都要重新 diff/序列化整棵树——即使载荷只有 1 个字段,耗时也从
约 490ms 涨到约 1000ms,首屏因此多花约 3.5s。
改为把明细挂在实例属性 merchantStore 上(不进页面 data),
merchantChainList 只保留 {id, text, merchantCount} 骨架,
新增 getMerchantsByChainId() / getVisibleMerchants() 按需取数。
涉及页面:
- packageUser/self-report/create.vue
- packageUser/chronic/index.vue
- pages/task/detail.vue
- pages/share/create.vue
- pages/share/index.vue
- pages/audit/components/AuditShareItem.vue
实测(微信开发者工具自动化):
- 页面 data 门店明细 1118KB -> 1KB
- 单字段 setData 998ms -> 10~53ms
- self-report/create 首屏 9055ms -> 5341ms
- 门店 picker 选项数不变(大参林 2700 项),搜索与选中回填均正常
|
2026-10-11 15:18:06 +08:00 |
|
b2894lxlx
|
69e6ed8c59
|
20260929
|
2026-09-29 15:17:13 +08:00 |
|