Compare commits

..

No commits in common. "8d890cb357c8b8101e37da2c86ab19722bdee19f" and "227b1bc1aad8fed6db8e6ff969c600937d685dce" have entirely different histories.

42 changed files with 450 additions and 753 deletions

View File

@ -1,9 +1,9 @@
VITE_BASE=/ VITE_BASE=/
# VITE_BASE_URL=http://192.168.0.25:8095/ # VITE_BASE_URL=http://192.168.0.25:8095/
VITE_BASE_URL=http://192.168.4.226:8095/ VITE_BASE_URL=http://192.168.0.37:8095/
#websocket t掉线 #websocket t掉线
VITE_ON_LINE_WEB_SOCKET_URL=ws://192.168.4.226:8869 VITE_ON_LINE_WEB_SOCKET_URL=ws://192.168.0.37:8869
#websocket 在线学习 #websocket 在线学习
VITE_LEARNING_WEB_SOCKET_URL=ws://192.168.4.226:8899 VITE_LEARNING_WEB_SOCKET_URL=ws://192.168.0.37:8899

View File

@ -1,6 +1,6 @@
VITE_BASE=/dist VITE_BASE=/dist
#VITE_BASE_URL=http://10.199.64.27:8520/integrated_yjb/ #VITE_BASE_URL=http://10.199.64.27:8520/integrated_yjb/
VITE_BASE_URL=http://172.16.112.251:8081/sx_yjb/ VITE_BASE_URL=http://192.168.20.240:8542/integrated_yjb/
#VITE_BASE_URL=https://qaaqwh.qhdsafety.com/integrated_whb/ #VITE_BASE_URL=https://qaaqwh.qhdsafety.com/integrated_whb/
#websocket t掉线 #websocket t掉线

View File

@ -23,7 +23,7 @@ module.exports = {
"camelcase": "off", "camelcase": "off",
"eqeqeq": "error", "eqeqeq": "error",
"vue/no-template-shadow": "error", "vue/no-template-shadow": "error",
"vue/attribute-hyphenation": "off", "vue/attribute-hyphenation": "error",
"vue/html-end-tags": "error", "vue/html-end-tags": "error",
"vue/eqeqeq": "error", "vue/eqeqeq": "error",
"vue/component-name-in-template-casing": ["error", "kebab-case"], "vue/component-name-in-template-casing": ["error", "kebab-case"],

View File

@ -14,7 +14,6 @@
"@icon-park/vue-next": "^1.4.2", "@icon-park/vue-next": "^1.4.2",
"@vueuse/core": "^9.13.0", "@vueuse/core": "^9.13.0",
"@vueuse/integrations": "^10.7.1", "@vueuse/integrations": "^10.7.1",
"@wangeditor/editor": "^5.1.23",
"@wangeditor/editor-for-vue": "^5.1.12", "@wangeditor/editor-for-vue": "^5.1.12",
"animate.css": "^4.1.1", "animate.css": "^4.1.1",
"autofit.js": "^3.0.7", "autofit.js": "^3.0.7",
@ -22,12 +21,11 @@
"dayjs": "^1.11.10", "dayjs": "^1.11.10",
"echarts": "^5.4.3", "echarts": "^5.4.3",
"element-plus": "^2.6.1", "element-plus": "^2.6.1",
"hls.js": "^1.6.13", "mp4box": "^0.5.2",
"html2canvas": "^1.4.1", "html2canvas": "^1.4.1",
"jspdf": "^2.5.1", "jspdf": "^2.5.1",
"lodash-es": "^4.17.21", "lodash-es": "^4.17.21",
"mitt": "^3.0.1", "mitt": "^3.0.1",
"mp4box": "^0.5.2",
"nanoid": "^5.0.4", "nanoid": "^5.0.4",
"normalize.css": "^8.0.1", "normalize.css": "^8.0.1",
"pako": "^2.1.0", "pako": "^2.1.0",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 MiB

After

Width:  |  Height:  |  Size: 3.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 46 KiB

View File

@ -7,59 +7,15 @@
width="70%" width="70%"
> >
<el-divider content-position="left">实时监测</el-divider> <el-divider content-position="left">实时监测</el-divider>
<el-card>
<el-form
:model="searchForm"
label-width="100px"
@submit.prevent="fnResetPagination"
>
<el-row>
<el-col :span="8">
<el-form-item label="开始时间" prop="START_TIME">
<el-date-picker
v-model="searchForm.START_TIME"
format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss"
type="datetime"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="结束时间" prop="START_TIME">
<el-date-picker
v-model="searchForm.END_TIME"
format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss"
type="datetime"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label-width="10px">
<el-button type="primary" native-type="submit">搜索</el-button>
<el-button native-type="reset" @click="fnResetPagination">
重置
</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<layout-card> <layout-card>
<layout-table <layout-table
ref="tableRef" :show-pagination="false"
v-model:pagination="pagination" :data="data.realTimeMonitoringDataList"
row-key="AREA_ID"
:show-pagination="true"
:data="list"
@get-data="fnGetData"
> >
<!-- <el-table-column prop="PLC_NAME" label="监测节点名称" />--> <el-table-column prop="PLC_NAME" label="监测节点名称" />
<el-table-column prop="TARGET_NAME" label="监测节点名称" />
<el-table-column prop="CURRENT_VALUE" label="当前值"> <el-table-column prop="CURRENT_VALUE" label="当前值">
<template #default="{ row }"> <template #default="{ row }">
<!-- {{ formatValue(row.SIGNAL_TYPE, row.CURRENT_VALUE) }}--> {{ formatValue(row.SIGNAL_TYPE, row.CURRENT_VALUE) }}
{{ row.CURRENT_VALUE }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="TARGET_UNIT" label="单位"/> <el-table-column prop="TARGET_UNIT" label="单位"/>
@ -73,9 +29,9 @@
</template> </template>
<script setup> <script setup>
import { useVModels } from "@vueuse/core"; import { reactive } from "vue";
import { getRealTimeMonitoringData } from "@/request/tb_iron.js"; import { useIntervalFn, useVModels } from "@vueuse/core";
import useListData from "@/assets/js/useListData.js"; import { getIronAllPlcRealTimeMonitoringDataList } from "@/request/tb_iron.js";
const props = defineProps({ const props = defineProps({
visible: { visible: {
@ -94,24 +50,37 @@ const props = defineProps({
default: "", default: "",
}, },
}); });
const data = reactive({
realTimeMonitoringDataList: [],
});
const emits = defineEmits(["update:visible"]); const emits = defineEmits(["update:visible"]);
const { visible } = useVModels(props, emits); const { visible } = useVModels(props, emits);
const fnClose = () => { const fnClose = () => {
pause();
visible.value = false; visible.value = false;
}; };
const { list, pagination, searchForm, fnGetData, fnResetPagination, tableRef } =
useListData(getRealTimeMonitoringData, { const { pause } = useIntervalFn(
otherParams: { async () => {
if (props.equipmentId) {
const resData = await getIronAllPlcRealTimeMonitoringDataList({
EQUIPMENT_ID: props.equipmentId, EQUIPMENT_ID: props.equipmentId,
}, DEVICE_TYPE: props.deviceType,
loading: false,
}); });
data.realTimeMonitoringDataList = resData.varList;
}
},
5000,
{ immediate: true, immediateCallback: true }
);
/* ----------------- 工具:把原始值转换成最终显示文本 ----------------- */ /* ----------------- 工具:把原始值转换成最终显示文本 ----------------- */
// function formatValue(type, val) { function formatValue(type, val) {
// // ID // ID
// if (type==='1') return val if (type==='1') return val
// // 0.0 -> -> // 0.0 -> ->
// return val === '0.0' ? '' : '' return val === '0.0' ? '关' : '开'
// } }
</script> </script>
<style scoped lang="scss"></style> <style scoped lang="scss"></style>

View File

@ -1,36 +1,82 @@
<template> <template>
<el-dialog v-model="visible" title="视频" :append-to-body="appendToBody"> <el-dialog v-model="visible" title="视频" :append-to-body="appendToBody">
<!-- 原生video标签支持大部分基础格式如MP4 --> <ali-player
<video controls :src="fnSrc(src)" autoplay></video> ref="playerRef"
:source="fnSrc(src)"
:vid="vid"
:play-auth="playAuth"
:visible="visible"
:cover="cover"
:autoplay="autoplay"
:show-progress="showProgress"
:play-time="playTime"
/>
</el-dialog> </el-dialog>
</template> </template>
<script setup> <script setup>
import { useVModel } from "@vueuse/core"; import { useVModel } from "@vueuse/core";
import { watchEffect } from "vue"; import AliPlayer from "@/components/ali-player/index.vue";
import { ref, watchEffect } from "vue";
const VITE_FILE_URL = import.meta.env.VITE_FILE_URL; const VITE_FILE_URL = import.meta.env.VITE_FILE_URL;
defineOptions({
name: "LayoutVideo",
});
const props = defineProps({ const props = defineProps({
src: { type: String, default: "" }, src: {
visible: { type: Boolean, required: true, default: false }, type: String,
appendToBody: { type: Boolean, default: false }, default: "",
autoplay: { type: Boolean, default: true }, },
vid: {
type: String,
default: "",
},
playAuth: {
type: String,
default: "",
},
visible: {
type: Boolean,
required: true,
default: false,
},
appendToBody: {
type: Boolean,
default: false,
},
cover: {
type: String,
default: "",
},
autoplay: {
type: Boolean,
default: true,
},
showProgress: {
type: Boolean,
default: true,
},
playTime: {
type: Number,
default: 0,
},
}); });
const emits = defineEmits(["update:visible"]); const emits = defineEmits(["update:visible"]);
const visible = useVModel(props, "visible", emits); const visible = useVModel(props, "visible", emits);
const playerRef = ref(null);
const fnSrc = (src) => { const fnSrc = (src) => {
if (!src) return; if (!src) return;
if (src.includes("http") || src.includes("https")) return src; if (src.indexOf("http") !== -1 || src.indexOf("https") !== -1) return src;
return VITE_FILE_URL + src; else return VITE_FILE_URL + src;
}; };
watchEffect(() => { watchEffect(() => {
const video = document.querySelector("video"); if (visible.value) {
if (visible.value && video) { playerRef.value && playerRef.value.play();
video.play().catch((err) => console.error("自动播放失败:", err)); } else {
} else if (video) { playerRef.value && playerRef.value.pause();
video.pause();
} }
}); });
</script> </script>
<style scoped lang="scss"></style>

View File

@ -69,7 +69,7 @@ import { useMenuStore } from "@/pinia/menu";
import { useUserStore } from "@/pinia/user"; import { useUserStore } from "@/pinia/user";
import { MENU } from "@/assets/js/constant"; import { MENU } from "@/assets/js/constant";
import { getInfo, getUserInfo, logout } from "@/request/api"; import { getInfo, getUserInfo, logout } from "@/request/api";
// import { getSpecialOperationsWarnAmount } from "@/request/special_operations"; import { getSpecialOperationsWarnAmount } from "@/request/special_operations";
import UpdateInfo from "./components/update_info.vue"; import UpdateInfo from "./components/update_info.vue";
import UpdateAvatar from "./components/update_avatar.vue"; import UpdateAvatar from "./components/update_avatar.vue";
import { checkImgExists, addingPrefixToFile } from "@/assets/js/utils.js"; import { checkImgExists, addingPrefixToFile } from "@/assets/js/utils.js";
@ -174,19 +174,19 @@ const fnSignOut = async () => {
userStore.$reset(); userStore.$reset();
await router.replace("/login"); await router.replace("/login");
}; };
// const fnSpecialOperationsWarnAmount = async () => { const fnSpecialOperationsWarnAmount = async () => {
// const resData = await getSpecialOperationsWarnAmount({ loading: false }); const resData = await getSpecialOperationsWarnAmount({ loading: false });
// if (resData.message) { if (resData.message) {
// notify = ElNotification({ notify = ElNotification({
// title: "", title: "温馨提示",
// dangerouslyUseHTMLString: true, dangerouslyUseHTMLString: true,
// message: resData.message, message: resData.message,
// duration: 0, duration: 0,
// type: "warning", type: "warning",
// }); });
// } }
// }; };
// fnSpecialOperationsWarnAmount(); fnSpecialOperationsWarnAmount();
const fnNavigationBI = async () => { const fnNavigationBI = async () => {
notify && notify.close(); notify && notify.close();
const res = await getRydyWebsiteStatus(); const res = await getRydyWebsiteStatus();

View File

@ -31,4 +31,5 @@ export const setLicensedManagementView = (params) =>
post("/licensedPersonnel/goEdit", params); // 单个持证人员 post("/licensedPersonnel/goEdit", params); // 单个持证人员
export const setSpecialOperationsImport = (params) => export const setSpecialOperationsImport = (params) =>
upload("/specialoperations/readExcel", params); upload("/specialoperations/readExcel", params);
export const getForeNsicStatisticsList = () => post("/specialoperations/stats"); // 特种作业人员管理列表 export const getForeNsicStatisticsList = () =>
post("/specialoperations/stats"); // 特种作业人员管理列表

View File

@ -50,8 +50,6 @@ export const setIronIronPlcSensorRemove = (params) =>
post("/tbIronIronPlc/removeSensor", params); post("/tbIronIronPlc/removeSensor", params);
export const setIronIronPlcSensorEdit = (params) => export const setIronIronPlcSensorEdit = (params) =>
post("/tbIronIronPlc/editSensor", params); post("/tbIronIronPlc/editSensor", params);
export const setIronIronPlcSensorAdd = (params) =>
post("/tbIronIronPlc/addSensor", params);
export const setIronPlcImport = (params) => export const setIronPlcImport = (params) =>
upload("/tbIronIronPlc/readExcel", params); upload("/tbIronIronPlc/readExcel", params);
@ -78,6 +76,3 @@ export const setIronWarnInfoFeedbackEdit = (params) =>
export const setIronEarlyWarning = (params) => export const setIronEarlyWarning = (params) =>
post("/tbIronWarnInfo/earlyWarningEdit", params); post("/tbIronWarnInfo/earlyWarningEdit", params);
export const getRealTimeMonitoringData = (params) =>
post("/deviceMonitoring/getRealTimeMonitoringData", params);

View File

@ -8,9 +8,3 @@ export const getvideoInfoView = (params) => post("/videoInfo/goEdit", params); /
export const setvideoInfoDelete = (params) => post("/videoInfo/delete", params); // 删除 export const setvideoInfoDelete = (params) => post("/videoInfo/delete", params); // 删除
export const setUpToBi = (params) => post("/videoInfo/editZhiding", params); // 删除 export const setUpToBi = (params) => post("/videoInfo/editZhiding", params); // 删除
export const setvideoInfoEdit = (params) => post("/videoInfo/edit", params); export const setvideoInfoEdit = (params) => post("/videoInfo/edit", params);
export const startTransCode = (params) =>
post("/playVideo/startTranscode", params);
export const stopTransCode = (params) =>
post("/playVideo/stopTranscode", params);
export const getTranscodeStatus = (params) =>
post("/playVideo/getTranscodeStatus", params);

View File

@ -133,7 +133,7 @@
<check-list <check-list
v-if="data.checkListDialog.visible" v-if="data.checkListDialog.visible"
v-model:visible="data.checkListDialog.visible" v-model:visible="data.checkListDialog.visible"
v-model:foreign-key="data.checkListDialog.FOREIGN_KEY" v-model:foreignKey="data.checkListDialog.FOREIGN_KEY"
/> />
</div> </div>
</template> </template>

View File

@ -240,7 +240,7 @@
<check-list <check-list
v-if="data.checkListDialog.visible" v-if="data.checkListDialog.visible"
v-model:visible="data.checkListDialog.visible" v-model:visible="data.checkListDialog.visible"
v-model:foreign-key="data.checkListDialog.FOREIGN_KEY" v-model:foreignKey="data.checkListDialog.FOREIGN_KEY"
/> />
<layout-video <layout-video
v-model:visible="data.videoDialog.visible" v-model:visible="data.videoDialog.visible"

View File

@ -134,7 +134,7 @@
<check-list <check-list
v-if="data.checkListDialog.visible" v-if="data.checkListDialog.visible"
v-model:visible="data.checkListDialog.visible" v-model:visible="data.checkListDialog.visible"
v-model:foreign-key="data.checkListDialog.FOREIGN_KEY" v-model:foreignKey="data.checkListDialog.FOREIGN_KEY"
/> />
</div> </div>
</template> </template>

View File

@ -246,7 +246,7 @@
<check-list <check-list
v-if="data.checkListDialog.visible" v-if="data.checkListDialog.visible"
v-model:visible="data.checkListDialog.visible" v-model:visible="data.checkListDialog.visible"
v-model:foreign-key="data.checkListDialog.FOREIGN_KEY" v-model:foreignKey="data.checkListDialog.FOREIGN_KEY"
/> />
<layout-video <layout-video
v-model:visible="data.videoDialog.visible" v-model:visible="data.videoDialog.visible"

View File

@ -122,7 +122,7 @@
<check-list <check-list
v-if="data.checkListDialog.visible" v-if="data.checkListDialog.visible"
v-model:visible="data.checkListDialog.visible" v-model:visible="data.checkListDialog.visible"
v-model:foreign-key="data.checkListDialog.FOREIGN_KEY" v-model:foreignKey="data.checkListDialog.FOREIGN_KEY"
/> />
</div> </div>
</template> </template>

View File

@ -223,7 +223,7 @@
<check-list <check-list
v-if="data.checkListDialog.visible" v-if="data.checkListDialog.visible"
v-model:visible="data.checkListDialog.visible" v-model:visible="data.checkListDialog.visible"
v-model:foreign-key="data.checkListDialog.FOREIGN_KEY" v-model:foreignKey="data.checkListDialog.FOREIGN_KEY"
/> />
<layout-video <layout-video
v-model:visible="data.videoDialog.visible" v-model:visible="data.videoDialog.visible"

View File

@ -122,7 +122,7 @@
<check-list <check-list
v-if="data.checkListDialog.visible" v-if="data.checkListDialog.visible"
v-model:visible="data.checkListDialog.visible" v-model:visible="data.checkListDialog.visible"
v-model:foreign-key="data.checkListDialog.FOREIGN_KEY" v-model:foreignKey="data.checkListDialog.FOREIGN_KEY"
/> />
</div> </div>
</template> </template>

View File

@ -230,7 +230,7 @@
<check-list <check-list
v-if="data.checkListDialog.visible" v-if="data.checkListDialog.visible"
v-model:visible="data.checkListDialog.visible" v-model:visible="data.checkListDialog.visible"
v-model:foreign-key="data.checkListDialog.FOREIGN_KEY" v-model:foreignKey="data.checkListDialog.FOREIGN_KEY"
/> />
<layout-video <layout-video
v-model:visible="data.videoDialog.visible" v-model:visible="data.videoDialog.visible"

View File

@ -123,7 +123,7 @@
<check-list <check-list
v-if="data.checkListDialog.visible" v-if="data.checkListDialog.visible"
v-model:visible="data.checkListDialog.visible" v-model:visible="data.checkListDialog.visible"
v-model:foreign-key="data.checkListDialog.FOREIGN_KEY" v-model:foreignKey="data.checkListDialog.FOREIGN_KEY"
/> />
</div> </div>
</template> </template>

View File

@ -229,7 +229,7 @@
<check-list <check-list
v-if="data.checkListDialog.visible" v-if="data.checkListDialog.visible"
v-model:visible="data.checkListDialog.visible" v-model:visible="data.checkListDialog.visible"
v-model:foreign-key="data.checkListDialog.FOREIGN_KEY" v-model:foreignKey="data.checkListDialog.FOREIGN_KEY"
/> />
<layout-video <layout-video
v-model:visible="data.videoDialog.visible" v-model:visible="data.videoDialog.visible"

View File

@ -127,7 +127,7 @@
<check-list <check-list
v-if="data.checkListDialog.visible" v-if="data.checkListDialog.visible"
v-model:visible="data.checkListDialog.visible" v-model:visible="data.checkListDialog.visible"
v-model:foreign-key="data.checkListDialog.FOREIGN_KEY" v-model:foreignKey="data.checkListDialog.FOREIGN_KEY"
/> />
</div> </div>
</template> </template>

View File

@ -244,7 +244,7 @@
<check-list <check-list
v-if="data.checkListDialog.visible" v-if="data.checkListDialog.visible"
v-model:visible="data.checkListDialog.visible" v-model:visible="data.checkListDialog.visible"
v-model:foreign-key="data.checkListDialog.FOREIGN_KEY" v-model:foreignKey="data.checkListDialog.FOREIGN_KEY"
/> />
<show-points <show-points
:id="data.showPointsDialog.id" :id="data.showPointsDialog.id"

View File

@ -40,7 +40,7 @@
<script setup> <script setup>
import { nextTick, reactive, ref } from "vue"; import { nextTick, reactive, ref } from "vue";
import { getCalendar } from "@/request/index.js"; import { getCalendar, getWorkReminder } from "@/request/index.js";
import dayjs from "dayjs"; import dayjs from "dayjs";
import ScheduleAdd from "./schedule_add.vue"; import ScheduleAdd from "./schedule_add.vue";
@ -70,9 +70,9 @@ const fnGetCalendar = async () => {
} }
}; };
const fnGetWorkReminder = async () => { const fnGetWorkReminder = async () => {
// const resData = await getWorkReminder(); const resData = await getWorkReminder();
// wjcNum.value = resData.wjcNum; wjcNum.value = resData.wjcNum;
// yjcNum.value = resData.yjcNum; yjcNum.value = resData.yjcNum;
}; };
const fnGetSchedule = async (CDATA, type = "") => { const fnGetSchedule = async (CDATA, type = "") => {
const resData = await getCalendar({ CDATA }); const resData = await getCalendar({ CDATA });

View File

@ -21,8 +21,8 @@
<script setup> <script setup>
import { onBeforeUnmount, onMounted, ref } from "vue"; import { onBeforeUnmount, onMounted, ref } from "vue";
// import * as echarts from "echarts"; import * as echarts from "echarts";
// import { getChecklistCheck } from "@/request/index.js"; import { getChecklistCheck } from "@/request/index.js";
import dayjs from "dayjs"; import dayjs from "dayjs";
let myChart3; let myChart3;
@ -30,87 +30,87 @@ const dates = ref([
dayjs().startOf("year").format("YYYY-MM-DD"), dayjs().startOf("year").format("YYYY-MM-DD"),
dayjs().endOf("year").format("YYYY-MM-DD"), dayjs().endOf("year").format("YYYY-MM-DD"),
]); ]);
// const fnGetData = async () => { const fnGetData = async () => {
// const resData = await getChecklistCheck({ const resData = await getChecklistCheck({
// STARTTIME: dates.value[0], STARTTIME: dates.value[0],
// ENDTIME: dates.value[1], ENDTIME: dates.value[1],
// }); });
// myChart3 && myChart3.dispose(); myChart3 && myChart3.dispose();
// fnInitEcharts(resData.varList); fnInitEcharts(resData.varList);
// }; };
// const fnInitEcharts = (data) => { const fnInitEcharts = (data) => {
// myChart3 = echarts.init(document.querySelector("#main3")); myChart3 = echarts.init(document.querySelector("#main3"));
// const x_Data = []; const x_Data = [];
// const y_Data = []; const y_Data = [];
// for (let i = 0; i < data.length; i++) { for (let i = 0; i < data.length; i++) {
// x_Data.push(data[i].percentage); x_Data.push(data[i].percentage);
// y_Data.push(data[i].name); y_Data.push(data[i].name);
// } }
// const option = { const option = {
// title: { title: {
// text: "%", text: "清单检查完成率统计(单位%",
// top: "3%", top: "3%",
// textStyle: { textStyle: {
// fontSize: "14", fontSize: "14",
// color: "#fff", color: "#fff",
// fontWeight: "700", fontWeight: "700",
// }, },
// }, },
// tooltip: { tooltip: {
// trigger: "axis", trigger: "axis",
// axisPointer: { axisPointer: {
// type: "shadow", type: "shadow",
// }, },
// }, },
// grid: { grid: {
// left: "3%", left: "3%",
// right: "4%", right: "4%",
// bottom: "3%", bottom: "3%",
// top: "15%", top: "15%",
// containLabel: true, containLabel: true,
// }, },
// xAxis: { xAxis: {
// show: false, show: false,
// type: "value", type: "value",
// boundaryGap: [0, 0.01], boundaryGap: [0, 0.01],
// }, },
// yAxis: { yAxis: {
// type: "category", type: "category",
// data: y_Data, data: y_Data,
// axisLabel: { axisLabel: {
// color: "#fff", color: "#fff",
// }, },
// }, },
// series: [ series: [
// { {
// type: "bar", type: "bar",
// data: x_Data, data: x_Data,
// label: { label: {
// show: true, show: true,
// position: "right", position: "right",
// color: "#fff", color: "#fff",
// }, },
// barWidth: 15, barWidth: 15,
// itemStyle: { itemStyle: {
// color: function (params) { color: function (params) {
// const colorList = [ const colorList = [
// "#ee6666", "#ee6666",
// "#73c0de", "#73c0de",
// "#3ca272", "#3ca272",
// "#fc8452", "#fc8452",
// "#9a60b4", "#9a60b4",
// "#5470c6", "#5470c6",
// ]; ];
// return colorList[params.dataIndex]; return colorList[params.dataIndex];
// }, },
// }, },
// }, },
// ], ],
// }; };
// myChart3.setOption(option); myChart3.setOption(option);
// }; };
onMounted(() => { onMounted(() => {
// fnGetData(); fnGetData();
window.onresize = function () { window.onresize = function () {
myChart3 && myChart3.resize(); myChart3 && myChart3.resize();
}; };

View File

@ -94,7 +94,7 @@ import { getHiddenCount, getMemoryUsage } from "@/request/index.js";
import { reactive } from "vue"; import { reactive } from "vue";
import CountTo from "vue-countup-v3"; import CountTo from "vue-countup-v3";
import { useRouter } from "vue-router"; import { useRouter } from "vue-router";
// import { getRiskManagement } from "@/request/large_screen_data_display.js"; import { getRiskManagement } from "@/request/large_screen_data_display.js";
const router = useRouter(); const router = useRouter();
const data = reactive({ const data = reactive({
@ -114,10 +114,10 @@ const data = reactive({
}); });
const fnGetData = async () => { const fnGetData = async () => {
const { hidCount } = await getHiddenCount(); const { hidCount } = await getHiddenCount();
// const { riskCount } = await getRiskManagement(); const { riskCount } = await getRiskManagement();
const { pd: memoryUsage } = await getMemoryUsage(); const { pd: memoryUsage } = await getMemoryUsage();
data.hidCount = hidCount; data.hidCount = hidCount;
// data.riskCount = riskCount; data.riskCount = riskCount;
data.memoryUsage = memoryUsage; data.memoryUsage = memoryUsage;
}; };
fnGetData(); fnGetData();

View File

@ -6,99 +6,99 @@
<script setup> <script setup>
import { onBeforeUnmount, onMounted } from "vue"; import { onBeforeUnmount, onMounted } from "vue";
// import * as echarts from "echarts"; import * as echarts from "echarts";
// import { getRiskManagement } from "@/request/large_screen_data_display.js"; import { getRiskManagement } from "@/request/large_screen_data_display.js";
let myChart2; let myChart2;
const fnGetData = async () => { const fnGetData = async () => {
// const { riskAll } = await getRiskManagement(); const { riskAll } = await getRiskManagement();
// fnInitEcharts(riskAll); fnInitEcharts(riskAll);
};
const fnInitEcharts = (data) => {
myChart2 = echarts.init(document.querySelector("#main2"));
let acount = 0;
let bcount = 0;
let ccount = 0;
let dcount = 0;
for (let i = 0; data.length > i; i++) {
if (data[i].LEVELID) {
if (data[i].LEVELID === "levelA") acount = data[i].COUNT;
if (data[i].LEVELID === "levelB") bcount = data[i].COUNT;
if (data[i].LEVELID === "levelC") ccount = data[i].COUNT;
if (data[i].LEVELID === "levelD") dcount = data[i].COUNT;
}
}
const option = {
title: {
text: "风险分级统计",
textStyle: {
fontSize: "14",
color: "#fff",
fontWeight: "700",
},
},
color: ["#10b9f8", "#ffc600", "#f49545", "#ec2c26"],
tooltip: {
trigger: "item",
},
grid: {},
legend: {
orient: "vertical",
left: "6%",
top: "20%",
textStyle: {
color: "#fff",
},
},
series: [
{
name: "风险类型",
type: "pie",
radius: ["30%", "70%"],
center: ["64%", "49%"],
avoidLabelOverlap: false,
itemStyle: {
borderColor: "rgb(8, 24, 58)",
borderWidth: 2,
},
label: {
show: false,
position: "center",
},
emphasis: {
label: {
show: true,
fontSize: "18",
fontWeight: "bold",
color: "#fff",
},
},
labelLine: {
show: false,
},
data: [
{
value: dcount,
name: "低风险",
},
{
value: ccount,
name: "一般风险",
},
{
value: bcount,
name: "较大风险",
},
{
value: acount,
name: "重大风险",
},
],
},
],
};
myChart2.setOption(option);
}; };
// const fnInitEcharts = (data) => {
// myChart2 = echarts.init(document.querySelector("#main2"));
// let acount = 0;
// let bcount = 0;
// let ccount = 0;
// let dcount = 0;
// for (let i = 0; data.length > i; i++) {
// if (data[i].LEVELID) {
// if (data[i].LEVELID === "levelA") acount = data[i].COUNT;
// if (data[i].LEVELID === "levelB") bcount = data[i].COUNT;
// if (data[i].LEVELID === "levelC") ccount = data[i].COUNT;
// if (data[i].LEVELID === "levelD") dcount = data[i].COUNT;
// }
// }
// const option = {
// title: {
// text: "",
// textStyle: {
// fontSize: "14",
// color: "#fff",
// fontWeight: "700",
// },
// },
// color: ["#10b9f8", "#ffc600", "#f49545", "#ec2c26"],
// tooltip: {
// trigger: "item",
// },
// grid: {},
// legend: {
// orient: "vertical",
// left: "6%",
// top: "20%",
// textStyle: {
// color: "#fff",
// },
// },
// series: [
// {
// name: "",
// type: "pie",
// radius: ["30%", "70%"],
// center: ["64%", "49%"],
// avoidLabelOverlap: false,
// itemStyle: {
// borderColor: "rgb(8, 24, 58)",
// borderWidth: 2,
// },
// label: {
// show: false,
// position: "center",
// },
// emphasis: {
// label: {
// show: true,
// fontSize: "18",
// fontWeight: "bold",
// color: "#fff",
// },
// },
// labelLine: {
// show: false,
// },
// data: [
// {
// value: dcount,
// name: "",
// },
// {
// value: ccount,
// name: "",
// },
// {
// value: bcount,
// name: "",
// },
// {
// value: acount,
// name: "",
// },
// ],
// },
// ],
// };
// myChart2.setOption(option);
// };
onMounted(() => { onMounted(() => {
fnGetData(); fnGetData();
window.onresize = function () { window.onresize = function () {

View File

@ -70,7 +70,7 @@
<!-- </div>--> <!-- </div>-->
<!-- </div>--> <!-- </div>-->
</div> </div>
<div class="foot" style="color: #222222"> <div class="foot">
北京得瑞紫蜂科技有限公司 版权所有 Copy right 2013-2020-v7 北京得瑞紫蜂科技有限公司 版权所有 Copy right 2013-2020-v7
</div> </div>
</template> </template>
@ -190,7 +190,6 @@ const fnSubmitLogin = async () => {
background: #1e4294 url("../../assets/images/loginbg.png") no-repeat top background: #1e4294 url("../../assets/images/loginbg.png") no-repeat top
center; center;
display: flex; display: flex;
background-size: 100% 100%;
.login_main { .login_main {
width: 470px; width: 470px;

View File

@ -118,7 +118,7 @@
<check-list <check-list
v-if="data.checkListDialog.visible" v-if="data.checkListDialog.visible"
v-model:visible="data.checkListDialog.visible" v-model:visible="data.checkListDialog.visible"
v-model:foreign-key="data.checkListDialog.FOREIGN_KEY" v-model:foreignKey="data.checkListDialog.FOREIGN_KEY"
/> />
</div> </div>
</template> </template>

View File

@ -231,7 +231,7 @@
<check-list <check-list
v-if="data.checkListDialog.visible" v-if="data.checkListDialog.visible"
v-model:visible="data.checkListDialog.visible" v-model:visible="data.checkListDialog.visible"
v-model:foreign-key="data.checkListDialog.FOREIGN_KEY" v-model:foreignKey="data.checkListDialog.FOREIGN_KEY"
/> />
<layout-video <layout-video
v-model:visible="data.videoDialog.visible" v-model:visible="data.videoDialog.visible"

View File

@ -1,11 +1,11 @@
<template> <template>
<el-dialog v-model="visible" :title="type === 'add' ? '新增' : '完善'" :before-close="fnClose"> <el-dialog v-model="visible" title="完善" :before-close="fnClose">
<el-form ref="formRef" :rules="rules" :model="form" label-width="150px"> <el-form ref="formRef" :rules="rules" :model="form" label-width="150px">
<el-form-item label="指标名称" prop="TARGET_NAME"> <el-form-item label="指标名称" prop="TARGET_NAME">
<el-input v-model="form.TARGET_NAME" /> <el-input v-model="form.TARGET_NAME" disabled />
</el-form-item> </el-form-item>
<el-form-item label="指标采集点位置" prop="TARGET_PLACE"> <el-form-item label="指标采集点位置" prop="TARGET_PLACE">
<el-input v-model="form.TARGET_PLACE" /> <el-input v-model="form.TARGET_PLACE" disabled />
</el-form-item> </el-form-item>
<el-form-item label="描述" prop="TARGET_DESCRIPTION"> <el-form-item label="描述" prop="TARGET_DESCRIPTION">
<el-input v-model="form.TARGET_DESCRIPTION" /> <el-input v-model="form.TARGET_DESCRIPTION" />
@ -188,7 +188,7 @@ import { useVModels } from "@vueuse/core";
import { debounce } from "throttle-debounce"; import { debounce } from "throttle-debounce";
import useFormValidate from "@/assets/js/useFormValidate.js"; import useFormValidate from "@/assets/js/useFormValidate.js";
import { ElMessage } from "element-plus"; import { ElMessage } from "element-plus";
import {setIronIronPlcSensorAdd, setIronIronPlcSensorEdit} from "@/request/tb_iron.js"; import { setIronIronPlcSensorEdit } from "@/request/tb_iron.js";
const props = defineProps({ const props = defineProps({
visible: { visible: {
@ -201,13 +201,9 @@ const props = defineProps({
required: true, required: true,
default: () => ({}), default: () => ({}),
}, },
type: {
type: String,
default: "操作",
},
}); });
const emits = defineEmits(["update:visible", "update:form", "update:type", "get-data"]); const emits = defineEmits(["update:visible", "update:form", "get-data"]);
const { visible, form, type } = useVModels(props, emits); const { visible, form } = useVModels(props, emits);
const rules = { const rules = {
BIT_NO: [{ required: true, message: "位号不能为空", trigger: "blur" }], BIT_NO: [{ required: true, message: "位号不能为空", trigger: "blur" }],
TARGET_UNIT: [ TARGET_UNIT: [
@ -242,11 +238,7 @@ const fnSubmit = debounce(
1000, 1000,
async () => { async () => {
await useFormValidate(formRef); await useFormValidate(formRef);
if (type.value === 'add') {
await setIronIronPlcSensorAdd({ ...form.value });
} else {
await setIronIronPlcSensorEdit({ ...form.value }); await setIronIronPlcSensorEdit({ ...form.value });
}
ElMessage.success("操作成功"); ElMessage.success("操作成功");
fnClose(); fnClose();
emits("get-data"); emits("get-data");

View File

@ -27,7 +27,6 @@ const data = reactive({
addOrEditDialog: { addOrEditDialog: {
visible: false, visible: false,
form: {}, form: {},
type: "",
}, },
qrCodeDialog: { qrCodeDialog: {
visible: false, visible: false,
@ -36,14 +35,9 @@ const data = reactive({
}); });
const emits = defineEmits(["update:visible", "get-data"]); const emits = defineEmits(["update:visible", "get-data"]);
const fnEdit = (form, edit) => { const fnEdit = (form) => {
data.addOrEditDialog.visible = true; data.addOrEditDialog.visible = true;
if (edit === 'add') {
data.addOrEditDialog.form = { PLC_ID: props.plcId, SIGNAL_TYPE: '', TARGET_STATUS: '' };
} else {
data.addOrEditDialog.form = form; data.addOrEditDialog.form = form;
}
data.addOrEditDialog.type = edit;
}; };
const { visible } = useVModels(props, emits); const { visible } = useVModels(props, emits);
const fnClose = () => { const fnClose = () => {
@ -124,17 +118,11 @@ const fnClose = () => {
</el-table-column> </el-table-column>
<el-table-column label="操作" width="250"> <el-table-column label="操作" width="250">
<template #default="{ row }"> <template #default="{ row }">
<el-button type="primary" text link @click="fnEdit(row, 'edit')"> <el-button type="primary" text link @click="fnEdit(row)">
{{ row.TARGET_STATUS === 2 ? "完善" : "修改" }} {{ row.TARGET_STATUS === 2 ? "完善" : "修改" }}
</el-button> </el-button>
</template> </template>
</el-table-column> </el-table-column>
<template #button>
<el-button type="primary" @click="fnEdit('', 'add')">
新增
</el-button>
<!-- <el-button type="danger" @click="fnDeleteAll"> </el-button>-->
</template>
</layout-table> </layout-table>
</layout-card> </layout-card>
@ -145,7 +133,6 @@ const fnClose = () => {
<edit-sensor <edit-sensor
v-model:visible="data.addOrEditDialog.visible" v-model:visible="data.addOrEditDialog.visible"
v-model:form="data.addOrEditDialog.form" v-model:form="data.addOrEditDialog.form"
v-model:type="data.addOrEditDialog.type"
@get-data="fnResetPagination" @get-data="fnResetPagination"
/> />
</template> </template>

View File

@ -1,11 +1,11 @@
<template> <template>
<el-dialog v-model="visible" :title="type === 'add' ? '新增' : '完善'" :before-close="fnClose"> <el-dialog v-model="visible" title="完善" :before-close="fnClose">
<el-form ref="formRef" :rules="rules" :model="form" label-width="150px"> <el-form ref="formRef" :rules="rules" :model="form" label-width="150px">
<el-form-item label="指标名称" prop="TARGET_NAME"> <el-form-item label="指标名称" prop="TARGET_NAME">
<el-input v-model="form.TARGET_NAME" /> <el-input v-model="form.TARGET_NAME" disabled />
</el-form-item> </el-form-item>
<el-form-item label="指标采集点位置" prop="TARGET_PLACE"> <el-form-item label="指标采集点位置" prop="TARGET_PLACE">
<el-input v-model="form.TARGET_PLACE" /> <el-input v-model="form.TARGET_PLACE" disabled />
</el-form-item> </el-form-item>
<el-form-item label="描述" prop="TARGET_DESCRIPTION"> <el-form-item label="描述" prop="TARGET_DESCRIPTION">
<el-input v-model="form.TARGET_DESCRIPTION" /> <el-input v-model="form.TARGET_DESCRIPTION" />
@ -188,7 +188,7 @@ import { useVModels } from "@vueuse/core";
import { debounce } from "throttle-debounce"; import { debounce } from "throttle-debounce";
import useFormValidate from "@/assets/js/useFormValidate.js"; import useFormValidate from "@/assets/js/useFormValidate.js";
import { ElMessage } from "element-plus"; import { ElMessage } from "element-plus";
import {setIronIronPlcSensorAdd, setIronIronPlcSensorEdit} from "@/request/tb_iron.js"; import { setIronIronPlcSensorEdit } from "@/request/tb_iron.js";
const props = defineProps({ const props = defineProps({
visible: { visible: {
@ -201,13 +201,9 @@ const props = defineProps({
required: true, required: true,
default: () => ({}), default: () => ({}),
}, },
type: {
type: String,
default: "操作",
},
}); });
const emits = defineEmits(["update:visible", "update:form", "update:type", "get-data"]); const emits = defineEmits(["update:visible", "update:form", "get-data"]);
const { visible, form, type } = useVModels(props, emits); const { visible, form } = useVModels(props, emits);
const rules = { const rules = {
BIT_NO: [{ required: true, message: "位号不能为空", trigger: "blur" }], BIT_NO: [{ required: true, message: "位号不能为空", trigger: "blur" }],
TARGET_UNIT: [ TARGET_UNIT: [
@ -242,11 +238,7 @@ const fnSubmit = debounce(
1000, 1000,
async () => { async () => {
await useFormValidate(formRef); await useFormValidate(formRef);
if (type.value === 'add') {
await setIronIronPlcSensorAdd({ ...form.value });
} else {
await setIronIronPlcSensorEdit({ ...form.value }); await setIronIronPlcSensorEdit({ ...form.value });
}
ElMessage.success("操作成功"); ElMessage.success("操作成功");
fnClose(); fnClose();
emits("get-data"); emits("get-data");

View File

@ -27,7 +27,6 @@ const data = reactive({
addOrEditDialog: { addOrEditDialog: {
visible: false, visible: false,
form: {}, form: {},
type: "",
}, },
qrCodeDialog: { qrCodeDialog: {
visible: false, visible: false,
@ -36,14 +35,9 @@ const data = reactive({
}); });
const emits = defineEmits(["update:visible", "get-data"]); const emits = defineEmits(["update:visible", "get-data"]);
const fnEdit = (form, edit) => { const fnEdit = (form) => {
data.addOrEditDialog.visible = true; data.addOrEditDialog.visible = true;
if (edit === 'add') {
data.addOrEditDialog.form = { PLC_ID: props.plcId, SIGNAL_TYPE: '', TARGET_STATUS: '' };
} else {
data.addOrEditDialog.form = form; data.addOrEditDialog.form = form;
}
data.addOrEditDialog.type = edit;
}; };
const { visible } = useVModels(props, emits); const { visible } = useVModels(props, emits);
const fnClose = () => { const fnClose = () => {
@ -124,17 +118,11 @@ const fnClose = () => {
</el-table-column> </el-table-column>
<el-table-column label="操作" width="250"> <el-table-column label="操作" width="250">
<template #default="{ row }"> <template #default="{ row }">
<el-button type="primary" text link @click="fnEdit(row, 'edit')"> <el-button type="primary" text link @click="fnEdit(row)">
{{ row.TARGET_STATUS === 2 ? "完善" : "修改" }} {{ row.TARGET_STATUS === 2 ? "完善" : "修改" }}
</el-button> </el-button>
</template> </template>
</el-table-column> </el-table-column>
<template #button>
<el-button type="primary" @click="fnEdit('', 'add')">
新增
</el-button>
<!-- <el-button type="danger" @click="fnDeleteAll"> </el-button>-->
</template>
</layout-table> </layout-table>
</layout-card> </layout-card>
@ -145,7 +133,6 @@ const fnClose = () => {
<edit-sensor <edit-sensor
v-model:visible="data.addOrEditDialog.visible" v-model:visible="data.addOrEditDialog.visible"
v-model:form="data.addOrEditDialog.form" v-model:form="data.addOrEditDialog.form"
v-model:type="data.addOrEditDialog.type"
@get-data="fnResetPagination" @get-data="fnResetPagination"
/> />
</template> </template>

View File

@ -5,17 +5,16 @@
:before-close="fnClose" :before-close="fnClose"
> >
<el-form ref="formRef" :rules="rules" :model="form" label-width="150px"> <el-form ref="formRef" :rules="rules" :model="form" label-width="150px">
<!--设备编码必填 完成后端校验--> <!-- <el-form-item label="设备编码" prop="EQUIP_CODE">-->
<el-form-item label="设备编码" prop="EQUIP_CODE"> <!-- <el-input-->
<el-input <!-- v-model="form.EQUIP_CODE"-->
v-model="form.EQUIP_CODE" <!-- :disabled="type === 'edit'"-->
:disabled="type === 'edit'" <!-- minlength="18"-->
minlength="18" <!-- maxlength="18"-->
maxlength="18" <!-- show-word-limit-->
show-word-limit <!-- placeholder="企业数据接入标识12位+2位类型编码+4位流水编码 "-->
placeholder="企业数据接入标识12位+2位类型编码+4位流水编码 " <!-- />-->
/> <!-- </el-form-item>-->
</el-form-item>
<el-form-item label="企业内部编号" prop="DEVICE_ID"> <el-form-item label="企业内部编号" prop="DEVICE_ID">
<el-input <el-input
v-model="form.DEVICE_ID" v-model="form.DEVICE_ID"
@ -180,9 +179,9 @@ const { visible, form } = useVModels(props, emits);
const OLD_EQUIPMENT_ID = ref(form.value.DEVICE_ID); const OLD_EQUIPMENT_ID = ref(form.value.DEVICE_ID);
const rules = { const rules = {
EQUIP_CODE: [ // EQUIP_CODE: [
{ required: true, message: "设备编码不能为空", trigger: "blur" }, // { required: true, message: "", trigger: "blur" },
], // ],
DEVICE_ID: [ DEVICE_ID: [
{ required: true, message: "企业内部编号不能为空", trigger: "change" }, { required: true, message: "企业内部编号不能为空", trigger: "change" },
], ],

View File

@ -1,11 +1,11 @@
<template> <template>
<el-dialog v-model="visible" :title="type === 'add' ? '新增' : '完善'" :before-close="fnClose"> <el-dialog v-model="visible" title="完善" :before-close="fnClose">
<el-form ref="formRef" :rules="rules" :model="form" label-width="150px"> <el-form ref="formRef" :rules="rules" :model="form" label-width="150px">
<el-form-item label="指标名称" prop="TARGET_NAME"> <el-form-item label="指标名称" prop="TARGET_NAME">
<el-input v-model="form.TARGET_NAME" /> <el-input v-model="form.TARGET_NAME" disabled />
</el-form-item> </el-form-item>
<el-form-item label="指标采集点位置" prop="TARGET_PLACE"> <el-form-item label="指标采集点位置" prop="TARGET_PLACE">
<el-input v-model="form.TARGET_PLACE" /> <el-input v-model="form.TARGET_PLACE" disabled />
</el-form-item> </el-form-item>
<el-form-item label="描述" prop="TARGET_DESCRIPTION"> <el-form-item label="描述" prop="TARGET_DESCRIPTION">
<el-input v-model="form.TARGET_DESCRIPTION" /> <el-input v-model="form.TARGET_DESCRIPTION" />
@ -188,7 +188,7 @@ import { useVModels } from "@vueuse/core";
import { debounce } from "throttle-debounce"; import { debounce } from "throttle-debounce";
import useFormValidate from "@/assets/js/useFormValidate.js"; import useFormValidate from "@/assets/js/useFormValidate.js";
import { ElMessage } from "element-plus"; import { ElMessage } from "element-plus";
import {setIronIronPlcSensorAdd, setIronIronPlcSensorEdit} from "@/request/tb_iron.js"; import { setIronIronPlcSensorEdit } from "@/request/tb_iron.js";
const props = defineProps({ const props = defineProps({
visible: { visible: {
@ -201,13 +201,9 @@ const props = defineProps({
required: true, required: true,
default: () => ({}), default: () => ({}),
}, },
type: {
type: String,
default: "操作",
},
}); });
const emits = defineEmits(["update:visible", "update:form", "update:type", "get-data"]); const emits = defineEmits(["update:visible", "update:form", "get-data"]);
const { visible, form, type } = useVModels(props, emits); const { visible, form } = useVModels(props, emits);
const rules = { const rules = {
BIT_NO: [{ required: true, message: "位号不能为空", trigger: "blur" }], BIT_NO: [{ required: true, message: "位号不能为空", trigger: "blur" }],
TARGET_UNIT: [ TARGET_UNIT: [
@ -242,11 +238,7 @@ const fnSubmit = debounce(
1000, 1000,
async () => { async () => {
await useFormValidate(formRef); await useFormValidate(formRef);
if (type.value === 'add') {
await setIronIronPlcSensorAdd({ ...form.value });
} else {
await setIronIronPlcSensorEdit({ ...form.value }); await setIronIronPlcSensorEdit({ ...form.value });
}
ElMessage.success("操作成功"); ElMessage.success("操作成功");
fnClose(); fnClose();
emits("get-data"); emits("get-data");

View File

@ -27,7 +27,6 @@ const data = reactive({
addOrEditDialog: { addOrEditDialog: {
visible: false, visible: false,
form: {}, form: {},
type: "",
}, },
qrCodeDialog: { qrCodeDialog: {
visible: false, visible: false,
@ -36,14 +35,9 @@ const data = reactive({
}); });
const emits = defineEmits(["update:visible", "get-data"]); const emits = defineEmits(["update:visible", "get-data"]);
const fnEdit = (form, edit) => { const fnEdit = (form) => {
data.addOrEditDialog.visible = true; data.addOrEditDialog.visible = true;
if (edit === 'add') {
data.addOrEditDialog.form = { PLC_ID: props.plcId, SIGNAL_TYPE: '', TARGET_STATUS: '' };
} else {
data.addOrEditDialog.form = form; data.addOrEditDialog.form = form;
}
data.addOrEditDialog.type = edit;
}; };
const { visible } = useVModels(props, emits); const { visible } = useVModels(props, emits);
const fnClose = () => { const fnClose = () => {
@ -124,17 +118,11 @@ const fnClose = () => {
</el-table-column> </el-table-column>
<el-table-column label="操作" width="250"> <el-table-column label="操作" width="250">
<template #default="{ row }"> <template #default="{ row }">
<el-button type="primary" text link @click="fnEdit(row, 'edit')"> <el-button type="primary" text link @click="fnEdit(row)">
{{ row.TARGET_STATUS === 2 ? "完善" : "修改" }} {{ row.TARGET_STATUS === 2 ? "完善" : "修改" }}
</el-button> </el-button>
</template> </template>
</el-table-column> </el-table-column>
<template #button>
<el-button type="primary" @click="fnEdit('', 'add')">
新增
</el-button>
<!-- <el-button type="danger" @click="fnDeleteAll"> </el-button>-->
</template>
</layout-table> </layout-table>
</layout-card> </layout-card>
@ -145,7 +133,6 @@ const fnClose = () => {
<edit-sensor <edit-sensor
v-model:visible="data.addOrEditDialog.visible" v-model:visible="data.addOrEditDialog.visible"
v-model:form="data.addOrEditDialog.form" v-model:form="data.addOrEditDialog.form"
v-model:type="data.addOrEditDialog.type"
@get-data="fnResetPagination" @get-data="fnResetPagination"
/> />
</template> </template>

View File

@ -109,7 +109,7 @@
<check-list <check-list
v-if="data.checkListDialog.visible" v-if="data.checkListDialog.visible"
v-model:visible="data.checkListDialog.visible" v-model:visible="data.checkListDialog.visible"
v-model:foreign-key="data.checkListDialog.FOREIGN_KEY" v-model:foreignKey="data.checkListDialog.FOREIGN_KEY"
/> />
</div> </div>
</template> </template>

View File

@ -212,7 +212,7 @@
<check-list <check-list
v-if="data.checkListDialog.visible" v-if="data.checkListDialog.visible"
v-model:visible="data.checkListDialog.visible" v-model:visible="data.checkListDialog.visible"
v-model:foreign-key="data.checkListDialog.FOREIGN_KEY" v-model:foreignKey="data.checkListDialog.FOREIGN_KEY"
/> />
<layout-video <layout-video
v-model:visible="data.videoDialog.visible" v-model:visible="data.videoDialog.visible"

View File

@ -1,210 +0,0 @@
<template>
<el-dialog v-model="dialogVisible" title="播放后台转码视频" width="50%">
<!-- 原生video播放器 - 移除了controls属性以去掉默认控制栏 -->
<video ref="videoRef" playsinline class="video-player"></video>
<!-- 底部操作按钮 -->
<template #footer>
<el-button type="primary" @click="dialogVisible = false">
关闭播放
</el-button>
</template>
</el-dialog>
</template>
<script setup>
import { ref, watch } from "vue";
import Hls from "hls.js"; // HLS
import { ElMessage } from "element-plus";
import { getTranscodeStatus, stopTransCode } from "@/request/video_info.js"; //
//
const props = defineProps({
visible: {
type: Boolean,
default: false,
},
src: {
type: String,
required: true, // HLS
},
videoId: {
type: String,
required: true, // Id
},
});
//
const emit = defineEmits(["update:visible", "onStop"]);
// props.visible
const dialogVisible = ref(props.visible);
const videoRef = ref(null); // video
const isPlaying = ref(false); //
let hlsInstance = null; // HLS
// visibledialogVisible
watch(
() => props.visible,
(newVal) => {
dialogVisible.value = newVal;
}
);
//
let checkInterval = null;
//
const onDialogOpen = () => {
// 3
checkInterval = setInterval(async () => {
try {
// checkVideoProgress
const response = await getTranscodeStatus({ id: props.videoId });
if (response.progress > 2) {
handlePlay();
//
if (checkInterval) {
clearInterval(checkInterval);
checkInterval = null;
}
}
//
} catch (error) {}
}, 3000); // 3
};
// dialogVisible
watch(dialogVisible, (newVal) => {
emit("update:visible", newVal);
if (newVal) {
onDialogOpen();
} else {
destroyPlayer(); //
}
});
//
const handlePlay = () => {
const video = videoRef.value;
if (!video) {
ElMessage.error("视频播放器初始化失败");
return;
}
//
video.src = "";
// src
if (!props.src) {
ElMessage.error("视频源地址为空");
return;
}
// HLS.js
if (Hls.isSupported()) {
//
if (hlsInstance) {
hlsInstance.destroy();
}
hlsInstance = new Hls({
maxBufferLength: 30, //
maxMaxBufferLength: 60,
});
//
hlsInstance.on(Hls.Events.ERROR, (event, data) => {
if (data.fatal) {
switch (data.type) {
case Hls.ErrorTypes.NETWORK_ERROR:
hlsInstance.startLoad();
break;
case Hls.ErrorTypes.MEDIA_ERROR:
hlsInstance.recoverMediaError();
break;
default:
//
destroyPlayer();
handlePlay();
break;
}
}
});
hlsInstance.loadSource(props.src);
hlsInstance.attachMedia(video);
hlsInstance.on(Hls.Events.MANIFEST_PARSED, () => {
video.play().then(() => {
isPlaying.value = true;
});
});
} else if (video.canPlayType("application/vnd.apple.mpegurl")) {
// SafariHLS
video.src = props.src;
video.addEventListener("loadedmetadata", () => {
video
.play()
.then(() => {
isPlaying.value = true;
ElMessage.success("视频开始播放");
})
.catch((err) => {
ElMessage.error(`播放失败:${err.message}`);
});
});
} else {
ElMessage.error("您的浏览器不支持HLS视频流播放请更换浏览器");
}
};
//
const destroyPlayer = () => {
//
if (checkInterval) {
clearInterval(checkInterval);
checkInterval = null;
}
//
isPlaying.value = false;
if (hlsInstance) {
hlsInstance.destroy();
hlsInstance = null;
}
if (videoRef.value) {
const video = videoRef.value;
video.pause();
video.src = "";
}
handleStopTranscode();
};
//
const handleStopTranscode = async () => {
try {
await stopTransCode({ id: props.videoId }); //
emit("onStop"); //
dialogVisible.value = false; //
} catch (error) {
if (error !== "cancel") {
ElMessage.error(`停止转码失败:${error.message || "未知错误"}`);
}
}
};
</script>
<style scoped>
.video-player {
width: 100%;
min-height: 600px;
object-fit: contain; /* 保持视频比例 */
background-color: #000; /* 增加黑色背景,使视频区域更明显 */
}
.video-controls {
margin-top: 16px;
text-align: center;
}
</style>

View File

@ -15,25 +15,20 @@
<el-col :span="12"> <el-col :span="12">
<el-form-item label-width="10px"> <el-form-item label-width="10px">
<el-button type="primary" native-type="submit">搜索</el-button> <el-button type="primary" native-type="submit">搜索</el-button>
<el-button native-type="reset" @click="fnResetPagination" <el-button native-type="reset" @click="fnResetPagination">
>重置</el-button 重置
> </el-button>
<el-button type="success" @click="handleStartTranscode"
>播放后台转码视频</el-button
>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
</el-form> </el-form>
</el-card> </el-card>
<layout-card> <layout-card>
<layout-table <layout-table
v-model:pagination="pagination" v-model:pagination="pagination"
:data="list" :data="list"
@get-data="fnGetData" @get-data="fnGetData"
> >
<!-- 表格列定义保持不变 -->
<el-table-column label="序号" width="70"> <el-table-column label="序号" width="70">
<template #default="{ $index }"> <template #default="{ $index }">
{{ serialNumber(pagination, $index) }} {{ serialNumber(pagination, $index) }}
@ -56,6 +51,7 @@
</el-popover> </el-popover>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作" width="250"> <el-table-column label="操作" width="250">
<template #default="{ row }"> <template #default="{ row }">
<el-button <el-button
@ -64,27 +60,27 @@
text text
link link
@click="fnUpToBi(row.videomanagerId)" @click="fnUpToBi(row.videomanagerId)"
>置顶</el-button
>
<!-- <el-button type="primary" text link @click="fnSetPositioning(row)">-->
<!-- {{ row.PLS_ID ? "修改定位" : "添加定位" }}-->
<!-- </el-button>-->
<el-button link type="primary" @click="fnPreviewVideo(row)"
>播放视频</el-button
> >
置顶
</el-button>
<el-button type="primary" text link @click="fnSetPositioning(row)">
{{ row.PLS_ID ? "修改定位" : "添加定位" }}
</el-button>
<el-button link type="primary" @click="fnPreviewVideo(row)">
播放
</el-button>
<el-button <el-button
v-if="row.videomanagerId" v-if="row.videomanagerId"
link link
type="danger" type="danger"
@click="fnDeleteVideo(row)" @click="fnDeleteVideo(row)"
>移除定位</el-button
> >
移除定位
</el-button>
</template> </template>
</el-table-column> </el-table-column>
</layout-table> </layout-table>
</layout-card> </layout-card>
<!-- 其他弹窗保持不变 -->
<add <add
v-model:visible="data.addDialog.Visible" v-model:visible="data.addDialog.Visible"
v-model:form="data.addDialog.form" v-model:form="data.addDialog.form"
@ -105,14 +101,6 @@
:videomanager-id="data.selectingPointsDialog.videomanagerId" :videomanager-id="data.selectingPointsDialog.videomanagerId"
@get-data="fnResetPagination" @get-data="fnResetPagination"
/> />
<!-- 转码视频播放器修改后双向绑定visible + 传递src -->
<play-video
v-model:visible="data.transcodeVideoDialog.visible"
:src="data.transcodeVideoDialog.src"
:video-id="data.transcodeVideoDialog.id"
@on-stop="onTranscodeStopped"
/>
</div> </div>
</template> </template>
@ -120,6 +108,7 @@
import { serialNumber } from "@/assets/js/utils.js"; import { serialNumber } from "@/assets/js/utils.js";
import useListData from "@/assets/js/useListData.js"; import useListData from "@/assets/js/useListData.js";
import { import {
getHkVideoHlsPath,
getHkVideoManagerList, getHkVideoManagerList,
setUpToBi, setUpToBi,
setVideoManagerDelete, setVideoManagerDelete,
@ -130,8 +119,6 @@ import { ElMessage, ElMessageBox } from "element-plus";
import SelectingPoints from "./components/selecting_points.vue"; import SelectingPoints from "./components/selecting_points.vue";
import LayoutVideo from "@/components/video/index.vue"; import LayoutVideo from "@/components/video/index.vue";
import { setVideoManagerList } from "@/request/eightwork_videomanager.js"; import { setVideoManagerList } from "@/request/eightwork_videomanager.js";
import PlayVideo from "@/views/video_manager/video_manager/components/playVideo.vue"; //
import { startTransCode, stopTransCode } from "@/request/video_info.js"; //
const data = reactive({ const data = reactive({
addDialog: { addDialog: {
@ -155,60 +142,39 @@ const data = reactive({
videomanagerId: "", videomanagerId: "",
visible: false, visible: false,
}, },
transcodeVideoDialog: {
visible: false,
src: "http://localhost:8100/api/hls/stream.m3u8", // HLS访
id: "",
},
}); });
//
const handleStartTranscode = async () => {
try {
await startTransCode(); //
data.transcodeVideoDialog.visible = true; //
} catch (error) {
ElMessage.error("启动转码失败: " + (error.message || "未知错误"));
}
};
//
const onTranscodeStopped = async () => {
await stopTransCode(); //
};
//
const { list, pagination, searchForm, fnGetData, fnResetPagination } = const { list, pagination, searchForm, fnGetData, fnResetPagination } =
useListData(getHkVideoManagerList); useListData(getHkVideoManagerList);
// const fnSetPositioning = async (row) => {
// const fnSetPositioning = async (row) => { data.selectingPointsDialog.id = row.PLS_ID ? row.PLS_ID : "";
// data.selectingPointsDialog.id = row.PLS_ID ? row.PLS_ID : ""; data.selectingPointsDialog.indexCode = row.indexCode;
// data.selectingPointsDialog.indexCode = row.indexCode; data.selectingPointsDialog.regionPathName = row.regionPathName;
// data.selectingPointsDialog.regionPathName = row.regionPathName; data.selectingPointsDialog.camName = row.name;
// data.selectingPointsDialog.camName = row.name; data.selectingPointsDialog.videomanagerId = row.videomanagerId;
// data.selectingPointsDialog.videomanagerId = row.videomanagerId; data.selectingPointsDialog.visible = true;
// data.selectingPointsDialog.visible = true; };
// };
const fnUpToBi = async (videomanagerId) => { const fnUpToBi = async (videomanagerId) => {
await ElMessageBox.confirm("确定要置顶吗置顶后将会默认展示在Bi页", { await ElMessageBox.confirm("确定要置顶吗置顶后将会默认展示在Bi页", {
type: "warning", type: "warning",
}); });
await setUpToBi({ videomanagerId }); await setUpToBi({
ElMessage({ message: "操作成功", type: "success" }); videomanagerId,
});
ElMessage({
message: "操作成功",
type: "success",
});
fnResetPagination();
}; };
const fnPreviewVideo = async (row) => { const fnPreviewVideo = async (row) => {
try { data.videoDialog.visible = true;
const resData = await startTransCode({ url: row.url, id: row.PLS_ID }); // data.videoDialog.src = "";
data.transcodeVideoDialog.visible = true; // const resData = await getHkVideoHlsPath(row);
data.transcodeVideoDialog.id = row.PLS_ID; // data.videoDialog.src = resData.data.url;
data.transcodeVideoDialog.src =
"http://localhost:8100/api/" + resData.videoUrl + "stream.m3u8";
} catch (error) {
ElMessage.error("启动转码失败: " + (error.message || "未知错误"));
}
}; };
const fnDeleteVideo = async (row) => { const fnDeleteVideo = async (row) => {
@ -222,13 +188,16 @@ const fnDeleteVideo = async (row) => {
} }
await ElMessageBox.confirm( await ElMessageBox.confirm(
"移除定位将会结束视频推送,并删除推送信息。确定要移除定位吗?", "移除定位将会结束视频推送,并删除推送信息。确定要移除定位吗?",
{ type: "warning" } {
type: "warning",
}
); );
await setVideoManagerDelete({ await setVideoManagerDelete({
VIDEOMANAGER_ID: row.videomanagerId, VIDEOMANAGER_ID: row.videomanagerId,
PLS_ID: row.PLS_ID, PLS_ID: row.PLS_ID,
}); });
await ElMessage.success("操作成功"); await ElMessage.success("操作成功");
fnResetPagination();
} }
}; };
</script> </script>