增加站台盘点

泸州-烟草
LAPTOP-S9HJSOEB\昊天 2 years ago
parent 09fec84220
commit cd488332e1

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

@ -10,12 +10,12 @@
<!-- <script src="/video_play_plugins/video.js"></script> -->
<script src="/video_play_plugins/webrtcplayer.js"></script>
<title>中国电科</title>
<title>智能视觉盘点</title>
</head>
<body>
<noscript>
<strong>We're sorry but 中国电科智能视觉 doesn't work properly without JavaScript enabled. Please enable it to
<strong>We're sorry but 智能视觉盘点服务 doesn't work properly without JavaScript enabled. Please enable it to
continue.</strong>
</noscript>

@ -17,8 +17,8 @@
</a-badge>
<div style="width:40px"></div>
<img src="@/assets/dianke.png" style="height:40" alt />
<!--
<img src="@/assets/dianke.png" style="height:40" alt /> -->
</div>
</div>
</template>

@ -76,23 +76,32 @@ const routes = [{
// },
// component: () => import('@/views/checkSummary/index')
// },
// {
// path: 'emptyCheckManage',
// name: 'emptyCheckManage',
// meta: {
// icon: 'form',
// name: '空货位管理',
// },
// component: () => import('@/views/emptyCheckManage/index'),
// },
{
path: 'emptyCheckManage',
name: 'emptyCheckManage',
path: 'platformCheckManage',
name: 'platformCheckManage',
meta: {
icon: 'form',
name: '空货位管理',
name: '站点盘点',
},
component: () => import('@/views/emptyCheckManage/index'),
component: () => import('@/views/platformCheck/index'),
},
{
path: 'checkManage',
name: 'checkManage',
path: 'platformCheckManageOld',
name: 'platformCheckManageOld',
meta: {
icon: 'form',
name: '盘点管理',
name: '站点盘点历史',
},
component: () => import('@/views/checkManage/index'),
component: () => import('@/views/platformCheck/old/index'),
},
{
path: 'checkOperation',
@ -102,32 +111,24 @@ const routes = [{
},
component: () => import('@/views/checkManage/checkOperation'),
},
// {
// path: 'checkHistory',
// name: 'checkHistory',
// meta: {
// icon: 'tag',
// name: '盘点历史',
// },
// component: () => import('@/views/historyCheck/index'),
// },
// {
// path: 'stockHistory',
// name: 'stockHistory',
// meta: {
// icon: 'file-excel',
// name: '库位历史',
// },
// component: () => import('@/views/stockLog/index'),
// },
// {
// path: 'stockLogDetail',
// name: 'stockLogDetail',
// meta: {
// name: '库位历史详情',
// },
// component: () => import('@/views/stockLog/logPage'),
// },
{
path: 'checkManage',
name: 'checkManage',
meta: {
icon: 'form',
name: '盘点管理',
},
component: () => import('@/views/checkManage/index'),
},
{
path: 'checkHistory',
name: 'checkHistory',
meta: {
icon: 'tag',
name: '盘点历史',
},
component: () => import('@/views/historyCheck/index'),
},
{
path: 'roadwayManage',
name: 'roadwayManage',

@ -11,7 +11,7 @@ const store = {
"primary-color":"rgba(184, 68, 13, 1)"
},
"title":{
"text":"中国电科智能视觉",
"text":"智能视觉盘点服务",
"style":{
"color":"rgba(0,0,0, 1)",

@ -1,7 +1,7 @@
<template>
<div class="subsection">
<a-layout style="width: 1500px">
<a-layout style="width: 100%;height: 310px">
<a-layout style="width: 100%;height: 370px">
<a-layout-sider width="110px">
<a-tabs default-active-key="1" tab-position="left" @change="changeTabLeft" v-if="total.row > nums.row">
<a-tab-pane
@ -85,8 +85,8 @@ export default {
type: Object,
default: () => {
return {
row: 10,
column: 15
row: 15,
column: 25
}
}
},
@ -288,7 +288,7 @@ export default {
<style scoped lang="scss">
.subsection /deep/{
width: 100%;
height: 360px;
height: 400px;
overflow: hidden;
.ant-tabs-nav .ant-tabs-tab {
// padding: 0;

@ -3,12 +3,15 @@
<div>
<div class="carousel-page">
<div class="carousel-page-content" style="justify-content: flex-start">
<div class="img-box" >
<div class="carousel-page-content">
<div class="img-box">
<ul>
<li>
<span >
{{streetName}}-{{this.direction == 1?"左":"右"}}-{{this.side == 1?"浅":"深"}}-{{row}}-{{column}}
<span class="img-box-title">
位置:
</span>
<span class="img-box-value">
{{checkObj.streetName}}-{{checkObj.direction ==1?"左":"右" }}-{{checkObj.side ==1?"浅货位":"深货位" }}-{{checkObj.column}}-{{checkObj.row}}
</span>
</li>
<li>
@ -30,64 +33,56 @@
</li>
</ul>
</div>
<div class="img-box" style="margin-left: 200px;">
<a-row type="flex" justify="space-around" style="height:300,margin-left:400">
<a-col :span="11">
<p>顶部图片1</p>
<viewer :images = "checkObj.topPic1">
<img class="historyImg" :src="checkObj.topPic1"/>
</viewer>
</a-col>
<a-col :span="11">
<p>顶部图片2</p>
<viewer :images = "checkObj.topPic2">
<img class="historyImg" :src="checkObj.topPic2"/>
<div class="img-box" style="width: 60vw " >
<viewer v-if="checkObj.checkPic" style="height: 300px">
<img :src="imgUrl+checkObj.checkPic"/>
</viewer>
</a-col>
</a-row>
<a-row type="flex" gutter="16px" justify="space-around" align="middle" style="height:300">
<a-col :span="11">
<p>侧面图片1</p>
<viewer :images = "checkObj.sidePic1">
<img class="historyImg" :src="checkObj.sidePic1"/>
</viewer>
</a-col>
<a-col :span="11">
<p>侧面图片2</p>
<viewer :images = "checkObj.sidePic2">
<img class="historyImg" :src="checkObj.sidePic2"/>
</viewer>
</a-col>
</a-row>
<a-row type="flex" justify="space-around" align="middle" style="height:300">
<a-col :span="11">
<p>侧面图片3</p>
<viewer :images = "checkObj.sidePic3">
<img class="historyImg" :src="checkObj.sidePic3"/>
<div
v-else
style="display: flex;align-items: center;justify-content: center;width:100px;height:300px;">
暂无图片
</div>
<p>盘点图1</p>
</div>
<!-- <div class="img-box">
<viewer v-if="checkObj.preoperationPic" style="height:300px;">
<img :src="imgUrl+checkObj.preoperationPic"/>
</viewer>
</a-col>
<a-col :span="11">
<p>侧面图片4</p>
<viewer :images = "checkObj.sidePic4">
<img class="historyImg" :src="checkObj.sidePic4"/>
<div v-else style="display: flex;align-items: center;justify-content: center;width:100px;height:300px;">
暂无图片
</div>
<p>操作前照片</p>
</div>
<div class="img-box">
<viewer v-if="checkObj.overoperationPic" style="width:100%;height:300px;">
<img :src="imgUrl+checkObj.overoperationPic"/>
</viewer>
</a-col>
</a-row>
<div
v-else
style="display: flex;align-items: center;justify-content: center;width:100px;height:300px;">
暂无图片
</div>
<p>操作后照片</p>
</div> -->
</div>
</div>
<!--
<div class="bottom-btn" >
<a-button class="btn"
type="primary"
style="background:#29c12b;border-color:#29c12b;"
@click="checkSure(checkObj.row,checkObj.column,checkObj.shelveId,index)"
>核对
>核对正确
</a-button>
<a-button class="btn"
type="primary"
style="background:#ff0000;border-color:#ff0000;"
@click="checkfalse(checkObj.row,checkObj.column,checkObj.shelveId,index)"
>核对错误
</a-button>
</div>
-->
</div>
@ -104,6 +99,7 @@
<script>
import Model from "./model.vue"
import {imgUrl} from "@/api/importExcel";
import { message } from 'ant-design-vue';
export default {
data() {
return {
@ -112,6 +108,7 @@ export default {
row: 1,
column: 1,
streetName: '',
streetPlc:"",
visible: false,
category: '',
count: 0,
@ -123,36 +120,27 @@ export default {
// label:'',
// key: 'lotnum'
// },
// {
// label:'',
// key: 'orderNum'
// },
{
label:'盘点任务号',
key: 'checkNum'
},
{
label:'WMS品规号',
key: 'wmsCategory'
},
{
label:'WMS数量',
key: 'wmsCount'
},
{
label:'盘点品规号',
key: 'category'
label:'托盘码',
key: 'wmsTrayCode'
},
{
label:'盘点数量',
key: 'count'
label:'扫描托盘码',
key: 'trayCode'
},
{
label:'盘点时间',
key: 'exportTime'
},
],
statusMap: {0:"未盘点",1:"盘点异常",2:"核对正确",3:"人工核对正确"}
}
},
beforeRouteLeave(to ,form, next) {
@ -169,13 +157,16 @@ export default {
this.imgUrl = imgUrl
//this.getStreetList();
if (this.$route.query.row && this.$route.query.column && this.$route.query.direction && this.$route.query.side && this.$route.query.streetId) {
if (this.$route.query.row && this.$route.query.column && this.$route.query.direction && this.$route.query.side && (this.$route.query.streetId || this.$route.query.streetPlc)) {
this.id = this.$route.query.id
this.row = this.$route.query.row
this.column = this.$route.query.column
this.direction = this.$route.query.direction
this.side = this.$route.query.side
this.streetId = this.$route.query.streetId
if(this.$route.query.streetPlc){
this.streetPlc = this.$route.query.streetPlc
}
this.streetName = this.$route.query.name
this.getStockInfo(this.row, this.column);
@ -201,10 +192,12 @@ export default {
direction: this.direction,
side: this.side,
streetId: this.streetId,
streetPlc: this.streetPlc,
}
}).then(res => {
if (res.data) {
this.checkObj = res.data;
this.checkObj.checkPic2 = this.checkObj.checkPic + ".jpg"
//this.shelveId = res.data.shelveId;
//this.getScanAndCheck();
}
@ -226,7 +219,32 @@ export default {
data: {
row: Number(row),
column: Number(column),
shelveId: shelveId,
side: Number(this.side),
streetId: Number(this.streetId),
streetPlc: (this.streetPlc),
direction: Number(this.direction),
ok: 1
}
}).then(res => {
if (res.code == 200) {
this.$message.success('操作成功');
this.getStockInfo(this.row,this.column)
}
}).catch(err => {
});
},
checkfalse(row, column, shelveId, index) {
this.$api.httpApi.stockCheckCorrect({
data: {
row: Number(row),
column: Number(column),
side: Number(this.side),
streetId: Number(this.streetId),
streetPlc: (this.streetPlc),
direction: Number(this.direction),
ok: 0
}
}).then(res => {
if (res.code == 200) {
@ -244,6 +262,7 @@ export default {
this.index = index;
},
submit(visible, index) {
this.visible = visible
console.log(index)
// this.next(index);
@ -253,7 +272,31 @@ export default {
this.visible = visible
this.modelData = data
},
nextOne(id){
this.$api.httpApi.nextOne({
data: {
id:Number(id)
}
}).then(res => {
if (res.data && res.data != null) {
console.log(res.data)
this.checkObj = res.data;
this.id = res.data.id
this.row = res.data.row
this.column = res.data.column
this.direction = res.data.direction
this.side = res.data.side
this.streetId = res.data.streetId
this.streetName = res.data.streetName
this.checkObj.checkPic2 = this.checkObj.checkPic + ".jpg"
}else{
message.info('全部盘点已完成')
}
}).catch(err => {
console.log(err)
});
}
}
}
@ -276,7 +319,7 @@ export default {
&-content {
display: flex;
align-items: flex-start;
align-items: center;
justify-content: space-between;
padding-left: 25px;
@ -286,6 +329,7 @@ export default {
justify-content: center;
flex-direction: column;
font-size: 17px;
height: 400px;
margin-right: 10px;
img {
height: 100%
@ -309,6 +353,7 @@ export default {
.img-box-title {
width: 130px;
display: inline-block;
}
.img-box-value {
display: inline-block;
@ -377,7 +422,7 @@ export default {
}
}
.historyImg {
width: 400px;
width: 180px;
height:auto;
}

@ -151,6 +151,10 @@ export default {
title: "盘点批次号",
dataIndex: "lotnum",
},
{
title: "巷道名",
dataIndex: "streetName",
},
{
title: "货位({左右}-{深浅}-{行}-{列})",
scopedSlots: {customRender: 'goodsLocation'},

@ -3,7 +3,20 @@
<div class="ant-advanced-search-form">
<a-form layout="inline" :form="queryParam">
<a-row :gutter="24">
<a-col :span="6" style="text-align: left">
<a-col :span="4" style="text-align: left">
<a-form-item label="巷道">
<a-select @change="handleChange" :value="select" style="width:100px">
<a-select-option :value="0">
全部
</a-select-option>
<a-select-option v-for="i in listData" :key="i.name" :value="i.id">
{{i.name}}
</a-select-option>
</a-select>
</a-form-item>
</a-col>
<a-col :span="6" >
<a-form-item label="工单号">
<a-input v-model="queryParam.orderNum" placeholder="请输入" style="width:270px;"/>
</a-form-item>
@ -23,7 +36,7 @@
</a-range-picker>
</a-form-item>
</a-col>
<a-col :span="10" style="text-align: right">
<a-col :span="6" style="text-align: right">
<a-button type="primary" @click="handleSearch"></a-button>
<a-button style="margin-left: 15px" @click="reset"></a-button>
</a-col>
@ -38,40 +51,52 @@
:pagination="pagination"
@change="handleGetHistoryList"
>
<span slot="intoStockPic" slot-scope="text" style="width:auto">
<span slot="streetType" slot-scope="text">
{{ text === null ? '-' : text === 0 ? '单伸' : '双伸' }}
</span>
<span slot="pics" slot-scope="text" style="width:auto">
<template>
<span style="height:100%;">
<happy-scroll color="rgba(100,100,100,0.5)" size="8" class="scroll-box" style="height:30px;">
<viewer :images="text.intoStockPic">
<img class="historyImg" v-for="(item,index) in text.intoStockPics" :key="index" :src="item" />
<span v-if="text.pics" style="height:100%;">
<happy-scroll color="rgba(100,100,100,0.5)" size="8" class="scroll-box" style="width:320px;height:90px;">
<viewer :images="text.pics">
<img class="historyImg" v-for="(src,index) in text.pics" :src="imgUrl+src"
:key="index"/>
</viewer>
</happy-scroll>
</span>
<span v-else>
暂无图片
</span>
</template>
</span>
<span slot="intoStockOverPic" slot-scope="text" style="width:auto">
<template>
<span style="height:100%;">
<happy-scroll color="rgba(100,100,100,0.5)" size="8" class="scroll-box" style="height:30px;">
<viewer :images="text.intoStockOverPic">
<img class="historyImg" :src="imgUrl+text.intoStockOverPic" />
</viewer>
</happy-scroll>
<span slot="status" slot-scope="text">
<span :style="text.status == 1 ?' color:red': ''">
{{ text.status == null ? ' ' : text.status == 0 ? '正常' : '告警' }}
</span>
</template>
</span>
<span slot="videoPath1" slot-scope="text">
<a-button type="link" @click="showModel(text)">
查看视频
</a-button>
</span>
<!-- <span slot="videoPath2" slot-scope="text">
<a-button type="link" v-if="text.videoPath2" @click="showModel(text.videoPath2)">
查看视频
</a-button>
<span v-else>
--
</span>
</span> -->
</a-table>
<Model
:visible.sync="visible"
:vid1.sync="vid1"
:vid2.sync="vid2"
@close="closeModel"
/>
</div>
</template>
<script>
@ -83,12 +108,15 @@ export default {
data() {
return {
queryParam: {
orderNum: ''
orderNum: '',
streetId: ''
},
listData:[],
time:[],
pageNum: 1,
pageSize: 10,
data: [],
select: '',
pagination:{
total: 0,
defaultPageSize: 10, //
@ -109,36 +137,50 @@ export default {
dataIndex: "streetName",
width: 90
},
// {
// title: "",
// dataIndex: "streetType",
// scopedSlots: {customRender: 'streetType'}
// },
{
title: "货位",
dataIndex: "goodsLocation",
},
{
title: "入库顶部照片",
scopedSlots: {customRender: 'intoStockPic'},
width:200
title: "时间",
dataIndex: "startTime",
},
{
title: "入库时间",
dataIndex: "intoStockTime",
title: "照片",
// dataIndex: "pic",
scopedSlots: {customRender: 'pics'},
width:320,
},
{
title: "入库完成照片",
// dataIndex: "pic",
scopedSlots: {customRender: 'intoStockOverPic'},
width:200,
title: "视频状态",
// dataIndex: "status",
scopedSlots: {customRender: 'status'},
width: 90
},
{
title: "入库完成时间",
dataIndex: "intoStockOverTime",
title: "工单时长",
dataIndex: "timeLength",
},
{
title: "视频录像",
// dataIndex: "videoPath1",
scopedSlots: {customRender: 'videoPath1'}
}
],
visible: false,
vid1: '',
vid2: ''
}
},
mounted() {
this.getStreetList();
this.handleGetHistoryList()
console.log(this.imgUrl)
if (this.$route.params.orderNum) {
@ -148,6 +190,30 @@ export default {
},
methods: {
moment,
handleChange(value) {
console.log(value);
if(value === 0){
this.select = "全部";
this.queryParam.streetId = value
} else {
for (let item of this.listData) {
if (item.id == value){
this.select = item.name
this.queryParam.streetId = value
}
}
}
},
//
getStreetList() {
this.$api.httpApi.getAllStreet({
}).then(res => {
this.listData = res.data;
}).catch(err => {
console.error(err);
});
},
range(start, end) {
const result = [];
for (let i = start; i < end; i++) {
@ -206,7 +272,10 @@ export default {
},
showModel(record) {
this.visible = true
this.vid1 = videoUrl + record.videoPath1;
console.log(this.vid1)
this.vid2 = videoUrl + record.videoPath2;
},
closeModel(visible, data) {
@ -217,6 +286,8 @@ export default {
this.queryParam.startTimestamp = ""
this.queryParam.endTimestamp = ""
this.queryParam.orderNum = ""
this.queryParam.streetId = ""
this.select = ""
this.time = []
this.pageNum = 1
this.pageSize = 10

@ -25,7 +25,7 @@
type="video/mp4"
>
</video>
<video
<!-- <video
class="video-js"
:autoplay="true"
@ -35,7 +35,7 @@
:src="video2"
type="video/mp4"
>
</video>
</video> -->
</div>
</a-modal>
</div>

@ -0,0 +1,371 @@
<template>
<div class="subsection">
<a-layout style="width: 1500px">
<a-layout style="width: 100%;height: 310px">
<a-layout-sider width="110px">
<a-tabs default-active-key="1" tab-position="left" @change="changeTabLeft" v-if="total.row > nums.row">
<a-tab-pane
v-for="index in latticeRow"
:key="index"
>
<span slot="tab" >
{{ getRandom(latticeRow + 1 -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-sider>
<a-layout-content>
<!-- <slot :data="{select, nums, random}"></slot> -->
<div class="roadway-buttom">
<div class="roadway-box">
<div class="line" v-for="(row,rowIndex) in total.row" :key="rowIndex" v-if="row >= random.row[0] && row <= random.row[1]">
<div v-for="(column,index) in total.column" :key="index" class="el" v-if="column >= random.column[0] && column <= random.column[1]">
<!--渲染默认巷道框架规格 定位浮在 已有巷道上做对应-->
<span
class="default"
:id="`${direction}-${side}-${random.row[0] + random.row[1] - rowIndex - 1}-${column}`"
@click="tocheckPage(random.row[0] + random.row[1] - rowIndex - 1,column)">
{{ random.row[0] + random.row[1] - rowIndex - 1}}-{{column}}
</span>
</div>
</div>
</div>
</div>
</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-tabs default-active-key="1" tab-position="bottom" @change="changeTab" 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 :id="`${shelveId}-row-${getRandom(index,latticeRow,nums.row,total.row)}`"/> -->
<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-footer>
</a-layout>
</div>
</template>
<script>
export default {
name: "Subsection",
components: {},
props: {
//
select: {
type: Object,
default: () => {
return {
row: 1,
column: 1
}
}
},
//
total:{
type: Object,
default:()=>{
return {}
}
},
nums: {
type: Object,
default: () => {
return {
row: 10,
column: 15
}
}
},
direction: {
type: Number,
default: () => {
return {}
}
},
side: {
type: Number,
default: () => {
return {}
}
},
streetId: {
type: Number,
default: () => {
return {}
}
},
streetName: {
type: String,
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),
}
},
watchDirection(){
return this.direction;
},
watchSide(){
return this.side;
},
},
watch: {
watchDirection() {
this.getStatus();
},
watchSide() {
this.getStatus();
},
immediate: true,
},
data() {
return {
status: {
row: {},
column: {}
},
timer: null
}
},
mounted() {
this.$nextTick(() => {
this.getStatus();
})
this.$on('hook:activated', () => {
this.timer = window.setInterval(this.getStatus, 3000);
})
this.timer = window.setInterval(this.getStatus, 3000);
this.$on('hook:deactivated', () => {
clearInterval(this.timer)
this.timer = null
})
},
beforeDestroy() {
console.log("beforeDestroy")
window.clearInterval(this.timer);
this.timer = null;
},
created() {
},
destroyed() {
window.clearInterval(this.timer);
this.timer = null;
},
methods: {
changeTab(value){
this.select.column = value
this.getStatus()
},
changeTabLeft(value){
this.select.row = value
this.getStatus()
},
//
getRandom(index, lattice, num, total) {
if(index !== lattice) {
return `${(index - 1) * num + 1} - ${index * num}`;
}else {
return `${(index - 1) * num + 1} - ${total}`;
}
},
//
getRandomRow(val) {
console.log(this.latticeRow + 1 - val, this.latticeRow, this.nums.row, this.total.row)
return this.getRandom(this.latticeRow + 1 - 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));
},
getStatusBg(row,column,status) {
var dom = document.getElementById(this.direction+"-"+this.side+"-"+row+'-'+column);
var color = status == 1 ?'#d81e06': (status == 2|| status == 3) ? '#1afa29': '#bfbfbf';
dom.style.background = color
},
getStatus(){
var columnTab = []
for(let c = 1; c <= this.latticeColumn ;c++){
let tab = this.getRandom(c,this.latticeColumn,this.nums.column,this.total.column)
columnTab.push(tab)
}
var rowTab = []
for(let r = 1; r <= this.latticeRow ;r++){
let tab = this.getRandom(r,this.latticeRow,this.nums.row,this.total.row)
rowTab.push(tab)
}
this.$api.httpApi.getStatusByRowColumn({
data: {
columnStart: this.random.column[0],
columnEnd: this.random.column[1],
rowStart: this.random.row[0],
rowEnd: this.random.row[1],
streetId: this.streetId,
direction: this.direction,
side: this.side,
rowTabs: rowTab,
columnTabs: columnTab
}
}).then(res => {
if(res.code == 200){
if(res.data.stocks){
for(let a of res.data.stocks){
this.getStatusBg(a.row,a.column,a.status)
}
}
var i = 1;
for(let a in res.data.columnTabStatus){
this.$set(this.status.column, i, res.data.columnTabStatus[a]);
i++;
}
var j = 0;
for(let a in res.data.rowTabStatus){
j++;
}
for(let a in res.data.rowTabStatus){
this.$set(this.status.row, j, res.data.rowTabStatus[a]);
j--;
}
}
}).catch(err => {
});
},
tocheckPage(row,column){
this.$router.push({
name: 'checkOperation',
query: {row: row, column: column, direction: this.direction,side:this.side, streetId: this.streetId, name:this.streetName}
})
}
}
}
</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;
}
roadway-buttom {
padding: 5px 0;
width: 100%;
}
.roadway-box {
//transform: rotateX(180deg);
padding: 10px 10px 0 0;
.line {
display: flex;
//transform: rotateX(180deg); //div
.el {
width: 46px;
height: 25px;
line-height: 25px;
margin: 2px;
font-size: 12px;
text-align: center;
border-radius: 4px;
cursor: pointer;
position: relative;
.default {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
}
}
}
}
}
</style>

@ -0,0 +1,266 @@
<template>
<div class="history">
<div style="display:flex">
<div style="margin-left: 10px,width:100,height:200,float:left">
<ul style="width:400,line-height:40">
<li>
<span class="img-box-title">
{{street.name}}-{{realCheck.direction == ''?'左右':(realCheck.direction == 1?"左":"右")}}-{{realCheck.side == ''?'深浅':(realCheck.side == 1?"浅":"深")}}-{{realCheck.row}}-{{realCheck.column}}
</span>
</li>
<li>
<span class="img-box-title">
核对状态:{{realCheck.status == 1?"盘点正确":"盘点异常"}}
</span>
</li>
<li>
<span class="img-box-title">
系统条码:{{realCheck.WMSCode}}
</span>
</li>
<li>
<span class="img-box-title">
盘点结果条码:{{realCheck.checkCode}}
</span>
</li>
<li>
<span class="img-box-title">
系统品规:
</span>
</li>
<li>
<span class="img-box-title">
盘点结果品规:
</span>
</li>
<li>
<span class="img-box-title">
系统数量:{{realCheck.WMSCount}}
</span>
</li>
<li>
<span class="img-box-title">
盘点结果数量:{{realCheck.checkCode}}
</span>
</li>
<li>
<span class="img-box-title">
盘点时间:{{realCheck.time}}
</span>
</li>
</ul>
</div>
<div >
<a-row type="flex" justify="space-around" style="height:300,margin-left:400">
<a-col :span="4">
<p>顶部图片1</p>
<viewer >
<img class="historyImg" :src="realCheck.topPic1"/>
</viewer>
</a-col>
<a-col :span="4">
<p>顶部图片2</p>
<viewer >
<img class="historyImg" :src="realCheck.topPic2"/>
</viewer>
</a-col>
</a-row>
<a-row type="flex" justify="space-around" align="middle" style="height:300">
<a-col :span="4">
<p>侧面图片1</p>
<viewer >
<img class="historyImg" :src="realCheck.sidePic1"/>
</viewer>
</a-col>
<a-col :span="4">
<p>侧面图片2</p>
<viewer >
<img class="historyImg" :src="realCheck.sidePic2"/>
</viewer>
</a-col>
</a-row>
<a-row type="flex" justify="space-around" align="middle" style="height:300">
<a-col :span="4">
<p>侧面图片3</p>
<viewer >
<img class="historyImg" :src="realCheck.sidePic3"/>
</viewer>
</a-col>
<a-col :span="4">
<p>侧面图片4</p>
<viewer >
<img class="historyImg" :src="realCheck.sidePic4"/>
</viewer>
</a-col>
</a-row>
</div>
</div>
</div>
</template>
<script>
import Model from "./model.vue"
export default {
name: "checkMonitoring",
data() {
return {
queryParam: {
orderNum: ''
},
street: '',
streetId:'',
SRMNumber:'',
streets:[],
realCheck:{
direction:'',
side:'',
column:'',
row:'',
WMSCode:'',
WMSCategory:'',
WMSCount:'',
checkCode:'',
checkCategory:'',
checkCount:'',
topPic1:'',
topPic2:'',
sidePic1:'',
sidePic2:'',
sidePic3:'',
sidePic4:'',
time:'',
}
}
},
mounted() {
this.request();
this.$nextTick(() => {
this.getRealTimeCheck();
})
this.$on('hook:activated', () => {
this.timer = window.setInterval(this.getRealTimeCheck, 3000);
})
this.timer = window.setInterval(this.getRealTimeCheck, 3000);
this.$on('hook:deactivated', () => {
clearInterval(this.timer)
this.timer = null
})
},
beforeDestroy() {
console.log("beforeDestroy")
window.clearInterval(this.timer);
this.timer = null;
},
created() {
},
destroyed() {
window.clearInterval(this.timer);
this.timer = null;
},
methods: {
request() {
this.$api.httpApi.getAllStreet({
}).then(res => {
console.log("update data")
this.streets = res.data
this.street = res.data[0]
this.streetId = this.street.id
this.SRMNumber = this.street.plcId
this.getRealTimeCheck();
}).catch(err => {
});
},
handleChange(value) {
this.street = value
console.log("street:"+this.street);
this.getRealTimeCheck();
},
getRealTimeCheck(){
console.log("SRMNUmber:"+this.SRMNumber);
this.$axios.get('/clientTest/realtimeCheck', {
params: {SRMNumber:this.SRMNumber}
}).then(res => {
if (res.code == 200) {
if(res.data != null){
this.realCheck = res.data
}
} else {
this.$message.error('获取失败');
}
}).catch(err => {
})
}
},
components: {
Model
}
};
</script>
<style lang="scss" scoped>
.history {
padding: 24px;
}
.ant-drawer-content-wrapper {
height: auto !important;
}
.ant-drawer-body {
text-align: center;
}
.ant-advanced-search-form .ant-form-item {
display: flex;
width: 100%;
}
.historyImg {
width: 900px;
height:auto;
margin: 5px;
}
ul {
height: 100%;
margin-bottom: 0;
padding-inline-start: 0;
li {
background-color: #ffaf11;
margin: 10px 0;
padding: 5px;
font-size: 16px;
font-weight: 600;
color: #494e52;
.img-box-title {
width: 230px;
display: inline-block;
}
}
}
</style>

@ -0,0 +1,122 @@
<template>
<div v-if="isShow">
<a-modal
v-model="isShow"
@cancel="handleCancel"
:footer="null"
:maskClosable="false"
:bodyStyle="{padding:0}"
:centered="true"
class="video-model"
>
<div slot="closeIcon">
<div class="video-close">
</div>
</div>
<div class="test_two_box">
<video
class="video-js"
:autoplay="true"
controls
>
<source
:src="video1"
type="video/mp4"
>
</video>
<video
class="video-js"
:autoplay="true"
controls
>
<source
:src="video2"
type="video/mp4"
>
</video>
</div>
</a-modal>
</div>
</template>
<style lang="scss" scoped>
.video-model {
.across-layout {
display: flex;
}
}
.ant-btn {
white-space: inherit;
text-align: left;
}
.video-js {
width: 100%;
height: 300px;
}
.video-close {
position: absolute;
right: 10px;
top: 10px;
color: #ffffff;
font-size: 18px;
width: 24px;
height: 24px;
background: rgba(0, 0, 0, 0.5);
display: flex;
align-items: center;
justify-content: center;
z-index: 10;
}
</style>
<script>
export default {
props: ['visible', 'vid1','vid2'],
watch: {
//visibleisShowprops
visible: function (newVal) {
this.isShow = newVal; //newValvisible
// newVal && this.showConfirm(); //newValshowConfirm
},
vid1: function (newVal) {
this.video1 = newVal
console.log(this.video1)
this.$nextTick(() => { //this.$nextTick
})
},
vid2: function (newVal) {
this.video2 = newVal
console.log(this.video2)
this.$nextTick(() => { //this.$nextTick
})
},
},
data() {
return {
isShow: false,
confirmLoading: false,
video1: '',
video2: '',
};
},
mounted() {
},
methods: {
handleCancel() {
this.$emit('close', false, '')
},
},
};
</script>

@ -0,0 +1,326 @@
<template>
<div class="history bg-white">
<div class="ant-advanced-search-form">
<a-form layout="inline" :form="queryParam">
<a-row :gutter="24">
<a-col :span="4">
<a-form-item label="巷道">
<a-select @change="handleChange" :value="select" style="width:100px">
<a-select-option v-for="i in listData" :key="i.name" :value="i.id">
{{i.name}}
</a-select-option>
</a-select>
</a-form-item>
</a-col>
<a-col :span="2">
<a-form-item label="左右">
<a-select v-model="queryParam.leftRight" @change="leftRightChange" >
<a-select-option :value=-1>
未选择
</a-select-option>
<a-select-option :value=1>
左侧
</a-select-option>
<a-select-option :value=2>
右侧
</a-select-option>
</a-select>
</a-form-item>
</a-col>
<a-col :span="2">
<a-form-item label="深浅" v-if="queryParam.side >= 0">
<a-select style="width: 50px" :key="queryParam.side" >
<a-select-option :key=-1>
未选择
</a-select-option>
<a-select-option :key=1>
</a-select-option>
<a-select-option :key=2>
</a-select-option>
</a-select>
</a-form-item>
</a-col>
<a-col :span="2" style="text-align: left">
<a-form-item label="行号">
<a-input v-model="queryParam.row" placeholder="请输入" style="width:50px;" type="number"/>
</a-form-item>
</a-col>
<a-col :span="2" style="text-align: left">
<a-form-item label="列号">
<a-input v-model="queryParam.column" placeholder="请输入" style="width:50px;" type="number"/>
</a-form-item>
</a-col>
<a-col :span="4" style="text-align: left">
<a-form-item label="盘点号">
<a-input v-model="queryParam.lotnum" placeholder="请输入" />
</a-form-item>
</a-col>
<a-col :span="4">
<a-form-item label="时间">
<a-range-picker
@change="onTimeChange"
v-model="time"
format="YYYY-MM-DD HH:mm"
:show-time="{
defaultValue: [moment('00:00', 'HH:mm'), moment('23:59', 'HH:mm')],
//defaultValue: [moment('00:00', 'YYYY-MM-DD HH:mm'), moment('23:59', 'YYYY-MM-DD HH:mm')],
}"
>
<a-icon slot="suffixIcon" type="calendar"/>
</a-range-picker>
</a-form-item>
</a-col>
<a-col :span="4" style="text-align: right">
<a-button type="primary" @click="handleSearch"></a-button>
<a-button style="margin-left: 15px" @click="reset"></a-button>
</a-col>
</a-row>
</a-form>
</div>
<a-table
:columns="columns"
:row-key="record => record.id"
:data-source="data"
:pagination="pagination"
@change="handleGetHistoryList"
>
<span slot="checkNum" slot-scope="text">
{{ text }}
</span>
<span slot="goodsLocation" slot-scope="text">
{{ text.direction == 1 ?"左":"右"}}-{{ text.side == 1 ?"浅":"深"}}-{{ text.row}}-{{ text.column}}
</span>
<span slot="status" slot-scope="text">
{{ statusMap[text.status] }}
</span>
<span slot="pic" slot-scope="text" style="width:auto">
<template>
<span style="height:100%;">
<happy-scroll color="rgba(100,100,100,0.5)" size="8" class="scroll-box" style="width:320px;height:90px;">
<viewer><img class="historyImg" :src="imgUrl+text.pic"/></viewer>
</happy-scroll>
</span>
</template>
</span>
</a-table>
</div>
</template>
<script>
import {imgUrl} from "@/api/importExcel";
import moment from 'moment';
export default {
name: "historyCheck",
data() {
return {
statusMap: {0:"未盘点",1:"盘点异常",2:"核对正确",3:"人工核对正确"},
queryParam: {
lotnum: '',
side : -1,
leftRight : -1
},
listData:[],
time:[],
pageNum: 1,
pageSize: 10,
data: [],
select: '',
pagination:{
total: 0,
defaultPageSize: 10, //
showTotal: total => `${total} 条数据`,//
showSizeChanger: true, //
pageSizeOptions: ['10', '20', '30'],
onShowSizeChange: (current, pageSize) => this.pageSize = pageSize //
},
imgUrl: imgUrl,
columns: [
{
title: "盘点批次号",
dataIndex: "lotnum",
},
{
title: "货位({左右}-{深浅}-{行}-{列})",
scopedSlots: {customRender: 'goodsLocation'},
},
{
title: "系统托盘条码号",
dataIndex: "wmsTrayCode",
},
{
title: "扫描托盘条码号",
dataIndex: "trayCode",
},
{
title: "盘点状态",
scopedSlots: {customRender: 'status'},
},
{
title: "照片",
scopedSlots: {customRender: 'pic'},
width:320,
},
{
title: "时间",
dataIndex: "createTime",
},
],
}
},
mounted() {
this.getStreetList();
this.handleSearch();
},
methods: {
moment,
//
getStreetList() {
this.$api.httpApi.getAllStreet({
}).then(res => {
this.listData = res.data;
}).catch(err => {
console.error(err);
});
},
//
getStreetDetail(id) {
this.$axios.get('/street/' + id, {
data: {}
}).then(res => {
this.streetDetail = res.data
this.select = this.streetDetail.name;
this.queryParam.streetId = this.streetDetail.id;
}).catch(err => {
})
},
handleChange(value) {
this.getStreetDetail(value)
this.queryParam.leftRight = -1
this.queryParam.side = -1
},
//
leftRightChange(value) {
if (value == 1) {
//
if(this.streetDetail.leftType == 0){
this.queryParam.side = -1
}else{
this.queryParam.side = 0
}
} else if (value == 2) {
if(this.streetDetail.rightType == 0){
this.queryParam.side = -1
}else{
this.queryParam.side = 0
}
} else{
this.queryParam.side = -1
}
},
handleSearch() {
console.log(this.queryParam)
this.pageNum = 1
this.request()
},
handleGetHistoryList(pagination) {
console.log(pagination)
if(pagination){
this.pagination.current = pagination.current;
this.pagination.pageSize = pagination.pageSize;
this.pageNum = pagination.current;
this.pageSize = pagination.pageSize;
}
this.request();
},
request() {
this.$api.httpApi.checkLog({
data: {
pageNum: this.pageNum,
pageSize: this.pageSize,
...this.queryParam
}
}).then(res => {
console.log(res.data)
const pagination = {...this.pagination};
pagination.total = res.data.total;
this.pagination = pagination;
this.data = res.data.list
}).catch(err => {
});
},
onTimeChange(date, dateString) {
this.handleReset()
console.log(date)
console.log(dateString)
console.log(date[0].format('YYYY-MM-DD HH:mm'))
this.pageNum = 1
this.queryParam.startTimestamp = date[0].format('YYYY-MM-DD HH:mm:ss')
this.queryParam.endTimestamp = date[1].format('YYYY-MM-DD HH:mm:ss')
},
handleReset() {
this.queryParam.startTimestamp = ""
this.queryParam.endTimestamp = ""
this.pageNum = 1
},
reset() {
this.queryParam.startTimestamp = ""
this.queryParam.endTimestamp = ""
this.queryParam.lotnum = ""
this.queryParam.side = -1
this.queryParam.leftRight = -1
this.queryParam.streetId = 0
this.select = null;
this.time = []
this.pageNum = 1
this.pageSize = 10
this.queryParam.row = null
this.queryParam.column = null
this.request()
},
},
};
</script>
<style lang="scss" scoped>
.history {
padding: 24px;
}
.ant-drawer-content-wrapper {
height: auto !important;
}
.ant-drawer-body {
text-align: center;
}
.ant-advanced-search-form .ant-form-item {
display: flex;
width: 100%;
}
.historyImg {
width: 80px;
height:auto;
margin: 5px;
}
</style>

@ -27,13 +27,15 @@
<span slot="rightType" slot-scope="text">
{{ text === null ? '-' : text === 0 ? '单伸' : '双伸' }}
</span>
<span slot="connectStatus" slot-scope="text">
{{ text.connectStatus === 1 ? '已连接' : "未连接" }}
</span>
<span slot="plc" slot-scope="text" v-if="text.plcIp">
{{ text.plcIp }}:{{text.plcPort}}
</span>
<span slot="lightSourceIp" slot-scope="text" v-if="text.lightSourceIp">
{{ text.lightSourceIp }}:{{text.lightSourcePort}}
</span>
<span slot="RFID" slot-scope="text" v-if="text.RFIDIp">
{{ text.RFIDIp }}:{{text.RFIDPort}}
</span>
<span slot="sensorGun" slot-scope="text">
<template>
<span v-if="text.rightSensorGunIp && text.leftSensorGunIp">{{text.leftSensorGunIp}}:{{text.leftSensorGunPort}} {{text.rightSensorGunIp}}:{{text.rightSensorGunPort}}</span>
@ -45,10 +47,10 @@
</span>
<span slot="actions" slot-scope="text">
<template>
<span v-if="text.camera1Name ">{{text.camera1Name}} </span>
<span v-if="text.camera1Name && text.camera2Name">{{text.camera1Name}} {{text.camera2Name}}</span>
<span v-else>
<span >{{text.camera1Name}}</span>
<span v-if="text.camera1Name">{{text.camera1Name}}</span>
<span v-if="text.camera2Name">{{text.camera2Name}}</span>
</span>
</template>
</span>
@ -97,14 +99,20 @@ const columns = [
dataIndex: 'plcId',
},
{
title: '客户端IP',
dataIndex: 'plcIp',
title: '光源IP',
scopedSlots: { customRender: 'lightSourceIp' }
},
{
title: '客户端连接状态',
scopedSlots: { customRender: 'connectStatus' }
title: 'plc',
scopedSlots: { customRender: 'plc' }
},
{
title: 'RFID',
scopedSlots: { customRender: 'RFID' }
},
{
title: '扫码枪',
scopedSlots: { customRender: 'sensorGun' }
},
{
title: '左货架类型',

@ -27,14 +27,41 @@
</a-form-item>
</div>
<div class="across-layout">
<a-form-item label="客户端 IP" :label-col="formItemAcrossLayout.labelCol">
<a-form-item label="PLC IP" :label-col="formItemAcrossLayout.labelCol">
<a-input
v-decorator="['plcIp']"
/>
</a-form-item>
<a-form-item label="PLC PORT" :label-col="formItemAcrossLayout.labelCol">
<a-input
v-decorator="['plcPort']"
/>
</a-form-item>
</div>
<div class="across-layout">
<a-form-item label="光源IP" :label-col="formItemAcrossLayout.labelCol">
<a-input
v-decorator="['lightSourceIp']"
/>
</a-form-item>
<a-form-item label="光源 PORT" :label-col="formItemAcrossLayout.labelCol">
<a-input
v-decorator="['lightSourcePort']"
/>
</a-form-item>
</div>
<div class="across-layout">
<a-form-item label="RFID IP" :label-col="formItemAcrossLayout.labelCol">
<a-input
v-decorator="['RFIDIp']"
/>
</a-form-item>
<a-form-item label="RFID PORT" :label-col="formItemAcrossLayout.labelCol">
<a-input
v-decorator="['RFIDPort']"
/>
</a-form-item>
</div>
<a-divider></a-divider>
<div class="leftType">
@ -72,7 +99,18 @@
</a-form-item>
</div>
<div class="across-layout">
<a-form-item label="扫码枪IP" :label-col="formItemAcrossLayout.labelCol">
<a-input
v-decorator="['leftSensorGunIp']"
/>
</a-form-item>
<a-form-item label="扫码枪PORT" :label-col="formItemAcrossLayout.labelCol">
<a-input
v-decorator="['leftSensorGunPort']"
/>
</a-form-item>
</div>
<a-divider></a-divider>
</div>
@ -109,10 +147,21 @@
/>
</a-form-item>
</div>
<div class="across-layout">
<a-form-item label="扫码枪IP" :label-col="formItemAcrossLayout.labelCol">
<a-input
v-decorator="['rightSensorGunIp']"
/>
</a-form-item>
<a-form-item label="扫码枪PORT" :label-col="formItemAcrossLayout.labelCol">
<a-input
v-decorator="['rightSensorGunPort']"
/>
</a-form-item>
</div>
<a-divider></a-divider>
</div>
<div >
<div v-if="cameraList.length>0">
<a-form-item label="球机" :label-col="formItemVerticalLayout.labelCol">
<a-select
v-decorator="[
@ -128,7 +177,22 @@
</a-form-item>
</div>
<div v-else>
<a-form-item label="球机" :label-col="formItemVerticalLayout.labelCol">
<a-select
v-decorator="[
'camera1Name',
]"
placeholder="选择球机"
@dropdownVisibleChange="handleSelectCamera"
>
<a-select-option v-for="item in cameraList" :key="item.id" :value="item.id">
{{item.name}}
</a-select-option>
</a-select>
</a-form-item>
</div>
</a-form>
</a-modal>
@ -310,7 +374,6 @@ export default {
data: {
pageNum:0,
pageSize:0,
searchType:1,
}
}).then(res => {
this.cameraList = res.data.list;

Loading…
Cancel
Save