Browse Source

待办页面调整

dev-V1.10.2-temp
wangmingyong@163.com 3 months ago
parent
commit
18ba5ccc3a
  1. 16
      zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/enforce/enforcementChat.vue
  2. 2
      zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/enforce/enforcementNoticeList.vue
  3. 220
      zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/message/enforcementReserveList.vue
  4. 184
      zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/message/enforcementTaskList.vue
  5. 4
      zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/plan/cp_plan_edit.vue

16
zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/enforce/enforcementChat.vue

@ -83,7 +83,7 @@
@click="closeMenu"
@contextmenu.prevent
>
<div
<!-- <div
class="context-menu"
:style="{ top: menuPosition.y + 'px', left: menuPosition.x + 'px' }"
>
@ -96,7 +96,7 @@
<van-icon name="revoke" size="16" />
<span>撤回</span>
</div>
</div>
</div> -->
</div>
<!-- 底部输入区域 -->
@ -130,9 +130,9 @@ import { getNoticeMessages, addNoticeMessage } from '@/api/enforcement/notice';
const router = useRouter();
const route = useRoute();
const { useCommon } = $globalStore;
// ========== 从路由参数获取信息 ==========
const noticeId = route.query.id|| '';
const noticeId = route.query.noticeId|| '';
const bureauDeptName = ref(route.query.bureauDeptName || '深圳司法局');
const contactPerson = ref(route.query.contactPerson || '付明明 周昂');
const noticeTitle = ref(route.query.title || '安全生产检查');
@ -149,10 +149,10 @@ const loadMessageList = () => {
if (res && res.code === 200 && res.data) {
messageList.value = res.data.map(item => ({
id: item.id,
sender: item.sender === 'self' ? 'self' : 'other',
sender: item.userName == useCommon.userName ? 'self' : 'other',
content: item.content || item.message || '',
time: item.createTime || item.time || '',
avatar: item.sender === 'self' ? selfAvatar : otherAvatar,
avatar: item.userName == useCommon.userName ? selfAvatar : otherAvatar,
isRecalled: item.isRecalled || false,
}));
nextTick(() => scrollToBottom());
@ -334,7 +334,9 @@ const sendMessage = () => {
if (noticeId) {
addNoticeMessage({
noticeId,
content: text,
userId: useCommon.userId,
userName: useCommon.userName,
message: text,
}, (res) => {
if (res && res.code === 200) {
newMsg.id = res.data?.id || newMsg.id;

2
zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/enforce/enforcementNoticeList.vue

@ -25,7 +25,7 @@
<div class="notice-card" v-for="item in list" :key="item.id">
<div class="card-row time-row">
<span class="label">执法时间:</span>
<span class="value">{{ item.checkTime }}</span>
<span class="value">{{ item.enforceDate }}</span>
</div>
<div class="card-title">{{ item.checkItemText }}</div>
<div class="card-row">

220
zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/message/enforcementReserveList.vue

@ -13,28 +13,48 @@
<van-list v-model:loading="loading" :finished="finished" finished-text=""
@load="onLoad" :offset="50">
<van-empty v-if="finished && reserveList.length === 0" description="暂无预约" />
<div v-for="(item, index) in reserveList" :key="index" class="reserve-item">
<div class="reserve-time">{{ item.time }}</div>
<div class="reserve-card">
<!-- <div class="card-header">
<span class="reserve-type">待确认预约:</span>
</div> -->
<div class="reserve-type">待确认预约:</div>
<div class="card-body">
<div class="reserve-row">
<span class="reserve-label">{{ item.reserveUnit ? '预约单位' : '执法单位' }}</span>
<span class="reserve-value">{{ item.reserveUnit || item.bureauDeptName || '-' }}</span>
</div>
<div class="reserve-row">
<span class="reserve-label">企业名称</span>
<span class="reserve-value">{{ item.enterpriseName || '-' }}</span>
</div>
<div class="reserve-row">
<span class="reserve-label">检查时间</span>
<span class="reserve-value">{{ formatDate(item.planDate) }}</span>
</div>
<div v-for="(item, index) in reserveList" :key="index" class="reserve-item" @click="toDetail(item)">
<!-- 标题行 -->
<div class="item-title-row">
<div class="item-icon">
<svg viewBox="0 0 24 24" fill="currentColor">
<path d="M12 22c1.1 0 2-.9 2-2h-4c0 1.1.9 2 2 2zm6-6v-5c0-3.07-1.63-5.64-4.5-6.32V4c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v.68C7.64 5.36 6 7.92 6 11v5l-2 2v1h16v-1l-2-2zm-2 1H8v-6c0-2.48 1.51-4.5 4-4.5s4 2.02 4 4.5v6z"/>
</svg>
<span v-if="item.isRead === 0" class="unread-dot"></span>
</div>
<div class="item-content">
<div class="item-title">待确认预约</div>
<div class="info-row">
<!-- <div class="info-label">检查时间: </div> -->
<div class="info-value">{{ formatTime(item.planDate) }}</div>
</div>
</div>
<div class="item-footer">
<!-- <span class="item-time">{{ formatTime(item.planDate) }}</span> -->
<span class="item-action">
查看详情
<van-icon name="arrow" />
</span>
</div>
</div>
<!-- 内容 -->
<!-- <div class="item-summary">
<div class="info-row">
<span class="info-label">{{ item.reserveUnit ? '预约单位' : '执法单位' }}</span>
<span class="info-value">{{ item.reserveUnit || item.bureauDeptName || '-' }}</span>
</div>
<div class="info-row">
<span class="info-label">企业名称</span>
<span class="info-value">{{ item.enterpriseName || '-' }}</span>
</div>
<div class="info-row">
<span class="info-label">检查时间</span>
<span class="info-value">{{ formatDate(item.planDate) }}</span>
</div>
</div> -->
<!-- 底部信息 -->
</div>
</van-list>
</van-pull-refresh>
@ -113,6 +133,24 @@ const formatDate = (dateStr) => {
return dateStr.substring(0, 10);
};
// ========== 格式化时间 ==========
const formatTime = (val) => {
if (!val) return '';
const d = new Date(typeof val === 'string' ? val.replace(/-/g, '/') : val);
if (isNaN(d.getTime())) return val;
const y = d.getFullYear();
const m = String(d.getMonth() + 1).padStart(2, '0');
const day = String(d.getDate()).padStart(2, '0');
const h = String(d.getHours()).padStart(2, '0');
const mi = String(d.getMinutes()).padStart(2, '0');
return `${y}-${m}-${day} ${h}:${mi}`;
};
// ========== 跳转详情 ==========
const toDetail = (item) => {
showToast('查看详情');
};
const onLoad = () => {
if (loading.value || finished.value) return;
fetchReserveList();
@ -153,69 +191,125 @@ onMounted(() => {
display: flex;
flex-direction: column;
height: 100%;
background: #fbfdff;
}
background-color: #fbfdff;
.content-area {
flex: 1;
overflow-y: auto;
padding: 12px;
padding-top: 0px;
.content-area {
flex: 1;
overflow-y: auto;
padding: 0.27rem;
}
}
/* ===== 列表项样式 ===== */
.reserve-item {
margin-bottom: 16px;
background: #fff;
border-radius: 0.2rem;
padding:6px 10px;
margin-bottom: 0.27rem;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
}
.reserve-time {
font-size: 12px;
color: #999;
margin-bottom: 8px;
padding-left: 8px;
.item-title-row {
display: flex;
// align-items: center;
margin-bottom: 0.2rem;
.item-content{
width: 240px;
}
}
.reserve-card {
background: #fff;
border-radius: 12px;
padding: 12px 16px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
}
.item-icon {
width: 0.5rem;
height: 0.5rem;
min-width: 0.5rem;
margin-right: 0.15rem;
color: #2d94fa;
display: flex;
align-items: center;
justify-content: center;
position: relative;
svg {
width: 100%;
height: 100%;
}
.card-header {
margin-bottom: 8px;
.unread-dot {
position: absolute;
top: -0.05rem;
right: -0.05rem;
width: 0.12rem;
height: 0.12rem;
min-width: 0.12rem;
background-color: #ee0a24;
border-radius: 50%;
}
}
.reserve-type {
font-size: 14px;
font-weight: 600;
color: #333;
padding: 8px 0;
.item-title {
flex: 1;
font-size: 0.4rem;
font-weight: bold;
color: #1a1a1a;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.card-body {
padding-left: 4px;
.item-summary {
font-size: 0.32rem;
color: #666;
line-height: 1.6;
margin-bottom: 0.2rem;
// .info-row {
// display: flex;
// margin-bottom: 0.1rem;
// &:last-child {
// margin-bottom: 0;
// }
// }
.info-label {
color: #999;
min-width: 1.4rem;
flex-shrink: 0;
}
.info-value {
color: #666;
flex: 1;
}
}
.reserve-row {
.item-footer {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 10px;
&:last-child {
margin-bottom: 0;
}
}
.reserve-label {
font-size: 13px;
color: #666;
min-width: 60px;
flex-shrink: 0;
.item-time {
font-size: 0.3rem;
color: #999;
}
.reserve-value {
font-size: 13px;
color: #333;
flex: 1;
.item-action {
font-size: 0.3rem;
color: #999;
display: flex;
align-items: center;
:deep(.van-icon) {
font-size: 0.28rem;
margin-left: 0.05rem;
}
}
.info-row{
display: flex;
align-items: center;
font-size: 14px;
color: #999;
height: 24px;
}
</style>

184
zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/message/enforcementTaskList.vue

@ -14,27 +14,29 @@
<van-list v-model:loading="loading" :finished="finished" finished-text=""
@load="onLoad" :offset="50">
<van-empty v-if="finished && taskList.length === 0" description="暂无任务" />
<div v-for="(item, index) in taskList" :key="index" class="task-item">
<div class="task-time">{{ item.time }}</div>
<div class="task-card">
<!-- <div class="card-header">
<span class="task-type">待执行任务:</span>
</div> -->
<div class="task-type">待执行任务:</div>
<div class="card-body">
<div class="task-row">
<span class="task-label">企业名称</span>
<span class="task-value">{{ item.enterpriseName || '-' }}</span>
</div>
<div class="task-row">
<span class="task-label">检查时间</span>
<span class="task-value">{{ item.planDate || '-' }}</span>
</div>
<div class="task-row">
<span class="task-label">执法事项</span>
<span class="task-value">{{ item.enforceContent || '-' }}</span>
</div>
<div v-for="(item, index) in taskList" :key="index" class="task-item" @click="toDetail(item)">
<!-- 标题行 -->
<div class="item-title-row">
<div class="item-icon">
<svg viewBox="0 0 24 24" fill="currentColor">
<path d="M12 22c1.1 0 2-.9 2-2h-4c0 1.1.9 2 2 2zm6-6v-5c0-3.07-1.63-5.64-4.5-6.32V4c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v.68C7.64 5.36 6 7.92 6 11v5l-2 2v1h16v-1l-2-2zm-2 1H8v-6c0-2.48 1.51-4.5 4-4.5s4 2.02 4 4.5v6z"/>
</svg>
<span v-if="item.isRead === 0" class="unread-dot"></span>
</div>
<div class="item-content">
<div class="item-title">待执行任务</div>
<div class="info-row">
<!-- <div class="info-label">检查时间: </div> -->
<div class="info-value">{{ item.planDate || '-' }}</div>
</div>
</div>
<div class="item-footer">
<!-- <span class="item-time">{{ formatTime(item.createTime || item.time) }}</span> -->
<span class="item-action">
查看详情
<van-icon name="arrow" />
</span>
</div>
</div>
</div>
</van-list>
@ -66,6 +68,33 @@ const goBack = () => {
router.back();
};
// ========== 格式化时间 ==========
const formatTime = (val) => {
if (!val) return '';
const d = new Date(typeof val === 'string' ? val.replace(/-/g, '/') : val);
if (isNaN(d.getTime())) return val;
const y = d.getFullYear();
const m = String(d.getMonth() + 1).padStart(2, '0');
const day = String(d.getDate()).padStart(2, '0');
const h = String(d.getHours()).padStart(2, '0');
const mi = String(d.getMinutes()).padStart(2, '0');
return `${y}-${m}-${day} ${h}:${mi}`;
};
// ========== 跳转详情 ==========
const toDetail = (item) => {
if (!item.planDate) return;
const d = new Date(item.planDate);
router.push({
path: '/enforcement/task',
query: {
year: String(d.getFullYear()),
month: String(d.getMonth() + 1),
day: String(d.getDate()),
}
});
};
const fetchTaskList = () => {
loading.value = true;
const params = {
@ -157,69 +186,98 @@ onMounted(() => {
display: flex;
flex-direction: column;
height: 100%;
background: #fbfdff;
}
background-color: #fbfdff;
.content-area {
flex: 1;
overflow-y: auto;
padding: 12px;
padding-top: 0px;
.content-area {
flex: 1;
overflow-y: auto;
padding: 0.27rem;
}
}
/* ===== 列表项样式 ===== */
.task-item {
margin-bottom: 16px;
background: #fff;
border-radius: 0.2rem;
padding:6px 10px;
margin-bottom: 0.27rem;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
}
.task-time {
font-size: 12px;
color: #999;
margin-bottom: 8px;
padding-left: 8px;
.item-title-row {
display: flex;
// align-items: center;
margin-bottom: 0.2rem;
.item-content{
width: 240px;
}
}
.task-card {
background: #fff;
border-radius: 12px;
padding: 12px 16px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
}
.item-icon {
width: 0.5rem;
height: 0.5rem;
min-width: 0.5rem;
margin-right: 0.15rem;
color: #2d94fa;
display: flex;
align-items: center;
justify-content: center;
position: relative;
.card-header {
margin-bottom: 8px;
svg {
width: 100%;
height: 100%;
}
.unread-dot {
position: absolute;
top: -0.05rem;
right: -0.05rem;
width: 0.12rem;
height: 0.12rem;
min-width: 0.12rem;
background-color: #ee0a24;
border-radius: 50%;
}
}
.task-type {
.item-title {
flex: 1;
font-size: 14px;
font-weight: 600;
color: #333;
padding: 8px 0;
font-weight: bold;
color: #1a1a1a;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.item-footer {
display: flex;
justify-content: space-between;
align-items: center;
}
.card-body {
padding-left: 4px;
.item-time {
font-size: 0.3rem;
color: #ccc;
}
.task-row {
.item-action {
font-size: 0.3rem;
color: #999;
display: flex;
align-items: center;
margin-bottom: 10px;
&:last-child {
margin-bottom: 0;
:deep(.van-icon) {
font-size: 0.28rem;
margin-left: 0.05rem;
}
}
.task-label {
font-size: 13px;
color: #666;
min-width: 60px;
flex-shrink: 0;
}
.task-value {
font-size: 13px;
color: #333;
flex: 1;
.info-row{
display: flex;
align-items: center;
font-size: 14px;
color: #999;
height: 24px;
}
</style>

4
zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/plan/cp_plan_edit.vue

@ -1,11 +1,11 @@
<template>
<div class="plan-edit-page app_content">
<!-- 顶部导航 -->
<van-nav-bar
<!-- <van-nav-bar
:title="isEdit ? '编辑计划' : '新增计划'"
left-arrow
@click-left="onBack"
/>
/> -->
<div class="content">
<!-- 提示条 -->

Loading…
Cancel
Save