|
|
@@ -68,6 +68,10 @@
|
|
|
<text class="report-arrow">›</text>
|
|
|
</view>
|
|
|
</view>
|
|
|
+ <!-- 仅在 subjectId 为空(无归属)时显示调整按钮 -->
|
|
|
+ <view v-if="!item.subjectId" class="action-btns">
|
|
|
+ <button type="primary" size="small" @click.stop="adjustBinding(item)">调整归属</button>
|
|
|
+ </view>
|
|
|
</view>
|
|
|
</view>
|
|
|
</view>
|
|
|
@@ -86,7 +90,7 @@
|
|
|
</template>
|
|
|
|
|
|
<script>
|
|
|
-import { getReportList, deleteReport, getFamilyMemberList, getCollectingReports } from '../../utils/api.js'
|
|
|
+import { getReportList, deleteReport, getFamilyMemberList, getCollectingReports, reassignReport } from '../../utils/api.js'
|
|
|
import { parseDate } from '../../utils/format.js'
|
|
|
|
|
|
export default {
|
|
|
@@ -291,6 +295,165 @@ export default {
|
|
|
uni.showToast({ title: '删除失败', icon: 'none' })
|
|
|
})
|
|
|
},
|
|
|
+ methods: {
|
|
|
+ startCollectPolling() {
|
|
|
+ var self = this
|
|
|
+ if (self.collectTimer) {
|
|
|
+ clearInterval(self.collectTimer)
|
|
|
+ }
|
|
|
+ self.loadCollectingReports()
|
|
|
+ self.collectTimer = setInterval(function() {
|
|
|
+ self.loadCollectingReports()
|
|
|
+ }, 6000)
|
|
|
+ },
|
|
|
+ loadCollectingReports() {
|
|
|
+ var self = this
|
|
|
+ var prevCount = self.collectingReports.length
|
|
|
+ getCollectingReports().then(function(res) {
|
|
|
+ if (res.code === 200) {
|
|
|
+ var list = res.data || []
|
|
|
+ self.collectingReports = list
|
|
|
+ // 采集卡片消失后刷新列表,让刚入库的报告立刻出现
|
|
|
+ if (prevCount > 0 && list.length < prevCount) {
|
|
|
+ self.loadData()
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }).catch(function() {
|
|
|
+ // 采集进度轮询失败静默,下一轮重试
|
|
|
+ })
|
|
|
+ },
|
|
|
+ loadMembers() {
|
|
|
+ var self = this
|
|
|
+ getFamilyMemberList({}).then(function(res) {
|
|
|
+ if (res.code === 200 && Array.isArray(res.data)) {
|
|
|
+ // _filterId 预计算,供 :class 内联比较使用(小程序 :class 禁止方法调用)
|
|
|
+ var list = []
|
|
|
+ for (var i = 0; i < res.data.length; i++) {
|
|
|
+ var m = res.data[i]
|
|
|
+ list.push({
|
|
|
+ id: m.id,
|
|
|
+ nickname: m.nickname,
|
|
|
+ avatar: m.avatar,
|
|
|
+ _filterId: m.id || m.userId
|
|
|
+ })
|
|
|
+ }
|
|
|
+ self.members = list
|
|
|
+ }
|
|
|
+ }).catch(function(e) {
|
|
|
+ console.log('获取家庭成员失败', e)
|
|
|
+ })
|
|
|
+ },
|
|
|
+ selectAllMembers() {
|
|
|
+ if (this.selectedMemberId === null) return
|
|
|
+ this.selectedMemberId = null
|
|
|
+ this.loadData()
|
|
|
+ },
|
|
|
+ selectMember(item) {
|
|
|
+ var filterId = item._filterId
|
|
|
+ if (this.selectedMemberId === filterId) return
|
|
|
+ this.selectedMemberId = filterId
|
|
|
+ this.loadData()
|
|
|
+ },
|
|
|
+ loadData() {
|
|
|
+ var self = this
|
|
|
+ self.loading = true
|
|
|
+ getReportList(self.selectedMemberId).then(function(res) {
|
|
|
+ self.reports = res.data || []
|
|
|
+ }).catch(function(e) {
|
|
|
+ console.log('获取报告列表失败', e)
|
|
|
+ uni.showToast({ title: '加载失败', icon: 'none' })
|
|
|
+ }).finally(function() {
|
|
|
+ self.loading = false
|
|
|
+ })
|
|
|
+ },
|
|
|
+ goToDetail(reportId, reportType) {
|
|
|
+ var url
|
|
|
+ if (reportType === 'gut_flora') {
|
|
|
+ url = '/pages/health/gut-flora-detail?reportId=' + reportId
|
|
|
+ } else if (reportType === 'dan') {
|
|
|
+ url = '/pages/dan-assessment/report-result?reportId=' + reportId
|
|
|
+ } else {
|
|
|
+ url = '/pages/health/report-detail?reportType=' + (reportType || 'gut_flora') + '&reportId=' + reportId
|
|
|
+ }
|
|
|
+ uni.navigateTo({ url: url })
|
|
|
+ },
|
|
|
+ onRowClick(item) {
|
|
|
+ // 刚滑动过,忽略本次点击
|
|
|
+ if (this.touchDidMove) {
|
|
|
+ this.touchDidMove = false
|
|
|
+ return
|
|
|
+ }
|
|
|
+ // 行处于打开态,点击先收起
|
|
|
+ if (this.openMap[item.id]) {
|
|
|
+ this.$set(this.openMap, item.id, false)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ this.goToDetail(item.id, item.reportType)
|
|
|
+ },
|
|
|
+ onTouchStart(e, item) {
|
|
|
+ // 先收起其它已打开行
|
|
|
+ if (this.curId !== null && this.curId !== item.id && this.openMap[this.curId]) {
|
|
|
+ this.$set(this.openMap, this.curId, false)
|
|
|
+ }
|
|
|
+ var touch = e.touches[0]
|
|
|
+ this.curId = item.id
|
|
|
+ this.startX = touch.clientX
|
|
|
+ this.startY = touch.clientY
|
|
|
+ this.touchDidMove = false
|
|
|
+ this.baseOffset = this.openMap[item.id] ? -80 : 0
|
|
|
+ this.moveOffset = this.baseOffset
|
|
|
+ },
|
|
|
+ onTouchMove(e) {
|
|
|
+ if (this.curId === null) return
|
|
|
+ var touch = e.touches[0]
|
|
|
+ var dx = touch.clientX - this.startX
|
|
|
+ var dy = touch.clientY - this.startY
|
|
|
+ // 横向滑动(水平分量大于垂直分量)
|
|
|
+ if (Math.abs(dx) > Math.abs(dy)) {
|
|
|
+ this.touchDidMove = Math.abs(dx) > 10
|
|
|
+ var offset = this.baseOffset + dx
|
|
|
+ if (offset < -80) offset = -80
|
|
|
+ if (offset > 0) offset = 0
|
|
|
+ this.moveOffset = offset
|
|
|
+ }
|
|
|
+ },
|
|
|
+ onTouchEnd() {
|
|
|
+ if (this.curId === null) return
|
|
|
+ // 位移超过阈值则打开,否则收起
|
|
|
+ var shouldOpen = this.moveOffset < -20
|
|
|
+ this.$set(this.openMap, this.curId, shouldOpen)
|
|
|
+ this.moveOffset = shouldOpen ? -80 : 0
|
|
|
+ this.curId = null
|
|
|
+ },
|
|
|
+ goToUpload() {
|
|
|
+ uni.navigateTo({ url: '/pages/health/report-upload' })
|
|
|
+ },
|
|
|
+ confirmDelete(item) {
|
|
|
+ var self = this
|
|
|
+ uni.showModal({
|
|
|
+ title: '删除报告',
|
|
|
+ content: '确定删除该健康报告吗?删除后不可恢复。',
|
|
|
+ confirmColor: '#F56C6C',
|
|
|
+ success: function(res) {
|
|
|
+ if (!res.confirm) return
|
|
|
+ self.doDelete(item)
|
|
|
+ }
|
|
|
+ })
|
|
|
+ },
|
|
|
+ doDelete(item) {
|
|
|
+ var self = this
|
|
|
+ deleteReport(item.id).then(function(res) {
|
|
|
+ if (res.code === 200) {
|
|
|
+ uni.showToast({ title: '已删除', icon: 'success' })
|
|
|
+ self.loadData()
|
|
|
+ } else {
|
|
|
+ uni.showToast({ title: res.message || '删除失败', icon: 'none' })
|
|
|
+ }
|
|
|
+ }).catch(function(e) {
|
|
|
+ console.log('删除报告失败', e)
|
|
|
+ uni.showToast({ title: '删除失败', icon: 'none' })
|
|
|
+ })
|
|
|
+ },
|
|
|
formatDate(dateStr) {
|
|
|
if (!dateStr) return '--'
|
|
|
var d = parseDate(dateStr)
|
|
|
@@ -310,6 +473,49 @@ export default {
|
|
|
var h = ('' + d.getHours()).padStart(2, '0')
|
|
|
var min = ('' + d.getMinutes()).padStart(2, '0')
|
|
|
return y + '-' + m + '-' + day + ' ' + h + ':' + min
|
|
|
+ },
|
|
|
+ // 调整归属(仅在 subjectId 为 null 的报告上显示)
|
|
|
+ adjustBinding(item) {
|
|
|
+ var self = this
|
|
|
+ // 弹出选择操作
|
|
|
+ uni.showActionSheet({
|
|
|
+ itemList: ['绑定新归属', '解除归属'],
|
|
|
+ itemColor: '#1890ff',
|
|
|
+ success: function(res) {
|
|
|
+ if (res.tapIndex === 0) {
|
|
|
+ // 绑定新归属:弹出成员选择器
|
|
|
+ uni.showModal({
|
|
|
+ title: '选择归属成员',
|
|
|
+ content: '请选择报告的归属成员',
|
|
|
+ confirmText: '确定',
|
|
|
+ cancelText: '取消',
|
|
|
+ success: function(modalRes) {
|
|
|
+ if (modalRes.confirm) {
|
|
|
+ // 这里需要调用后端 reassignReport 接口,传入 newSubjectId
|
|
|
+ // 由于小程序端需要选择具体成员,简化处理:提示功能待前端完整实现
|
|
|
+ uni.showToast({ title: '功能待管理端操作', icon: 'none' })
|
|
|
+ }
|
|
|
+ }
|
|
|
+ })
|
|
|
+ } else {
|
|
|
+ // 解除归属:subjectId 设为 null
|
|
|
+ uni.request({
|
|
|
+ url: '/api/health/report/reassign',
|
|
|
+ method: 'POST',
|
|
|
+ data: {
|
|
|
+ reportId: item.id,
|
|
|
+ subjectId: null
|
|
|
+ },
|
|
|
+ success: function(resp) {
|
|
|
+ if (resp.data.code === 0) {
|
|
|
+ uni.showToast({ title: '归属已解除', icon: 'success' })
|
|
|
+ self.loadData()
|
|
|
+ }
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
+ })
|
|
|
}
|
|
|
}
|
|
|
}
|