|
@@ -3,6 +3,9 @@
|
|
|
<view class="nav-bar">
|
|
<view class="nav-bar">
|
|
|
<view class="nav-back" @tap="goBack"><text class="back-text">‹ 返回</text></view>
|
|
<view class="nav-back" @tap="goBack"><text class="back-text">‹ 返回</text></view>
|
|
|
<text class="nav-title">{{ typeLabel }}</text>
|
|
<text class="nav-title">{{ typeLabel }}</text>
|
|
|
|
|
+ <view class="nav-edit" v-if="isGutFlora && hasRiskBlocks" @tap="toggleRiskEdit">
|
|
|
|
|
+ <text>{{ isEditing ? '完成' : '编辑' }}</text>
|
|
|
|
|
+ </view>
|
|
|
</view>
|
|
</view>
|
|
|
<scroll-view class="content" scroll-y>
|
|
<scroll-view class="content" scroll-y>
|
|
|
<!-- 报告头 -->
|
|
<!-- 报告头 -->
|
|
@@ -16,13 +19,27 @@
|
|
|
<!-- blocks 渲染 -->
|
|
<!-- blocks 渲染 -->
|
|
|
<report-blocks-renderer v-if="blocks && blocks.length > 0" :blocks="blocks" />
|
|
<report-blocks-renderer v-if="blocks && blocks.length > 0" :blocks="blocks" />
|
|
|
<view class="empty-hint" v-else>暂无报告内容</view>
|
|
<view class="empty-hint" v-else>暂无报告内容</view>
|
|
|
|
|
+ <!-- 风险编辑面板 -->
|
|
|
|
|
+ <view class="edit-panel" v-if="isEditing">
|
|
|
|
|
+ <view class="edit-card" v-for="(risk, ei) in editRisks" :key="'e' + ei">
|
|
|
|
|
+ <text class="edit-name">{{ risk.diseaseName }}</text>
|
|
|
|
|
+ <view class="edit-row">
|
|
|
|
|
+ <text class="edit-label">风险值:</text>
|
|
|
|
|
+ <input class="edit-input" type="text" v-model="risk.riskValue" />
|
|
|
|
|
+ <text class="edit-label">等级:</text>
|
|
|
|
|
+ <picker :value="riskLevelIndex(risk.riskLevel)" :range="riskLevels" @change="onRiskLevelChange($event, risk)">
|
|
|
|
|
+ <text class="edit-picker">{{ risk.riskLevel || '请选择' }}</text>
|
|
|
|
|
+ </picker>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ </view>
|
|
|
</scroll-view>
|
|
</scroll-view>
|
|
|
</view>
|
|
</view>
|
|
|
</template>
|
|
</template>
|
|
|
|
|
|
|
|
<script>
|
|
<script>
|
|
|
import ReportBlocksRenderer from '../../components/report-blocks-renderer.vue'
|
|
import ReportBlocksRenderer from '../../components/report-blocks-renderer.vue'
|
|
|
-import { getReportDetail, getDanReportDetail } from '../../utils/api.js'
|
|
|
|
|
|
|
+import { getReportDetail, getDanReportDetail, editHealthReport } from '../../utils/api.js'
|
|
|
import { parseDate } from '../../utils/format.js'
|
|
import { parseDate } from '../../utils/format.js'
|
|
|
|
|
|
|
|
export default {
|
|
export default {
|
|
@@ -32,7 +49,10 @@ export default {
|
|
|
reportType: '',
|
|
reportType: '',
|
|
|
reportId: null,
|
|
reportId: null,
|
|
|
blocks: [],
|
|
blocks: [],
|
|
|
- headInfo: null
|
|
|
|
|
|
|
+ headInfo: null,
|
|
|
|
|
+ isEditing: false,
|
|
|
|
|
+ editRisks: [],
|
|
|
|
|
+ riskLevels: ['低风险', '需注意', '高风险', '异常']
|
|
|
}
|
|
}
|
|
|
},
|
|
},
|
|
|
computed: {
|
|
computed: {
|
|
@@ -69,6 +89,53 @@ export default {
|
|
|
}).catch(function() {
|
|
}).catch(function() {
|
|
|
uni.showToast({ title: '加载失败', icon: 'none' })
|
|
uni.showToast({ title: '加载失败', icon: 'none' })
|
|
|
})
|
|
})
|
|
|
|
|
+ },
|
|
|
|
|
+ isGutFlora: function() {
|
|
|
|
|
+ return this.reportType === 'gut_flora'
|
|
|
|
|
+ },
|
|
|
|
|
+ hasRiskBlocks: function() {
|
|
|
|
|
+ var blocks = this.blocks || []
|
|
|
|
|
+ for (var i = 0; i < blocks.length; i++) {
|
|
|
|
|
+ if (blocks[i].type === 'risk_group' && blocks[i].items && blocks[i].items.length > 0) return true
|
|
|
|
|
+ }
|
|
|
|
|
+ return false
|
|
|
|
|
+ },
|
|
|
|
|
+ toggleRiskEdit: function() {
|
|
|
|
|
+ var self = this
|
|
|
|
|
+ if (this.isEditing) {
|
|
|
|
|
+ editHealthReport(this.reportId, { diseaseRisks: this.editRisks }, 0).then(function(res) {
|
|
|
|
|
+ if (res.code === 200) {
|
|
|
|
|
+ uni.showToast({ title: '已保存', icon: 'success' })
|
|
|
|
|
+ self.isEditing = false
|
|
|
|
|
+ self.loadData()
|
|
|
|
|
+ } else {
|
|
|
|
|
+ uni.showToast({ title: res.message || '保存失败', icon: 'none' })
|
|
|
|
|
+ }
|
|
|
|
|
+ })
|
|
|
|
|
+ } else {
|
|
|
|
|
+ var risks = []
|
|
|
|
|
+ var blocks = this.blocks || []
|
|
|
|
|
+ for (var i = 0; i < blocks.length; i++) {
|
|
|
|
|
+ if (blocks[i].type === 'risk_group' && blocks[i].items) {
|
|
|
|
|
+ for (var j = 0; j < blocks[i].items.length; j++) {
|
|
|
|
|
+ risks.push({
|
|
|
|
|
+ diseaseName: blocks[i].items[j].name,
|
|
|
|
|
+ riskValue: blocks[i].items[j].value,
|
|
|
|
|
+ riskLevel: blocks[i].items[j].level
|
|
|
|
|
+ })
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ this.editRisks = JSON.parse(JSON.stringify(risks))
|
|
|
|
|
+ this.isEditing = true
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+ riskLevelIndex: function(level) {
|
|
|
|
|
+ var idx = this.riskLevels.indexOf(level)
|
|
|
|
|
+ return idx >= 0 ? idx : 0
|
|
|
|
|
+ },
|
|
|
|
|
+ onRiskLevelChange: function(e, risk) {
|
|
|
|
|
+ risk.riskLevel = this.riskLevels[e.detail.value]
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -80,6 +147,8 @@ export default {
|
|
|
.nav-back { padding: 10rpx 0; }
|
|
.nav-back { padding: 10rpx 0; }
|
|
|
.back-text { font-size: 28rpx; color: #4A9BD7; }
|
|
.back-text { font-size: 28rpx; color: #4A9BD7; }
|
|
|
.nav-title { flex: 1; text-align: center; font-size: 32rpx; font-weight: 600; }
|
|
.nav-title { flex: 1; text-align: center; font-size: 32rpx; font-weight: 600; }
|
|
|
|
|
+.nav-edit { padding: 10rpx 0; }
|
|
|
|
|
+.nav-edit text { font-size: 28rpx; color: #4A9BD7; }
|
|
|
.content { padding: 20rpx 30rpx; height: calc(100vh - 100rpx); }
|
|
.content { padding: 20rpx 30rpx; height: calc(100vh - 100rpx); }
|
|
|
.report-head { background: #fff; border-radius: 16rpx; padding: 28rpx; margin-bottom: 20rpx; }
|
|
.report-head { background: #fff; border-radius: 16rpx; padding: 28rpx; margin-bottom: 20rpx; }
|
|
|
.head-name { font-size: 34rpx; font-weight: 600; color: #333; }
|
|
.head-name { font-size: 34rpx; font-weight: 600; color: #333; }
|
|
@@ -87,4 +156,12 @@ export default {
|
|
|
.type-badge { font-size: 22rpx; color: #2E7D32; background: #E8F5E9; padding: 4rpx 16rpx; border-radius: 20rpx; margin-right: 16rpx; }
|
|
.type-badge { font-size: 22rpx; color: #2E7D32; background: #E8F5E9; padding: 4rpx 16rpx; border-radius: 20rpx; margin-right: 16rpx; }
|
|
|
.head-date { font-size: 24rpx; color: #999; }
|
|
.head-date { font-size: 24rpx; color: #999; }
|
|
|
.empty-hint { text-align: center; color: #ccc; padding: 80rpx 0; font-size: 28rpx; }
|
|
.empty-hint { text-align: center; color: #ccc; padding: 80rpx 0; font-size: 28rpx; }
|
|
|
|
|
+/* edit panel */
|
|
|
|
|
+.edit-panel { margin-top: 20rpx; }
|
|
|
|
|
+.edit-card { background: #fff; border-radius: 16rpx; padding: 24rpx; margin-bottom: 16rpx; }
|
|
|
|
|
+.edit-name { font-size: 28rpx; font-weight: 600; color: #333; display: block; margin-bottom: 12rpx; }
|
|
|
|
|
+.edit-row { display: flex; align-items: center; gap: 10rpx; }
|
|
|
|
|
+.edit-label { font-size: 26rpx; color: #666; }
|
|
|
|
|
+.edit-input { flex: 1; border: 1rpx solid #ddd; border-radius: 8rpx; padding: 8rpx 12rpx; font-size: 26rpx; }
|
|
|
|
|
+.edit-picker { font-size: 26rpx; color: #333; padding: 8rpx 16rpx; border: 1rpx solid #ddd; border-radius: 8rpx; }
|
|
|
</style>
|
|
</style>
|