You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
999 lines
34 KiB
999 lines
34 KiB
<template>
|
|
<div class="app-container">
|
|
<div class="venue-header dataScreening-header">
|
|
<h4><i class="iconfont icon-shuju" />架位总览</h4>
|
|
<div class="bookshelf-area">
|
|
<!-- <span class="bookshelf-area">{{ floorName }} - {{ regionName }} - {{ gridRow +'排' }}</span> -->
|
|
<router-link :to="{ path: '/check/check/dataScreening', query: {floorTabIndex: floorTabIndex }}">
|
|
{{ floorName }}
|
|
</router-link>
|
|
<span>/</span>
|
|
<router-link :to="{ path: '/dataScreening/regions', query: {regionTabIndex: regionTabIndex }}">
|
|
{{ regionName }}
|
|
</router-link>
|
|
<span>/</span>
|
|
<router-link :to="{ path: '/dataScreening/shelf', query: {tabIndex: tabIndex }}">
|
|
{{ gridRow +'排' }}
|
|
</router-link>
|
|
<div class="double-click-btn"><span>点击左侧位置返回</span></div>
|
|
</div>
|
|
<p><i class="iconfont icon-gongsi" />{{ user.fonds.fondsName }}</p>
|
|
</div>
|
|
<div class="venue-content">
|
|
<div class="tab-content">
|
|
<span class="right-top-line" />
|
|
<span class="left-bottom-line" />
|
|
<div class="gird-data-header">
|
|
<ul class="tab-nav">
|
|
<li v-for="(item,index) in tabListData" :key="index" class="active-tab-nav">{{ item.name }}<i /></li>
|
|
<!-- 最右侧装饰img -->
|
|
<span class="tab-right-img" />
|
|
</ul>
|
|
<!-- <div class="tag-info">
|
|
<p class="tag-sort">错序:<i class="iconfont icon-zhuangtai2" />1</p>
|
|
<p class="tag-place">错架:<i class="iconfont icon-zhuangtai2" />1</p>
|
|
<p class="tag-all">在架:<i class="iconfont icon-zhuangtai2" />20</p>
|
|
</div> -->
|
|
<div v-if="checkDateLine.length !== 0" class="time-update-cont">
|
|
<span class="time-left-txt">最后更新时间:</span>
|
|
<!-- <el-button class="time-btn-txt">{{ checkDateLine[2].endTime }}</el-button> -->
|
|
<el-button>{{ checkDateLine[timeIndex].stockType === 0 ? '现在' : checkDateLine[timeIndex].endTime }}</el-button>
|
|
<div class="time-update-line">
|
|
<ul class="el-timeline">
|
|
<li v-for="(activity, index) in checkDateLine" :key="index" class="el-timeline-item" @click="handleHistory(activity,index)">
|
|
<div class="el-timeline-item__tail" />
|
|
<div class="el-timeline-item__node el-timeline-item__node--normal" :style="index === timeIndex ? 'background-color: rgb(11, 189, 135);' : ''">
|
|
<i v-if="index === timeIndex" class="el-timeline-item__icon el-icon-more" />
|
|
</div>
|
|
<div class="el-timeline-item__wrapper">
|
|
<div class="el-timeline-item__content">
|
|
{{ computedStockType(activity.stockType) }}
|
|
</div>
|
|
<div class="el-timeline-item__timestamp is-bottom">
|
|
{{ activity.endTime }}
|
|
</div>
|
|
</div>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
<crudOperation :permission="permission">
|
|
<template v-slot:middle>
|
|
<el-select v-model="layerVal" size="small" placeholder="架位" class="filter-item" style="width: 100px; margin-right: 10px;" @change="changeShelfGetGrid">
|
|
<el-option v-for="item in rackOptions" :key="item.id" :label="item.name" :value="item.id" />
|
|
</el-select>
|
|
<el-button v-permission="permission.add" class="check-btn" size="mini" @click="toAdd(5)">
|
|
<i class="iconfont icon-shengchengpandiandan" />
|
|
架位盘点
|
|
</el-button>
|
|
</template>
|
|
<template v-slot:right>
|
|
<!-- @click="doExport(crud.selections)" -->
|
|
<el-button :loading="crud.downloadLoading" size="mini" @click="doExport(3)">
|
|
<i class="iconfont icon-daochu" />
|
|
导出
|
|
</el-button>
|
|
</template>
|
|
</crudOperation>
|
|
</div>
|
|
|
|
<div v-loading="shelfAllGridDataLoading" class="gird-data-book">
|
|
<div v-for="(item,index) in shelfAllGridData" :key="index" class="gird-layer">
|
|
<span class="gird-left-line" />
|
|
<span class="gird-right-line" />
|
|
<div class="layer-left">
|
|
<div class="layer-left-book">
|
|
<div
|
|
v-for="(book,i) in item.books"
|
|
:key="i"
|
|
:class="['book-item', { 'red-active' : book.bookStatus === '错架'} ,{ 'blue-active' : book.bookStatus === '错序'}]"
|
|
@mouseenter="showPopover(index, i, $event)"
|
|
@mouseleave="hidePopover"
|
|
>
|
|
<span class="book-name">{{ book.bookName }}</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="layer-right-handle">
|
|
<div class="layer-info-header">
|
|
<h4>{{ item.gridName }}</h4>
|
|
<!-- <span>2024-11-28 09:46</span> -->
|
|
</div>
|
|
<div class="layer-right-content">
|
|
<div class="layer-tag-info">
|
|
<div class="tag-item tag-sort">错序:<i class="iconfont icon-zhuangtai2" /><p>{{ baseStockData.length !==0 && baseStockData[index].errorOrderNum }}</p><span>({{ baseStockData.length !==0 && baseStockData[index].errorOrderProbo }})</span></div>
|
|
<div class="tag-item tag-place">错架:<i class="iconfont icon-zhuangtai2" /><p>{{ baseStockData.length !==0 &&baseStockData[index].errorShelfNum }}</p><span>({{ baseStockData.length !==0 && baseStockData[index].errorShelfProbo }})</span></div>
|
|
<div class="tag-item tag-all">在架:<i class="iconfont icon-zhuangtai2" /><p>{{ baseStockData.length !==0 && baseStockData[index].onShelfNum }}</p></div>
|
|
</div>
|
|
<div class="layer-handle">
|
|
<el-button size="mini" @click="handleDetail(item)">
|
|
<i class="iconfont icon-xiaowenjian" />
|
|
详情
|
|
</el-button>
|
|
<el-button size="mini" class="check-btn" @click="toAdd(6,item)">
|
|
<i class="iconfont icon-shengchengpandiandan" />
|
|
盘点
|
|
</el-button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<!-- popover -->
|
|
<div
|
|
v-if="popoverIndex !== null"
|
|
class="popover-external-set"
|
|
:style="popoverStyle"
|
|
>
|
|
<div class="popover-content-set">
|
|
<div class="tooltip-top">
|
|
<h4>{{ shelfAllGridData[popoverIndex.layer].books[popoverIndex.book].bookName }}</h4>
|
|
<span v-if="shelfAllGridData[popoverIndex.layer].books[popoverIndex.book].bookStatus === '错序'" class="tag-item tag-place">错序</span>
|
|
<span v-if="shelfAllGridData[popoverIndex.layer].books[popoverIndex.book].bookStatus === '错架'" class="tag-item tag-sort">错架</span>
|
|
</div>
|
|
<ul>
|
|
<li><p>索书号</p><em>{{ shelfAllGridData[popoverIndex.layer].books[popoverIndex.book].sortmark }}</em></li>
|
|
<li><p>ISBN</p><em>{{ shelfAllGridData[popoverIndex.layer].books[popoverIndex.book].isbn }}</em></li>
|
|
<li><p>著者</p><em>{{ shelfAllGridData[popoverIndex.layer].books[popoverIndex.book].bookAuthor }}</em></li>
|
|
<li><p>出版社</p><em>{{ shelfAllGridData[popoverIndex.layer].books[popoverIndex.book].bookPublish }}</em></li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- 详情 -->
|
|
<el-dialog class="dialog-grid-detail" append-to-body :close-on-click-modal="false" :visible.sync="detailVisible" :title="detailCurrent.gridName +'- 详情'" @close="handleCloseDialog">
|
|
<span class="dialog-right-top" />
|
|
<span class="dialog-left-bottom" />
|
|
|
|
<div class="setting-dialog">
|
|
<div class="detail-tab tab-content">
|
|
<!-- <el-button v-if="detailCurrent && detailCurrent.onShelfNum" class="check-view-img" size="mini" @click="handleViewImg">
|
|
<i class="iconfont icon-sulan" />
|
|
盘点照片
|
|
</el-button> -->
|
|
<div v-if="detailCurrent && detailCurrent.onShelfNum" style="height: 260px; background-color: #ccc; overflow: hidden; position: relative;" @click="handleViewImg">
|
|
<img style="display:block; width: 100%;" :src="bigImg" alt="">
|
|
<span style="position: absolute; top: 0; right: 0; padding: 4px 6px; color: #fff; background-color: rgba(3,72,243,.8); border-radius: 4px;">单击可查看所有图片</span>
|
|
</div>
|
|
<ul class="tab-nav">
|
|
<li :class="{'active-tab-nav': tabdialogIndex === 0}" @click="changeDialogTab(0)">图书列表</li>
|
|
</ul>
|
|
<el-table
|
|
ref="table"
|
|
class="archives-table"
|
|
:data="detailTable"
|
|
style="width: 100%;"
|
|
height="calc(100vh - 560px)"
|
|
>
|
|
<el-table-column type="index" label="序号" width="55" align="center" />
|
|
<el-table-column prop="bookName" label="题名" min-width="110" show-overflow-tooltip />
|
|
<el-table-column prop="isbn" label="ISBN" />
|
|
<el-table-column prop="sortmark" label="索书号" />
|
|
<el-table-column prop="barcode" label="条码" />
|
|
<el-table-column prop="floorName" label="所在位置" min-width="160">
|
|
<template slot-scope="scope">
|
|
<span>
|
|
{{ getLocation(scope.row) }}
|
|
</span>
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column prop="bookStatus" label="盘点结果" align="center">
|
|
<template slot-scope="scope">
|
|
<span v-if="scope.row.bookStatus === '未知'" class="row-state row-warehousing">未知</span>
|
|
<span v-if="scope.row.bookStatus === '在架'" class="row-state row-binding state-active">在架</span>
|
|
<span v-if="scope.row.bookStatus === '错架'" class="row-state row-lending state-active">错架</span>
|
|
<span v-if="scope.row.bookStatus === '错序'" class="row-state row-physical state-active">错序</span>
|
|
</template>
|
|
</el-table-column>
|
|
<!-- <el-table-column prop="updateTime" label="盘点时间">
|
|
<template slot-scope="scope">
|
|
<div>{{ scope.row.updateTime | parseTime }}</div>
|
|
</template>
|
|
</el-table-column> -->
|
|
</el-table>
|
|
</div>
|
|
</div>
|
|
</el-dialog>
|
|
|
|
<el-dialog class="gird-img-detail" append-to-body :close-on-click-modal="false" :visible.sync="detailImgVisible">
|
|
<span class="dialog-right-top" />
|
|
<span class="dialog-left-bottom" />
|
|
<div class="gird-img-button">
|
|
<el-button size="mini" :loading="downImgLoading" :disabled="downImgLoading" @click="handleDownloadImg">
|
|
<i class="iconfont icon-xiazai" />
|
|
下载
|
|
</el-button>
|
|
<el-button size="mini" @click="handleCloseImgDialog">
|
|
<i class="iconfont icon-guanbixiao" />
|
|
关闭
|
|
</el-button>
|
|
</div>
|
|
<div class="setting-dialog">
|
|
<el-carousel ref="carousel" indicator-position="outside" :autoplay="false" @setActiveItem="setActiveItem">
|
|
<el-carousel-item v-for="item in bookImgData" :key="item">
|
|
<img :src="item" alt="">
|
|
</el-carousel-item>
|
|
</el-carousel>
|
|
</div>
|
|
</el-dialog>
|
|
<eForm ref="eform" />
|
|
<exportForm ref="exportform" export-type="grid" />
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
import { FetchInitStockInfo, FetchInitBookDetailsByGrids, FetchBillByShelfIdAndGridShelf, FetchIsGoodcutByBillNoAndGridId, FetchShowByBillIdAndShelfIdAndGridShelf } from '@/api/stockTask/index'
|
|
import { dataScreeningCrud } from '@/views/visualCheck/mixins/index'
|
|
import { FetchBookShelfDetails, FetchShelfGridByShelfIdAndGridShelf } from '@/api/shelf/index'
|
|
import crudRegion from '@/api/area/index'
|
|
import CRUD, { presenter, header, crud } from '@crud/crud'
|
|
import crudOperation from '@crud/CRUD.operation'
|
|
import { mapGetters } from 'vuex'
|
|
import eForm from './module/form'
|
|
import exportForm from './module/export'
|
|
import { parseTime, saveAs, getBlob } from '@/utils/index'
|
|
|
|
export default {
|
|
name: 'DataScreening',
|
|
components: { crudOperation, eForm, exportForm },
|
|
cruds() {
|
|
return CRUD({ title: '架位盘点', url: 'api/libraryRegion/initLibraryRegionList', crudMethod: { ...crudRegion }, sort: [], optShow: {
|
|
add: false,
|
|
edit: false,
|
|
del: false,
|
|
download: false,
|
|
group: false,
|
|
reset: false
|
|
},
|
|
queryOnPresenterCreated: false
|
|
})
|
|
},
|
|
mixins: [presenter(), header(), crud(), dataScreeningCrud],
|
|
data() {
|
|
return {
|
|
activeIndex: 0,
|
|
downImgLoading: false,
|
|
detailVisible: false,
|
|
detailImgVisible: false,
|
|
detailTable: [],
|
|
detailCurrent: {},
|
|
tabdialogIndex: 0,
|
|
listLoading: false,
|
|
tabIndex: 0,
|
|
floorTabIndex: 0,
|
|
regionTabIndex: 0,
|
|
floorName: null,
|
|
floorId: null,
|
|
regionName: null,
|
|
regionId: null,
|
|
gridRow: null,
|
|
gridShelf: null,
|
|
bookShelfDetails: null,
|
|
booShelfGrid: null,
|
|
shelfAllGridData: [],
|
|
layerNum: 0,
|
|
rackNum: 0,
|
|
bookNum: 46,
|
|
layerVal: null,
|
|
rackOptions: [],
|
|
tabListData: [],
|
|
permission: {
|
|
add: ['admin', 'floor:add'],
|
|
edit: ['admin', 'floor:edit'],
|
|
del: ['admin', 'floor:del']
|
|
},
|
|
popoverIndex: null,
|
|
popoverVisible: [],
|
|
popoverStyles: [],
|
|
currentBookName: '', // 当前书籍的名称
|
|
popoverPosition: { x: 0, y: 0 }, // Popover的位置
|
|
checkDateLine: [],
|
|
baseStockData: [],
|
|
shelfAllGridDataLoading: false,
|
|
billNoImg: null,
|
|
bookImgData: [],
|
|
bigImg: '',
|
|
timeIndex: 0,
|
|
gridName: '',
|
|
getGridToward: 1
|
|
}
|
|
},
|
|
computed: {
|
|
...mapGetters([
|
|
'user',
|
|
'baseApi'
|
|
]),
|
|
swiperContent() {
|
|
return this.$refs.swiperContent.$el.swiper
|
|
},
|
|
swiperTitle() {
|
|
return this.$refs.swiperTitle.$el.swiper
|
|
},
|
|
cellStyle: function() {
|
|
const h = '76px'
|
|
const w = '100%/' + this.rackNum
|
|
return { width: `calc(${w} )`, height: `calc(${h})` }
|
|
},
|
|
popoverStyle() {
|
|
return {
|
|
top: `${this.popoverPosition.y - 300}px`, // 鼠标的Y坐标偏移10px
|
|
left: `${this.popoverPosition.x - 240}px`, // 鼠标的X坐标偏移10px
|
|
position: 'absolute'
|
|
}
|
|
}
|
|
|
|
},
|
|
async created() {
|
|
this.initData()
|
|
},
|
|
methods: {
|
|
[CRUD.HOOK.beforeRefresh]() {
|
|
},
|
|
[CRUD.HOOK.afterRefresh](crud) {
|
|
},
|
|
// 提交前的验证
|
|
[CRUD.HOOK.afterValidateCU](crud) {
|
|
return true
|
|
},
|
|
computedStockType(stockType) {
|
|
switch (stockType) {
|
|
case 1:
|
|
return '全量盘点'
|
|
case 2:
|
|
return '区域盘点'
|
|
case 3:
|
|
return '计划盘点'
|
|
case 4:
|
|
return '书架盘点'
|
|
case 5:
|
|
return '架位盘点'
|
|
case 6:
|
|
return '层位盘点'
|
|
default:
|
|
return '现在'
|
|
}
|
|
},
|
|
initData() {
|
|
if (localStorage.getItem('dataScreenFloorTableIndex')) {
|
|
this.floorTabIndex = localStorage.getItem('dataScreenFloorTableIndex')
|
|
}
|
|
if (localStorage.getItem('dataScreenRegionTableIndex')) {
|
|
this.regionTabIndex = localStorage.getItem('dataScreenRegionTableIndex')
|
|
}
|
|
if (localStorage.getItem('dataScreenShelf')) {
|
|
const dataScreenShelf = JSON.parse(localStorage.getItem('dataScreenShelf'))
|
|
this.floorName = dataScreenShelf.floorName
|
|
this.regionName = dataScreenShelf.regionName
|
|
this.gridName = dataScreenShelf.gridName
|
|
this.gridRow = dataScreenShelf.gridRow
|
|
this.gridShelf = dataScreenShelf.gridShelf
|
|
|
|
if (localStorage.getItem('dataScreenShelfAllGrid')) {
|
|
this.shelfAllGridData = JSON.parse(localStorage.getItem('dataScreenShelfAllGrid'))
|
|
}
|
|
|
|
// 单面/双面
|
|
this.tabListData = [{ name: dataScreenShelf.regionName + ' - ' + this.removeAreaPrefix(dataScreenShelf.gridName) }]
|
|
|
|
// dataScreenShelf.rowType === 1
|
|
// ? dataScreenShelf.toward === 1
|
|
// ? [{ name: 'A面' }]
|
|
// : [{ name: 'B面' }]
|
|
// : [{ name: 'A面' }, { name: 'B面' }]
|
|
|
|
this.tabIndex = dataScreenShelf.toward - 1
|
|
FetchBookShelfDetails({ 'shelfId': dataScreenShelf.shelfId }).then(res => {
|
|
this.layerNum = res.shelfFloor
|
|
this.rackNum = res.shelfShelf
|
|
this.floorId = res.floorId
|
|
this.regionId = res.regionId
|
|
this.bookShelfDetails = res
|
|
|
|
this.rackOptions = []
|
|
for (let i = 1; i <= this.rackNum; i++) {
|
|
this.rackOptions.push({ id: i, name: `0${i}架` })
|
|
}
|
|
this.layerVal = parseInt(this.gridShelf) || ''
|
|
|
|
this.getInitStockInfo(this.shelfAllGridData)
|
|
|
|
this.getInitBookDetailsByGrids(this.shelfAllGridData)
|
|
|
|
this.getBillByShelfIdAndGridShelf(this.shelfAllGridData)
|
|
}).catch(() => {
|
|
})
|
|
}
|
|
},
|
|
removeAreaPrefix(gridNames) {
|
|
const index = gridNames.indexOf('面')
|
|
if (index !== -1) {
|
|
return gridNames.substring(0, index + 1)
|
|
}
|
|
return gridNames
|
|
},
|
|
getLocation(row) {
|
|
const parts = []
|
|
if (row.floorName) {
|
|
parts.push(row.floorName)
|
|
}
|
|
if (row.regionName) {
|
|
parts.push(row.regionName)
|
|
}
|
|
if (row.gridName) {
|
|
parts.push(row.gridName)
|
|
}
|
|
return parts.length > 0 ? parts.join('-') : '-'
|
|
},
|
|
getBillByShelfIdAndGridShelf(data) {
|
|
const params = {
|
|
'gridShelf': data[0].gridShelf,
|
|
'ShelfId': data[0].shelfId,
|
|
'size': 5
|
|
}
|
|
FetchBillByShelfIdAndGridShelf(params).then(res => {
|
|
if (res !== null) {
|
|
this.checkDateLine = res.sort((a, b) => {
|
|
return new Date(b.endTime) - new Date(a.endTime)
|
|
})
|
|
this.checkDateLine.unshift({
|
|
stockType: 0,
|
|
icon: 'el-icon-more',
|
|
color: '#0bbd87'
|
|
})
|
|
this.billNoImg = this.checkDateLine[this.timeIndex].stockType === 0 ? this.checkDateLine[1].stockBill : this.checkDateLine[this.timeIndex].stockBill
|
|
} else {
|
|
this.checkDateLine = []
|
|
}
|
|
}).catch(() => {
|
|
})
|
|
},
|
|
async getInitStockInfo(data) {
|
|
const promises = data.map(item => {
|
|
const params = {
|
|
'floorId': this.floorId,
|
|
'regionId': this.regionId,
|
|
'shelfId': item.shelfId,
|
|
'gridId': item.id
|
|
}
|
|
return FetchInitStockInfo(params)
|
|
})
|
|
const results = await Promise.all(promises)
|
|
if (!Array.isArray(this.baseStockData)) {
|
|
this.baseStockData = []
|
|
}
|
|
this.baseStockData = this.baseStockData.concat(results)
|
|
},
|
|
getInitBookDetailsByGrids(data) {
|
|
const ids = data.map(item => item.id)
|
|
const params = {
|
|
'grids': ids.join(',')
|
|
}
|
|
FetchInitBookDetailsByGrids(params).then(res => {
|
|
this.shelfAllGridData.forEach((item) => {
|
|
const gridId = item.id
|
|
if (res.hasOwnProperty(gridId)) {
|
|
this.$set(item, 'books', res[gridId])
|
|
}
|
|
})
|
|
}).catch(() => {
|
|
})
|
|
},
|
|
toAdd(type, item) {
|
|
if (type === 5) {
|
|
this.$refs.eform.formVisible = true
|
|
this.$refs.eform.form.shelfId = this.bookShelfDetails.id
|
|
this.$refs.eform.form.gridShelf = this.gridShelf
|
|
this.$refs.eform.form.stockRegion = this.floorName + this.regionName + this.bookShelfDetails.shelfName + this.gridShelf + '架'
|
|
} else {
|
|
if (item.isCheck) {
|
|
this.$refs.eform.formVisible = true
|
|
this.$refs.eform.form.shelfId = null
|
|
this.$refs.eform.form.gridShelf = null
|
|
this.$refs.eform.form.gridId = item.id
|
|
this.$refs.eform.form.stockRegion = item.gridName
|
|
} else {
|
|
this.$message({ message: '当前层位不可盘点', type: 'error', offset: 8 })
|
|
}
|
|
}
|
|
this.$refs.eform.setData(type)
|
|
},
|
|
doExport(type) {
|
|
this.$refs.exportform.formExportVisible = true
|
|
this.$refs.exportform.type = 3
|
|
this.$refs.exportform.params = {
|
|
// 'floorId': this.floorId,
|
|
// 'regionId': this.regionId,
|
|
'shelfId': this.bookShelfDetails.id
|
|
}
|
|
},
|
|
handleCellCurrent(item, index) {
|
|
this.cellIndex = index
|
|
this.cellInfo = {
|
|
id: item.id,
|
|
gridName: item.gridName,
|
|
startSortmark: item.startSortmark,
|
|
endSortmark: item.endSortmark,
|
|
cameraId: item.cameraId,
|
|
check: item.isCheck,
|
|
order: item.isOrder
|
|
}
|
|
this.handleToGrids(this.cellInfo)
|
|
},
|
|
handleDetail(item) {
|
|
this.detailVisible = true
|
|
this.detailTable = item.books
|
|
this.detailCurrent = item
|
|
if (this.detailCurrent.onShelfNum) {
|
|
this.bigImg = `${this.baseApi}/api/fileRelevant/getImg?imgType=1&imgId=/${this.libcode}/${this.billNoImg}/${this.detailCurrent.gridCode}/img_result/result_LSD_compressed.jpg`
|
|
} else {
|
|
this.bigImg = ''
|
|
}
|
|
},
|
|
setActiveItem(index) {
|
|
this.$refs.carousel.setActiveItem(index)
|
|
},
|
|
handleViewImg() {
|
|
// /PD20250102001/040011011/img_result/result_cut_1.jpg
|
|
// /PD20250102001/040011011/img_result/result_cut_2.jpg
|
|
// /PD20250102001/040011011/img_result/result_cut_3.jpg
|
|
// http://192.168.99.67:12010/api/fileRelevant/getImg?imgType=1&imgId=/ceshi111/1_1_book_spine-0.png
|
|
|
|
// http://192.168.99.67:12010/api/fileRelevant/getImg?imgType=1&imgId=/1501/PD20250108013/010011015/img_result/result_LSD.jpg
|
|
// http://192.168.99.67:12010/api/fileRelevant/getImg?imgType=1&imgId=/1501/PD20250108013/010011015/img_result/result_cut_1_compressed.jpg
|
|
this.bookImgData = []
|
|
this.detailImgVisible = true
|
|
const params = {
|
|
'billNo': this.billNoImg,
|
|
'gridId': this.detailCurrent.id
|
|
}
|
|
FetchIsGoodcutByBillNoAndGridId(params)
|
|
.then(res => {
|
|
const baseUrl = `${this.baseApi}/api/fileRelevant/getImg?imgType=1&imgId=/${this.libcode}/${this.billNoImg}/${this.detailCurrent.gridCode}/img_result/`
|
|
const commonImgs = [
|
|
`${baseUrl}result_LSD_compressed.jpg`,
|
|
`${baseUrl}result_cut_1_compressed.jpg`,
|
|
`${baseUrl}result_cut_2_compressed.jpg`
|
|
]
|
|
this.$refs.carousel.setActiveItem(0)
|
|
if (res) {
|
|
this.bookImgData = commonImgs
|
|
} else {
|
|
this.bookImgData = [...commonImgs, `${baseUrl}result_cut_3_compressed.jpg`]
|
|
}
|
|
})
|
|
.catch(error => {
|
|
console.error(error)
|
|
})
|
|
},
|
|
handleDownloadImg() {
|
|
this.downImgLoading = true
|
|
const idsArray = []
|
|
for (const url of this.bookImgData) {
|
|
const startIndex = url.indexOf('imgId=') + 'imgId='.length
|
|
const endIndex = url.length
|
|
idsArray.push(url.slice(startIndex, endIndex))
|
|
}
|
|
// 下载桶图片
|
|
const params = {
|
|
'imgIds': idsArray
|
|
}
|
|
const url = this.baseApi + '/api/fileRelevant/uploadImgs' + '?' + new URLSearchParams(params).toString()
|
|
getBlob(url, (blob) => {
|
|
const fileName = this.billNoImg + '-' + parseTime(new Date()) + '.zip'
|
|
saveAs(blob, fileName)
|
|
this.downImgLoading = false
|
|
})
|
|
},
|
|
handleCloseDialog() {
|
|
this.detailVisible = false
|
|
},
|
|
handleCloseImgDialog() {
|
|
this.detailImgVisible = false
|
|
this.activeIndex = 0
|
|
},
|
|
handleToGrids(data) {
|
|
this.$router.push({ path: '/dataScreening/gird' })
|
|
localStorage.setItem('dataScreenShelf', JSON.stringify(data))
|
|
},
|
|
showPopover(layerIndex, bookIndex, event) {
|
|
this.popoverIndex = { layer: layerIndex, book: bookIndex }
|
|
const bookElement = event.target // 获取书籍项元素
|
|
const rect = bookElement.getBoundingClientRect() // 获取边界
|
|
if (layerIndex === 0) {
|
|
this.popoverPosition = {
|
|
x: window.scrollX + rect.left + rect.width / 2 - 40,
|
|
y: window.scrollY + rect.top + rect.height
|
|
}
|
|
} else {
|
|
this.popoverPosition = {
|
|
x: window.scrollX + rect.left + rect.width / 2 - 40,
|
|
y: window.scrollY + rect.top + rect.height - 170
|
|
}
|
|
}
|
|
},
|
|
hidePopover() {
|
|
this.popoverIndex = null
|
|
// 隐藏所有的popover
|
|
// this.popoverVisible.forEach((isVisible, index) => {
|
|
// if (isVisible) {
|
|
// this.$set(this.popoverVisible, index, false)
|
|
// }
|
|
// })
|
|
},
|
|
changeDialogTab(index) {
|
|
this.tabdialogIndex = index
|
|
},
|
|
updateParts(gridName) {
|
|
const parts = gridName.match(/(\d+)区(\d+)排([A-Za-z])面(\d+)架(\d+)层/)
|
|
if (parts) {
|
|
this.getGridShelf = parts[4]
|
|
this.getGridFloor = parts[5]
|
|
const toward = parts[3]
|
|
if (toward === 'A') {
|
|
this.getGridToward = 1
|
|
} else if (toward === 'B') {
|
|
this.getGridToward = 2
|
|
}
|
|
}
|
|
},
|
|
changeShelfGetGrid(val) {
|
|
this.updateParts(this.gridName)
|
|
this.shelfAllGridDataLoading = true
|
|
const params = {
|
|
'gridShelf': '0' + val,
|
|
'shelfId': this.bookShelfDetails.id,
|
|
'toward': this.getGridToward,
|
|
'floorType': this.bookShelfDetails.floorType
|
|
}
|
|
FetchShelfGridByShelfIdAndGridShelf(params).then(res => {
|
|
this.shelfAllGridData = []
|
|
this.shelfAllGridData = res
|
|
this.getInitStockInfo(this.shelfAllGridData)
|
|
|
|
this.getInitBookDetailsByGrids(this.shelfAllGridData)
|
|
|
|
this.shelfAllGridDataLoading = false
|
|
}).catch(() => {
|
|
})
|
|
},
|
|
handleHistory(item, index) {
|
|
this.shelfAllGridDataLoading = true
|
|
this.timeIndex = index
|
|
|
|
this.billNoImg = this.checkDateLine[this.timeIndex].stockType === 0 ? this.checkDateLine[1].stockBill : this.checkDateLine[this.timeIndex].stockBill
|
|
if (item.stockType === 0) {
|
|
this.initData()
|
|
setTimeout(() => {
|
|
this.shelfAllGridDataLoading = false
|
|
}, 500)
|
|
} else {
|
|
const params = {
|
|
'gridShelf': '0' + this.layerVal,
|
|
'ShelfId': this.bookShelfDetails.id,
|
|
'toward': this.bookShelfDetails.toward,
|
|
'billId': item.stockBill
|
|
}
|
|
FetchShowByBillIdAndShelfIdAndGridShelf(params).then(res => {
|
|
this.shelfAllGridData.forEach((item) => {
|
|
console.log(item.id)
|
|
const gridId = item.id
|
|
if (res.hasOwnProperty(gridId)) {
|
|
this.$set(item, 'books', res.gridShelfList[gridId])
|
|
}
|
|
})
|
|
|
|
const sortedKeys = Object.keys(res.gridShelfList).sort()
|
|
const sortedShelfDetails = []
|
|
sortedKeys.forEach(key => {
|
|
res.shelfDetails.forEach(shelfDetail => {
|
|
if (shelfDetail.gridId === key) {
|
|
sortedShelfDetails.push(shelfDetail)
|
|
}
|
|
})
|
|
})
|
|
this.baseStockData = sortedShelfDetails
|
|
|
|
setTimeout(() => {
|
|
this.shelfAllGridDataLoading = false
|
|
}, 500)
|
|
}).catch(() => {
|
|
})
|
|
}
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style lang="scss" scoped>
|
|
.venue-content{
|
|
position: relative;
|
|
padding: 20px;
|
|
background-color: #fff;
|
|
}
|
|
.tab-content{
|
|
width: 100%;
|
|
min-height: calc(100vh - 232px) !important;
|
|
.tab-nav{
|
|
flex: 1;
|
|
}
|
|
}
|
|
.gird-data-header{
|
|
display: flex;
|
|
justify-content: space-between;
|
|
}
|
|
|
|
.tag-info{
|
|
display: flex;
|
|
justify-content: flex-start;
|
|
align-items: center;
|
|
padding: 0 20px;
|
|
p{
|
|
margin-left: 20px;
|
|
font-size: 14px;
|
|
font-weight: bold;
|
|
}
|
|
}
|
|
|
|
.time-update-cont{
|
|
position: relative;
|
|
display: flex;
|
|
justify-content: flex-start;
|
|
align-items: center;
|
|
padding: 0 20px;
|
|
span.time-left-txt{
|
|
font-size: 14px;
|
|
}
|
|
.el-button{
|
|
width: 134px;
|
|
padding:5px;
|
|
border: none;
|
|
text-align: left;
|
|
}
|
|
.time-update-line{
|
|
display: none;
|
|
position: absolute;
|
|
top: 33px;
|
|
right: 20px;
|
|
z-index: 9999;
|
|
width: 250px;
|
|
max-height: 645px;
|
|
padding: 20px 30px;
|
|
background-color: #fff;
|
|
border: 1px solid #e8f2ff;
|
|
border-radius: 10px;
|
|
-webkit-box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .5);
|
|
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .5);
|
|
overflow: hidden;
|
|
overflow-y: scroll;
|
|
}
|
|
}
|
|
|
|
.time-update-cont:hover .time-update-line {
|
|
display: block;
|
|
}
|
|
|
|
.gird-data-book{
|
|
position: relative;
|
|
height: 650px;
|
|
margin-top: 4px;
|
|
overflow: hidden;
|
|
overflow-y: scroll;
|
|
}
|
|
|
|
.gird-layer{
|
|
position: relative;
|
|
display: flex;
|
|
justify-content: space-between;
|
|
.gird-left-line{
|
|
position: absolute;
|
|
left: 0;
|
|
top: 0;
|
|
display: block;
|
|
width: 6px;
|
|
height: 130px;
|
|
background: url('~@/assets/images/shelf01.png') no-repeat left top;
|
|
background-size: 100% 100%;
|
|
z-index: 999;
|
|
}
|
|
.gird-right-line{
|
|
position: absolute;
|
|
right: calc(298px);
|
|
top: 0;
|
|
display: block;
|
|
width: 6px;
|
|
height: 130px;
|
|
background: url('~@/assets/images/shelf01.png') no-repeat left top;
|
|
background-size: 100% 100%;
|
|
z-index: 999;
|
|
}
|
|
.layer-left{
|
|
width: calc(100% - 240px);
|
|
height: 130px;
|
|
margin-right: 5px;
|
|
padding: 0 16px 0 20px;
|
|
background: url('~@/assets/images/shelf02.png') repeat left top;
|
|
background-size: 10% 100%;
|
|
overflow: hidden;
|
|
overflow-x: scroll;
|
|
}
|
|
.layer-left-book{
|
|
// width: calc(100vw - 655px);
|
|
height: 130px;
|
|
white-space: nowrap;
|
|
.book-item{
|
|
position: relative;
|
|
display: inline-block;
|
|
width: 42px;
|
|
height: 120px;
|
|
margin-top: 18px;
|
|
background: url('~@/assets/images/shelf03.png') no-repeat left top;
|
|
background-size: 100% 100%;
|
|
margin-left: -15px;
|
|
cursor: pointer;
|
|
span.book-name{
|
|
position: absolute;
|
|
left: 15px;
|
|
top: 16px;
|
|
display: block;
|
|
height: 90px;
|
|
font-size: 12px;
|
|
writing-mode:vertical-rl;
|
|
overflow: hidden;
|
|
white-space: nowrap;
|
|
text-overflow: ellipsis;
|
|
}
|
|
&.red-active{
|
|
background: url('~@/assets/images/shelf05.png') no-repeat left top;
|
|
background-size: 100% 100%;
|
|
}
|
|
&.blue-active{
|
|
background: url('~@/assets/images/shelf06.png') no-repeat left top;
|
|
background-size: 100% 100%;
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
.layer-right-handle{
|
|
width: 300px;
|
|
padding: 0 10px;
|
|
background-color: #E8F2FF;
|
|
margin: 3px 5px;
|
|
border-radius: 6px;
|
|
}
|
|
.layer-info-header{
|
|
display: flex;
|
|
justify-content: space-between;
|
|
align-items: center;
|
|
line-height: 30px;
|
|
h4{
|
|
color: #0c0e1e;
|
|
}
|
|
span{
|
|
font-size: 12px;
|
|
}
|
|
}
|
|
.layer-right-content{
|
|
display: flex;
|
|
justify-content: space-between;
|
|
}
|
|
.layer-tag-info{
|
|
div.tag-item {
|
|
display: flex;
|
|
justify-content: flex-start;
|
|
line-height: 26px;
|
|
font-size: 14px;
|
|
}
|
|
}
|
|
.layer-handle{
|
|
display: flex;
|
|
flex-direction: column;
|
|
.el-button{
|
|
margin-left: 0 !important;
|
|
margin-bottom: 10px
|
|
}
|
|
}
|
|
|
|
.dialog-grid-detail{
|
|
::v-deep .el-dialog{
|
|
width: 1200px !important;
|
|
.el-dialog__body{
|
|
padding: 0 !important;
|
|
}
|
|
|
|
.tab-nav{
|
|
margin: 14px 0 10px 0 !important;
|
|
}
|
|
}
|
|
.detail-tab{
|
|
position: relative;
|
|
}
|
|
.check-view-img{
|
|
position: absolute;
|
|
right: 0;
|
|
top: -10px;
|
|
}
|
|
}
|
|
|
|
.gird-img-detail{
|
|
::v-deep .el-dialog{
|
|
width: 1200px !important;
|
|
padding: 0 !important;
|
|
background: none;
|
|
box-shadow: none;
|
|
.el-dialog__header{
|
|
display: none;
|
|
}
|
|
.el-dialog__body{
|
|
padding: 0 !important;
|
|
}
|
|
}
|
|
::v-deep .el-carousel__container{
|
|
height: 600px !important;
|
|
.el-carousel__item{
|
|
display: flex;
|
|
align-items: center;
|
|
}
|
|
.el-carousel__item img{
|
|
display: block;
|
|
max-width: 100%;
|
|
max-height: 100%;
|
|
margin: 0 auto;
|
|
}
|
|
.el-carousel__arrow{
|
|
background-color: rgba(3,72,243,1);
|
|
i.el-icon-arrow-left,
|
|
i.el-icon-arrow-right{
|
|
color: #fff;
|
|
}
|
|
.el-icon-arrow-right:before{
|
|
color: #fff;
|
|
}
|
|
}
|
|
|
|
}
|
|
::v-deep .el-carousel__button{
|
|
height: 6px !important;
|
|
}
|
|
::v-deep .el-carousel__indicators--outside button{
|
|
background-color: rgba(3,72,243,1);
|
|
|
|
}
|
|
.gird-img-button{
|
|
position: fixed;
|
|
right: -200px;
|
|
top: -60px;
|
|
display: flex;
|
|
justify-content: flex-start;
|
|
align-items: center;
|
|
z-index: 9999999;
|
|
.el-button{
|
|
background-color: #e8f2ff;
|
|
}
|
|
}
|
|
}
|
|
.venue-content {
|
|
.tab-content .tab-nav {
|
|
li{
|
|
cursor: default;
|
|
}
|
|
}
|
|
}
|
|
.popover-external-set{
|
|
ul li p{
|
|
width: 50px;
|
|
font-weight: bold;
|
|
text-align: right;
|
|
}
|
|
ul li span,
|
|
ul li em{
|
|
width: 140px;
|
|
display: block;
|
|
text-align: right;
|
|
font-style: normal;
|
|
}
|
|
}
|
|
</style>
|