Files
threeonecheck_web/pages/index/index.vue
2026-01-18 16:06:37 +08:00

363 lines
10 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="content">
<view class="flex padding-top-xl padding-bottom-xl text-white " style="background-color:#007aff ;">
<view class="cu-avatar xl round margin-left">
<image></image>
</view>
<view class="padding-left">
<view class="text-bold">{{ userInfo.deptName || '未知部门' }}</view>
<view class="flex padding-top-xs">
<view>用户</view>
<view>{{ userInfo.nickName || userInfo.username || '未登录' }}</view>
</view>
<view class="flex justify-between">
<view></view>
<view class="cu-btn text-blue margin-top text-bold">切换</view>
</view>
</view>
</view>
<view class="padding" style="background: #EBF2FC;">
<view class="bg-white padding radius">
<view class="flex margin-bottom-xl">
<view class="border-tite"></view>
<view class="margin-left-xs text-bold " >功能菜单</view>
</view>
<view class=" grid col-3 ">
<view class="list " v-for="(item, index) in infoList" :key="index" @click="handleMenuClick(item)">
<image style="width: 102rpx;height: 102rpx;" :src="item.src"></image>
<view>{{ item.name}}</view>
</view>
</view>
</view>
<!-- 我的检查计划 -->
<view class="padding bg-white margin-top radius">
<view class="flex margin-bottom-xl">
<view class="border-tite"></view>
<view class="text-bold margin-left-xs">我的检查计划</view>
</view>
<!-- 无数据提示 -->
<view v-if="checkPlanData.length === 0" class="text-center text-gray padding">
暂无检查计划
</view>
<!-- 列表渲染 -->
<view class="list-list padding margin-bottom" v-for="(item, index) in checkPlanData" :key="item.id">
<view class="flex">
<image src="/static/蒙版组 273.png" style="width: 40rpx;height: 40rpx;"></image>
<view class="text-bold margin-left">{{ item.name }}</view>
</view>
<view class="flex margin-top">
<view class="border-border margin-right-xs">{{ item.runModeName }}完成</view>
<view class="border-border">{{ item.cycle }}</view>
</view>
<view class="flex text-gray margin-top">
<view>计划时间</view>
<view>{{ formatDate(item.planStartTime) }}{{ formatDate(item.planEndTime) }}</view>
</view>
<view class="flex margin-top align-center">
<view>完成进度</view>
<view class="flex align-center margin-left-sm">
<view class="cu-progress round">
<view class="bg-green" :style="{ width: item.progress + '%' }"></view>
</view>
<text class="margin-left-sm">{{ item.progress }}%</text>
</view>
</view>
<view class="grid col-4 bg-gray margin padding text-center radius">
<view>
<view class="text-orange">{{ item.totalCount }}</view>
<view>总数</view>
</view>
<view>
<view class="text-yellow">{{ item.totalCount - item.finishedCount }}</view>
<view>待完成</view>
</view>
<view>
<view class="text-olive">0</view>
<view>待验收</view>
</view>
<view>
<view class="text-blue">{{ item.finishedCount }}</view>
<view>已完成</view>
</view>
</view>
<view class="margin-top margin-bottom flex justify-end">
<button class="cu-btn round lg light bg-blue margin-right" @click.stop="ViewDetails(item)">查看详情</button>
<button class="cu-btn round lg bg-blue" @click.stop="goDetails(item)">开始检查</button>
</view>
</view>
</view>
<!-- 我的隐患 -->
<view class="padding bg-white margin-top radius" >
<view class="flex margin-bottom-xl ">
<view class="border-tite"></view>
<view class="text-bold margin-left-xs">我的隐患排查</view>
</view>
<view class="list-list padding margin-bottom" v-for="(item,index) in hiddenDangerData" :key="item.id" @click="HazardList()">
<view class="flex text-bold">
<view>隐患</view>
<view class="text-bold margin-left">#15</view>
</view>
<view class="flex margin-top">
<view class="text-gray">标题</view>
<view>{{item.title}}</view>
</view>
<view class="flex margin-top">
<view class="text-gray">隐患来源</view>
<view>{{item.source}}</view>
</view>
<view class="flex margin-top">
<view class="text-gray" style="white-space: nowrap;">隐患位置</view>
<view>{{item.address}}</view>
</view>
<view class="flex margin-top">
<view class="text-gray">隐患等级</view>
<view>{{item.levelName}}</view>
</view>
<view class="flex margin-top">
<view class="text-gray">隐患状态</view>
<view>{{item.statusName}}</view>
</view>
<view class="flex margin-top">
<view class="text-gray">发现时间</view>
<view>{{item.createdAt}}</view>
</view>
<view class="margin-top margin-bottom flex" style="gap: 5rpx;">
<button class="cu-btn round lg light bg-blue " style="white-space: nowrap;">查看详情</button>
<button class="cu-btn round lg light bg-blue " style="white-space: nowrap;">立即整改</button>
<button class="cu-btn round lg bg-blue " style="white-space: nowrap;">立即验收</button>
</view>
</view>
</view>
</view>
</view>
</template>
<script setup>
import { ref, reactive } from 'vue';
import { onLoad } from '@dcloudio/uni-app';
import {getCheckPlanList,getHiddenDangerList} from '@/request/api.js'
const loading = ref(true);
// 用户信息
const userInfo = reactive({
userId: '',
username: '',
nickName: '',
deptId: '',
deptName: ''
});
// 获取用户信息
const getUserInfo = () => {
try {
const storedUserInfo = uni.getStorageSync('userInfo');
if (storedUserInfo) {
const info = JSON.parse(storedUserInfo);
userInfo.userId = info.userId || '';
userInfo.username = info.username || '';
userInfo.nickName = info.nickName || '';
userInfo.deptId = info.deptId || '';
userInfo.deptName = info.deptName || '';
}
} catch (e) {
console.error('获取用户信息失败:', e);
}
};
const infoList = ref([{
name: '成员管理',
src: '../../static/组 19378.png'
},
{
name: '企业信息填报',
src: '../../static/组 19387.png'
},
{
name: '区域设置',
src: '../../static/组 20253.png'
},
{
name: '检查表',
src: '../../static/组 20254.png'
},
{
name: '检查记录',
src: '../../static/组 20255.png'
},
{
name: '证照管理',
src: '../../static/组 20256.png'
},
{
name: '隐患排查',
src: '../../static/组 20257.png'
},
{
name: '隐患销号申请',
src: '../../static/组 20258.png'
},
{
name: '设备登记',
src: '../../static/组 20259.png'
}
]);
const ViewDetails = (item) => {
uni.navigateTo({
url: `/pages/plandetail/plandetail?id=${item.id}`
})
}
const goDetails = (item) => {
uni.navigateTo({
url: `/pages/Inspectionresult/Inspectionresult?id=${item.id}`
})
}
// 菜单点击跳转
const handleMenuClick = (item) => {
const menuRoutes = {
'成员管理': '/pages/membermanagemen/membermanagemen',
'企业信息填报': '/pages/corporateInformation/corporateInformation',
'区域设置':'/pages/area/management',
'检查表' :'/pages/checklist/checklist',
'检查记录': '/pages/Inspectionlog/Inspectionlog',
'证照管理': '/pages/Idphotomanagement/Idphotomanagement',
'隐患排查':'/pages/hiddendanger/Inspection',
'隐患销号申请':'/pages/closeout/application',
'设备登记':'/pages/equipmentregistration/equipmentregistration',
// 可以在这里添加其他菜单的跳转路径
};
const url = menuRoutes[item.name];
if (url) {
uni.navigateTo({ url });
} else {
uni.showToast({ title: '功能开发中', icon: 'none' });
}
}
//我的检查计划
const checkPlanParams = ref({
pageNum: 1,
pageSize: 10,
name: ''
});
const checkPlanData = ref([]);
const getCheckPlanLists = async () => {
try {
const res = await getCheckPlanList(checkPlanParams.value);
console.log(res);
if (res.code === 0) {
checkPlanData.value = res.data.records;
}
} catch (error) {
console.error(error);
} finally {
loading.value = false;
}
};
// 格式化日期 (2025-12-18 00:00:00 -> 2025-12-18)
const formatDate = (dateStr) => {
if (!dateStr) return '';
return dateStr.split(' ')[0];
};
// 页面加载时调用接口
onLoad(() => {
getUserInfo();
getCheckPlanLists();
});
//我的隐患排查
const hiddenDangerParams = ref({
pageNum: 1,
pageSize: 10,
name: ''
});
const hiddenDangerData = ref([]);
const getHiddenDangerLists = async () => {
try {
const res = await getHiddenDangerList(hiddenDangerParams.value);
console.log(res);
if (res.code === 0) {
hiddenDangerData.value = res.data.records;
console.log(hiddenDangerData.value,1111);
}
} catch (error) {
console.error(error);
} finally {
loading.value = false;
}
};
// 页面加载时调用接口
onLoad(() => {
getHiddenDangerLists();
});
</script>
<style lang="scss" scoped>
.content {}
.grid-list {
gap: 30rpx;
margin-top: 30rpx;
}
.list {
background: #F2F6FF;
box-shadow: 0rpx 4rpx 8rpx 2rpx #CADDFC;
border-radius: 10rpx;
text-align: center;
padding: 20rpx 0;
}
.list-list {
background: #FFFFFF;
box-shadow: 0rpx 2rpx 6rpx 2rpx rgba(0, 0, 0, 0.08);
border-left: 5px solid #2667E9;
border-radius: 20rpx;
padding: 20rpx;
}
.border-tite {
width: 10rpx;
height: 32rpx;
background: #2667E9;
border-radius: 10rpx 10rpx 10rpx 10rpx;
}
.cu-progress {
width: 300rpx;
height: 20rpx;
background: #ebeef5;
border-radius: 100rpx;
overflow: hidden;
view {
height: 100%;
border-radius: 100rpx;
transition: width 0.3s ease;
}
}
.bg-green {
background: #2667E9;
}
.border-border {
padding: 10rpx;
background: #EEF3FF;
border-radius: 4rpx 4rpx 4rpx 4rpx;
border: 2rpx solid #AAC5FC;
text-align: center;
justify-content: center;
align-items: center;
display: flex;
font-size: 28rpx;
color: #2667E9;
}
</style>