|
@@ -68,8 +68,8 @@
|
|
|
<text class="report-arrow">›</text>
|
|
<text class="report-arrow">›</text>
|
|
|
</view>
|
|
</view>
|
|
|
</view>
|
|
</view>
|
|
|
- <!-- 仅在 subjectId 为空(无归属)时显示调整按钮 -->
|
|
|
|
|
- <view v-if="!item.subjectId" class="action-btns">
|
|
|
|
|
|
|
+ <!-- 调整归属按钮(始终显示,已绑定成员点击将提示无法修改) -->
|
|
|
|
|
+ <view class="action-btns">
|
|
|
<button type="primary" size="small" @click.stop="adjustBinding(item)">调整归属</button>
|
|
<button type="primary" size="small" @click.stop="adjustBinding(item)">调整归属</button>
|
|
|
</view>
|
|
</view>
|
|
|
</view>
|
|
</view>
|
|
@@ -84,14 +84,61 @@
|
|
|
<view class="empty-btn" @click="goToUpload">上传报告</view>
|
|
<view class="empty-btn" @click="goToUpload">上传报告</view>
|
|
|
</view>
|
|
</view>
|
|
|
|
|
|
|
|
|
|
+ <!-- 成员调整面板 -->
|
|
|
|
|
+ <view class="adjust-panel" v-if="showAdjustPanel">
|
|
|
|
|
+ <view class="panel-header">
|
|
|
|
|
+ <text class="panel-title">调整报告归属</text>
|
|
|
|
|
+ <view class="panel-close" @click="closeAdjustPanel">×</view>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ <view class="panel-content">
|
|
|
|
|
+ <!-- 取消归属选项 -->
|
|
|
|
|
+ <view class="cancel-bind-option" @click="cancelBinding" v-if="adjustCurrentMemberId">
|
|
|
|
|
+ <text class="cancel-bind-text">取消归属</text>
|
|
|
|
|
+ <text class="cancel-bind-arrow">×</text>
|
|
|
|
|
+ </view>
|
|
|
|
|
+
|
|
|
|
|
+ <view class="member-filter">
|
|
|
|
|
+ <scroll-view class="filter-scroll" scroll-x="true" :show-scrollbar="false">
|
|
|
|
|
+ <view class="filter-chips">
|
|
|
|
|
+ <view class="chip" :class="{ 'chip-active': !selectedAdjustMemberId }" @click="selectAllAdjustMembers">
|
|
|
|
|
+ <text class="chip-text">全部</text>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ <view
|
|
|
|
|
+ class="chip"
|
|
|
|
|
+ v-for="member in adjustMembers"
|
|
|
|
|
+ :key="member.id"
|
|
|
|
|
+ :class="{ 'chip-active': selectedAdjustMemberId === member._filterId }"
|
|
|
|
|
+ @click="selectMemberAdjust(member)"
|
|
|
|
|
+ >
|
|
|
|
|
+ <text class="chip-text">{{ member.nickname || '成员' }}</text>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ </scroll-view>
|
|
|
|
|
+ </view>
|
|
|
|
|
+
|
|
|
|
|
+ <!-- 家庭成员列表 -->
|
|
|
|
|
+ <view class="member-list" v-if="adjustMembers.length > 0">
|
|
|
|
|
+ <view
|
|
|
|
|
+ class="member-item"
|
|
|
|
|
+ v-for="(member, mIdx) in adjustMembers"
|
|
|
|
|
+ :key="mIdx"
|
|
|
|
|
+ @click="selectMemberAdjust(member)"
|
|
|
|
|
+ >
|
|
|
|
|
+ <text class="member-avatar">{{ (member.nickname || '?').substring(0, 1) }}</text>
|
|
|
|
|
+ <text class="member-name">{{ member.nickname || '未知' }}</text>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ </view>
|
|
|
|
|
+
|
|
|
<!-- 底部占位 -->
|
|
<!-- 底部占位 -->
|
|
|
<view class="bottom-spacer"></view>
|
|
<view class="bottom-spacer"></view>
|
|
|
</view>
|
|
</view>
|
|
|
</template>
|
|
</template>
|
|
|
|
|
|
|
|
<script>
|
|
<script>
|
|
|
-import { getReportList, deleteReport, getFamilyMemberList, getCollectingReports, reassignReport } from '../../utils/api.js'
|
|
|
|
|
import { parseDate } from '../../utils/format.js'
|
|
import { parseDate } from '../../utils/format.js'
|
|
|
|
|
+import { getReportList, deleteReport, getFamilyMemberList, getCollectingReports, reassignReport } from '../../utils/api.js'
|
|
|
|
|
|
|
|
export default {
|
|
export default {
|
|
|
data() {
|
|
data() {
|
|
@@ -111,7 +158,18 @@ export default {
|
|
|
startX: 0,
|
|
startX: 0,
|
|
|
startY: 0,
|
|
startY: 0,
|
|
|
touchDidMove: false,
|
|
touchDidMove: false,
|
|
|
- baseOffset: 0
|
|
|
|
|
|
|
+ baseOffset: 0,
|
|
|
|
|
+ // 调整归属面板状态
|
|
|
|
|
+ showAdjustPanel: false,
|
|
|
|
|
+ adjustReportId: null,
|
|
|
|
|
+ adjustCurrentMemberId: null,
|
|
|
|
|
+ // 调整面板成员数据
|
|
|
|
|
+ adjustMembers: [],
|
|
|
|
|
+ selectedAdjustMemberId: null,
|
|
|
|
|
+ candidates: [],
|
|
|
|
|
+ showAutoCreateForm: false,
|
|
|
|
|
+ newMemberName: '',
|
|
|
|
|
+ newMemberGender: 'male'
|
|
|
}
|
|
}
|
|
|
},
|
|
},
|
|
|
onLoad(options) {
|
|
onLoad(options) {
|
|
@@ -137,6 +195,52 @@ export default {
|
|
|
}
|
|
}
|
|
|
},
|
|
},
|
|
|
methods: {
|
|
methods: {
|
|
|
|
|
+ adjustBinding(item) {
|
|
|
|
|
+ var self = this
|
|
|
|
|
+ // 显示成员选择面板
|
|
|
|
|
+ self.showAdjustPanel = true
|
|
|
|
|
+ self.adjustReportId = item.id
|
|
|
|
|
+ // 记录当前归属成员ID(用于判断是否显示"取消归属"选项)
|
|
|
|
|
+ self.adjustCurrentMemberId = item.subjectId
|
|
|
|
|
+ // 使用已加载的成员列表
|
|
|
|
|
+ self.adjustMembers = self.members
|
|
|
|
|
+ self.selectedAdjustMemberId = null
|
|
|
|
|
+ },
|
|
|
|
|
+ cancelBinding() {
|
|
|
|
|
+ var self = this
|
|
|
|
|
+ self.showAdjustPanel = false
|
|
|
|
|
+ // 调用后端接口取消归属(传入 null)
|
|
|
|
|
+ reassignReport(self.adjustReportId, null).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' })
|
|
|
|
|
+ })
|
|
|
|
|
+ },
|
|
|
|
|
+ closeAdjustPanel() {
|
|
|
|
|
+ this.showAdjustPanel = false
|
|
|
|
|
+ },
|
|
|
|
|
+ selectAdjustMember(member) {
|
|
|
|
|
+ var self = this
|
|
|
|
|
+ self.showAdjustPanel = false
|
|
|
|
|
+ // 调用后端接口修改归属
|
|
|
|
|
+ reassignReport(self.adjustReportId, member.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' })
|
|
|
|
|
+ })
|
|
|
|
|
+ },
|
|
|
startCollectPolling() {
|
|
startCollectPolling() {
|
|
|
var self = this
|
|
var self = this
|
|
|
if (self.collectTimer) {
|
|
if (self.collectTimer) {
|
|
@@ -189,12 +293,32 @@ export default {
|
|
|
this.selectedMemberId = null
|
|
this.selectedMemberId = null
|
|
|
this.loadData()
|
|
this.loadData()
|
|
|
},
|
|
},
|
|
|
|
|
+ selectAllAdjustMembers() {
|
|
|
|
|
+ if (this.selectedAdjustMemberId === null) return
|
|
|
|
|
+ this.selectedAdjustMemberId = null
|
|
|
|
|
+ },
|
|
|
selectMember(item) {
|
|
selectMember(item) {
|
|
|
var filterId = item._filterId
|
|
var filterId = item._filterId
|
|
|
if (this.selectedMemberId === filterId) return
|
|
if (this.selectedMemberId === filterId) return
|
|
|
this.selectedMemberId = filterId
|
|
this.selectedMemberId = filterId
|
|
|
this.loadData()
|
|
this.loadData()
|
|
|
},
|
|
},
|
|
|
|
|
+ selectMemberAdjust(member) {
|
|
|
|
|
+ var self = this
|
|
|
|
|
+ self.showAdjustPanel = false
|
|
|
|
|
+ // 调用后端接口修改归属
|
|
|
|
|
+ reassignReport(self.adjustReportId, member.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' })
|
|
|
|
|
+ })
|
|
|
|
|
+ },
|
|
|
loadData() {
|
|
loadData() {
|
|
|
var self = this
|
|
var self = this
|
|
|
self.loading = true
|
|
self.loading = true
|
|
@@ -207,6 +331,21 @@ export default {
|
|
|
self.loading = false
|
|
self.loading = false
|
|
|
})
|
|
})
|
|
|
},
|
|
},
|
|
|
|
|
+ genderText(gender) {
|
|
|
|
|
+ if (gender === 'male') return '男'
|
|
|
|
|
+ if (gender === 'female') return '女'
|
|
|
|
|
+ return ''
|
|
|
|
|
+ },
|
|
|
|
|
+ toggleAutoCreate() {
|
|
|
|
|
+ var self = this
|
|
|
|
|
+ self.showAutoCreateForm = !self.showAutoCreateForm
|
|
|
|
|
+ },
|
|
|
|
|
+ confirmCreateMember() {
|
|
|
|
|
+ var self = this
|
|
|
|
|
+ // 简单的创建逻辑 - 这里需要后端支持创建成员
|
|
|
|
|
+ uni.showToast({ title: '创建功能待开发', icon: 'none' })
|
|
|
|
|
+ self.showAutoCreateForm = false
|
|
|
|
|
+ },
|
|
|
goToDetail(reportId, reportType) {
|
|
goToDetail(reportId, reportType) {
|
|
|
var url
|
|
var url
|
|
|
if (reportType === 'gut_flora') {
|
|
if (reportType === 'gut_flora') {
|
|
@@ -295,6 +434,22 @@ export default {
|
|
|
uni.showToast({ title: '删除失败', icon: 'none' })
|
|
uni.showToast({ title: '删除失败', icon: 'none' })
|
|
|
})
|
|
})
|
|
|
},
|
|
},
|
|
|
|
|
+ formatDate(dateStr) {
|
|
|
|
|
+ var d = parseDate(dateStr)
|
|
|
|
|
+ if (!d) return ''
|
|
|
|
|
+ var y = d.getFullYear()
|
|
|
|
|
+ var m = ('0' + (d.getMonth() + 1)).slice(-2)
|
|
|
|
|
+ var day = ('0' + d.getDate()).slice(-2)
|
|
|
|
|
+ return y + '-' + m + '-' + day
|
|
|
|
|
+ },
|
|
|
|
|
+ formatDateTime(dateStr) {
|
|
|
|
|
+ var d = parseDate(dateStr)
|
|
|
|
|
+ if (!d) return ''
|
|
|
|
|
+ return this.formatDate(dateStr) + ' ' +
|
|
|
|
|
+ ('0' + d.getHours()).slice(-2) + ':' +
|
|
|
|
|
+ ('0' + d.getMinutes()).slice(-2) + ':' +
|
|
|
|
|
+ ('0' + d.getSeconds()).slice(-2)
|
|
|
|
|
+ },
|
|
|
},
|
|
},
|
|
|
}
|
|
}
|
|
|
</script>
|
|
</script>
|
|
@@ -561,4 +716,88 @@ export default {
|
|
|
.bottom-spacer {
|
|
.bottom-spacer {
|
|
|
height: 60rpx;
|
|
height: 60rpx;
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+/* ===== 调整归属面板 ===== */
|
|
|
|
|
+.adjust-panel {
|
|
|
|
|
+ position: fixed;
|
|
|
|
|
+ top: 0;
|
|
|
|
|
+ left: 0;
|
|
|
|
|
+ right: 0;
|
|
|
|
|
+ bottom: 0;
|
|
|
|
|
+ background: rgba(0, 0, 0, 0.5);
|
|
|
|
|
+ z-index: 999;
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ align-items: flex-end;
|
|
|
|
|
+}
|
|
|
|
|
+.adjust-panel .panel-content {
|
|
|
|
|
+ background: #fff;
|
|
|
|
|
+ border-radius: 32rpx 32rpx 0 0;
|
|
|
|
|
+ padding: 32rpx 30rpx;
|
|
|
|
|
+ max-height: 70vh;
|
|
|
|
|
+ overflow-y: auto;
|
|
|
|
|
+ width: 100%;
|
|
|
|
|
+}
|
|
|
|
|
+.adjust-panel .panel-header {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ justify-content: space-between;
|
|
|
|
|
+ margin-bottom: 24rpx;
|
|
|
|
|
+}
|
|
|
|
|
+.adjust-panel .panel-title {
|
|
|
|
|
+ font-size: 32rpx;
|
|
|
|
|
+ font-weight: 600;
|
|
|
|
|
+ color: #333;
|
|
|
|
|
+}
|
|
|
|
|
+.adjust-panel .panel-close {
|
|
|
|
|
+ font-size: 48rpx;
|
|
|
|
|
+ color: #999;
|
|
|
|
|
+ line-height: 1;
|
|
|
|
|
+ padding: 0 8rpx;
|
|
|
|
|
+}
|
|
|
|
|
+.adjust-panel .cancel-bind-option {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ justify-content: space-between;
|
|
|
|
|
+ padding: 24rpx 0;
|
|
|
|
|
+ border-bottom: 1rpx solid #f0f0f0;
|
|
|
|
|
+ margin-bottom: 16rpx;
|
|
|
|
|
+}
|
|
|
|
|
+.adjust-panel .cancel-bind-text {
|
|
|
|
|
+ font-size: 28rpx;
|
|
|
|
|
+ color: #F56C6C;
|
|
|
|
|
+}
|
|
|
|
|
+.adjust-panel .cancel-bind-arrow {
|
|
|
|
|
+ font-size: 32rpx;
|
|
|
|
|
+ color: #ccc;
|
|
|
|
|
+}
|
|
|
|
|
+.adjust-panel .member-list {
|
|
|
|
|
+ margin-top: 16rpx;
|
|
|
|
|
+}
|
|
|
|
|
+.adjust-panel .member-item {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ padding: 20rpx 0;
|
|
|
|
|
+ border-bottom: 1rpx solid #f5f5f5;
|
|
|
|
|
+}
|
|
|
|
|
+.adjust-panel .member-item:last-child {
|
|
|
|
|
+ border-bottom: none;
|
|
|
|
|
+}
|
|
|
|
|
+.adjust-panel .member-avatar {
|
|
|
|
|
+ width: 64rpx;
|
|
|
|
|
+ height: 64rpx;
|
|
|
|
|
+ border-radius: 50%;
|
|
|
|
|
+ background: #5B9BD5;
|
|
|
|
|
+ color: #fff;
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ justify-content: center;
|
|
|
|
|
+ font-size: 28rpx;
|
|
|
|
|
+ font-weight: 500;
|
|
|
|
|
+ margin-right: 20rpx;
|
|
|
|
|
+ flex-shrink: 0;
|
|
|
|
|
+}
|
|
|
|
|
+.adjust-panel .member-name {
|
|
|
|
|
+ font-size: 28rpx;
|
|
|
|
|
+ color: #333;
|
|
|
|
|
+}
|
|
|
</style>
|
|
</style>
|