Compare commits

...

11 Commits

Author SHA1 Message Date
kola-web f475dabd54 直播分享bug处理 1 week ago
kola-web 9c78847557 直播增强 4 weeks ago
kola-web 6a0bb0c838 直播分享功能开发 4 weeks ago
kola-web 5c6fb69758 首页直播banner替换 1 month ago
kola-web 7ebf87739d 直播样式修改 1 month ago
kola-web 4d3b419109 qol优化处理 1 month ago
kola-web 55680f540a 众测问题处理 1 month ago
kola-web 2786eb842f 众测问题处理 1 month ago
kola-web 57988c941a qol功能开发 2 months ago
kola-web 61e9b3dbbf 隐私协议 2 months ago
kola-web 138cfd2212 量表开发 2 months ago
  1. 4
      README.md
  2. 2
      dist.ps1
  3. 10
      project.config.json
  4. 53
      project.private.config.json
  5. 6
      src/app.json
  6. 4
      src/app.scss
  7. 19
      src/app.ts
  8. 2
      src/components/patient-tab-bar/index.scss
  9. 9
      src/components/popup/index.scss
  10. 7
      src/components/popup/index.wxml
  11. 19
      src/components/toast/index.scss
  12. 1
      src/components/toast/index.wxml
  13. 2
      src/doc/pages/doc1/index.ts
  14. 4
      src/doc/pages/doc2/index.scss
  15. 6
      src/doc/pages/doc2/index.ts
  16. 17
      src/doc/pages/doc2/index.wxml
  17. BIN
      src/images/bg13.png
  18. BIN
      src/images/bg14.png
  19. BIN
      src/images/bg15.png
  20. BIN
      src/images/bg16.png
  21. BIN
      src/images/bg17.png
  22. BIN
      src/images/bg18.png
  23. BIN
      src/images/bg19.png
  24. BIN
      src/images/bg20.png
  25. BIN
      src/images/bg21.png
  26. BIN
      src/images/code1.png
  27. BIN
      src/images/icon69.png
  28. BIN
      src/images/icon70.png
  29. BIN
      src/images/icon71.png
  30. BIN
      src/images/icon72.png
  31. BIN
      src/images/icon73.png
  32. BIN
      src/images/icon74.png
  33. BIN
      src/images/icon75.png
  34. BIN
      src/images/start.png
  35. BIN
      src/images/title6.png
  36. BIN
      src/images/title7.png
  37. BIN
      src/images/za-images/live-banner.png
  38. 6
      src/pages/d_interactive/index.ts
  39. 40
      src/pages/d_interactiveDoctor/index.scss
  40. 13
      src/pages/d_interactiveDoctor/index.ts
  41. 22
      src/pages/d_interactiveDoctor/index.wxml
  42. 2
      src/pages/d_invite/index.ts
  43. 8
      src/pages/d_patient/index.ts
  44. 2
      src/pages/d_patient/index.wxml
  45. 61
      src/pages/d_patientDetail/index.scss
  46. 626
      src/pages/d_patientDetail/index.ts
  47. 53
      src/pages/d_patientDetail/index.wxml
  48. 2
      src/pages/d_userInfo/index.ts
  49. 35
      src/pages/home/index.ts
  50. 13
      src/pages/home/index.wxml
  51. 6
      src/pages/information/index.ts
  52. 4
      src/pages/informationDetail/index.ts
  53. 12
      src/pages/login/index.ts
  54. 6
      src/pages/my/index.ts
  55. 2
      src/patient/pages/doctorDetail/index.scss
  56. 2
      src/patient/pages/doctorDetail/index.wxml
  57. 14
      src/patient/pages/enterInfo/index.wxml
  58. 84
      src/patient/pages/index/index.scss
  59. 70
      src/patient/pages/index/index.ts
  60. 43
      src/patient/pages/index/index.wxml
  61. 40
      src/patient/pages/interactivePatient/index.scss
  62. 5
      src/patient/pages/interactivePatient/index.ts
  63. 20
      src/patient/pages/interactivePatient/index.wxml
  64. 9
      src/patient/pages/live/index.scss
  65. 2
      src/patient/pages/live/index.ts
  66. 1
      src/patient/pages/live/index.wxml
  67. 3
      src/patient/pages/liveDetail/index.json
  68. 38
      src/patient/pages/liveDetail/index.scss
  69. 25
      src/patient/pages/liveDetail/index.ts
  70. 20
      src/patient/pages/liveDetail/index.wxml
  71. 46
      src/patient/pages/liveResult/index.scss
  72. 13
      src/patient/pages/liveResult/index.wxml
  73. 2
      src/patient/pages/login/index.scss
  74. 11
      src/patient/pages/login/index.wxml
  75. 2
      src/patient/pages/my/index.wxml
  76. 49
      src/patient/pages/personalInformation/index.scss
  77. 20
      src/patient/pages/personalInformation/index.wxml
  78. 5
      src/patient/pages/qol/index.json
  79. 168
      src/patient/pages/qol/index.scss
  80. 24
      src/patient/pages/qol/index.ts
  81. 91
      src/patient/pages/qol/index.wxml
  82. 5
      src/patient/pages/qolAdd/index.json
  83. 126
      src/patient/pages/qolAdd/index.scss
  84. 257
      src/patient/pages/qolAdd/index.ts
  85. 66
      src/patient/pages/qolAdd/index.wxml
  86. 10
      src/patient/pages/qolReport/index.json
  87. 208
      src/patient/pages/qolReport/index.scss
  88. 336
      src/patient/pages/qolReport/index.ts
  89. 119
      src/patient/pages/qolReport/index.wxml
  90. 5
      src/patient/pages/qolResult/index.json
  91. 218
      src/patient/pages/qolResult/index.scss
  92. 45
      src/patient/pages/qolResult/index.ts
  93. 114
      src/patient/pages/qolResult/index.wxml
  94. 24
      src/patient/pages/repository/index.scss
  95. 50
      src/patient/pages/repository/index.ts
  96. 17
      src/patient/pages/repository/index.wxml
  97. 12
      src/patient/pages/repositoryDetail/index.scss
  98. 2
      typings/index.d.ts

4
README.md

@ -10,7 +10,7 @@ images svn 地址 @@ -10,7 +10,7 @@ images svn 地址
svn://39.106.86.127:28386/projects/xd/proj_src/shop/frontend/web/xd
svn://39.106.86.127:28386/projects/xd/proj_src/branches/dev_v2.0/shop/frontend/web/xd/
(/images/)(\S*(?=["|']))
(/images/)(\S\*(?=["|']))
{{imageUrl}}$2?t={{Timestamp}}
ui问题
@ -24,7 +24,7 @@ showModel颜色统一 @@ -24,7 +24,7 @@ showModel颜色统一
wx.showModal({
confirmColor: '#8c75d0',
cancelColor: '#141515',
});
})
```
审核账号

2
dist.ps1

@ -6,3 +6,5 @@ svn add . --no-ignore --force @@ -6,3 +6,5 @@ svn add . --no-ignore --force
# Commit the changes with a message
svn ci -m "版本更新"
exit

10
project.config.json

@ -3,7 +3,10 @@ @@ -3,7 +3,10 @@
"miniprogramRoot": "src/",
"compileType": "miniprogram",
"setting": {
"useCompilerPlugins": ["typescript", "sass"],
"useCompilerPlugins": [
"typescript",
"sass"
],
"babelSetting": {
"ignore": [],
"disablePlugins": [],
@ -68,6 +71,5 @@ @@ -68,6 +71,5 @@
}
]
},
"appid": "wxf9ce8010f1ad24aa"
}
"appid": "wx71ac9c27c3c3e3f4"
}

53
project.private.config.json

@ -23,11 +23,53 @@ @@ -23,11 +23,53 @@
"miniprogram": {
"list": [
{
"name": "patient/pages/liveResult/index",
"pathName": "patient/pages/liveResult/index",
"query": "id=30&rewardScore=undefined",
"scene": null,
"launchMode": "default"
},
{
"name": "医生-患者详情",
"pathName": "pages/d_patientDetail/index",
"query": "id=21",
"launchMode": "default",
"scene": null
},
{
"name": "患者-qol结果",
"pathName": "patient/pages/qolResult/index",
"query": "id=6",
"launchMode": "default",
"scene": null
},
{
"name": "患者-qol评估报告",
"pathName": "patient/pages/qolReport/index",
"query": "",
"launchMode": "default",
"scene": null
},
{
"name": "患者-qol添加",
"pathName": "patient/pages/qolAdd/index",
"query": "",
"launchMode": "default",
"scene": null
},
{
"name": "患者-qol",
"pathName": "patient/pages/qol/index",
"query": "",
"launchMode": "default",
"scene": null
},
{
"name": "患者-录入个人信息",
"pathName": "patient/pages/enterInfo/index",
"query": "",
"scene": null,
"launchMode": "default"
"launchMode": "default",
"scene": null
},
{
"name": "start",
@ -58,13 +100,6 @@ @@ -58,13 +100,6 @@
"scene": null
},
{
"name": "医生-患者详情",
"pathName": "pages/d_patientDetail/index",
"query": "id=10",
"launchMode": "default",
"scene": null
},
{
"name": "患者-直播结果页",
"pathName": "patient/pages/liveResult/index",
"query": "id=5",

6
src/app.json

@ -73,7 +73,11 @@ @@ -73,7 +73,11 @@
"pages/infusionCenter/index",
"pages/nrdlTable/index",
"pages/interactivePatient/index",
"pages/referral/index"
"pages/referral/index",
"pages/qol/index",
"pages/qolAdd/index",
"pages/qolResult/index",
"pages/qolReport/index"
]
},
{

4
src/app.scss

@ -1 +1,5 @@ @@ -1 +1,5 @@
/**app.wxss**/
view {
--nav-bar-title-font-size: 36rpx;
}

19
src/app.ts

@ -16,15 +16,15 @@ App<IAppOption>({ @@ -16,15 +16,15 @@ App<IAppOption>({
// 测试号 wx2b0bb13edf717c1d
// dev
// appid:wxf9ce8010f1ad24aa
url: 'https://m.xd.hbraas.com',
upFileUrl: 'https://m.xd.hbraas.com/',
imageUrl: 'https://m.xd.hbraas.com/xd/',
// url: 'https://m.xd.hbraas.com',
// upFileUrl: 'https://m.xd.hbraas.com/',
// imageUrl: 'https://m.xd.hbraas.com/xd/',
// pro
// appid:wx71ac9c27c3c3e3f4
// url: 'https://m.xd.hbsaas.com',
// upFileUrl: 'https://m.xd.hbsaas.com/',
// imageUrl: 'https://m.xd.hbsaas.com/api/xd/',
url: 'https://m.xd.hbsaas.com',
upFileUrl: 'https://m.xd.hbsaas.com/',
imageUrl: 'https://m.xd.hbsaas.com/api/xd/',
loginState: '',
isLogin: 0,
@ -233,9 +233,12 @@ App<IAppOption>({ @@ -233,9 +233,12 @@ App<IAppOption>({
data: {},
}) as Promise<never>
},
mpBehavior(data: { PageName: string }) {
console.log(data)
mpBehavior(data: { doctor?: boolean; PageName: string }) {
let url = '?r=zd/mp-behavior/add'
if (data.doctor) {
url = '?r=zd/doctor/mp-behavior/add'
delete data.doctor
}
wx.ajax({
method: 'POST',
url,

2
src/components/patient-tab-bar/index.scss

@ -6,7 +6,7 @@ @@ -6,7 +6,7 @@
height: 48rpx;
}
.name {
font-size: 20rpx;
font-size: 26rpx;
color: rgba(105, 104, 110, 1);
&.active {
color: rgba(33, 29, 46, 1);

9
src/components/popup/index.scss

@ -126,6 +126,15 @@ @@ -126,6 +126,15 @@
}
}
.popup6 {
width: 590rpx;
height: 880rpx;
.p-img {
width: 100%;
height: 100%;
}
}
.close {
margin: 48rpx auto 0;
display: block;

7
src/components/popup/index.wxml

@ -23,7 +23,9 @@ @@ -23,7 +23,9 @@
<view class="nickname">{{params.Name}}医生</view>
<view class="hostipal">
{{params.HospitalName}}
<view class="tag" wx:if="{{params.HospitalClassificationName || params.HospitalLevel}}">{{params.HospitalClassificationName}}{{params.HospitalLevel}}</view>
<view class="tag" wx:if="{{params.HospitalClassificationName || params.HospitalLevel}}">
{{params.HospitalClassificationName}}{{params.HospitalLevel}}
</view>
</view>
</view>
</view>
@ -52,6 +54,9 @@ @@ -52,6 +54,9 @@
<view class="btn" bind:tap="handleOk">继续</view>
</view>
</view>
<view class="popup6" wx:if="{{type==='popup6'}}">
<image class="p-img" src="{{imageUrl}}bg20.png?t={{Timestamp}}" show-menu-by-longpress></image>
</view>
<image
wx:if="{{params.close}}"

19
src/components/toast/index.scss

@ -2328,30 +2328,27 @@ @@ -2328,30 +2328,27 @@
position: relative;
padding: 100rpx 32rpx 32rpx;
width: 630rpx;
height: 516rpx;
height: 544rpx;
box-sizing: border-box;
.title {
font-size: 40rpx;
font-size: 48rpx;
color: #ffffff;
font-weight: bold;
}
.content {
font-size: 32rpx;
color: #ffffff;
font-style: italic;
}
.container {
margin-top: 60rpx;
font-size: 32rpx;
color: #211d2e;
margin-top: 76rpx;
font-size: 40rpx;
color: #211D2E;
text-align: center;
line-height: 48rpx;
line-height: 68rpx;
.line {
display: flex;
align-items: center;
justify-content: center;
}
.high {
color: #b982ff;
color: #B982FF;
font-weight: bold;
}
}

1
src/components/toast/index.wxml

@ -686,7 +686,6 @@ @@ -686,7 +686,6 @@
style="background: url({{imageUrl}}bg13.png?t={{Timestamp}}) no-repeat top center/100%"
>
<view class="title">感谢您的信任</view>
<view class="content">医生可远程关注您的健康状况啦</view>
<view class="container">
<view class="line">
您的

2
src/doc/pages/doc1/index.ts

File diff suppressed because one or more lines are too long

4
src/doc/pages/doc2/index.scss

@ -1,3 +1,3 @@ @@ -1,3 +1,3 @@
.page{
padding: 0 40rpx;
.mp-html{
padding: 20rpx 40rpx;
}

6
src/doc/pages/doc2/index.ts

File diff suppressed because one or more lines are too long

17
src/doc/pages/doc2/index.wxml

@ -1,4 +1,17 @@ @@ -1,4 +1,17 @@
<van-tabs active="{{ active }}" color="#B982FF" sticky swipeable bind:change="onChange">
<van-tab title="用户协议"><mp-html content="{{doc}}"></mp-html></van-tab>
<van-tab title="隐私政策"><mp-html content="{{doc}}"></mp-html></van-tab>
<van-tab title="隐私政策">
<view class="mp-html">
<mp-html content="{{doc1}}"></mp-html>
</view>
</van-tab>
<van-tab title="用户协议">
<view class="mp-html">
<mp-html content="{{doc2}}"></mp-html>
</view>
</van-tab>
<van-tab title="个人信息共享知情同意书">
<view class="mp-html">
<mp-html content="{{doc3}}"></mp-html>
</view>
</van-tab>
</van-tabs>

BIN
src/images/bg13.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 272 KiB

After

Width:  |  Height:  |  Size: 256 KiB

BIN
src/images/bg14.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 264 KiB

BIN
src/images/bg15.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 444 KiB

BIN
src/images/bg16.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 265 KiB

BIN
src/images/bg17.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

BIN
src/images/bg18.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 333 KiB

BIN
src/images/bg19.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 271 KiB

BIN
src/images/bg20.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 385 KiB

BIN
src/images/bg21.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 247 KiB

BIN
src/images/code1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

BIN
src/images/icon69.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
src/images/icon70.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

BIN
src/images/icon71.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

BIN
src/images/icon72.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

BIN
src/images/icon73.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 414 B

BIN
src/images/icon74.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

BIN
src/images/icon75.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 875 B

BIN
src/images/start.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 MiB

After

Width:  |  Height:  |  Size: 2.9 MiB

BIN
src/images/title6.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.1 KiB

After

Width:  |  Height:  |  Size: 8.4 KiB

BIN
src/images/title7.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.6 KiB

After

Width:  |  Height:  |  Size: 7.1 KiB

BIN
src/images/za-images/live-banner.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 492 KiB

After

Width:  |  Height:  |  Size: 634 KiB

6
src/pages/d_interactive/index.ts

@ -14,12 +14,12 @@ Page({ @@ -14,12 +14,12 @@ Page({
},
onShow() {
app.waitLogin({ type: [2] }).then((_res) => {
app.mpBehavior({ PageName: 'PG_DoctorIMList' })
app.mpBehavior({ doctor:true, PageName: 'PG_DoctorIMList' })
this.getList()
})
},
handleTapSearch() {
app.mpBehavior({ PageName: 'BTN_DoctorIMListSearch' })
app.mpBehavior({ doctor:true, PageName: 'BTN_DoctorIMListSearch' })
},
handleSearch() {
this.setData({
@ -75,7 +75,7 @@ Page({ @@ -75,7 +75,7 @@ Page({
}
},
handleDetail(e) {
app.mpBehavior({ PageName: 'BTN_DoctorIMList' })
app.mpBehavior({ doctor:true, PageName: 'BTN_DoctorIMList' })
const { index } = e.currentTarget.dataset
const { list } = this.data
const listItem: any = list[index]

40
src/pages/d_interactiveDoctor/index.scss

@ -343,36 +343,40 @@ page { @@ -343,36 +343,40 @@ page {
}
}
.adl {
position: relative;
margin-bottom: 32rpx;
padding: 32rpx 156rpx 34rpx 30rpx;
border-radius: 32rpx;
background: linear-gradient(141deg, #edfcff 0%, #d4f3f9 100%);
padding: 32rpx;
border-radius: 24rpx;
background: linear-gradient(180deg, #f6efff 0%, #ffffff 100%);
border: 2rpx solid #fff;
.title {
width: 324rpx;
height: 40rpx;
font-size: 36rpx;
color: #211d2e;
font-weight: bold;
}
.sub-title {
margin-top: 18rpx;
line-height: 1;
margin-top: 10rpx;
margin-right: 222rpx;
font-size: 28rpx;
color: rgba(255, 255, 255, 0.8);
color: #211d2e;
}
.btn {
margin-top: 20rpx;
width: 220rpx;
height: 56rpx;
margin-top: 18rpx;
width: 224rpx;
height: 64rpx;
text-align: center;
line-height: 56rpx;
line-height: 64rpx;
font-size: 28rpx;
color: #e04775;
background: #ffffff;
color: #ffffff;
background: linear-gradient(197deg, #ffbcf9 0%, #b982ff 100%);
border-radius: 102rpx 102rpx 102rpx 102rpx;
}
.tip {
margin-top: 10rpx;
font-size: 24rpx;
color: #fff;
.photo {
position: absolute;
bottom: 30rpx;
right: 0;
width: 214rpx;
height: 212rpx;
}
}
.audio {

13
src/pages/d_interactiveDoctor/index.ts

@ -54,7 +54,7 @@ Page({ @@ -54,7 +54,7 @@ Page({
},
onShow() {
app.waitLogin({ type: [2] }).then((_res) => {
app.mpBehavior({ PageName: 'PG_DoctorIMDetail' })
app.mpBehavior({ doctor: true, PageName: 'PG_DoctorIMDetail' })
this.getDoctorDetail()
this.getPatientDetail()
this.getMessageList()
@ -89,7 +89,10 @@ Page({ @@ -89,7 +89,10 @@ Page({
res.LastAdlTimeName = dayjs(res.LastAdlTime).from(dayjs().format('YYYY-MM-DD')).replace(' ', '')
}
this.setData({
patientDetail: res,
patientDetail: {
...res,
BecomePatientTime: dayjs(res.BecomePatientTime).format('YYYY-MM-DD'),
},
})
})
},
@ -168,7 +171,7 @@ Page({ @@ -168,7 +171,7 @@ Page({
})
},
handleSendDate() {
app.mpBehavior({ PageName: 'BTN_DoctorIMDetailClinicHours' })
app.mpBehavior({ doctor: true, PageName: 'BTN_DoctorIMDetailClinicHours' })
const {
messageList,
doctor: { Clinic },
@ -223,7 +226,7 @@ Page({ @@ -223,7 +226,7 @@ Page({
})
},
handleSendShow() {
app.mpBehavior({ PageName: 'BTN_DoctorIMDetailSendMessage' })
app.mpBehavior({ doctor: true, PageName: 'BTN_DoctorIMDetailSendMessage' })
this.setData({
messageListShow: true,
})
@ -360,7 +363,7 @@ Page({ @@ -360,7 +363,7 @@ Page({
})
},
handlePatientDetail() {
app.mpBehavior({ PageName: 'BTN_DoctorIMDetailPatient' })
app.mpBehavior({ doctor: true, PageName: 'BTN_DoctorIMDetailPatient' })
wx.navigateTo({
url: `/pages/d_patientDetail/index?id=${this.data.patientId}`,
})

22
src/pages/d_interactiveDoctor/index.wxml

@ -15,7 +15,7 @@ @@ -15,7 +15,7 @@
<view class="edc" wx:if="{{patientDetail.IsEDC==='1'}}">EDC患者</view>
</view>
</view>
<view class="date">入组时间:2025-08-10</view>
<view class="date">注册时间:{{patientDetail.BecomePatientTime}}</view>
</view>
<view class="detail" bind:tap="handlePatientDetail">查看档案</view>
</view>
@ -93,19 +93,11 @@ @@ -93,19 +93,11 @@
</block>
</view>
</view>
<view
class="adl"
wx:elif="{{message.msgContentType==='3'}}"
style="padding-top: {{top+25}}px;background: url({{imageUrl}}za-images/doctor/d_interactive-adl-bg.png?t={{Timestamp}}) no-repeat bottom right / 268rpx 222rpx,#D74D75;"
>
<image
class="title"
src="{{imageUrl}}za-images/doctor/d_interactiveTitle1.png?t={{Timestamp}}"
mode="aspectFit"
></image>
<view class="sub-title">ADL+激素双达标</view>
<view class="btn" bind:tap="handleAdl">点击进入ADL</view>
<view class="tip">建议您定期做ADL测评</view>
<view class="adl" wx:elif="{{message.msgContentType==='10'}}">
<view class="title">GO-QOL生活质量评分</view>
<view class="sub-title">可从主观感受变化反馈治疗效果,建议您每月定期测评</view>
<view class="btn">点击开始自评</view>
<image class="photo" src="{{imageUrl}}bg17.png?t={{Timestamp}}"></image>
</view>
<view
class="audio"
@ -146,7 +138,7 @@ @@ -146,7 +138,7 @@
</view>
</view>
<view class="avatar">
<image class="a-img" mode="aspectFill" src="{{imageUrl}}za-images/5/doctor.png?t={{Timestamp}}"></image>
<image class="a-img" mode="aspectFill" src="{{doctor.Img}}"></image>
</view>
</view>
</view>

2
src/pages/d_invite/index.ts

@ -18,7 +18,7 @@ Page({ @@ -18,7 +18,7 @@ Page({
})
}
app.waitLogin().then((_res) => {
app.mpBehavior({ PageName: 'PG_DoctorCode' })
app.mpBehavior({ doctor:true, PageName: 'PG_DoctorCode' })
wx.showLoading({
title: '加载中',
})

8
src/pages/d_patient/index.ts

@ -59,7 +59,7 @@ Page({ @@ -59,7 +59,7 @@ Page({
},
onShow() {
app.waitLogin().then((_res) => {
app.mpBehavior({ PageName: 'PG_DoctorPatientList' })
app.mpBehavior({ doctor:true, PageName: 'PG_DoctorPatientList' })
this.getList()
app.getUserInfo(2).then((userInfo) => {
this.setData({
@ -99,7 +99,7 @@ Page({ @@ -99,7 +99,7 @@ Page({
this.getList()
},
handleTapSearch() {
app.mpBehavior({ PageName: 'BTN_DoctorPatientListSearch' })
app.mpBehavior({ doctor:true, PageName: 'BTN_DoctorPatientListSearch' })
},
handleNav(e) {
const { active } = e.currentTarget.dataset
@ -185,7 +185,7 @@ Page({ @@ -185,7 +185,7 @@ Page({
})
},
handleDetail(e: any) {
app.mpBehavior({ PageName: 'BTN_DoctorPatientList' })
app.mpBehavior({ doctor:true, PageName: 'BTN_DoctorPatientList' })
const { index } = e.currentTarget.dataset
const item = this.data.list[index]
@ -194,7 +194,7 @@ Page({ @@ -194,7 +194,7 @@ Page({
})
},
handleSend(e) {
app.mpBehavior({ PageName: 'BTN_DoctorPatientListSendMessage' })
app.mpBehavior({ doctor:true, PageName: 'BTN_DoctorPatientListSendMessage' })
const { index } = e.currentTarget.dataset
wx.navigateTo({
url: `/pages/d_interactiveDoctor/index?patientId=${this.data.list[index].PatientId}`,

2
src/pages/d_patient/index.wxml

@ -35,7 +35,7 @@ @@ -35,7 +35,7 @@
<view class="edc" wx:if="{{item.IsEDC==1}}">EDC患者</view>
</view>
</view>
<view class="replay-date">入组时间:{{item.BecomePatientTime}}</view>
<view class="replay-date">注册时间:{{item.BecomePatientTime}}</view>
</view>
<view class="send" catch:tap="handleSend" data-index="{{index}}">消息</view>
</view>

61
src/pages/d_patientDetail/index.scss

@ -388,6 +388,65 @@ page { @@ -388,6 +388,65 @@ page {
border: 2rpx solid #b982ff;
}
}
.chart-list {
padding: 48rpx 40rpx 0;
.chart-title {
font-size: 36rpx;
color: #211d2e;
font-weight: bold;
}
.chart-filter {
margin-bottom: 24rpx;
position: relative;
z-index: 3;
margin-top: 32rpx;
display: flex;
gap: 16rpx;
align-items: center;
border-radius: 80rpx 80rpx 80rpx 80rpx;
.type {
padding: 10rpx 32rpx;
display: flex;
align-items: center;
justify-content: center;
font-size: 32rpx;
color: #69686E;
background-color: #FFFFFF;
border-radius: 34rpx;
.icon {
width: 24rpx;
height: 24rpx;
}
}
.range {
padding: 10rpx 32rpx;
display: flex;
align-items: center;
font-size: 32rpx;
color: #69686E;
border-radius: 34rpx;
background-color: #FFFFFF;
.icon {
width: 24rpx;
height: 24rpx;
}
}
}
.chart-card {
margin-bottom: 24rpx;
padding: 32rpx;
background-color: #fff;
border-radius: 24rpx;
.title {
font-size: 32rpx;
color: #211d2e;
font-weight: bold;
}
.chart {
height: 420rpx;
}
}
}
}
.popup-remark {
@ -416,7 +475,7 @@ page { @@ -416,7 +475,7 @@ page {
display: flex;
justify-content: center;
align-items: center;
background: linear-gradient( 197deg, #FFBCF9 0%, #B982FF 100%);
background: linear-gradient(197deg, #ffbcf9 0%, #b982ff 100%);
font-size: 36rpx;
color: #fff;
border-radius: 64rpx 64rpx 64rpx 64rpx;

626
src/pages/d_patientDetail/index.ts

@ -1,6 +1,7 @@ @@ -1,6 +1,7 @@
import dayjs from 'dayjs'
const app = getApp<IAppOption>()
let echarts: any = null
Page({
data: {
@ -161,14 +162,22 @@ Page({ @@ -161,14 +162,22 @@ Page({
count: 1,
},
},
chartComponent1: null as any,
chartComponent2: null as any,
chartComponent3: null as any,
async onLoad(option) {
echarts = await require.async('../../gift/compontnts/echart/echarts.js')
this.chartComponent1 = this.selectComponent('#chart1')
this.chartComponent2 = this.selectComponent('#chart2')
this.chartComponent3 = this.selectComponent('#chart3')
this.setData({
id: option.id,
})
app.waitLogin({ type: [2] }).then(async (_res) => {
app.mpBehavior({ PageName: 'PG_DoctorPatientDetail' })
app.mpBehavior({ doctor: true, PageName: 'PG_DoctorPatientDetail' })
this.getDoctorDetail()
this.handleTypeChange()
await this.getDetail()
app.getUserInfo(2).then((userInfo) => {
this.setData({
@ -210,13 +219,20 @@ Page({ @@ -210,13 +219,20 @@ Page({
detail: {
...res,
hideName: res.Name.replace(/^(.)(.*)$/, (_, first, rest) => first + '*'.repeat(rest.length)),
BecomePatientTime: res.BecomePatientTime ? dayjs(res.BecomePatientTime).format('YYYY-MM-DD') : '',
},
})
})
},
handleTypeChange(e) {
const index = e.detail.value
const { typeRange, nav } = this.data
handleChange() {
this.getGraph()
},
handleTypeChange(e = '') {
let index = 0
if (e) {
index = (e as any).detail.value
}
const { typeRange } = this.data
const type = typeRange[index].id
const typeName = typeRange[index].value
let EndDate = ''
@ -237,228 +253,47 @@ Page({ @@ -237,228 +253,47 @@ Page({
EndDate,
StartDate,
})
if (nav === '0') {
this.getGraph()
} else {
this.getAdlList()
}
},
handleChange() {
const { nav } = this.data
if (nav === '0') {
this.getGraph()
} else {
this.getAdlList()
}
this.getGraph()
},
getGraph() {
const { type, StartDate, EndDate } = this.data
wx.ajax({
method: 'GET',
url: '?r=zd/doctor/patient/adl-graph',
url: '?r=xd/doctor/qol/graph',
data: {
patientId: this.data.id,
StartDate: this.data.StartDate,
EndDate: this.data.EndDate,
DateType: this.data.type,
DateType: type,
StartDate: StartDate,
EndDate: EndDate,
count: 0,
PatientId: this.data.id,
},
}).then(async (res) => {
this.initChart1(res.adlSummary)
this.initChart2(res.adlSummary)
const medication = res.medication.map((item) => {
return {
Date: item.InjectionDate,
...item,
}
})
const list = res.list
const newList: any[] = this.mergeArr(list, medication)
const chart3 = await this.initChart3(newList as never[])
const chart4 = await this.initChart4(newList as never[])
echarts.connect([chart3, chart4])
})
},
mergeArr(array1: any[] = [], array2: any[] = []) {
// 合并两个数组中相同Date字段的对象
const mergedArray: any[] = []
const mergedMap = new Map()
array1.concat(array2).forEach((obj) => {
const date = obj.Date
if (mergedMap.has(date)) {
mergedMap.get(date).push(obj)
} else {
mergedMap.set(date, [obj])
}
})
mergedMap.forEach((objs: any) => {
if (objs.length === 1) {
mergedArray.push(objs[0])
} else {
const mergedObj = objs.reduce((acc, cur) => ({ ...acc, ...cur }))
mergedArray.push(mergedObj)
}
})
// 按照Date字段对合并后的数组进行排序
mergedArray.sort((a, b) => {
return a.Date.localeCompare(b.Date)
})
return mergedArray
},
initChart1(adlSummary = {}) {
this.ecDataTrendComponent1.init((canvas, width, height, dpr) => {
const chart = echarts.init(canvas, null, {
width,
height,
devicePixelRatio: dpr, // new
})
canvas.setChart(chart)
const option = {
tooltip: {
trigger: 'item',
formatter: '{b} \n {c}次,{d}%',
},
legend: {
show: false,
},
color: ['rgba(226, 219, 65, 1)', 'rgba(215, 108, 108, 1)', 'rgba(98, 190, 208, 1)'],
series: [
{
name: '全部患者',
type: 'pie',
radius: ['40%', '60%'],
center: ['50%', '50%'],
label: {
show: true,
width: 80,
alignTo: 'edge',
minMargin: 5,
edgeDistance: 10,
lineHeight: 15,
formatter: '{b} \n{time|{d}%}',
rich: {
time: {
fontSize: 10,
color: '#999',
},
},
},
labelLine: {
length: 15,
length2: 0,
maxSurfaceAngle: 80,
},
labelLayout(params) {
const isLeft = params.labelRect.x < chart.getWidth() / 2
const points = params.labelLinePoints
// Update the end point.
points[2][0] = isLeft ? params.labelRect.x : params.labelRect.x + params.labelRect.width
return {
labelLinePoints: points,
}
},
data: [
{ value: adlSummary.adlNearNum, name: 'ADL接近达标' },
{ value: adlSummary.adlUnStandardNum, name: 'ADL未达标' },
{ value: adlSummary.adlStandardNum, name: 'ADL达标' },
],
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)',
},
},
},
],
}
chart.setOption(option)
return chart
})
},
initChart2(adlSummary = {}) {
this.ecDataTrendComponent2.init((canvas, width, height, dpr) => {
const chart = echarts.init(canvas, null, {
width,
height,
devicePixelRatio: dpr, // new
}).then((res) => {
const list0: any[] = []
const list1: any[] = []
const list2: any[] = []
res.list.forEach((item: any) => {
list0.push({
Date: item.Date,
value: item.TotalScore,
})
list1.push({
Date: item.Date,
value: item.VisionScore,
})
list2.push({
Date: item.Date,
value: item.AppearanceScore,
})
})
canvas.setChart(chart)
const option = {
tooltip: {
trigger: 'item',
formatter: '{b} \n {c}次,{d}%',
},
legend: {
show: false,
},
color: ['rgba(215, 108, 108, 1)', 'rgba(98, 190, 208, 1)'],
series: [
{
name: '全部患者',
type: 'pie',
radius: ['40%', '60%'],
center: ['50%', '50%'],
label: {
show: true,
width: 80,
alignTo: 'edge',
minMargin: 5,
edgeDistance: 10,
lineHeight: 15,
formatter: '{b} \n{time|{d}%}',
rich: {
time: {
fontSize: 10,
color: '#999',
},
},
},
labelLine: {
length: 15,
length2: 0,
maxSurfaceAngle: 80,
},
labelLayout(params) {
const isLeft = params.labelRect.x < chart.getWidth() / 2
const points = params.labelLinePoints
// Update the end point.
points[2][0] = isLeft ? params.labelRect.x : params.labelRect.x + params.labelRect.width
return {
labelLinePoints: points,
}
},
data: [
{ value: adlSummary.SteroidDailyDoseUnStandardNum, name: '激素未达标' },
{ value: adlSummary.SteroidDailyDoseStandardNum, name: '激素达标' },
],
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)',
},
},
},
],
}
chart.setOption(option)
return chart
this.initChart(list0, 'chartComponent1')
this.initChart(list1, 'chartComponent2')
this.initChart(list2, 'chartComponent3')
})
},
initChart3(defaultList = []) {
const { userInfo } = this.data
const list: any = defaultList
initChart(defaultList = [] as any[], key) {
return new Promise((reslove) => {
this.ecDataTrendComponent3.init((canvas, width, height, dpr) => {
this[key].init((canvas, width, height, dpr) => {
const chart = echarts.init(canvas, null, {
width,
height,
@ -477,7 +312,7 @@ Page({ @@ -477,7 +312,7 @@ Page({
backgroundColor: 'rgba(0, 0, 0, 0.5)',
textStyle: {
color: '#fff',
fontSize: 10,
fontSize: 14,
},
order: 'seriesDesc',
},
@ -492,7 +327,7 @@ Page({ @@ -492,7 +327,7 @@ Page({
{
type: 'category',
axisTick: {
show: true,
show: false,
inside: true,
length: 1,
alignWithLabel: true,
@ -509,258 +344,63 @@ Page({ @@ -509,258 +344,63 @@ Page({
type: 'dashed',
},
},
data: list.map((item) => dayjs(item.Date).format('MM-DD')),
axisLabel: {
formatter() {
return ''
splitLine: {
show: true,
showMinLine: false,
lineStyle: {
type: 'dotted',
color: 'rgba(137, 141, 151, 0.23)',
},
},
data: defaultList.map((item) => dayjs(item.Date).format('MM-DD')),
},
],
yAxis: [
{
type: 'value',
minInterval: 1,
},
],
series: [
{
name: '总分',
data: list.length ? list.map((item) => item.TotalScore) : [25],
barWidth: '16',
label: {
show: true,
position: 'top',
color: '#CF5375',
},
type: 'line',
symbol: 'circle',
symbolSize: 8,
showSymbol: list.length >= 1,
connectNulls: true,
z: 10,
itemStyle: {
color: '#CF5375',
},
markLine: {
symbol: ['none', 'none'],
data: [
{
name: '达标区(1分)',
yAxis: 1,
label: {
formatter: '{b}',
position: 'insideMiddle',
color: '#24D8C8',
fontSize: '10',
},
lineStyle: {
cap: '',
color: '#34D7C7',
type: 'dashed',
},
},
],
},
markArea: {
itemStyle: {
color: 'rgba(37,217,200,0.19)',
},
data: [
[
{
yAxis: 0,
},
{
yAxis: 1,
},
],
],
},
},
],
dataZoom: {
type: 'inside', // 有type这个属性,滚动条在最下面,也可以不行,写y:36,这表示距离顶端36px,一般就是在图上面。
startValue: list.length - 5,
endValue: list.length - 1,
filterMode: 'none',
},
}
if (this.data.detail.UserType === 4) {
const markLineData = list
.filter((item) => item.InjectionBottles)
.map((item) => {
return {
name: '',
xAxis: dayjs(item.Date).format('MM-DD'),
minInterval: 20,
max: 100,
axisLine: {
show: false,
lineStyle: {
color: 'rgba(37, 217, 200,0.5)',
cap: '',
type: 'solid',
color: 'rgba(161, 164, 172, 1)',
},
label: {
formatter: '',
position: 'insideEndBottom',
rotate: 0,
color: '#25D9C8',
offset: [60, 0],
},
}
})
option.series.push({
name: '用药',
data: list.map((item) => (item.InjectionBottles ? 0 : null)),
type: 'line',
symbol:
'image://data:image/png;base64,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',
symbolSize: [11, 16],
symbolOffset: [0, 0],
itemStyle: {
color: '#25D9C8',
},
lineStyle: {
width: 0,
},
tooltip: {
show: false,
},
z: 11,
markLine: {
symbol: ['none', 'none'],
data: markLineData,
},
})
// option.series.push({
// name: "用药时间",
// data: list.map((item: any) => (item.InjectionBottles ? item.TotalScore : 0)),
// type: "line",
// symbol:
// "image://data:image/png;base64,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",
// symbolSize: [11, 16],
// symbolOffset: [0, "100%"],
// itemStyle: {
// color: "#25D9C8",
// },
// tooltip: {
// show: false,
// },
// lineStyle: {
// width: 0,
// },
// z: 1,
// });
}
chart.setOption(option)
reslove(chart)
return chart
})
})
},
initChart4(defaultList = []) {
const { userInfo } = this.data
const list: any = defaultList
return new Promise((reslove) => {
this.ecDataTrendComponent4.init((canvas, width, height, dpr) => {
const chart = echarts.init(canvas, null, {
width,
height,
devicePixelRatio: dpr, // new
})
canvas.setChart(chart)
const option: any = {
tooltip: {
show: false,
trigger: 'axis',
axisPointer: {
type: 'shadow',
},
confine: true,
backgroundColor: 'rgba(0, 0, 0, 0.5)',
textStyle: {
color: '#fff',
fontSize: 10,
},
order: 'seriesDesc',
},
grid: {
top: '30',
left: '0',
right: '0',
bottom: '10',
containLabel: true,
},
xAxis: [
{
type: 'category',
axisTick: {
},
splitLine: {
show: true,
inside: true,
length: 1,
alignWithLabel: true,
showMinLine: false,
lineStyle: {
type: 'dotted',
color: '#D8D8D8',
width: 4,
cap: 'round',
},
},
axisLine: {
lineStyle: {
color: '#8C8C8C',
type: 'dashed',
},
},
data: list.map((item) => dayjs(item.Date).format('MM-DD')),
},
],
yAxis: [
{
type: 'value',
minInterval: 1,
max(value) {
return value.max + 20 > 999 ? 999 : value.max + 20
},
axisLabel: {
// width: 20,
formatter(value: number) {
return value
color: 'rgba(137, 141, 151, 0.23)',
},
},
},
],
series: [
{
name: '激素用量',
data: list.length ? list.map((item) => item.SteroidDailyDose) : [20],
name: '总分',
data: defaultList.length ? defaultList.map((item) => item.value) : [25],
barWidth: '16',
type: 'line',
symbol: 'circle',
symbolSize: 8,
connectNulls: true,
showSymbol: list.length >= 1,
z: 10,
label: {
show: true,
position: 'top',
color: '#18474e',
z: 11,
formatter({ value }) {
return `${value}mg`
},
color: '#B982FF',
},
type: 'line',
symbolSize: 4,
showSymbol: defaultList.length >= 1,
connectNulls: true,
z: 10,
itemStyle: {
color: '#3192A1',
color: '#B982FF',
},
markLine: {
symbol: ['none', 'none'],
data: [
{
name: '达标区(5mg)',
yAxis: 5,
name: '达标区',
yAxis: 80,
label: {
formatter: '{b}',
position: 'insideMiddle',
@ -773,21 +413,6 @@ Page({ @@ -773,21 +413,6 @@ Page({
type: 'dashed',
},
},
{
name: '20',
yAxis: 20,
label: {
formatter: '{b}',
position: 'start',
color: '#D76C6C',
distance: 8,
},
lineStyle: {
cap: '',
color: '#D76C6C',
type: 'dashed',
},
},
],
},
markArea: {
@ -797,10 +422,10 @@ Page({ @@ -797,10 +422,10 @@ Page({
data: [
[
{
yAxis: 0,
yAxis: 80,
},
{
yAxis: 5,
yAxis: 100,
},
],
],
@ -809,76 +434,11 @@ Page({ @@ -809,76 +434,11 @@ Page({
],
dataZoom: {
type: 'inside', // 有type这个属性,滚动条在最下面,也可以不行,写y:36,这表示距离顶端36px,一般就是在图上面。
startValue: list.length - 5,
endValue: list.length - 1,
startValue: 0,
endValue: 4,
filterMode: 'none',
},
}
if (this.data.detail.UserType === 4) {
const markLineData = list
.filter((item) => item.InjectionBottles)
.map((item) => {
return {
name: '',
xAxis: dayjs(item.Date).format('MM-DD'),
lineStyle: {
color: 'rgba(37, 217, 200,0.5)',
cap: '',
type: 'solid',
},
label: {
formatter: '',
position: 'insideEndBottom',
rotate: 0,
color: '#25D9C8',
offset: [60, 0],
},
}
})
const maxValue = Math.max(...list.map((item) => item.SteroidDailyDose))
option.series.push({
name: '用药',
data: list.map((item) => (item.InjectionBottles ? 0 : null)),
type: 'line',
symbol:
'image://data:image/png;base64,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',
symbolSize: [11, 16],
symbolOffset: [0, 0],
itemStyle: {
color: '#25D9C8',
},
lineStyle: {
width: 0,
},
tooltip: {
show: false,
},
z: 11,
markLine: {
symbol: ['none', 'none'],
data: markLineData,
},
})
// option.series.push({
// name: "用药时间",
// data: list.map((item: any) => (item.InjectionBottles ? item.TotalScore : 0)),
// type: "line",
// symbol:
// "image://data:image/png;base64,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",
// symbolSize: [11, 16],
// symbolOffset: [0, "100%"],
// itemStyle: {
// color: "#25D9C8",
// },
// tooltip: {
// show: false,
// },
// lineStyle: {
// width: 0,
// },
// z: 1,
// });
}
chart.setOption(option)
reslove(chart)
@ -969,23 +529,12 @@ Page({ @@ -969,23 +529,12 @@ Page({
wx.navigateBack()
},
handleSend() {
app.mpBehavior({ PageName: 'BTN_DoctorPatientDetailSendMessage' })
app.mpBehavior({ doctor: true, PageName: 'BTN_DoctorPatientDetailSendMessage' })
wx.navigateTo({
url: `/pages/d_interactiveDoctor/index?patientId=${this.data.detail.PatientId}`,
})
},
handleNav(e, mp = true) {
const { index } = e.currentTarget.dataset
if (index == 0 && mp) {
}
if (index == 1 && mp) {
}
this.setData({
nav: index,
})
this.handleTypeChange({ detail: { value: '2' } })
},
getAdlList(newPage = 1) {
const { detail, EndDate, StartDate, type } = this.data
wx.ajax({
@ -1024,13 +573,6 @@ Page({ @@ -1024,13 +573,6 @@ Page({
})
})
},
onReachBottom() {
const { page, pages } = this.data.pagination
const nav = this.data.nav
if (pages > page && nav === '1') {
this.getAdlList(page + 1)
}
},
handleFold(e) {
const { index } = e.currentTarget.dataset
this.setData({
@ -1053,7 +595,7 @@ Page({ @@ -1053,7 +595,7 @@ Page({
})
},
handleEDC() {
app.mpBehavior({ PageName: 'BTN_DoctorPatientDetailEDC' })
app.mpBehavior({ doctor: true, PageName: 'BTN_DoctorPatientDetailEDC' })
wx.ajax({
method: 'POST',
url: '?r=zd/doctor/patient/set-edc',

53
src/pages/d_patientDetail/index.wxml

@ -28,7 +28,7 @@ @@ -28,7 +28,7 @@
<image wx:if="{{showTel}}" class="tel-icon" src="{{imageUrl}}icon63.png?t={{Timestamp}}"></image>
<image wx:else class="tel-icon" src="{{imageUrl}}icon62.png?t={{Timestamp}}"></image>
</view>
<view class="date">入组时间:2025-08-10</view>
<view class="date">注册时间:{{detail.BecomePatientTime}}</view>
</view>
</view>
</view>
@ -60,6 +60,57 @@ @@ -60,6 +60,57 @@
<view class="btn" bind:tap="handleSend">发消息</view>
<view class="btn" bind:tap="handleRemark">备注</view>
</view>
<view class="chart-list">
<view class="chart-title">GO-QOL生活质量评估报告</view>
<view class="chart-filter">
<picker class="type" mode="selector" range="{{typeRange}}" range-key="value" bind:change="handleTypeChange">
{{typeName}}
<image class="icon" src="{{imageUrl}}za-images/doctor/triangle-down.png?t={{Timestamp}}"></image>
</picker>
<view class="range">
<picker
mode="date"
end="{{EndDate}}"
fields="{{fields[type]}}"
mode="date"
model:value="{{StartDate}}"
bindchange="handleChange"
>
{{StartDate}}
</picker>
~
<picker
mode="date"
start="{{StartDate}}"
fields="{{fields[type]}}"
mode="date"
model:value="{{EndDate}}"
bindchange="handleChange"
>
{{EndDate}}
</picker>
<image class="icon" src="{{imageUrl}}za-images/doctor/triangle-down.png?t={{Timestamp}}"></image>
</view>
</view>
<view class="chart-card">
<view class="title">GO-QOL整体记录曲线</view>
<view class="chart">
<ec-canvas id="chart1" ec="{{ ec }}"></ec-canvas>
</view>
</view>
<view class="chart-card">
<view class="title">GO-QOL视觉功能影响记录曲线</view>
<view class="chart">
<ec-canvas id="chart2" ec="{{ ec }}"></ec-canvas>
</view>
</view>
<view class="chart-card">
<view class="title">GO-QOL外观影响记录曲线</view>
<view class="chart">
<ec-canvas id="chart3" ec="{{ ec }}"></ec-canvas>
</view>
</view>
</view>
</view>
<van-popup

2
src/pages/d_userInfo/index.ts

@ -57,7 +57,7 @@ Page({ @@ -57,7 +57,7 @@ Page({
onLoad() {},
onShow() {
app.waitLogin({ type: [2] }).then((_res) => {
app.mpBehavior({ PageName: 'PG_DoctorInfoDetails' })
app.mpBehavior({ doctor:true, PageName: 'PG_DoctorInfoDetails' })
this.getDetail()
})
},

35
src/pages/home/index.ts

@ -41,7 +41,7 @@ Page({ @@ -41,7 +41,7 @@ Page({
},
onShow() {
app.waitLogin({ type: [2] }).then(() => {
app.mpBehavior({ PageName: 'PG_DoctorHome' })
app.mpBehavior({ doctor: true, PageName: 'PG_DoctorHome' })
this.getNotice()
this.getBanner()
this.getList()
@ -54,7 +54,7 @@ Page({ @@ -54,7 +54,7 @@ Page({
this.getBriefingList()
this.getSopList()
if (userInfo.IsEDC === '1') {
app.mpBehavior({ PageName: 'PG_DoctorHomeNotice' })
app.mpBehavior({ doctor: true, PageName: 'PG_DoctorHomeNotice' })
}
})
})
@ -123,7 +123,7 @@ Page({ @@ -123,7 +123,7 @@ Page({
})
},
handleNoticeDetail(e) {
app.mpBehavior({ PageName: 'BTN_DoctorHomeNotice' })
app.mpBehavior({ doctor: true, PageName: 'BTN_DoctorHomeNotice' })
const { index } = e.currentTarget.dataset
const { Id, Url } = this.data.notice[index]
app.oldMpBehavior({ PositionId: '4', OperateType: '1', OperateId: Id })
@ -193,7 +193,7 @@ Page({ @@ -193,7 +193,7 @@ Page({
briefingList: res.list,
})
if (res.list.length && this.data.userInfo.IsEDC === '1') {
app.mpBehavior({ PageName: 'PG_DoctorHomeBrief' })
app.mpBehavior({ doctor: true, PageName: 'PG_DoctorHomeBrief' })
}
})
},
@ -213,7 +213,7 @@ Page({ @@ -213,7 +213,7 @@ Page({
sopList: res.list,
})
if (res.list.length && this.data.userInfo.IsEDC === '1') {
app.mpBehavior({ PageName: 'PG_DoctorHomeSop' })
app.mpBehavior({ doctor: true, PageName: 'PG_DoctorHomeSop' })
}
})
},
@ -234,19 +234,19 @@ Page({ @@ -234,19 +234,19 @@ Page({
list: res.list,
})
if (res.list.length) {
app.mpBehavior({ PageName: 'PG_DoctorHomeLibrary' })
app.mpBehavior({ doctor: true, PageName: 'PG_DoctorHomeLibrary' })
}
})
},
handleBriefingDetail(e: any) {
app.mpBehavior({ PageName: 'BTN_DoctorHomeBrief' })
app.mpBehavior({ doctor: true, PageName: 'BTN_DoctorHomeBrief' })
const { id } = e.currentTarget.dataset
wx.navigateTo({
url: `/pages/informationDetail/index?id=${id}`,
})
},
handleSop(e) {
app.mpBehavior({ PageName: 'BTN_DoctorHomeSop' })
app.mpBehavior({ doctor: true, PageName: 'BTN_DoctorHomeSop' })
const { index } = e.currentTarget.dataset
const { Id, FileList } = this.data.sopList[index]
const params: any = FileList[0]
@ -261,7 +261,7 @@ Page({ @@ -261,7 +261,7 @@ Page({
this.handleFile(params)
},
handleDetail(e: any) {
app.mpBehavior({ PageName: 'BTN_DoctorHomeLibrary' })
app.mpBehavior({ doctor: true, PageName: 'BTN_DoctorHomeLibrary' })
const { id, index } = e.currentTarget.dataset
const params = this.data.list[index]
if (params.ContentType === '5' && params.FileList[0]) {
@ -346,7 +346,22 @@ Page({ @@ -346,7 +346,22 @@ Page({
},
handleMpBehavior(e) {
const { code } = e.currentTarget.dataset
app.mpBehavior({ PageName: code })
app.mpBehavior({ doctor: true, PageName: code })
},
handleQuestion(e) {
const { question } = e.currentTarget.dataset
const content = {
1: '累计邀约的患者数',
2: '本月新邀约的患者数',
3: '有参与“中国甲状腺眼病登记项目”的患者。需要医生在小程序内的患者详情页进行自主标识。',
4: '根据GO-QOL变化情况激素用量情况,判断筛选的不达标需干预的患者。',
}[question]
wx.showModal({
content: content,
confirmColor: '#8c75d0',
showCancel: false,
confirmText: '知道了',
})
},
onShareAppMessage(e) {
if (e.from === 'button') {

13
src/pages/home/index.wxml

@ -145,13 +145,16 @@ @@ -145,13 +145,16 @@
</view>
<view class="stat" bind:tap="handlePatient">
<view class="s-header">
<view class="title">统计数据截止到昨天 <text class="sub">每天00:05更新</text></view>
<view class="title">
统计数据截止到昨天
<text class="sub">每天00:05更新</text>
</view>
</view>
<view class="s-container">
<view class="card" bind:tap="handleMpBehavior" data-code="BTN_DoctorHomeTotalPatient">
<image class="icon" src="{{imageUrl}}icon52.png?t={{Timestamp}}"></image>
<view class="content">
<view class="text">
<view class="text" catch:tap="handleQuestion" data-question="1">
累计邀约
<image class="question" src="{{imageUrl}}icon46.png?t={{Timestamp}}"></image>
</view>
@ -164,7 +167,7 @@ @@ -164,7 +167,7 @@
<view class="card" bind:tap="handleMpBehavior" data-code="BTN_DoctorHomeNewPatient">
<image class="icon" src="{{imageUrl}}icon53.png?t={{Timestamp}}"></image>
<view class="content">
<view class="text">
<view class="text" catch:tap="handleQuestion" data-question="2">
本月新增
<image class="question" src="{{imageUrl}}icon46.png?t={{Timestamp}}"></image>
</view>
@ -177,7 +180,7 @@ @@ -177,7 +180,7 @@
<view class="card" wx:if="{{userInfo.IsEDC==='1'}}">
<image class="icon" src="{{imageUrl}}icon45.png?t={{Timestamp}}"></image>
<view class="content">
<view class="text">
<view class="text" catch:tap="handleQuestion" data-question="3">
EDC参与
<image class="question" src="{{imageUrl}}icon46.png?t={{Timestamp}}"></image>
</view>
@ -190,7 +193,7 @@ @@ -190,7 +193,7 @@
<view class="card" wx:if="{{userInfo.IsEDC==='1'}}">
<image class="icon" src="{{imageUrl}}icon68.png?t={{Timestamp}}"></image>
<view class="content">
<view class="text">
<view class="text" catch:tap="handleQuestion" data-question="4">
需随访
<image class="question" src="{{imageUrl}}icon46.png?t={{Timestamp}}"></image>
</view>

6
src/pages/information/index.ts

@ -22,7 +22,7 @@ Page({ @@ -22,7 +22,7 @@ Page({
},
onShow() {
app.waitLogin({ type: [2] }).then(() => {
app.mpBehavior({ PageName: 'PG_LibraryList' })
app.mpBehavior({ doctor:true, PageName: 'PG_LibraryList' })
this.getList()
})
},
@ -58,7 +58,7 @@ Page({ @@ -58,7 +58,7 @@ Page({
}
},
handleDetail(e) {
app.mpBehavior({ PageName: 'BTN_LibraryListContent' })
app.mpBehavior({ doctor:true, PageName: 'BTN_LibraryListContent' })
const { id, index } = e.currentTarget.dataset
const params = this.data.list[index]
if (params.ContentType === '5' && params.FileList[0]) {
@ -109,7 +109,7 @@ Page({ @@ -109,7 +109,7 @@ Page({
},
onShareAppMessage(e) {
if (e.from === 'button') {
app.mpBehavior({ PageName: 'BTN_LibraryListShare' })
app.mpBehavior({ doctor:true, PageName: 'BTN_LibraryListShare' })
const { Title, CoverImgUrl, Id } = e.target.dataset.params
app.oldMpBehavior({ PositionId: '2', OperateType: '3', OperateId: Id })
return {

4
src/pages/informationDetail/index.ts

@ -40,7 +40,7 @@ Page({ @@ -40,7 +40,7 @@ Page({
id: options.id,
})
app.waitLogin({ type: [2] }).then(() => {
app.mpBehavior({ PageName: 'PG_LibraryDetails' })
app.mpBehavior({ doctor:true, PageName: 'PG_LibraryDetails' })
app.oldMpBehavior({ PositionId: '1', OperateType: '1', OperateId: options.id as string })
this.getDetail()
})
@ -161,7 +161,7 @@ Page({ @@ -161,7 +161,7 @@ Page({
},
onShareAppMessage() {
app.mpBehavior({ PageName: 'BTN_LibraryDetailsShare' })
app.mpBehavior({ doctor:true, PageName: 'BTN_LibraryDetailsShare' })
const { Title, CoverImgUrl, Id } = this.data.detail
app.oldMpBehavior({ PositionId: '1', OperateType: '3', OperateId: Id as string })
return {

12
src/pages/login/index.ts

@ -24,7 +24,7 @@ Page({ @@ -24,7 +24,7 @@ Page({
back: options.back,
})
app.waitLogin().then(() => {
app.mpBehavior({ PageName: 'PG_DoctorLogin' })
app.mpBehavior({ doctor: true, PageName: 'PG_DoctorLogin' })
})
},
getCode() {
@ -73,7 +73,7 @@ Page({ @@ -73,7 +73,7 @@ Page({
})
},
handleCheck() {
app.mpBehavior({ PageName: 'BTN_DoctorPrivacyAgree' })
app.mpBehavior({ doctor: true, PageName: 'BTN_DoctorPrivacyAgree' })
this.setData({
check1: !this.data.check1,
})
@ -91,7 +91,7 @@ Page({ @@ -91,7 +91,7 @@ Page({
})
},
async handleSubmit() {
app.mpBehavior({ PageName: 'BTN_DoctorLogin' })
app.mpBehavior({ doctor: true, PageName: 'BTN_DoctorLogin' })
await this.handleDocRule()
const { mobile, code } = this.data
if (!mobile) {
@ -132,11 +132,11 @@ Page({ @@ -132,11 +132,11 @@ Page({
})
},
handleNoDoc() {
app.mpBehavior({ PageName: 'BTN_DoctorQuickLogin' })
app.mpBehavior({ doctor: true, PageName: 'BTN_DoctorQuickLogin' })
this.handleDocRule()
},
handleWxSubmit(e: WechatMiniprogram.CustomEvent) {
app.mpBehavior({ PageName: 'BTN_DoctorQuickLogin' })
app.mpBehavior({ doctor: true, PageName: 'BTN_DoctorQuickLogin' })
const { iv, encryptedData } = e.detail
if (iv && encryptedData) {
wx.ajax({
@ -191,7 +191,7 @@ Page({ @@ -191,7 +191,7 @@ Page({
})
},
handleShowPopup() {
app.mpBehavior({ PageName: 'PG_DoctorLoginFail' })
app.mpBehavior({ doctor: true, PageName: 'PG_DoctorLoginFail' })
this.setData({
popupShow: true,
popupType: 'popup4',

6
src/pages/my/index.ts

@ -15,7 +15,7 @@ Page({ @@ -15,7 +15,7 @@ Page({
},
onShow() {
app.waitLogin({ type: [2] }).then(() => {
app.mpBehavior({ PageName: 'PG_DoctorPersonalCenter' })
app.mpBehavior({ doctor:true, PageName: 'PG_DoctorPersonalCenter' })
this.getUserInfo()
})
},
@ -120,7 +120,7 @@ Page({ @@ -120,7 +120,7 @@ Page({
})
},
handleUserInfo() {
app.mpBehavior({ PageName: 'BTN_DoctorPersonalCenterInfo' })
app.mpBehavior({ doctor:true, PageName: 'BTN_DoctorPersonalCenterInfo' })
wx.navigateTo({
url: '/pages/d_userInfo/index',
})
@ -131,7 +131,7 @@ Page({ @@ -131,7 +131,7 @@ Page({
})
},
handleInvite() {
app.mpBehavior({ PageName: 'BTN_DoctorPersonalCenterCode' })
app.mpBehavior({ doctor:true, PageName: 'BTN_DoctorPersonalCenterCode' })
wx.navigateTo({
url: '/pages/d_invite/index',
})

2
src/patient/pages/doctorDetail/index.scss

@ -60,6 +60,7 @@ page { @@ -60,6 +60,7 @@ page {
padding-top: 32rpx;
border-top: 1px solid rgba(246, 248, 249, 1);
.c-row {
margin-bottom: 10rpx;
display: flex;
gap: 16rpx;
font-size: 28rpx;
@ -71,6 +72,7 @@ page { @@ -71,6 +72,7 @@ page {
}
.site-num {
margin-top: 10rpx;
display: inline;
flex-shrink: 0;
font-size: 24rpx;
color: #9b9ea6;

2
src/patient/pages/doctorDetail/index.wxml

@ -32,7 +32,7 @@ @@ -32,7 +32,7 @@
<image class="icon" src="{{imageUrl}}icon41.png?t={{Timestamp}}"></image>
<view>
{{detail.hospital.ProvinceName}}{{detail.hospital.CityName}}{{detail.hospital.CountyName}}{{detail.hospital.Address}}
<view class="site-num">{{detail.hospital.dist}}</view>
<!-- <view class="site-num">{{detail.hospital.dist}}</view> -->
</view>
</view>
<view class="c-row" bind:tap="handlePhone" wx:if="{{ detail.Telephone }}">

14
src/patient/pages/enterInfo/index.wxml

@ -31,18 +31,12 @@ @@ -31,18 +31,12 @@
<view class="row-title">患者性别</view>
<view class="row">
<view class="item {{gender==2 && 'active'}}" bind:tap="handleGender" data-id="2">
<image
class="icon"
src="{{imageUrl}}{{gender==2 ? 'icon57' : 'icon55'}}.png?t={{Timestamp}}"
></image>
女性用户
<image class="icon" src="{{imageUrl}}{{gender==2 ? 'icon57' : 'icon55'}}.png?t={{Timestamp}}"></image>
</view>
<view class="item {{gender==1 && 'active'}}" bind:tap="handleGender" data-id="1">
<image
class="icon"
src="{{imageUrl}}{{gender==1 ? 'icon58' : 'icon56'}}.png?t={{Timestamp}}"
></image>
男性用户
<image class="icon" src="{{imageUrl}}{{gender==1 ? 'icon58' : 'icon56'}}.png?t={{Timestamp}}"></image>
</view>
</view>
<view class="row-title">患者年龄范围</view>

84
src/patient/pages/index/index.scss

@ -4,8 +4,8 @@ page { @@ -4,8 +4,8 @@ page {
}
.page-title {
width: 226rpx;
height: 33rpx;
width: 266rpx;
height: 34rpx;
}
.page {
position: relative;
@ -21,6 +21,7 @@ page { @@ -21,6 +21,7 @@ page {
background: linear-gradient(195deg, #ffe3fc 0%, #ecddff 100%);
.container {
display: flex;
align-items: center;
justify-content: space-between;
border-radius: 21rpx;
.avatar {
@ -125,6 +126,42 @@ page { @@ -125,6 +126,42 @@ page {
border-radius: 64rpx 64rpx 64rpx 64rpx;
}
}
.qol {
margin: $page-margin;
padding: 188rpx 36rpx 0;
height: 280rpx;
box-sizing: border-box;
position: relative;
.date {
position: absolute;
width: 320rpx;
height: 48rpx;
top: 0;
right: 0;
display: flex;
align-items: center;
justify-content: center;
font-size: 24rpx;
color: #b982ff;
}
.btn {
width: 216rpx;
height: 60rpx;
font-size: 32rpx;
color: #b982ff;
display: flex;
align-items: center;
justify-content: center;
gap: 8rpx;
background: linear-gradient(98deg, #ffffff 0%, #f7f1ff 100%);
border-radius: 48rpx 48rpx 48rpx 48rpx;
border: 1rpx solid #ffffff;
.icon {
width: 44rpx;
height: 44rpx;
}
}
}
.banner {
margin: $page-margin;
.swiper {
@ -172,7 +209,7 @@ page { @@ -172,7 +209,7 @@ page {
.l-banner {
margin-top: 24rpx;
width: 100%;
height: 336rpx;
height: 330rpx;
border-radius: 24rpx;
.live-img {
width: 100%;
@ -271,7 +308,7 @@ page { @@ -271,7 +308,7 @@ page {
color: rgba(105, 104, 110, 1);
}
.btn {
min-width: 128rpx;
min-width: 90rpx;
padding: 0 18rpx;
height: 48rpx;
display: flex;
@ -354,16 +391,47 @@ page { @@ -354,16 +391,47 @@ page {
}
.content {
font-size: 32rpx;
color: rgba(33, 29, 46, 1);
font-weight: bold;
flex: 1;
display: flex;
flex-direction: column;
justify-content: space-between;
.title {
min-height: 84rpx;
font-size: 32rpx;
line-height: 42rpx;
color: rgba(33, 29, 46, 1);
font-weight: bold;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
.footer {
display: flex;
justify-content: flex-end;
gap: 32rpx;
.f-item {
display: flex;
align-items: center;
font-size: 28rpx;
color: #adacb2;
.icon {
margin-right: 8rpx;
width: 36rpx;
height: 36rpx;
}
}
.share {
padding: 0;
background-color: transparent;
margin: 0;
&::after {
border: none;
outline: none;
}
}
}
}
}

70
src/patient/pages/index/index.ts

@ -7,13 +7,15 @@ Page({ @@ -7,13 +7,15 @@ Page({
today: dayjs().format('YYYY年MM月DD日 dddd'),
configList: [],
infoList: [],
infoList: [] as any,
storyList: [],
zdUserInfo: {} as any,
anyWhere: false,
regGuide: true,
isLogin: 1,
qolDetail: {},
adlList: [],
adlNum: '',
adlNewRecord: {} as any,
@ -194,7 +196,7 @@ Page({ @@ -194,7 +196,7 @@ Page({
this.getStoryList(item.configId)
}
if (item.code == 'adl') {
this.getAdl()
this.getQol()
}
if (item.code == 'activity2') {
this.getActivity(item.configId, item.showNum, 'liveList')
@ -250,20 +252,16 @@ Page({ @@ -250,20 +252,16 @@ Page({
})
})
},
getAdl() {
getQol() {
wx.ajax({
method: 'GET',
url: '?r=zd/adl/index',
url: '?r=xd/qol/index',
data: {},
}).then((res) => {
const newRecord = res.newRecord
this.setData({
adlList: res.list,
adlNum: res.count,
adlNewRecord: {
days: dayjs().diff(newRecord.CreateTime, 'day'),
...newRecord,
newCreateTime: dayjs(newRecord.CreateTime).format('YYYY-MM-DD'),
qolDetail: {
...res.newRecord,
CreateDate: dayjs(res.newRecord.CreateTime).format('YYYY-MM-DD'),
},
})
})
@ -514,4 +512,54 @@ Page({ @@ -514,4 +512,54 @@ Page({
regGuide: false,
})
},
handleToggleSave(e) {
const { index, sindex } = e.currentTarget.dataset
const list = this.data.infoList
const { Id, IsCollect } = list[index][sindex]
app.zdPermissionVerification(3, 3, `patient/pages/repository/index`).then(() => {
if (IsCollect == 1) {
wx.ajax({
method: 'POST',
url: '?r=zd/pic-text/cancel-collection',
data: {
ContentId: Id,
},
loading: true,
}).then(() => {
list[index][sindex].IsCollect = 0
list[index][sindex].CollectionPeopleNum = list[index][sindex].CollectionPeopleNum - 1
wx.showToast({
title: '取消收藏',
icon: 'none',
})
this.setData({
infoList: list,
})
})
} else {
wx.ajax({
method: 'POST',
url: '?r=zd/pic-text/collection',
data: {
ContentId: Id,
},
loading: true,
}).then(() => {
wx.showToast({
title: '收藏成功',
icon: 'none',
})
list[index][sindex].IsCollect = 1
list[index][sindex].CollectionPeopleNum = Number(list[index][sindex].CollectionPeopleNum) + 1
this.setData({
timeToastType: '10',
saveLock: true,
})
this.setData({
infoList: list,
})
})
}
})
},
})

43
src/patient/pages/index/index.wxml

@ -75,6 +75,19 @@ @@ -75,6 +75,19 @@
</swiper-item>
</swiper>
</view>
<view
class="qol"
wx:if="{{card.code == 'adl' && card.showStatus == 1}}"
style="background: url('{{imageUrl}}bg{{qolDetail.CreateTime ? 14 : 19}}.png?t={{Timestamp}}') no-repeat top center/100%"
bind:tap="routerTo"
data-url="/patient/pages/qolReport/index"
>
<view class="date" wx:if="{{qolDetail.CreateTime}}">最近一次评测 {{qolDetail.CreateDate}}</view>
<view class="btn" catch:tap="routerTo" data-url="/patient/pages/qol/index">
立即自测
<image class="icon" src="{{imageUrl}}icon73.png?t={{Timestamp}}"></image>
</view>
</view>
<view class="live-up-new" wx:if="{{card.code == 'activity2' && card.showStatus == 1 }}">
<view class="header" wx:if="{{card.name}}">
<view class="title">{{card.name}}</view>
@ -91,7 +104,7 @@ @@ -91,7 +104,7 @@
>
<image class="live-img" mode="aspectFill" src="{{imageUrl}}za-images/live-banner.png?t={{Timestamp}}"></image>
</view>
<view class="list">
<view class="list" wx:if="{{liveList.length}}">
<view
class="item"
wx:for="{{liveList}}"
@ -131,7 +144,13 @@ @@ -131,7 +144,13 @@
indicator-color="rgba(39, 58, 101, 0.2)"
indicator-dots="{{infoList.length > 1}}"
>
<swiper-item class="swiper-item" wx:for="{{infoList}}" wx:for-item="info" wx:key="index">
<swiper-item
class="swiper-item"
wx:for="{{infoList}}"
wx:for-item="info"
wx:for-index="infoIndex"
wx:key="index"
>
<view class="book-list">
<view
class="card"
@ -147,6 +166,26 @@ @@ -147,6 +166,26 @@
</view>
<view class="content">
<view class="title">{{item.Title}}</view>
<view class="footer">
<view class="f-item">
<image class="icon" src="{{imageUrl}}icon63.png?t={{Timestamp}}"></image>
<block wx:if="{{~~item.OpenNum}}">{{item.OpenNum}}</block>
</view>
<view
class="f-item {{detail.IsCollect == 1 && 'active'}}"
catch:tap="handleToggleSave"
data-index="{{infoIndex}}"
data-sindex="{{index}}"
>
<image
wx:if="{{item.IsCollect == 1}}"
class="icon"
src="{{imageUrl}}icon59.png?t={{Timestamp}}"
></image>
<image wx:else class="icon" src="{{imageUrl}}icon60.png?t={{Timestamp}}"></image>
<block wx:if="{{~~item.CollectionPeopleNum}}">{{item.CollectionPeopleNum}}</block>
</view>
</view>
</view>
</view>
<view

40
src/patient/pages/interactivePatient/index.scss

@ -207,36 +207,40 @@ page { @@ -207,36 +207,40 @@ page {
}
}
.adl {
position: relative;
margin-bottom: 32rpx;
padding: 32rpx 156rpx 34rpx 30rpx;
border-radius: 0 32rpx 32rpx;
background: linear-gradient(141deg, #edfcff 0%, #d4f3f9 100%);
padding: 32rpx;
border-radius: 24rpx;
background: linear-gradient(180deg, #f6efff 0%, #ffffff 100%);
border: 2rpx solid #fff;
.title {
width: 324rpx;
height: 40rpx;
font-size: 36rpx;
color: #211d2e;
font-weight: bold;
}
.sub-title {
margin-top: 18rpx;
line-height: 1;
margin-top: 10rpx;
margin-right: 222rpx;
font-size: 28rpx;
color: rgba(255, 255, 255, 0.8);
color: #211d2e;
}
.btn {
margin-top: 20rpx;
width: 220rpx;
height: 56rpx;
margin-top: 18rpx;
width: 224rpx;
height: 64rpx;
text-align: center;
line-height: 56rpx;
line-height: 64rpx;
font-size: 28rpx;
color: #e04775;
background: #ffffff;
color: #ffffff;
background: linear-gradient(197deg, #ffbcf9 0%, #b982ff 100%);
border-radius: 102rpx 102rpx 102rpx 102rpx;
}
.tip {
margin-top: 10rpx;
font-size: 24rpx;
color: #fff;
.photo {
position: absolute;
bottom: 30rpx;
right: 0;
width: 214rpx;
height: 212rpx;
}
}
.audio {

5
src/patient/pages/interactivePatient/index.ts

@ -362,6 +362,11 @@ Page({ @@ -362,6 +362,11 @@ Page({
],
})
},
handleQol() {
wx.navigateTo({
url: '/patient/pages/qol/index',
})
},
handleBack() {
wx.navigateBack({
fail() {

20
src/patient/pages/interactivePatient/index.wxml

@ -33,7 +33,7 @@ @@ -33,7 +33,7 @@
<view class="date" wx:if="{{message.showTime}}">{{message.msgCreateTimeName}}</view>
<view class="doctor" wx:if="{{message.msgFromType==='2'}}">
<view class="avatar">
<image class="a-img" mode="aspectFill" src="{{imageUrl}}za-images//5/doctor.png?t={{Timestamp}}"></image>
<image class="a-img" mode="aspectFill" src="{{doctorDetail.doctorAvatar}}"></image>
</view>
<view class="d-container">
<view class="guide" wx:if="{{message.msgContentType==='5'}}">
@ -66,19 +66,11 @@ @@ -66,19 +66,11 @@
</block>
</view>
</view>
<view
class="adl"
wx:elif="{{message.msgContentType==='3'}}"
style="padding-top: {{top+25}}px;background: url({{imageUrl}}za-images//doctor/d_interactive-adl-bg.png?t={{Timestamp}}) no-repeat bottom right / 268rpx 222rpx,#D74D75;"
>
<image
class="title"
src="{{imageUrl}}za-images//doctor/d_interactiveTitle1.png?t={{Timestamp}}"
mode="aspectFit"
></image>
<view class="sub-title">ADL+激素双达标</view>
<view class="btn" bind:tap="handleAdl">点击进入ADL</view>
<view class="tip">建议您定期做ADL测评</view>
<view class="adl" wx:elif="{{message.msgContentType==='10'}}" bind:tap="handleQol">
<view class="title">GO-QOL生活质量评分</view>
<view class="sub-title">可从主观感受变化反馈治疗效果,建议您每月定期测评</view>
<view class="btn">点击开始自评</view>
<image class="photo" src="{{imageUrl}}bg17.png?t={{Timestamp}}"></image>
</view>
<view
class="audio"

9
src/patient/pages/live/index.scss

@ -83,7 +83,7 @@ page { @@ -83,7 +83,7 @@ page {
}
}
.info-list {
margin: 32rpx 30rpx;
margin: 32rpx 40rpx;
.list-item {
margin-bottom: 32rpx;
background: #ffffff;
@ -95,7 +95,7 @@ page { @@ -95,7 +95,7 @@ page {
border-radius: 24rpx 24rpx 0 0;
display: block;
width: 100%;
height: 328rpx;
height: 330rpx;
}
.sign {
position: absolute;
@ -124,7 +124,6 @@ page { @@ -124,7 +124,6 @@ page {
}
.labels {
margin-top: 16rpx;
max-width: 56vw;
font-size: 28rpx;
color: rgba(105, 104, 110, 1);
white-space: nowrap;
@ -153,7 +152,7 @@ page { @@ -153,7 +152,7 @@ page {
margin-left: 10rpx;
flex-shrink: 0;
padding: 18rpx 36rpx;
font-size: 30rpx;
font-size: 28rpx;
line-height: 1;
color: #ffffff;
background: linear-gradient(to right, #c690fd, #d79ffc);
@ -336,7 +335,7 @@ page { @@ -336,7 +335,7 @@ page {
}
.title {
font-size: 32rpx;
color: #69686E;
color: #69686e;
}
}
}

2
src/patient/pages/live/index.ts

@ -246,7 +246,7 @@ Page({ @@ -246,7 +246,7 @@ Page({
onShareAppMessage() {
return {
title: '周三大咖说',
path: 'pages/live/index',
path: '/patient/pages/live/index',
}
},
})

1
src/patient/pages/live/index.wxml

@ -52,6 +52,7 @@ @@ -52,6 +52,7 @@
</view>
<view class="footer">
<view class="people" wx:if="{{item.SignUpPeopleNum * 1}}">{{item.SignUpPeopleNum}}人已报名</view>
<view wx:else></view>
<view class="btn active" wx:if="{{ item.Status==99}}">已取消</view>
<view class="btn active" wx:elif="{{ item.Status==100}}">已删除</view>
<view class="btn" wx:elif="{{item.Status==3 && item.ReplayVideoUrl}}">看回放</view>

3
src/patient/pages/liveDetail/index.json

@ -7,6 +7,7 @@ @@ -7,6 +7,7 @@
"van-icon": "@vant/weapp/icon/index",
"customPoster": "/components/customPoster/index",
"navbar": "/components/navbar/index",
"van-popup": "@vant/weapp/popup/index"
"van-popup": "@vant/weapp/popup/index",
"popup": "/components/popup/index"
}
}

38
src/patient/pages/liveDetail/index.scss

@ -116,6 +116,14 @@ @@ -116,6 +116,14 @@
z-index: 1;
}
}
.answer {
margin-top: 32rpx;
.a-img {
display: block;
width: 100%;
height: 230rpx;
}
}
.content {
margin-top: 24rpx;
.c-title {
@ -138,7 +146,31 @@ @@ -138,7 +146,31 @@
box-sizing: border-box;
background-color: #fff;
box-shadow: 0rpx 8rpx 48rpx 0rpx rgba(0, 0, 0, 0.19);
.btn-wrap {
display: flex;
align-items: center;
justify-content: space-between;
gap: 22rpx;
.office {
width: 220rpx;
height: 88rpx;
border: 1px solid #b982ff;
display: flex;
align-items: center;
justify-content: center;
gap: 14rpx;
font-size: 32rpx;
color: #b982ff;
box-sizing: border-box;
border-radius: 100rpx;
.icon {
width: 40rpx;
height: 40rpx;
}
}
}
.btn {
flex: 1;
height: 88rpx;
background: linear-gradient(197deg, #ffbcf9 0%, #b982ff 100%);
border-radius: 44rpx;
@ -150,9 +182,9 @@ @@ -150,9 +182,9 @@
color: #484848;
background: #e7e7e7;
}
&.active1{
color: #B982FF;
background: #F2E8FF;
&.active1 {
color: #b982ff;
background: #f2e8ff;
}
}
}

25
src/patient/pages/liveDetail/index.ts

@ -11,6 +11,12 @@ Page({ @@ -11,6 +11,12 @@ Page({
posterUrl: '',
params: {},
play: false,
popupShow: false,
popupType: 'popup6', // 登录失败弹窗
popupParams: {
close: true,
} as any,
},
videoContext: {} as WechatMiniprogram.VideoContext,
onLoad(options) {
@ -302,6 +308,25 @@ Page({ @@ -302,6 +308,25 @@ Page({
},
})
},
handleOffice() {
this.setData({
popupShow: true,
popupType: 'popup6',
popupParams: {
close: true,
},
})
},
handlePopupCancel() {
this.setData({
popupShow: false,
})
},
handleAnswer() {
wx.navigateTo({
url: `/pages/webview/index?url=${encodeURIComponent('https://shop.show.hbsaas.com/statics/#/?nId=bz56')}`,
})
},
onShareAppMessage() {
this.saveShare()
return {

20
src/patient/pages/liveDetail/index.wxml

@ -55,6 +55,9 @@ @@ -55,6 +55,9 @@
</swiper-item>
</swiper>
</view>
<!-- <view class="answer" bind:tap="handleAnswer"> -->
<!-- <image class="a-img" src="/images/bg21.png"></image> -->
<!-- </view> -->
<view class="content">
<view class="c-title">详情介绍</view>
<image class="c-img" mode="widthFix" src="{{item.url}}" wx:for="{{detail.DetailJson}}" wx:key="name"></image>
@ -71,7 +74,13 @@ @@ -71,7 +74,13 @@
<block wx:elif="{{detail.SignUpStatus==2}}">
<view class="btn" wx:if="{{detail.BeginTimeValue * 1 < dateValue * 1}}" bind:tap="handleLive">点此参加</view>
<!-- <view class="btn" wx:else bind:tap="handleResult">已报名,查看活动码</view> -->
<view class="btn active1" wx:else bind:tap="handleShare">已报名,查看活动码</view>
<view class="btn-wrap" wx:else>
<view class="office" bind:tap="handleOffice">
<image class="icon" src="{{imageUrl}}icon75.png?t={{Timestamp}}"></image>
提醒我
</view>
<view class="btn active1" bind:tap="handleShare">已报名,查看活动码</view>
</view>
</block>
<block wx:elif="{{detail.SignUpStatus==3}}">
<view
@ -131,4 +140,13 @@ @@ -131,4 +140,13 @@
<view class="tip" bind:tap="handleDownload">长按图片保存或分享</view>
</view>
</van-popup>
<customPoster wx:if="{{detail.PosterUrl}}" params="{{params}}" bind:finish="handlePosterFinish"></customPoster>
<popup
show="{{popupShow}}"
type="{{popupType}}"
params="{{popupParams}}"
bind:ok="handlePopupOk"
bind:cancel="handlePopupCancel"
></popup>

46
src/patient/pages/liveResult/index.scss

@ -2,13 +2,20 @@ page { @@ -2,13 +2,20 @@ page {
background: linear-gradient(180deg, #f9f9f9 0%, #f9f9f9 100%);
}
.page {
min-height: 100vh;
width: 100vw;
overflow-x: hidden;
min-height: 120vh;
position: relative;
padding-bottom: 100rpx;
.bg {
position: absolute;
left: 50%;
top: 0;
transform: translateX(-50%);
background: linear-gradient(197deg, #ffbcf9 0%, #b982ff 100%);
height: 776rpx;
border-radius: 0 0 100rpx 100rpx;
width: 120vw;
height: 656rpx;
border-radius: 0 0 140rpx 140rpx;
}
.page-container {
position: absolute;
@ -47,17 +54,44 @@ page { @@ -47,17 +54,44 @@ page {
color: #484848;
}
}
.office {
margin: 24rpx 40rpx 0;
padding: 48rpx 0 32rpx;
background: #ffffff;
border-radius: 24rpx 24rpx 24rpx 24rpx;
.o-title {
font-size: 32rpx;
color: #211d2e;
text-align: center;
}
.code {
margin: 24rpx auto 0;
display: block;
width: 284rpx;
height: 284rpx;
}
.btn {
margin: 24rpx auto 0;
width: 286rpx;
height: 56rpx;
text-align: center;
line-height: 56rpx;
background: #b982ff;
border-radius: 74rpx 74rpx 74rpx 74rpx;
font-size: 32rpx;
color: #ffffff;
}
}
.container {
position: relative;
margin: 64rpx 40rpx 0;
margin: 12rpx 40rpx 0;
width: calc(100% - 80rpx);
.c-content {
padding: 40rpx;
position: relative;
top: 20rpx;
left: 20rpx;
width: calc(100% - 40rpx);
left: 0;
background: #fff;
box-shadow: 0rpx 4rpx 40rpx 0rpx rgba(0, 0, 0, 0.06);
border-radius: 24rpx;

13
src/patient/pages/liveResult/index.wxml

@ -1,5 +1,11 @@ @@ -1,5 +1,11 @@
<navbar fixed title="" custom-style="background:{{background}}">
<van-icon name="arrow-left" slot="left" size="18px" color="background=='#FFFFFF'?'#000':'#fff'" bind:tap="handleBack" />
<van-icon
name="arrow-left"
slot="left"
size="18px"
color="background=='#FFFFFF'?'#000':'#fff'"
bind:tap="handleBack"
/>
</navbar>
<!-- padding-top:{{pageTop+22}}px; -->
<view class="page" style="background: url('{{imageUrl}}bg10.png?t={{Timestamp}}') no-repeat top center/100% 610rpx">
@ -8,6 +14,11 @@ @@ -8,6 +14,11 @@
<image class="badge" mode="aspectFit" src="{{imageUrl}}icon43.png?t={{Timestamp}}"></image>
<view class="status">报名成功</view>
<view class="tip">欢迎您参与此次活动</view>
<view class="office">
<view class="o-title">关注公众号,活动提醒不错过</view>
<image class="code" src="{{imageUrl}}code1.png?t={{Timestamp}}" show-menu-by-longpress></image>
<view class="btn">长按识别二维码</view>
</view>
<view class="container">
<view class="c-content">
<image class="banner" src="{{liveDetail.IntroductionUrl}}"></image>

2
src/patient/pages/login/index.scss

@ -22,7 +22,7 @@ pgae { @@ -22,7 +22,7 @@ pgae {
.title {
display: block;
margin: 32rpx auto 0;
width: 330rpx;
width: 386rpx;
height: 52rpx;
}
.content {

11
src/patient/pages/login/index.wxml

@ -30,9 +30,9 @@ @@ -30,9 +30,9 @@
></image>
<view class="a-content">
我已阅读并同意
<text class="link" bind:tap="handleLink" data-url="/doc/pages/doc2/index">《用户协议》</text>
<text class="link" bind:tap="handleLink" data-url="/doc/pages/doc2/index?active=1">《用户协议》</text>
<text class="link" bind:tap="handleLink" data-url="/doc/pages/doc2/index?active=1">《隐私政策》</text>
<text class="link" bind:tap="handleLink" data-url="/doc/pages/doc2/index">《隐私政策》</text>
</view>
</view>
<view class="a-col">
@ -51,9 +51,10 @@ @@ -51,9 +51,10 @@
data-key="check2"
></image>
<view class="a-content">
我同意依照此
<text class="link" bind:tap="handleLink" data-url="/doc/pages/doc2/index?active=1">《隐私政策》</text>
规定收集我的个人敏感信息
我同意依照
<text class="link" bind:tap="handleLink" data-url="/doc/pages/doc2/index">《隐私政策》</text>
<text class="link" bind:tap="handleLink" data-url="/doc/pages/doc2/index?active=2">《个人信息共享知情同意书》</text>
规定收集和共享我的个人敏感信息
</view>
</view>
</view>

2
src/patient/pages/my/index.wxml

@ -17,7 +17,7 @@ @@ -17,7 +17,7 @@
<view class="name">{{zdUserInfo.PatientName}}</view>
<!-- ignore-prettier -->
<view class="tip">
TED关爱中心已伴您走过
TED关爱小助手已伴您走过
<text class="day">{{zdUserInfo.JoinDays}}</text>
</view>

49
src/patient/pages/personalInformation/index.scss

@ -1,8 +1,15 @@ @@ -1,8 +1,15 @@
page {
background-color: #f6f8f9;
}
.page {
padding: 40rpx;
padding-bottom: 200rpx;
.page-container {
padding: 48rpx 40rpx;
border-radius: 24rpx 24rpx 24rpx 24rpx;
border: 2rpx solid #ffffff;
background: linear-gradient(180deg, #faf6ff 0%, #ffffff 8%, #ffffff 100%);
width: 100%;
padding: 30rpx 38rpx;
box-sizing: border-box;
.banner-new {
@ -48,6 +55,11 @@ @@ -48,6 +55,11 @@
&.radio-btns3 {
grid-template-columns: repeat(3, 1fr);
}
&.gender {
.btn {
padding: 11rpx 24rpx;
}
}
.btn {
padding: 24rpx;
font-size: 32rpx;
@ -57,10 +69,17 @@ @@ -57,10 +69,17 @@
border-radius: 116rpx;
border: 1px solid rgba(246, 248, 249, 1);
background-color: rgba(246, 248, 249, 1);
display: flex;
align-items: center;
justify-content: center;
&.active {
color: rgba(185, 130, 255, 1);
border-color: rgba(185, 130, 255, 1);
background-color: #FAF6FF;
background-color: #faf6ff;
}
.icon {
width: 66rpx;
height: 66rpx;
}
}
}
@ -157,20 +176,20 @@ @@ -157,20 +176,20 @@
// border-radius: 24rpx 24rpx 24rpx 24rpx;
// }
// }
}
.cancellation {
margin: 58rpx -38rpx 0;
height: 96rpx;
text-align: center;
line-height: 96rpx;
font-size: 32rpx;
color: rgba(195, 148, 255, 1);
border-top: 1px solid rgba(246, 248, 249, 1);
border-bottom: 1px solid rgba(246, 248, 249, 1);
&:last-of-type{
margin-top: 0;
border: none;
}
.cancellation {
margin: 32rpx 0 24rpx;
height: 88rpx;
background: #ffffff;
border-radius: 156rpx 156rpx 156rpx 156rpx;
text-align: center;
line-height: 96rpx;
font-size: 32rpx;
color: #c394ff;
&:last-of-type {
margin-top: 0;
border: none;
}
}

20
src/patient/pages/personalInformation/index.wxml

@ -42,7 +42,7 @@ @@ -42,7 +42,7 @@
<view class="label">性别</view>
</view>
<view class="row-content">
<view class="radio-btns">
<view class="radio-btns gender">
<view
class="btn {{ zdUserInfo.Gender === item.id && 'active'}}"
wx:for="{{GenderList}}"
@ -51,6 +51,16 @@ @@ -51,6 +51,16 @@
data-key="Gender"
data-id="{{item.id}}"
>
<image
wx:if="{{item.id==2}}"
class="icon"
src="{{imageUrl}}{{zdUserInfo.Gender==2 ? 'icon57' : 'icon55'}}.png?t={{Timestamp}}"
></image>
<image
wx:if="{{item.id==1}}"
class="icon"
src="{{imageUrl}}{{zdUserInfo.Gender==1 ? 'icon58' : 'icon56'}}.png?t={{Timestamp}}"
></image>
{{item.value}}
</view>
</view>
@ -80,7 +90,7 @@ @@ -80,7 +90,7 @@
<view class="label">是否有Graves病病史</view>
</view>
<view class="row-content">
<view class="radio-btns">
<view class="radio-btns radio-btns3">
<view
class="btn {{zdUserInfo.IsGraves==index && 'active'}}"
wx:for="{{dict.IsGraves}}"
@ -99,7 +109,7 @@ @@ -99,7 +109,7 @@
<view class="label">是否有TED(甲状腺眼突)及其相关眼部手术史</view>
</view>
<view class="row-content">
<view class="radio-btns">
<view class="radio-btns radio-btns3">
<view
class="btn {{zdUserInfo.HasTedSurgery==index && 'active'}}"
wx:for="{{dict.HasTedSurgery}}"
@ -114,9 +124,9 @@ @@ -114,9 +124,9 @@
</view>
</view>
</view>
<view class="cancellation" bind:tap="routerTo" data-url="/pages/login/index?back=1">切换医生端</view>
<view wx:if="{{zdUserInfo.IsRootUser==1}}" class="cancellation" bind:tap="handleLogout">注销账号</view>
</view>
<view class="cancellation" bind:tap="routerTo" data-url="/pages/login/index?back=1">切换医生端</view>
<view wx:if="{{zdUserInfo.IsRootUser==1}}" class="cancellation" bind:tap="handleLogout">注销账号</view>
</view>
<van-popup

5
src/patient/pages/qol/index.json

@ -0,0 +1,5 @@ @@ -0,0 +1,5 @@
{
"usingComponents": {
"navbar": "/components/navbar/index"
}
}

168
src/patient/pages/qol/index.scss

@ -0,0 +1,168 @@ @@ -0,0 +1,168 @@
page {
background-color: #f6f8f9;
}
.page {
min-height: 100vh;
padding-bottom: 300rpx;
.reference {
font-size: 24rpx;
color: #69686e;
vertical-align: text-top;
line-height: 1;
}
.module1 {
margin: 32rpx 40rpx 0;
padding: 214rpx 40rpx 0;
height: 1034rpx;
box-sizing: border-box;
.content {
font-size: 32rpx;
color: #211d2e;
line-height: 56rpx;
}
.container {
margin-top: 32rpx;
border-radius: 24rpx 24rpx 24rpx 24rpx;
.title {
padding-top: 32rpx;
display: flex;
align-items: center;
gap: 22rpx;
font-size: 36rpx;
color: #211d2e;
font-weight: bold;
&::before {
content: '';
width: 8rpx;
height: 36rpx;
background: #b982ff;
border-radius: 0rpx 0rpx 0rpx 0rpx;
}
}
.progress {
margin: 30rpx 2rpx 0;
padding-bottom: 32rpx;
.row {
display: flex;
gap: 16rpx;
.aside {
flex-shrink: 0;
display: flex;
flex-direction: column;
align-items: center;
.line-top {
height: 12rpx;
border-right: 1px dashed rgba(185, 130, 255, 0.29);
}
.side {
position: relative;
width: 32rpx;
height: 32rpx;
border-radius: 50%;
background-color: rgba(185, 130, 255, 0.3);
&::after {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
display: block;
content: '';
width: 18rpx;
height: 18rpx;
background-color: #b982ff;
border-radius: 50%;
}
}
.line {
flex: 1;
border-right: 1px dashed rgba(185, 130, 255, 0.29);
}
}
.r-content {
padding-bottom: 38rpx;
font-size: 32rpx;
color: #69686e;
line-height: 56rpx;
.name {
font-size: 32rpx;
color: #211d2e;
font-weight: bold;
}
}
}
}
}
.tip {
margin-top: -10rpx;
font-size: 32rpx;
color: #69686e;
text-align: right;
.num {
font-size: 44rpx;
color: #b982ff;
font-weight: bold;
}
}
}
.module2 {
margin: 32rpx 40rpx 0;
padding: 40rpx;
background: #ffffff;
border-radius: 24rpx 24rpx 24rpx 24rpx;
.title {
font-size: 32rpx;
color: #211d2e;
font-weight: bold;
}
.content {
margin-top: 20rpx;
font-size: 28rpx;
color: #adacb2;
line-height: 56rpx;
}
}
.footer {
position: fixed;
bottom: 0;
left: 0;
padding: 20rpx 40rpx calc(50rpx + env(safe-area-inset-bottom));
width: 100%;
box-sizing: border-box;
display: flex;
align-items: center;
gap: 14rpx;
background-color: #fff;
.share {
padding: 0 38rpx;
margin: 0;
border: none;
line-height: 1;
background-color: transparent;
&::after {
border: none;
padding: 0;
}
.icon {
width: 44rpx;
height: 44rpx;
}
.name {
margin-top: 12rpx;
font-size: 28rpx;
color: #b982ff;
}
}
.btn {
flex: 1;
height: 88rpx;
font-size: 36rpx;
color: #ffffff;
display: flex;
align-items: center;
justify-content: center;
background: linear-gradient(197deg, #ffbcf9 0%, #b982ff 100%);
border-radius: 100rpx 100rpx 100rpx 100rpx;
}
}
}

24
src/patient/pages/qol/index.ts

@ -0,0 +1,24 @@ @@ -0,0 +1,24 @@
const app = getApp<IAppOption>()
Page({
data: {},
onLoad() {
app.waitLogin({ type: [1] }).then(() => {})
},
handleAdd() {
wx.navigateTo({
url: '/patient/pages/qolAdd/index',
})
},
handleBack() {
wx.navigateBack({
fail() {
wx.reLaunch({
url: '/patient/pages/index/index',
})
},
})
},
})
export {}

91
src/patient/pages/qol/index.wxml

@ -0,0 +1,91 @@ @@ -0,0 +1,91 @@
<navbar custom-style="background:{{background}}" fixed>
<van-icon name="arrow-left" slot="left" size="18px" color="#000" bind:tap="handleBack" />
</navbar>
<view
class="page"
style="background: url('{{imageUrl}}bg15.png?t={{Timestamp}}') no-repeat top center/100% 518rpx;padding-top:{{pageTop}}px;"
>
<view class="module1" style="background: url('{{imageUrl}}bg16.png?t={{Timestamp}}') no-repeat top center/cover">
<view class="content">
<view>
研究表明,GO-QOL生活质量评估能敏锐反映患者的主观感受变化,是评估治疗效果的重要工具。
<text class="reference">[1]</text>
</view>
<view>它不仅能帮你看清自己“主观世界”的变化还能成为你和医生沟通的重要桥梁。</view>
</view>
<view class="container">
<view class="title">适用场景</view>
<view class="progress">
<view class="row">
<view class="aside">
<view class="line-top" style="opacity: 0"></view>
<view class="side"></view>
<view class="line"></view>
</view>
<view class="r-content">
<text class="name">初诊时:</text>
作为基线记录生活影响
<text class="reference">[3]</text>
</view>
</view>
<view class="row">
<view class="aside">
<view class="line-top"></view>
<view class="side"></view>
<view class="line"></view>
</view>
<view class="r-content">
<text class="name">诊疗中:</text>
分数上升说明主观改善
<text class="reference">[4]</text>
</view>
</view>
<view class="row">
<view class="aside">
<view class="line-top"></view>
<view class="side"></view>
<view class="line"></view>
</view>
<view class="r-content">
<text class="name">病情期:</text>
判断是否还需更多支持
<text class="reference">[2-3]</text>
</view>
</view>
</view>
</view>
<view class="tip">
<text class="num">16</text>
题,可能会占用您3分钟
</view>
</view>
<view class="module2">
<view class="title">参考文献:</view>
<view class="content">
<view>
[1]Kahaly, George J et al.“Teprotumumab lmproves Quality of Life in Thyroid Eye Disease: Meta-analysis and
Matching adjusted Indirect Comparison." Journal of the EndocrineSociety vol.9,6 bvaf063.8 Apr.2025
</view>
<view>
[2] Lee, T.H.B., & Sundar, G.(2020). Quality of Life in ThyroidEye Disease: A Systematic Review.Ophthalmic
plastic andreconstructive surgery,36(2),118-126.
</view>
<view>
[3] Dietrich A, Taylor P, White P, et al. Establishing theusefulness of the GO-QOL in a UK hospital-treated
populationwith thyroid eye disease in the ClRTED trial. Psychol HealthMed.2018;23(sup1):1341-1355.
</view>
<view>
[4] Smith TJ, Cockerham K, Barretto N, et al. Bridging andValidation of the Specific Graves Ophthalmopathy
Quality ofLife Questionnaire With Health State Utility Values. EndocrPract.2024;30(5):470-475.
</view>
</view>
</view>
<view class="footer">
<button class="share" open-type="share">
<image class="icon" src="{{imageUrl}}icon69.png?t={{Timestamp}}"></image>
<view class="name">分享</view>
</button>
<view class="btn" bind:tap="handleAdd">开始评测</view>
</view>
</view>

5
src/patient/pages/qolAdd/index.json

@ -0,0 +1,5 @@ @@ -0,0 +1,5 @@
{
"usingComponents": {
"navbar": "/components/navbar/index"
}
}

126
src/patient/pages/qolAdd/index.scss

@ -0,0 +1,126 @@ @@ -0,0 +1,126 @@
page {
background-color: #ffffff;
}
.page {
.page-header {
padding: 40rpx;
position: sticky;
top: 0;
left: 0;
.progress {
display: flex;
align-items: center;
justify-content: space-between;
gap: 10rpx;
.p-item {
flex: 1;
.name {
font-size: 36rpx;
color: #adacb2;
line-height: 44rpx;
}
.line {
margin-top: 16rpx;
height: 16rpx;
background: #ffffff;
border-radius: 0rpx 0rpx 0rpx 0rpx;
}
&.active {
.name {
color: #b982ff;
}
.line {
background: #b982ff;
}
}
}
}
.title {
margin-top: 44rpx;
font-size: 36rpx;
color: #211d2e;
font-weight: bold;
}
.content {
margin-top: 24rpx;
font-size: 32rpx;
color: #211d2e;
line-height: 48rpx;
}
}
.module {
padding: 0 40rpx 200rpx;
.row {
margin-bottom: 52rpx;
.title {
font-size: 36rpx;
color: #211d2e;
font-weight: bold;
}
.select {
margin-top: 24rpx;
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 24rpx;
.s-item1,
.s-item2,
.s-item3,
.s-item4 {
padding: 18rpx;
font-size: 32rpx;
color: #69686e;
line-height: 48rpx;
text-align: center;
background-color: #f6f8f9;
border-radius: 16rpx;
}
.s-item4 {
order: 1;
&.active {
background-color: #dafdee;
color: #1ec580;
}
}
.s-item3 {
order: 2;
&.active {
background-color: #dafdee;
color: #1ec580;
}
}
.s-item2 {
order: 3;
&.active {
background-color: #fff4e0;
color: #ffa300;
}
}
.s-item1 {
order: 4;
&.active {
background-color: #ffe7e7;
color: #ef3939;
}
}
}
}
.btn {
display: flex;
align-items: center;
justify-content: center;
height: 88rpx;
font-size: 36rpx;
color: #ffffff;
background: linear-gradient(197deg, #ffbcf9 0%, #b982ff 100%);
border-radius: 100rpx 100rpx 100rpx 100rpx;
}
.prev {
margin-top: 20rpx;
padding: 20rpx;
text-align: center;
font-size: 36rpx;
color: #69686e;
}
}
}

257
src/patient/pages/qolAdd/index.ts

@ -0,0 +1,257 @@ @@ -0,0 +1,257 @@
const app = getApp<IAppOption>()
Page({
data: {
id: '',
step: 0,
qolList0: [
{
title: '1. 骑自行车或电动车',
answer: '',
answerList: {
4: '没学过',
3: '无影响',
2: '有点影响',
1: '严重影响',
},
},
{
title: '2. 开车',
answer: '',
answerList: {
4: '没学过',
3: '无影响',
2: '有点影响',
1: '严重影响',
},
},
{
title: '3. 室内走动',
answer: '',
answerList: {
3: '无影响',
2: '有点影响',
1: '严重影响',
},
},
{
title: '4. 室外走动',
answer: '',
answerList: {
3: '无影响',
2: '有点影响',
1: '严重影响',
},
},
{
title: '5. 看书看报',
answer: '',
answerList: {
3: '无影响',
2: '有点影响',
1: '严重影响',
},
},
{
title: '6. 看电视',
answer: '',
answerList: {
3: '无影响',
2: '有点影响',
1: '严重影响',
},
},
{
title: '7. 兴趣爱好及平时娱乐',
answer: '',
answerList: {
3: '无影响',
2: '有点影响',
1: '严重影响',
},
},
{
title: '8. 过去的1周内,您是否觉得甲状腺相关眼病会阻碍您去做您想做的事',
answer: '',
answerList: {
3: '无影响',
2: '有点影响',
1: '严重影响',
},
},
],
qolList1: [
{
title: '9. 您是否感觉到甲状腺相关眼病改变您的外表?',
answer: '',
answerList: {
3: '不,没有',
2: '是的,有点',
1: '是的,严重',
},
},
{
title: '10. 您是否感觉到甲状腺相关眼病使您受到了别人的注视?',
answer: '',
answerList: {
3: '不,没有',
2: '是的,有点',
1: '是的,严重',
},
},
{
title: '11. 您是否感觉到别人因为甲状腺相关眼病对您不友善?',
answer: '',
answerList: {
3: '不,没有',
2: '是的,有点',
1: '是的,严重',
},
},
{
title: '12. 您是否感觉到甲状腺相关眼病影响您的自信心?',
answer: '',
answerList: {
3: '不,没有',
2: '是的,有点',
1: '是的,严重',
},
},
{
title: '13. 您是否感觉到甲状腺相关眼病影响您结交新朋友?',
answer: '',
answerList: {
3: '不,没有',
2: '是的,有点',
1: '是的,严重',
},
},
{
title: '14. 您是否感觉到甲状腺相关眼病使您收到了社会孤立?',
answer: '',
answerList: {
3: '不,没有',
2: '是的,有点',
1: '是的,严重',
},
},
{
title: '15. 您是否感觉到甲状腺相关眼病使您拍照的次数减少了?',
answer: '',
answerList: {
3: '不,没有',
2: '是的,有点',
1: '是的,严重',
},
},
{
title: '16. 您是否会试图掩饰甲状腺相关眼病给您带来的外貌变化?',
answer: '',
answerList: {
3: '不,没有',
2: '是的,有点',
1: '是的,严重',
},
},
],
},
onLoad(options) {
this.setData({
id: options.id,
})
app.waitLogin({ type: [1] }).then(() => {
if (options.id) {
this.getDetail()
}
})
},
getDetail() {
const { qolList0, qolList1 } = this.data
wx.ajax({
method: 'GET',
url: '?r=xd/qol/view',
data: {
Id: this.data.id,
},
}).then((res) => {
this.setData({
detail: res,
})
qolList0.forEach((item, index) => {
item.answer = res[`Question${index + 1}`]
})
qolList1.forEach((item, index) => {
item.answer = res[`Question${index + 9}`]
})
this.setData({
qolList0,
qolList1,
})
})
},
handleSelect(e) {
const { id } = this.data
if (id) return
const { list, key, index } = e.currentTarget.dataset
this.setData({
[`${list}[${index}].answer`]: key,
})
},
handleNext() {
this.setData({
step: 1,
})
wx.pageScrollTo({
scrollTop: 0,
})
},
handleReset() {
wx.redirectTo({
url: '/patient/pages/qolAdd/index',
})
},
handleSubmit() {
const { qolList0, qolList1 } = this.data
const arr = [...qolList0, ...qolList1]
const form = {}
for (let i = 0; i < arr.length; i++) {
const item = arr[i]
const order = item.title.split('.')[0]
if (!item.answer) {
wx.showToast({
title: `请填写第${order}`,
icon: 'none',
})
return
}
form[`Question${order}`] = item.answer
}
wx.ajax({
method: 'POST',
url: '?r=xd/qol/create',
data: {
...form,
},
}).then((res) => {
wx.redirectTo({
url: `/patient/pages/qolResult/index?id=${res.Id}`,
})
})
},
handlePrev() {
this.setData({
step: 0,
})
},
handleBack() {
wx.navigateBack({
fail() {
wx.reLaunch({
url: '/patient/pages/index/index',
})
},
})
},
})
export {}

66
src/patient/pages/qolAdd/index.wxml

@ -0,0 +1,66 @@ @@ -0,0 +1,66 @@
<navbar custom-style="background:{{background}}" fixed>
<van-icon name="arrow-left" slot="left" size="18px" color="#000" bind:tap="handleBack" />
</navbar>
<view class="page">
<view
class="page-header"
style="background:#fff url('{{imageUrl}}bg18.png?t={{Timestamp}}') no-repeat top center/100% 412rpx;padding-top:{{pageTop+20}}px;"
>
<view class="progress">
<view class="p-item active">
<view class="name">视觉功能</view>
<view class="line"></view>
</view>
<view class="p-item {{step==1 && 'active'}}">
<view class="name">外观</view>
<view class="line"></view>
</view>
</view>
<view class="title">请根据过去1周的情况填写</view>
<view class="content">过去一周内,甲状腺相关眼病是否影响您做以下的事情?根据您的实际情况选择。</view>
</view>
<view class="module" wx:if="{{step==0}}">
<view class="row" wx:for="{{qolList0}}" wx:key="index">
<view class="title">{{item.title}}</view>
<view class="select">
<view
class="s-item{{answerKey}} {{item.answer == answerKey && 'active'}}"
wx:for="{{item.answerList}}"
wx:key="index"
wx:for-item="answerItem"
wx:for-index="answerKey"
bind:tap="handleSelect"
data-list="qolList0"
data-index="{{index}}"
data-key="{{answerKey}}"
>
{{answerItem}}
</view>
</view>
</view>
<view class="btn" bind:tap="handleNext">下一页(1/2)</view>
</view>
<view class="module" wx:if="{{step==1}}">
<view class="row" wx:for="{{qolList1}}" wx:key="index">
<view class="title">{{item.title}}</view>
<view class="select">
<view
class="s-item{{answerKey}} {{item.answer == answerKey && 'active'}}"
wx:for="{{item.answerList}}"
wx:key="index"
wx:for-item="answerItem"
wx:for-index="answerKey"
bind:tap="handleSelect"
data-list="qolList1"
data-index="{{index}}"
data-key="{{answerKey}}"
>
{{answerItem}}
</view>
</view>
</view>
<view class="btn" wx:if="{{id}}" bind:tap="handleReset">重新测评</view>
<view class="btn" wx:else bind:tap="handleSubmit">提交(2/2)</view>
<view class="prev" bind:tap="handlePrev">上一步</view>
</view>
</view>

10
src/patient/pages/qolReport/index.json

@ -0,0 +1,10 @@ @@ -0,0 +1,10 @@
{
"navigationStyle": "default",
"navigationBarTitleText": "评估报告",
"usingComponents": {
"navbar": "/components/navbar/index",
"van-tab": "@vant/weapp/tab/index",
"van-tabs": "@vant/weapp/tabs/index",
"ec-canvas": "/components/ec-canvas/ec-canvas"
}
}

208
src/patient/pages/qolReport/index.scss

@ -0,0 +1,208 @@ @@ -0,0 +1,208 @@
page {
background-color: #f6f8f9;
}
.page {
padding-bottom: 200rpx;
.page-header {
background-color: #fff;
.tab-class {
font-size: 32rpx;
}
.form {
padding: 0 18rpx;
display: flex;
justify-content: flex-end;
.date {
display: flex;
align-items: center;
gap: 10rpx;
font-size: 32rpx;
color: #69686e;
.icon {
transform: rotate(90deg);
font-size: 20rpx;
color: #adacb2;
}
.start,
.end {
padding: 18rpx 0;
}
}
}
}
.chart-list {
padding: 32rpx 40rpx 0;
.chart-card {
margin-bottom: 24rpx;
padding: 32rpx;
background-color: #fff;
border-radius: 24rpx;
.title {
font-size: 32rpx;
color: #211d2e;
font-weight: bold;
}
.chart {
height: 420rpx;
}
}
}
.list {
margin: 28rpx 40rpx 0;
.list-title {
font-size: 36rpx;
color: #211d2e;
font-weight: bold;
}
.list-container {
.row {
display: flex;
gap: 16rpx;
.aside {
flex-shrink: 0;
display: flex;
flex-direction: column;
align-items: center;
.line-top {
height: 58rpx;
border-right: 1px dashed rgba(185, 130, 255, 0.29);
}
.side {
position: relative;
width: 32rpx;
height: 32rpx;
border-radius: 50%;
background-color: rgba(185, 130, 255, 0.3);
&::after {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
display: block;
content: '';
width: 18rpx;
height: 18rpx;
background-color: #b982ff;
border-radius: 50%;
}
}
.line {
flex: 1;
border-right: 1px dashed rgba(185, 130, 255, 0.29);
}
}
.r-container {
padding-top: 48rpx;
flex: 1;
.date {
font-size: 32rpx;
color: #211d2e;
font-weight: bold;
}
.r-card {
margin-top: 16rpx;
padding: 24rpx 32rpx;
border-radius: 24rpx;
background-color: #fff;
.wrap {
padding-bottom: 32rpx;
display: flex;
align-items: center;
gap: 22rpx;
border-bottom: 1px dashed rgba(33, 29, 46, 0.05);
.num {
font-size: 104rpx;
color: var(--color);
font-weight: bold;
line-height: 1;
}
.inner {
.label {
padding: 4rpx 16rpx;
border-radius: 50rpx 50rpx 50rpx 0;
display: inline-block;
font-size: 28rpx;
color: #ffffff;
line-height: 36rpx;
background: var(--label-background);
}
.name {
margin-top: 12rpx;
font-size: 28rpx;
color: #adacb2;
}
}
}
.stat {
padding-top: 24rpx;
display: flex;
align-items: center;
justify-content: space-between;
.s-item {
font-size: 32rpx;
color: #adacb2;
display: flex;
align-items: center;
gap: 24rpx;
.score {
color: #211d2e;
}
}
}
}
}
}
}
}
.page-footer {
position: fixed;
bottom: 0;
left: 0;
z-index: 100000;
width: 100%;
box-sizing: border-box;
padding: 20rpx 40rpx calc(20rpx + env(safe-area-inset-bottom));
background-color: #fff;
box-shadow: 0 8rpx 32rpx rgba(25, 0, 57, 0.07);
display: flex;
align-items: center;
.home {
padding: 0 34rpx;
text-align: center;
font-size: 28rpx;
color: #b982ff;
.icon {
width: 44rpx;
height: 44rpx;
}
}
.btn {
flex: 1;
height: 88rpx;
font-size: 38rpx;
color: #ffffff;
display: flex;
align-items: center;
justify-content: center;
background: linear-gradient(197deg, #ffbcf9 0%, #b982ff 100%);
border-radius: 100rpx 100rpx 100rpx 100rpx;
}
}
}
.status1 {
--color: #ef3939;
--background: #ffdddd;
--label-background: linear-gradient(177deg, #ff9090 0%, #ef3939 100%);
}
.status2 {
--color: #ffa300;
--background: #fff4e0;
--label-background: linear-gradient(153deg, #ffd48b 0%, #ffa300 100%);
}
.status3 {
--color: #1ec580;
--background: #dafdee;
--label-background: linear-gradient(330deg, #1ec580 0%, #4feaaa 100%);
}

336
src/patient/pages/qolReport/index.ts

@ -0,0 +1,336 @@ @@ -0,0 +1,336 @@
import dayjs from 'dayjs'
const app = getApp<IAppOption>()
let echarts: any = null
Page({
data: {
type: '1',
BeginMonth: '',
EndMonth: '',
fields: {
1: 'day',
2: 'month',
3: 'year',
},
list: [],
pagination: {
page: 1,
pages: 1,
count: 1,
},
},
chartComponent1: null as any,
chartComponent2: null as any,
chartComponent3: null as any,
async onLoad() {
echarts = await require.async('../../../gift/compontnts/echart/echarts.js')
this.chartComponent1 = this.selectComponent('#chart1')
this.chartComponent2 = this.selectComponent('#chart2')
this.chartComponent3 = this.selectComponent('#chart3')
app.waitLogin({ type: [1] }).then(() => {
this.handleChangeType()
this.getList()
})
},
handleChangeType(e?: WechatMiniprogram.CustomEvent) {
let type = ''
if (e) {
type = e.detail.index + 1
} else {
type = this.data.type
}
let EndMonth = ''
let BeginMonth = ''
if (type == '1') {
EndMonth = dayjs().format('YYYY-MM-DD')
BeginMonth = dayjs().subtract(6, 'd').format('YYYY-MM-DD')
} else if (type == '2') {
EndMonth = dayjs().format('YYYY-MM')
BeginMonth = dayjs().subtract(1, 'M').format('YYYY-MM')
} else if (type == '3') {
EndMonth = dayjs().format('YYYY')
BeginMonth = dayjs().subtract(1, 'y').format('YYYY')
} else if (type == '4' && e) {
}
this.setData({
page: 0,
type: type,
Num: '5',
EndMonth,
BeginMonth,
})
this.getChatData()
},
handleChange() {
this.getChatData()
},
getChatData() {
const { type, BeginMonth, EndMonth } = this.data
wx.ajax({
method: 'GET',
url: '?r=xd/qol/graph',
data: {
DateType: type,
StartDate: BeginMonth,
EndDate: EndMonth,
count: 0,
},
}).then((res) => {
const list0: any[] = []
const list1: any[] = []
const list2: any[] = []
res.list.forEach((item: any) => {
list0.push({
Date: item.Date,
value: item.TotalScore,
})
list1.push({
Date: item.Date,
value: item.VisionScore,
})
list2.push({
Date: item.Date,
value: item.AppearanceScore,
})
})
this.initChart(list0, 'chartComponent1')
this.initChart(list1, 'chartComponent2')
this.initChart(list2, 'chartComponent3')
})
},
initChart(defaultList = [] as any[], key) {
return new Promise((reslove) => {
this[key].init((canvas, width, height, dpr) => {
const chart = echarts.init(canvas, null, {
width,
height,
devicePixelRatio: dpr, // new
})
canvas.setChart(chart)
const option: any = {
tooltip: {
show: false,
trigger: 'axis',
axisPointer: {
type: 'shadow',
},
confine: true,
backgroundColor: 'rgba(0, 0, 0, 0.5)',
textStyle: {
color: '#fff',
fontSize: 10,
},
order: 'seriesDesc',
},
grid: {
top: '30',
left: '0',
right: '0',
bottom: '10',
containLabel: true,
},
xAxis: [
{
type: 'category',
axisTick: {
show: false,
inside: true,
length: 1,
alignWithLabel: true,
lineStyle: {
type: 'dotted',
color: '#D8D8D8',
width: 4,
cap: 'round',
},
},
axisLine: {
lineStyle: {
color: '#8C8C8C',
type: 'dashed',
},
},
splitLine: {
show: true,
showMinLine: false,
lineStyle: {
type: 'dotted',
color: 'rgba(137, 141, 151, 0.23)',
},
},
data: defaultList.map((item) => dayjs(item.Date).format('MM-DD')),
},
],
yAxis: [
{
type: 'value',
minInterval: 20,
max: 100,
axisLine: {
show: false,
lineStyle: {
type: 'solid',
color: 'rgba(161, 164, 172, 1)',
},
},
splitLine: {
show: true,
showMinLine: false,
lineStyle: {
type: 'dotted',
color: 'rgba(137, 141, 151, 0.23)',
},
},
},
],
series: [
{
name: '总分',
data: defaultList.length ? defaultList.map((item) => item.value) : [25],
barWidth: '16',
label: {
show: true,
position: 'top',
color: '#B982FF',
fontSize: 14,
},
type: 'line',
symbolSize: 4,
showSymbol: defaultList.length >= 1,
connectNulls: true,
z: 10,
itemStyle: {
color: '#B982FF',
},
markLine: {
symbol: ['none', 'none'],
data: [
{
name: '达标区',
yAxis: 80,
label: {
formatter: '{b}',
position: 'insideMiddle',
color: '#24D8C8',
fontSize: '10',
},
lineStyle: {
cap: '',
color: '#34D7C7',
type: 'dashed',
},
},
],
},
markArea: {
itemStyle: {
color: 'rgba(37,217,200,0.19)',
},
data: [
[
{
yAxis: 80,
},
{
yAxis: 100,
},
],
],
},
},
],
dataZoom: {
type: 'inside', // 有type这个属性,滚动条在最下面,也可以不行,写y:36,这表示距离顶端36px,一般就是在图上面。
startValue: 0,
endValue: 4,
filterMode: 'none',
},
}
chart.setOption(option)
reslove(chart)
return chart
})
})
},
getList(newPage = 1) {
wx.ajax({
method: 'GET',
url: '?r=xd/qol/list',
data: {
page: newPage,
},
}).then((res) => {
let list = res.page == 1 ? res.list : [...this.data.list, ...res.list]
this.setData({
list: list,
pagination: {
page: res.page,
pages: res.pages,
count: res.count,
},
})
})
},
onReachBottom() {
const { page, pages } = this.data.pagination
if (pages > page) {
this.getList(page + 1)
}
},
handleDelete(e) {
const { id, index } = e.currentTarget.dataset
const { list } = this.data
wx.showModal({
title: '确认删除吗?',
confirmColor: '#8c75d0',
success: (res) => {
if (res.confirm) {
wx.ajax({
method: 'POST',
url: '?r=xd/qol/delete',
data: {
Id: id,
},
}).then(() => {
this.setData({
list: list.filter((_item, i) => i !== index),
})
})
}
},
})
},
handleDetail(e) {
const { id } = e.currentTarget.dataset
wx.navigateTo({
url: `/patient/pages/qolAdd/index?id=${id}`,
})
},
handleQol() {
wx.navigateTo({
url: '/patient/pages/qol/index',
})
},
handleHome() {
wx.reLaunch({
url: '/patient/pages/index/index',
})
},
handleBack() {
wx.navigateBack({
fail() {
wx.reLaunch({
url: '/patient/pages/index/index',
})
},
})
},
})
export {}

119
src/patient/pages/qolReport/index.wxml

@ -0,0 +1,119 @@ @@ -0,0 +1,119 @@
<view class="page">
<view class="page-header">
<van-tabs
active="{{ active }}"
tab-class="tab-class"
color="#B982FF"
line-width="60rpx"
line-height="8rpx"
title-active-color="#211D2E"
title-inactive-color="#69686E"
bind:change="handleChangeType"
>
<van-tab title="日"></van-tab>
<van-tab title="月度"></van-tab>
<van-tab title="年度"></van-tab>
</van-tabs>
<view class="form">
<view class="date">
<picker
bindchange="handleChange"
class="start"
end="{{EndMonth}}"
fields="{{fields[type]}}"
mode="date"
model:value="{{BeginMonth}}"
>
{{BeginMonth}}
</picker>
<view class="line">~</view>
<picker
bindchange="handleChange"
class="end"
fields="{{fields[type]}}"
mode="date"
model:value="{{EndMonth}}"
start="{{BeginMonth}}"
>
{{EndMonth}}
</picker>
<van-icon class="icon" name="play" />
</view>
</view>
</view>
<view class="chart-list">
<view class="chart-card">
<view class="title">GO-QOL整体记录曲线</view>
<view class="chart">
<ec-canvas id="chart1" ec="{{ ec }}"></ec-canvas>
</view>
</view>
<view class="chart-card">
<view class="title">GO-QOL视觉功能影响记录曲线</view>
<view class="chart">
<ec-canvas id="chart2" ec="{{ ec }}"></ec-canvas>
</view>
</view>
<view class="chart-card">
<view class="title">GO-QOL外观影响记录曲线</view>
<view class="chart">
<ec-canvas id="chart3" ec="{{ ec }}"></ec-canvas>
</view>
</view>
</view>
<view class="list">
<view class="list-title">我的历史测评报告</view>
<view class="list-container">
<view
class="row {{item.TotalScore>=0 && 'status1'}} {{item.TotalScore>=40 && 'status2'}} {{item.TotalScore>=80 && 'status3'}}"
wx:for="{{list}}"
wx:key="index"
bind:tap="handleDetail"
data-id="{{item.Id}}"
data-index="{{index}}"
bind:longpress="handleDelete"
>
<view class="aside">
<view class="line-top" style="opacity: 0"></view>
<view class="side"></view>
<view class="line"></view>
</view>
<view class="r-container">
<view class="date">评估日期:{{item.Date}}</view>
<view class="r-card">
<view class="wrap">
<view class="num">{{item.TotalScore}}</view>
<view class="inner">
<view class="label" wx:if="{{item.TotalScore >= 80}}">轻度影响</view>
<view class="label" wx:elif="{{item.TotalScore >= 40}}">中度影响</view>
<view class="label" wx:else>重度影响</view>
<view class="name">TED生活质量评分</view>
</view>
</view>
<view class="stat">
<view class="s-item">
视觉功能
<view class="score">{{item.VisionScore}}分</view>
</view>
<view class="s-item">
外观
<view class="score">{{item.AppearanceScore}}分</view>
</view>
</view>
</view>
</view>
</view>
<pagination pagination="{{pagination}}"></pagination>
</view>
</view>
<view class="page-footer">
<view class="home" bind:tap="handleHome">
<image class="icon" src="{{imageUrl}}icon74.png?t={{Timestamp}}"></image>
<view>首页</view>
</view>
<view class="btn" bind:tap="handleQol">评测</view>
</view>
</view>

5
src/patient/pages/qolResult/index.json

@ -0,0 +1,5 @@ @@ -0,0 +1,5 @@
{
"usingComponents": {
"navbar": "/components/navbar/index"
}
}

218
src/patient/pages/qolResult/index.scss

@ -0,0 +1,218 @@ @@ -0,0 +1,218 @@
p age {
background-color: #f6f8f9;
}
.page {
padding: 40rpx 40rpx 120rpx;
.container {
padding: 32rpx;
border: 2rpx solid #ffffff;
background: #fff linear-gradient(180deg, #efe3ff 0%, #ffffff 100%) no-repeat top center/100% 228rpx;
border-radius: 24rpx;
box-shadow: 0 8rpx 32rpx rgba(25, 0, 57, 0.07);
.info {
display: flex;
align-items: center;
justify-content: space-between;
.wrap {
.w-header {
display: flex;
align-items: flex-end;
gap: 10rpx;
line-height: 1;
.num {
font-size: 128rpx;
color: var(--color);
font-weight: bold;
}
.label {
padding: 4rpx 16rpx;
margin-bottom: 14rpx;
font-size: 28rpx;
color: #ffffff;
line-height: 36rpx;
border-radius: 50rpx 50rpx 50rpx 0rpx;
background: var(--label-background);
}
}
.tip {
font-size: 28rpx;
color: #adacb2;
}
}
.status {
width: 152rpx;
height: 152rpx;
flex-shrink: 0;
}
}
.c-line {
position: relative;
margin: 32rpx -32rpx;
border-bottom: 1px dashed #f6f8f9;
&::before {
position: absolute;
top: -13rpx;
left: -13rpx;
content: '';
background-color: #f6f8f9;
width: 28rpx;
height: 28rpx;
border-radius: 50%;
}
&::after {
position: absolute;
top: -13rpx;
right: -13rpx;
content: '';
background-color: #f6f8f9;
width: 28rpx;
height: 28rpx;
border-radius: 50%;
}
}
.card {
margin-bottom: 24rpx;
padding: 36rpx 30rpx 80rpx;
background: #faf7ff;
border-radius: 20rpx 20rpx 20rpx 20rpx;
border: 2rpx solid #efe2fe;
.c-header {
display: flex;
align-items: center;
gap: 12rpx;
font-size: 24rpx;
color: rgba(33, 29, 46, 0.28);
.skew {
width: 10rpx;
height: 22rpx;
background: #b982ff;
transform: skew(-15deg);
}
}
.c-content {
margin-top: 16rpx;
font-size: 32rpx;
color: #211d2e;
font-weight: bold;
display: flex;
align-items: center;
gap: 10rpx;
.label {
padding: 0 12rpx;
font-size: 20rpx;
color: #ffffff;
line-height: 32rpx;
border-radius: 50rpx 50rpx 50rpx 0rpx;
background: var(--label-background);
}
}
.progress {
position: relative;
margin-top: 38rpx;
display: grid;
grid-template-columns: 4fr 4fr 2fr;
gap: 4rpx;
.p-item {
.title {
display: flex;
align-items: center;
justify-content: space-between;
font-size: 24rpx;
color: #adacb2;
}
.line1 {
margin-top: 8rpx;
height: 16rpx;
background: rgba(185, 130, 255, 0.2);
}
.line2 {
margin-top: 8rpx;
height: 16rpx;
background: rgba(185, 130, 255, 0.6);
}
.line3 {
margin-top: 8rpx;
height: 16rpx;
background: #b982ff;
}
}
.slide {
position: absolute;
top: 30rpx;
transform: translateX(-50%);
.circle {
width: 28rpx;
height: 28rpx;
background: #b982ff;
border-radius: 50%;
border: 2rpx solid #ffffff;
}
.num {
position: absolute;
bottom: -12rpx;
left: 50%;
transform: translate(-50%, 100%);
padding: 0 10rpx;
min-width: 52rpx;
height: 32rpx;
font-size: 32rpx;
color: #b982ff;
text-align: center;
line-height: 32rpx;
background: #eae0fa;
border-radius: 8rpx 8rpx 8rpx 8rpx;
}
}
}
}
.effect {
margin-top: 24rpx;
font-size: 28rpx;
color: #adacb2;
text-align: center;
}
}
.page-effect-wrap {
margin: 64rpx 0 0;
display: flex;
align-items: center;
justify-content: center;
.page-effect {
font-size: 32rpx;
color: var(--color);
line-height: 44rpx;
padding: 8rpx 42rpx;
background: var(--background);
border-radius: 96rpx 96rpx 96rpx 96rpx;
border: 2rpx solid #ffffff;
}
}
.report {
margin-top: 88rpx;
height: 88rpx;
display: flex;
align-items: center;
justify-content: center;
font-size: 36rpx;
color: #ffffff;
background: linear-gradient(197deg, #ffbcf9 0%, #b982ff 100%);
border-radius: 100rpx 100rpx 100rpx 100rpx;
}
}
.status1 {
--color: #ef3939;
--background: #ffdddd;
--label-background: linear-gradient(177deg, #ff9090 0%, #ef3939 100%);
}
.status2 {
--color: #ffa300;
--background: #fff4e0;
--label-background: linear-gradient(153deg, #ffd48b 0%, #ffa300 100%);
}
.status3 {
--color: #1ec580;
--background: #dafdee;
--label-background: linear-gradient(330deg, #1ec580 0%, #4feaaa 100%);
}

45
src/patient/pages/qolResult/index.ts

@ -0,0 +1,45 @@ @@ -0,0 +1,45 @@
const app = getApp<IAppOption>()
Page({
data: {
id: '',
detail: {},
},
onLoad(options) {
this.setData({
id: options.id,
})
app.waitLogin({ type: [1] }).then(() => {
this.getDetail()
})
},
getDetail() {
wx.ajax({
method: 'GET',
url: '?r=xd/qol/view',
data: {
Id: this.data.id,
},
}).then((res) => {
this.setData({
detail: res,
})
})
},
handleReport() {
wx.navigateTo({
url: '/patient/pages/qolReport/index',
})
},
handleBack() {
wx.navigateBack({
fail() {
wx.reLaunch({
url: '/patient/pages/index/index',
})
},
})
},
})
export {}

114
src/patient/pages/qolResult/index.wxml

@ -0,0 +1,114 @@ @@ -0,0 +1,114 @@
<navbar custom-style="background:{{background}}" fixed>
<van-icon name="arrow-left" slot="left" size="18px" color="#000" bind:tap="handleBack" />
</navbar>
<view
class="page {{detail.TotalScore>=0 && 'status1'}} {{detail.TotalScore>=40 && 'status2'}} {{detail.TotalScore>=80 && 'status3'}}"
style="background: url('{{imageUrl}}bg15.png?t={{Timestamp}}') no-repeat top center/100% 518rpx;padding-top:{{pageTop+20}}px;"
>
<view class="container">
<view class="info">
<view class="wrap">
<view class="w-header">
<view class="num">{{detail.TotalScore}}</view>
<view class="label" wx:if="{{detail.TotalScore >= 80}}">轻度影响</view>
<view class="label" wx:elif="{{detail.TotalScore >= 40}}">中度影响</view>
<view class="label" wx:else>重度影响</view>
</view>
<view class="tip">本次TED生活质量评分</view>
</view>
<image class="status" wx:if="{{detail.TotalScore >= 80}}" src="{{imageUrl}}icon72.png?t={{Timestamp}}"></image>
<image class="status" wx:elif="{{detail.TotalScore >= 40}}" src="{{imageUrl}}icon71.png?t={{Timestamp}}"></image>
<image class="status" wx:else src="{{imageUrl}}icon70.png?t={{Timestamp}}"></image>
</view>
<view class="c-line"></view>
<view class="card {{detail.VisionScore>=0 && 'status1'}} {{detail.VisionScore>=40 && 'status2'}} {{detail.VisionScore>=80 && 'status3'}}">
<view class="c-header">
<view class="skew"></view>
视觉功能
</view>
<view class="c-content">
当前分数:{{detail.VisionScore}}
<view class="label" wx:if="{{detail.VisionScore >= 80}}">轻度影响</view>
<view class="label" wx:elif="{{detail.VisionScore >= 40}}">中度影响</view>
<view class="label" wx:else>重度影响</view>
</view>
<view class="progress">
<view class="p-item">
<view class="title">
<view class="start">0</view>
<view class="end">39</view>
</view>
<view class="line1"></view>
</view>
<view class="p-item">
<view class="title">
<view class="start"></view>
<view class="end">79</view>
</view>
<view class="line2"></view>
</view>
<view class="p-item">
<view class="title">
<view class="start"></view>
<view class="end">100</view>
</view>
<view class="line3"></view>
</view>
<view class="slide" style="left:{{detail.VisionScore}}%">
<view class="circle"></view>
<view class="num">{{detail.VisionScore}}</view>
</view>
</view>
</view>
<view class="card {{detail.AppearanceScore>=0 && 'status1'}} {{detail.AppearanceScore>=40 && 'status2'}} {{detail.AppearanceScore>=80 && 'status3'}}">
<view class="c-header">
<view class="skew"></view>
外观
</view>
<view class="c-content">
当前分数:{{detail.AppearanceScore}}
<view class="label" wx:if="{{detail.AppearanceScore >= 80}}">轻度影响</view>
<view class="label" wx:elif="{{detail.AppearanceScore >= 40}}">中度影响</view>
<view class="label" wx:else>重度影响</view>
</view>
<view class="progress">
<view class="p-item">
<view class="title">
<view class="start">0</view>
<view class="end">39</view>
</view>
<view class="line1"></view>
</view>
<view class="p-item">
<view class="title">
<view class="start"></view>
<view class="end">79</view>
</view>
<view class="line2"></view>
</view>
<view class="p-item">
<view class="title">
<view class="start"></view>
<view class="end">100</view>
</view>
<view class="line3"></view>
</view>
<view class="slide" style="left:{{detail.AppearanceScore}}%">
<view class="circle"></view>
<view class="num">{{detail.AppearanceScore}}</view>
</view>
</view>
</view>
<view class="effect">分数越低, 对生活质量影响越严重</view>
</view>
<view class="page-effect-wrap">
<view class="page-effect" wx:if="{{detail.TotalScore >= 80}}">建议保持定期监测,保持良好生活习惯</view>
<view class="page-effect" wx:elif="{{detail.TotalScore >= 40}}">建议就诊检查,评估是否需要调整治疗</view>
<view class="page-effect" wx:else>建议前往眼科中心 及时就诊</view>
</view>
<view class="report" bind:tap="handleReport">
查看我的评估报告
<van-icon name="arrow" />
</view>
</view>

24
src/patient/pages/repository/index.scss

@ -98,12 +98,16 @@ page { @@ -98,12 +98,16 @@ page {
}
.inner {
flex: 1;
display: flex;
flex-direction: column;
justify-content: space-between;
padding-bottom: 20rpx;
.title {
font-size: 32rpx;
color: rgba(33, 29, 46, 1);
font-weight: bold;
line-height: 42rpx;
min-height: 84rpx;
}
.date {
margin-top: 10rpx;
@ -129,28 +133,18 @@ page { @@ -129,28 +133,18 @@ page {
}
}
.footer {
margin-top: 10rpx;
display: flex;
justify-content: flex-end;
gap: 32rpx;
.f-item {
display: flex;
align-items: center;
font-size: 22rpx;
color: #b6b7ba;
font-size: 28rpx;
color: #adacb2;
.icon {
margin-right: 8rpx;
width: 32rpx;
height: 32rpx;
}
&.active {
color: #e04775;
}
&::after {
margin: 18rpx;
content: '';
width: 2rpx;
height: 20rpx;
background-color: #f3f3f4;
width: 36rpx;
height: 36rpx;
}
}
.share {

50
src/patient/pages/repository/index.ts

@ -334,6 +334,56 @@ Page({ @@ -334,6 +334,56 @@ Page({
},
})
},
handleToggleSave(e) {
const { index } = e.currentTarget.dataset
const list = this.data.list
const { Id, IsCollect } = list[index]
app.zdPermissionVerification(3, 3, `patient/pages/repository/index`).then(() => {
if (IsCollect == 1) {
wx.ajax({
method: 'POST',
url: '?r=zd/pic-text/cancel-collection',
data: {
ContentId: Id,
},
loading: true,
}).then(() => {
list[index].IsCollect = 0
list[index].CollectionPeopleNum = list[index].CollectionPeopleNum - 1
wx.showToast({
title: '取消收藏',
icon: 'none',
})
this.setData({
list,
})
})
} else {
wx.ajax({
method: 'POST',
url: '?r=zd/pic-text/collection',
data: {
ContentId: Id,
},
loading: true,
}).then(() => {
wx.showToast({
title: '收藏成功',
icon: 'none',
})
list[index].IsCollect = 1
list[index].CollectionPeopleNum = Number(list[index].CollectionPeopleNum) + 1
this.setData({
timeToastType: '10',
saveLock: true,
})
this.setData({
list,
})
})
}
})
},
onShareAppMessage(e: any) {
if (e.from === 'button') {
const { id, index, type } = e.target.dataset

17
src/patient/pages/repository/index.wxml

@ -2,7 +2,7 @@ @@ -2,7 +2,7 @@
class="page"
style="--name: rgba(185, 130, 255, 1); --tag-bg: rgba(224, 71, 117, 0.13);background: url('{{imageUrl}}bg10.png?t={{Timestamp}}') no-repeat top center/100% 610rpx;padding-top:{{pageTop+22}}px;"
>
<navbar fixed title="了解TED" custom-style="background:{{background}}"></navbar>
<navbar fixed z-index="1000" title="了解TED" custom-style="background:{{background}}"></navbar>
<view class="sticky">
<view class="tags">
<view class="scroll">
@ -46,6 +46,21 @@ @@ -46,6 +46,21 @@
</view>
<view class="inner">
<view class="title">{{item.Title}}</view>
<view class="footer">
<view class="f-item">
<image class="icon" src="{{imageUrl}}icon63.png?t={{Timestamp}}"></image>
<block wx:if="{{~~item.OpenNum}}">{{item.OpenNum}}</block>
</view>
<view
class="f-item {{detail.IsCollect == 1 && 'active'}}"
catch:tap="handleToggleSave"
data-index="{{index}}"
>
<image wx:if="{{item.IsCollect == 1}}" class="icon" src="{{imageUrl}}icon59.png?t={{Timestamp}}"></image>
<image wx:else class="icon" src="{{imageUrl}}icon60.png?t={{Timestamp}}"></image>
<block wx:if="{{~~item.CollectionPeopleNum}}">{{item.CollectionPeopleNum}}</block>
</view>
</view>
</view>
</view>
</view>

12
src/patient/pages/repositoryDetail/index.scss

@ -124,8 +124,8 @@ @@ -124,8 +124,8 @@
color: #b6b7ba;
.icon {
margin-right: 8rpx;
width: 32rpx;
height: 32rpx;
width: 28rpx;
height: 28rpx;
}
&:not(:last-of-type)::after {
margin: 18rpx;
@ -203,7 +203,7 @@ @@ -203,7 +203,7 @@
align-items: center;
justify-content: center;
font-size: 32rpx;
color: #211D2E;
color: #211d2e;
margin: 0;
background: transparent;
&::after {
@ -212,15 +212,15 @@ @@ -212,15 +212,15 @@
}
.icon {
margin-right: 6rpx;
width: 56rpx;
height: 56rpx;
width: 44rpx;
height: 44rpx;
}
.icon-active {
@extend .icon;
display: none;
}
&.active {
color: #B982FF;
color: #b982ff;
.icon {
display: none;
}

2
typings/index.d.ts vendored

@ -39,7 +39,7 @@ interface IAppOption { @@ -39,7 +39,7 @@ interface IAppOption {
checkLoginType: (type: pageType[] | 'any', backPath?: string) => boolean
getMenuInfo: (arg0: WechatMiniprogram.Page.Instance<any, any>) => void
getUserInfo: (type: 0 | 1 | 2) => Promise<never>
mpBehavior: (data: { PageName: string }) => void
mpBehavior: (data: { doctor?: boolean; PageName: string }) => void
oldMpBehavior: (data: { PositionId: string; OperateType: string; OperateId: string }) => void
zdMpBehavior: (data: { PageName: string; doctor?: boolean }) => void
zdGetTheme: () => Promise<'PATIENT'>

Loading…
Cancel
Save