var api = require('../../utils/api') var ble = require('../../services/ble') var diagnosis = require('../../services/diagnosis') var i18n = require('../../i18n/index') // diagnosis 的 wave key ('ir') 与 common.wavelengths 的 key ('infrared') 不同名,需映射 var WAVE_COMMON_KEY = { red: 'red', ir: 'infrared', uv: 'uv', yellow: 'yellow' } function pad2(n) { return (n < 10 ? '0' : '') + n } function formatTime(ms) { if (!ms) ms = Date.now() var d = new Date(ms) return d.getFullYear() + '-' + pad2(d.getMonth() + 1) + '-' + pad2(d.getDate()) + ' ' + pad2(d.getHours()) + ':' + pad2(d.getMinutes()) } Page({ data: { statusBarHeight: 44, loading: true, calibrated: true, hasProblem: false, scannedAtText: '', overallList: [], regionList: [], recommendList: [], faceZones: [], starting: false, error: '' }, onLoad: function (options) { var app = getApp() this.setData({ statusBarHeight: app.globalData.statusBarHeight }) this._options = options || {} }, onShow: function () { i18n.bind(this) this._loadReport() }, onBack: function () { wx.navigateBack({ fail: function () { wx.reLaunch({ url: '/pages/index/index' }) } }) }, _loadReport: function () { var self = this var app = getApp() var opts = self._options || {} if (opts.report_id) { self.setData({ loading: true }) api.getReport(opts.report_id).then(function (rep) { self._render(self._normalize(rep)) }).catch(function () { self._fallback() }) return } if (app.globalData.lastScanReport) { self._render(app.globalData.lastScanReport) return } self.setData({ loading: true }) api.getLatestReport().then(function (rep) { // Backend ok() coerces null -> {}, so treat an empty payload as "no report". if (self._hasContent(rep)) self._render(self._normalize(rep)) else self._fallback() }).catch(function () { self._fallback() }) }, _hasContent: function (rep) { if (!rep) return false return !!((rep.regions && rep.regions.length) || (rep.overall && rep.overall.length) || (rep.recommend_plan && rep.recommend_plan.length)) }, _fallback: function () { // Preview/demo when no device data is available yet. this._render(diagnosis.mockReport()) }, _normalize: function (rep) { if (!rep) return diagnosis.mockReport() var scannedAt = 0 if (typeof rep.scanned_at === 'number') scannedAt = rep.scanned_at else if (rep.scanned_at) scannedAt = Date.parse(rep.scanned_at) || 0 return { device_id: rep.device_id || null, scanned_at: scannedAt, regions: rep.regions || [], overall: rep.overall || [], recommend_mask: rep.recommend_mask || 0, recommend_plan: rep.recommend_plan || [], raw_pd: rep.raw_pd || {}, calibrated: !!rep.calibrated } }, _render: function (report) { var d = i18n.getDict().report var common = i18n.getDict().common function levelLabel(l) { if (l >= 3) return d.level.high if (l === 2) return d.level.mid if (l === 1) return d.level.low return d.noProblem } var overallList = (report.overall || []).map(function (o) { return { label: d.problems[o.type] || o.type, level: o.level, levelLabel: levelLabel(o.level) } }) function regionName(key) { return (common.regions && common.regions[key]) || key } function modeName(waveKey) { return (d.modeNames && d.modeNames[waveKey]) || '' } var regionList = (report.regions || []).map(function (r) { return { name: regionName(r.region), level: r.level, levelLabel: levelLabel(r.level), problemLabel: r.top_problem ? (d.problems[r.top_problem] || r.top_problem) : d.noProblem, hasProblem: !!r.top_problem } }) // 推荐护理:现在 recommend_plan 每区一条(可不同色),一条 BLE 命令可全部下发 var recommendList = (report.recommend_plan || []).map(function (p) { return { modeLabel: modeName(p.wave), wavelengthLabel: common.wavelengths[WAVE_COMMON_KEY[p.wave]] || '', regionsLabel: regionName(p.region), levelLabel: levelLabel(p.level), mask: p.mask } }) // 面罩示意图数据(固定 5 区,未扫描/无问题的区置灰) var byKey = {} ;(report.regions || []).forEach(function (r) { byKey[r.region] = r }) var faceZones = diagnosis.REGION_DEFS.map(function (def) { var r = byKey[def.key] var hasProblem = !!(r && r.top_problem && r.wave) return { key: def.key, waveKey: hasProblem ? r.wave : null, name: regionName(def.key), hasProblem: hasProblem, modeLabel: hasProblem ? modeName(r.wave) : '', levelLabel: hasProblem ? levelLabel(r.level) : '', colorClass: hasProblem ? 'zone-' + r.wave : 'zone-none' } }) this._report = report this.setData({ loading: false, calibrated: !!report.calibrated, hasProblem: overallList.length > 0, scannedAtText: formatTime(report.scanned_at), overallList: overallList, regionList: regionList, recommendList: recommendList, faceZones: faceZones, error: '' }) }, onTapZone: function (e) { var wave = e.currentTarget.dataset.wave wx.navigateTo({ url: '/pages/light-info/light-info' + (wave ? '?wave=' + wave : '') }) }, onStartRecommend: function () { var self = this var report = self._report || {} var plan = report.recommend_plan || [] if (!ble.isConnected()) { self.setData({ error: i18n.t('common.deviceNotConnected') }) return } if (!plan.length) return // 一条 33B 命令携带全部分区差异化方案(每区各自的光色,亮度来自 diagnosis config,默认 204=80%) var mask = report.recommend_mask || 0 var wl = plan[0].wavelength || 2 // treating 页展示用(多色场景显示首个) self.setData({ starting: true, error: '' }) ble.setParams({ plan: plan.map(function (p) { return { mask: p.mask, wave: p.wave, brightness: p.brightness } }), duration_ms: 600000, control: 0x02 }).then(function () { return ble.startTreatment(mask) }).then(function () { wx.redirectTo({ url: '/pages/treating/treating?regions=' + mask + '&wavelength=' + wl + '&duration=600000&mode=1' }) }).catch(function (err) { self.setData({ starting: false, error: (err && err.error_msg) || i18n.t('common.networkError') }) }) }, onManual: function () { wx.redirectTo({ url: '/pages/manual-treatment/manual-treatment' }) } })