feat: 后端版本迁移修改

This commit is contained in:
Blizzard
2026-05-24 01:38:28 +08:00
parent 058a575e10
commit f8d71ee800
29 changed files with 304 additions and 291 deletions
+107 -94
View File
@@ -71,120 +71,133 @@ Page({
fetchTodayTasks() {
request.get('/plant/todayTask').then(res => {
// Check if res is array (list of PlantTaskVO)
const list = Array.isArray(res) ? res : (res.list || []);
this.processTaskData(list);
// Backend returns flat CareTaskInfo list: [{id, plantId, planId, name, icon, targetAction, dueDate, status}]
const tasks = Array.isArray(res) ? res : (res.list || []);
this.processTaskData(tasks);
}).catch(err => {
console.error('Fetch tasks failed', err);
wx.stopPullDownRefresh();
});
},
processTaskData(plantTaskVOList) {
processTaskData(tasks) {
let totalPacketTasks = 0;
let completedPacketTasks = 0;
const groups = plantTaskVOList.map(vo => {
const plant = vo.MyPlant || vo.myPlant;
if (!plant) return null;
// Parse Image
let imageUrl = '';
if (plant.imgList && plant.imgList.length > 0) {
imageUrl = plant.imgList[0].url || '';
// Count stats from flat task list
tasks.forEach(t => {
totalPacketTasks++;
if (t.status == 2 || t.status == 3) {
completedPacketTasks++;
}
});
const plantGroup = {
plantName: plant.name,
plantImage: imageUrl,
tasks: [], // Placeholder, will fill below
hasOverdue: vo.hasExpired
};
// Group tasks by plantId, collect unique plant IDs
const plantTaskMap = {};
const plantIds = [];
tasks.forEach(t => {
if (!plantTaskMap[t.plantId]) {
plantTaskMap[t.plantId] = [];
plantIds.push(t.plantId);
}
plantTaskMap[t.plantId].push(t);
});
const rawTasks = vo.tasks || [];
// Fetch plant details for each unique plantId in parallel
Promise.all(plantIds.map(id =>
request.get('/plant/detail', { id }).catch(() => null)
)).then(plantDetails => {
const groups = [];
// 1. Update Global Counters
rawTasks.forEach(t => {
totalPacketTasks++;
if (t.status == 2 || t.status == 3) {
completedPacketTasks++;
plantIds.forEach((plantId, idx) => {
const plantDetail = plantDetails[idx];
const plant = plantDetail ? plantDetail.plant : null;
const imgList = plantDetail ? plantDetail.imgList : null;
const plantName = plant ? plant.name : '未知植物';
let imageUrl = '';
if (imgList && imgList.length > 0) {
imageUrl = imgList[0].url || '';
}
const rawTasks = plantTaskMap[plantId] || [];
// Check if any task is overdue
let hasOverdue = false;
const displayTasks = rawTasks
.filter(t => t.status == 1 || t.status == 2)
.map(t => {
const isCompleted = t.status == 2;
// Parse icon JSON
let taskIcon = null;
if (t.icon && t.icon.startsWith('{')) {
try { taskIcon = JSON.parse(t.icon); } catch (e) {}
}
// Check overdue (only for pending tasks)
let isOverdue = false;
let overdueDays = 0;
if (!isCompleted && t.dueDate) {
const due = new Date(t.dueDate);
const today = new Date();
today.setHours(0, 0, 0, 0);
if (due < today) {
isOverdue = true;
hasOverdue = true;
const diffTime = Math.abs(today - due);
overdueDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
}
}
return {
id: t.id,
taskType: t.name,
taskIcon: taskIcon,
isOverdue: isOverdue,
overdueDays: overdueDays,
plantName: plantName,
isCompleted: isCompleted,
original: t
};
});
if (displayTasks.length === 0) return;
groups.push({
plantName: plantName,
plantImage: imageUrl,
tasks: displayTasks,
hasOverdue: hasOverdue
});
});
// 2. Filter and Map Tasks for Display
const displayTasks = rawTasks
.filter(t => t.status == 1 || t.status == 2)
.map(t => {
// Status: 1 Pending, 2 Done
const isCompleted = t.status == 2;
// Calculate Progress
let progress = 0;
if (totalPacketTasks > 0) {
progress = Math.round((completedPacketTasks / totalPacketTasks) * 100);
}
// Parse Icon
let taskIcon = null;
if (t.icon && t.icon.startsWith('{')) {
try {
taskIcon = JSON.parse(t.icon);
} catch (e) { }
}
// Sorting Groups: Overdue first
groups.sort((a, b) => {
if (a.hasOverdue && !b.hasOverdue) return -1;
if (!a.hasOverdue && b.hasOverdue) return 1;
return 0;
});
// Check overdue (only for pending tasks)
let isOverdue = false;
let overdueDays = 0;
if (!isCompleted && t.dueDate) {
const due = new Date(t.dueDate);
const today = new Date();
today.setHours(0, 0, 0, 0);
this.setData({
groupedTasks: groups,
progress,
tasks: groups
});
if (due < today) {
isOverdue = true;
const diffTime = Math.abs(today - due);
overdueDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
}
}
return {
id: t.id,
taskType: t.name,
taskIcon: taskIcon,
isOverdue: isOverdue,
overdueDays: overdueDays,
plantName: plant.name,
isCompleted: isCompleted,
original: t
};
});
// Sorting Removed: Tasks stay in original order
// displayTasks.sort((a, b) => {
// if (a.isCompleted === b.isCompleted) return 0;
// return a.isCompleted ? 1 : -1;
// });
plantGroup.tasks = displayTasks;
if (plantGroup.tasks.length === 0) return null;
return plantGroup;
}).filter(g => g !== null);
// Calculate Progress
let progress = 0;
if (totalPacketTasks > 0) {
progress = Math.round((completedPacketTasks / totalPacketTasks) * 100);
}
// Sorting Groups: Overdue first
groups.sort((a, b) => {
if (a.hasOverdue && !b.hasOverdue) return -1;
if (!a.hasOverdue && b.hasOverdue) return 1;
return 0;
wx.stopPullDownRefresh();
}).catch(err => {
console.error('Fetch plant details failed', err);
wx.stopPullDownRefresh();
});
this.setData({
groupedTasks: groups,
progress,
tasks: groups
});
wx.stopPullDownRefresh();
},
handleTaskClick(e) {