git commit -m 0911
This commit is contained in:
dhr
2025-09-11 18:45:28 +08:00
63 changed files with 1184 additions and 142 deletions

View File

@ -8,9 +8,9 @@ VITE_APP_ENV = 'development'
# VITE_APP_BASE_API = 'http://192.168.110.209:8899'
# 李陈杰 209
# VITE_APP_BASE_API = 'http://192.168.110.209:8899'
VITE_APP_BASE_API = 'http://192.168.110.149:8899'
# 曾涛
VITE_APP_BASE_API = 'http://192.168.110.210:8899'
# VITE_APP_BASE_API = 'http://192.168.110.149:8899'
# 罗成
# VITE_APP_BASE_API = 'http://192.168.110.188:8899'
# 朱银
@ -18,8 +18,10 @@ VITE_APP_ENV = 'development'
#曾涛
# VITE_APP_BASE_API = 'http://192.168.110.171:8899'
# 无人机接口地址
# ws
VITE_APP_BASE_WS_API = 'ws://192.168.110.149:8899/resource/websocket'
# 无人机接口地址
VITE_APP_BASE_DRONE_API = 'http://58.17.134.85:9512'
# 应用访问路径 例如使用前缀 /admin/

View File

@ -1 +1,2 @@

View File

@ -34,7 +34,7 @@
"date-fns": "^4.1.0",
"diagram-js": "12.3.0",
"didi": "9.0.2",
"echarts": "5.5.0",
"echarts": "^5.5.0",
"echarts-gl": "^2.0.9",
"element-plus": "2.8.8",
"esbuild": "^0.25.0",

View File

@ -106,6 +106,6 @@ export const getFootNote = (data) => {
return request({
url: 'gps/equipmentSon/getList',
method: 'get',
data: data
params: data
});
};

View File

@ -122,6 +122,11 @@ export interface EquipmentQuery extends PageQuery {
*/
type?: string | number;
/**
* 展示用户/设备数据1=用户数据0=设备数据
*/
gpsType?: string | number;
/**
* 用户id
*/

View File

@ -53,7 +53,6 @@ export interface MaterialReceiveVO {
* 备注
*/
remark: string;
}
export interface MaterialReceiveForm extends BaseEntity {
@ -156,11 +155,13 @@ export interface MaterialReceiveForm extends BaseEntity {
* 备注
*/
remark?: string;
/**
* 附件
*/
attachmentId?: string | number;
}
export interface MaterialReceiveQuery extends PageQuery {
/**
* 项目id
*/
@ -206,6 +207,3 @@ export interface MaterialReceiveQuery extends PageQuery {
*/
params?: any;
}

View File

@ -31,6 +31,7 @@ export interface FlowTaskVO {
version?: string;
applyNode?: boolean;
buttonList?: buttonList[];
projectName?: string;
}
export interface buttonList {

View File

@ -12,7 +12,8 @@ export default {
businessId: routerJumpVo.businessId,
type: routerJumpVo.type,
planMonth: routerJumpVo.planMonth,
taskId: routerJumpVo.taskId
taskId: routerJumpVo.taskId,
projectName: routerJumpVo.projectName
}
});
}

View File

@ -4,6 +4,7 @@ export interface RouterJumpVo {
type: string;
formCustom: string;
formPath: string;
projectName?: string;
}
export interface StartProcessBo {

View File

@ -1,4 +1,5 @@
<template>
<div>
<div style="display: flex; justify-content: space-between">
<div>
<el-button v-if="submitButtonShow" :loading="props.buttonLoading" type="info" @click="submitForm('draft')">暂存</el-button>
@ -11,6 +12,8 @@
<el-button style="float: right" @click="goBack()">返回</el-button>
</div>
</div>
<h3 v-if="props.projectName" class="text-lg font-semibold text-gray-800">项目名称{{ props.projectName }}</h3>
</div>
</template>
<script setup lang="ts">
import { propTypes } from '@/utils/propTypes';
@ -22,7 +25,8 @@ const props = defineProps({
status: propTypes.string.def(''),
pageType: propTypes.string.def(''),
buttonLoading: propTypes.bool.def(false),
id: propTypes.string.def('') || propTypes.number.def()
id: propTypes.string.def('') || propTypes.number.def(),
projectName: propTypes.string.def('')
});
const emits = defineEmits(['submitForm', 'approvalVerifyOpen', 'handleApprovalRecord']);
//暂存,提交

View File

@ -167,7 +167,7 @@ const reset = () => {
form.value = { ...initFormData };
leaveFormRef.value?.resetFields();
};
const projectId = ref('');
/** 获取详情 */
const getInfo = () => {
loading.value = true;
@ -175,6 +175,7 @@ const getInfo = () => {
nextTick(async () => {
const res = await getVersionDetail(routeParams.value.id);
console.log(res);
projectId.value = res.data.projectId;
Object.assign(form.value, res.data);
loading.value = false;
buttonLoading.value = false;
@ -186,7 +187,7 @@ const sheets = ref([]);
const getSheetName = async () => {
try {
const params = {
projectId: currentProject.value?.id,
projectId: projectId.value,
versions: form.value.versions
};
const res = await sheetList(params);
@ -208,7 +209,7 @@ const tableData = ref([]);
//获取列表
const getListTable = async () => {
const res = await getTreeLimit({
projectId: currentProject.value?.id,
projectId: projectId.value,
versions: form.value.versions,
sheet: form.value.sheet,
type: '0'

View File

@ -11,6 +11,7 @@
:id="form.id"
:status="form.status"
:pageType="routeParams.type"
:projectName="routeParams.projectName"
/>
</el-card>
<!-- 表单区域 -->

View File

@ -5,7 +5,7 @@
<el-form :model="queryForm" :inline="true">
<el-form-item label="版本号" prop="versions">
<el-select v-model="queryForm.versions" placeholder="选择版本号" @change="changeVersions">
<el-option v-for="item in options" :key="item.versions" :label="item.versions" :value="item.versions" />
<el-option v-for="item in options" :key="item.versions" :label="item.versionsName" :value="item.versions" />
</el-select>
</el-form-item>
<el-form-item label="表名" prop="sheet">

View File

@ -11,6 +11,7 @@
:id="form.versions"
:status="form.status"
:pageType="routeParams.type"
:projectName="routeParams.projectName"
/>
</el-card>
<!-- 表单区域 -->
@ -162,7 +163,7 @@ const reset = () => {
form.value = { ...initFormData };
leaveFormRef.value?.resetFields();
};
const projectId = ref('');
/** 获取详情 */
const getInfo = () => {
loading.value = true;
@ -170,6 +171,7 @@ const getInfo = () => {
nextTick(async () => {
const res = await getVersionDetails(routeParams.value.id);
console.log(res);
projectId.value = res.data.projectId;
Object.assign(form.value, res.data);
loading.value = false;
buttonLoading.value = false;
@ -181,7 +183,7 @@ const sheets = ref([]);
const getSheetName = async () => {
try {
const params = {
projectId: currentProject.value?.id,
projectId: projectId.value,
versions: form.value.versions
};
const res = await sheetList(params);
@ -201,7 +203,7 @@ const changeSheet = () => {
//获取列表
const getListTable = async () => {
const res = await listBillofquantitiesLimitList({
projectId: currentProject.value?.id,
projectId: projectId.value,
versions: form.value.versions,
sheet: form.value.sheet
});

View File

@ -11,6 +11,7 @@
:id="form.id"
:status="form.status"
:pageType="routeParams.type"
:projectName="routeParams.projectName"
/>
</el-card>

View File

@ -11,6 +11,7 @@
:id="form.id"
:status="form.status"
:pageType="routeParams.type"
:projectName="routeParams.projectName"
/>
</el-card>

View File

@ -11,6 +11,7 @@
:id="form.id"
:status="form.status"
:pageType="routeParams.type"
:projectName="routeParams.projectName"
/>
</el-card>
<!-- 表单区域 -->

View File

@ -7,7 +7,7 @@
<el-form :model="state.queryForm" :inline="true">
<el-form-item label="版本号" prop="versions">
<el-select v-model="state.queryForm.versions" placeholder="选择版本号" @change="handleChangeVersion">
<el-option v-for="item in state.options" :key="item.versions" :label="item.versions" :value="item.versions" />
<el-option v-for="item in state.options" :key="item.versions" :label="item.versionsName" :value="item.versions" />
</el-select>
</el-form-item>
<el-form-item label="表名" prop="sheet">
@ -48,7 +48,7 @@
<el-form :model="state.queryForm" :inline="true">
<el-form-item label="版本号" prop="versions">
<el-select v-model="state.queryForm.versions" placeholder="选择版本号" @change="handleChangeVersion">
<el-option v-for="item in state.options" :key="item.versions" :label="item.versions" :value="item.versions" />
<el-option v-for="item in state.options" :key="item.versions" :label="item.versionsName" :value="item.versions" />
</el-select>
</el-form-item>
<el-form-item>

View File

@ -11,6 +11,7 @@
:id="form.versions"
:status="form.status"
:pageType="routeParams.type"
:projectName="routeParams.projectName"
/>
</el-card>
<!-- 表单区域 -->

View File

@ -11,6 +11,7 @@
:id="form.versions"
:status="form.status"
:pageType="routeParams.type"
:projectName="routeParams.projectName"
/>
</el-card>
<!-- 表单区域 -->

View File

@ -11,6 +11,7 @@
:id="form.versions"
:status="form.status"
:pageType="routeParams.type"
:projectName="routeParams.projectName"
/>
</el-card>
<!-- 表单区域 -->

View File

@ -11,6 +11,7 @@
:id="form.versions"
:status="form.status"
:pageType="routeParams.type"
:projectName="routeParams.projectName"
/>
</el-card>
<!-- 表单区域 -->

View File

@ -11,6 +11,7 @@
:id="form.id"
:status="form.status"
:pageType="routeParams.type"
:projectName="routeParams.projectName"
/>
</el-card>
<!-- 表单区域 -->

View File

@ -11,6 +11,7 @@
:id="form.id"
:status="form.status"
:pageType="routeParams.type"
:projectName="routeParams.projectName"
/>
</el-card>
<!-- 表单区域 -->

View File

@ -11,6 +11,7 @@
:id="form.id"
:status="form.status"
:pageType="routeParams.type"
:projectName="routeParams.projectName"
/>
</el-card>
<!-- 表单区域 -->

View File

@ -11,6 +11,7 @@
:id="form.design"
:status="form.auditStatus"
:pageType="routeParams.type"
:projectName="routeParams.projectName"
/>
</el-card>
<!-- 表单区域 -->

View File

@ -11,6 +11,7 @@
:id="form.id"
:status="form.status"
:pageType="routeParams.type"
:projectName="routeParams.projectName"
/>
</el-card>

View File

@ -11,6 +11,7 @@
:id="form.id"
:status="form.status"
:pageType="routeParams.type"
:projectName="routeParams.projectName"
/>
</el-card>
<!-- 表单区域 -->

View File

@ -11,6 +11,7 @@
:id="form.id"
:status="form.status"
:pageType="routeParams.type"
:projectName="routeParams.projectName"
/>
</el-card>

View File

@ -11,6 +11,7 @@
:id="form.id"
:status="form.status"
:pageType="routeParams.type"
:projectName="routeParams.projectName"
/>
</el-card>

View File

@ -11,6 +11,7 @@
:id="form.id"
:status="form.status"
:pageType="routeParams.type"
:projectName="routeParams.projectName"
/>
</el-card>
<!-- 表单区域 -->

View File

@ -11,6 +11,7 @@
:id="form.id"
:status="form.auditStatus"
:pageType="routeParams.type"
:projectName="routeParams.projectName"
/>
</el-card>
<!-- 表单区域 -->

View File

@ -11,6 +11,7 @@
:id="form.id"
:status="form.auditStatus"
:pageType="routeParams.type"
:projectName="routeParams.projectName"
/>
</el-card>
<!-- 表单区域 -->

View File

@ -4,7 +4,7 @@
<div ref="mapRef" class="map-container" style="width: 100%; height: 100%" />
</div>
<div class="centerPage_bottom">
<Title title="风险预警">
<Title title="风险预警" style="font-size: 22px">
<img src="@/assets/projectLarge/robot.svg" alt="" height="20px" width="20px" />
</Title>
<div class="centerPage_bottom_table">

View File

@ -1,7 +1,7 @@
<template>
<div class="leftPage">
<div class="topPage">
<Title title="项目进度分析" />
<Title title="项目进度分析" style="font-size: 22px" />
<div class="progress">
<div class="progress_item">
<div class="progress_imgBox">
@ -53,7 +53,7 @@
</div>
</div>
<div class="output">
<Title title="实际产值与预期产值对比" />
<Title title="实际产值与预期产值对比" style="font-size: 22px" />
<div class="chart_container">
<div ref="lineChartRef" class="echart" />
</div>

View File

@ -71,15 +71,17 @@ let data = [
const getTrajectoryData = async () => {
try {
// 从URL参数中获取clientId、projectId和userId
const { clientId, projectId, userId } = route.query;
const { clientId, projectId, userId, gpsType } = route.query;
if (!clientId || !projectId || !userId) {
if (!projectId || !userId || !gpsType) {
ElMessage.warning('缺少必要参数,请检查传入的参数');
return;
}
loading.value = true;
const res = await getFootNote({ clientId, projectId, userId });
// 确保gpsType转换为数字类型以便正确传递给后端
const gpsTypeNum = parseInt(gpsType, 10);
const res = await getFootNote({ clientId, projectId, userId, gpsType: gpsTypeNum });
if (res && res.code === 200 && res.data && res.data.length > 0) {
data = res.data;

View File

@ -22,7 +22,7 @@
<el-card shadow="never">
<template #header>
<el-row :gutter="10" class="mb8">
<el-row :gutter="20" class="mb8">
<el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['gps:equipment:edit']"
>修改</el-button
@ -39,7 +39,12 @@
>
</el-col>
<el-col :span="2">
<el-button type="primary" plain @click="handleViewAll">{{ viewAllButtonText }}</el-button>
<el-button type="primary" plain @click="toggleGpsType">
{{ currentGpsType === 0 ? '显示用户数据' : '显示设备数据' }}
</el-button>
</el-col>
<el-col :span="2">
<el-button type="primary" v-if="queryParams.gpsType !== 1" plain @click="handleViewAll">{{ viewAllButtonText }}</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
@ -102,7 +107,7 @@
type="primary"
icon="Location"
v-hasPermi="['gps:equipmentSon:getList']"
@click="handleGoToEmptyPage(scope.row.userId, scope.row.projectId, scope.row.clientId)"
@click="handleGoToEmptyPage(scope.row.userId, scope.row.projectId, scope.row.clientId, scope.row.gpsType)"
:disabled="!scope.row.userId || !scope.row.projectId"
></el-button>
</el-tooltip>
@ -189,7 +194,7 @@
type="primary"
icon="Location"
v-hasPermi="['gps:equipmentSon:getList']"
@click="handleGoToEmptyPage(scope.row.userId, scope.row.projectId, currentHistoryClientId)"
@click="handleGoToEmptyPage(scope.row.userId, scope.row.projectId, currentHistoryClientId, currentGpsType)"
></el-button>
</el-tooltip>
</template>
@ -301,6 +306,9 @@ const initFormData: EquipmentForm = {
remark: undefined
};
// 当前GPS类型 (0:设备数据, 1:用户数据)
const currentGpsType = ref(0);
// 页面数据
const data = reactive<PageData<EquipmentForm, EquipmentQuery>>({
form: { ...initFormData },
@ -317,6 +325,7 @@ const data = reactive<PageData<EquipmentForm, EquipmentQuery>>({
creationTime: undefined,
lastAccessedTime: undefined,
registered: undefined,
gpsType: 0, // 默认显示设备数据
params: {}
},
rules: {
@ -385,6 +394,15 @@ const formatDateTime = (timestamp: any): string => {
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
};
/** 切换GPS数据类型 */
const toggleGpsType = () => {
currentGpsType.value = currentGpsType.value === 0 ? 1 : 0;
queryParams.value.gpsType = currentGpsType.value;
queryParams.value.pageNum = 1;
getList();
proxy?.$modal.msgSuccess(`已切换到${currentGpsType.value === 0 ? '设备数据' : '用户数据'}模式`);
};
/** 获取设备列表 */
const getList = async () => {
loading.value = true;
@ -397,6 +415,9 @@ const getList = async () => {
queryParams.value.projectId = undefined;
}
// 确保gpsType参数正确设置
queryParams.value.gpsType = currentGpsType.value;
const res = await listEquipment(queryParams.value);
equipmentList.value = res.rows as ExtendedEquipmentVO[];
total.value = res.total;
@ -490,16 +511,24 @@ const handleViewAll = () => {
getList();
};
const handleGoToEmptyPage = (userId: any, projectId: any, clientId: any) => {
console.log('userId:', userId, 'projectId:', projectId, 'clientId:', clientId);
const handleGoToEmptyPage = (userId: any, projectId: any, clientId: any, gpsType: number) => {
console.log('userId:', userId, 'projectId:', projectId, 'clientId:', clientId, 'gpsType:', gpsType);
const queryParams: any = {
userId: userId,
projectId: projectId,
gpsType: gpsType,
clientId: clientId
};
// 当gpsType为0时传入clientId为1时不传入
if (gpsType === 1 && clientId) {
queryParams.clientId = '';
}
router.push({
path: './equipmentGPS',
query: {
userId: userId,
projectId: projectId,
clientId: clientId
}
query: queryParams
});
};

View File

@ -1,7 +1,7 @@
<template>
<div class="ol-map" id="olMap"></div>
<div class="left_title_button">
<div class="title">{{ projectName }}</div>
<div class="title">{{ currentProject.name }}</div>
<div class="btn" @click="updateZhiJiaZhuanDian('zhuangdian')">
<SvgIcon :name="bottomSvg" :isStyle="true" :className="'width:250px;height:50px;'" />
<span>桩点-更新高程</span>
@ -29,6 +29,11 @@
import { workScheduleDel } from '@/api/progress/plan';
import { renderFacilitiesToCesium } from '@/views/gisHome/js/renderFacilities';
import { CenterHeight } from '@/views/gis2D/js/center';
import { useUserStoreHook } from '@/store/modules/user';
const userStore = useUserStoreHook();
const currentProject = computed(() => userStore.selectedProject);
console.log('projectName', currentProject);
import md5 from 'js-md5';
const arr = ref();
const initFacilities = async () => {
@ -129,8 +134,10 @@ onMounted(async () => {
username: 'admin',
password: md5('admin_admin123'),
host: 'http://192.168.110.2:8895/'
});
}).then((res) => {
createEarth();
console.log(res);
});
await handletilList();
await initFacilities();
console.log(YJ);

628
src/views/gis2D/index2.vue Normal file
View File

@ -0,0 +1,628 @@
<template>
<div class="earth gis2D" id="earth">
<header-top :isShowTab="false" :isShowLog="false"></header-top>
<!-- <el-button class="btn" type="primary" @click="gengxin">更新</el-button> -->
<div class="left_title_button">
<div class="title">{{ projectName }}</div>
<div class="btn" @click="updateZhiJiaZhuanDian('zhuangdian')">
<SvgIcon :name="bottomSvg" :isStyle="true" :className="'width:250px;height:50px;'" />
<span>桩点-更新高程</span>
</div>
<div class="btn" @click="updateHighLevel('nibianqi')">
<SvgIcon :name="bottomSvg" :isStyle="true" :className="'width:250px;height:50px;'" />
<span>逆变器-更新高程</span>
</div>
<div class="btn" @click="updateHighLevel('xiangbian')">
<SvgIcon :name="bottomSvg" :isStyle="true" :className="'width:250px;height:50px;'" />
<span>箱变-更新高程</span>
</div>
<div class="btn" @click="updateZhiJiaZhuanDian('zhijia')">
<SvgIcon :name="bottomSvg" :isStyle="true" :className="'width:250px;height:50px;'" />
<span>支架-更新高程</span>
</div>
<div class="btn" @click="centerHeight()">
<SvgIcon :name="bottomSvg" :isStyle="true" :className="'width:250px;height:50px;'" />
<span>光伏板-更新高程</span>
</div>
</div>
<progressLoading :progress="progress" :tips="progressTips"></progressLoading>
</div>
</template>
<script lang="ts">
// import { toRefs, reactive, defineComponent, onMounted, getCurrentInstance, ref, nextTick } from 'vue';
// import { ElLoading, ElMessage } from 'element-plus';
// import headerTop from '../components/header/index.vue';
// import { NextLoading } from '/@/utils/loading';
// import { updateProjectId } from '/@/utils/tools';
// import { useUserInfo } from '/@/stores/userInfo';
// import progressLoading from '/@/components/progressLoading/index.vue';
// // 资源接口
// import { listQianqiMoxing } from '/@/api/system/qianqiManage/qianqiMoxing';
// import { manageAll, updateAll, gisList, gisListZhijia, ZhuangdianEdit_detail, ZhijiaEdit_detail } from '/@/api/gis2D/all';
// import { getSysProject } from '/@/api/system/sysProject';
// import bottomSvg from '/@/assets/svg/bottom.svg';
// // json字符判断
// import { typeJSON } from '/@/utils/toolsValidate';
// import { renderGuangfubanGlb } from '../utils/treeRender.js';
// import zjImage from '/@/assets/images/tree_icon/zhijia.png';
// import { Session } from '/@/utils/storage';
// import axios from 'axios';
// // import sign from '/@/utils/sign.js';
import zdImage from '/@/assets/images/tree_icon/zhuangdian.png';
let nibianqi = [];
let xiangbian = [];
let guanfuban = [];
let YJ = window.YJ;
// eslint-disable-next-line no-undef
export default defineComponent({
name: 'index',
components: {
headerTop,
progressLoading,
},
setup() {
const stores = useUserInfo();
const state = reactive({
projectId: stores.$state.userInfos.uprojectId,
queryParam: {
pageNum: 1,
pageSize: 10000000000,
projectId: stores.$state.userInfos.uprojectId,
},
projectName: '',
bottomSvg,
tools: null,
zhuangdian: {
// 桩点更新高层
originArr: [] as any[], //源数据数组
poiArr: [] as any[], //位置数据数组
},
zhijia: {
// 支架更新高层
originArr: [] as any[], //源数据数组
poiArr: [] as any[], //位置数据数组
},
gfbArr: [] as any[],
bbtArr: [] as any[],
progress: -1, //加载进度
progressTips: '数据更新中,请稍后……',
loading: null,
});
onMounted(() => {
// 关闭Loading效果
NextLoading.done();
createEarth();
// 切换项目 项目ID数据同步
let channel = new BroadcastChannel('BC-switchProject');
channel.addEventListener('message', function (e) {
if (e.data !== state.projectId) {
//保存更新项目id
updateProjectId(e.data);
location.reload(); //刷新页面
}
});
});
const initData = () => {
getRresource();
// 获取所有数据
getSourceAll();
// 项目名称
getProList(state.projectId);
// 获取桩点
getZhiJiaList();
getXZhuangDianList();
};
const commonJson = (item) => {
if (!item.detail) {
//是否存在
return false;
}
if (!typeJSON(item.detail)) {
//是否是JSON字符
return false;
}
return true;
};
// 渲染倾斜模型
const renderModel = (item) => {
let Nposition = {
lng: 0,
lat: 0,
alt: 0,
};
let position = null;
if (commonJson(item)) {
position = JSON.parse(item.detail).position || Nposition;
} else {
position = Nposition;
}
let options = {
id: item.sourceId,
host: '',
position,
show: true,
};
// eslint-disable-next-line no-undef
let model = new YJ.Zmkg.Source(options);
model.on().then((res) => {
if (model.source.tileset) {
let bim = model.source.tileset.czmObject;
}
setTimeout(() => {
if (model.id != 'dixing') {
model.flyTo();
}
}, 1000);
});
};
const getRresource = () => {
getQxModelList();
};
// 渲染光伏板
const redenrGfB = () => {
const loading = ElLoading.service({
lock: true,
text: '加载光伏板中....',
background: 'rgba(0, 0, 0, 0.7)',
});
let batchSize = 100;
for (let i = 0; i < guanfuban.length; i += batchSize) {
const batch = guanfuban.slice(i, i + batchSize);
renderGuangfubanGlb(batch);
}
loading.close();
};
// 获取所有的数据
const getSourceAll = () => {
const loading = ElLoading.service({
lock: true,
text: '获取数据中...',
background: 'rgba(0, 0, 0, 0.7)',
});
manageAll({ id: state.projectId }).then((res) => {
loading.close();
const { data } = res;
let list = data.data;
console.log('listlistlistlist', list);
if (list.length > 0) {
list.forEach((item: any) => {
if (item.type == 18) {
nibianqi.push(item);
}
if (item.type == 23) {
xiangbian.push(item);
}
if (item.type == 15) {
guanfuban.push(item);
}
});
let one = JSON.parse(guanfuban[0].detail);
if (one.height) {
redenrGfB();
} else {
ElMessage.warning('请优先更新光伏板');
}
}
});
};
// 删除光伏板数据
const removeSources = () => {
window['$PROJECT_MAP'].forEach((item) => {
// 清空地球上的实例
try {
item[0].remove();
} catch (error) {}
});
window['$PROJECT_MAP'].clear();
};
// 数组分组工具方法
const groupArr = (array, subGroupLength) => {
let index = 0;
let newArray = [];
while (index < array.length) {
newArray.push(array.slice(index, (index += subGroupLength)));
}
return newArray;
};
// 根据key去重
const duplicateRemoveByKey = (arr: any) => {
//根据key去重
let arrMap = new Map();
for (let item of arr) {
if (!arrMap.has(item.id)) {
arrMap.set(item.id, item);
}
}
arr = [...arrMap.values()]; //把map中所有的值取出来放进数组
return arr;
};
// 采样高层
const updateZhiJiaZhuanDian = async (type: any) => {
console.log(123);
let loading = null;
let load = false;
if (type == 'zhuangdian' && window.$PROJECT_MAP) {
removeSources();
load = true;
} else {
redenrGfB();
}
if (type != 'zhuangdian' && type != 'zhijia') {
loading = ElLoading.service({
lock: true,
text: '正在更新中',
background: 'rgba(0, 0, 0, 0.7)',
});
} else {
state.progress = 0;
}
console.log('statestatestatestatestate', state);
if (state[type].poiArr.length && state[type].originArr.length) {
let poiGroupArr = groupArr(state[type].poiArr, 500);
let oriGroupArr = groupArr(state[type].originArr, 500);
if (poiGroupArr.length) {
for (let i in poiGroupArr) {
await state.tools!.sampleHeightMostDetailed(poiGroupArr[i]).then((res: any) => {
if (res.length === oriGroupArr[i].length) {
// 返填重新赋值
oriGroupArr[i] = oriGroupArr[i].map((v: any, i: any) => {
let position = JSON.parse(v.detail);
if (type === 'zhijia') {
position.position.height = res[i].height ? res[i].height : 0;
} else {
position.position.alt = res[i].height ? res[i].height : 0;
}
v.detail = JSON.stringify(position);
return v;
});
state[type].originArr = [...state[type].originArr, ...oriGroupArr[i]];
state[type].originArr = duplicateRemoveByKey(state[type].originArr);
console.log(state[type].originArr);
state.progressTips = `总计${poiGroupArr.length}组数据,正在进行第${Number(i) + 1}组数据采样`;
state.progress = Number((((Number(i) + 1) / poiGroupArr.length) * 100).toFixed(2));
if (type === 'zhuangdian' || type === 'zhijia') {
// 全部采样完才请求接口
if (Number(i) - 0 == poiGroupArr.length - 1) {
updateAlt(type, loading);
}
} else {
updateAlt(type, loading);
}
} else {
loading?.close();
ElMessage.success('更新失败');
}
});
}
}
}
};
// 更新高层
const updateAlt = async (type: any, loading: any = null) => {
if (type === 'zhuangdian') {
chunkUpdateAlt(type, '/zm/api/v1/system/qianqiGuangfubanIdsZhuangdian/edit_detail');
}
if (type === 'zhijia') {
chunkUpdateAlt(type, '/zm/api/v1/system/qianqiGuangfubanIdsZhijia/edit_detail');
}
};
// 更新高程 分组请求接口(桩点 支架)
const chunkUpdateAlt = async (type: any, url: any) => {
state.progress = 0;
console.log(state.zhuangdian.originArr);
let list = state[type].originArr.map((item: any) => {
return JSON.parse(item.detail);
});
let groupList = groupArr(list, 5000);
if (groupList.length) {
for (let i in groupList) {
state.progressTips = `总计${groupList.length}组数据,正在进行第${Number(i) + 1}组数据更新`;
state.progress = Number(((Number(i) / groupList.length) * 100).toFixed(2));
await axios({
url: url,
method: 'put',
timeout: 0,
headers: {
Authorization: 'Bearer ' + `${Session.get('token')}`,
'Content-Type': 'application/json',
...sign({ projectId: state.projectId, list: groupList[i] }),
},
data: { projectId: state.projectId, list: groupList[i] },
})
.then((res: any) => {
if (res.data.code === 0) {
state.progress = 100;
ElMessage.success(`${Number(i) + 1}组数据更新成功,剩余${groupList.length - 1 - Number(i)}组数据`);
if (type === 'zhuangdian') {
getZhiJiaList();
}
} else {
ElMessage.error(res.data.message);
}
})
.catch((err) => {
ElMessage.error('请求失败');
});
}
}
};
// 获取支架列表
const getZhiJiaList = async () => {
state.zhijia.originArr = [];
state.zhijia.poiArr = [];
await gisListZhijia(state.queryParam).then((res: any) => {
console.log('list接口', res);
if (res.code === 0 && res.data.list) {
let arr = res.data.list.map((item, index) => {
item.p_id = '106';
item.checked = 1;
item.is_show = 1;
item.layer_index = 0;
item.icon = zjImage;
item.tree_index = 0;
let detail = null;
if (commonJson(item)) {
detail = JSON.parse(item.detail);
state.zhijia.originArr.push(item);
state.zhijia.poiArr.push({ lng: detail.position.lng, lat: detail.position.lat });
}
return item;
});
}
});
};
// 获取桩点的数据
const getXZhuangDianList = async () => {
await gisList(state.queryParam).then((res: any) => {
if (res.code === 0 && res.data.list) {
state.zhuangdian.poiArr = [];
let arr = res.data.list.map((item: any, index: any) => {
item.p_id = '102';
item.checked = 1;
item.is_show = 1;
item.layer_index = 0;
item.icon = zdImage;
item.tree_index = 0;
let detail = null;
if (commonJson(item)) {
detail = JSON.parse(item.detail);
state.zhuangdian.originArr.push(item);
state.zhuangdian.poiArr.push({ lng: detail.position.lng, lat: detail.position.lat });
}
return item;
});
}
});
};
// 获取中心点高程(光伏板)
const centerHeight = () => {
const loading = ElLoading.service({
lock: true,
text: '更新高程、中心点...',
background: 'rgba(0, 0, 0, 0.7)',
});
let arr = [];
guanfuban.forEach((item) => {
arr.push(JSON.parse(item.detail));
});
let heightAndCenter = window.YJ.Zmkg.Guangfu.CenterHeight(arr);
let center = heightAndCenter.center;
heightAndCenter.Cartographic.then((Cartographic: any) => {
if (Cartographic.length > 0) {
loading.close();
assemblingPhotovoltaicPanels(center, Cartographic);
}
});
};
// 组装高程数据
const assemblingPhotovoltaicPanels = async (center: any, height: any) => {
guanfuban.forEach((item, index) => {
let i = JSON.parse(item.detail);
i.height = height[index].height;
i.center = center[index];
item.detail = JSON.stringify(i);
});
let data = [...guanfuban];
let batchSize = 100000;
for (let i = 0; i < data.length; i += batchSize) {
const batch = data.slice(i, i + batchSize);
await updateElevation(batch);
}
getSourceAll();
};
// 更新高程(箱变、逆变器)
const updateHighLevel = (str: string) => {
let gxArr;
if (str == 'nibianqi') {
gxArr = nibianqi;
}
if (str == 'xiangbian') {
gxArr = xiangbian;
}
if (gxArr.length == 0) {
ElMessage({
message: '数据为空,请确认数据是否上传',
type: 'warning',
});
return;
}
let arr = [];
gxArr.forEach((item) => {
let p = JSON.parse(item.detail).positions[0];
arr.push(p);
});
const loading = ElLoading.service({
lock: true,
text: '更新高程中...',
background: 'rgba(0, 0, 0, 0.7)',
});
state.tools.sampleHeightMostDetailed(arr).then((Cartographic) => {
if (Cartographic.length > 0) {
loading.close();
assemblyData(gxArr, Cartographic);
}
});
};
// 组装数据
const assemblyData = (gxArr, arr) => {
gxArr.forEach((item, index) => {
let i = JSON.parse(item.detail);
i.positions[0].alt = arr[index].height;
item.detail = JSON.stringify(i);
});
updateElevation(gxArr);
};
// 更新高程(更新到后端)
const updateElevation = (gxArr) => {
const loading = ElLoading.service({
lock: true,
text: '上传中,请勿关闭页面...',
background: 'rgba(0, 0, 0, 0.7)',
});
updateAll({ Modules: gxArr }).then((res) => {
loading.close();
if (res.code == 0) {
ElMessage({
message: '上传成功',
type: 'success',
});
}
});
};
// 获取地形数据
const getQxModelList = () => {
listQianqiMoxing(state.queryParam).then((res: any) => {
if (res.code === 0 && res.data.list && res.data.list.length) {
res.data.list.forEach((item) => {
renderModel(item);
});
}
});
};
// 获取当前项目信息
const getProList = (id: any) => {
getSysProject(id).then((res: any) => {
const data = res.data;
state.projectName = data.projectName;
});
};
const createEarth = () => {
// eslint-disable-next-line no-undef
YJ.on().then((res: any) => {
// eslint-disable-next-line no-undef
let earth = new YJ.YJEarth('earth');
// // this.areaShow = true
// eslint-disable-next-line no-undef
new YJ.Layer.ArcgisWXImagery();
// // new YJ.Layer.ArcgisGRAYImagery()
// // new YJ.Layer.ArcgisBLUEImagery()
// // new YJ.Terrain.Arcgis()
// eslint-disable-next-line no-undef
new YJ.Layer.GDLWImagery();
// eslint-disable-next-line no-undef
state.tools = new YJ.Tools();
// eslint-disable-next-line no-undef
YJ.getEarth().propertyStyle = new Cesium.Cesium3DTileStyle({
// let stayle = new Cesium.Cesium3DTileStyle({
/*color: {
evaluateColor: (feature, result) => {
return bimTree.evaluateColor(feature, result)
}
},*/
show: {
evaluate: (feature) => {
return evaluateShow(feature);
},
},
});
initData();
});
};
// 监听模型加载显示隐藏
const evaluateShow = (feature: any) => {
return true;
if (!feature) return true;
if (!feature.hasProperty('id')) return true;
var fid = feature.getProperty('id');
// //获取tileset
var tileset = feature.tileset.xbsjTileset;
if (!tileset) return true;
// //寻找这个tileset上绑定的配置
var config = window._visibleConfig.find((f) => f.tileset === tileset);
if (!config) return true;
//如果配置里包含,那么返回可见性
if (config.visibleCach.hasOwnProperty(fid)) {
return config.visibleCach[fid];
} else return false;
//否则返回可见
};
return {
createEarth,
evaluateShow,
getRresource,
getQxModelList,
centerHeight,
commonJson,
updateHighLevel,
updateZhiJiaZhuanDian,
redenrGfB,
...toRefs(state),
};
},
});
</script>
<style scoped lang="scss">
.earth {
width: 100vw;
height: 100vh;
overflow: hidden;
position: relative;
.left_title_button {
position: absolute;
top: 10%;
left: 30px;
width: 250px;
height: 100px;
z-index: 1999;
.title {
color: #fff;
font-weight: bold;
font-size: 22px;
margin-bottom: 20px;
}
.btn {
width: 100%;
height: 50px;
position: relative;
margin-bottom: 30px;
> span {
width: 100%;
font-size: 22px;
font-weight: bold;
color: #fff;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
letter-spacing: 3px;
text-align: center;
}
}
}
}
</style>

View File

@ -3,13 +3,19 @@
<div class="max-w-4xl mx-auto">
<!-- 顶部按钮区域 -->
<el-card class="mb-4 rounded-lg shadow-sm bg-white border border-gray-100 transition-all hover:shadow-md">
<approvalButton @submitForm="submitForm" @approvalVerifyOpen="approvalVerifyOpen"
@handleApprovalRecord="handleApprovalRecord" :buttonLoading="buttonLoading" :id="form.mrpBaseBo.id"
:status="form.mrpBaseBo.status" :pageType="routeParams.type" />
<approvalButton
@submitForm="submitForm"
@approvalVerifyOpen="approvalVerifyOpen"
@handleApprovalRecord="handleApprovalRecord"
:buttonLoading="buttonLoading"
:id="form.mrpBaseBo.id"
:status="form.mrpBaseBo.status"
:pageType="routeParams.type"
:projectName="routeParams.projectName"
/>
</el-card>
<!-- 表单区域 -->
<el-card
class="rounded-lg shadow-sm bg-white border border-gray-100 transition-all hover:shadow-md overflow-hidden">
<el-card class="rounded-lg shadow-sm bg-white border border-gray-100 transition-all hover:shadow-md overflow-hidden">
<div class="p-4 bg-gradient-to-r from-blue-50 to-indigo-50 border-b border-gray-100">
<h3 class="text-lg font-semibold text-gray-800">物资设备批次需求计划</h3>
<el-row :gutter="20">
@ -20,8 +26,7 @@
</el-col>
<el-col :span="8" :offset="0">
<el-form-item label="编制日期" prop="mrpBaseBo.preparedDate">
<el-date-picker v-model="form.mrpBaseBo.preparedDate" type="date" value-format="YYYY-MM-DD" disabled
placeholder="请选择编制日期" />
<el-date-picker v-model="form.mrpBaseBo.preparedDate" type="date" value-format="YYYY-MM-DD" disabled placeholder="请选择编制日期" />
</el-form-item>
</el-col>
<el-col :span="8" :offset="0">
@ -50,8 +55,14 @@
<submitVerify ref="submitVerifyRef" :task-variables="taskVariables" @submit-callback="submitCallback" />
<approvalRecord ref="approvalRecordRef"></approvalRecord>
<!-- 流程选择对话框 -->
<el-dialog draggable v-model="dialogVisible.visible" :title="dialogVisible.title" :before-close="handleClose"
width="500" class="rounded-lg shadow-lg">
<el-dialog
draggable
v-model="dialogVisible.visible"
:title="dialogVisible.title"
:before-close="handleClose"
width="500"
class="rounded-lg shadow-lg"
>
<div class="p-4">
<p class="text-gray-600 mb-4">请选择要启动的流程</p>
<el-select v-model="flowCode" placeholder="请选择流程" style="width: 100%">
@ -60,10 +71,12 @@
</div>
<template #footer>
<div class="dialog-footer p-4 border-t border-gray-100 flex justify-end space-x-3">
<el-button @click="handleClose"
class="px-4 py-2 border border-gray-300 rounded-md text-gray-700 hover:bg-gray-50 transition-colors">取消</el-button>
<el-button type="primary" @click="submitFlow()"
class="px-4 py-2 bg-primary text-white rounded-md hover:bg-primary/90 transition-colors">确认</el-button>
<el-button @click="handleClose" class="px-4 py-2 border border-gray-300 rounded-md text-gray-700 hover:bg-gray-50 transition-colors"
>取消</el-button
>
<el-button type="primary" @click="submitFlow()" class="px-4 py-2 bg-primary text-white rounded-md hover:bg-primary/90 transition-colors"
>确认</el-button
>
</div>
</template>
</el-dialog>

View File

@ -11,6 +11,7 @@
:id="form.id"
:status="form.approvalDesign"
:pageType="routeParams.type"
:projectName="routeParams.projectName"
/>
</el-card>
<!-- 表单区域 -->

View File

@ -70,6 +70,13 @@
</template>
</el-table-column>
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="附件" align="center" prop="attachmentName">
<template #default="scope">
<el-button :href="scope.row.attachmentName" link type="primary" @click="downloadAttachment(scope.row)">{{
scope.row.attachmentName
}}</el-button>
</template>
</el-table-column>
<el-table-column label="操作" align="center" min-width="120" fixed="right">
<template #default="scope">
<!-- <el-button link type="primary" icon="edit" @click="handleUpdate(scope.row)" v-hasPermi="['materials:materialReceive:edit']"
@ -254,6 +261,11 @@
<file-upload :isShowTip="false" :fileType="['pdf', 'png', 'jpg', 'jpeg']" v-model="form.licenseCountFileId" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="附件" prop="attachmentId">
<file-upload :isShowTip="false" :fileType="['pdf', 'png', 'jpg', 'jpeg', 'zip']" v-model="form.attachmentId" />
</el-form-item>
</el-col>
<el-col :span="24">
<span style="color: #ff0000ab; margin-bottom: 10px; display: block">注意pdf/png/jpg/jpeg格式文件</span>
</el-col>
@ -351,6 +363,7 @@ const getInitFormData = (): MaterialReceiveForm => {
techDocCountFileId: undefined,
licenseCount: undefined,
licenseCountFileId: undefined,
attachmentId: undefined,
storageType: '1',
remark: undefined,
docId: undefined,
@ -538,6 +551,17 @@ const handleUpdate = async (row?: MaterialReceiveVO) => {
proxy?.$modal.msgError('获取详情失败');
}
};
//下载附件
const downloadAttachment = (row: any) => {
if (row.attachmentUrl) {
const link = document.createElement('a');
link.href = row.attachmentUrl;
link.download = row.fileName || 'download';
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
}
};
/** 提交按钮 */
const submitForm = () => {

View File

@ -11,6 +11,7 @@
:id="form.id"
:status="form.approvalOrder"
:pageType="routeParams.type"
:projectName="routeParams.projectName"
/>
</el-card>
<!-- 表单区域 -->

View File

@ -11,6 +11,7 @@
:id="form.id"
:status="form.status"
:pageType="routeParams.type"
:projectName="routeParams.projectName"
/>
</el-card>
<!-- 表单区域 -->
@ -319,7 +320,9 @@ onMounted(() => {
.el-input__inner,
.el-select .el-input__inner {
border-radius: 4px;
transition: border-color 0.2s, box-shadow 0.2s;
transition:
border-color 0.2s,
box-shadow 0.2s;
&:focus {
border-color: var(--primary-light);
@ -329,7 +332,9 @@ onMounted(() => {
.el-textarea__inner {
border-radius: 4px;
transition: border-color 0.2s, box-shadow 0.2s;
transition:
border-color 0.2s,
box-shadow 0.2s;
&:focus {
border-color: var(--primary-light);

View File

@ -11,6 +11,7 @@
:id="form.id"
:status="form.status"
:pageType="routeParams.type"
:projectName="routeParams.projectName"
/>
</el-card>

View File

@ -11,6 +11,7 @@
:id="form.id"
:status="form.approvalPlan"
:pageType="routeParams.type"
:projectName="routeParams.projectName"
/>
</el-card>
<!-- 表单区域 -->

View File

@ -11,6 +11,7 @@
:id="form.id"
:status="form.auditStatus"
:pageType="routeParams.type"
:projectName="routeParams.projectName"
/>
</el-card>
<!-- 表单区域 -->

View File

@ -11,6 +11,7 @@
:id="form.id"
:status="form.completeAuditStatus"
:pageType="routeParams.type"
:projectName="routeParams.projectName"
/>
</el-card>
<!-- 表单区域 -->

View File

@ -11,6 +11,7 @@
:id="form[0]?.id"
:status="form[0]?.planAuditStatus"
:pageType="routeParams.type"
:projectName="routeParams.projectName"
/>
</el-card>
<!-- 表单区域 -->

View File

@ -781,6 +781,7 @@ const handleCheckRules = async (row?: ProjectVO) => {
const _id = row?.id || ids.value[0];
const res = await byProjectIdDetail(_id);
if (res.data) {
console.log(res.data);
res.data.weekday = res.data.weekday.split(',');
Object.assign(form.value, res.data);
}
@ -794,7 +795,7 @@ const ruleSubmit = async () => {
let obj = {
weekday: form.value.weekday.join(','),
projectId: projectId.value,
id: projectId.value,
id: form.value.id,
clockInTime: form.value.clockInTime,
clockOutTime: form.value.clockOutTime,
type: form.value.type

View File

@ -2,13 +2,18 @@
<div class="leftPage">
<div class="topPage">
<Title title="项目公告" />
<div class="content">
<div
class="content"
ref="contentRef"
id="event_scroll"
@mouseenter.native="autoScrollTable(true, false)"
@mouseleave.native="autoScrollTable(false, true)"
>
<div class="content_item" v-for="item in news" :key="item.id">
<img src="@/assets/projectLarge/round.svg" alt="">
<img src="@/assets/projectLarge/round.svg" alt="" />
<div class="ellipsis">
{{ item.title }}
<span @click="showNewsDetail(item)" style="color: rgba(138, 149, 165, 1);">{{ item.id === newId ? '关闭' :
'查看' }}</span>
<span @click="showNewsDetail(item)" style="color: rgba(138, 149, 165, 1)">{{ item.id === newId ? '关闭' : '查看' }}</span>
</div>
</div>
</div>
@ -22,33 +27,33 @@
<div class="endPage">
<Title title="人员情况" />
<div class="map">
<img src="@/assets/projectLarge/map.svg" alt="">
<img src="@/assets/projectLarge/map.svg" alt="" />
<!-- <div ref="mapChartRef"></div> -->
</div>
<div class="attendance_tag">
<div class="tag_item">
<img src="@/assets/projectLarge/people.svg" alt="">
<img src="@/assets/projectLarge/people.svg" alt="" />
<div class="tag_title">出勤人</div>
<div class="tag_info">
{{ attendanceCount }}
<span style="font-size: 14px;"></span>
<span style="font-size: 14px"></span>
</div>
</div>
<div class="tag_item">
<img src="@/assets/projectLarge/people.svg" alt="">
<img src="@/assets/projectLarge/people.svg" alt="" />
<div class="tag_title">在岗人</div>
<div class="tag_info">
{{ peopleCount }}
<span style="font-size: 14px;"></span>
<span style="font-size: 14px"></span>
</div>
</div>
<div class="tag_item">
<img src="@/assets/projectLarge/people.svg" alt="">
<img src="@/assets/projectLarge/people.svg" alt="" />
<div class="tag_title">出勤率</div>
<div class="tag_info">
{{ attendanceRate }}
<span style="font-size: 14px;">%</span>
<span style="font-size: 14px">%</span>
</div>
</div>
</div>
@ -62,8 +67,9 @@
</div>
<div v-for="item in teamAttendanceList" :key="item.id" class="attendance_item">
<div class="attendance_item_title">{{ item.teamName }}</div>
<div class="attendance_item_number">{{ item.attendanceNumber }} <span class="subfont">/{{ item.allNumber
}}</span></div>
<div class="attendance_item_number">
{{ item.attendanceNumber }} <span class="subfont">/{{ item.allNumber }}</span>
</div>
<div class="attendance_item_rate">{{ item.attendanceRate }} %</div>
<div class="attendance_item_date subfont">{{ item.attendanceTime }}</div>
</div>
@ -73,10 +79,10 @@
</template>
<script setup lang="ts">
import { ref } from "vue"
import Title from './title.vue'
import { getScreenNews, getScreenPeople } from '@/api/projectScreen';
import { mapOption } from './optionList'
import { ref } from 'vue';
import Title from './title.vue';
import { getScreenNews, getScreenPeople } from '@/api/projectScreen/index';
import { mapOption } from './optionList';
import * as echarts from 'echarts';
const props = defineProps({
@ -84,78 +90,102 @@ const props = defineProps({
type: String,
default: ''
}
})
});
let mapChart = null
let mapChart = null;
const mapChartRef = ref<HTMLDivElement | null>(null);
const news = ref([])
const contentRef = ref<HTMLDivElement | null>(null);
const news = ref([]);
const newDetail = ref({
title: '',
content: ''
})
const newId = ref('')
const attendanceCount = ref(0)
const attendanceRate = ref(0)
const peopleCount = ref(0)
const teamAttendanceList = ref([
{ id: "", teamName: "", attendanceNumber: 0, allNumber: 0, attendanceRate: 0, attendanceTime: "" },
])
});
const newId = ref('');
const attendanceCount = ref(0);
const attendanceRate = ref(0);
const peopleCount = ref(0);
const teamAttendanceList = ref([{ id: '', teamName: '', attendanceNumber: 0, allNumber: 0, attendanceRate: 0, attendanceTime: '' }]);
/**
* 显示新闻详情
*/
const showNewsDetail = (item: any) => {
if (newId.value === item.id) {
newId.value = ''
return
newId.value = '';
return;
}
newDetail.value = item
newId.value = item.id
}
newDetail.value = item;
newId.value = item.id;
};
/**
* 获取项目人员出勤数据
*/
const getPeopleData = async () => {
const res = await getScreenPeople(props.projectId);
const { data, code } = res
const { data, code } = res;
if (code === 200) {
attendanceCount.value = data.attendanceCount
attendanceRate.value = data.attendanceRate
peopleCount.value = data.peopleCount
teamAttendanceList.value = data.teamAttendanceList
attendanceCount.value = data.attendanceCount;
attendanceRate.value = data.attendanceRate;
peopleCount.value = data.peopleCount;
teamAttendanceList.value = data.teamAttendanceList;
}
}
};
/**
* 获取项目新闻数据
*/
const getNewsData = async () => {
const res = await getScreenNews(props.projectId);
const { data, code } = res
const { data, code } = res;
if (code === 200) {
news.value = data
news.value = data;
autoScrollTable(5);
}
}
};
/**
* 初始化地图
*/
const initMapChart = () => {
if (!mapChartRef.value) {
var lastTime = 0;
const state = reactive({
events: [],
outputList: [],
detialInfoShow: false,
notShowPro: [{ id: 37 }, { id: 44 }, { id: 48 }], //模块内容区域不展示的项目(中煤科工 广东户用光伏项目 兴隆光伏)
scrolltimerTable: null,
flagPause: true //滚动继续滚动
});
const autoScrollTable = (time, flag = true) => {
//表格自动滚动
const divData = document.getElementById('event_scroll');
if (!flag || !state.flagPause) {
cancelAnimationFrame(state.scrolltimerTable);
return;
}
mapChart = echarts.init(mapChartRef.value);
mapChart.setOption(mapOption);
}
if (time - lastTime < 25) {
// 50毫秒更新一次
state.scrolltimerTable = requestAnimationFrame(autoScrollTable);
return; // 如果时间未到,则返回,不执行动画更新
}
lastTime = time;
// 元素自增距离顶部1像素
divData.scrollTop += 1;
// 判断元素是否滚动到底部(可视高度+距离顶部=整个高度)
if (divData.clientHeight + divData.scrollTop == divData.scrollHeight) {
// 重置table距离顶部距离
divData.scrollTop = 0;
state.scrolltimerTable = requestAnimationFrame(autoScrollTable);
} else {
state.scrolltimerTable = requestAnimationFrame(autoScrollTable);
}
};
onMounted(() => {
// nextTick(() => {
// initMapChart();
// });
getPeopleData()
getNewsData()
})
getPeopleData();
getNewsData();
});
onUnmounted(() => {
// if (mapChart) {
@ -163,7 +193,6 @@ onUnmounted(() => {
// mapChart = null;
// }
});
</script>
<style scoped lang="scss">

View File

@ -4,11 +4,26 @@ import CesiumImageLabelEntity from '../js/CesiumImageLabelEntity.js';
import CesiumFlyToRoamingController from '../js/CesiumFlyToRoamingController.js';
import { setSelect, getSelectList, getGps } from '@/api/projectScreen/index.ts'
import videoDialog from "./video.vue"
import { getToken } from '@/utils/auth';
const defaultExpandedKeys = [1, 2, 3] //默认展开第一级节点
const defaultCheckedKeys = ref([]) //默认选中节点
const data = ref([]);
const deviceId = ref('');
const videoDialogRef = ref(null);
let token = 'Bearer '+ getToken()
let ws = new ReconnectingWebSocket( import.meta.env.VITE_APP_BASE_WS_API + '?Authorization='+token+'&clientid='+import.meta.env.VITE_APP_CLIENT_ID+'&projectId='+'1897160897167638529');
// 连接ws
const connectWs = () => {
ws.onopen = (e) => {
// let message ={
// projectId:'1897160897167638529',
// }
// ws.send(JSON.stringify(message));
ws.onmessage = (e) => {
console.log('ws', e);
};
};
}
const props = defineProps({
isHide:{
type:Boolean,
@ -214,6 +229,8 @@ function stopRoaming() {
}
}
onMounted(() => {
// 连接ws
connectWs();
// 获取选中节点
getCheckedNode();
// 获取GPS数据

View File

@ -7,7 +7,7 @@
<el-form :model="queryForm" :inline="true">
<el-form-item label="版本号" prop="versions">
<el-select v-model="queryForm.versions" placeholder="选择版本号" @change="changeVersions">
<el-option v-for="item in options" :key="item.versions" :label="item.versions" :value="item.versions" />
<el-option v-for="item in options" :key="item.versions" :label="item.versionsName" :value="item.versions" />
</el-select>
</el-form-item>
<el-form-item label="表名" prop="sheet" v-if="activeTab != '3'">

View File

@ -11,6 +11,7 @@
:id="form.versions"
:status="form.status"
:pageType="routeParams.type"
:projectName="routeParams.projectName"
/>
</el-card>
<!-- 表单区域 -->
@ -162,7 +163,7 @@ const { form, rules, tableData } = toRefs(data);
// form.value = { ...initFormData };
// leaveFormRef.value?.resetFields();
// };
const projectId = ref('');
/** 获取详情 */
const getInfo = () => {
loading.value = true;
@ -170,6 +171,7 @@ const getInfo = () => {
nextTick(async () => {
const res = await getVersionDetail(routeParams.value.id);
console.log(res);
projectId.value = res.data.projectId;
Object.assign(form.value, res.data);
loading.value = false;
buttonLoading.value = false;
@ -181,7 +183,7 @@ const sheets = ref([]);
const getSheetName = async () => {
try {
const params = {
projectId: currentProject.value?.id,
projectId: projectId.value,
versions: form.value.versions
};
const res = await sheetList(params);
@ -201,7 +203,7 @@ const changeSheet = () => {
//获取列表
const getListTable = async () => {
const res = await getTableList({
projectId: currentProject.value?.id,
projectId: projectId.value,
versions: form.value.versions,
sheet: form.value.sheet,
type: '2'

View File

@ -11,6 +11,7 @@
:id="form.versions"
:status="form.status"
:pageType="routeParams.type"
:projectName="routeParams.projectName"
/>
</el-card>
<!-- 表单区域 -->
@ -26,11 +27,11 @@
<el-form-item label="版本号" prop="formNo">
<el-input :disabled="true" v-model="form.versions" placeholder="请输入文件名称" />
</el-form-item>
<el-form-item label="表名" prop="sheet">
<!-- <el-form-item label="表名" prop="sheet">
<el-select v-model="form.sheet" placeholder="选择表名" @change="changeSheet">
<el-option v-for="item in sheets" :key="item" :label="item" :value="item" />
</el-select>
</el-form-item>
</el-form-item> -->
</el-col>
</el-row>
</div>
@ -162,7 +163,7 @@ const { form, rules, tableData } = toRefs(data);
// form.value = { ...initFormData };
// leaveFormRef.value?.resetFields();
// };
const projectId = ref('');
/** 获取详情 */
const getInfo = () => {
loading.value = true;
@ -170,10 +171,11 @@ const getInfo = () => {
nextTick(async () => {
const res = await getVersionDetail(routeParams.value.id);
console.log(res);
projectId.value = res.data.projectId;
Object.assign(form.value, res.data);
loading.value = false;
buttonLoading.value = false;
getSheetName();
getListTable();
});
};
const sheets = ref([]);
@ -201,9 +203,9 @@ const changeSheet = () => {
//获取列表
const getListTable = async () => {
const res = await getTableList({
projectId: currentProject.value?.id,
projectId: projectId.value,
versions: form.value.versions,
sheet: form.value.sheet,
// sheet: form.value.sheet,
type: '3'
});
if (res.code == 200) {

View File

@ -11,6 +11,7 @@
:id="form.id"
:status="form.state"
:pageType="routeParams.type"
:projectName="routeParams.projectName"
/>
</el-card>
<!-- 表单区域 -->

View File

@ -9,6 +9,7 @@
:id="form.id"
:status="form.status"
:pageType="routeParams.type"
:projectName="routeParams.projectName"
/>
</el-card>
<el-card shadow="never" style="height: 78vh; overflow-y: auto">

View File

@ -38,6 +38,7 @@
<el-table v-loading="loading" border :data="taskList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column align="center" type="index" label="序号" width="60"></el-table-column>
<el-table-column align="center" prop="projectName" label="项目名称" :show-overflow-tooltip="true"></el-table-column>
<el-table-column :show-overflow-tooltip="true" prop="flowName" align="center" label="流程名称"></el-table-column>
<el-table-column align="center" prop="categoryName" label="流程分类"></el-table-column>
<el-table-column align="center" prop="version" label="版本号" width="90">

View File

@ -49,6 +49,7 @@
<el-table v-loading="loading" border :data="processInstanceList" @selection-change="handleSelectionChange">
<el-table-column align="center" type="index" label="序号" width="60"></el-table-column>
<el-table-column align="center" prop="projectName" label="项目名称" :show-overflow-tooltip="true"></el-table-column>
<el-table-column v-if="false" align="center" prop="id" label="id"></el-table-column>
<el-table-column :show-overflow-tooltip="true" prop="flowName" align="center" label="流程名称"> </el-table-column>
<!-- <el-table-column align="center" prop="flowCode" label="流程定义编码"></el-table-column> -->
@ -248,7 +249,8 @@ const handleOpen = async (row, type) => {
taskId: row.id,
type: type,
formCustom: row.formCustom,
formPath: row.formPath
formPath: row.formPath,
projectName: row.projectName
});
workflowCommon.routerJump(routerJumpVo, proxy);
};

View File

@ -33,6 +33,7 @@
<el-table v-loading="loading" border :data="taskList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column align="center" type="index" label="序号" width="60"></el-table-column>
<el-table-column align="center" prop="projectName" label="项目名称" :show-overflow-tooltip="true"></el-table-column>
<el-table-column :show-overflow-tooltip="true" prop="flowName" align="center" label="流程名称"></el-table-column>
<el-table-column align="center" prop="categoryName" label="流程分类"></el-table-column>
<el-table-column align="center" prop="nodeName" label="任务名称"></el-table-column>
@ -131,7 +132,8 @@ const handleView = (row) => {
taskId: row.id,
type: 'view',
formCustom: row.formCustom,
formPath: row.formPath
formPath: row.formPath,
projectName: row.projectName
});
workflowCommon.routerJump(routerJumpVo, proxy);
};

View File

@ -37,6 +37,7 @@
<el-table v-loading="loading" border :data="taskList" @selection-change="handleSelectionChange">
<el-table-column align="center" type="index" label="序号" width="60"></el-table-column>
<el-table-column align="center" prop="projectName" label="项目名称" :show-overflow-tooltip="true"></el-table-column>
<el-table-column align="center" prop="flowName" label="流程名称"></el-table-column>
<el-table-column align="center" prop="categoryName" label="流程分类"></el-table-column>
<el-table-column align="center" prop="version" label="版本号" width="90">
@ -164,7 +165,8 @@ const handleView = (row: FlowTaskVO) => {
taskId: row.id,
type: 'view',
formCustom: row.formCustom,
formPath: row.formPath
formPath: row.formPath,
projectName: row.projectName
});
workflowCommon.routerJump(routerJumpVo, proxy);
};

View File

@ -36,6 +36,7 @@
</template>
<el-table v-loading="loading" border :data="taskList" @selection-change="handleSelectionChange">
<el-table-column align="center" type="index" label="序号" width="60"></el-table-column>
<el-table-column align="center" prop="projectName" label="项目名称" :show-overflow-tooltip="true"></el-table-column>
<el-table-column :show-overflow-tooltip="true" prop="flowName" align="center" label="流程名称"></el-table-column>
<el-table-column align="center" prop="categoryName" label="流程分类"></el-table-column>
<el-table-column align="center" prop="nodeName" label="任务名称"></el-table-column>
@ -167,7 +168,8 @@ const handleOpen = async (row: FlowTaskVO) => {
type: 'approval',
formCustom: row.formCustom,
planMonth: row.businessId.split('_')[1],
formPath: row.formPath
formPath: row.formPath,
projectName: row.projectName
});
workflowCommon.routerJump(routerJumpVo, proxy);
};

File diff suppressed because one or more lines are too long