实现公告和逾期任务的混排(排序依照:公告的创建时间与逾期任务的逾期时间进行混排)--目前负责人仅取一个
This commit is contained in:
parent
9e8d582e4c
commit
362dda52b0
|
|
@ -77,35 +77,67 @@
|
||||||
<!-- </view>-->
|
<!-- </view>-->
|
||||||
<!-- </view>-->
|
<!-- </view>-->
|
||||||
|
|
||||||
<!-- 公告事项 -->
|
<!-- 公告和逾期任务合并列表 -->
|
||||||
<view class="announcement-section">
|
<view class="announcement-section">
|
||||||
<view class="announcement-header">
|
<view class="announcement-header">
|
||||||
<text class="announcement-title-header">公告</text>
|
<text class="announcement-title-header">公告与逾期任务</text>
|
||||||
<text class="announcement-view-all" @click.stop="viewAllAnnouncements">查看全部》</text>
|
<text class="announcement-view-all" @click.stop="viewAllAnnouncements">查看全部》</text>
|
||||||
</view>
|
</view>
|
||||||
<view class="announcement-item task-card-base task-card-announcement" v-for="announcement in announcements" :key="announcement.id" @click="viewAnnouncement(announcement)">
|
<scroll-view class="merged-list-scroll" scroll-y>
|
||||||
<view class="announcement-content-wrapper">
|
<view
|
||||||
<view class="announcement-title-row">
|
v-for="item in mergedList"
|
||||||
<text class="announcement-title">{{ announcement.title }}</text>
|
:key="`${item.type}-${item.id}`"
|
||||||
<view class="announcement-tags">
|
class="merged-item"
|
||||||
<view class="announcement-tag tag-pinned" v-if="announcement.top">置顶</view>
|
>
|
||||||
<view class="announcement-tag tag-general" v-if="announcement.level === '1'">一般</view>
|
<!-- 公告样式 -->
|
||||||
<view class="announcement-tag tag-important" v-if="announcement.level === '2'">重要</view>
|
<view
|
||||||
<view class="announcement-tag tag-urgent" v-if="announcement.level === '3'">紧急</view>
|
v-if="item.type === 'announcement'"
|
||||||
|
class="announcement-item task-card-base task-card-announcement"
|
||||||
|
@click="viewAnnouncement(item)"
|
||||||
|
>
|
||||||
|
<view class="announcement-content-wrapper">
|
||||||
|
<view class="announcement-title-row">
|
||||||
|
<text class="announcement-title">{{ item.title }}</text>
|
||||||
|
<view class="announcement-tags">
|
||||||
|
<view class="announcement-tag tag-pinned" v-if="item.top">置顶</view>
|
||||||
|
<view class="announcement-tag tag-general" v-if="item.level === '1'">一般</view>
|
||||||
|
<view class="announcement-tag tag-important" v-if="item.level === '2'">重要</view>
|
||||||
|
<view class="announcement-tag tag-urgent" v-if="item.level === '3'">紧急</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view class="announcement-meta">
|
||||||
|
<view class="announcement-meta-item">
|
||||||
|
<text class="announcement-meta-icon">👤</text>
|
||||||
|
<text class="announcement-meta-text">{{ item.userName }}</text>
|
||||||
|
</view>
|
||||||
|
<view class="announcement-meta-item">
|
||||||
|
<text class="announcement-meta-icon">🕐</text>
|
||||||
|
<text class="announcement-meta-text">{{ item.createTime }}</text>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
<view class="announcement-meta">
|
|
||||||
<view class="announcement-meta-item">
|
<!-- 逾期任务卡片样式 -->
|
||||||
<text class="announcement-meta-icon">👤</text>
|
<view
|
||||||
<text class="announcement-meta-text">{{ announcement.userName }}</text>
|
v-else-if="item.type === 'overdue'"
|
||||||
|
class="overdue-task-card task-card-base"
|
||||||
|
@click="goToTaskDetail(item)"
|
||||||
|
>
|
||||||
|
<view class="overdue-task-header">
|
||||||
|
<view class="overdue-task-owner-tag" v-if="item.firstOwner">
|
||||||
|
{{ item.firstOwner }}
|
||||||
|
</view>
|
||||||
</view>
|
</view>
|
||||||
<view class="announcement-meta-item">
|
<view class="overdue-task-title">{{ item.description }}</view>
|
||||||
<text class="announcement-meta-icon">🕐</text>
|
<view class="overdue-task-footer">
|
||||||
<text class="announcement-meta-text">{{ announcement.createTime }}</text>
|
<text class="overdue-task-project">{{ item.project }}</text>
|
||||||
|
<text class="overdue-task-status">逾期{{ item.overdueDays }}天</text>
|
||||||
|
<text class="overdue-task-date">{{ item.date }}</text>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</scroll-view>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
<!-- 项目状态 -->
|
<!-- 项目状态 -->
|
||||||
|
|
@ -269,46 +301,70 @@ const getOwnerNames = (memberList) => {
|
||||||
return memberList.map(member => member.userName || member.name || '').filter(name => name).join('、');
|
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 () => {
|
const loadOverdueTasks = async () => {
|
||||||
try {
|
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);
|
console.log('逾期任务列表加载成功:', res);
|
||||||
|
|
||||||
// 根据实际返回的数据结构:{ total: 27, rows: [...], code: 200, msg: "查询成功" }
|
// 根据实际返回的数据结构:{ total: 27, rows: [...], code: 200, msg: "查询成功" }
|
||||||
if (res && res.rows && Array.isArray(res.rows)) {
|
if (res && res.rows && Array.isArray(res.rows)) {
|
||||||
overdueTasks.value = res.rows.map((item) => {
|
overdueTasks.value = res.rows.map((item) => {
|
||||||
|
const overdueDays = calculateOverdueDays(item.expireTime);
|
||||||
return {
|
return {
|
||||||
id: item.id || '',
|
id: item.id || '',
|
||||||
date: formatDate(item.expireTime) || '',
|
date: formatDate(item.expireTime) || '',
|
||||||
project: item.projectName || '',
|
project: item.projectName || '',
|
||||||
description: item.description || '',
|
description: item.description || '',
|
||||||
owner: getOwnerNames(item.memberList) || '',
|
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)) {
|
} else if (res && res.data && Array.isArray(res.data)) {
|
||||||
// 兼容 data 字段
|
// 兼容 data 字段
|
||||||
overdueTasks.value = res.data.map((item) => {
|
overdueTasks.value = res.data.map((item) => {
|
||||||
|
const overdueDays = calculateOverdueDays(item.expireTime);
|
||||||
return {
|
return {
|
||||||
id: item.id || '',
|
id: item.id || '',
|
||||||
date: formatDate(item.expireTime) || '',
|
date: formatDate(item.expireTime) || '',
|
||||||
project: item.projectName || '',
|
project: item.projectName || '',
|
||||||
description: item.description || '',
|
description: item.description || '',
|
||||||
owner: getOwnerNames(item.memberList) || '',
|
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)) {
|
} else if (res && Array.isArray(res)) {
|
||||||
// 兼容直接返回数组的情况
|
// 兼容直接返回数组的情况
|
||||||
overdueTasks.value = res.map((item) => {
|
overdueTasks.value = res.map((item) => {
|
||||||
|
const overdueDays = calculateOverdueDays(item.expireTime);
|
||||||
return {
|
return {
|
||||||
id: item.id || '',
|
id: item.id || '',
|
||||||
date: formatDate(item.expireTime) || '',
|
date: formatDate(item.expireTime) || '',
|
||||||
project: item.projectName || '',
|
project: item.projectName || '',
|
||||||
description: item.description || '',
|
description: item.description || '',
|
||||||
owner: getOwnerNames(item.memberList) || '',
|
owner: getOwnerNames(item.memberList) || '',
|
||||||
releaseTime: formatDate(item.createTime) || ''
|
releaseTime: formatDate(item.createTime) || '',
|
||||||
|
expireTime: item.expireTime || '',
|
||||||
|
overdueDays: overdueDays,
|
||||||
|
type: 'overdue'
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -324,7 +380,7 @@ const loadOverdueTasks = async () => {
|
||||||
// 加载公告列表
|
// 加载公告列表
|
||||||
const loadAnnouncements = async () => {
|
const loadAnnouncements = async () => {
|
||||||
try {
|
try {
|
||||||
const res = await getNoticeList({ pageNum: 1, pageSize: 2 });
|
const res = await getNoticeList({ pageNum: 1, pageSize: 10 }); // 增加数量以便排序
|
||||||
console.log('公告列表加载成功:', res);
|
console.log('公告列表加载成功:', res);
|
||||||
|
|
||||||
if (res && res.rows && Array.isArray(res.rows)) {
|
if (res && res.rows && Array.isArray(res.rows)) {
|
||||||
|
|
@ -336,7 +392,8 @@ const loadAnnouncements = async () => {
|
||||||
userName: item.userName || '',
|
userName: item.userName || '',
|
||||||
createTime: item.createTime || '',
|
createTime: item.createTime || '',
|
||||||
top: item.top || false,
|
top: item.top || false,
|
||||||
level: item.level || ''
|
level: item.level || '',
|
||||||
|
type: 'announcement' // 标记为公告
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
} else {
|
} 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 () => {
|
const loadDashboardData = async () => {
|
||||||
try {
|
try {
|
||||||
|
|
@ -759,6 +853,71 @@ const getTagCustomStyle = (status) => {
|
||||||
margin-top: 8px;
|
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 {
|
.section-header {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ export const Request = () => {
|
||||||
uni.$uv.http.setConfig((config) => {
|
uni.$uv.http.setConfig((config) => {
|
||||||
/* config 为默认全局配置*/
|
/* config 为默认全局配置*/
|
||||||
config.baseURL = 'http://192.168.1.4:4001'; /* 根域名 */
|
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
|
return config
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user