From 55a9c7e3e88c219b50168458efef0597b591ecf5 Mon Sep 17 00:00:00 2001 From: lik Date: Fri, 2 Oct 2026 10:28:44 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=95=8C=E9=9D=A2=E4=B8=AD?= =?UTF-8?q?=EF=BC=8C=E4=B8=B4=E6=97=B6=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _verify.ps1 | 7 + _verify2.ps1 | 17 + app.json | 9 +- app.wxss | 29 +- custom-tab-bar/index.js | 39 +++ custom-tab-bar/index.json | 6 + custom-tab-bar/index.wxml | 18 + custom-tab-bar/index.wxss | 33 ++ images/ai-green.png | Bin 6209 -> 3385 bytes images/ai-ink.png | Bin 0 -> 3303 bytes images/home-green.png | Bin 6911 -> 3852 bytes images/mine-green.png | Bin 4630 -> 2373 bytes pages/ai/aichat.js | 6 + pages/ai/aichat.wxss | 5 +- pages/escort/guide.js | 72 ++++ pages/escort/guide.json | 6 + pages/escort/guide.wxml | 75 +++++ pages/escort/guide.wxss | 207 ++++++++++++ pages/escort/itemdetail.js | 71 +++- pages/escort/itemdetail.wxml | 20 ++ pages/escort/itemdetail.wxss | 60 ++++ pages/escort/itemlist.json | 2 +- pages/health/profileedit.js | 221 +++++++++++++ pages/health/profileedit.json | 6 + pages/health/profileedit.wxml | 62 ++++ pages/health/profileedit.wxss | 165 +++++++++ pages/health/profilelist.js | 134 ++++++++ pages/health/profilelist.json | 8 + pages/health/profilelist.wxml | 66 ++++ pages/health/profilelist.wxss | 166 ++++++++++ pages/home/index.js | 314 ++++++++++-------- pages/home/index.wxml | 164 ++++----- pages/home/index.wxss | 607 ++++++++++++++++++++++------------ pages/mine/contact.js | 70 ++++ pages/mine/contact.json | 6 + pages/mine/contact.wxml | 35 ++ pages/mine/contact.wxss | 145 ++++++++ pages/mine/mine.js | 17 +- pages/mine/mine.wxml | 8 + pages/mine/mine.wxss | 24 ++ utils/api.js | 9 + 41 files changed, 2458 insertions(+), 451 deletions(-) create mode 100644 _verify.ps1 create mode 100644 _verify2.ps1 create mode 100644 custom-tab-bar/index.js create mode 100644 custom-tab-bar/index.json create mode 100644 custom-tab-bar/index.wxml create mode 100644 custom-tab-bar/index.wxss create mode 100644 images/ai-ink.png create mode 100644 pages/escort/guide.js create mode 100644 pages/escort/guide.json create mode 100644 pages/escort/guide.wxml create mode 100644 pages/escort/guide.wxss create mode 100644 pages/health/profileedit.js create mode 100644 pages/health/profileedit.json create mode 100644 pages/health/profileedit.wxml create mode 100644 pages/health/profileedit.wxss create mode 100644 pages/health/profilelist.js create mode 100644 pages/health/profilelist.json create mode 100644 pages/health/profilelist.wxml create mode 100644 pages/health/profilelist.wxss create mode 100644 pages/mine/contact.js create mode 100644 pages/mine/contact.json create mode 100644 pages/mine/contact.wxml create mode 100644 pages/mine/contact.wxss diff --git a/_verify.ps1 b/_verify.ps1 new file mode 100644 index 0000000..fa65c5a --- /dev/null +++ b/_verify.ps1 @@ -0,0 +1,7 @@ +Add-Type -AssemblyName System.Drawing +$bmp = [System.Drawing.Bitmap]::FromFile('d:\work\health\code\ws_health\ui\wxapp_escort\images\home-green.png') +$p = $bmp.GetPixel(64, 64) +Write-Host "home-green center: $($p.R),$($p.G),$($p.B)" +$bmp.Dispose() +Remove-Item 'd:\work\health\code\ws_health\ui\wxapp_escort\_reicon.ps1', 'd:\work\health\code\ws_health\ui\wxapp_escort\_sample.ps1' -ErrorAction SilentlyContinue +Write-Host 'temp scripts cleaned' \ No newline at end of file diff --git a/_verify2.ps1 b/_verify2.ps1 new file mode 100644 index 0000000..848a73c --- /dev/null +++ b/_verify2.ps1 @@ -0,0 +1,17 @@ +Add-Type -AssemblyName System.Drawing +foreach ($n in 'home-green', 'ai-green', 'mine-green') { + $bmp = [System.Drawing.Bitmap]::FromFile("d:\work\health\code\ws_health\ui\wxapp_escort\images\$n.png") + $counts = @{} + for ($x = 0; $x -lt $bmp.Width; $x += 2) { + for ($y = 0; $y -lt $bmp.Height; $y += 2) { + $p = $bmp.GetPixel($x, $y) + if ($p.A -lt 128) { continue } + $key = '{0},{1},{2}' -f $p.R, $p.G, $p.B + $counts[$key] = [int]$counts[$key] + 1 + } + } + $top = $counts.GetEnumerator() | Sort-Object Value -Descending | Select-Object -First 2 + $line = ($top | ForEach-Object { "$($_.Key)=$($_.Value)" }) -join ' ' + Write-Host "$n : $line" + $bmp.Dispose() +} \ No newline at end of file diff --git a/app.json b/app.json index 963839f..69bba56 100644 --- a/app.json +++ b/app.json @@ -7,21 +7,26 @@ "pages/escort/recordlist", "pages/escort/agreement", "pages/escort/recorddetail", + "pages/escort/guide", + "pages/health/profilelist", + "pages/health/profileedit", "pages/mine/mine", "pages/mine/about", + "pages/mine/contact", "pages/hospital/contact", "pages/hospital/ranking", "pages/home/webview" ], "window": { "backgroundTextStyle": "light", - "navigationBarBackgroundColor": "#FFFFFF", + "navigationBarBackgroundColor": "#FAFAF9", "navigationBarTitleText": "暖橙陪诊", "navigationBarTextStyle": "black" }, "tabBar": { + "custom": true, "color": "#999999", - "selectedColor": "#2D6A4F", + "selectedColor": "#C2410C", "backgroundColor": "#FFFFFF", "borderStyle": "black", "list": [ diff --git a/app.wxss b/app.wxss index 6dd876b..f7113ed 100644 --- a/app.wxss +++ b/app.wxss @@ -1,22 +1,29 @@ /**app.wxss**/ page { - --td-brand-color-1: #fff8f0; - --td-brand-color-2: #ffe8d4; - --td-brand-color-3: #ffd4a8; - --td-brand-color-4: #ffbb72; - --td-brand-color-5: #ff9b33; - --td-brand-color-6: #ff8500; - --td-brand-color-7: #FF9B33; - --td-brand-color-8: #e68600; - --td-brand-color-9: #cc6e00; - --td-brand-color-10: #a35700; + /* 品牌翠绿:#22A45D 为基准色(第 7 档),向浅/深各展开数档。 + 首页主视觉已确定该绿为品牌主色,全站令牌与之对齐, + 避免二级页沿用旧橙色造成首页与内页两套配色。 */ + --td-brand-color-1: #f0faf3; + --td-brand-color-2: #dcf3e3; + --td-brand-color-3: #bce6cb; + --td-brand-color-4: #8ed6a9; + --td-brand-color-5: #5cc387; + --td-brand-color-6: #3bb471; + --td-brand-color-7: #22a45d; + --td-brand-color-8: #1b8550; + --td-brand-color-9: #166940; + --td-brand-color-10: #114f31; --td-brand-color: var(--td-brand-color-7); --td-brand-color-active: var(--td-brand-color-8); --td-brand-color-disabled: var(--td-brand-color-3); --td-brand-color-light: var(--td-brand-color-1); --td-brand-color-light-active: var(--td-brand-color-2); - background-color: #FAF6F1; + + /* 深锚点:用于标题、Logo 文字等需要"分量"的地方,压住整页的重心 */ + --c-ink: #1c1917; + + background-color: #ffffff; font-family: -apple-system, PingFang SC, Microsoft YaHei, sans-serif; } diff --git a/custom-tab-bar/index.js b/custom-tab-bar/index.js new file mode 100644 index 0000000..2eb27f7 --- /dev/null +++ b/custom-tab-bar/index.js @@ -0,0 +1,39 @@ +// 自定义 tabBar:原生 tabBar 只能放 PNG 位图,三个图标分别是 +// 实心"手托心" / 气泡里塞"AI"字 / 线框人形,风格互相打架。 +// 改用 TDesign 图标字体后,三个 tab 走同一套线性笔触,只靠颜色区分选中态。 +Component({ + data: { + selected: 0, // 当前选中项,由各 tab 页在 onShow 里同步 + activeColor: '#C2410C', // 选中:暖橙深一档,白底 4.69:1,过 WCAG AA 正文标准 + inactiveColor: '#7A7068', // 未选中:暖灰,白底 4.83:1,过 WCAG AA 正文标准 + list: [{ + pagePath: '/pages/home/index', + text: '首页', + icon: 'home' + }, { + pagePath: '/pages/ai/aichat', + text: 'AI客服', + icon: 'chat' + }, { + pagePath: '/pages/mine/mine', + text: '我的', + icon: 'user' + }] + }, + + methods: { + onTap(e) { + const { + index, + path + } = e.currentTarget.dataset + // 重复点击当前 tab 不做跳转,避免页面被重置 + if (index === this.data.selected) { + return + } + wx.switchTab({ + url: path + }) + } + } +}) diff --git a/custom-tab-bar/index.json b/custom-tab-bar/index.json new file mode 100644 index 0000000..3fb9848 --- /dev/null +++ b/custom-tab-bar/index.json @@ -0,0 +1,6 @@ +{ + "component": true, + "usingComponents": { + "t-icon": "tdesign-miniprogram/icon/icon" + } +} diff --git a/custom-tab-bar/index.wxml b/custom-tab-bar/index.wxml new file mode 100644 index 0000000..ba2c2c5 --- /dev/null +++ b/custom-tab-bar/index.wxml @@ -0,0 +1,18 @@ + + + + + {{ item.text }} + + diff --git a/custom-tab-bar/index.wxss b/custom-tab-bar/index.wxss new file mode 100644 index 0000000..9a62334 --- /dev/null +++ b/custom-tab-bar/index.wxss @@ -0,0 +1,33 @@ +/* 自定义 tabBar 脱离文档流,fixed 在底部; + 各 tab 页需自备底部占位(见 home / aichat / mine 的底部留白),否则内容会被盖住 */ +.tab-bar { + position: fixed; + left: 0; + right: 0; + bottom: 0; + z-index: 100; + display: flex; + padding: 12rpx 0 calc(12rpx + env(safe-area-inset-bottom)); + background: #FFFFFF; + border-top: 2rpx solid #F0E9E0; +} + +.tab-item { + flex: 1; + display: flex; + flex-direction: column; + align-items: center; +} + +.tab-text { + margin-top: 6rpx; + /* 与全局约束一致:中文正文不小于 24rpx(12px) */ + font-size: 24rpx; + line-height: 1; + color: #7A7068; +} + +.tab-item.is-active .tab-text { + color: #C2410C; + font-weight: 600; +} diff --git a/images/ai-green.png b/images/ai-green.png index 1c9a811c270768a6e76d29630e3e85a235b466b6..310f335ab4baa4619f372ecc7d311e0289d8b69e 100644 GIT binary patch literal 3385 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 K7Io&n3I78hWNT6Y literal 6209 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 literal 6911 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 diff --git a/images/mine-green.png b/images/mine-green.png index 57d82971e4154d1c76e6db3909a573d8eff77985..a0468d04a814293d0570969ba3c593af2bd46806 100644 GIT binary patch delta 2363 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 diff --git a/pages/ai/aichat.js b/pages/ai/aichat.js index 89ca034..7e186c6 100644 --- a/pages/ai/aichat.js +++ b/pages/ai/aichat.js @@ -28,6 +28,12 @@ Page({ onShow() { this.getAiQuickQuestions() this.setData({ inputFocus: true }) + // 同步自定义 tabBar 选中态(AI客服为第 1 项) + if (typeof this.getTabBar === 'function' && this.getTabBar()) { + this.getTabBar().setData({ + selected: 1 + }) + } }, // 获取陪诊服务问题 diff --git a/pages/ai/aichat.wxss b/pages/ai/aichat.wxss index 3f9dfda..1139f12 100644 --- a/pages/ai/aichat.wxss +++ b/pages/ai/aichat.wxss @@ -2,6 +2,9 @@ display: flex; flex-direction: column; height: 100vh; + box-sizing: border-box; + /* 给 fixed 的自定义 tabBar 留位;安全区由这里统一承担,输入区不再重复加 */ + padding-bottom: calc(140rpx + env(safe-area-inset-bottom)); background-color: #F5F5F5; position: relative; } @@ -289,7 +292,6 @@ .input-area { background-color: #FFFFFF; padding: 20rpx 24rpx; - padding-bottom: calc(20rpx + env(safe-area-inset-bottom)); border-top: 1rpx solid #EEEEEE; } @@ -337,7 +339,6 @@ /* AI声明 */ .ai-disclaimer { padding: 12rpx 24rpx; - padding-bottom: calc(12rpx + env(safe-area-inset-bottom)); text-align: center; background-color: #F5F5F5; } diff --git a/pages/escort/guide.js b/pages/escort/guide.js new file mode 100644 index 0000000..8ef3526 --- /dev/null +++ b/pages/escort/guide.js @@ -0,0 +1,72 @@ +// pages/escort/guide.js + +// 人工客服电话:与首页、关于我们保持一致 +const SERVICE_PHONE = '18618162956' + +Page({ + data: { + // 服务流程:与 itemdetail 的「服务流程」同构,这里只描述通用环节 + steps: [{ + title: '线上预约', + desc: '选择服务项目,填写就诊医院、科室与时间' + }, + { + title: '需求确认', + desc: '客服电话核对就诊信息与特殊需求' + }, + { + title: '陪诊师接单', + desc: '按需求匹配陪诊师,出发前与您联系' + }, + { + title: '全程陪同', + desc: '取号、缴费、检查、取药全程有人陪' + }, + { + title: '服务完成', + desc: '确认服务结果,客服回访并处理售后' + } + ], + // 就诊前准备:到院前建议提前备齐的材料 + preparations: [ + '就诊人身份证、医保卡(或电子医保凭证)', + '既往病历、检查报告与影像资料', + '需要空腹的项目,就诊当天请勿进食进水', + '长期服用的药物清单,方便医生了解用药情况', + '提前与陪诊师确认医院、院区与集合地点' + ], + // 温馨提示:通用提醒,不涉及具体退款或收费规则 + tips: [ + '建议比预约时间提前 10-15 分钟到达集合点', + '贵重物品与重要证件请自行随身保管', + '就诊时间或需求有变化,请尽早联系客服调整' + ] + }, + + // 下一步:进入陪诊服务列表 + goToServiceList() { + wx.navigateTo({ + url: '/pages/escort/itemlist' + }) + }, + + // 兜底出口:仍有疑问可直接拨打客服电话 + goToContact() { + wx.makePhoneCall({ + phoneNumber: SERVICE_PHONE + }) + }, + + onShareAppMessage() { + return { + title: '暖橙陪诊 · 陪诊指南', // 转发标题 + path: '/pages/escort/guide' + } + }, + + onShareTimeline() { + return { + title: '暖橙陪诊 · 陪诊指南' + } + } +}) diff --git a/pages/escort/guide.json b/pages/escort/guide.json new file mode 100644 index 0000000..316990a --- /dev/null +++ b/pages/escort/guide.json @@ -0,0 +1,6 @@ +{ + "navigationBarTitleText": "陪诊指南", + "usingComponents": { + "t-icon": "tdesign-miniprogram/icon/icon" + } +} diff --git a/pages/escort/guide.wxml b/pages/escort/guide.wxml new file mode 100644 index 0000000..55c7efe --- /dev/null +++ b/pages/escort/guide.wxml @@ -0,0 +1,75 @@ + + + + + + + + 陪诊指南 + 第一次用陪诊?三分钟看懂全流程 + + + + + + + + + 服务流程 + + + + {{ index + 1 }} + + {{ item.title }} + {{ item.desc }} + + + + + + + + + + + + 就诊前准备 + + + + + {{ item }} + + + + + + + + + + + 温馨提示 + + + + + {{ item }} + + + + + + + 查看陪诊服务 + + + + + 还有疑问?联系人工客服 + + + + + diff --git a/pages/escort/guide.wxss b/pages/escort/guide.wxss new file mode 100644 index 0000000..d04059a --- /dev/null +++ b/pages/escort/guide.wxss @@ -0,0 +1,207 @@ +/* pages/escort/guide.wxss + 内页规范:小色带 + 白底,不用整块主色面板; + 卡片沿用首页「发丝边 + 紧阴影」,与首页保持同一套视觉语言 */ +page { + --brand-strong: #C2410C; /* 实心块/按钮:白字 4.69:1,过 AA 正文 */ + --brand-soft: #FFF4E8; /* 图标衬底、标签底 */ + --brand-line: #FFE0C2; /* 浅橙衬底描边 */ + --brand-ink: #9A3412; /* 浅橙衬底上的文字/图标:6.8:1,过 AA */ + + --ink: #2B2521; + --ink-2: #4A4038; + --muted: #7A7068; /* 白底 4.8:1,过 AA 正文 */ + --line: #F0E9E0; /* 米色发丝边 */ + --paper: #FAF6F0; /* 暖白纸面 */ + --white: #FFFFFF; + + --shadow-card: 0 2rpx 10rpx rgba(63, 43, 25, 0.04); + + background-color: var(--paper); +} + +.page-bg { + min-height: 100vh; + background: var(--paper); +} + +.container { + padding: 32rpx 32rpx 0; +} + +/* ===== 头部:小色带 + 深墨标题 ===== */ +.page-header { + padding: 24rpx 0 8rpx; +} + +.header-accent { + width: 64rpx; + height: 8rpx; + border-radius: 4rpx; + background: var(--brand-strong); +} + +.header-title { + display: block; + margin-top: 20rpx; + font-size: 46rpx; + font-weight: 700; + color: var(--ink); + letter-spacing: 1rpx; +} + +.header-subtitle { + display: block; + margin-top: 12rpx; + font-size: 26rpx; + color: var(--muted); + letter-spacing: 1rpx; +} + +/* ===== 通用白卡 ===== */ +.card { + margin-top: 32rpx; + padding: 28rpx 26rpx; + border-radius: 28rpx; + background: var(--white); + border: 2rpx solid var(--line); + box-shadow: var(--shadow-card); +} + +.card-head { + display: flex; + align-items: center; + margin-bottom: 20rpx; +} + +.card-mark { + width: 44rpx; + height: 44rpx; + border-radius: 12rpx; + background: var(--brand-strong); + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; +} + +.card-title { + margin-left: 14rpx; + font-size: 32rpx; + font-weight: 700; + color: var(--ink); + letter-spacing: 1rpx; +} + +/* ===== 服务流程:左侧序号 + 递进条目 ===== */ +.step-item { + display: flex; + padding: 18rpx 0; +} + +.step-index { + width: 44rpx; + height: 44rpx; + border-radius: 50%; + background: var(--brand-soft); + color: var(--brand-ink); + font-size: 26rpx; + font-weight: 700; + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; + margin-right: 20rpx; +} + +.step-body { + display: flex; + flex-direction: column; + flex: 1; + min-width: 0; +} + +.step-title { + font-size: 30rpx; + font-weight: 600; + color: var(--ink); +} + +.step-desc { + margin-top: 8rpx; + font-size: 26rpx; + color: var(--muted); + line-height: 1.6; +} + +/* ===== 要点列表 ===== */ +.dot-item { + display: flex; + padding: 12rpx 0; +} + +.dot { + width: 10rpx; + height: 10rpx; + border-radius: 50%; + background: var(--brand-strong); + margin: 16rpx 18rpx 0 4rpx; + flex-shrink: 0; +} + +.dot-text { + flex: 1; + font-size: 28rpx; + color: var(--ink-2); + line-height: 1.7; +} + +/* ===== 底部出口 ===== */ +.guide-cta { + display: flex; + align-items: center; + justify-content: center; + margin-top: 48rpx; + padding: 26rpx; + border-radius: 999rpx; + background: var(--brand-strong); + box-shadow: 0 6rpx 16rpx rgba(194, 65, 12, 0.22); + transition: transform 0.15s ease; +} + +.guide-cta:active { + transform: scale(0.98); +} + +.guide-cta-text { + font-size: 30rpx; + font-weight: 600; + color: var(--white); + letter-spacing: 2rpx; + margin-right: 6rpx; +} + +.guide-help { + display: flex; + align-items: center; + justify-content: center; + margin-top: 24rpx; + padding: 22rpx; + border-radius: 20rpx; + background: var(--brand-soft); + border: 2rpx solid var(--brand-line); +} + +.guide-help:active { + opacity: 0.75; +} + +.guide-help-text { + margin-left: 12rpx; + font-size: 26rpx; + font-weight: 600; + color: var(--brand-ink); +} + +.footer-space { + height: 60rpx; +} diff --git a/pages/escort/itemdetail.js b/pages/escort/itemdetail.js index 05e6120..ac9a374 100644 --- a/pages/escort/itemdetail.js +++ b/pages/escort/itemdetail.js @@ -15,6 +15,8 @@ Page({ }, totalPrice: '0.00', showOrderPopup: false, + profiles: [], // 健康档案里已保存的就诊人 + selectedProfileId: '', // 当前选中的就诊人档案 ID,为空表示手动填写 patientName: '', patientPhone: '', province: '', @@ -48,6 +50,13 @@ Page({ this.loadServiceDetail(serviceId) }, + onShow() { + // 从"新增就诊人"页面返回时,弹窗还开着就刷新一次可选的就诊人 + if (this.data.showOrderPopup) { + this.loadProfiles() + } + }, + loadServiceDetail(id) { const app = getApp() let service = null @@ -86,8 +95,57 @@ Page({ this.setData({ patientName: user.profile?.name || '', patientPhone: user.profile?.mobile || '', + selectedProfileId: '', showOrderPopup: true }) + + this.loadProfiles() + }, + + // 读取已保存的就诊人,供弹窗内一键选择 + loadProfiles() { + API.healthProfile.getMyProfiles({ + page: 1, + pageSize: 20 + }) + .then((res) => { + if (res.code !== 0) { + return + } + const list = ((res.data && res.data.list) || []).map((item) => ({ + _id: item._id, + name: item.profile?.name || '', + mobile: item.profile?.mobile || '' + })) + this.setData({ + profiles: list + }) + }) + .catch((err) => { + console.log('获取就诊人列表失败', err) + }) + }, + + // 选择就诊人:自动带入姓名与联系电话 + onSelectProfile(e) { + const id = e.currentTarget.dataset.id + const profile = this.data.profiles.find((item) => item._id === id) + if (!profile) { + return + } + + this.setData({ + selectedProfileId: id, + patientName: profile.name, + patientPhone: profile.mobile + }) + }, + + // 跳转到健康档案新增就诊人 + goToAddProfile() { + wx.navigateTo({ + url: '/pages/health/profileedit' + }) }, closeOrderPopup() { @@ -96,15 +154,18 @@ Page({ }) }, + // 手动修改姓名/电话后,不再与所选档案对应,清空选择避免存档信息不一致 onPatientNameChange(e) { this.setData({ - patientName: e.detail.value + patientName: e.detail.value, + selectedProfileId: '' }) }, onPatientPhoneChange(e) { this.setData({ - patientPhone: e.detail.value + patientPhone: e.detail.value, + selectedProfileId: '' }) }, @@ -256,6 +317,11 @@ Page({ } } + // 选择了已保存的就诊人时,一并记录档案 ID + if (this.data.selectedProfileId) { + orderData.healthProfileId = this.data.selectedProfileId + } + wx.showLoading({ title: '提交中...' }) @@ -292,6 +358,7 @@ Page({ resetForm() { this.setData({ + selectedProfileId: '', patientName: '', patientPhone: '', province: '', diff --git a/pages/escort/itemdetail.wxml b/pages/escort/itemdetail.wxml index 6b00284..a746d47 100644 --- a/pages/escort/itemdetail.wxml +++ b/pages/escort/itemdetail.wxml @@ -96,6 +96,26 @@ + + + 选择就诊人 + + + + {{item.name}} + {{item.mobile}} + + + + 添加就诊人 + + + + + 还没有就诊人,去添加后可一键带入 › + + + 就诊人姓名 diff --git a/pages/escort/itemdetail.wxss b/pages/escort/itemdetail.wxss index d82ea61..1e459b2 100644 --- a/pages/escort/itemdetail.wxss +++ b/pages/escort/itemdetail.wxss @@ -493,3 +493,63 @@ page { .popup-submit-btn::after { border: none; } + +/* 就诊人选择 */ +.patient-scroll { + width: 100%; + white-space: nowrap; +} + +.patient-chips { + display: inline-flex; + gap: 16rpx; +} + +.patient-chip { + display: inline-flex; + flex-direction: column; + min-width: 160rpx; + padding: 14rpx 24rpx; + border-radius: 16rpx; + background: #F9FAFB; + border: 2rpx solid #F3F4F6; + box-sizing: border-box; +} + +.patient-chip.active { + background: #FDF8EE; + border-color: #D4A853; +} + +.patient-chip-name { + font-size: 26rpx; + color: #374151; + font-weight: 600; +} + +.patient-chip.active .patient-chip-name { + color: #D4A853; +} + +.patient-chip-phone { + font-size: 22rpx; + color: #9CA3AF; + margin-top: 6rpx; +} + +.patient-chip-add { + justify-content: center; +} + +.add-profile-tip { + width: 100%; + padding: 18rpx 24rpx; + border-radius: 16rpx; + background: #FDF8EE; + box-sizing: border-box; +} + +.add-profile-tip-text { + font-size: 24rpx; + color: #A1864B; +} diff --git a/pages/escort/itemlist.json b/pages/escort/itemlist.json index 9172073..fb6ae7f 100644 --- a/pages/escort/itemlist.json +++ b/pages/escort/itemlist.json @@ -1,4 +1,4 @@ { "usingComponents": {}, - "navigationBarTitleText": "助诊服务" + "navigationBarTitleText": "陪诊服务" } \ No newline at end of file diff --git a/pages/health/profileedit.js b/pages/health/profileedit.js new file mode 100644 index 0000000..67e1986 --- /dev/null +++ b/pages/health/profileedit.js @@ -0,0 +1,221 @@ +const API = require('../../utils/api.js') + +// 性别选项,与后端 schema 的 male / female 对应 +const SEX_OPTIONS = [{ + value: 'male', + label: '男' + }, + { + value: 'female', + label: '女' + } +] + +const MOBILE_REGEX = /^1[3-9]\d{9}$/ + +Page({ + data: { + id: '', + isEdit: false, + saving: false, + today: '', + sexOptions: SEX_OPTIONS, + form: { + name: '', + sex: '', + birth: '', + mobile: '', + idnumber: '', + remark: '' + } + }, + + onLoad(options) { + const id = options.id || '' + + this.setData({ + id, + isEdit: !!id, + today: this.formatDate(new Date()) + }) + + wx.setNavigationBarTitle({ + title: id ? '编辑就诊人' : '新增就诊人' + }) + + if (id) { + this.loadProfile(id) + } + }, + + formatDate(date) { + const year = date.getFullYear() + const month = String(date.getMonth() + 1).padStart(2, '0') + const day = String(date.getDate()).padStart(2, '0') + return `${year}-${month}-${day}` + }, + + // 编辑模式:读取档案详情回填表单 + loadProfile(id) { + API.healthProfile.getMyProfileById(id) + .then((res) => { + if (res.code !== 0) { + wx.showToast({ + title: res.msg || '加载失败', + icon: 'none' + }) + return + } + const detail = (res.data && res.data.profile) || {} + const profile = detail.profile || {} + const health = detail.health || {} + + this.setData({ + form: { + name: profile.name || '', + sex: profile.sex || '', + birth: profile.birth || '', + mobile: profile.mobile || '', + idnumber: profile.idnumber || '', + remark: health.remark || '' + } + }) + }) + .catch((err) => { + console.log('获取就诊人信息失败', err) + wx.showToast({ + title: '网络请求失败', + icon: 'none' + }) + }) + }, + + onFieldInput(e) { + const field = e.currentTarget.dataset.field + this.setData({ + [`form.${field}`]: e.detail.value + }) + }, + + onSexSelect(e) { + const sex = e.currentTarget.dataset.sex + // 再次点击已选中的性别则取消选择 + this.setData({ + 'form.sex': this.data.form.sex === sex ? '' : sex + }) + }, + + onBirthChange(e) { + this.setData({ + 'form.birth': e.detail.value + }) + }, + + // 表单校验,返回错误提示文案;通过校验返回空字符串 + validate() { + const { + name, + mobile + } = this.data.form + + if (!name.trim()) { + return '请输入就诊人姓名' + } + if (!mobile.trim()) { + return '请输入联系电话' + } + if (!MOBILE_REGEX.test(mobile.trim())) { + return '请输入正确的手机号' + } + return '' + }, + + onSave() { + if (this.data.saving) { + return + } + + const errorMessage = this.validate() + if (errorMessage) { + wx.showToast({ + title: errorMessage, + icon: 'none' + }) + return + } + + const { + name, + sex, + birth, + mobile, + idnumber, + remark + } = this.data.form + + // 新增用嵌套对象(schema 的 new Model 需要嵌套结构); + // 更新用点号路径(schema 更新姓名时会额外写 profile.pinyin,整体替换 profile 会冲突) + const payload = this.data.isEdit ? { + 'profile.name': name.trim(), + 'profile.sex': sex, + 'profile.birth': birth, + 'profile.mobile': mobile.trim(), + 'profile.idnumber': idnumber.trim(), + 'health.remark': remark.trim() + } : { + profile: { + name: name.trim(), + sex: sex, + birth: birth, + mobile: mobile.trim(), + idnumber: idnumber.trim() + }, + health: { + remark: remark.trim() + } + } + + this.setData({ + saving: true + }) + wx.showLoading({ + title: '保存中...' + }) + + const request = this.data.isEdit ? + API.healthProfile.updateMyProfile(this.data.id, payload) : + API.healthProfile.createMyProfile(payload) + + request + .then((res) => { + wx.hideLoading() + if (res.code !== 0) { + wx.showToast({ + title: res.msg || '保存失败', + icon: 'none' + }) + return + } + wx.showToast({ + title: '保存成功', + icon: 'success' + }) + setTimeout(() => { + wx.navigateBack() + }, 800) + }) + .catch((err) => { + wx.hideLoading() + console.log('保存就诊人失败', err) + wx.showToast({ + title: '网络请求失败', + icon: 'none' + }) + }) + .finally(() => { + this.setData({ + saving: false + }) + }) + } +}) diff --git a/pages/health/profileedit.json b/pages/health/profileedit.json new file mode 100644 index 0000000..b623dbf --- /dev/null +++ b/pages/health/profileedit.json @@ -0,0 +1,6 @@ +{ + "navigationBarTitleText": "新增就诊人", + "usingComponents": { + "t-icon": "tdesign-miniprogram/icon/icon" + } +} diff --git a/pages/health/profileedit.wxml b/pages/health/profileedit.wxml new file mode 100644 index 0000000..e114b2f --- /dev/null +++ b/pages/health/profileedit.wxml @@ -0,0 +1,62 @@ + + + + + 姓名* + + + + + 性别 + + + {{item.label}} + + + + + + 出生年月 + + + {{form.birth || '请选择出生年月'}} + + + + + + 联系电话* + + + + + 证件号 + + + + + + + 健康备注 +