From 8365ef459f18b21820d6635cb7249aa9dd9eeb12 Mon Sep 17 00:00:00 2001 From: xsl Date: Fri, 16 Oct 2026 11:05:34 +0800 Subject: [PATCH] fix(report): remove eye conditions from contour conclusions --- h5/js/report-copy.js | 6 +++--- h5/js/report-ui.js | 8 +------- h5/test/contour-eye-copy.js | 22 ++++++++++++++++------ h5/test/display-grade.js | 2 +- reference/AI测肤报告页话术修改.md | 6 +++--- 5 files changed, 24 insertions(+), 20 deletions(-) diff --git a/h5/js/report-copy.js b/h5/js/report-copy.js index d9c82d0..01dcebc 100644 --- a/h5/js/report-copy.js +++ b/h5/js/report-copy.js @@ -3,9 +3,9 @@ "version": "2026-10-09", "conclusion": { "contour": { - "改善": "面部轮廓紧致度有待提升,下颌线清晰度不足,左右下颌线角度分别为左 {la}°/ 右 {ra}°;眼袋明显、黑眼圈轻/中/重度(根据分数给出判断);中面部容积略欠饱满,肌肤支撑力偏弱。", - "良好": "面部轮廓清晰,下颌线较为清晰,左右下颌线角度左 {la}°/ 右 {ra}°;眼周眼袋初显、黑眼圈轻/中/重度(根据分数给出判断);中面部容积无明显流失;肌肤处于健康状态,支撑力表现良好。", - "优秀": "面部轮廓紧致立体,下颌线清晰;眼周无明显眼袋问题、黑眼圈轻/中/重度(根据分数给出判断);中面部容积饱满,肌肤支撑力充足。" + "改善": "面部轮廓紧致度有待提升,下颌线清晰度不足,左右下颌线角度分别为左 {la}°/ 右 {ra}°;中面部容积略欠饱满,肌肤支撑力偏弱。", + "良好": "面部轮廓清晰,下颌线较为清晰,左右下颌线角度左 {la}°/ 右 {ra}°;中面部容积无明显流失;肌肤处于健康状态,支撑力表现良好。", + "优秀": "面部轮廓紧致立体,下颌线清晰;中面部容积饱满,肌肤支撑力充足。" }, "wrinkles": { "改善": "全脸共检测到皱纹 {wr_cnt} 条、细纹 {fl_cnt} 条,面中、口周、眼周等区域已出现静态纹倾向,纹路已呈现固化趋势,并非临时性干纹。", diff --git a/h5/js/report-ui.js b/h5/js/report-ui.js index 66a3f38..eabb5e1 100644 --- a/h5/js/report-ui.js +++ b/h5/js/report-ui.js @@ -22,7 +22,7 @@ return numeric(value) ? Math.min(9.9, Math.round((value + 1e-9) * 10) / 10).toFixed(1) : '-'; } var gradeRule = 'display-score-8-9-v1'; - var copyRule = 'wrinkles-excellent-acne-detected-water-contour-v3'; + var copyRule = 'wrinkles-excellent-acne-detected-water-contour-v4'; function scoreOfP(P) { return numeric(P) ? Math.round((Math.max(7, Math.min(10, 7 + 3 * P / 100)) + 1e-9) * 100) / 100 : null; } @@ -118,12 +118,6 @@ level = levelForScore(viewS); var template = valid && level ? Copy.conclusion[d[0]][level] : ''; if (d[0] === 'contour') { - // Mention only positively detected eye problems, independent of the - // contour grade. Missing data must not imply absence or presence. - var eyeNotes = [], pouch = vars.eye_pouch, severity = vars.dark_circle_sev; - if (numeric(pouch) && pouch % 1 === 0 && pouch >= 1 && pouch <= 3) eyeNotes.push(pouch === 1 ? '眼周眼袋初显' : '眼袋明显'); - if (numeric(severity) && severity % 1 === 0 && severity >= 1 && severity <= 3) eyeNotes.push(['','黑眼圈轻度','黑眼圈中度','黑眼圈重度'][severity]); - template = template.replace(/(?:眼袋明显|眼周眼袋初显|眼周无明显眼袋问题)、黑眼圈轻\/中\/重度(根据分数给出判断);/g, eyeNotes.length ? eyeNotes.join('、') + ';' : ''); if (vars.la == null || vars.ra == null) template = template.replace(/左右下颌线角度(?:分别为左|左) \{la\}°\/ 右 \{ra\}°[;;]/g, ''); } if (d[0] === 'color') { diff --git a/h5/test/contour-eye-copy.js b/h5/test/contour-eye-copy.js index 26ea8f5..d394099 100644 --- a/h5/test/contour-eye-copy.js +++ b/h5/test/contour-eye-copy.js @@ -1,17 +1,27 @@ 'use strict'; const assert=require('node:assert/strict'),S=require('../js/skin-score'),UI=require('../js/report-ui'); const raw=structuredClone(S.MOCK_RESULT),base=S.buildViewModel(raw,S.MOCK_SIDE,{}); +const expected={ + 改善:'面部轮廓紧致度有待提升,下颌线清晰度不足,左右下颌线角度分别为左 110°/ 右 112.5°;中面部容积略欠饱满,肌肤支撑力偏弱。', + 良好:'面部轮廓清晰,下颌线较为清晰,左右下颌线角度左 110°/ 右 112.5°;中面部容积无明显流失;肌肤处于健康状态,支撑力表现良好。', + 优秀:'面部轮廓紧致立体,下颌线清晰;中面部容积饱满,肌肤支撑力充足。' +}; for(const P of [20,50,90])for(const pouch of [0,1,2,3,null,9])for(const circle of [0,1,2,3,null,9,1.5]) { - const vm=structuredClone(base);vm.cats.contour.P=P;Object.assign(vm.cats.contour.vars,{eye_pouch:pouch,dark_circle_sev:circle}); + const vm=structuredClone(base);vm.cats.contour.P=P;Object.assign(vm.cats.contour.vars,{la:110,ra:112.5,eye_pouch:pouch,dark_circle_sev:circle}); const before=JSON.stringify(vm),text=UI.build(vm,raw).views.find(v=>v.key==='contour').text; - assert.equal(text.includes('眼袋'),[1,2,3].includes(pouch)); - assert.equal(text.includes('黑眼圈'),[1,2,3].includes(circle)); + assert(!/眼袋|黑眼圈/.test(text)); + assert.equal(text,expected[UI.levelForScore(UI.scoreOfP(P))]); assert(!/无明显眼袋|无明显黑眼圈|数据未获取|[;、]{2}|[{}]/.test(text)); assert.equal(JSON.stringify(vm),before); } -const saved=UI.build(base,raw);saved.copyRule='wrinkles-excellent-acne-detected-water-v2';saved.views[0].text='眼周无明显眼袋问题、无明显黑眼圈;'; +const saved=UI.build(base,raw);saved.copyRule='wrinkles-excellent-acne-detected-water-contour-v3';saved.views[0].text='眼周眼袋初显、黑眼圈轻度;'; base.cats.contour.vars.eye_pouch=0;base.cats.contour.vars.dark_circle_sev=2; const before=JSON.stringify(saved),display=UI.forDisplay(base,raw,saved); -assert(!display.views[0].text.includes('眼袋'));assert(display.views[0].text.includes('黑眼圈中度')); +assert(!/眼袋|黑眼圈/.test(display.views[0].text)); assert.equal(JSON.stringify(saved),before);assert.deepEqual(display.product,saved.product); -console.log('PASS contour eye copy: 126 grade/detection combinations, only positive problems, missing/invalid omitted, old report refresh and immutable scores/snapshots'); +assert.deepEqual(display.care.map(x=>x.key),saved.care.map(x=>x.key)); +for(const key of ['la','ra']){ + const vm=structuredClone(base);vm.cats.contour.P=20;vm.cats.contour.vars[key]=null; + assert(!/左右下颌线角度|[{}]|眼袋|黑眼圈/.test(UI.build(vm,raw).views[0].text)); +} +console.log('PASS contour copy: exact approved templates across 126 eye/grade combinations; missing angles omitted; old report refresh, scoring and recommendation immutable'); diff --git a/h5/test/display-grade.js b/h5/test/display-grade.js index 37aad48..e72fb23 100644 --- a/h5/test/display-grade.js +++ b/h5/test/display-grade.js @@ -27,7 +27,7 @@ r.score_info.wrinkle_score = 76; const vm = SS.buildViewModel(r,SS.MOCK_SIDE,{}), ui = UI.build(vm,r); assert.equal(UI.dimensionScore(vm.dims.firm.S),'9.3'); assert.equal(ui.views.find(v=>v.key==='contour').level,'优秀'); -assert(ui.views.find(v=>v.key==='contour').text.includes('眼袋明显'),'contour eye problem follows actual detection, not aggregate grade'); +assert(!/眼袋|黑眼圈/.test(ui.views.find(v=>v.key==='contour').text),'contour conclusion omits eye problems at all grades'); const old = structuredClone(ui); delete old.gradeRule; old.views[0].level='改善';old.views[0].text='旧轮廓文案'; diff --git a/reference/AI测肤报告页话术修改.md b/reference/AI测肤报告页话术修改.md index d97ab8f..867a348 100644 --- a/reference/AI测肤报告页话术修改.md +++ b/reference/AI测肤报告页话术修改.md @@ -16,11 +16,11 @@ #### 5\.1 轮廓(紧塑力) -**【改善】** 面部轮廓紧致度有待提升,下颌线清晰度不足,左右下颌线角度分别为左 \{la\}°/ 右 \{ra\}°;眼袋明显、黑眼圈轻/中/重度(根据分数给出判断);中面部容积略欠饱满,肌肤支撑力偏弱。 +**【改善】** 面部轮廓紧致度有待提升,下颌线清晰度不足,左右下颌线角度分别为左 \{la\}°/ 右 \{ra\}°;中面部容积略欠饱满,肌肤支撑力偏弱。 -**【良好】** 面部轮廓清晰,下颌线较为清晰,左右下颌线角度左 \{la\}°/ 右 \{ra\}°;眼周眼袋初显、黑眼圈轻/中/重度(根据分数给出判断);中面部容积无明显流失;肌肤处于健康状态,支撑力表现良好。 +**【良好】** 面部轮廓清晰,下颌线较为清晰,左右下颌线角度左 \{la\}°/ 右 \{ra\}°;中面部容积无明显流失;肌肤处于健康状态,支撑力表现良好。 -**【优秀】** 面部轮廓紧致立体,下颌线清晰;眼周无明显眼袋问题、黑眼圈轻/中/重度(根据分数给出判断);中面部容积饱满,肌肤支撑力充足。 +**【优秀】** 面部轮廓紧致立体,下颌线清晰;中面部容积饱满,肌肤支撑力充足。 #### 5\.2 皱纹(紧塑力)