Browse Source

1.7 功能开发完毕

dev
kola-web 2 months ago
parent
commit
875709cb00
  1. 15
      .prettierrc
  2. 24
      README.md
  3. 4
      project.config.json
  4. 7
      project.private.config.json
  5. 3
      src/app.json
  6. 5
      src/echart/components/homeLevel1/index.scss
  7. 4
      src/echart/components/homeLevel2/index.scss
  8. BIN
      src/images/chat-room-aside.png
  9. BIN
      src/images/chat-room-case-card-bg.png
  10. BIN
      src/images/help/bg.png
  11. BIN
      src/images/help/m1-container1.png
  12. BIN
      src/images/help/m1-title1.png
  13. BIN
      src/images/help/m2-card1-row3-photo1.png
  14. BIN
      src/images/help/m2-title1.png
  15. BIN
      src/images/help/m3-card1-step1-photo1.png
  16. BIN
      src/images/help/m3-card1-step3-photo1.png
  17. BIN
      src/images/help/m3-card2-step1-photo1.png
  18. BIN
      src/images/help/m3-card3-row1-photo1.png
  19. BIN
      src/images/help/m3-card3-row2-photo1.png
  20. BIN
      src/images/help/m3-card3-row2-photo2.png
  21. BIN
      src/images/help/m3-card3-row2-photo3.png
  22. BIN
      src/images/help/m3-card4-row2-photo1.png
  23. BIN
      src/images/help/m3-title1.png
  24. BIN
      src/images/help/m4-card1-step1-photo1.png
  25. BIN
      src/images/help/m4-card3-step1-photo1.png
  26. BIN
      src/images/help/m4-card4-step1-photo1.png
  27. BIN
      src/images/help/m4-title1.png
  28. BIN
      src/images/icon-case.png
  29. BIN
      src/images/my-list-icon4.png
  30. BIN
      src/images/send-case-badge.png
  31. 2
      src/module1/pages/casesDetail/index.json
  32. 4
      src/module1/pages/chatRoom/index.json
  33. 1122
      src/module1/pages/chatRoom/index.scss
  34. 179
      src/module1/pages/chatRoom/index.ts
  35. 349
      src/module1/pages/chatRoom/index.wxml
  36. 5
      src/module1/pages/help/index.json
  37. 92
      src/module1/pages/help/index.scss
  38. 8
      src/module1/pages/help/index.ts
  39. 312
      src/module1/pages/help/index.wxml
  40. 6
      src/pages/my/index.ts
  41. 7
      src/pages/my/index.wxml
  42. 1
      src/sdk/Easemob-chat-4.7.0.js
  43. 2
      src/utils/webIM/WebIM.js

15
.prettierrc

@ -4,25 +4,32 @@ @@ -4,25 +4,32 @@
"tabWidth": 2,
"useTabs": false,
"semi": true,
"singleQuote": false,
"singleQuote": true,
"bracketSpacing": true,
"trailingComma": "all",
"arrowParens": "always",
"endOfLine": "auto",
"htmlWhitespaceSensitivity": "ignore",
"singleAttributePerLine": false,
"jsxSingleQuote": true,
"overrides": [
{
"files": "*.wxml",
"options": { "parser": "html" }
"options": {
"parser": "html"
}
},
{
"files": "*.wxss",
"options": { "parser": "css" }
"options": {
"parser": "css"
}
},
{
"files": "*.wxs",
"options": { "parser": "babel" }
"options": {
"parser": "babel"
}
}
]
}

24
README.md

@ -35,16 +35,22 @@ wx.showModal({ @@ -35,16 +35,22 @@ wx.showModal({
病历编辑页面 /module1/pages/entryCases/index?id=病例id
聊天室互动页 /module1/pages/chatRoom/index?id=聊天室id
v1.6
1、申请绑定邀约需求;
2、小红点需求;
1. 申请绑定邀约需求;
2. 小红点需求;
一级医生:待处理病病历;聊天室消息;
核心医生:待处理病历,病历更新,聊天室消息,医生待审核;
三级医生:待处理病历,病历更新,聊天室消息,医生待审核;
3、聊天室左上角图片+新增;
4、新手引导图;
5、超级医生首页,新增病历更新项;逻辑与三级医生首页逻辑一致;
6、合作的医生卡片点击区域有问题;
7、隐私协议内容更新;
8、聊天室有最新消息时,增加push通知,我记得咱们当时有一个6个小时内的不重复发送。不知道这个push是否增加了。
3. 聊天室左上角图片+新增;
4. 新手引导图;
5. 超级医生首页,新增病历更新项;逻辑与三级医生首页逻辑一致;
6. 合作的医生卡片点击区域有问题;
7. 隐私协议内容更新;
8. 聊天室有最新消息时,增加push通知,我记得咱们当时有一个6个小时内的不重复发送。不知道这个push是否增加了。
v1.7
1. 帮助手册:个人中心提供帮助手册入口;
2. 医生增加成2个手机号登录的功能;
3. 对话框列表,提供病例悬浮按钮,点击后半屏浮层,浮层内可展示病例内容;底部提供更多操作按钮,点击与顶部点击病例跳转一致;(邀约医生无此按钮)

4
project.config.json

@ -49,6 +49,10 @@ @@ -49,6 +49,10 @@
{
"value": "/echart/components/ec-canvas/echarts.js",
"type": "file"
},
{
"value": "src/images/help/*",
"type": "glob"
}
]
},

7
project.private.config.json

@ -9,6 +9,13 @@ @@ -9,6 +9,13 @@
"miniprogram": {
"list": [
{
"name": "帮助中心",
"pathName": "module1/pages/help/index",
"query": "",
"launchMode": "default",
"scene": null
},
{
"name": "绑定医生结果页",
"pathName": "module1/pages/setApplicationDoctorResult/index",
"query": "",

3
src/app.json

@ -38,7 +38,8 @@ @@ -38,7 +38,8 @@
"pages/loginOut/index",
"pages/applicationRecords/index",
"pages/setApplicationDoctor/index",
"pages/setApplicationDoctorResult/index"
"pages/setApplicationDoctorResult/index",
"pages/help/index"
]
}
],

5
src/echart/components/homeLevel1/index.scss

@ -3,7 +3,6 @@ @@ -3,7 +3,6 @@
.user {
display: flex;
gap: 24rpx;
align-items: center;
.avatar {
flex-shrink: 0;
width: 112rpx;
@ -215,7 +214,7 @@ @@ -215,7 +214,7 @@
}
.cooperate {
margin-top: 24rpx;
background: linear-gradient(180deg, #f1feff 0%, #ffffff 100%);
background: #ffffff linear-gradient(180deg, #f1feff 0%, #ffffff 100%) no-repeat top center/100% 200rpx;
border-radius: 16rpx 16rpx 16rpx 16rpx;
border: 2rpx solid #ffffff;
&-header {
@ -380,7 +379,7 @@ @@ -380,7 +379,7 @@
.cooperate-none {
margin-top: 24rpx;
background: linear-gradient(180deg, #f1feff 0%, #ffffff 100%);
background: #ffffff linear-gradient(180deg, #f1feff 0%, #ffffff 100%) no-repeat top center/100% 200rpx;
border-radius: 16rpx 16rpx 16rpx 16rpx;
border: 2rpx solid #ffffff;
&-header {

4
src/echart/components/homeLevel2/index.scss

@ -305,7 +305,7 @@ @@ -305,7 +305,7 @@
.cooperate,
.invite {
margin-top: 24rpx;
background: linear-gradient(180deg, #f1feff 0%, #ffffff 100%);
background: #ffffff linear-gradient(180deg, #f1feff 0%, #ffffff 100%) no-repeat top center/100% 200rpx;
border-radius: 16rpx 16rpx 16rpx 16rpx;
border: 2rpx solid #ffffff;
&-header {
@ -494,7 +494,7 @@ @@ -494,7 +494,7 @@
.cooperate-none,
.invite-none {
margin-top: 24rpx;
background: linear-gradient(180deg, #f1feff 0%, #ffffff 100%);
background: #ffffff linear-gradient(180deg, #f1feff 0%, #ffffff 100%) no-repeat top center/100% 200rpx;
border-radius: 16rpx 16rpx 16rpx 16rpx;
border: 2rpx solid #ffffff;
&-header {

BIN
src/images/chat-room-aside.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

BIN
src/images/chat-room-case-card-bg.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

BIN
src/images/help/bg.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 497 KiB

BIN
src/images/help/m1-container1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

BIN
src/images/help/m1-title1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

BIN
src/images/help/m2-card1-row3-photo1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 215 KiB

BIN
src/images/help/m2-title1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

BIN
src/images/help/m3-card1-step1-photo1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 186 KiB

BIN
src/images/help/m3-card1-step3-photo1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 207 KiB

BIN
src/images/help/m3-card2-step1-photo1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 143 KiB

BIN
src/images/help/m3-card3-row1-photo1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 170 KiB

BIN
src/images/help/m3-card3-row2-photo1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

BIN
src/images/help/m3-card3-row2-photo2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 151 KiB

BIN
src/images/help/m3-card3-row2-photo3.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 111 KiB

BIN
src/images/help/m3-card4-row2-photo1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 KiB

BIN
src/images/help/m3-title1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

BIN
src/images/help/m4-card1-step1-photo1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 131 KiB

BIN
src/images/help/m4-card3-step1-photo1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 115 KiB

BIN
src/images/help/m4-card4-step1-photo1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 184 KiB

BIN
src/images/help/m4-title1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

BIN
src/images/icon-case.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 834 B

BIN
src/images/my-list-icon4.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
src/images/send-case-badge.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

2
src/module1/pages/casesDetail/index.json

@ -4,8 +4,8 @@ @@ -4,8 +4,8 @@
"usingComponents": {
"doctorAvatar": "/components/doctorAvatar/index",
"van-dialog": "@vant/weapp/dialog/index",
"customAudioBar": "/components/customAudioBar/index",
"van-icon": "@vant/weapp/icon/index",
"customAudioBar": "/components/customAudioBar/index",
"customAudioText":"/components/customAudioText/index"
}
}

4
src/module1/pages/chatRoom/index.json

@ -6,6 +6,8 @@ @@ -6,6 +6,8 @@
"van-popup": "@vant/weapp/popup/index",
"customRecord": "/components/customRecord/index",
"uploadFile": "/components/uploadFile/index",
"doctorAvatar":"/components/doctorAvatar/index"
"doctorAvatar":"/components/doctorAvatar/index",
"customAudioBar": "/components/customAudioBar/index",
"customAudioText":"/components/customAudioText/index"
}
}

1122
src/module1/pages/chatRoom/index.scss

File diff suppressed because it is too large Load Diff

179
src/module1/pages/chatRoom/index.ts

@ -4,7 +4,7 @@ const app = getApp<IAppOption>(); @@ -4,7 +4,7 @@ const app = getApp<IAppOption>();
interface IMessageItem {
msgId: string;
contentType: "1" | "2" | "3" | "4" | "5" | "6"; // 1:文本 2: 语音 3. 图片 4. 视频 5. 提示信息
contentType: "1" | "2" | "3" | "4" | "5" | "6" | "7"; // 1:文本 2: 语音 3. 图片 4. 视频 5. 提示信息 6. 撤回消息 7. 病例卡片
content: any;
fromDoctorId: string;
doctorImg: string;
@ -25,6 +25,8 @@ Page({ @@ -25,6 +25,8 @@ Page({
id: "",
show1: false,
show2: false,
show3: false,
focus: false,
fold: true,
@ -54,12 +56,20 @@ Page({ @@ -54,12 +56,20 @@ Page({
record: true,
canInvite: false,
sliderTop: 0,
// caseDetail
caseFold: false,
detail: {} as any,
},
innerAudioContext: null as WechatMiniprogram.InnerAudioContext | null,
videoContext: null as WechatMiniprogram.VideoContext | null,
onLoad(options) {
const systemInfo = wx.getSystemInfoSync();
this.setData({
id: options.id,
sliderTop: systemInfo.screenHeight - 260,
});
this.videoContext = wx.createVideoContext("video");
this.innerAudioContext = wx.createInnerAudioContext({
@ -145,6 +155,8 @@ Page({ @@ -145,6 +155,8 @@ Page({
this.getInvite();
this.WebIMLogin();
this.getCaseDetail();
});
},
handleRoomDetail() {
@ -322,6 +334,7 @@ Page({ @@ -322,6 +334,7 @@ Page({
const { index } = e.currentTarget.dataset;
const { messageList } = this.data;
const message = messageList[index];
this.senIMRecallMessage(message);
this.delMessage(message);
this.senRecallMessage(index);
},
@ -356,6 +369,53 @@ Page({ @@ -356,6 +369,53 @@ Page({
messageList,
});
},
senIMRecallMessage(message) {
const { chatGroupInfo, userInfo } = this.data;
const option = {
mid: message.uniqueCode,
to: chatGroupInfo.ChatGroupId,
chatType: "groupChat",
ext: userInfo.Name,
};
wx.WebIM.conn.recallMessage(option);
},
senRecallCallback(message) {
const { messageList } = this.data;
const { mid } = message;
let mIndex: number | null = null;
const newMessageList = messageList.filter((item, index) => {
if (item.uniqueCode === mid) {
mIndex = index;
return false;
}
return true;
});
this.setData({
messageList: newMessageList,
});
if (mIndex) {
this.senRecallCallbackPush(mIndex, message);
}
},
senRecallCallbackPush(index, extMessage) {
const { userInfo, messageList } = this.data;
const message: IMessageItem = {
msgId: "",
contentType: "6",
content: `${extMessage.ext}撤回了一条消息`,
fromDoctorId: userInfo.DoctorId,
createTime: dayjs().format("YYYY-MM-DD HH:mm:ss"),
isSelf: 1,
isRead: 2,
doctorImg: userInfo.Img,
doctorName: userInfo.Name,
hospitalName: userInfo.HospitalName,
};
messageList.splice(index, 1, message);
this.setData({
messageList,
});
},
WebIMLogin() {
const { chatDoctor } = this.data;
wx.WebIM.conn
@ -420,6 +480,9 @@ Page({ @@ -420,6 +480,9 @@ Page({
this.handleView();
}
},
onRecallMessage: (message) => {
this.senRecallCallback(message);
},
});
},
formatMessage(message: IMessageItem) {
@ -604,4 +667,118 @@ Page({ @@ -604,4 +667,118 @@ Page({
messageList,
});
},
handleConformSendCase() {
this.setData({
show2: true,
});
},
handleCancelSendCase() {
this.setData({
show2: false,
});
},
handleSendCase() {
const { userInfo } = this.data;
const message: IMessageItem = {
msgId: "",
contentType: "7",
content: "病历",
fromDoctorId: userInfo.DoctorId,
createTime: dayjs().format("YYYY-MM-DD HH:mm:ss"),
isSelf: 1,
isRead: 2,
doctorImg: userInfo.Img,
doctorName: userInfo.Name,
hospitalName: userInfo.HospitalName,
};
this.WebIMSendMessage(message);
this.handleCancelSendCase();
},
handleCase() {
this.setData({
show3: true,
});
},
handleCaseDetailClose() {
this.setData({
show3: false,
});
},
getCaseDetail() {
wx.ajax({
method: "GET",
url: "?r=takeda/case/get-case-detail",
data: {
caseId: this.data.case.caseId,
},
}).then((res) => {
res.feedbackList.map((item) => {
item.fold = false;
return item;
});
this.setData({
detail: res,
dealDoctorInfo: res.dealCaseInfo.dealDoctorInfo,
dealInfo: res.dealCaseInfo.dealInfo,
deptId: res.caseDeptId[0],
labelIds: res.caseLabels.map((item) => item.labelId),
});
});
},
handleFold() {
this.setData({
caseFold: !this.data.caseFold,
});
},
handleFeedBackFold(e) {
const { index } = e.currentTarget.dataset;
const { detail } = this.data;
const feedbackList = detail.feedbackList;
feedbackList[index].fold = !feedbackList[index].fold;
this.setData({
detail: {
...detail,
feedbackList,
},
});
},
handlePreviewFile(e) {
app.mpBehavior({ PageName: "BTN_CASEDETAILFILEPREVIEW" });
const { item } = e.currentTarget.dataset;
wx.downloadFile({
url: item.url,
success(res) {
wx.openDocument({
filePath: res.tempFilePath,
showMenu: true,
fail() {
wx.showToast({
title: "该文件无法预览",
icon: "none",
});
},
});
},
});
},
handlePreviewName(e) {
const { item } = e.currentTarget.dataset;
wx.showModal({
title: "文件名",
content: item.name,
confirmColor: "#00B4C5",
cancelColor: "#141515",
showCancel: false,
confirmText: "关闭",
});
},
handleImagePreview(e) {
const { url, parent } = e.currentTarget.dataset;
const urls = parent.map((item) => item.url);
wx.previewImage({
urls,
current: url,
});
},
});

349
src/module1/pages/chatRoom/index.wxml

@ -1,3 +1,4 @@ @@ -1,3 +1,4 @@
<page-meta page-style="{{ show3 ? 'overflow: hidden;' : '' }}" />
<view class="page" bind:tap="handleNoLongPress">
<view class="page-header">
<view class="info">
@ -86,6 +87,40 @@ @@ -86,6 +87,40 @@
<image class="v-img" src="{{message.content.imgUrl}}" mode="aspectFill"></image>
<image class="play" src="{{imageUrl}}icon-video-play.png?t={{Timestamp}}"></image>
</view>
<view
class="case-card"
bind:tap="handleCase"
wx:elif="{{message.contentType==='7'}}"
style="background: url({{imageUrl}}chat-room-case-card-bg.png?r={{Timestamp}}) no-repeat top center/100%;"
>
<view class="c-header">
<view class="c-status">病例{{detail.caseStatusName}}</view>
<view class="c-id">ID:{{detail.caseNo}}</view>
</view>
<view class="c-container">
<view class="c-row">
<view class="c-label">提交时间</view>
<view class="c-content">{{detail.createTime}}</view>
</view>
<view class="c-row">
<view class="c-label">提交人</view>
<view class="c-content">
{{detail.createDoctorInfo.doctorName}}
<view class="line">|</view>
{{detail.createDoctorInfo.hospitalName}} {{detail.createDoctorInfo.doctorTitleName ||
detail.createDoctorInfo.doctorOtherTitle}}
</view>
</view>
<view class="c-row">
<view class="c-label">标签</view>
<view class="c-content">
<view class="wrap">
<view class="tag" wx:for="{{detail.caseLabels}}" wx:key="labelId">{{item.labelName}}</view>
</view>
</view>
</view>
</view>
</view>
</view>
</view>
<view class="patient" wx:elif="{{message.isSelf===1}}">
@ -125,6 +160,40 @@ @@ -125,6 +160,40 @@
<image class="v-img" src="{{message.content.imgUrl}}" mode="aspectFill"></image>
<image class="play" src="{{imageUrl}}icon-video-play.png?t={{Timestamp}}"></image>
</view>
<view
class="case-card"
bind:tap="handleCase"
wx:elif="{{message.contentType==='7'}}"
style="background: url({{imageUrl}}chat-room-case-card-bg.png?r={{Timestamp}}) no-repeat top center/100%;"
>
<view class="c-header">
<view class="c-status">病例{{detail.caseStatusName}}</view>
<view class="c-id">ID:{{detail.caseNo}}</view>
</view>
<view class="c-container">
<view class="c-row">
<view class="c-label">提交时间</view>
<view class="c-content">{{detail.createTime}}</view>
</view>
<view class="c-row">
<view class="c-label">提交人</view>
<view class="c-content">
{{detail.createDoctorInfo.doctorName}}
<view class="line">|</view>
{{detail.createDoctorInfo.hospitalName}} {{detail.createDoctorInfo.doctorTitleName ||
detail.createDoctorInfo.doctorOtherTitle}}
</view>
</view>
<view class="c-row">
<view class="c-label">标签</view>
<view class="c-content">
<view class="wrap">
<view class="tag" wx:for="{{detail.caseLabels}}" wx:key="labelId">{{item.labelName}}</view>
</view>
</view>
</view>
</view>
</view>
</view>
<doctorAvatar did="{{message.fromDoctorId}}" class="avatar" src="{{message.doctorImg}}"></doctorAvatar>
</view>
@ -177,6 +246,12 @@ @@ -177,6 +246,12 @@
</customRecord>
<image
class="icon-add"
src="{{imageUrl}}icon-case.png?t={{Timestamp}}"
mode="scaleToFill"
bind:tap="handleConformSendCase"
></image>
<image
class="icon-add"
src="{{imageUrl}}icon-circle-add.png?t={{Timestamp}}"
mode="scaleToFill"
bind:tap="handleFooter"
@ -196,6 +271,12 @@ @@ -196,6 +271,12 @@
<video id="video" src="{{videoUrl}}"></video>
</view>
<movable-area class="slidearea">
<movable-view direction="vertical" x="{{-800}}" y="{{sliderTop}}" class="mview" bind:tap="handleCase">
<image class="slidebar" mode="aspectFit" src="{{imageUrl}}chat-room-aside.png?t={{Timestamp}}"></image>
</movable-view>
</movable-area>
<van-popup show="{{ show1 }}" bind:close="onAgreeClose" closeable round>
<view class="popup1">
<view class="title">用户须知</view>
@ -206,3 +287,271 @@ @@ -206,3 +287,271 @@
<view class="btn" bind:tap="handleSubmitAgree">确定</view>
</view>
</van-popup>
<van-popup show="{{ show2 }}" custom-style="background: transparent;" round>
<view class="popup2">
<image class="badge" src="{{imageUrl}}send-case-badge.png?t={{Timestamp}}"></image>
<view class="popup-container">
<view class="p-title">发送病历卡片到学习窗</view>
<view class="p-footer">
<view class="cancel" bind:tap="handleCancelSendCase">取消</view>
<view class="ok" bind:tap="handleSendCase">确定</view>
</view>
</view>
</view>
</van-popup>
<van-popup
show="{{ show3 }}"
custom-style="background:#F6F6F6"
position="bottom"
bind:close="handleCaseDetailClose"
round
>
<view class="popup3">
<view class="p-header">
<van-icon name="cross" class="close" color="#141515" bind:tap="handleCaseDetailClose" />
<view class="more" bind:tap="handleCaseDetail">更多操作</view>
</view>
<view class="p-container">
<view class="detail-card">
<view class="li-header">
<view class="wrap">
<view class="id">ID:{{detail.caseNo}}</view>
<view class="status status3" wx:if="{{detail.caseStatus==='1'}}">{{detail.caseStatusName}}</view>
<view class="status status2" wx:elif="{{detail.caseStatus==='2'}}">{{detail.caseStatusName}}</view>
<view class="status status1" wx:elif="{{detail.caseStatus==='3'}}">{{detail.caseStatusName}}</view>
<view class="status status4" wx:elif="{{detail.caseStatus==='4'}}">{{detail.caseStatusName}}</view>
<view class="status status3" wx:if="{{detail.isOpen==='1'}}">已公开</view>
</view>
<view class="fold" bind:tap="handleFold">
{{caseFold ? '展开' : '收起'}}
<image class="icon" src="{{imageUrl}}fold-{{caseFold ? 'down' :'top'}}.png?t={{Timestamp}}"></image>
</view>
</view>
<view class="li-row">
<view class="label">提交时间</view>
<view class="content">{{detail.createTime}}</view>
</view>
<view class="user">
<doctorAvatar
class="avatar"
src="{{detail.createDoctorInfo.doctorImg}}"
level="{{detail.createDoctorInfo.doctorLevel}}"
did="{{detail.createDoctorInfo.doctorId}}"
></doctorAvatar>
<view class="wrap">
<view class="w-header">
<view class="name">{{detail.createDoctorInfo.doctorName}}</view>
<view class="desc">
{{detail.createDoctorInfo.doctorTitleName || detail.createDoctorInfo.doctorOtherTitle}}
</view>
</view>
<view class="w-footer">
<view class="hostipal">{{detail.createDoctorInfo.hospitalName}}</view>
<view class="tag">
{{detail.createDoctorInfo.hospitalClassificationName}}{{detail.createDoctorInfo.hospitalLevelName}}
</view>
<view class="site" wx:if="{{detail.createDoctorInfo.cityName}}">
{{detail.createDoctorInfo.cityName}}{{detail.createDoctorInfo.countyName?'/':''}}{{detail.createDoctorInfo.countyName}}
</view>
</view>
</view>
</view>
<view class="cases {{caseFold && 'fold'}}">
<view class="tags" wx:if="{{detail.caseLabels.length}}">
<view class="t-label">标签</view>
<view class="wrap">
<view class="tag" wx:for="{{detail.caseLabels}}" wx:key="labelId">{{item.labelName}}</view>
</view>
</view>
<view class="photos">
<image
class="photo"
src="{{item.url}}"
mode="aspectFill"
bind:tap="handleImagePreview"
data-url="{{item.url}}"
data-parent="{{detail.caseImages}}"
wx:for="{{detail.caseImages}}"
wx:key="url"
></image>
</view>
<view class="remark" wx:if="{{detail.description}}">
<view class="r-title">病历备注</view>
<view class="r-content">{{detail.description}}</view>
</view>
<view class="audio-list" wx:if="{{detail.caseAudios.length}}">
<view class="audio-row" wx:for="{{detail.caseAudios}}" wx:key="url">
<customAudioBar class="audio-bar" url="{{item.url}}" time="{{item.duration}}"></customAudioBar>
<view class="options">
<customAudioText class="trans" url="{{item.url}}" map1="BTN_CASEDETAILVOICETOTEXT">
转文字
</customAudioText>
</view>
</view>
</view>
<view class="files" wx:if="{{detail.caseFiles.length}}">
<view class="f-title">病历相关文件</view>
<view class="file-list">
<view
class="fl-row"
wx:for="{{detail.caseFiles}}"
wx:key="url"
bind:tap="handlePreviewFile"
bind:longpress="handlePreviewName"
data-item="{{item}}"
>
<view class="wrap">
<image class="icon" src="{{imageUrl}}icon-file{{item.fileType}}.png?t={{Timestamp}}"></image>
<view class="name">{{item.name}}</view>
<view class="preview">预览</view>
</view>
</view>
</view>
</view>
</view>
</view>
<view class="feedback-card" wx:for="{{detail.feedbackList}}" wx:key="index">
<view class="li-options" wx:if="{{item.isSelf===1}}">
<image
wx:if="{{item.isSelf===1}}"
class="quality"
src="{{imageUrl}}self.png?t={{Timestamp}}"
mode="scaleToFill"
></image>
</view>
<view class="li-row li-row-first">
<view class="label">反馈时间</view>
<view class="content">{{item.createTime}}</view>
<view class="fold" bind:tap="handleFeedBackFold" data-index="{{index}}">
{{item.fold ? '展开' : '收起'}}
<image class="icon" src="{{imageUrl}}fold-{{item.fold ? 'down' :'top'}}.png?t={{Timestamp}}"></image>
</view>
</view>
<view class="user">
<doctorAvatar
class="avatar"
src="{{item.createDoctorInfo.doctorImg}}"
level="{{item.createDoctorInfo.doctorLevel}}"
did="{{item.createDoctorInfo.doctorId}}"
></doctorAvatar>
<view class="wrap">
<view class="w-header">
<view class="name">{{item.createDoctorInfo.doctorName}}</view>
<view class="desc">
{{item.createDoctorInfo.doctorTitleName || item.createDoctorInfo.doctorOtherTitle}}
</view>
</view>
<view class="w-footer">
<view class="hostipal">{{item.createDoctorInfo.hospitalName}}</view>
<view class="tag">
{{item.createDoctorInfo.hospitalClassificationName}}{{item.createDoctorInfo.hospitalLevelName}}
</view>
<view class="site" wx:if="{{item.createDoctorInfo.cityName}}">
{{item.createDoctorInfo.cityName}}{{item.createDoctorInfo.countyName?'/':''}}{{item.createDoctorInfo.countyName}}
</view>
<view class="specialty" wx:if="{{item.createDoctorInfo.doctorSpecialty.length}}">
<image class="wf-label" src="{{imageUrl}}text-specialty.png?t={{Timestamp}}" mode="aspectFit"></image>
<view
class="wf-tag"
wx:for="{{item.createDoctorInfo.doctorSpecialty}}"
wx:for-item="spec"
wx:key="SpecialtyId"
>
{{spec.SpecialtyName}}
</view>
</view>
</view>
</view>
</view>
<view class="cases {{item.fold && 'fold'}}">
<view class="remark" wx:if="{{item.info}}">
<view class="r-title">对病历的标注</view>
<view class="r-content">{{item.info}}</view>
</view>
<view class="audio-list" wx:if="{{item.feedbackAudios.length}}">
<view class="audio-row" wx:for="{{item.feedbackAudios}}" wx:key="url" wx:for-item="aItem">
<customAudioBar class="audio-bar" url="{{aItem.url}}" time="{{aItem.duration}}"></customAudioBar>
<view class="options">
<customAudioText class="trans" url="{{aItem.url}}" map1="BTN_CASEDETAILVOICETOTEXT">
转文字
</customAudioText>
</view>
</view>
</view>
<view class="photos" wx:if="{{item.feedbackImages.length}}">
<image
class="photo"
src="{{cItem.url}}"
mode="aspectFill"
bind:tap="handleImagePreview"
data-url="{{cItem.url}}"
data-parent="{{item.feedbackImages}}"
wx:for="{{item.feedbackImages}}"
wx:for-item="cItem"
wx:key="url"
></image>
</view>
<view class="files" wx:if="{{item.feedbackFiles.length}}">
<view class="f-title">补充文件</view>
<view class="file-list">
<view
class="fl-row"
wx:for="{{item.feedbackFiles}}"
wx:for-item="cItem"
wx:key="url"
bind:tap="handlePreviewFile"
bind:longpress="handlePreviewName"
data-item="{{cItem}}"
>
<view class="wrap">
<image class="icon" src="{{imageUrl}}icon-file{{cItem.fileType}}.png?t={{Timestamp}}"></image>
<view class="name">{{cItem.name}}</view>
<view class="preview">预览</view>
</view>
</view>
</view>
</view>
</view>
</view>
<view class="doctor-card" wx:if="{{dealInfo.createTime}}" wx:key="index">
<view class="dc-header">
<view class="status">已提交给</view>
<view class="date">提交时间:{{dealInfo.createTime}}</view>
</view>
<view class="doctor">
<doctorAvatar
class="avatar"
src="{{dealDoctorInfo.doctorImg}}"
level="{{dealDoctorInfo.doctorLevel}}"
did="{{dealDoctorInfo.doctorId}}"
></doctorAvatar>
<view class="wrap">
<view class="w-header">
<view class="name">{{dealDoctorInfo.doctorName}}</view>
<view class="label">{{dealDoctorInfo.doctorTitleName || dealDoctorInfo.doctorOtherTitle}}</view>
<block wx:for="{{dealDoctorInfo.doctorDept}}" wx:key="DepartmentId">
<view class="line"></view>
<view class="label">{{item.DepartmentName}}</view>
</block>
</view>
<view class="w-container">
<text class="hostipal">{{dealDoctorInfo.hospitalName}}</text>
<view class="tag">{{dealDoctorInfo.hospitalClassificationName}}{{dealDoctorInfo.hospitalLevelName}}</view>
<view class="site" wx:if="{{dealDoctorInfo.cityName}}">
{{dealDoctorInfo.cityName}}{{dealDoctorInfo.countyName?'/':''}}{{dealDoctorInfo.countyName}}
</view>
</view>
<view class="w-footer" wx:if="{{dealDoctorInfo.doctorSpecialty.length}}">
<image class="wf-label" src="{{imageUrl}}text-specialty.png?t={{Timestamp}}" mode="aspectFit"></image>
<view class="wf-tag" wx:for="{{dealDoctorInfo.doctorSpecialty}}" wx:key="SpecialtyId">
{{item.SpecialtyName}}
</view>
</view>
</view>
</view>
</view>
</view>
</view>
</van-popup>

5
src/module1/pages/help/index.json

@ -0,0 +1,5 @@ @@ -0,0 +1,5 @@
{
"navigationBarTitleText": "帮助中心",
"navigationStyle": "default",
"usingComponents": {}
}

92
src/module1/pages/help/index.scss

@ -0,0 +1,92 @@ @@ -0,0 +1,92 @@
page {
background-color: #f1feff;
}
.page {
padding: 500rpx 0 80rpx;
.module {
.m-title {
margin: 34rpx auto 0;
display: block;
width: 670rpx;
max-height: 150rpx;
}
.m1-contaienr1 {
margin: 32rpx 32rpx 0;
width: 686rpx;
height: 546rpx;
}
.m-card {
margin: 26rpx 32rpx 0;
background-color: #fff;
border-radius: 24rpx;
.c-title {
padding: 32rpx 32rpx 16rpx 0;
font-size: 36rpx;
color: #141515;
font-weight: bold;
line-height: 56rpx;
&::before {
content: '';
margin-right: 20rpx;
display: inline-block;
width: 12rpx;
height: 40rpx;
background-color: #00b4c5;
vertical-align: -4rpx;
}
}
.c-title-line {
margin: 0 32rpx;
border-top: 1px dashed #00b4c5;
}
.c-container {
padding: 36rpx 32rpx 44rpx;
.list {
.row {
display: flex;
gap: 16rpx;
.order {
margin-top: 10rpx;
flex-shrink: 0;
width: 40rpx;
height: 40rpx;
text-align: center;
line-height: 40rpx;
font-size: 32rpx;
color: #fff;
background: #00b4c5;
border-radius: 50%;
}
.content {
line-height: 56rpx;
font-size: 32rpx;
color: #4f5050;
}
}
}
.photo {
margin-top: 32rpx;
width: 622rpx;
}
.mt24 {
margin-top: 24rpx;
}
.mt32 {
margin-top: 32rpx;
}
.ml56 {
margin-left: 56rpx;
}
.step {
font-size: 28rpx;
color: #4f5050;
line-height: 56rpx;
.emphasis {
color: #00b4c5;
font-weight: bold;
}
}
}
}
}
}

8
src/module1/pages/help/index.ts

@ -0,0 +1,8 @@ @@ -0,0 +1,8 @@
const _app = getApp<IAppOption>();
Page({
data: {},
onLoad() {},
});
export {}

312
src/module1/pages/help/index.wxml

@ -0,0 +1,312 @@ @@ -0,0 +1,312 @@
<view class="page" style="background: url('/images/help/bg.png') no-repeat top center/100% 642rpx">
<view class="module">
<image class="m-title" mode="widthFix" src="/images/help/m1-title1.png"></image>
<image class="m1-contaienr1" mode="widthFix" src="/images/help/m1-container1.png"></image>
</view>
<view class="module">
<image class="m-title" mode="widthFix" src="/images/help/m2-title1.png"></image>
<view class="m-card">
<view class="c-title">1. 一级医生如何入驻平台</view>
<view class="c-title-line"></view>
<view class="c-container">
<view class="list">
<view class="row">
<view class="order">1</view>
<view class="content">扫描核心医生专属邀约码进入医生端登录页</view>
</view>
<view class="row">
<view class="order">2</view>
<view class="content">登录成功,进入医生认证页后,提交认证信息,等待核心医生审核</view>
</view>
<view class="row">
<view class="order">3</view>
<view class="content">核心医生核通过后,一级医生即可顺利进入小程序首页</view>
</view>
<image class="photo" mode="widthFix" src="/images/help/m2-card1-row3-photo1.png"></image>
</view>
</view>
</view>
<view class="m-card">
<view class="c-title">2. 核心医生如何入驻平台</view>
<view class="c-title-line"></view>
<view class="c-container">
<view class="list">
<view class="row">
<view class="order">1</view>
<view class="content">医生提供手机号,由系统工作人员录入白名单</view>
</view>
<view class="row">
<view class="order">2</view>
<view class="content">已录入系统白名单的医生扫描专属医生小程序码,进入医生端登录页</view>
</view>
<view class="row">
<view class="order">3</view>
<view class="content">输入白名单的手机号和验证码即可识别成功即可顺利进入平台;</view>
</view>
</view>
</view>
</view>
<view class="m-card">
<view class="c-title">3. 质控医生如何入驻平台</view>
<view class="c-title-line"></view>
<view class="c-container">
<view class="list">
<view class="row">
<view class="order">1</view>
<view class="content">医生提供手机号,由系统工作人员录入白名单</view>
</view>
<view class="row">
<view class="order">2</view>
<view class="content">已录入系统白名单的医生扫描专属医生小程序码,进入医生端登录页</view>
</view>
<view class="row">
<view class="order">3</view>
<view class="content">输入白名单的手机号和验证码即可识别成功即可顺利进入平台;</view>
</view>
</view>
</view>
</view>
<view class="m-card">
<view class="c-title">4. 超级医生如何入驻平台</view>
<view class="c-title-line"></view>
<view class="c-container">
<view class="list">
<view class="row">
<view class="order">1</view>
<view class="content">医生提供手机号,由系统工作人员录入白名单</view>
</view>
<view class="row">
<view class="order">2</view>
<view class="content">已录入系统白名单的医生扫描专属医生小程序码,进入医生端登录页</view>
</view>
<view class="row">
<view class="order">3</view>
<view class="content">输入白名单的手机号和验证码即可识别成功即可顺利进入平台</view>
</view>
</view>
</view>
</view>
</view>
<view class="module">
<image class="m-title" mode="widthFix" src="/images/help/m3-title1.png"></image>
<view class="m-card">
<view class="c-title">1. 一级医生录入病历的完整流程</view>
<view class="c-title-line"></view>
<view class="c-container">
<view class="step">
<text class="emphasis">入口</text>
:首页 - 点击下方“+”按钮 - 录入病历
</view>
<image class="photo" mode="widthFix" src="/images/help/m3-card1-step1-photo1.png"></image>
<view class="step mt32">
<view>
<text class="emphasis">操作流程:</text>
</view>
<view>
<text class="emphasis">(1)</text>
点击 ”+” 按钮,进入录入病历页
</view>
<view>
<text class="emphasis">(2)</text>
上传病历图片、病历相关文件、病历语音、
</view>
</view>
<view class="step mt32">
<view>
<text class="emphasis">关键说明:</text>
</view>
<view>上传病历图片时,需进行图片模糊操作,防止病人隐私泄露</view>
</view>
<image class="photo" mode="widthFix" src="/images/help/m3-card1-step3-photo1.png"></image>
</view>
</view>
<view class="m-card">
<view class="c-title">2. 选择合作的核心医生提交病历</view>
<view class="c-title-line"></view>
<view class="c-container">
<view class="step">
<text class="emphasis">入口</text>
:录入病例页 - 点击下方“保存并提交”按钮 - 邀请合作医生提交病例
</view>
<image class="photo" mode="widthFix" src="/images/help/m3-card2-step1-photo1.png"></image>
<view class="step mt32">
<view>
<text class="emphasis">操作流程:</text>
</view>
<view>
<text class="emphasis">(1)</text>
点击 ”保存并提交” 按钮,进入邀请合作医生页
</view>
<view>
<text class="emphasis">(2)</text>
选择合作的核心医生,点击 ”确认提交” 按钮,即可将病历提交给核心医生
</view>
</view>
</view>
</view>
<view class="m-card">
<view class="c-title">3. 核心医生收到病例通知并处理</view>
<view class="c-title-line"></view>
<view class="c-container">
<view class="list">
<view class="row">
<view class="order">1</view>
<view class="content">
病历提交给核心医生后,核心医生收到push通知,点击通知或点击首页待处理病历进入病历列表查看病历,可对病历进行操作
</view>
</view>
<image class="photo" mode="widthFix" src="/images/help/m3-card3-row1-photo1.png"></image>
<view class="row mt32">
<view class="order">2</view>
<view class="content">登录成功,进入医生认证页后,提交认证信息,等待核心医生审核</view>
</view>
<image class="photo" mode="widthFix" src="/images/help/m3-card3-row2-photo1.png"></image>
<view class="step">
<text class="emphasis">病历反馈成功</text>
:质控医生收到push,可查看信息,对病历进行处理
</view>
<image class="photo" mode="widthFix" src="/images/help/m3-card3-row2-photo2.png"></image>
<view class="step">
<text class="emphasis">病历被驳回</text>
:一级医生收到push,可查看驳回原因,对病历进行修改后,重新选择核心医生进行病历提交;点击病历左下方”更多操作”可进行删除或重新编辑
</view>
<image class="photo" mode="widthFix" src="/images/help/m3-card3-row2-photo3.png"></image>
<view class="row mt32">
<view class="order">3</view>
<view class="content">核心医生反馈成功的病例,病历状态会更新为讨论中,后续可以对该病历持续讨论</view>
</view>
</view>
</view>
</view>
<view class="m-card">
<view class="c-title">4. 质控医生收到病例通知并处理</view>
<view class="c-title-line"></view>
<view class="c-container">
<view class="list">
<view class="row">
<view class="order">1</view>
<view class="content">
病历提交给质控医生后,质控医生收到push通知,点击通知或点击首页待处理病历进入病历列表查看病历,可对病历进行操作
</view>
</view>
<view class="row">
<view class="order">2</view>
<view class="content">质控医生可对病历进行反馈或驳回</view>
</view>
<view class="step ml56 mt24">
<text class="emphasis">病历反馈成功</text>
核心医生和一级医生收到push,可查看信息
</view>
<view class="step ml56">
<text class="emphasis">病历被驳回</text>
核心医生收到push,查看驳回原因后,会选择对病历反馈新内容,还是重新选择质控医生进行提交病历
</view>
<image class="photo" mode="widthFix" src="/images/help/m3-card4-row2-photo1.png"></image>
<view class="row mt32">
<view class="order">3</view>
<view class="content">
质控医生反馈成功的病例,后续可以对该病历持续讨论,并提供更多操作功能包括:归档或公开。归档后病历完成的标志,归档病历不再支持做更多反馈,病历标记为公开后,本科室的医生均可在病历列表顶部”公开”类内进行查看。
</view>
</view>
</view>
</view>
</view>
</view>
<view class="module">
<image class="m-title" mode="widthFix" src="/images/help/m4-title1.png"></image>
<view class="m-card">
<view class="c-title">1. 如何创建聊天室</view>
<view class="c-title-line"></view>
<view class="c-container">
<view class="step">
<text class="emphasis">入口</text>
:讨论中的病历详情 - 点击左下方创建学习窗
</view>
<image class="photo" mode="widthFix" src="/images/help/m4-card1-step1-photo1.png"></image>
<view class="step mt32">
<view>
<text class="emphasis">操作流程:</text>
</view>
<view>点击 ”创建学习窗” 按钮,即可成功创建学习窗</view>
</view>
<view class="step mt32">
<view>
<text class="emphasis">关键说明:</text>
</view>
<view>
<text class="emphasis">(1)</text>
参与病历讨论的核心医生和质控医生可进行创建学习窗操作
</view>
<view>
<text class="emphasis">(2)</text>
病例有初次反馈后才可以创建学习窗;
</view>
</view>
</view>
</view>
<view class="m-card">
<view class="c-title">2. 聊天室内的功能内容</view>
<view class="c-title-line"></view>
<view class="c-container">
<view class="step">
<text class="emphasis">入口</text>
:学习窗列表 - 学习窗详情
</view>
<view class="step mt32">
<view>
<text class="emphasis">关键说明:</text>
</view>
<view>
<text class="emphasis">(1)</text>
学习窗内,可发送文字、语音、照片、视频
</view>
<view>
<text class="emphasis">(2)</text>
学习窗内的内容可撤回;
</view>
</view>
</view>
</view>
<view class="m-card">
<view class="c-title">3. 如何邀约更多医生进入</view>
<view class="c-title-line"></view>
<view class="c-container">
<view class="step">
<text class="emphasis">入口</text>
:学习窗详情 - 点击“+”按钮 - 选择医生进行邀约
</view>
<image class="photo" mode="widthFix" src="/images/help/m4-card3-step1-photo1.png"></image>
<view class="step mt32">
<view>
<text class="emphasis">关键说明:</text>
</view>
<view>
<text class="emphasis">(1)</text>
参与病历讨论的核心医生和质控医生可进行创建学习窗操作
</view>
<view>
<text class="emphasis">(2)</text>
无质控医生参与反馈的病例,核心医生可创建学习窗,如病历有质控医生参与反馈,则只有质控医生可创建学习窗
</view>
</view>
</view>
</view>
<view class="m-card">
<view class="c-title">4. 质控医生收到病例通知并处理</view>
<view class="c-title-line"></view>
<view class="c-container">
<view class="step">
<text class="emphasis">入口</text>
:学习窗详情 - 点击右上方“详情” - 查看病历详情
</view>
<image class="photo" mode="widthFix" src="/images/help/m4-card4-step1-photo1.png"></image>
<view class="step mt32">
<view>
<text class="emphasis">关键说明:</text>
</view>
<view>学习窗内可查看病历详情,以帮助医生在讨论病历时,可随时查看病历相关内容</view>
</view>
</view>
</view>
</view>
</view>

6
src/pages/my/index.ts

@ -63,9 +63,11 @@ Page({ @@ -63,9 +63,11 @@ Page({
url: "/module1/pages/invite/index",
});
},
handleBZSC() {
handleHelp() {
app.mpBehavior({ PageName: "BTN_MYHELPMANUAL" });
wx.navigateTo({
url: "/module1/pages/help/index",
});
},
});

7
src/pages/my/index.wxml

@ -57,6 +57,13 @@ @@ -57,6 +57,13 @@
</view>
<van-icon class="more" name="arrow" />
</view>
<!-- <view class="list-item" bind:tap="handleHelp"> -->
<!-- <view class="label"> -->
<!-- <image class="icon" src="{{imageUrl}}my-list-icon4.png?t={{Timestamp}}"></image> -->
<!-- 帮助中心 -->
<!-- </view> -->
<!-- <van-icon class="more" name="arrow" /> -->
<!-- </view> -->
<!-- <view class="list-item">
<view class="label">
<image class="icon" src="{{imageUrl}}my-list-icon3.png?t={{Timestamp}}"></image>

1
src/sdk/Easemob-chat-4.7.0.js

File diff suppressed because one or more lines are too long

2
src/utils/webIM/WebIM.js

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
import websdk from "@/sdk/Easemob-chat-4.3.1";
import websdk from "@/sdk/Easemob-chat-4.7.0.js";
import config from "./WebIMConfig";
console.group = console.group || {};

Loading…
Cancel
Save