diff --git a/components/index/ContentDashboard.vue b/components/index/ContentDashboard.vue index f4c69c9..bd0d7af 100644 --- a/components/index/ContentDashboard.vue +++ b/components/index/ContentDashboard.vue @@ -77,35 +77,67 @@ - + - 公告 + 公告与逾期任务 查看全部》 - - - - {{ announcement.title }} - - 置顶 - 一般 - 重要 - 紧急 + + + + + + + {{ item.title }} + + 置顶 + 一般 + 重要 + 紧急 + + + + + 👤 + {{ item.userName }} + + + 🕐 + {{ item.createTime }} + + - - - 👤 - {{ announcement.userName }} + + + + + + {{ item.firstOwner }} + - - 🕐 - {{ announcement.createTime }} + {{ item.description }} + + {{ item.project }} + 逾期{{ item.overdueDays }}天 + {{ item.date }} - + @@ -269,46 +301,70 @@ const getOwnerNames = (memberList) => { return memberList.map(member => member.userName || member.name || '').filter(name => name).join('、'); }; +// 计算逾期天数 +const calculateOverdueDays = (expireTime) => { + if (!expireTime) return 0; + const expireDate = new Date(expireTime); + const now = new Date(); + now.setHours(0, 0, 0, 0); + expireDate.setHours(0, 0, 0, 0); + const diffTime = now.getTime() - expireDate.getTime(); + const diffDays = Math.floor(diffTime / (1000 * 60 * 60 * 24)); + return diffDays > 0 ? diffDays : 0; +}; + // 加载逾期任务列表 const loadOverdueTasks = async () => { try { - const res = await getTaskList({ overdue: true, statusList: [1, 2] }); + const res = await getTaskList({ overdue: true,pageNum:1,pageSize:100, statusList: [1, 2] }); console.log('逾期任务列表加载成功:', res); // 根据实际返回的数据结构:{ total: 27, rows: [...], code: 200, msg: "查询成功" } if (res && res.rows && Array.isArray(res.rows)) { overdueTasks.value = res.rows.map((item) => { + const overdueDays = calculateOverdueDays(item.expireTime); return { id: item.id || '', date: formatDate(item.expireTime) || '', project: item.projectName || '', description: item.description || '', owner: getOwnerNames(item.memberList) || '', - releaseTime: formatDate(item.createTime) || '' + releaseTime: formatDate(item.createTime) || '', + expireTime: item.expireTime || '', // 保存原始过期时间用于排序 + overdueDays: overdueDays, + type: 'overdue' // 标记为逾期任务 }; }); } else if (res && res.data && Array.isArray(res.data)) { // 兼容 data 字段 overdueTasks.value = res.data.map((item) => { + const overdueDays = calculateOverdueDays(item.expireTime); return { id: item.id || '', date: formatDate(item.expireTime) || '', project: item.projectName || '', description: item.description || '', owner: getOwnerNames(item.memberList) || '', - releaseTime: formatDate(item.createTime) || '' + releaseTime: formatDate(item.createTime) || '', + expireTime: item.expireTime || '', + overdueDays: overdueDays, + type: 'overdue' }; }); } else if (res && Array.isArray(res)) { // 兼容直接返回数组的情况 overdueTasks.value = res.map((item) => { + const overdueDays = calculateOverdueDays(item.expireTime); return { id: item.id || '', date: formatDate(item.expireTime) || '', project: item.projectName || '', description: item.description || '', owner: getOwnerNames(item.memberList) || '', - releaseTime: formatDate(item.createTime) || '' + releaseTime: formatDate(item.createTime) || '', + expireTime: item.expireTime || '', + overdueDays: overdueDays, + type: 'overdue' }; }); } else { @@ -324,7 +380,7 @@ const loadOverdueTasks = async () => { // 加载公告列表 const loadAnnouncements = async () => { try { - const res = await getNoticeList({ pageNum: 1, pageSize: 2 }); + const res = await getNoticeList({ pageNum: 1, pageSize: 10 }); // 增加数量以便排序 console.log('公告列表加载成功:', res); if (res && res.rows && Array.isArray(res.rows)) { @@ -336,7 +392,8 @@ const loadAnnouncements = async () => { userName: item.userName || '', createTime: item.createTime || '', top: item.top || false, - level: item.level || '' + level: item.level || '', + type: 'announcement' // 标记为公告 }; }); } else { @@ -348,6 +405,43 @@ const loadAnnouncements = async () => { } }; +// 合并公告和逾期任务,并按时间排序 +const mergedList = computed(() => { + const list = []; + + // 添加公告 + announcements.value.forEach(item => { + list.push({ + ...item, + sortTime: item.createTime || '' // 公告使用创建时间排序 + }); + }); + + // 添加逾期任务 + overdueTasks.value.forEach(item => { + list.push({ + ...item, + sortTime: item.expireTime || '', // 逾期任务使用过期时间排序 + firstOwner: item.owner ? item.owner.split('、')[0] : '' // 只取第一个负责人 + }); + }); + + // 按时间排序(降序,最新的在前) + list.sort((a, b) => { + if (!a.sortTime && !b.sortTime) return 0; + if (!a.sortTime) return 1; // 没有时间的放后面 + if (!b.sortTime) return -1; // 没有时间的放后面 + const timeA = new Date(a.sortTime).getTime(); + const timeB = new Date(b.sortTime).getTime(); + if (isNaN(timeA) && isNaN(timeB)) return 0; + if (isNaN(timeA)) return 1; + if (isNaN(timeB)) return -1; + return timeB - timeA; + }); + + return list; +}); + // 加载看板数据 const loadDashboardData = async () => { try { @@ -759,6 +853,71 @@ const getTagCustomStyle = (status) => { margin-top: 8px; } +// 合并列表滚动容器 +.merged-list-scroll { + height: 30vh; + width: 100%; +} + +.merged-item { + margin-bottom: 12px; +} + +// 逾期任务卡片样式 +.overdue-task-card { + padding: 16px; + display: flex; + flex-direction: column; + gap: 12px; +} + +.overdue-task-header { + display: flex; + align-items: center; +} + +.overdue-task-owner-tag { + background: linear-gradient(135deg, #b794f6 0%, #9f7aea 100%); + color: #fff; + padding: 4px 12px; + border-radius: 12px; + font-size: 12px; + font-weight: 500; + white-space: nowrap; +} + +.overdue-task-title { + font-size: 16px; + font-weight: 500; + color: #333; + line-height: 1.5; + margin-top: 4px; +} + +.overdue-task-footer { + display: flex; + align-items: center; + gap: 12px; + flex-wrap: wrap; +} + +.overdue-task-project { + font-size: 12px; + color: #4a90e2; +} + +.overdue-task-status { + font-size: 12px; + color: #f56c6c; + font-weight: 500; +} + +.overdue-task-date { + font-size: 12px; + color: #666; + margin-left: auto; +} + .section-header { display: flex; align-items: center; diff --git a/utils/request/index.js b/utils/request/index.js index 668858f..329e31f 100644 --- a/utils/request/index.js +++ b/utils/request/index.js @@ -11,7 +11,7 @@ export const Request = () => { uni.$uv.http.setConfig((config) => { /* config 为默认全局配置*/ config.baseURL = 'http://192.168.1.4:4001'; /* 根域名 */ - // config.baseURL = 'https://pm.ccttiot.com/prod-api'; /* 根域名 */ + config.baseURL = 'https://pm.ccttiot.com/prod-api'; /* 根域名 */ return config })