Browse Source

病历联调

main
kola 4 months ago
parent
commit
0c84707e31
  1. 1
      src/app.json
  2. 2
      src/components/customRecord/index.ts
  3. 6
      src/components/uploadFile/index.ts
  4. 154
      src/module1/pages/casesDetail/index.scss
  5. 198
      src/module1/pages/casesDetail/index.ts
  6. 196
      src/module1/pages/casesDetail/index.wxml
  7. 8
      src/module1/pages/casesFeedback/index.json
  8. 279
      src/module1/pages/casesFeedback/index.scss
  9. 198
      src/module1/pages/casesFeedback/index.ts
  10. 99
      src/module1/pages/casesFeedback/index.wxml
  11. 6
      src/module1/pages/entryCases/index.json
  12. 3
      src/module1/pages/entryCases/index.scss
  13. 165
      src/module1/pages/entryCases/index.ts
  14. 31
      src/module1/pages/entryCases/index.wxml
  15. 24
      src/module1/pages/entryCasesResult/index.ts
  16. 11
      src/module1/pages/entryCasesResult/index.wxml
  17. 20
      src/module1/pages/sHostipal/index.ts
  18. 11
      src/module1/pages/setCaseDoctor/index.json
  19. 192
      src/module1/pages/setCaseDoctor/index.scss
  20. 252
      src/module1/pages/setCaseDoctor/index.ts
  21. 92
      src/module1/pages/setCaseDoctor/index.wxml
  22. 1
      src/module1/pages/setDoctor/index.scss
  23. 2
      src/module1/pages/userInfo/index.wxml
  24. 13
      src/pages/cases/index.ts
  25. 10
      src/pages/cases/index.wxml

1
src/app.json

@ -26,6 +26,7 @@ @@ -26,6 +26,7 @@
"pages/org3/index",
"pages/org4/index",
"pages/entryCases/index",
"pages/setCaseDoctor/index",
"pages/entryCasesResult/index",
"pages/casesDetail/index",
"pages/casesFeedback/index",

2
src/components/customRecord/index.ts

@ -146,7 +146,7 @@ Component({ @@ -146,7 +146,7 @@ Component({
const data = JSON.parse(res.data);
const expandJson = {
fileId: "",
name: data.data.Url,
name: "文件",
size: (item.size / 1024).toFixed(2),
fileUrl: data.data.Url,
suffix: this.GetExtensionFileName(data.data.Url),

6
src/components/uploadFile/index.ts

@ -148,7 +148,7 @@ Component({ @@ -148,7 +148,7 @@ Component({
const suffix = this.GetExtensionFileName(data.data.Url);
const expandJson = {
fileId: "",
name: data.data.Url,
name: "文件",
size: (item.size / 1024).toFixed(2),
fileUrl: data.data.Url,
suffix: this.GetExtensionFileName(data.data.Url),
@ -156,15 +156,15 @@ Component({ @@ -156,15 +156,15 @@ Component({
imgUrl: "",
duration: 0,
fileType: this.data.fileTypeList[suffix] || 99,
videoUrl: "",
};
if (item.fileType === "image") {
expandJson.imgUrl = data.data.Url;
} else if (item.fileType === "video") {
expandJson.imgUrl = data.data.SnapshotUrl;
expandJson.videoUrl = data.data.SnapshotUrl;
} else if (item.fileType === "audio") {
expandJson.duration = Number.parseInt(String(item.duration / 1000));
}
console.log(expandJson);
resolve(expandJson);
},
fail() {

154
src/module1/pages/casesDetail/index.scss

@ -2,7 +2,7 @@ page { @@ -2,7 +2,7 @@ page {
background-color: #f6f6f6;
}
.page {
padding: 24rpx 24rpx 240rpx;
padding: 24rpx 24rpx 340rpx;
.detail-card {
padding-bottom: 16rpx;
position: relative;
@ -28,7 +28,7 @@ page { @@ -28,7 +28,7 @@ page {
justify-content: space-between;
&::before {
flex-shrink: 0;
content: '';
content: "";
width: 10rpx;
height: 40rpx;
background: #00b4c5;
@ -142,7 +142,7 @@ page { @@ -142,7 +142,7 @@ page {
}
}
.w-footer {
margin-top: 24rpx;
margin-top: 12rpx;
.hostipal {
margin-right: 12rpx;
display: inline;
@ -177,6 +177,7 @@ page { @@ -177,6 +177,7 @@ page {
border-radius: 16rpx;
.tags {
display: flex;
margin-bottom: 32rpx;
.t-label {
width: 3em;
font-size: 28rpx;
@ -198,7 +199,6 @@ page { @@ -198,7 +199,6 @@ page {
}
}
.photos {
margin-top: 32rpx;
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 12rpx;
@ -209,7 +209,6 @@ page { @@ -209,7 +209,6 @@ page {
}
}
.remark {
margin-top: 32rpx;
.r-title {
font-size: 32rpx;
color: rgba(20, 21, 21, 1);
@ -227,7 +226,6 @@ page { @@ -227,7 +226,6 @@ page {
}
}
.audio-list {
margin-top: 32rpx;
.audio-row {
display: flex;
gap: 28rpx;
@ -254,7 +252,6 @@ page { @@ -254,7 +252,6 @@ page {
}
}
.files {
margin-top: 32rpx;
.f-title {
font-size: 32rpx;
color: #000;
@ -297,6 +294,9 @@ page { @@ -297,6 +294,9 @@ page {
}
}
}
> view:not(:last-of-type) {
margin-bottom: 32rpx;
}
}
}
.feedback-card {
@ -407,7 +407,7 @@ page { @@ -407,7 +407,7 @@ page {
}
}
.w-footer {
margin-top: 24rpx;
margin-top: 12rpx;
.hostipal {
margin-right: 12rpx;
display: inline;
@ -691,6 +691,7 @@ page { @@ -691,6 +691,7 @@ page {
align-items: center;
gap: 52rpx;
.w-item {
position: relative;
text-align: center;
.icon {
width: 48rpx;
@ -700,6 +701,45 @@ page { @@ -700,6 +701,45 @@ page {
font-size: 24rpx;
color: rgba(153, 153, 153, 1);
}
.tip {
position: absolute;
top: -25rpx;
transform: translateY(-100%);
left: 0;
border-radius: 12rpx;
width: 686rpx;
box-sizing: border-box;
padding: 18rpx 24rpx;
background-color: rgba(255, 247, 232, 1);
.t-header {
display: flex;
align-items: center;
justify-content: space-between;
gap: 20rpx;
font-size: 28rpx;
color: rgba(255, 125, 0, 1);
.date {
flex-shrink: 0;
}
}
.content {
margin-top: 12rpx;
font-size: 28rpx;
color: rgba(255, 125, 0, 1);
text-align: left;
}
&::after {
position: absolute;
bottom: -12rpx;
left: 20rpx;
content: "";
width: 0;
height: 0;
border-style: solid;
border-width: 27rpx 27rpx 0 27rpx;
border-color: rgba(255, 247, 232, 1) transparent transparent transparent;
}
}
}
}
.btn-wrap {
@ -745,43 +785,6 @@ page { @@ -745,43 +785,6 @@ page {
justify-content: space-between;
align-items: center;
gap: 24rpx;
.tip {
position: absolute;
top: -150rpx;
left: 0;
border-radius: 12rpx;
width: 686rpx;
box-sizing: border-box;
padding: 18rpx 24rpx;
background-color: rgba(255, 247, 232, 1);
.t-header {
display: flex;
align-items: center;
justify-content: space-between;
gap: 20rpx;
font-size: 28rpx;
color: rgba(255, 125, 0, 1);
.date {
flex-shrink: 0;
}
}
.content {
margin-top: 12rpx;
font-size: 28rpx;
color: rgba(255, 125, 0, 1);
}
&::after {
position: absolute;
bottom: -12rpx;
left: 178rpx;
content: '';
width: 0;
height: 0;
border-style: solid;
border-width: 27rpx 27rpx 0 27rpx;
border-color: rgba(255, 247, 232, 1) transparent transparent transparent;
}
}
.cancel {
width: 332rpx;
height: 84rpx;
@ -1001,7 +1004,7 @@ page { @@ -1001,7 +1004,7 @@ page {
border-radius: 60rpx 60rpx 60rpx 60rpx;
border: 1px solid #01b4c5;
}
.btn3{
.btn3 {
margin-top: 22rpx;
text-align: center;
padding: 22rpx;
@ -1009,3 +1012,62 @@ page { @@ -1009,3 +1012,62 @@ page {
color: rgba(0, 180, 197, 1);
}
}
.dialog7 {
position: relative;
padding: 32rpx 32rpx;
.close {
position: absolute;
top: 32rpx;
right: 32rpx;
font-size: 40rpx;
color: #000;
}
.title {
font-size: 36rpx;
color: rgba(20, 21, 21, 1);
font-weight: bold;
text-align: center;
}
.sub-title {
padding: 32rpx 0 16rpx;
font-size: 32rpx;
color: #141515;
}
.tags {
display: flex;
flex-wrap: wrap;
gap: 20rpx;
.tag {
padding: 6rpx 44rpx;
font-size: 32rpx;
color: rgba(133, 133, 133, 1);
line-height: 44rpx;
background-color: #fff;
border: 1px solid #f6f6f6;
border-radius: 8rpx;
background: #f6f6f6;
&.active {
background-color: #fff;
border-color: rgba(1, 180, 197, 1);
color: rgba(1, 180, 197, 1);
}
}
&.tags1 {
.tag {
border-radius: 90rpx;
}
}
}
.submit {
margin-top: 32rpx;
padding: 22rpx;
text-align: center;
font-size: 32rpx;
color: rgba(255, 255, 255, 1);
line-height: 44rpx;
background: linear-gradient(90deg, #00b4c5 0%, #54e2b4 100%);
border-radius: 84rpx;
font-weight: bold;
}
}

198
src/module1/pages/casesDetail/index.ts

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
const _app = getApp<IAppOption>()
const app = getApp<IAppOption>();
Page({
data: {
@ -8,6 +8,198 @@ Page({ @@ -8,6 +8,198 @@ Page({
show4: false, // 取消优质病例
show5: false, // 取消归档
show6: false, // 创建聊天室
show7: false, // 更改标签
showRejectReason: false,
deptList: [] as any,
labelList: [] as any,
deptId: "",
labelIds: [] as any,
id: "",
auth: {},
userInfo: {},
dealDoctorInfo: {},
dealInfo: {},
detail: {
dealCaseInfo: {
dealDoctorInfo: {},
dealInfo: {},
},
createDoctorInfo: {},
caseLabels: {},
caseImages: {},
caseAudios: {},
caseFiles: {},
feedbackList: [],
},
rejectReason: {},
},
onLoad(options) {
this.setData({
id: options.id,
});
app.waitLogin().then(() => {
this.handleResoure();
this.getDoctorDict();
app.getUserInfo(this);
});
},
handleResoure() {
this.getDetail();
this.getAuth();
},
getDetail() {
wx.ajax({
method: "GET",
url: "?r=takeda/case/get-case-detail",
data: {
caseId: this.data.id,
},
}).then((res) => {
this.setData({
detail: res,
dealDoctorInfo: res.dealCaseInfo.dealDoctorInfo,
dealInfo: res.dealCaseInfo.dealInfo,
});
});
},
getAuth() {
wx.ajax({
method: "GET",
url: "?r=takeda/case/get-case-detail-op-auth",
data: { caseId: this.data.id },
}).then((res) => {
this.setData({
auth: res,
});
if (res.canViewRejectReason) {
this.getRejectReason();
}
});
},
onClose() {
this.setData({
show1: false,
show2: false,
show3: false,
show4: false,
show5: false,
show6: false,
show7: false,
});
},
handleImagePreview(e) {
const { url } = e.currentTarget.dataset;
wx.previewImage({
urls: [url],
});
},
getRejectReason() {
wx.ajax({
method: "GET",
url: "?r=takeda/case/view-reject-reason",
data: {
caseId: this.data.id,
},
}).then((res) => {
this.setData({
rejectReason: res,
});
});
},
onLoad() {},
})
handleShowRejectReason() {
this.setData({
showRejectReason: !this.data.showRejectReason,
});
},
handleShowLable() {
this.setData({
show7: true,
});
},
getDoctorDict() {
wx.ajax({
method: "GET",
url: "?r=takeda/reg/doctor-dict",
data: {},
}).then((res) => {
this.setData({
deptList: res.DoctorSpecialtyLabel,
});
});
},
handleDept(e) {
const { params } = e.currentTarget.dataset;
this.setData({
deptId: params.value,
labelList: params.options,
labelIds: [],
});
},
handleLabel(e) {
const { params } = e.currentTarget.dataset;
const labelIds = this.data.labelIds;
const newLabelId = labelIds.includes(params.value)
? labelIds.filter((item: any) => item !== params.value)
: [...labelIds, ...params.value];
this.setData({
labelIds: newLabelId,
});
},
handleLableSubmit() {
const { id, deptId, labelIds } = this.data;
if (!deptId) {
wx.showToast({
title: "请选择科室",
icon: "none",
});
return;
}
if (!labelIds.length) {
wx.showToast({
title: "请选择标签",
icon: "none",
});
return;
}
wx.ajax({
method: "POST",
url: "?r=takeda/case/save-case-label",
data: {
caseId: id,
deptId,
labelIds: JSON.stringify(labelIds),
},
}).then(() => {
this.setData({
show7: false,
});
this.handleResoure();
});
},
handleInvite() {
wx.navigateTo({
url: `/module1/pages/setCaseDoctor/index`,
success: (res) => {
res.eventChannel.emit("acceptDataFromOpenerPage", {
caseId: this.data.id,
detailInvite: true,
});
},
});
},
handleFeedBack() {
wx.navigateTo({
url: `/module1/pages/casesFeedback/index?id=${this.data.id}`,
});
},
});
export {};

196
src/module1/pages/casesDetail/index.wxml

@ -1,9 +1,14 @@ @@ -1,9 +1,14 @@
<wxs src="/utils/util.wxs" module="tools" />
<view class="page">
<view class="detail-card">
<view class="li-header">
<view class="wrap">
<view class="id">ID:2024020913049204001</view>
<view class="status status2">新病历</view>
<view class="id">ID:{{detail.caseId}}</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 status1" wx:elif="{{detail.caseStatus==='4'}}">{{detail.caseStatusName}}</view>
<view class="status status3" wx:if="{{detail.isOpen==='1'}}">已公开</view>
</view>
<view class="fold">
收起
@ -12,64 +17,68 @@ @@ -12,64 +17,68 @@
</view>
<view class="li-row">
<view class="label">提交时间</view>
<view class="content">2024-02-09 12:04:23</view>
<view class="content">{{detail.createTime}}</view>
</view>
<view class="user">
<doctorAvatar
class="avatar"
src="https://pic1.zhimg.com/50/v2-dcfbab1219ae4f7a7a6db168bb1580a2_720w.jpg?source=2c26e567"
level="{{1}}"
src="{{detail.createDoctorInfo.doctorImg}}"
level="{{detail.createDoctorInfo.doctorLevel}}"
></doctorAvatar>
<view class="wrap">
<view class="w-header">
<view class="name">徐萌</view>
<view class="desc">主治医师</view>
<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">北京天坛医院</view>
<view class="tag">三甲</view>
<view class="site">广州市/番禺区</view>
<view class="hostipal">{{detail.createDoctorInfo.hospitalName}}</view>
<view class="tag">
{{detail.createDoctorInfo.hospitalClassificationName}}{{detail.createDoctorInfo.hospitalLevelName}}
</view>
<view class="site">{{detail.createDoctorInfo.cityName}}/{{detail.createDoctorInfo.countyName}}</view>
</view>
</view>
</view>
<view class="cases">
<view class="tags">
<view class="tags" wx:if="{{detail.caseLabels.length}}">
<view class="t-label">标签</view>
<view class="wrap">
<view class="tag">心律失常</view>
<view class="tag">心衰</view>
<view class="tag" wx:for="{{detail.caseLabels}}" wx:key="labelId">{{item.labelName}}</view>
</view>
<view wx:if="{{auth.canEditLabel}}" bind:tap="handleShowLable">编辑标签</view>
</view>
<view class="photos">
<image
class="photo"
src="https://pic1.zhimg.com/50/v2-dcfbab1219ae4f7a7a6db168bb1580a2_720w.jpg?source=2c26e567"
src="{{item.url}}"
mode="aspectFill"
bind:tap="handleImagePreview"
data-url="https://pic1.zhimg.com/50/v2-dcfbab1219ae4f7a7a6db168bb1580a2_720w.jpg?source=2c26e567"
data-url="{{item.url}}"
wx:for="{{detail.caseImages}}"
wx:key="url"
></image>
</view>
<view class="remark">
<view class="remark" wx:if="{{detail.description}}">
<view class="r-title">病历备注</view>
<view class="r-content">
此患者已经做了基因检测,根据基因检测的流程判断已排除,但是其他的检测档案指向性较强,请帮忙判断
</view>
<view class="r-content">{{detail.description}}</view>
</view>
<view class="audio-list">
<view class="audio-row">
<customAudioBar class="audio-bar"></customAudioBar>
<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">
<view class="trans">转文字</view>
</view>
</view>
</view>
<view class="files">
<view class="files" wx:if="{{detail.caseFiles.length}}">
<view class="f-title">病历相关文件</view>
<view class="file-list">
<view class="fl-row">
<view class="fl-row" wx:for="{{detail.caseFiles}}" wx:key="url">
<view class="wrap">
<image class="icon" src="{{imageUrl}}icon-file.png?t={{Timestamp}}"></image>
<view class="name">基因检测报告.pdf</view>
<view class="name">{{item.name}}</view>
</view>
<view class="option">
<image class="icon" src="{{imageUrl}}icon-eye.png?t={{Timestamp}}"></image>
@ -80,7 +89,7 @@ @@ -80,7 +89,7 @@
</view>
</view>
</view>
<view class="feedback-card">
<view class="feedback-card" wx:for="{{detail.feedbackList}}" wx:key="index">
<view class="li-options">
<image class="quality" src="{{imageUrl}}new.png?t={{Timestamp}}" mode="scaleToFill"></image>
<image class="gather" src="{{imageUrl}}icon-gather.png?t={{Timestamp}}"></image>
@ -159,94 +168,94 @@ @@ -159,94 +168,94 @@
</view>
</view>
</view>
<view class="doctor-card">
<view class="doctor-card" wx:if="{{dealInfo.createTime}}" wx:key="index">
<view class="dc-header">
<view class="status">已提交给</view>
<view class="date">提交时间:2024-10-01 12:34:34</view>
<view class="date">提交时间:{{dealInfo.createTime}}</view>
</view>
<view class="doctor">
<doctorAvatar
class="avatar"
src="https://pic1.zhimg.com/50/v2-dcfbab1219ae4f7a7a6db168bb1580a2_720w.jpg?source=2c26e567"
level="{{1}}"
src="{{dealDoctorInfo.doctorImg}}"
level="{{dealDoctorInfo.doctorLevel}}"
></doctorAvatar>
<view class="wrap">
<view class="w-header">
<view class="name">徐萌</view>
<view class="label">主任医师</view>
<view class="line"></view>
<view class="label">心内科</view>
<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">北京天坛医院</text>
<view class="tag">三甲</view>
<view class="site">广州市/番禺区</view>
<text class="hostipal">{{dealDoctorInfo.hospitalName}}</text>
<view class="tag">{{dealDoctorInfo.hospitalClassificationName}}{{dealDoctorInfo.hospitalLevelName}}</view>
<view class="site">{{dealDoctorInfo.cityName}}/{{dealDoctorInfo.countyName}}</view>
</view>
<view class="w-footer">
<image class="wf-label" src="{{imageUrl}}text-specialty.png?t={{Timestamp}}" mode="aspectFit"></image>
<view class="wf-tag">心律失常</view>
<view class="wf-tag">心律失常</view>
<view class="wf-tag">心律失常</view>
<view class="wf-tag">心律失常</view>
<view class="wf-tag" wx:for="{{dealDoctorInfo.doctorSpecialty}}" wx:key="SpecialtyId">
{{item.SpecialtyName}}
</view>
</view>
</view>
</view>
</view>
<view class="footer">
<block wx:if="{{false}}">
<block>
<view class="wrap">
<view class="w-item">
<view class="w-item" wx:if="{{auth.canReject}}">
<image class="icon" src="{{imageUrl}}case-detail-footer-icon1.png?t={{Timestamp}}"></image>
<view class="name">驳回</view>
</view>
<view class="w-item" wx:if="{{false}}">
<image class="icon" src="{{imageUrl}}case-detail-footer-icon3.png?t={{Timestamp}}"></image>
<view class="w-item" wx:if="{{auth.canViewRejectReason}}" bind:tap="handleShowRejectReason">
<view class="tip" wx:if="{{showRejectReason}}">
<view class="t-header">
<view class="title">{{rejectReason.doctorName}}医生驳回了您的病历</view>
<view class="date">{{rejectReason.rejectTime}}</view>
</view>
<view class="content">原因:{{rejectReason.remark}}</view>
</view>
<image class="icon" src="{{imageUrl}}case-detail-footer-icon1.png?t={{Timestamp}}"></image>
<view class="name">驳回原因</view>
</view>
<view class="w-item" wx:if="{{false}}">
<view class="w-item" wx:if="{{auth.canCreateChatRoom}}">
<image class="icon" src="{{imageUrl}}case-detail-footer-icon2.png?t={{Timestamp}}"></image>
<view class="name">创建聊天室</view>
</view>
<view class="w-item" wx:if="{{false}}">
<image class="icon" src="{{imageUrl}}case-detail-footer-icon4.png?t={{Timestamp}}"></image>
<view class="name">更多操作</view>
</view>
<view class="w-item" wx:if="{{false}}">
<view class="w-item" wx:if="{{auth.canArchive}}">
<image class="icon" src="{{imageUrl}}case-detail-footer-icon5.png?t={{Timestamp}}"></image>
<view class="name">归档</view>
</view>
<view class="w-item" wx:if="{{false}}">
<view class="w-item" wx:if="{{auth.canEnterChatRoom}}">
<image class="icon" src="{{imageUrl}}case-detail-footer-icon6.png?t={{Timestamp}}"></image>
<view class="name">创建聊天室</view>
<view class="name">进入聊天室</view>
</view>
<view class="w-item" wx:if="{{false}}">
<view class="w-item" wx:if="{{auth.canSetHighQuality}}">
<image class="icon" src="{{imageUrl}}case-detail-footer-icon7.png?t={{Timestamp}}"></image>
<view class="name">标为优质</view>
</view>
<view class="w-item" wx:if="{{auth.canInvite}}" bind:tap="handleInvite">
<image class="icon" src="{{imageUrl}}case-detail-footer-icon7.png?t={{Timestamp}}"></image>
<view class="name">邀约上级</view>
</view>
<!-- <view class="w-item"> -->
<!-- <image class="icon" src="{{imageUrl}}case-detail-footer-icon4.png?t={{Timestamp}}"></image> -->
<!-- <view class="name">更多操作</view> -->
<!-- </view> -->
</view>
<view class="btn-wrap">
<view class="btn1" wx:if="{{false}}">更多操作</view>
<view class="btn2" wx:if="{{false}}">
<view class="l-btn">@质控医生</view>
<view class="r-btn">提交反馈</view>
</view>
<view class="btn2" wx:if="{{true}}">
<view class="l-btn">创建聊天室</view>
<view class="r-btn">提交反馈</view>
</view>
<view class="btn1" wx:if="{{auth.canFeedback}}" bind:tap="handleFeedBack">提交反馈</view>
</view>
</block>
<view class="one-wrap">
<view class="tip">
<view class="t-header">
<view class="title">李俊医生驳回了您的病历</view>
<view class="date">2024.09.12</view>
</view>
<view class="content">原因:资料待补充</view>
</view>
<view class="cancel">驳回记录</view>
<view class="sure">提交</view>
</view>
<!-- <view class="one-wrap"> -->
<!-- <view class="content">{{rejectReason.reasonName}}:{{rejectReason.remark}}</view> -->
<!-- </view> -->
<!-- <view class="cancel">驳回记录</view> -->
<!-- <view class="sure">提交</view> -->
<!-- </view> -->
</view>
</view>
@ -341,6 +350,7 @@ @@ -341,6 +350,7 @@
</view>
</view>
</van-dialog>
<van-dialog
use-slot
title=""
@ -360,3 +370,41 @@ @@ -360,3 +370,41 @@
<view class="btn3">取消</view>
</view>
</van-dialog>
<van-dialog
use-slot
title=""
show="{{ show7 }}"
show-confirm-button="{{false}}"
confirm-button-color="rgba(0, 180, 197, 1)"
>
<view class="dialog7">
<van-icon name="cross" class="close" bind:tap="onClose" />
<view class="title">更改标签</view>
<view class="sub-title">所属科室</view>
<view class="tags tags1">
<view
class="tag {{deptId === item.value && 'active'}}"
wx:for="{{deptList}}"
wx:key="value"
bind:tap="handleDept"
data-params="{{item}}"
>
{{item.label}}
</view>
</view>
<view class="sub-title" wx:if="{{labelList.length}}">标签</view>
<view class="tags">
<view
class="tag {{tools.include(item.value,labelIds) && 'active'}}"
wx:for="{{labelList}}"
wx:key="value"
bind:tap="handleLabel"
data-params="{{item}}"
>
{{item.label}}
</view>
</view>
<view class="submit" bind:tap="handleLableSubmit">提交</view>
</view>
</van-dialog>

8
src/module1/pages/casesFeedback/index.json

@ -1,5 +1,11 @@ @@ -1,5 +1,11 @@
{
"navigationBarTitleText": "病历反馈",
"navigationStyle": "default",
"usingComponents": {}
"usingComponents": {
"uploadFile": "/components/uploadFile/index",
"van-icon": "@vant/weapp/icon/index",
"customRecord": "/components/customRecord/index",
"customAudioBar": "/components/customAudioBar/index",
"van-popup": "@vant/weapp/popup/index"
}
}

279
src/module1/pages/casesFeedback/index.scss

@ -2,6 +2,282 @@ page { @@ -2,6 +2,282 @@ page {
background-color: #f6f6f6;
}
.page {
padding: 24rpx 32rpx 300rpx;
.card {
margin-bottom: 24rpx;
padding: 32rpx;
background-color: #fff;
border-radius: 16rpx;
.card-title {
font-size: 32rpx;
color: rgba(20, 21, 21, 1);
line-height: 56rpx;
.limit {
color: rgba(153, 153, 153, 1);
}
.message-select-wrap {
float: right;
}
.message-select {
padding: 8rpx 24rpx;
font-size: 28rpx;
color: rgba(255, 255, 255, 1);
line-height: 40rpx;
background: #01b4c5;
border-radius: 60rpx 60rpx 60rpx 60rpx;
}
&.required {
&::before {
display: inline;
content: "*";
color: rgba(255, 87, 51, 1);
}
}
}
.image-files {
margin-top: 32rpx;
display: flex;
gap: 14rpx;
.upload-file {
width: 144rpx;
height: 144rpx;
background: #f6f6f6;
border-radius: 8rpx 8rpx 8rpx 8rpx;
display: flex;
align-items: center;
justify-content: center;
.add {
color: #cdcdcd;
font-size: 30px;
}
}
.photo {
position: relative;
width: 144rpx;
height: 144rpx;
border-radius: 8rpx 8rpx 8rpx 8rpx;
.p-img {
width: 100%;
height: 100%;
border-radius: inherit;
}
.del {
position: absolute;
top: 0;
right: 0;
z-index: 1;
color: #fff;
width: 32rpx;
height: 32rpx;
text-align: center;
line-height: 32rpx;
font-size: 20rpx;
border-radius: 8rpx;
background-color: rgba(0, 0, 0, 0.3);
}
.repeat {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
border-radius: inherit;
background-color: rgba(0, 0, 0, 0.3);
.icon {
width: 36rpx;
height: 36rpx;
}
.r-title {
margin-top: 8rpx;
font-size: 20rpx;
color: rgba(237, 79, 57, 1);
}
}
}
}
.remark {
margin-top: 32rpx;
padding: 32rpx;
border-radius: 16rpx;
background-color: rgba(246, 246, 246, 1);
.textarea {
font-size: 28rpx;
line-height: 32rpx;
min-height: 200rpx;
color: #000;
}
.limit {
font-size: 28rpx;
color: rgba(205, 205, 205, 1);
line-height: 32rpx;
text-align: right;
}
}
.audio-list {
margin-top: 32rpx;
.row {
margin-bottom: 24rpx;
display: flex;
gap: 28rpx;
align-items: center;
.audio-bar {
flex: 1;
border-radius: 104rpx;
background-color: rgba(246, 246, 246, 1);
}
.options {
flex-shrink: 0;
gap: 20rpx;
display: flex;
align-items: center;
.del {
width: 36rpx;
height: 36rpx;
}
.trans {
font-size: 28rpx;
color: rgba(128, 128, 128, 1);
}
}
}
}
.record {
margin: 24rpx -30rpx -30rpx;
height: 198rpx;
border-radius: 16rpx;
background: linear-gradient(to bottom, #fff 0%, #fff 34%, #f6f6f6 34%, #f6f6f6 100%);
.record-btn {
display: flex;
justify-content: center;
}
.r-title {
margin-top: 12rpx;
font-size: 28rpx;
color: rgba(133, 133, 133, 1);
text-align: center;
}
}
.none-file {
margin-top: 24rpx;
padding: 26rpx;
border-radius: 16rpx;
background-color: rgba(246, 246, 246, 1);
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
.nf-icon {
width: 96rpx;
height: 66rpx;
}
.nf-title {
margin-top: 14rpx;
font-size: 24rpx;
color: rgba(205, 205, 205, 1);
}
}
.file-list {
margin-top: 8rpx;
.fl-row {
margin-top: 24rpx;
display: flex;
align-content: inherit;
justify-content: space-between;
.wrap {
flex: 1;
padding: 20rpx 24rpx;
border-radius: 16rpx;
background-color: rgba(246, 246, 246, 1);
display: flex;
align-items: center;
.icon {
flex-shrink: 0;
width: 56rpx;
height: 56rpx;
}
.name {
flex: 1;
margin-left: 30rpx;
font-size: 32rpx;
color: rgba(128, 128, 128, 1);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
max-width: 10em;
}
}
.option {
display: flex;
align-items: center;
.icon {
margin-left: 16rpx;
width: 36rpx;
height: 36rpx;
}
}
}
}
}
.tags {
margin-top: 24rpx;
padding: 22rpx 32rpx;
border-radius: 16rpx;
background-color: #fff;
display: flex;
.label {
padding-top: 8rpx;
flex-shrink: 0;
width: 3em;
font-size: 32rpx;
color: rgba(20, 21, 21, 1);
}
.wrap {
flex: 1;
.tag-wrap {
display: flex;
gap: 16rpx;
flex-wrap: wrap;
.tag {
padding: 10rpx 32rpx;
font-size: 32rpx;
line-height: 44rpx;
color: rgba(133, 133, 133, 1);
background: #f6f6f6;
border-radius: 84rpx 84rpx 84rpx 84rpx;
&.active {
color: #fff;
background-color: rgba(1, 180, 197, 1);
}
}
}
.sub-tag-wrap {
margin-top: 32rpx;
padding: 32rpx;
border-radius: 16rpx;
background-color: rgba(246, 250, 250, 1);
display: flex;
flex-wrap: wrap;
gap: 16rpx;
.sub-tag {
padding: 6rpx 32rpx;
border-radius: 8rpx;
font-size: 32rpx;
color: rgba(133, 133, 133, 1);
line-height: 44rpx;
border: 1px solid rgba(255, 255, 255, 1);
background-color: rgba(255, 255, 255, 1);
&.active {
border-color: rgba(1, 180, 197, 1);
color: rgba(1, 180, 197, 1);
}
}
}
}
}
.footer {
position: fixed;
bottom: 0;
@ -24,6 +300,9 @@ page { @@ -24,6 +300,9 @@ page {
border-radius: 96rpx 96rpx 96rpx 96rpx;
border: 1rpx solid #01b4c5;
}
.disabled {
opacity: 0.3;
}
.submit {
width: 330rpx;
height: 88rpx;

198
src/module1/pages/casesFeedback/index.ts

@ -1,12 +1,198 @@ @@ -1,12 +1,198 @@
const _app = getApp<IAppOption>()
const app = getApp<IAppOption>();
Page({
data: {
show1: false,
show2: false,
show3: false,
show4: false,
show5: false,
images: [] as any,
info: "",
audios: [] as any,
files: [] as any,
DoctorLevel: 1,
},
onLoad() {
app.waitLogin().then(() => {
app.getUserInfo(this, (res) => {
this.setData({
DoctorLevel: res.DoctorLevel,
});
});
});
},
handlePhoto(e) {
const detail = e.detail;
const images = this.data.images;
this.setData({
images: [
...images,
{
name: detail.name,
url: detail.fileUrl,
isRepeat: 2,
},
],
});
},
handleDelPhoto(e) {
const { index } = e.currentTarget.dataset;
this.setData({
images: this.data.images.filter((_, i) => i !== Number(index)),
});
},
handleAudio(e) {
this.setData({
audios: [
...this.data.audios,
{
name: e.detail.name,
url: e.detail.fileUrl,
duration: e.detail.duration,
isRepeat: 2,
},
],
});
},
handleDelAudio(e) {
const { index } = e.currentTarget.dataset;
this.setData({
audios: this.data.audios.filter((_, i) => i !== Number(index)),
});
},
handleFile(e) {
this.setData({
files: [
...this.data.files,
{
fileType: e.detail.fileType,
name: e.detail.name,
url: e.detail.fileUrl,
size: e.detail.size,
isRepeat: 2,
videoUrl: e.detail.videoUrl,
duration: e.detail.duration,
},
],
});
},
handleDelFile(e) {
const { index } = e.currentTarget.dataset;
this.setData({
files: this.data.files.filter((_, i) => i !== Number(index)),
});
},
onLoad() {},
})
handlePreviewFile(e) {
const { index } = e.currentTarget.dataset;
const item = this.data.files[index];
wx.downloadFile({
url: item.url,
success(res) {
wx.openDocument({
filePath: res.tempFilePath,
fail() {
wx.showToast({
title: "该文件无法预览",
icon: "none",
});
},
});
},
});
},
handleDownloadFile(e) {
const { index } = e.currentTarget.dataset;
const item = this.data.files[index];
wx.downloadFile({
url: item.url,
success(res) {
if (res.statusCode === 200) {
wx.hideLoading();
const tempFilePath = res.tempFilePath;
const FileSystemManager = wx.getFileSystemManager();
FileSystemManager.saveFile({
tempFilePath,
success() {
wx.showToast({
title: "下载成功",
icon: "none",
mask: true,
});
},
fail() {
wx.showToast({
title: "下载失败,请重新尝试",
icon: "none",
mask: true,
});
},
});
}
},
});
},
formatParams() {
const { images, info, audios, files } = this.data;
return {
images: JSON.stringify(images),
info,
audios: JSON.stringify(audios),
files: JSON.stringify(files),
};
},
onClose() {
this.setData({
show1: false,
});
},
handleCache() {
const params = this.formatParams();
wx.ajax({
method: "POST",
url: "?r=takeda/case/create-case",
data: {
...params,
isSubmit: 2,
},
}).then(() => {
wx.navigateBack();
});
},
handleInvite() {
const params = this.formatParams();
const images = this.data.images;
if (images.length === 0) {
wx.showToast({
title: "请上传病例图片",
icon: "none",
});
return;
}
wx.navigateTo({
url: `/module1/pages/setCaseDoctor/index`,
success(res) {
res.eventChannel.emit("acceptDataFromOpenerPage", {
params,
});
},
});
},
handleSave() {},
handleSubmit() {},
handleBack() {
wx.showModal({
title: "您的病历还未保存,是否要存为草稿?",
confirmText: "存为草稿",
cancelColor: "退出",
success: (res) => {
if (res.confirm) {
this.handleCache();
} else {
wx.navigateBack();
}
},
});
},
});
export {};

99
src/module1/pages/casesFeedback/index.wxml

@ -1,6 +1,101 @@ @@ -1,6 +1,101 @@
<view class="page">
<view class="card">
<view class="card-title">我的批注</view>
<view class="remark">
<textarea
class="textarea"
model:value="{{info}}"
placeholder-style="color:rgba(205, 205, 205, 1);"
placeholder="请输入您的病历备注"
auto-height
maxlength="{{3000}}"
></textarea>
<view class="limit">{{description.length}}/3000</view>
</view>
<view class="audio-list">
<view class="row" wx:for="{{audios}}" wx:key="index">
<customAudioBar class="audio-bar" url="{{item.url}}" time="{{item.duration}}"></customAudioBar>
<view class="options">
<image
class="del"
src="{{imageUrl}}icon-del.png?t={{Timestamp}}"
bind:tap="handleDelAudio"
data-index="{{index}}"
></image>
<!-- <view class="trans">转文字</view> -->
</view>
</view>
</view>
<view class="record">
<customRecord class="record-btn" bind:file="handleAudio"></customRecord>
<view class="r-title">您也可以长按录入语音</view>
</view>
</view>
<view class="card">
<view class="card-title required">
上传图片建议
<text class="limit">(0/9)</text>
</view>
<view class="image-files">
<view class="photo" wx:for="{{images}}" wx:key="index">
<image class="p-img" src="{{item.url}}" mode="aspectFill"></image>
<view class="del" bind:tap="handleDelPhoto" data-index="{{index}}">
<van-icon name="cross" />
</view>
<!-- <view class="repeat">
<image class="icon" src="{{imageUrl}}icon-error.png?t={{Timestamp}}"></image>
<view class="r-title">重复图片</view>
</view> -->
</view>
<uploadFile bind:file="handlePhoto">
<view class="upload-file">
<van-icon class="add" name="plus" />
</view>
</uploadFile>
</view>
</view>
<view class="card">
<view class="card-title">
病历相关文件
<uploadFile class="message-select-wrap" chooseMessage bind:file="handleFile">
<view class="message-select">从聊天记录选择文件</view>
</uploadFile>
</view>
<view class="file-list" wx:if="{{files.length}}">
<view class="fl-row" wx:for="{{files}}" wx:key="name">
<view class="wrap">
<image class="icon" src="{{imageUrl}}icon-file{{item.fileType}}.png?t={{Timestamp}}"></image>
<view class="name">{{item.name}}</view>
</view>
<view class="option">
<image
class="icon"
bind:tap="handleDelFile"
data-index="{{index}}"
src="{{imageUrl}}icon-del.png?t={{Timestamp}}"
></image>
<image
class="icon"
bind:tap="handlePreviewFile"
data-index="{{index}}"
src="{{imageUrl}}icon-eye.png?t={{Timestamp}}"
></image>
<image
bind:tap="handleDownloadFile"
data-index="{{index}}"
class="icon"
src="{{imageUrl}}icon-download.png?t={{Timestamp}}"
></image>
</view>
</view>
</view>
<view class="none-file" wx:else>
<image class="nf-icon" src="{{imageUrl}}icon-nore-file.png?t={{Timestamp}}"></image>
<view class="nf-title">还没有文件哦!</view>
</view>
</view>
<view class="footer">
<view class="cancel">返回</view>
<view class="submit" bind:tap="handleSubmit">保存并提交</view>
<view class="cancel" bind:tap="handleCache">返回</view>
<view class="submit">保存并提交</view>
</view>
</view>

6
src/module1/pages/entryCases/index.json

@ -1,11 +1,11 @@ @@ -1,11 +1,11 @@
{
"navigationBarTitleText": "录入新病历",
"navigationStyle": "default",
"usingComponents": {
"uploadFile": "/components/uploadFile/index",
"van-icon": "@vant/weapp/icon/index",
"customRecord": "/components/customRecord/index",
"customAudioBar":"/components/customAudioBar/index",
"van-popup": "@vant/weapp/popup/index"
"customAudioBar": "/components/customAudioBar/index",
"van-popup": "@vant/weapp/popup/index",
"van-nav-bar": "@vant/weapp/nav-bar/index"
}
}

3
src/module1/pages/entryCases/index.scss

@ -300,6 +300,9 @@ page { @@ -300,6 +300,9 @@ page {
border-radius: 96rpx 96rpx 96rpx 96rpx;
border: 1rpx solid #01b4c5;
}
.disabled{
opacity: 0.3;
}
.submit {
width: 330rpx;
height: 88rpx;

165
src/module1/pages/entryCases/index.ts

@ -5,6 +5,8 @@ Page({ @@ -5,6 +5,8 @@ Page({
show1: false,
show2: false,
isInvite: false,
deptList: [] as any,
labelList: [] as any,
@ -14,10 +16,18 @@ Page({ @@ -14,10 +16,18 @@ Page({
files: [] as any,
deptId: "",
labelIds: [] as any,
DoctorLevel: 1,
},
onLoad() {
app.waitLogin().then(() => {
this.getDoctorDict();
this.getInviteDoctorList();
app.getUserInfo(this, (res) => {
this.setData({
DoctorLevel: res.DoctorLevel,
});
});
});
},
getDoctorDict() {
@ -31,32 +41,17 @@ Page({ @@ -31,32 +41,17 @@ Page({
});
});
},
formatParams() {
const { images, description, audios, files, deptId, labelIds } = this.data;
return {
images: JSON.stringify(images),
description,
audios: JSON.stringify(audios),
files: JSON.stringify(files),
deptId,
labelIds: JSON.stringify(labelIds),
};
},
handleCache() {
const params = this.formatParams();
},
handleSave() {
this.setData({
show1: true,
getInviteDoctorList() {
wx.ajax({
method: "GET",
url: "?r=takeda/case/get-invite-doctor-list",
data: {},
}).then((res) => {
this.setData({
isInvite: Boolean(res.list.length),
});
});
},
handleSubmit() {
const params = this.formatParams();
// wx.navigateTo({
// url: "/module1/pages/entryCasesResult/index",
// });
},
handleInvite() {},
handlePhoto(e) {
const detail = e.detail;
const images = this.data.images;
@ -106,10 +101,67 @@ Page({ @@ -106,10 +101,67 @@ Page({
url: e.detail.fileUrl,
size: e.detail.size,
isRepeat: 2,
videoUrl: e.detail.videoUrl,
duration: e.detail.duration,
},
],
});
},
handleDelFile(e) {
const { index } = e.currentTarget.dataset;
this.setData({
files: this.data.files.filter((_, i) => i !== Number(index)),
});
},
handlePreviewFile(e) {
const { index } = e.currentTarget.dataset;
const item = this.data.files[index];
wx.downloadFile({
url: item.url,
success(res) {
wx.openDocument({
filePath: res.tempFilePath,
fail() {
wx.showToast({
title: "该文件无法预览",
icon: "none",
});
},
});
},
});
},
handleDownloadFile(e) {
const { index } = e.currentTarget.dataset;
const item = this.data.files[index];
wx.downloadFile({
url: item.url,
success(res) {
if (res.statusCode === 200) {
wx.hideLoading();
const tempFilePath = res.tempFilePath;
const FileSystemManager = wx.getFileSystemManager();
FileSystemManager.saveFile({
tempFilePath,
success() {
wx.showToast({
title: "下载成功",
icon: "none",
mask: true,
});
},
fail() {
wx.showToast({
title: "下载失败,请重新尝试",
icon: "none",
mask: true,
});
},
});
}
},
});
},
handleDept(e) {
const { params } = e.currentTarget.dataset;
this.setData({
@ -128,6 +180,71 @@ Page({ @@ -128,6 +180,71 @@ Page({
labelIds: newLabelId,
});
},
formatParams() {
const { images, description, audios, files, deptId, labelIds } = this.data;
return {
images: JSON.stringify(images),
description,
audios: JSON.stringify(audios),
files: JSON.stringify(files),
deptId,
labelIds: JSON.stringify(labelIds),
};
},
onClose() {
this.setData({
show1: false,
});
},
handleCache() {
const params = this.formatParams();
wx.ajax({
method: "POST",
url: "?r=takeda/case/create-case",
data: {
...params,
isSubmit: 2,
},
}).then(() => {
wx.navigateBack();
});
},
handleInvite() {
const params = this.formatParams();
const images = this.data.images;
if (images.length === 0) {
wx.showToast({
title: "请上传病例图片",
icon: "none",
});
return;
}
wx.navigateTo({
url: `/module1/pages/setCaseDoctor/index`,
success(res) {
res.eventChannel.emit("acceptDataFromOpenerPage", {
params,
});
},
});
},
handleSave() {},
handleSubmit() {},
handleBack() {
wx.showModal({
title: "您的病历还未保存,是否要存为草稿?",
confirmText: "存为草稿",
cancelColor: "退出",
success: (res) => {
if (res.confirm) {
this.handleCache();
} else {
wx.navigateBack();
}
},
});
},
});
export {};

31
src/module1/pages/entryCases/index.wxml

@ -1,5 +1,8 @@ @@ -1,5 +1,8 @@
<wxs src="/utils/util.wxs" module="tools" />
<view class="page">
<van-nav-bar title="录入病例" fixed bind:click-left="handleBack" bind:click-right="onClickRight">
<van-icon name="arrow-left" slot="left" size="18px" />
</van-nav-bar>
<view class="page" style="padding-top:{{menuButtonInfo.top + 60}}px;">
<view class="card">
<view class="card-title required">
上传病历图片
@ -34,7 +37,7 @@ @@ -34,7 +37,7 @@
auto-height
maxlength="{{3000}}"
></textarea>
<view class="limit">0/3000</view>
<view class="limit">{{description.length}}/3000</view>
</view>
<view class="audio-list">
<view class="row" wx:for="{{audios}}" wx:key="index">
@ -69,9 +72,24 @@ @@ -69,9 +72,24 @@
<view class="name">{{item.name}}</view>
</view>
<view class="option">
<image class="icon" src="{{imageUrl}}icon-del.png?t={{Timestamp}}"></image>
<image class="icon" src="{{imageUrl}}icon-eye.png?t={{Timestamp}}"></image>
<image class="icon" src="{{imageUrl}}icon-download.png?t={{Timestamp}}"></image>
<image
class="icon"
bind:tap="handleDelFile"
data-index="{{index}}"
src="{{imageUrl}}icon-del.png?t={{Timestamp}}"
></image>
<image
class="icon"
bind:tap="handlePreviewFile"
data-index="{{index}}"
src="{{imageUrl}}icon-eye.png?t={{Timestamp}}"
></image>
<image
bind:tap="handleDownloadFile"
data-index="{{index}}"
class="icon"
src="{{imageUrl}}icon-download.png?t={{Timestamp}}"
></image>
</view>
</view>
</view>
@ -109,7 +127,8 @@ @@ -109,7 +127,8 @@
</view>
<view class="footer">
<view class="cancel" bind:tap="handleCache">存为草稿</view>
<view class="submit" bind:tap="handleSave" bind:tap="handleSubmit">保存并提交</view>
<view wx:if="{{isInvite}}" class="submit" bind:tap="handleInvite">保存并提交</view>
<view wx:else class="submit disabled">保存并提交</view>
</view>
</view>

24
src/module1/pages/entryCasesResult/index.ts

@ -1,6 +1,26 @@ @@ -1,6 +1,26 @@
const _app = getApp<IAppOption>();
Page({
data: {},
onLoad() {},
data: {
caseId: "",
codeUrl: "",
isFollow: "",
},
onLoad(options) {
this.setData({
caseId: options.cid,
codeUrl: options.wxi,
isFollow: options.isf,
});
},
handleReSubmit() {
wx.navigateTo({
url: "/module1/pages/entryCases/index",
});
},
handleDetail() {
wx.navigateTo({
url: `/module1/pages/casesDetail/index?id=${this.data.caseId}`,
});
},
});

11
src/module1/pages/entryCasesResult/index.wxml

@ -1,13 +1,8 @@ @@ -1,13 +1,8 @@
<view class="page">
<image class="badge" src="{{imageUrl}}icon-resolve.png?t={{Timestamp}}" mode="scaleToFill"></image>
<view class="desc">病历提交后医生将收到消息提醒</view>
<view class="btn1">查看我提交的病历</view>
<view class="btn2">继续录入新的病历</view>
<image
class="code"
src="https://pic1.zhimg.com/50/v2-dcfbab1219ae4f7a7a6db168bb1580a2_720w.jpg?source=2c26e567"
mode="scaleToFill"
show-menu-by-longpress
></image>
<view class="btn1" bind:tap="handleDetail">查看我提交的病历</view>
<view class="btn2" bind:tap="handleReSubmit">继续录入新的病历</view>
<image class="code" src="{{codeUrl}}" mode="scaleToFill" show-menu-by-longpress></image>
<view class="tip">关注公众号接收病例反馈消息</view>
</view>

20
src/module1/pages/sHostipal/index.ts

@ -121,11 +121,21 @@ Page({ @@ -121,11 +121,21 @@ Page({
handleSelect(e: any) {
const { index } = e.currentTarget.dataset;
const item: any = this.data.list[index];
const isParams = this.data.prev.includes("?");
wx.redirectTo({
url: `${this.data.prev}${isParams ? "&" : "?"}hid=${item.HospitalId}&hname=${item.ShortName || item.Name}`,
});
const { prev, list } = this.data;
const item: any = list[index];
if (prev) {
const isParams = this.data.prev.includes("?");
wx.redirectTo({
url: `${this.data.prev}${isParams ? "&" : "?"}hid=${item.HospitalId}&hname=${item.ShortName || item.Name}`,
});
} else {
const eventChannel = this.getOpenerEventChannel();
eventChannel.emit("acceptDataFromOpenedPage", {
hid: item.HospitalId,
hname: item.ShortName || item.Name,
});
wx.navigateBack();
}
},
handlePushDoctor() {
wx.navigateTo({

11
src/module1/pages/setCaseDoctor/index.json

@ -0,0 +1,11 @@ @@ -0,0 +1,11 @@
{
"navigationBarTitleText": "指派医生",
"navigationStyle": "default",
"usingComponents": {
"popupDoctorDetail": "/components/popupDoctorDetail/index",
"doctorAvatar": "/components/doctorAvatar/index",
"van-cascader": "@vant/weapp/cascader/index",
"van-popup": "@vant/weapp/popup/index",
"van-dialog": "@vant/weapp/dialog/index"
}
}

192
src/module1/pages/setCaseDoctor/index.scss

@ -0,0 +1,192 @@ @@ -0,0 +1,192 @@
page {
background-color: rgba(246, 246, 246, 1);
}
.page {
.header {
padding: 32rpx 32rpx 2rpx;
background-color: #fff;
.tip {
font-size: 28rpx;
color: rgba(20, 21, 21, 1);
.link {
color: rgba(0, 180, 197, 1);
}
}
.search {
margin-top: 32rpx;
padding: 20rpx 30rpx;
display: flex;
align-items: center;
gap: 20rpx;
border-radius: 122rpx;
background-color: rgba(246, 246, 246, 1);
.icon {
width: 32rpx;
height: 32rpx;
}
.input {
flex: 1;
text-align: center;
font-size: 28rpx;
color: #000;
}
.place-input {
color: rgba(205, 205, 205, 1);
}
}
.options {
display: flex;
align-items: center;
justify-content: space-between;
.option-wrap {
flex: 1;
.option {
padding: 30rpx 10rpx;
display: flex;
align-items: center;
justify-content: center;
.option-text {
max-width: 4em;
font-size: 32rpx;
color: rgba(20, 21, 21, 1);
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.icon {
width: 24rpx;
height: 24rpx;
}
}
}
}
}
.list {
padding: 26rpx 32rpx;
.list-item {
display: flex;
align-items: center;
.radio {
transform: scale(0.7);
}
.card {
flex: 1;
padding: 32rpx;
border-radius: 16rpx;
background-color: #fff;
display: flex;
gap: 24rpx;
.avatar {
flex-shrink: 0;
position: relative;
width: 112rpx;
height: 112rpx;
}
.wrap {
flex: 1;
.w-header {
.name {
margin-right: 10rpx;
display: inline;
font-size: 36rpx;
color: rgba(20, 21, 21, 1);
font-weight: bold;
}
.label {
display: inline;
font-size: 28rpx;
color: rgba(20, 21, 21, 1);
}
.line {
margin: 0 10rpx;
display: inline-block;
width: 1px;
height: 24rpx;
background-color: rgba(205, 205, 205, 1);
}
}
.w-container {
margin-top: 24rpx;
.hostipal {
margin-right: 12rpx;
font-size: 28rpx;
color: rgba(20, 21, 21, 1);
}
.tag {
margin-right: 12rpx;
display: inline-block;
padding: 0 8rpx;
border-radius: 4rpx;
font-size: 24rpx;
color: rgba(255, 255, 255, 1);
line-height: 32rpx;
background-color: rgba(0, 180, 197, 1);
}
.site {
display: inline-block;
padding: 0 8rpx;
font-size: 24rpx;
color: rgba(148, 87, 30, 1);
line-height: 32rpx;
border-radius: 4rpx;
background-color: rgba(250, 229, 206, 1);
}
}
.w-footer {
margin-top: 14rpx;
display: flex;
gap: 12rpx;
flex-wrap: wrap;
.wf-label {
flex-shrink: 0;
width: 48rpx;
height: 32rpx;
}
.wf-tag {
flex-shrink: 0;
padding: 0 8rpx;
font-size: 22rpx;
color: rgba(0, 180, 197, 1);
line-height: 32rpx;
border: 1rpx solid rgba(191, 239, 244, 1);
}
}
}
}
}
}
.footer {
position: fixed;
bottom: 0;
left: 0;
padding: 32rpx 32rpx calc(env(safe-area-inset-bottom) + 32rpx);
width: 100%;
box-sizing: border-box;
display: flex;
gap: 26rpx;
align-items: center;
justify-content: space-between;
background-color: #fff;
box-shadow: 0 -10rpx 20rpx rgba(0, 0, 0, 0.1);
.cancel {
width: 230rpx;
height: 84rpx;
text-align: center;
line-height: 88rpx;
font-size: 32rpx;
color: rgba(1, 180, 197, 1);
border-radius: 96rpx 96rpx 96rpx 96rpx;
border: 1rpx solid #01b4c5;
}
.submit {
flex: 1;
height: 88rpx;
text-align: center;
line-height: 88rpx;
font-size: 32rpx;
color: #fff;
background: linear-gradient(90deg, #00b4c5 0%, #54e2b4 100%);
border-radius: 96rpx;
}
}
}

252
src/module1/pages/setCaseDoctor/index.ts

@ -0,0 +1,252 @@ @@ -0,0 +1,252 @@
const app = getApp<IAppOption>();
Page({
data: {
showDetail: false,
popupDoctorDetail: {},
showResolve: false,
showArea: false,
fieldNames: { text: "label", value: "value", children: "children" },
area: [],
id: "",
DoctorTitleType: {},
hospitalClassification: {},
hospitalLevel: {},
SpecialtyList: [],
search: "",
hospitalId: "",
HospitalName: "",
provinceId: "",
cityId: "",
countyId: "",
ProvinceName: "",
CityName: "",
CountyName: "",
specialtyId: "",
SpecialtyName: "",
list: [],
DoctorId: "",
params: {},
caseId: "",
detailInvite: false,
},
onLoad(options) {
if (options.hid) {
this.setData({
hospitalId: options.hid,
HospitalName: options.hname,
});
}
const eventChannel = this.getOpenerEventChannel();
eventChannel.on("acceptDataFromOpenerPage", (data) => {
this.setData({
params: data.params,
caseId: data.caseId,
detailInvite: data.detailInvite,
});
});
app.waitLogin().then(() => {
this.getList();
this.getDoctorDict();
this.getHostipalDict();
this.getArea();
});
},
getDoctorDict() {
wx.ajax({
method: "GET",
url: "?r=takeda/reg/doctor-dict",
data: {},
}).then((res) => {
const SpecialtyList: any = [];
res.DoctorSpecialtyLabel.forEach((item: any) => {
SpecialtyList.push(...item.options);
});
this.setData({
DoctorTitleType: res.DoctorTitleType,
SpecialtyList,
});
});
},
getHostipalDict() {
wx.ajax({
method: "GET",
url: "?r=takeda/reg/hospital-dict",
data: {},
}).then((res) => {
this.setData({
hospitalClassification: res.hospitalClassification,
hospitalLevel: res.hospitalLevel,
});
});
},
getArea() {
wx.ajax({
method: "GET",
url: "/js/area.json",
isJSON: true,
}).then((res) => {
this.setData({
area: res,
});
});
},
handleSearch() {
this.setData({
list: [],
});
this.getList();
},
getList() {
const { search, hospitalId, provinceId, cityId, countyId, specialtyId } = this.data;
wx.ajax({
method: "GET",
url: "?r=takeda/case/get-invite-doctor-list",
data: {
search,
hospitalId,
provinceId,
cityId,
countyId,
specialtyId,
},
}).then((res) => {
this.setData({
list: res.list,
});
});
},
handlePopupDetail(e) {
const { index } = e.currentTarget.dataset;
const { list, hospitalClassification } = this.data;
const item: any = list[index];
this.setData({
showDetail: true,
popupDoctorDetail: {
DoctorLevel: item.doctorLevel,
DoctorImg: item.doctorImg,
DoctorName: item.doctorName,
DoctorTitleName: item.doctorTitleName || item.doctorOtherTitle,
HospitalName: item.hospitalName,
HospitalClassificationName: hospitalClassification[item.HospitalClassification],
HospitalLevelName: item.hospitalLevelName,
CityName: item.cityName,
CountyName: item.countyName,
Introduce: item.doctorIntroduce,
department: item.doctorDept,
specialty: item.doctorSpecialty,
},
});
},
handlePopupClose() {
this.setData({
showDetail: false,
});
},
handleHostipal() {
wx.navigateTo({
url: `/module1/pages/sHostipal/index`,
events: {
acceptDataFromOpenedPage: (data: any) => {
this.setData({
HospitalId: data.hid,
HospitalName: data.hname,
});
this.handleSearch();
},
},
});
},
handleArea() {
this.setData({
showArea: true,
});
},
onClose() {
this.setData({
showArea: false,
showResolve: false,
});
},
onFinish(e: any) {
this.setData({
provinceId: e.detail.selectedOptions[0].value,
ProvinceName: e.detail.selectedOptions[0].label,
cityId: e.detail.selectedOptions[1].value,
CityName: e.detail.selectedOptions[1].label,
countyId: e.detail.selectedOptions[2].value,
CountyName: e.detail.selectedOptions[2].label,
showArea: false,
});
this.handleSearch();
},
handleSpecialChange(e: any) {
const index = e.detail.value;
const { SpecialtyList } = this.data;
const item: any = SpecialtyList[index];
this.setData({
specialtyId: item.value,
SpecialtyName: item.label,
});
this.handleSearch();
},
handleRadio(e) {
const { index } = e.currentTarget.dataset;
const { list } = this.data;
this.setData({
DoctorId: (list as any)[index].doctorId,
});
},
handleSubmit() {
const { caseId, DoctorId, params, detailInvite } = this.data;
if (!DoctorId) {
wx.showToast({
title: "请选择指派医生",
icon: "none",
});
}
if (detailInvite) {
wx.ajax({
method: "POST",
url: "?r=takeda/case/invite-doctor",
data: {
caseId,
dealDoctorId: DoctorId,
},
}).then((res) => {
wx.navigateTo({
url: `/module1/pages/entryCasesResult/index?isf=${res.isSubscribe}&wxi=${encodeURIComponent(res.wxImg)}&cid=${res.caseId}`,
});
});
return;
}
wx.ajax({
method: "POST",
url: "?r=takeda/case/create-case",
data: {
...params,
isSubmit: 1,
dealDoctorId: DoctorId,
},
}).then((res) => {
wx.navigateTo({
url: `/module1/pages/entryCasesResult/index?isf=${res.isSubscribe}&wxi=${encodeURIComponent(res.wxImg)}&cid=${res.caseId}`,
});
});
},
handleBack() {
wx.navigateBack();
},
});
export {};

92
src/module1/pages/setCaseDoctor/index.wxml

@ -0,0 +1,92 @@ @@ -0,0 +1,92 @@
<view class="page">
<view class="header">
<view class="tip">邀请医生进行病历反馈,提交后医生将收到消息提醒</view>
<view class="search">
<image class="icon" src="{{imageUrl}}icon-search.png?t={{Timestamp}}"></image>
<input
model:value="{{search}}"
class="input"
placeholder-class="place-input"
placeholder="搜索医生名"
type="text"
confirm-type="search"
bindconfirm="handleSearch"
/>
</view>
<view class="options">
<view class="option-wrap" bind:tap="handleHostipal">
<view class="option">
<text class="option-text">{{HospitalName || '医院'}}</text>
<image class="icon" src="{{imageUrl}}triangle-down.png?t={{Timestamp}}"></image>
</view>
</view>
<view class="option-wrap" bind:tap="handleArea">
<view class="option">
<text class="option-text">{{CountyName || '地区'}}</text>
<image class="icon" src="{{imageUrl}}triangle-down.png?t={{Timestamp}}"></image>
</view>
</view>
<picker class="option-wrap" range="{{SpecialtyList}}" range-key="label" bindchange="handleSpecialChange">
<view class="option">
<text class="option-text">{{SpecialtyName || '医生专长'}}</text>
<image class="icon" src="{{imageUrl}}triangle-down.png?t={{Timestamp}}"></image>
</view>
</picker>
</view>
</view>
<view class="container">
<radio-group>
<view class="list">
<view class="list-item" wx:for="{{list}}" wx:key="DoctorId">
<radio class="radio" value="{{item.DoctorId}}" bind:tap="handleRadio" data-index="{{index}}"></radio>
<view class="card" bind:tap="handlePopupDetail" data-index="{{index}}">
<doctorAvatar class="avatar" src="{{item.doctorImg}}" level="{{item.doctorLevel}}"></doctorAvatar>
<view class="wrap">
<view class="w-header">
<view class="name">{{item.doctorName}}</view>
<view class="label">{{item.doctorTitleName || item.doctorOtherTitle}}</view>
<block wx:for-item="depart" wx:for="{{item.doctorDept}}" wx:key="departmentId">
<view class="line"></view>
<view class="label">{{depart.DepartmentName}}</view>
</block>
</view>
<view class="w-container">
<text class="hostipal">{{item.hospitalName}}</text>
<view class="tag">{{item.hospitalClassificationName}}{{item.hospitalLevelName}}</view>
<view class="site">{{item.cityName}}/{{item.countyName}}</view>
</view>
<view class="w-footer">
<image class="wf-label" src="{{imageUrl}}text-specialty.png?t={{Timestamp}}" mode="aspectFit"></image>
<view class="wf-tag" wx:for="{{item.doctorSpecialty}}" wx:for-item="spec" wx:key="SpecialtyId">
{{spec.SpecialtyName}}
</view>
</view>
</view>
</view>
</view>
</view>
</radio-group>
</view>
<view class="footer">
<view class="cancel" bind:tap="handleBack">返回</view>
<view class="submit" bind:tap="handleSubmit">确认提交</view>
</view>
</view>
<popupDoctorDetail
show="{{showDetail}}"
params="{{popupDoctorDetail}}"
bind:close="handlePopupClose"
></popupDoctorDetail>
<van-popup show="{{ showArea }}" round position="bottom">
<van-cascader
wx:if="{{ showArea }}"
value="{{ cascaderValue }}"
title="请选择所在地区"
options="{{ area }}"
field-names="{{fieldNames}}"
bind:close="onClose"
bind:finish="onFinish"
/>
</van-popup>

1
src/module1/pages/setDoctor/index.scss

@ -70,6 +70,7 @@ page { @@ -70,6 +70,7 @@ page {
transform: scale(0.7);
}
.card {
flex: 1;
padding: 32rpx;
border-radius: 16rpx;
background-color: #fff;

2
src/module1/pages/userInfo/index.wxml

@ -44,7 +44,7 @@ @@ -44,7 +44,7 @@
</view>
</view>
</view>
<view class="btn">退出登录</view>
<view class="btn" bind:tap="handleLoginOut">退出登录</view>
<view class="btn">更换手机号</view>
<view class="btn">注销账号</view>

13
src/pages/cases/index.ts

@ -61,12 +61,15 @@ Page({ @@ -61,12 +61,15 @@ Page({
isOpen: "",
needDeal: "",
orderType: "",
myCaseCount: 0,
},
onLoad() {
this.getTabBar().setData({
active: 2,
});
},
onShow() {
app.waitLogin().then(() => {
this.getBaseInfo();
this.getList();
@ -136,6 +139,7 @@ Page({ @@ -136,6 +139,7 @@ Page({
}).then((res) => {
const list = res.page === 1 ? res.list : [...this.data.list, ...res.list];
this.setData({
myCaseCount: res.myCaseCount,
list,
pagination: {
page: res.page,
@ -204,9 +208,10 @@ Page({ @@ -204,9 +208,10 @@ Page({
urls: [url],
});
},
handleDetail() {
handleDetail(e) {
const { params } = e.currentTarget.dataset;
wx.navigateTo({
url: "/module1/pages/casesDetail/index",
url: `/module1/pages/casesDetail/index?id=${params.caseId}`,
});
},
@ -268,7 +273,7 @@ Page({ @@ -268,7 +273,7 @@ Page({
getDoctorDict() {
wx.ajax({
method: "POST",
method: "GET",
url: "?r=takeda/reg/doctor-dict",
data: {},
}).then((res) => {

10
src/pages/cases/index.wxml

@ -158,8 +158,8 @@ @@ -158,8 +158,8 @@
</radio>
</view>
<view class="list">
<view class="list-total" wx:if="{{pagination.count}}">共有{{pagination.count}}条病历</view>
<view class="list-item" wx:for="{{list}}" bind:tap="handleDetail" wx:key="caseId">
<view class="list-total" wx:if="{{pagination.count}}">共有{{myCaseCount}}条病历</view>
<view class="list-item" wx:for="{{list}}" bind:tap="handleDetail" wx:key="caseId" data-params="{{item}}">
<image wx:if="{{item.isHighQuality==='1'}}" class="quality" src="{{imageUrl}}quality.png?t={{Timestamp}}"></image>
<view class="li-header">
<view class="wrap">
@ -187,10 +187,10 @@ @@ -187,10 +187,10 @@
<view class="content">
{{item.doctorName}}
<text class="line">|</text>
{{item.hospitalName}} {{item.doctorTitleName}}
{{item.hospitalName}} {{item.doctorTitleName || item.doctorOtherTitle}}
</view>
</view>
<view class="li-row">
<view class="li-row" wx:if="{{item.caseLabels.length}}">
<view class="label">标签</view>
<view class="tags">
<view class="tag" wx:for="{{item.caseLabels}}" wx:key="labelId" wx:for-item="caseItem">
@ -234,7 +234,7 @@ @@ -234,7 +234,7 @@
<image class="e-img" src="{{imageUrl}}empty-1.png?t={{Timestamp}}"></image>
<view class="e-tip">没有找到您搜索的医院哦!</view>
</view>
<view class="empty-2" wx:elif="{{nav==='0' && pagination.count==0}}">
<view class="empty-2" wx:elif="{{nav==='0' && myCaseCount==0}}">
<image class="e-img" src="{{imageUrl}}empty-2.png?t={{Timestamp}}"></image>
<view class="e-tip">你还没有病例哦!</view>
</view>

Loading…
Cancel
Save