Compare commits

...

6 Commits

Author SHA1 Message Date
8459d36259 首页项目信息、人员管理字段更改 2024-09-11 18:05:11 +08:00
5e3e531946 flx:修改接口 2024-09-10 17:50:33 +08:00
0961b82958 flx:提交项目后台跳转配置 2024-09-10 17:40:45 +08:00
f1449f587d 网诚需求 2024-09-10 16:17:06 +08:00
71638c10ea 合并冲突 2024-09-02 10:04:23 +08:00
92856d4cc0 四川网城需求提交 2024-09-02 09:57:34 +08:00
21 changed files with 1994 additions and 531 deletions

View File

@ -3,8 +3,8 @@ NODE_ENV = 'development'
# 本地环境接口地址(/api/index.ts文件中使用)
# 后端本地
# VITE_API_URL = 'http://192.168.34.155:19111'
VITE_API_URL = 'http://192.168.34.221:9111' #雄哥本地
VITE_API_URL = 'http://192.168.34.155:19111'
# VITE_API_URL = 'http://192.168.34.221:9111' #雄哥本地
# VITE_API_URL = 'http://182.90.224.237:51234' #雄哥远程
# VITE_API_URL = 'http://192.168.34.221:28889'
# VITE_API_URL = 'http://121.196.214.246/api'
@ -41,12 +41,13 @@ VITE_API_URL = 'http://192.168.34.221:9111' #雄哥本地
# 四川网诚
# VITE_API_URL = 'http://jxj.zhgdyun.com:100'
# VITE_API_URL = 'http://jxj.zhgdyun.com:34568'
# VITE_API_URL = 'http://192.168.9.249:9820'
# 九柱集团
# VITE_API_URL = 'http://218.95.151.122:31004'
# 包头化工
# VITE_API_URL = 'http://jxj.zhgdyun.com:18000'
# 大连金笔
VITE_API_URL = 'http://101.43.164.214:11126'
# VITE_API_URL = 'http://101.43.164.214:11126'
# 上传
VITE_ULD_API_URL = 'http://192.168.34.155:8012/onlinePreview?url='

View File

@ -36,13 +36,13 @@ NODE_ENV = "production"
# 同济
# VITE_API_URL = 'http://192.168.110.220:9809'
# 四川网诚
# VITE_API_URL = 'http://192.168.9.249:9820'
VITE_API_URL = 'http://192.168.9.249:9820'
# 九柱集团
# VITE_API_URL = 'http://218.95.151.122:31004'
# 包头化工
# VITE_API_URL = 'http://jxj.zhgdyun.com:18000'
# 大连金笔
VITE_API_URL = 'http://101.43.164.214:11126'
# VITE_API_URL = 'http://101.43.164.214:11126'
# 打包
VITE_ULD_API_URL = 'http://jxj.zhgdyun.com:8012/onlinePreview?url='

13
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,13 @@
{
"leek-fund.binance": [
"BTC_USDT",
"ETH_USDT",
"EOS_USDT"
],
"leek-fund.statusBarStock": [
"sh000001"
],
"leek-fund.stockGroups": [
"My Stocks"
]
}

View File

@ -26,6 +26,10 @@ export const getRealTimeDustNoiseDataApi = (params: {}) => {
export const getWeatherDataApi = (params: {}) => {
return http.post(BASEURL + `/xmgl/airQualityAnalysis/getWeatherData`, params);
};
//查询列表天气数据
export const getWeatherList = (params: {}) => {
return http.post(BASEURL + `/xmgl/weather/page`, params);
};
//查询绿色设备最新10条报警数据信息
export const selectNewEnvironmentAlarmListApi = (params: {}) => {

View File

@ -29,8 +29,13 @@ export const getCompanyDataList = (params: {}) => {
export const getPersonTypeAndEduStatisticsApi = (params: {}) => {
return http.post(BASEURL + `/xmgl/workerInfo/selectPersonTypeAndEduStatistics`, params, { headers: { noLoading: true } });
};
//查询人员统计
export const getCountEntryAndExitNum = (params: {}) => {
return http.post(BASEURL + `/xmgl/workerInfo/countEntryAndExitNum`, params, { headers: { noLoading: true } });
};
//查询今日作业人员趋势
export const getQueryTodayAttendanceTrendApi = (params: {}) => {
// return http.get(BASEURL + `/xmgl/workerAttendance/queryYearAttendanceTrend`, params, { headers: { noLoading: true } });
return http.get(BASEURL + `/xmgl/workerAttendance/queryTodayAttendanceTrend`, params, { headers: { noLoading: true } });
};

View File

@ -13,9 +13,9 @@ export const getWorkerStatisticsCountApi = (params: {}) => {
};
// 安全管理
export const getProjectInspectRecordCountApi = (params: {}) => {
export const getProjectInspectRecordCountApi = (params: {}, noLoading: boolean) => {
return http.post(BASEURL + `/xmgl/hiddenDangerInspectRecord/getProjectInspectRecordCount`, params, {
headers: { noLoading: true }
headers: { noLoading }
});
};
@ -50,8 +50,8 @@ export const getStageOption = (params: {}, showLoading: boolean) => {
};
//甘特图-列表查询任务进度
export const getParentChildTaskListApi = (params: {}) => {
return http.post(BASEURL + `/xmgl/taskProgress/getParentChildList`, params);
export const getParentChildTaskListApi = (params: {}, showLoading: boolean) => {
return http.post(BASEURL + `/xmgl/taskProgress/getParentChildList`, params, { headers: { noLoading: showLoading } });
};
// 隐患统计智能分析

View File

@ -29,8 +29,8 @@ export const BASE_IMAGE_URL = import.meta.env.VITE_BASE_IMAGE_URL;
// export const COMPANY: string = "as"; //鞍山项目
// export const COMPANY: string = "agjt"; //鞍钢集团
// export const COMPANY: string = "tj"; // 同济项目
// export const COMPANY: string = "scwc"; // 四川网诚项目
export const COMPANY: string = "dljb"; // 大连金笔项目
export const COMPANY: string = "scwc"; // 四川网诚项目
// export const COMPANY: string = "dljb"; // 大连金笔项目
// export const COMPANY: string = "agjtLive"; //鞍钢集团现场大屏
// export const COMPANY: string = "bthg"; //包头化工
// export const COMPANY: string = "agjtCommand"; //鞍钢集团指挥部大屏

View File

@ -1584,35 +1584,19 @@ export const TJMenu: Array<any> = [
]; //同济大屏
export const SCWCMenu: Array<any> = [
{
moduleName: "综合管理",
modulePath: "/projectOverview",
menuList: [
{
menuName: "工程概况",
companyPath: "/projectOverview"
},
{
menuName: "智慧党建",
companyPath: "/smartPartyBuilding"
}
]
moduleName: "综合态势",
modulePath: "/projectOverview"
},
{
moduleName: "数字工地",
modulePath: "/videoManagement",
menuList: [
{
menuName: "视频管理",
companyPath: "/videoManagement"
},
{
menuName: "AI预警",
companyPath: "/aIEarlyWarning"
}
]
moduleName: "进度管理",
modulePath: "/schedulePlan"
},
{
moduleName: "劳务管理",
moduleName: "质量管理",
modulePath: "/qualityManagement"
},
{
moduleName: "人员管理",
modulePath: "/laborManagement"
},
{
@ -1626,62 +1610,25 @@ export const SCWCMenu: Array<any> = [
{
menuName: "高支模监测",
companyPath: "/highFormwork"
},
{
menuName: "塔吊监测",
companyPath: "/towerCraneMonitoring"
}
]
},
{
moduleName: "质量管理",
modulePath: "/qualityManagement",
menuList: [
{
menuName: "质量管理",
companyPath: "/qualityManagement"
},
{
menuName: "进度计划",
companyPath: "/schedulePlan"
}
]
moduleName: "环境管理",
modulePath: "/headNoise"
},
{
moduleName: "行为管理",
modulePath: "/aIEarlyWarning"
},
{
moduleName: "视频监控",
modulePath: "/videoManagement",
menuList: [
{
menuName: "视频监控",
companyPath: "/videoManagement"
}
]
},
{
moduleName: "绿色施工",
modulePath: "/headNoise",
menuList: [
{
menuName: "环境监测",
companyPath: "/headNoise"
},
{
menuName: "塔吊监测",
companyPath: "/towerCraneMonitoring"
},
{
menuName: "高支模监测",
companyPath: "/highFormwork"
}
]
},
{
moduleName: "大型机械",
modulePath: "/towerCraneMonitoring",
menuList: [
{
menuName: "塔吊监测",
companyPath: "/towerCraneMonitoring"
}
]
},
{ moduleName: "BIM模型", modulePath: "/bImModel" }
modulePath: "/videoManagement"
}
]; //四川网诚
export const BTHGMenu: Array<any> = [
{

View File

@ -128,8 +128,8 @@ watch(
);
//option
const getProgressOption = async () => {
const res: any = await getStageOption({ dictionaryEncoding: "project_construction_stage", projectSn: store.sn });
const getProgressOption = async (noLoading = false) => {
const res: any = await getStageOption({ dictionaryEncoding: "project_construction_stage", projectSn: store.sn }, noLoading);
if (res.result.length > 0) {
let newArray = res.result.map((item: any) => {
return {

View File

@ -0,0 +1,386 @@
<template>
<div class="leftTop">
<Card title="项目展示">
<div class="top-tab" v-if="COMPANY === 'agjt'">
<div
class="tab-box"
:style="boxStyle(item)"
v-for="(item, index) in topText2"
:key="item.id"
@click="activeBtn(item, index)"
>
{{ item.title }}
</div>
</div>
<div class="top-tab" v-else>
<div
class="tab-box"
:style="boxStyle(item)"
v-for="(item, index) in topText"
:key="item.id"
@click="activeBtn(item, index)"
>
{{ item.title }}
</div>
</div>
<div class="href-content" v-if="showVideo == 1">
<el-carousel indicator-position="none" height="450px" style="width: 76%;">
<el-carousel-item v-for="(item, index) in videoList" :key="item.id">
<ckplayerComp
:name="index"
:poster="''"
:deviceIp="`http://${item.account}:${item.password}`"
:videoUrls="item.serialNumber"
:autoPlay="true"
></ckplayerComp>
</el-carousel-item>
</el-carousel>
</div>
<div class="videoBox" v-if="showVideo == 2" @mouseenter="showChangeVideo = true" @mouseleave="showChangeVideo = false">
<el-upload
:action="BASEURL + '/upload/image'"
:on-success="file => handleSuccessTwo(file, 1)"
:on-error="file => handleError(file, 1)"
:beforeUpload="file => handleBeforeUploadVideo(file, 1)"
name="files"
:show-file-list="false"
>
<!-- 更换视频 -->
<span class="change-video" v-if="showChangeVideo">更换视频</span>
</el-upload>
<video :src="BASEURL + '/image/' + projectData.videoUrl" class="videos" autoplay controls loop></video>
</div>
<div class="imgBox" v-if="showVideo == 3">
<div class="imgs" @mouseenter="showChangeImg = true" @mouseleave="showChangeImg = false">
<el-upload
:action="BASEURL + '/upload/image'"
:on-success="file => handleSuccess(file, 1)"
:on-error="file => handleError(file, 1)"
:beforeUpload="file => handleBeforeUploadPic(file, 1)"
name="files"
:show-file-list="false"
>
<!-- 更换图片 -->
<span class="change-video" v-if="showChangeImg">更换图片</span>
</el-upload>
<img :src="BASEURL + '/image/' + picUrl" alt="" />
</div>
</div>
</Card>
</div>
</template>
<script setup lang="ts">
import Card from "@/components/card.vue";
import { ref, onMounted, watch } from "vue";
import { GlobalStore } from "@/stores";
import { ElMessage } from "element-plus";
import { editProjectInfo, eidtProjectShowConfig, queryBySnData } from "@/api/modules/projectOverview";
import { selectLiveVideoListApi } from "@/api/modules/video";
import ckplayerComp from "./ckplayerComp.vue";
import { COMPANY } from "@/config/config";
const store = GlobalStore();
const videoList = ref([] as any);
// ts
type Props = {
projectData?: any; //
};
// withDefaults ()
const props = withDefaults(defineProps<Props>(), {
projectData: {}
});
//
const projectData = ref({} as any);
watch(
() => props.projectData,
newVal => {
// console.log(newVal, "newVal");
if (newVal) {
// props.xData = newVal;
projectData.value = newVal;
}
}
);
//
const picUrl = ref("" as any);
const BASEURL = import.meta.env.VITE_API_URL;
//
const showVideo = ref(1 as any);
//
const showChangeImg = ref(false as any);
//
const showChangeVideo = ref(false as any);
let topText2 = ref([
{ id: 1, title: "现场视频", isActive: true },
{ id: 2, title: "宣传视频", isActive: false },
{ id: 3, title: "效果图", isActive: false }
]);
let topText = ref([
// { id: 1, title: "", isActive: true },
{ id: 2, title: "宣传视频", isActive: true },
{ id: 3, title: "效果图", isActive: false }
]);
const getVideoList = async () => {
let res: any = await selectLiveVideoListApi({
projectSn: store.sn
});
console.log(res,'445566')
if(res.result && res.result.extend1){
videoList.value = JSON.parse(res.result.extend1).result.videoList;
console.log(videoList.value,'112233')
// 使
setTimeout(() => {
// video
var videos = document.querySelectorAll(".href-content video")
// var videos = document.getElementsByTagName("video");
// video
for (var i = 0; i < videos.length; i++) {
//
videos[i].style.width = "99.9%";
videos[i].style.height = "99.9%";
}
}, 2000);
}
};
function boxStyle(item: any) {
if (item.isActive) {
let choiseStyle = {
color: "#fff"
};
return choiseStyle;
}
return {};
}
let tabIndex = ref(1 as any);
function activeBtn(item: any) {
let currentState = item.isActive;
if (!currentState) {
topText.value.forEach(el => {
el.isActive = false;
});
item.isActive = !currentState;
tabIndex.value = item.id;
}
showVideo.value = item.id;
console.log(showVideo.value)
}
const uploadFail = () => {
ElMessage({
showClose: true,
message: "上传失败,请重试",
type: "warning"
});
};
const fileTypeFail = (text: any) => {
ElMessage({
showClose: true,
message: text,
type: "warning"
});
};
const uploadSuccess = () => {
ElMessage({
showClose: true,
message: "上传成功",
type: "success"
});
};
//
function handleBeforeUploadVideo(file: any) {
console.log(file, "上传之前");
let fileType = file.type.split("/")[0];
if (fileType == "video") {
return true;
} else {
fileTypeFail("请选择正确的视频文件"); //""
return false;
}
}
//
function handleBeforeUploadPic(file: any) {
console.log(file, "上传之前");
let fileType = file.type.split("/")[0];
if (fileType == "image") {
return true;
} else {
fileTypeFail("请选择正确的图片文件"); //""
return false;
}
}
//
function handleError(file: any) {
console.log(file, "上传失败");
uploadFail(); //""
}
//
function handleSuccess(file: any) {
console.log("效果图上传成功", file);
if (file.code == 200 || file.status == "SUCCESS") {
console.log(file);
let url = file.data[0].imageUrl;
saveEffectData(url);
}
}
//
function handleSuccessTwo(file: any) {
if (file.code == 200 || file.status == "SUCCESS") {
console.log(file, "上传成功");
let url = file.data[0].imageUrl;
// this.imgUrl = url;
saveOrDeleteVideo(url);
}
}
//
function saveEffectData(url: any) {
// let configValue = JSON.stringify(url);
let data = {
projectSn: store.sn,
showType: 3,
showTitle: "效果图", //''
configValue: url
};
eidtProjectShowConfig(data).then((res: any) => {
if (res.code == 200) {
getQueryBySnData();
}
});
}
//
function getQueryBySnData() {
queryBySnData({
projectSn: store.sn,
showType: 3
}).then((res: any) => {
console.log(res, "效果图");
if (res.result) {
picUrl.value = res.result.configValue;
}
});
}
// //
function saveOrDeleteVideo(url) {
editProjectInfo({
projectSn: store.sn,
videoUrl: url
}).then(res => {
console.log("保存成功", res);
uploadSuccess(); //""
projectData.value.videoUrl = url;
});
}
//
defineExpose({
getQueryBySnData
})
onMounted(async () => {
if(COMPANY !== 'agjt') showVideo.value = 2
await getVideoList();
getQueryBySnData();
if(COMPANY != 'agjt'){
showVideo.value = 2;
}
});
</script>
<style lang="scss" scoped>
.leftTop {
width: 100%;
height: 100%;
position: relative;
.videoBox {
width: 100%;
height: 92%;
margin-top: 8%;
background: url("@/assets/images/comprehensiveManage/project10.png") no-repeat;
background-size: 100% 100%;
.videos {
width: 78%;
height: 90%;
margin-left: 11%;
margin-top: 1%;
}
}
.imgBox {
width: 100%;
height: 92%;
margin-top: 8%;
background: url("@/assets/images/comprehensiveManage/project10.png") no-repeat;
background-size: 100% 100%;
.imgs {
width: 78%;
height: 82%;
margin: 3% 11%;
img {
width: 100%;
height: 100%;
margin-top: 5%;
}
}
}
.href-content {
width: 100%;
height: 92%;
margin-top: 8%;
background: url("@/assets/images/comprehensiveManage/project10.png") no-repeat;
background-size: 100% 100%;
display: flex;
align-items: center;
justify-content: center;
}
}
// .href-content {
// width: 95%;
// height: 92%;
// margin: 0 auto;
// margin-top: 8%;
// }
.change-video {
position: absolute;
background: url("@/assets/images/cardImg.png") no-repeat;
background-size: 100% 100%;
color: #fff;
padding: 1% 2%;
font-size: 16px;
left: 45%;
top: 55%;
z-index: 10;
}
.top-tab {
position: absolute;
top: 12%;
width: 100%;
box-sizing: border-box;
padding: 0 30%;
display: flex;
justify-content: space-around;
.tab-box {
font-size: 16px;
color: rgba(255, 255, 255, 0.3);
cursor: pointer;
}
}
::v-deep .h-card .content {
background: none;
}
</style>

View File

@ -6,8 +6,8 @@
<leftBottom :statisticsCount="statisticsCount" class="leftBottom"></leftBottom>
</div>
<div class="center">
<centerTop :projectData="projectData" class="centerTop" ref="centerTopRef"></centerTop>
<centerBottom :projectData="projectData" class="centerBottom" ref="centerBottomRef"></centerBottom>
<centerTop :projectData="projectData" class="centerTop" ref="centerTopRef"></centerTop>
</div>
<div class="right">
<rightTop class="rightTop" ref="rightTopRef"></rightTop>
@ -29,13 +29,13 @@ import rightBottom from "@/views/sevenLargeScreen/comprehensiveManage/projectOve
import { GlobalStore } from "@/stores";
const store = GlobalStore();
import { getWorkerStatisticsCountApi, getProjectDetail } from "@/api/modules/projectOverview";
import { ref, onMounted, onBeforeUnmount,nextTick } from "vue";
import { ref, onMounted, onBeforeUnmount, nextTick } from "vue";
const statisticsCount = ref(null as any);
const projectData = ref(null as any);
//
const getProjectInfo = async () => {
const res = await getProjectDetail({ projectSn: store.sn });
const getProjectInfo = async (noLoading = false) => {
const res = await getProjectDetail({ projectSn: store.sn }, noLoading);
// console.log("", res);
// console.log("", projectTypeEnum);
projectData.value = res.result;
@ -54,39 +54,39 @@ const rightTopRef = ref();
const rightCenterRef = ref();
const rightBottomRef = ref();
const callChildFn = async () => {
nextTick( async ()=>{
leftTopRef.value.projectTypeEnum()
centerTopRef.value.getQueryBySnData()
centerBottomRef.value.getProgressOption()
rightTopRef.value.getSafeInfo()
rightCenterRef.value.qualityInfo()
rightBottomRef.value.getList()
})
}
nextTick(async () => {
leftTopRef.value.projectTypeEnum(true);
centerTopRef.value.getDataList(true);
centerBottomRef.value.getProgressOption(true);
rightTopRef.value.getSafeInfo(true);
rightCenterRef.value.qualityInfo();
rightBottomRef.value.getList();
});
};
//
const interval = ref(null as any);
//
const startInterval = async () => {
interval.value= setInterval(() => {
interval.value = setInterval(() => {
getPersonDetail();
getProjectInfo();
getProjectInfo(true);
callChildFn();
}, 30 * 1000);
}
};
// interval
const destroyInterval = () => {
if (interval.value) {
clearInterval(interval.value);
}
}
}
};
// destroyInterval interval
onBeforeUnmount(() => {
destroyInterval();
})
window.onbeforeunload = (e) => {
});
window.onbeforeunload = () => {
destroyInterval();
}
onMounted( async () => {
};
onMounted(async () => {
getPersonDetail();
getProjectInfo();
startInterval();
@ -113,13 +113,16 @@ onMounted( async () => {
.center {
width: 46%;
margin: 0 1%;
.centerTop {
height: 66%;
margin-bottom: 2.1%;
:deep(.content) {
margin-top: 1.5%;
height: 91%;
}
}
.centerBottom {
height: 32%;
margin-bottom: 2.1%;
}
}
.right {

View File

@ -1,18 +1,18 @@
<template>
<div class="leftTop">
<Card title="智能设备">
<Card title="监测设备">
<div class="deviceData">
<div class="deviceDataA">
<div class="num">
<i>{{ statisticsCount.devcount.ufaceDevNum || 0 }}</i>
</div>
<div class="text">实名制设备数</div>
<div class="text">人员监测设备</div>
</div>
<div class="deviceDataB">
<div class="num">
<i>{{ statisticsCount.devcount.environmentDevNum || 0 }}</i>
</div>
<div class="text">环境设备</div>
<div class="text">环境监测设备</div>
</div>
</div>
</Card>

View File

@ -1,59 +1,64 @@
<template>
<div class="leftTop">
<Card title="人员概况">
<Card title="人员管理">
<div class="topPeopleNum">
<div class="dataTlt" style="margin-left: 0;">
<div class="text"><i>人员总数</i></div>
<div class="num">
<i>{{ statisticsCount.workercount.lwPersonTotal || 0 }}</i>
</div>
</div>
<div class="dataTlo">
<div class="text" v-if="COMPANY === 'agjt'"><i>出勤人数</i></div>
<div class="text" v-else><i>实名制人数</i></div>
<div class="text" v-else><i>进场人数</i></div>
<div class="num">
<i v-if="COMPANY === 'agjt'">{{ attendancePerson.totalPerson || 0 }}</i>
<i v-else>{{ statisticsCount.workercount.totalPerson || 0 }}</i>
<i v-else>{{ attendancePerson.lwPersonTotal || 0 }}</i>
</div>
</div>
<div class="dataTlt">
<div class="text"><i>场人数</i></div>
<div class="text"><i>场人数</i></div>
<div class="num">
<i>{{ statisticsCount.presencecount.totalPerson || 0 }}</i>
<i>{{ attendancePerson.lwExitPersonTotal || 0 }}</i>
</div>
</div>
</div>
<div class="bottomPeopleNum">
<div style="display: flex; margin-left: 2%">
<div style="width: 5px; height: 5px; background: rgba(130, 251, 234, 1); border-radius: 10px; margin: 2%"></div>
<div><i>管理人员</i></div>
<div><i>在场施工人数</i></div>
</div>
<div class="peopleData">
<div class="peoImg"><img src="@/assets/images/comprehensiveManage/project3.png" alt="" /></div>
<!-- <div class="peoImg"><img src="@/assets/images/comprehensiveManage/project3.png" alt="" /></div> -->
<div class="peoNum">
<div class="penName"></div>
<div class="penN"></div>
<div class="numData1 numData">
<div class="text"><i>甲方人员</i></div>
<div class="text"><i>{{ presencePerson[0]?.typeName || '-'}}</i></div>
<div class="num">
<i style="color: #eea959">{{ statisticsCount.presencecount.jfGlPersonTotal || 0 }}/
{{ statisticsCount.workercount.jfGlPersonTotal || 0 }}
<i style="color: #eea959">
<!-- {{ statisticsCount.presencecount.jfGlPersonTotal || 0 }}/ -->
{{ presencePerson[0]?.presentPersonNum || 0 }}
</i>
</div>
</div>
<div class="numData2 numData">
<div class="text"><i>监理人员</i></div>
<div class="text"><i>{{ presencePerson[1]?.typeName || '-'}}</i></div>
<div class="num">
<i style="color: #82fbea"
>{{ statisticsCount.presencecount.jlGlPersonTotal || 0 }}/{{
statisticsCount.workercount.jlGlPersonTotal || 0
}}</i
>
<i style="color: #82fbea">
<!-- {{ statisticsCount.presencecount.jlGlPersonTotal || 0 }}/ -->
{{ presencePerson[1]?.presentPersonNum || 0 }}
</i>
</div>
</div>
<div class="numData3 numData">
<div class="text" v-if="COMPANY === 'agjt'"><i>施工方</i></div>
<div class="text" v-else><i>乙方人员</i></div>
<div class="text" v-else><i>{{ presencePerson[2]?.typeName || '-'}}</i></div>
<div class="num">
<i style="color: #7aa0ea"
>{{ statisticsCount.presencecount.yfGlPersonTotal || 0 }}/{{
statisticsCount.workercount.yfGlPersonTotal || 0
}}</i
>
<i style="color: #7aa0ea">
<!-- {{ statisticsCount.presencecount.yfGlPersonTotal || 0 }}/ -->
{{ presencePerson[2]?.presentPersonNum || 0 }}
</i>
</div>
</div>
</div>
@ -68,7 +73,8 @@ import Card from "@/components/card.vue";
import { GlobalStore } from "@/stores";
import { COMPANY } from "@/config/config";
import { ref, onMounted, watch } from "vue";
import { getPersonTypeAndEduStatisticsApi } from "@/api/modules/labor";
import { selectProjectWorkerTypeTotalListApi } from "@/api/modules/labor";
import { getPersonTypeAndEduStatisticsApi, getCountEntryAndExitNum } from "@/api/modules/labor";
const store = GlobalStore();
// ts
type Props = {
@ -84,6 +90,8 @@ const statisticsCount = ref({
presencecount: {}
} as any);
const personData = ref({} as any);
watch(
() => props.statisticsCount,
newVal => {
@ -94,20 +102,36 @@ watch(
}
}
);
const presencePerson = ref(0)
const presencePerson = ref([])
const attendancePerson = ref(0)
const toaltPerson = ref(0)
//
const getPersonList = async () => {
const res = await getPersonTypeAndEduStatisticsApi({
const personRes = await getPersonTypeAndEduStatisticsApi({
projectSn: store.sn
});
if (personRes.result) {
console.log("+++++++++++++++++++++++++++++++++")
console.log(personRes)
// presencePerson.value = personRes.result.personType.presencePerson;
attendancePerson.value = personRes.result.personType.attendancePerson;
// toaltPerson.value = personRes.result.personType.toaltPerson;
}
const res = await selectProjectWorkerTypeTotalListApi({
projectSn: store.sn
});
if (res.result) {
console.log("+++++++++++++++++++++++++++++++++")
console.log(res)
presencePerson.value = res.result.personType.presencePerson;
attendancePerson.value = res.result.personType.attendancePerson;
toaltPerson.value = res.result.personType.toaltPerson;
presencePerson.value = res.result.splice(0, 3);
console.log("获取工种分析数据", res, presencePerson.value);
}
const res2 = await getCountEntryAndExitNum({
projectSn: store.sn
});
if (res2.result) {
console.info(res2.result)
personData.value = res2.result;
}
};
onMounted( async () => {
@ -123,18 +147,18 @@ onMounted( async () => {
height: 40%;
display: flex;
.dataTlo {
width: 35%;
width: 30%;
height: 100%;
background: url("@/assets/images/comprehensiveManage/project9.png") no-repeat;
background-size: 100% 100%;
margin-left: 10%;
margin-left: 5%;
}
.dataTlt {
width: 35%;
width: 30%;
height: 100%;
background: url("@/assets/images/comprehensiveManage/project12.png") no-repeat;
background-size: 100% 100%;
margin-left: 10%;
margin-left: 5%;
}
.text {
color: #fff;
@ -162,6 +186,7 @@ onMounted( async () => {
.peopleData {
height: 80%;
display: flex;
justify-content: center;
.peoImg {
width: 30%;
height: 100%;
@ -173,7 +198,7 @@ onMounted( async () => {
}
.peoNum {
height: 100%;
width: 70%;
width: 100%;
position: relative;
.penName {
background: rgba(39, 88, 192, 0.6);

View File

@ -4,8 +4,11 @@
<div class="projectInfo">
<div><span>项目名称</span> {{ projectData.projectName || "" }}</div>
<div :title="projectLocal"><span>项目地址</span> {{ projectLocal }}</div>
<div><span>项目经理</span> {{ projectData.projectManage || "" }}</div>
<div><span>联系电话</span> {{ projectData.projectTel || "" }}</div>
<!-- <div><span>项目经理</span> {{ projectData.projectManage || "" }}</div>
<div><span>联系电话</span> {{ projectData.projectTel || "" }}</div> -->
<div><span>业主单位</span> {{ projectData.ownerUnit || "" }}</div>
<div><span>承建单位</span> {{ projectData.bidWinner || "" }}</div>
<!-- <div><span>监理单位</span> {{ projectData.supervisorUnit || "" }}</div> -->
<div><span>建筑面积</span> {{ projectData.projectAcreage || "" }} </div>
<div><span>开工日期</span> {{ projectData.startWorkDate || "" }}</div>
<div><span>项目编号</span> {{ projectData.projectNumber || "" }}</div>
@ -45,8 +48,8 @@ const projectLocal = ref("" as any);
const store = GlobalStore();
const projectTypeEnumList:any = ref([]); //
//
const projectTypeEnum = async () => {
const res: any = await getStageOption({ dictionaryEncoding: "project_type", projectSn: store.sn });
const projectTypeEnum = async (noLoading = false) => {
const res: any = await getStageOption({ dictionaryEncoding: "project_type", projectSn: store.sn }, noLoading);
if (res.result.length > 0) {
let newArray = res.result.map((item: any) => {
return {

View File

@ -332,8 +332,8 @@ function drawEchart() {
//
// const safeData = ref(null as any);
const getSafeInfo = async () => {
const res: any = await getProjectInspectRecordCountApi({ projectSn: store.sn });
const getSafeInfo = async (noLoading = false) => {
const res: any = await getProjectInspectRecordCountApi({ projectSn: store.sn }, noLoading);
// console.log("", res);
// safeData.value = res.result;
dataList.value[0].value = res.result.rectificationNum;

View File

@ -3,15 +3,15 @@
<Card title="晴雨表">
<div class="weatherBox">
<div class="weatherItem" v-for="(item, index) in weatherList" :key="index">
<p>{{ item.day }}</p>
<p>{{ item.date }}</p>
<p class="imgBox">
<img :src="item.url" />
<!-- <img v-else src="@/assets/images/dustNoise/weatherIcon/yu.png" /> -->
</p>
<div class="weather">{{ item.wea }}</div>
<div class="temp">{{ item.tem2 }} ~ {{ item.tem1 }}</div>
<div class="temp">{{ item.temNight }} ~ {{ item.temDay }}</div>
<p>
{{ item.win_speed }}
{{ item.winSpeed }}
</p>
</div>
</div>
@ -22,7 +22,7 @@
<script lang="ts" setup>
import Card from "@/components/card.vue";
import { reactive, onMounted, ref } from "vue";
import { getWeatherDataApi } from "@/api/modules/headNoise";
import { getWeatherDataApi, getWeatherList } from "@/api/modules/headNoise";
import { getTaskTimeDetail } from "@/api/modules/schedulePlan";
import { GlobalStore } from "@/stores";
const store = GlobalStore();
@ -38,12 +38,10 @@ const getProjectInfo = async () => {
};
//
const loadWeather = async () => {
const res = await getWeatherDataApi({ cityid: "", areaId: projectTimeInfo.value.areaCode});
let json = JSON.parse(res.result);
let list = json;
console.log("获取天气", res.result);
const res = await getWeatherList({ projectSn: store.sn, pageSize: 7 });
const list = res.result.records;
list.forEach(element => {
const weatherImg = weatherIcon.value.find(icon => icon.Image.includes(element.wea_img));
const weatherImg = weatherIcon.value.find(icon => icon.Image.includes(element.weaImg));
if (weatherImg) {
const imageUrl = weatherImg.Image;
// URLelement.url
@ -51,6 +49,20 @@ const loadWeather = async () => {
}
weatherList.value.push(element);
});
console.info(weatherList.value, 'weatherList')
// const res = await getWeatherDataApi({ cityid: "", areaId: projectTimeInfo.value.areaCode});
// let json = JSON.parse(res.result);
// let list = json;
// console.log("", res.result);
// list.forEach(element => {
// const weatherImg = weatherIcon.value.find(icon => icon.Image.includes(element.wea_img));
// if (weatherImg) {
// const imageUrl = weatherImg.Image;
// // URLelement.url
// element.url = imageUrl;
// }
// weatherList.value.push(element);
// });
};
onMounted(() => {
getProjectInfo();
@ -132,7 +144,7 @@ const weatherIcon = ref([
}
}
}
::v-deep .h-card .content{
margin-top: 1%;
::v-deep .h-card .content {
margin-top: 1%;
}
</style>

View File

@ -677,8 +677,11 @@ function jumpBgd() {
window.location.replace("http://192.168.110.220:9809/#/login?token=" + store.token);
} else if (COMPANY === "as") {
window.location.replace("http://182.90.224.237:15551/#/login?token=" + store.token);
} else if (COMPANY === "scwc") {
window.location.replace("http://192.168.9.249:9809/#/login?token=" + store.token);
} else if (envList.includes(COMPANY)) {
window.location.replace(BASEURL + "/#/login?token=" + store.token);
// window.location.replace("http://192.168.34.216:8082" + "/#/login?token=" + store.token);
} else {
// ()
window.location.replace("http://101.43.164.214:11111/#/login?token=" + store.token);

View File

@ -242,9 +242,9 @@ const getPersonList = async () => {
projectSn: store.sn
});
if (res.result) {
presencePerson.value = res.result.personType.presencePerson.totalPerson;
attendancePerson.value = res.result.personType.attendancePerson.totalPerson;
toaltPerson.value = res.result.personType.toaltPerson.totalPerson;
presencePerson.value = res.result.personType.presencePerson.lwPersonTotal;
attendancePerson.value = res.result.personType.attendancePerson.lwPersonTotal;
toaltPerson.value = res.result.personType.toaltPerson.lwPersonTotal;
}
};
//
@ -253,9 +253,9 @@ const getPersonList2 = async () => {
projectSn: store.sn
});
if (res.result) {
presencePerson.value = res.result.personType.presencePerson.totalPerson;
attendancePerson.value = res.result.personType.attendancePerson.totalPerson;
toaltPerson.value = res.result.personType.toaltPerson.totalPerson;
presencePerson.value = res.result.personType.presencePerson.lwPersonTotal;
attendancePerson.value = res.result.personType.attendancePerson.lwPersonTotal;
toaltPerson.value = res.result.personType.toaltPerson.lwPersonTotal;
}
};
//

View File

@ -42,7 +42,7 @@ const getProjectInfo = async () => {
const res: any = await getTaskTimeDetail({ projectSn: store.sn });
console.log("获取项目信息", res);
projectTimeInfo.value = res.result;
countdown.value = projectTimeInfo.value.projectOverallCountdown.toString().padStart(6, "0");
countdown.value = projectTimeInfo.value.surplusDay.toString().padStart(6, "0");
};
onMounted(async () => {

View File

@ -146,7 +146,7 @@ let objData = ref({
secret: "", //secret
port: 443,
playMode: 0, // 0 1
layout: "1x1" //16
layout: "2x" //16
});
//
@ -156,6 +156,7 @@ const checkVideo = async (item: any) => {
ysyParams.value = item;
cameraIndexCode.value = item.serialNumber;
if (videoType.value !== 1) {
console.info(cameraIndexCode.value, 'cameraIndexCode.value')
previewVideo(cameraIndexCode.value);
}
}
@ -468,7 +469,10 @@ const init = (callback: (() => void) | undefined) => {
})
.then(function (oData: any) {
oWebControl.JS_Resize(playWndWidth.value * store.globalScale, playWndHeight.value * store.globalScale); // resizefirefoxDIV
previewVideo('4d291fca475146cb86ae9fe9e9dde1fc');
previewVideo('246d890866d24a3da0eabd89e80b286f');
previewVideo('16d41e9b069a4c9da685132dd71b600f');
previewVideo('426cc9a5a2cd4ebf876667f130a5bd00');
if (callback) {
callback();
}