feat: 后端版本迁移修改
This commit is contained in:
+107
-94
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user