2021.11.17需求

merge-requests/1/head
dydwang 4 years ago
parent 0e1e633929
commit 5d40a43e55

@ -15,6 +15,9 @@ module.exports = {
"no-tabs": 'off',
'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
"no-unused-vars":'off' //冗余变量报错
"no-unused-vars":'off', //冗余变量报错
"vue/no-use-v-if-with-v-for": "off",
"vue/no-unused-vars": "off",
"vue/no-unused-components": "off"
}
}

@ -18,9 +18,11 @@
"style-loader": "^2.0.0",
"v-viewer": "^1.5.1",
"video.js": "^7.10.2",
"videojs-contrib-hls": "^5.15.0",
"vue": "^2.6.11",
"vue-json-editor": "^1.4.3",
"vue-router": "^3.2.0",
"vue-video-player": "^5.0.2",
"vuex": "^3.4.0",
"vuex-multi-tab-state": "^1.0.16"
},

@ -6,6 +6,11 @@
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<!-- 加快视频的响应速度-->
<link href="/static/video-js-cdn.min.css" rel="stylesheet">
<script src="/static/video.js"></script>
<script src="/static/videojs-contrib-hls.min.js"></script>
<title>垛机视觉系统</title>
</head>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 206 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 234 KiB

@ -1,6 +1,6 @@
export default {
updateStylesAPI: {
url: '/node/styles/update',
url: '/node/antv-styles/update',
name: '更新标题菜单样式',
method: 'POST'
},
@ -8,5 +8,20 @@ export default {
url: '/node/default_css.json',
name: '获取标题菜单样式',
method: 'GET'
},
getStockRowColumnAPI: {
url: '/node/stock/getStockRowColumn',
name: '获取盘点颜色状态',
method: 'GET'
},
getStockRowColumnNesInfo: {
url: '/node/stock/getStockRowColumnNesInfo',
name: '如果是人工复合错误那么就需要取stock_log里的关联的最新的信息',
method: 'GET'
},
viewVideoAPI: {
url: '/node/hk_video/view_video',
name: '唤醒VSplay,查看海康视频',
method: 'GET'
}
}

@ -1,5 +1,5 @@
<template>
<a-layout-sider :class="['aside', collapsed ? 'merge' :'']" v-model="collapsed" theme="dark" :trigger="null" collapsible>
<a-layout-sider :class="['aside', collapsed ? 'merge' :'']" v-model="collapsed" theme="dark" :trigger="null" collapsible :style="styles.menu.default">
<div class="logo" :style="styles.title.style">
<!-- <img src="@/assets/logo1.png" alt />-->
<span class="logo-title">{{ styles.title.text }}</span>

@ -6,7 +6,9 @@
<slot name="title">{{ title }}</slot>
</span>
</div>
<keep-alive :include="['checkManage']">
<router-view class="table"></router-view>
</keep-alive>
<!-- footer -->
<div class="wrap-footer bg-white">
<slot name="footer"></slot>

@ -8,10 +8,6 @@ import './components/index'
import './layouts/index'
import utils from './utils/index'
import api from './plugins/axios/index'
import JSMpeg from './utils/jsmpeg.min'
import vxgplayer from '../public/video_play_plugins/vxgplayer-1.8.54.min'
import '../public/video_play_plugins/vxgplayer-1.8.54.min.css'
Vue.config.productionTip = false
Vue.prototype.$utils = utils
Vue.prototype.$api = api
@ -26,13 +22,8 @@ import 'vue-happy-scroll/docs/happy-scroll.css'
// 图片预览插件 viewer
import 'viewerjs/dist/viewer.css'
import viewer from 'v-viewer'
Vue.use(viewer)
import Video from 'video.js'
import 'video.js/dist/video-js.css'
Vue.prototype.$video = Video
new Vue({
router,

@ -17,7 +17,7 @@ let blobList = [
instance.interceptors.request.use((config) => {
const reqObj = config;
// 在发送请求之前做些什么 -- 路径参数拼接
console.log(reqObj)
// console.log(reqObj)
const reg = /\{(.+?)\}/g;
if (reg.test(reqObj.url)) {
reqObj.url = reqObj.url.replace(reg, Object.values(reqObj.path)[0]);

@ -27,8 +27,8 @@ apiAll.keys().map((key) => {
const suffixIndex = toCamelCase(key.match(/.*\/.*\/(.*\..*)/)[1]).indexOf('.js');
const name = toCamelCase(key.match(/.*\/.*\/(.*\..*)/)[1]).substring(0, suffixIndex);
moduleApis[name] = apiAll(key).default;
console.log('moduleApis ', moduleApis)
// console.log('moduleApis ', moduleApis)
return trans(moduleApis[name]);
});
export default moduleApis;
console.log(moduleApis);
// console.log(moduleApis);

@ -57,15 +57,15 @@ const routes = [{
},
component: () => import('@/views/historyMonitoring/index')
},
{
path: 'alarmVideos',
name: 'alarmVideos',
meta: {
icon: 'alert',
name: '告警视频'
},
component: () => import('@/views/alarmVideos/index')
},
// {
// path: 'alarmVideos',
// name: 'alarmVideos',
// meta: {
// icon: 'alert',
// name: '告警视频'
// },
// component: () => import('@/views/alarmVideos/index')
// },
{
path: 'alarmLog',
name: 'alarmLog',

@ -57,6 +57,4 @@ const store = {
}
}
}
// 初始加载时默认更新一次主题
// changeTheme(store.state.data.theme['primary-color']);
export default store;

@ -65,16 +65,16 @@
{{ text.status == null ? ' ' : text.status == 0 ? '正常' : '告警' }}
</span>
</span>
<span slot="videoPath1" slot-scope="text">
<a-button type="link" v-if="text.videoPath1" @click="showModel(text.videoPath1)">
<span slot="videoPath1" slot-scope="row">
<a-button type="link" v-if="row.videoPath1" @click="showModel(row.videoPath1, row.cmd1)">
查看视频
</a-button>
<span v-else>
--
</span>
</span>
<span slot="videoPath2" slot-scope="text">
<a-button type="link" v-if="text.videoPath2" @click="showModel(text.videoPath2)">
<span slot="videoPath2" slot-scope="row">
<a-button type="link" v-if="row.videoPath2" @click="showModel(row.videoPath2, row.cmd2)">
查看视频
</a-button>
<span v-else>
@ -145,6 +145,21 @@ export default {
{
title: "涉及货位",
dataIndex: "location",
},
// TODO
{
title: "视频时长",
dataIndex: "timeLength",
},
{
title: "球机1",
// dataIndex: "videoPath1",
scopedSlots: {customRender: 'videoPath1'}
},
{
title: "球机2",
// dataIndex: "videoPath2",
scopedSlots: {customRender: 'videoPath2'}
}
],
visible: false,
@ -234,9 +249,19 @@ export default {
this.time = []
this.handleGetalarmLog()
},
showModel(data) {
showModel(path, cmd) {
// 使
if(cmd) {
let params = {
openCmd: cmd
};
this.$api.httpNodeApi.viewVideoAPI({params}).then(res=> {
console.log(res);
})
}else {
this.visible = true
this.vid = videoUrl + data
this.vid = videoUrl + path;
}
},
closeModel(visible, data) {
this.visible = visible

@ -0,0 +1,255 @@
<template>
<div class="subsection">
<a-layout style="width: 900px">
<a-layout style="width: 100%;height: 310px">
<a-layout-sider width="110px">
<a-tabs default-active-key="1" tab-position="left" @change="value => select.column = value" v-if="total.column > nums.column">
<a-tab-pane
v-for="index in latticeColumn"
:key="index"
>
<span slot="tab">
{{ getRandom(index, latticeColumn, nums.column, total.column) }}
<a-icon type="close-circle" v-if="status.column[index] === 1" style="color: #d81e06" />
<a-icon type="check-circle" v-else-if="status.column[index] === 2" style="color: #1afa29" />
<a-icon type="exclamation-circle" v-else style="color: #909399" />
</span>
</a-tab-pane>
</a-tabs>
</a-layout-sider>
<a-layout-content>
<slot :data="{select, nums, random}"></slot>
</a-layout-content>
</a-layout>
<a-layout-footer>
<a-tabs default-active-key="1" tab-position="bottom" @change="value => select.row = value" v-if="total.row > nums.row">
<a-tab-pane
v-for="index in latticeRow"
:key="index"
>
<span slot="tab">
{{ getRandom(index, latticeRow, nums.row, total.row) }}
<a-icon type="close-circle" v-if="status.row[index] === 1" style="color: #d81e06" />
<a-icon type="check-circle" v-else-if="status.row[index] === 2" style="color: #1afa29" />
<a-icon type="exclamation-circle" v-else style="color: #909399" />
</span>
</a-tab-pane>
</a-tabs>
</a-layout-footer>
</a-layout>
</div>
</template>
<script>
export default {
name: "Subsection",
components: {},
props: {
//
select: {
type: Object,
default: () => {
return {
row: 1,
column: 1
}
}
},
//
total: {
row: 1,
column: 1
},
nums: {
// 20 10
type: Object,
default: () => {
return {
row: 15,
column: 10
}
}
},
stockInfo: {
type: Object,
default: () => {
return {}
}
}
},
computed: {
//
latticeRow() {
return parseInt(this.total.row / this.nums.row) + (this.total.row % this.nums.row > 0 ? 1 : 0);
},
latticeColumn() {
return parseInt(this.total.column / this.nums.column) + (this.total.column % this.nums.column > 0 ? 1 : 0);
},
random() {
return {
row: this.getRandomRow(this.select.row),
column: this.getRandomColumn(this.select.column),
}
},
watchStockInfo() {
return JSON.stringify(this.stockInfo);
}
},
watch: {
watchStockInfo() {
this.getStatus();
}
},
data() {
return {
status: {
row: {},
column: {}
}
}
},
mounted() {
},
created() {
this.getStatus();
},
destroyed() {
},
methods: {
//
getRandom(index, lattice, num, total) {
if(index !== lattice) {
return `${(index - 1) * num + 1} - ${index * num}`;
}else {
return `${(index - 1) * num + 1} - ${total}`;
}
},
//
getRandomRow(val) {
return this.getRandom(val, this.latticeRow, this.nums.row, this.total.row).split(' - ').map(item => Number(item));
},
getRandomColumn(val) {
return this.getRandom(val, this.latticeColumn, this.nums.column, this.total.column).split(' - ').map(item => Number(item));
},
//
fragmentStatus(type, val) {
let status0 = false;//
let status1 = false;//
let rowStart = 1, rowEnd = this.total.row;
let columnStart = 1, columnEnd = this.total.column;
if(type === 'row') {
[rowStart, rowEnd] = this.getRandomRow(val);
}else {
[columnStart, columnEnd] = this.getRandomColumn(val);
}
console.log(rowStart, rowEnd, columnStart, columnEnd);
//
// for(let row = rowStart; row++; row <= rowEnd) {
// for(let column = columnStart; column++; column <= columnEnd) {
// let rowColStatus = (this.stockInfo[`${row}-${column}`] || {}).status;
// if(!rowColStatus) {
// //
// status0 = true;
// }else if(rowColStatus === 1) {
// //
// status1 = true;
// }
// }
// }
// if(status1) {
// return 1; //
// }else if(status0) {
// return 0; //
// }else {
// return 2; //
// }
},
async getStatus() {
// for(let i = 1 ; i++; i < this.latticeRow) {
// let rowColumn = this.getRandomRow(i);
// this.status.row[i] = this.fragmentStatus('row', i);
// }
//
// for(let i = 1 ; i++; i < this.latticeColumn) {
// let rowColumn = this.getRandomColumn(i);
// this.status.column[i] = this.fragmentStatus('column', i);
// }
for(let row = 1; row <= this.total.row; row++) {
for(let column = 1; column <= this.total.column; column++) {
let status = (this.stockInfo[`${row}-${column}`] || {}).status || 0;
if(status < 2) {
//
let latticeRow = parseInt(row / this.nums.row) + (row % this.nums.row > 0 ? 1 : 0);
let latticeColumn = parseInt(column / this.nums.column) + (column % this.nums.column > 0 ? 1 : 0);
if(status === 1) {
console.log('第几段', latticeRow, latticeColumn);
console.log(row, column,status);
this.$set(this.status.row, latticeRow, status);
this.$set(this.status.column, latticeColumn, status);
}else {
if(!this.status.row[latticeRow]) this.$set(this.status.row, latticeRow, status);
if(!this.status.column[latticeColumn]) this.$set(this.status.column, latticeColumn, status);
}
}
}
}
console.log(this.status);
},
}
}
</script>
<style scoped lang="scss">
.subsection /deep/{
width: 100%;
height: 360px;
overflow: hidden;
.ant-tabs-nav .ant-tabs-tab {
// padding: 0;
margin-right: 0;
}
.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled) {
&:hover{
background: #40a9ff;
border-color: #40a9ff;
}
background: #40a9ff;
border-color: #40a9ff;
box-shadow: -1px 0 0 0 #40a9ff;
}
.ant-radio-button-wrapper-checked {
box-shadow: -1px 0 0 0 #40a9ff;
}
.radio-button-cell {
width: 100px;
text-align: center;
}
.ant-layout-sider {
height: 100%;
.ant-tabs {
height: 300px;
}
.ant-tabs-tab {
padding: 8px;
margin-bottom: 5px;
width: 104px;
}
}
.ant-layout-footer {
// width: 500px;
padding: 0 0 0 110px;
.ant-tabs {
// width: 735px;
}
.ant-tabs-bottom-bar {
margin-top: 0;
}
}
.ant-layout, .ant-layout-sider, .ant-layout-footer {
background-color: #ffffff;
}
}
</style>

@ -36,7 +36,6 @@
</a-select-option>
</a-select>
</div>
<div v-if="checkObj.id">
<div v-for="(key,value) in checkList" :key="value">
<div v-if="checkObj.shelveId == value">
@ -45,13 +44,25 @@
style="width:100%;display:flex;align-items:center;justify-content:space-between;flex-direction: column">
<div class="carousel-page"
v-if="columnItem.row == checkObj.row && columnItem.column == checkObj.column">
<p class="carousel-page-title" @click="goHistory(checkObj.orderNum)" v-if="checkObj.orderNum">{{checkObj.orderNum}}</p>
<p class="carousel-page-title" @click="goHistory()" v-else></p>
<p class="carousel-page-title" >
<span>
货架号 : {{ $route.query.shelveId }}
</span>
<span @click="goHistory(checkObj.orderNum)" style="width: 400px;display: inline-block;cursor: pointer">
工单号{{checkObj.orderNum}}
</span>
<span @click="goHistory()" style="width: 400px;display: inline-block;cursor: pointer">
工单号暂无
</span>
</p>
<!-- <p class="carousel-page-title" @click="goHistory(checkObj.orderNum)" v-if="checkObj.orderNum">{{checkObj.orderNum}}</p>-->
<!-- <p class="carousel-page-title" @click="goHistory()" v-else></p>-->
<div class="carousel-page-content">
<div class="img-box">
<img
v-if="checkObj.preoperationPic"
:src="imgUrl+checkObj.preoperationPic"
style="width: 100%;height: 358px"
alt=""/>
<div
v-else
@ -64,6 +75,7 @@
<img
v-if="checkObj.overoperationPic"
:src="imgUrl+checkObj.overoperationPic"
style="width: 100%;height: 358px"
alt=""/>
<div
v-else
@ -72,6 +84,18 @@
</div>
<p>操作后照片</p>
</div>
<div class="img-box">
<ul>
<li v-for="item in params" :key="item.label">
<span class="img-box-title">
{{ item.label }}:
</span>
<span class="img-box-value">
{{ scanAndCheck[item.key] }}
</span>
</li>
</ul>
</div>
</div>
<div class="carousel-page-footer">
<div class="info-box">
@ -133,26 +157,44 @@
style="width:100%;display:flex;align-items:center;justify-content:space-between;flex-direction: column">
<div class="carousel-page"
v-if="listrow == row && listcolumn == column">
<p class="carousel-page-title" @click="goHistory()"></p>
<p class="carousel-page-title" >
<span>
货架号 : {{ $route.query.shelveId }}
</span>
<span @click="goHistory()" style="width: 400px;display: inline-block;cursor: pointer">
工单号暂无
</span>
</p>
<div class="carousel-page-content">
<div class="img-box">
<div
style="display: flex;align-items: center;justify-content: center;width:500px;height:400px;background:#eaeaea">
<img src="/test1.jpg" style="width: 100%;height: 358px" alt="">
<!-- 暂无图片-->
<!-- <img v-if="row==4 && column==18" src="/red-test1.jpg" style="width: 100%;height: 358px" alt="">-->
<!-- <img v-else src="/test1.jpg" style="width: 100%;height: 358px" alt="">-->
<img
v-if="checkObj.preoperationPic"
:src="imgUrl+checkObj.preoperationPic"
style="width: 100%;height: 358px"
alt=""/>
<span v-else></span>
</div>
<p>操作前照片</p>
</div>
<div class="img-box">
<div
style="display: flex;align-items: center;justify-content: center;width:500px;height:400px;background:#eaeaea">
<img src="/test2.jpg" style="width: 100%;height: 358px" alt="">
<!-- 暂无图片-->
<!-- <img v-if="row==4 && column==18" src="/red-test2.jpg" style="width: 100%;height: 358px" alt="">-->
<!-- <img v-else src="/test2.jpg" style="width: 100%;height: 358px" alt="">-->
<img
v-if="checkObj.overoperationPic"
:src="imgUrl+checkObj.overoperationPic"
style="width: 100%;height: 358px"
alt=""/>
<span v-else></span>
</div>
<p>操作后照片</p>
</div>
<div class="img-box">
<a-spin tip="加载中..." :spinning="!Object.keys(scanAndCheck).length">
<ul>
<li v-for="item in params" :key="item.label">
<span class="img-box-title">
@ -163,7 +205,6 @@
</span>
</li>
</ul>
</a-spin>
</div>
</div>
<div class="carousel-page-footer">
@ -253,6 +294,11 @@ export default {
]
}
},
beforeRouteLeave(to ,form, next) {
// created
this.$destroy();
next();
},
created() {
this.imgUrl = imgUrl
console.log(this.$route.query.id)
@ -267,17 +313,17 @@ export default {
console.log(this.shelveId)
console.log(this.row)
console.log(this.column)
this.getStockInfo(this.row, this.column, this.shelveId)
this.getStockInfo(this.row, this.column, this.shelveId);
} else if (this.$route.query.checkObj && this.$route.query.item && this.$route.query.item.id && this.$route.query.item.name) {
this.checkObj = this.$route.query.checkObj
this.streetDetail = this.$route.query.item
this.id = this.$route.query.item.id
this.selectName = this.$route.query.item.name
this.getScanAndCheck();
}
},
mounted() {
this.getStreetList();
this.getScanAndCheck();
if (JSON.stringify(this.checkObj) !== '{}') {
if (this.checkObj.shelveId == this.streetDetail.leftShelveId) {
this.selectType = 'left'
@ -292,24 +338,41 @@ export default {
},
methods: {
getScanAndCheck() {
this.scanAndCheck = {
SystemCode: 'D1H0000147',
ScanCode: 'D1H0000147',
SystemNumber: 10,
CheckNumber: 10
}
this.$api.httpApi.scanAndCheck({
name: 'getData'
}).then(res=>{
// 2
if(res.status === '0') {
setTimeout(()=>{
this.getScanAndCheck();
}, 2000);
this.$set(this, 'scanAndCheck', {
SystemCode: this.checkObj.category,
ScanCode: null,
SystemNumber: this.checkObj.count,
CheckNumber: null
})
if(this.checkObj.status == 2) {
this.scanAndCheck.ScanCode = this.scanAndCheck.SystemCode;
this.scanAndCheck.CheckNumber = this.scanAndCheck.SystemNumber;
}else {
this.scanAndCheck = res.data[0];
this.$api.httpNodeApi.getStockRowColumnNesInfo({
params:{
row: Number(this.row),
column: Number(this.column),
shelveId: this.shelveId + ''
}
}).then(res=>{
if(res.code === 200) {
this.scanAndCheck.ScanCode = res.data.new_category;
this.scanAndCheck.CheckNumber = res.data.new_count;
}
})
}
// this.$api.httpApi.scanAndCheck({
// name: 'getData'
// }).then(res=>{
// // 2
// if(res.status === '0') {
// setTimeout(()=>{
// this.getScanAndCheck();
// }, 2000);
// }else{
// this.scanAndCheck = res.data[0];
// }
// })
},
//
getStreetList() {
@ -320,12 +383,11 @@ export default {
}
}).then(res => {
this.listData = res.data.list;
console.log(this.listData)
this.select = this.id
this.getStreetDetail(this.id)
this.getStockList(this.id)
}).catch(err => {
console.error(err);
});
},
//
@ -363,8 +425,9 @@ export default {
}
}).then(res => {
if (res.data) {
this.checkObj = res.data
this.shelveId = res.data.shelveId
this.checkObj = res.data;
this.shelveId = res.data.shelveId;
this.getScanAndCheck();
}
}).catch(err => {
@ -514,7 +577,8 @@ export default {
}
}).then(res => {
if (res.code == 200) {
this.next(index)
// this.next(index)
this.checkObj.status = 2;
this.$message.success('操作成功');
}
@ -525,12 +589,13 @@ export default {
showModel(checkObj, index) {
this.visible = true
this.modelData = checkObj
this.index = index
this.index = index;
},
submit(visible, index) {
this.visible = visible
console.log(index)
this.next(index)
// this.next(index);
this.checkObj.status = 1;
},
closeModel(visible, data) {
this.visible = visible

@ -1,10 +1,8 @@
<template>
<div class="check-page">
<div style="width:100%;text-align:right;margin-bottom:5px">
<a-button type="primary" @click="exportStock" style="text-align:right">
<a-button type="primary" @click="exportStock" class="export-all">
导出全部巷道
</a-button>
</div>
<div class="title-info">
<span class="explain">颜色说明</span>
<span class="info-text">
@ -21,56 +19,23 @@
</span>
</div>
<div style="margin-top: 10px">
<a-select v-if="data[0]" :default-value="data[0].name"
@change="handleChange" class="select-roadway">
<a-select-option v-for="i in data" :key="i.name" :value="i.id">
{{i.name}}
</a-select-option>
</a-select>
</div>
<!--左货架DOM-->
<div class="check-content" v-for="item in data" :key="item.id">
<div class="roadway-top" v-if="item.id == select">
<happy-scroll color="rgba(100,100,100,0.5)" size="8" class="scroll-box">
<div class="roadway-box">
<div class="line" v-for="(column,index) in item.leftColumn" :key="index">
<div v-for="(row,i) in item.leftRow" :key="i" class="el">
<!--渲染默认巷道框架规格 定位浮在 已有巷道上做对应-->
<span
v-if="item.leftShelveId"
class="default"
style="background:#bfbfbf;border-radius:4px"
@click="tocheck(row,column,item.leftShelveId,item.id,item.name,'left','none')"
>
{{row}}-{{column}}
</span>
<span
v-if="item.leftInsideShelveId && size =='leftInsideShelveId'"
class="default"
style="background:#bfbfbf;border-radius:4px"
@click="tocheck(row,column,item.leftInsideShelveId,item.id,item.name,'left','inside')"
>
{{row}}-{{column}}
</span>
<span
v-if="item.leftOutsideShelveId && size== 'leftOutsideShelveId'"
class="default"
style="background:#bfbfbf;border-radius:4px"
@click="tocheck(row,column,item.leftOutsideShelveId,item.id,item.name,'left','out')"
>
{{row}}-{{column}}
<div class="center-box">
<span class="shelf-number">
左货架号: {{leftShelveId.shelveId}}
</span>
<div v-for="(key,value) in checkList" :key="value">
<div v-for="(columnItem,val) in key" :key="val">
<div
v-if="columnItem.row== row && columnItem.column ==column && value == streetDetail.leftShelveId"
@click="tocheckOperation(columnItem,item)"
class="el"
:style="{background:columnItem.status ==0?'#bfbfbf':columnItem.status == 2?'#1afa29':'#d81e06'}"
>
{{columnItem.row}}-{{columnItem.column}}
</div>
</div>
</div>
</div>
</div>
</div>
</happy-scroll>
<a-radio-group v-model="size" style="margin:10px 0"
<a-radio-group v-model="size" style="margin:10px 0" @change="getStockRowColumn"
v-if="streetDetail.leftInsideShelveId && streetDetail.leftOutsideShelveId">
<a-radio-button value="leftOutsideShelveId">
@ -79,65 +44,40 @@
</a-radio-button>
</a-radio-group>
</div>
</div>
<!--单伸类型右货架DOM-->
<div class="center-box">
<a-select v-if="data[0]" :default-value="data[0].name" style="width: 180px"
@change="handleChange" class="select-roadway">
<a-select-option v-for="i in data" :key="i.name" :value="i.id">
{{i.name}}
</a-select-option>
</a-select>
</div>
<div class="check-content" v-for="item in data" :key="item.name">
<div class="roadway-buttom" v-if="item.id == select">
<happy-scroll color="rgba(100,100,100,0.5)" size="8" class="scroll-box">
<div class="roadway-box">
<div class="line" v-for="(column,index) in item.rightColumn" :key="index">
<div v-for="(row,index) in item.rightRow" :key="index" class="el">
<div class="check-content" v-for="item in data" :key="item.id">
<subsection v-if="item.id == select" :total="{row: item.leftRow, column: item.leftColumn}" :stockInfo="stockInfo.left">
<template v-slot="scope">
<div class="roadway-top">
<div class="roadway-box">
<div class="line" v-for="(column,index) in item.leftColumn" :key="index" v-if="column >= scope.data.random.column[0] && column <= scope.data.random.column[1]">
<div v-for="(row,i) in item.leftRow" :key="i" class="el" v-if="row >= scope.data.random.row[0] && row <= scope.data.random.row[1]">
<!--渲染默认巷道框架规格 定位浮在 已有巷道上做对应-->
<span
v-if="item.rightShelveId"
class="default"
style="background:#bfbfbf;border-radius:4px"
@click="tocheck(row,column,item.rightShelveId,item.id,item.name,'right','none')">
{{row}}-{{column}}
</span>
<span
v-if="item.rightInsideShelveId&& size2 == 'rightInsideShelveId'"
class="default"
style="background:#bfbfbf;border-radius:4px"
@click="tocheck(row,column,item.rightShelveId,item.id,item.name,'right','inside')">
{{row}}-{{column}}
</span>
<span
v-if="item.rightOutsideShelveId && size2 == 'rightOutsideShelveId'"
class="default"
style="background:#bfbfbf;border-radius:4px"
@click="tocheck(row,column,item.rightOutsideShelveId,item.id,item.name,'right','out')">
:style="{background:getStatusBg(stockInfo.left, `${row}-${column}`)}"
@click="tocheck(row,column,leftShelveId.shelveId,item.id,item.name,'left',leftShelveId.shelveType)"
>
{{row}}-{{column}}
</span>
<div v-for="(key,value) in checkList" :key="value">
<div v-for="(columnItem,val) in key" :key="val">
<div
v-if="columnItem.row== row && columnItem.column ==column && value == streetDetail.rightShelveId"
@click="tocheckOperation(columnItem,item)"
class="el"
:style="{background:columnItem.status ==0?'#bfbfbf':columnItem.status == 2?'#1afa29':'#d81e06'}"
>
{{columnItem.row}}-{{columnItem.column}}
</div>
</div>
</div>
</div>
</div>
</template>
</subsection>
</div>
</happy-scroll>
<a-radio-group v-model="size2" style="margin:10px 0"
<!--单伸类型右货架DOM-->
<div class="center-box">
<span class="shelf-number">
右货架号: {{rightShelveId.shelveId}}
</span>
<a-radio-group v-model="size2" style="margin:10px 0" @change="getStockRowColumn"
v-if="streetDetail.rightInsideShelveId && streetDetail.rightOutsideShelveId">
<a-radio-button value="rightOutsideShelveId">
@ -146,12 +86,38 @@
</a-radio-button>
</a-radio-group>
</div>
<div class="check-content" v-for="item in data" :key="item.name">
<subsection v-if="item.id == select" :total="{row:item.leftRow, column: item.leftColumn}" :stockInfo="stockInfo.right">
<template v-slot="scope">
<div class="roadway-buttom">
<div class="roadway-box">
<div class="line" v-for="(column,index) in item.rightColumn" :key="index" v-if="column >= scope.data.random.column[0] && column <= scope.data.random.column[1]">
<div v-for="(row,index) in item.rightRow" :key="index" class="el" v-if="row >= scope.data.random.row[0] && row <= scope.data.random.row[1]">
<!--渲染默认巷道框架规格 定位浮在 已有巷道上做对应-->
<span
class="default"
:style="{background:getStatusBg(stockInfo.right, `${row}-${column}`)}"
@click="tocheck(row,column,rightShelveId.shelveId,item.id,item.name,'right',rightShelveId.shelveType)">
{{row}}-{{column}}
</span>
</div>
</div>
</div>
</div>
</template>
</subsection>
</div>
</div>
</template>
<script>
import Subsection from "./Subsection";
export default {
name:'checkManage',
data() {
return {
size: 'leftOutsideShelveId',
@ -160,11 +126,61 @@ export default {
select: '',
streetId: 0,
streetDetail: {},
checkList: {}
checkList: [],
stockInfo: {
left: {},
right: {}
},
timer: null
}
},
computed: {
//
leftShelveId() {
let shelveId;
let shelveType = 'none';
if(this.streetDetail.leftShelveId) {
shelveId = this.streetDetail.leftShelveId;
}else if(this.streetDetail.leftInsideShelveId && this.size =='leftInsideShelveId'){
shelveId = this.streetDetail.leftInsideShelveId;
shelveType = 'inside';
}else if(this.streetDetail.leftOutsideShelveId && this.size== 'leftOutsideShelveId'){
shelveId = this.streetDetail.leftOutsideShelveId;
shelveType = 'out';
};
return {
shelveId,
shelveType
};
},
//
rightShelveId() {
let shelveId;
let shelveType = 'none';
if(this.streetDetail.rightShelveId) {
shelveId = this.streetDetail.rightShelveId;
}else if(this.streetDetail.rightInsideShelveId && this.size2 =='rightInsideShelveId'){
shelveId = this.streetDetail.rightInsideShelveId;
shelveType = 'inside';
}else if(this.streetDetail.rightOutsideShelveId && this.size2 == 'rightOutsideShelveId'){
shelveId = this.streetDetail.rightOutsideShelveId;
shelveType = 'out';
};
return {
shelveId,
shelveType
};
}
},
mounted() {
this.request()
this.request();
},
activated() {
this.request();
},
beforeRouteLeave(to, form, next) {
this.timer && clearInterval(this.timer);
next();
},
methods: {
//
@ -178,11 +194,54 @@ export default {
this.data = res.data.list;
this.select = res.data.list[0].id
this.getStockList(res.data.list[0].id)
this.getStreetDetail(res.data.list[0].id)
this.getStreetDetail(res.data.list[0].id);
this.getStockRowColumn();
}).catch(err => {
});
},
//
async getStockRowColumn() {
const init = () => {
let row = this.data.filter(item => item.id === this.select)[0];
let leftShelveId = null, rightShelveId = null;
if(row.leftInsideShelveId && this.size == 'leftInsideShelveId') {
leftShelveId = row.leftInsideShelveId;
}else if(row.leftOutsideShelveId && this.size == 'leftOutsideShelveId'){
leftShelveId = row.leftOutsideShelveId;
}else if(row.leftShelveId) {
leftShelveId = row.leftShelveId;
}
if(row.rightInsideShelveId && this.size2 == 'rightInsideShelveId') {
rightShelveId = row.rightInsideShelveId;
}else if(row.rightOutsideShelveId && this.size2 == 'rightOutsideShelveId'){
rightShelveId = row.rightOutsideShelveId;
}else if(row.rightShelveId) {
rightShelveId = row.rightShelveId;
}
let params = {
leftShelveId,
rightShelveId
};
this.$api.httpNodeApi.getStockRowColumnAPI({params}).then(({data})=>{
this.$set(this, 'stockInfo', data);
// this.stockInfo = data;
});
}
this.timer && clearInterval(this.timer);
init();
this.timer = setInterval(init, 5000);
},
getStatus(data, rowCol) {
return (data[rowCol] || {}).status;
},
//
getStatusBg(data, rowCol) {
let status = this.getStatus(data, rowCol);
return status == 1 ?'#d81e06': status == 2 ? '#1afa29': '#bfbfbf';
},
//
getStreetDetail(id) {
this.$axios.get('/street/' + id, {
@ -207,10 +266,12 @@ export default {
});
},
handleChange(value) {
console.error('handleChange');
console.log(value)
this.select = value
this.getStreetDetail(value)
this.getStockList(value)
this.getStockList(value);
this.getStockRowColumn()
},
tocheckOperation(checkObj, item) {
console.log(checkObj)
@ -236,9 +297,9 @@ export default {
}).catch(err => {
});
}
},
components: {}
},
components: {Subsection}
};
</script>
<style lang="scss" scoped>
@ -270,22 +331,14 @@ export default {
cursor: pointer;
}
.roadway-top {
padding: 20px 0;
width: 90%;
.roadway-top, roadway-buttom {
padding: 5px 0;
width: 100%;
}
.roadway-buttom {
padding: 20px 0 20px 0;
width: 90%;
}
.scroll-box {
height: 270px;
.roadway-box {
transform: rotateX(180deg);
padding: 10px 10px 0 0;
.line {
display: flex;
transform: rotateX(180deg); //div
@ -293,13 +346,13 @@ export default {
.el {
width: 46px;
height: 25px;
margin: 1px 2px;
line-height: 25px;
margin: 2px;
font-size: 12px;
text-align: center;
border-radius: 4px;
cursor: pointer;
font-size: 14px;
position: relative;
.default {
position: absolute;
top: 0;
@ -310,13 +363,19 @@ export default {
}
}
}
}
.center-box {
width: 500px;
display: flex;
align-items: center;
justify-content: space-between;
height: 52px;
line-height: 52px;
.shelf-number {
display: inline-block;
width: 200px;
}
}
.export-all {
position: absolute;
right: 20px;
}
}
</style>

@ -63,7 +63,7 @@
</span>
</span>
<span slot="videoPath1" slot-scope="text">
<a-button type="link" v-if="text.videoPath1" @click="showModel(text.videoPath1)">
<a-button type="link" v-if="text.videoPath1" @click="showModel(text.videoPath1, text.cmd1)">
查看视频
</a-button>
<span v-else>
@ -71,7 +71,7 @@
</span>
</span>
<span slot="videoPath2" slot-scope="text">
<a-button type="link" v-if="text.videoPath2" @click="showModel(text.videoPath2)">
<a-button type="link" v-if="text.videoPath2" @click="showModel(text.videoPath2, text.cmd2)">
查看视频
</a-button>
<span v-else>
@ -226,9 +226,19 @@ export default {
this.queryParam.startTimestamp = ""
this.queryParam.endTimestamp = ""
},
showModel(data) {
showModel(path, cmd) {
// 使
if(cmd) {
let params = {
openCmd: cmd
};
this.$api.httpNodeApi.viewVideoAPI({params}).then(res=> {
console.log(res);
})
}else {
this.visible = true
this.vid = videoUrl + data
this.vid = videoUrl + path;
}
},
closeModel(visible, data) {
this.visible = visible

@ -0,0 +1,94 @@
<template>
<video-player
ref="video-player"
class="vjs-custom-skin"
:options="playerOptions"
@pause="onPlayerPause"
@playing="onPlayerPlaying"
@ended="onPlayerEnded"
/>
</template>
<script>
import 'vue-video-player/src/custom-theme.css'
import { videoPlayer } from 'vue-video-player'
export default {
name: 'VideoPlayer',
props: {
src: {
type: String,
// default: 'http://cctvalih5ca.v.myalicdn.com/live/cctv6_1/index.m3u8',
required: true
}
},
components: {
videoPlayer
},
data() {
return {
isPlay: false, //
playerOptions: {
sources: [{
type: 'application/x-mpegURL',
withCredentials: false,
src: this.src
}],
height: '100%',
language: 'zh-CN',
preload: 'auto', // <video>auto,
techOrder: ['html5'],
flash: { hls: { withCredentials: false }},
html5: { hls: { withCredentials: false }},
autoplay: true, //
muted: true, //
controls: true,
notSupportedMessage: '不支持的视频格式',
controlBar: {
timeDivider: false, //
durationDisplay: false, //
remainingTimeDisplay: false, //
fullscreenToggle: true //
}
}
}
},
mounted() {
this.$nextTick(()=> {
const videoRef = this.$refs['video-player'];
// videoRef.player.play();
console.log(videoRef);
})
},
methods: {
//
onPlayerPause() {
this.isPlay && this.$emit('showModel');
// this.isPlay = false;
},
//
onPlayerPlaying(...args) {
this.isPlay = true;
},
//
onPlayerEnded($event) {
this.isPlay = false;
},
}
}
</script>
<style lang="scss" scoped>
.vjs-custom-skin /deep/{
width: 100%;
height: 100%;
cursor: pointer;
.video-player, .video-js {
height: 100% !important;
}
//
.vjs-control-bar {
display: none !important;
}
}
</style>

@ -1,55 +1,37 @@
<template>
<div class="realTime bg-white">
<a-tabs default-active-key="1" slot="headerContent" v-model="tabKey" @change="tabsChange">
<a-tab-pane key="0" tab="全部">
</a-tab-pane>
<a-tab-pane :key="(index+1).toString()" :tab="item.streetName" v-for="(item,index) in realTimeListData">
</a-tab-pane>
<a-tab-pane :key="item.streetId.toString()" :tab="item.streetName" v-for="item in realTimeListData"></a-tab-pane>
</a-tabs>
<div class="flex-layouts">
<div class="video-list" v-for="(item,index) in realTimeListData" :key="(index+1).toString()">
<div class="video-item" v-for="i in item.cameras" :key="i.id">
<template v-if="tabKey==0? tabKey==0 : tabKey==(index+1).toString()">
<object style="width:390px;height:219px" class="video-obj" :id="'video'+i.id"
type='application/x-vlc-plugin' events='True' width="100%" height="100%"
ref="vlc"
pluginspage="http://www.videolan.org"
codebase="http://downloads.videolan.org/pub/videolan/vlc-webplugins/2.0.6/npapi-vlc-2.0.6.tar.xz">
<param name='controls' value='false'/>
<param name='text' value='正在加载视频中...'/>
<param name='branding' value='false'/>
<param name="windowless" value="true">
<param name='fullscreen' value='false'/>
<param name='mrl' :value='i.rtsp'/>
<param name='autoplay' value='yes'/>
<embed type="application/x-google-vlc-plugin"/>
</object>
<div class="video-name">
<iframe class="vlcIframe"
style=" position:absolute;visibility:inherit; top:0px;left:0px;height:100%;width:100%; z-Index:-1; ">
</iframe>
{{item.streetName}} {{i.name}}
</div>
<div class="video-model">
<iframe class="vlcIframe"
style=" position:absolute;visibility:inherit; top:0px;left:0px;height:100%;width:100%; z-Index:-1; ">
</iframe>
<div style="width: 100%;height: 100%" @click="showModel(i)">
</div>
</div>
</template>
</div>
</div>
</div>
<!-- {{cameras.length}} {{ selectTab.videoStyleRow }} * {{ selectTab.videoStyleColumn }}-->
<a-row :gutter="20">
<a-col
v-for="(item, index) in cameras.slice(0, selectTab.videoStyleRow * selectTab.videoStyleColumn)"
:span="24 / selectTab.videoStyleColumn"
:key="index"
:style="{
height: videoHeight,
marginBottom: ((selectTab.videoStyleRow * selectTab.videoStyleColumn - index - 1) >= selectTab.videoStyleColumn) ? '20px': 0
}"
>
<video-player
v-if="showVideo"
@showModel="showModel(item)"
:src="item.m3u8">
</video-player>
</a-col>
</a-row>
</div>
</template>
<script>
import VideoPlayer from "./VideoPlayer";
export default {
name: "historyMonitoring",
components: {
VideoPlayer
},
data() {
return {
realTimeListData: [],
@ -58,65 +40,50 @@ export default {
path: [],
player: "",
visible: false,
modelData: []
modelData: [],
clientHeight: 0,
showVideo: false,
};
},
computed: {
selectTab() {
return (this.realTimeListData.filter(item=> item.streetId == this.tabKey)[0] || {})
},
cameras() {
return this.selectTab.cameras || [];
},
videoHeight() {
return (( this.clientHeight - this.selectTab.videoStyleRow * 20 )/ this.selectTab.videoStyleRow ) + 'px'
},
},
inject: ['reload'],
mounted() {
console.log('index mounted执行了')
this.getRealTimeList()
if (sessionStorage.getItem('tabKey') == null) {
sessionStorage.setItem('tabKey', 0)
}
this.tabKey = sessionStorage.getItem('tabKey')
this.tabKey = sessionStorage.getItem('tabKey');
this.getClientHeight();
//
// window.onresize = () => {
// this.getClientHeight();
// }
},
destroyed() {
if (this.$refs.vlc) {
for (var i = 0; i < this.$refs.vlc.length; i++) {
try{
this.$refs.vlc[i].playlist.stop();
}catch (e) {
console.log(e);
}
}
}
},
beforeRouteLeave(to,form,next) {
// console.log(11111111111111)
console.log(this.$refs.vlc)
this.$nextTick(() => {
if (this.$refs.vlc) {
for (var i = 0; i < this.$refs.vlc.length; i++) {
try{
this.$refs.vlc[i].playlist.stop();
}catch (e) {
console.log(e);
}
}
next(true)
} else {
next(true)
}
})
console.log('beforeRouteLeave')
// window.onresize = null;
},
methods: {
getClientHeight() {
this.clientHeight = this.$el.clientHeight - 80;
},
getRealTimeList(){
var that=this
this.showVideo = false;
this.$api.httpApi.getRealTimeList({
data: {}
}).then(res => {
console.log(res.data)
if(res.code == 200) {
this.realTimeListData = res.data
res.data.forEach(function (item) {
// console.log(item.cameras)
var $that = that
item.cameras.forEach(function (item) {
// console.log(item.rtsp)
$that.playVideo('video' + item.id, item.rtsp)
})
})
this.realTimeListData = res.data.reverse();
this.showVideo = true;
}
}).catch(err => {
console.log(err)
@ -125,25 +92,16 @@ export default {
playVideo(id, rtsp) {
// url ---tick TypeError: t.module.postMessage is not a function
this.$nextTick(() => {
setTimeout(function () {
var vlc = document.getElementById(`${id}`);
var options = new Array(":network-caching=100");//
var vlcItem = vlc.playlist.add(`${rtsp}`, `${id}`, options);
// vlc.playlist.play()
vlc.playlist.playItem(vlcItem);
console.log(22222222222222)
console.log(vlc)
}, 500)
this.$refs.video.forEach(video=> {
video.play();
})
})
},
tabsChange(key) {
console.log(key)
sessionStorage.setItem('tabKey', key)
this.reload()
},
showModel(item) {
console.log(item)
this.$nextTick(() => {
this.$router.push({name: "realTimeMonitoringModel", query: {modelData: item}});
})
@ -152,88 +110,8 @@ export default {
};
</script>
<style lang='scss'>
.vxgplayer{
margin:0!important;
}
<style lang='scss' scoped>
.realTime {
padding: 24px;
&-position {
display: flex;
justify-content: space-between;
&-box {
flex: 1;
display: flex;
justify-content: space-between;
&-btns {
flex: 1;
display: flex;
flex-wrap: wrap;
justify-content: flex-start;
}
&-control {
text-align: right;
cursor: pointer;
color: #55a4ff;
.anticon {
transform: rotate(0deg);
transform-origin: center;
transition: all 0.2s linear;
}
.anticon-rotate {
transform: rotate(180deg);
}
}
}
}
/*#video-cav{*/
/* position: fixed;*/
/* z-index: 999;*/
/* border: solid 1px skyblue;*/
/* width: 390px;*/
/* height: 219px;*/
/*}*/
.flex-layouts {
display: flex;
width: 1630px;
flex-wrap: wrap;
}
.video-list {
display: flex;
.video-item {
display: flex;
width: 100%;
height: 219px;
position: relative;
margin: 3px;
cursor: pointer;
z-index: 10;
/*.video-obj{*/
/*}*/
.video-name {
position: absolute;
top: 15px;
left: 15px;
color: #ffda62;
font-weight: 600;
font-size: 16px;
z-index: 10;
}
.video-model {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 20;
}
}
}
}
</style>

@ -243,14 +243,14 @@ export default {
plcIp: newVal.plcIp,
plcPort: newVal.plcPort,
leftType: newVal.leftType === null ? '' : newVal.leftType === 0 ? '单伸' : '双伸',
leftRow: newVal.leftRow,
leftColumn: newVal.leftColumn,
leftRow: 7 || newVal.leftRow,
leftColumn: 18 || newVal.leftColumn,
leftShelveId: newVal.leftShelveId,
leftInsideShelveId: newVal.leftInsideShelveId,
leftOutsideShelveId: newVal.leftOutsideShelveId,
rightType: newVal.rightType === null ? '' : newVal.rightType === 0 ? '单伸' : '双伸',
rightRow: newVal.rightRow,
rightColumn: newVal.rightColumn,
rightRow: 7 || newVal.rightRow,
rightColumn: 18 || newVal.rightColumn,
rightShelveId: newVal.rightShelveId,
rightInsideShelveId:newVal.rightInsideShelveId,
rightOutsideShelveId:newVal.rightOutsideShelveId,

@ -32,7 +32,8 @@ module.exports = {
}
},
'/api': {
target: 'http://192.168.0.108:8099',
// target: 'http://192.168.0.133:8099',
target: 'http://115.236.65.98:13001/monitor',
logLevel:'debug', //控制台终端打印代理前的真实地址
},
},

Loading…
Cancel
Save