Browse Source

数据总览/样式修改

master
xuhuajiao 8 months ago
parent
commit
a3ceea6080
  1. 12
      src/api/stockTask/index.js
  2. 158
      src/assets/styles/manage.scss
  3. 5
      src/assets/styles/mixin.scss
  4. 1
      src/assets/styles/yxk-admin.scss
  5. 1
      src/views/components/bookSwiper.vue
  6. 5
      src/views/components/canvasPreview.vue
  7. 1
      src/views/visualCheck/checkManage/bookshelfSearch/index.vue
  8. 150
      src/views/visualCheck/checkManage/dataScreening/girdList.vue
  9. 188
      src/views/visualCheck/checkManage/dataScreening/index.vue
  10. 158
      src/views/visualCheck/checkManage/dataScreening/module/form.vue
  11. 148
      src/views/visualCheck/checkManage/dataScreening/regionsList.vue
  12. 123
      src/views/visualCheck/checkManage/dataScreening/shelfList.vue
  13. 62
      src/views/visualCheck/checkManage/statistic/reverseShelf/index.vue
  14. 109
      src/views/visualCheck/checkManage/statistic/search.vue
  15. 61
      src/views/visualCheck/checkManage/statistic/seqShelf/index.vue
  16. 17
      src/views/visualCheck/venueDevice/bookshelf/index.vue
  17. 5
      src/views/visualCheck/venueDevice/bookshelfPosition/index.vue
  18. 10
      src/views/visualCheck/venueDevice/device/index.vue

12
src/api/stockTask/index.js

@ -1,5 +1,5 @@
import request from '@/utils/request'
// import qs from 'qs'
import qs from 'qs'
export function add(data) {
return request({
@ -34,4 +34,12 @@ export function FetchUpdateStockTaskStatus(data) {
})
}
export default { add, edit, del, FetchUpdateStockTaskStatus }
// 统计分析-建议倒架
export function FetchInitSuggestTilting(params) {
return request({
url: 'api/stocktask-task/initSuggestTilting' + '?' + qs.stringify(params, { indices: false }),
method: 'get'
})
}
export default { add, edit, del, FetchUpdateStockTaskStatus, FetchInitSuggestTilting }

158
src/assets/styles/manage.scss

@ -10,7 +10,6 @@
background-color: #fff;
border-bottom: 1px solid #EDEFF3;
h4{
font-size: 18px;
flex: 1;
i{
font-size: 22px;
@ -19,6 +18,8 @@
}
}
p{
font-size: 14px;
color: #9098a4;
i{
font-size: 18px;
}
@ -35,9 +36,12 @@
flex: none;
}
.bookshelf-area{
position: relative;
display: flex;
justify-content: flex-start;
align-items: center;
flex: 1;
font-size: 14px;
padding: 4px 30px;
a{
display: block;
@ -46,6 +50,15 @@
display: block;
padding: 0 6px;
}
.double-click-btn{
position: inherit;
margin-left: 20px;
font-weight: normal;
border: 1px solid #545b65;
border-radius: 13px;
line-height: 18px;
background-color: #e2e9f3;
}
}
}
@ -248,27 +261,27 @@
border: 1px solid #EDEFF3;
.layer-status{
display: flex;
justify-content: space-between;
justify-content: flex-start;
.row-state{
margin: 0 5px;
padding: 0;
width: 50%;
height: 34px;
line-height: 34px;
font-size: 14px;
margin-right: 10px;
padding: 0 5px;
// width: 50%;
height: 20px;
line-height: 20px;
font-size: 12px;
}
}
.layer-name{
font-size: 20px;
font-weight: bold;
text-align: center;
// text-align: center;
color: #0C0E1E;
padding: 40px 0;
padding: 20px 0;
}
.layer-code-sort{
display: flex;
justify-content: space-between;
align-items: stretch;
// display: flex;
// justify-content: space-between;
// align-items: stretch;
ul {
flex: 1;
li {
@ -289,8 +302,11 @@
}
}
.edit-callNumber{
width: 90px;
font-size: 24px;
// width: 90px;
font-size: 14px;
height: 30px;
line-height: 30px;
padding: 0 5px !important;
i{
display: block;
font-style: normal;
@ -411,3 +427,115 @@
color: #0C0E1E;
}
}
.check-btn{
color: #fff !important;
background-color: #0348f3;
}
.el-button.check-btn:hover,
.el-button.check-btn:focus,
.el-button--info.check-btn.is-plain:hover,
.el-button--info.check-btn.is-plain:focus{
color: #fff !important;
background-color: #0348f3 !important;
}
.dataScreening-content.venue-content{
position: relative;
overflow: hidden;
background-color: #fff;
.crud-opts{
position: absolute;
right: 20px;
top: 10px;
}
.venue-left{
flex: 1;
margin-right: 0 !important;
height: calc(100vh - 192px);
overflow: hidden;
.venue-preview{
height: 633px !important;
}
}
.venue-right{
display: flex;
flex-direction: column;
width: 300px;
height: calc(100vh - 192px);
padding: 50px 0 20px 0 !important;
margin: 0 20px 0 0 !important;
.lib-right-item{
position: relative;
// padding: 10px;
// height: calc(100% / 3);
padding-bottom: 10px;
margin-bottom: 10px;
border: 1px solid #E8F2FF;
border-radius: 4px;
h4{
padding: 6px 10px;
background-color: #E8F2FF;
color: #000;
line-height: 30px;
border-bottom: 1px solid #edeff3;
}
.refresh-date{
position: absolute;
right: 14px;
top: 10px;
font-size: 12px;
line-height: 30px;
}
}
}
.data-right-list {
padding-top: 10px;
li{
display: flex;
justify-content: flex-start;
align-items: center;
line-height: 36px;
font-size: 14px;
p{
width: 80px;
font-weight: bold;
text-align: right;
}
span{
width: 140px;
display: block;
text-align: right;
i{
font-style: normal;
font-weight: bold;
padding: 0 10px;
color: #0348f3;
}
&.percentage{
width: auto;
}
}
}
}
.total-data{
display: flex;
justify-content: flex-start;
align-items: center;
position: absolute;
right: 12px;
top: 60px;
font-size: 14px;
padding: 4px 6px;
color: #fff;
background-color: rgba(3,72,243,.9);
border-radius: 4px;
z-index: 999;
p{
margin-left: 10px;
}
}
}

5
src/assets/styles/mixin.scss

@ -1092,6 +1092,11 @@
background-color: #FFF3E5;
border: 1px solid #FEBD98
}
&.other-state{
color: #8B43F0;
background-color: #e2d4f5;
border: 1px solid #CAA4FF;
}
&.no-state{
color: #a6adb6;
background-color: #f3f5f9;

1
src/assets/styles/yxk-admin.scss

@ -650,6 +650,7 @@
.el-input-number__increase,
.el-input-number__decrease{
background-color: transparent !important;
width: 20px !important;
&.is-disabled{
background-color: #E3E7EE !important;
}

1
src/views/components/bookSwiper.vue

@ -121,6 +121,7 @@ export default {
<style lang="scss" scoped>
.swiper-title{
font-size: 14px;
::v-deep .swiper-wrapper{
margin: 10px 0;
border-bottom: 1px solid #EDEFF3;

5
src/views/components/canvasPreview.vue

@ -224,7 +224,8 @@ export default {
</ul>`
}
var rectLeft = e.target.left + e.target.width - 100
// var rectLeft = e.target.left + e.target.width - 100
var rectLeft = e.target.left + e.target.width
var rectTop = e.target.top + e.target.height - 40
document.getElementById('tooltip').style.left = rectLeft + 'px'
document.getElementById('tooltip').style.top = rectTop + 'px'
@ -245,7 +246,7 @@ export default {
const centerPoint = new fabric.Point(centerX, centerY)
//
self.canvasPreview.zoomToPoint(centerPoint, 0.8)
self.canvasPreview.zoomToPoint(centerPoint, 1)
self.canvasPreview.renderAll()
setTimeout(() => {

1
src/views/visualCheck/checkManage/bookshelfSearch/index.vue

@ -399,7 +399,6 @@ export default {
}
FetchInitLibraryRegionList(params).then(res => {
this.regionOptions = res.content
console.log('this.regionOptions', this.regionOptions)
if (this.regionOptions.length > 0) {
this.selectRegionVal = this.regionOptions[0]
this.crud.query.regionId = this.selectRegionVal.id

150
src/views/visualCheck/checkManage/dataScreening/girdList.vue

@ -7,14 +7,15 @@
<router-link :to="{ path: '/check/check/dataScreening', query: {floorTabIndex: floorTabIndex }}">
{{ floorName }}
</router-link>
<span>-</span>
<span>/</span>
<router-link :to="{ path: '/dataScreening/regions', query: {regionTabIndex: regionTabIndex }}">
{{ regionName }}
</router-link>
<span>-</span>
<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>
@ -35,10 +36,10 @@
</div>
<crudOperation :permission="permission">
<template v-slot:middle>
<el-select v-model="layerVal" clearable size="small" placeholder="架位" class="filter-item" style="width: 100px; margin-right: 20px;">
<el-select v-model="layerVal" clearable size="small" placeholder="架位" class="filter-item" style="width: 100px; margin-right: 10px;">
<el-option v-for="item in rackOptions" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
<el-button v-permission="permission.add" size="mini" @click="crud.toAdd">
<el-button v-permission="permission.add" class="check-btn" size="mini" @click="toAdd(5)">
<i class="iconfont icon-shengchengpandiandan" />
架位盘点
</el-button>
@ -53,7 +54,7 @@
</div>
<div class="gird-data-book">
<div v-for="(item,index) in layerNum" :key="index" class="gird-layer">
<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">
@ -65,13 +66,13 @@
@mouseenter="showPopover(index, i, $event)"
@mouseleave="hidePopover"
>
<span class="book-name">{{ i+1 }}水浒传水浒传水浒传水浒传</span>
<span class="book-name">水浒传水浒传水浒传水浒传</span>
</div>
</div>
</div>
<div class="layer-right-handle">
<div class="layer-info-header">
<h4>001排A面01架1层</h4>
<h4>{{ item.gridName }}</h4>
<span>2024-11-28 09:46</span>
</div>
<div class="layer-right-content">
@ -81,11 +82,11 @@
<div class="tag-item tag-all">在架<i class="iconfont icon-zhuangtai2" /><p>20</p></div>
</div>
<div class="layer-handle">
<el-button size="mini" @click="handleDetail">
<el-button size="mini" @click="handleDetail(item)">
<i class="iconfont icon-xiaowenjian" />
详情
</el-button>
<el-button size="mini">
<el-button size="mini" class="check-btn" @click="toAdd(6,item)">
<i class="iconfont icon-shengchengpandiandan" />
盘点
</el-button>
@ -116,37 +117,6 @@
</div>
</div>
<!-- form -->
<el-dialog append-to-body :close-on-click-modal="false" :modal-append-to-body="false" :before-close="crud.cancelCU" :visible="crud.status.cu > 0" :title="crud.status.title">
<span class="dialog-right-top" />
<span class="dialog-left-bottom" />
<div class="setting-dialog">
<el-form ref="form" :inline="true" :model="form" :rules="rules" size="small" label-width="80px">
<el-form-item label="盘点单号" prop="taskName">
<el-input v-model="form.taskName" />
</el-form-item>
<el-form-item label="盘点类型" prop="taskType">
<el-input v-model="form.taskType" />
</el-form-item>
<el-form-item label="目标位置" prop="location">
<el-input v-model="form.location" />
</el-form-item>
<el-form-item label="目标数量" prop="number">
<el-input v-model="form.number" />
</el-form-item>
<el-row>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" style="width: 572px;" :rows="4" />
</el-form-item>
</el-row>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="text" @click="crud.cancelCU">取消</el-button>
<el-button :loading="crud.status.cu === 2" type="primary" @click="crud.submitCU">保存</el-button>
</div>
</div>
</el-dialog>
<!-- 详情 -->
<el-dialog class="dialog-grid-detail" append-to-body :close-on-click-modal="false" :visible.sync="detailVisible" title="001排A面01架1层 - 详情" @close="handleCloseDialog">
<span class="dialog-right-top" />
@ -212,21 +182,21 @@
</el-carousel>
</div>
</el-dialog>
<eForm ref="eform" />
</div>
</template>
<script>
import { FetchBookShelfDetails } from '@/api/shelf/index'
import crudRegion from '@/api/area/index'
import CRUD, { presenter, header, form, crud } from '@crud/crud'
import CRUD, { presenter, header, crud } from '@crud/crud'
import crudOperation from '@crud/CRUD.operation'
import { mapGetters } from 'vuex'
import eForm from './module/form'
const defaultForm = { id: null, taskType: null, taskName: null, location: null, number: null, remark: null }
export default {
name: 'DataScreening',
components: { crudOperation },
components: { crudOperation, eForm },
cruds() {
return CRUD({ title: '架位盘点', url: 'api/libraryRegion/initLibraryRegionList', crudMethod: { ...crudRegion }, sort: [], optShow: {
add: false,
@ -239,7 +209,7 @@ export default {
queryOnPresenterCreated: false
})
},
mixins: [presenter(), header(), form(defaultForm), crud()],
mixins: [presenter(), header(), crud()],
data() {
return {
detailVisible: false,
@ -253,12 +223,14 @@ export default {
floorName: null,
regionName: null,
gridRow: null,
gridShelf: null,
bookShelfDetails: null,
booShelfGrid: null,
shelfAllGridData: [],
layerNum: 0,
rackNum: 0,
bookNum: 55,
layerVal: '01架',
layerVal: null,
rackOptions: [],
tabListData: [],
permission: {
@ -266,20 +238,6 @@ export default {
edit: ['admin', 'floor:edit'],
del: ['admin', 'floor:del']
},
rules: {
taskName: [
{ required: true, message: '请输入盘点单号', trigger: 'blur' }
],
taskType: [
{ required: true, message: '请输入盘点类型', trigger: 'blur' }
],
location: [
{ required: true, message: '请输入目标位置', trigger: 'blur' }
],
number: [
{ required: true, message: '请输入目标数量', trigger: 'blur' }
]
},
popoverIndex: null,
popoverVisible: [],
popoverStyles: [],
@ -323,6 +281,11 @@ export default {
this.floorName = dataScreenShelf.floorName
this.regionName = dataScreenShelf.regionName
this.gridRow = dataScreenShelf.gridRow
this.gridShelf = dataScreenShelf.gridShelf
if (localStorage.getItem('dataScreenShelfAllGrid')) {
this.shelfAllGridData = JSON.parse(localStorage.getItem('dataScreenShelfAllGrid'))
}
// /
this.tabListData = dataScreenShelf.rowType === 1
@ -339,8 +302,9 @@ export default {
this.rackOptions = []
for (let i = 1; i <= this.rackNum; i++) {
this.rackOptions.push({ id: i, name: `${i}` })
this.rackOptions.push({ id: i, name: `0${i}` })
}
this.layerVal = parseInt(this.gridShelf) || ''
}).catch(() => {
})
}
@ -354,6 +318,21 @@ export default {
[CRUD.HOOK.afterValidateCU](crud) {
return true
},
toAdd(type, item) {
this.$refs.eform.formVisible = true
if (type === 5) {
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 {
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
}
this.$refs.eform.setData(type)
},
removeAreaPrefix(gridNames) {
const index = gridNames.indexOf('区')
if (index !== -1) {
@ -472,7 +451,6 @@ export default {
this.getInitShelfGridByShelfId(index + 1)
},
handleCellCurrent(item, index) {
console.log('index', index)
this.cellIndex = index
this.cellInfo = {
id: item.id,
@ -485,7 +463,8 @@ export default {
}
this.handleToGrids(this.cellInfo)
},
handleDetail() {
handleDetail(item) {
console.log('item', item)
this.detailVisible = true
},
handleViewImg() {
@ -502,16 +481,21 @@ export default {
localStorage.setItem('dataScreenShelf', JSON.stringify(data))
},
showPopover(layerIndex, bookIndex, event) {
console.log('layerIndex', layerIndex)
this.popoverIndex = { layer: layerIndex, book: bookIndex }
const bookElement = event.target //
const rect = bookElement.getBoundingClientRect() //
this.currentBookName = `水浒传${bookIndex + 1}` //
this.popoverPosition = {
// Popover使
x: window.scrollX + rect.left + rect.width / 2,
y: window.scrollY + rect.top + rect.height
if (layerIndex === 0) {
this.popoverPosition = {
x: window.scrollX + rect.left + rect.width / 2,
y: window.scrollY + rect.top + rect.height
}
} else {
this.popoverPosition = {
x: window.scrollX + rect.left + rect.width / 2,
y: window.scrollY + rect.top + rect.height - 170
}
}
console.log('this.popoverPosition ', this.popoverPosition)
},
hidePopover() {
this.popoverIndex = null
@ -537,7 +521,7 @@ export default {
}
.tab-content{
width: 100%;
min-height: calc(100vh - 232px) !important;
min-height: calc(100vh - 234px) !important;
.tab-nav{
flex: 1;
}
@ -546,6 +530,7 @@ export default {
display: flex;
justify-content: space-between;
}
.tag-info{
display: flex;
justify-content: flex-start;
@ -558,28 +543,10 @@ export default {
}
}
// .tag-sort{
// i{
// color: #0348F3;
// }
// }
// .tag-place{
// i{
// color: #ED4A41;
// }
// }
// .tag-in{
// i{
// color: #2ECAAC;
// }
// }
.gird-data-book{
position: relative;
height: 649px;
margin-top: 6px;
height: 650px;
margin-top: 4px;
overflow: hidden;
overflow-y: scroll;
}
@ -636,10 +603,11 @@ export default {
cursor: pointer;
span.book-name{
position: absolute;
left: 13px;
left: 15px;
top: 16px;
display: block;
height: 90px;
font-size: 12px;
writing-mode:vertical-rl;
overflow: hidden;
white-space: nowrap;

188
src/views/visualCheck/checkManage/dataScreening/index.vue

@ -4,10 +4,10 @@
<h4><i class="iconfont icon-shuju" />数据总览</h4>
<p><i class="iconfont icon-gongsi" />{{ user.fonds.fondsName }}</p>
</div>
<div class="venue-content">
<div class="venue-content dataScreening-content">
<crudOperation :permission="permission">
<template v-slot:middle>
<el-button v-permission="permission.add" size="mini" @click="crud.toAdd">
<el-button v-permission="permission.add" class="check-btn" size="mini" @click="toAdd(1)">
<i class="iconfont icon-shengchengpandiandan" />
全量盘点
</el-button>
@ -65,26 +65,26 @@
</div>
<!-- form -->
<el-dialog append-to-body :close-on-click-modal="false" :modal-append-to-body="false" :before-close="crud.cancelCU" :visible="crud.status.cu > 0" :title="crud.status.title">
<!-- <el-dialog append-to-body :close-on-click-modal="false" :modal-append-to-body="false" :before-close="crud.cancelCU" :visible="crud.status.cu > 0" :title="crud.status.title">
<span class="dialog-right-top" />
<span class="dialog-left-bottom" />
<div class="setting-dialog">
<el-form ref="form" :inline="true" :model="form" :rules="rules" size="small" label-width="80px">
<el-form-item label="盘点单号" prop="taskName">
<el-input v-model="form.taskName" />
<el-form-item label="盘点单号" prop="stockBill">
<el-input v-model="form.stockBill" disabled />
</el-form-item>
<el-form-item label="盘点类型" prop="taskType">
<el-input v-model="form.taskType" />
<el-form-item label="盘点类型" prop="stockTypeName">
<el-input v-model="form.stockTypeName" disabled />
</el-form-item>
<el-form-item label="目标位置" prop="location">
<el-input v-model="form.location" />
<el-form-item label="目标位置" prop="stockRegion">
<el-input v-model="form.stockRegion" disabled />
</el-form-item>
<el-form-item label="目标数量" prop="number">
<el-input v-model="form.number" />
<el-form-item label="目标数量" prop="stockGridNumName">
<el-input v-model="form.stockGridNumName" disabled />
</el-form-item>
<el-row>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" style="width: 572px;" :rows="4" />
<el-form-item label="备注" prop="stockRemarks">
<el-input v-model="form.stockRemarks" type="textarea" style="width: 572px;" :rows="4" />
</el-form-item>
</el-row>
</el-form>
@ -93,26 +93,29 @@
<el-button :loading="crud.status.cu === 2" type="primary" @click="crud.submitCU">保存</el-button>
</div>
</div>
</el-dialog>
</el-dialog> -->
<!-- @refresh="initData" -->
<eForm ref="eform" />
</div>
</template>
<script>
import { FetchInitLibraryRegionList } from '@/api/area/index'
import crudFloor from '@/api/floor/index'
import CRUD, { presenter, header, form, crud } from '@crud/crud'
import crudStockTaskLog from '@/api/stockTaskLog/index'
// import crudFloor from '@/api/floor/index'
import CRUD, { presenter, header, crud } from '@crud/crud'
import crudOperation from '@crud/CRUD.operation'
import { mapGetters } from 'vuex'
import defaultImg from '@/assets/images/system/default-img.jpg'
import bookSwiper from '@/views/components/bookSwiper.vue'
import CanvasPreview from '@/views/components/canvasPreview.vue'
import eForm from './module/form'
const defaultForm = { id: null, taskType: null, taskName: null, location: null, number: null, remark: null }
export default {
name: 'DataScreening',
components: { crudOperation, bookSwiper, CanvasPreview },
components: { crudOperation, bookSwiper, CanvasPreview, eForm },
cruds() {
return CRUD({ title: '数据总览', url: 'api/libraryFloor/initLibraryFloorList', crudMethod: { ...crudFloor }, sort: [], optShow: {
return CRUD({ title: '数据总览', url: 'api/libraryFloor/initLibraryFloorList', crudMethod: { ...crudStockTaskLog }, sort: [], optShow: {
add: false,
edit: false,
del: false,
@ -121,7 +124,7 @@ export default {
reset: false
}})
},
mixins: [presenter(), header(), form(defaultForm), crud()],
mixins: [presenter(), header(), crud()],
data() {
const _this = this
return {
@ -154,20 +157,6 @@ export default {
add: ['admin', 'floor:add'],
edit: ['admin', 'floor:edit'],
del: ['admin', 'floor:del']
},
rules: {
taskName: [
{ required: true, message: '请输入盘点单号', trigger: 'blur' }
],
taskType: [
{ required: true, message: '请输入盘点类型', trigger: 'blur' }
],
location: [
{ required: true, message: '请输入目标位置', trigger: 'blur' }
],
number: [
{ required: true, message: '请输入目标数量', trigger: 'blur' }
]
}
}
},
@ -194,9 +183,34 @@ export default {
this.changeActiveTab(this.tabIndex)
},
//
[CRUD.HOOK.afterValidateCU](crud) {
return true
// //
// [CRUD.HOOK.beforeToAdd]() {
// if (this.crud.form.stockType === 1) {
// this.crud.form.stockTypeName = ''
// }
// Promise.all([
// crudStockTaskLog.FetchNewBillNo(),
// crudStockTaskLog.FetchStockGirdNum()
// ]).then(([newBillNoRes, stockGridNumRes]) => {
// this.crud.form.stockBill = newBillNoRes
// this.crud.form.stockGridNumName = stockGridNumRes + ' / '
// this.crud.form.stockGridNum = stockGridNumRes
// }).catch(error => {
// console.error(error)
// })
// },
// //
// [CRUD.HOOK.afterValidateCU](crud) {
// console.log(crud.form)
// delete crud.form.stockGridNumName
// delete crud.form.stockTypeName
// return true
// },
toAdd(type) {
this.$refs.eform.formVisible = true
this.$refs.eform.setData(type)
this.$refs.eform.form.stockRegion = '全部区域'
},
changeActiveTab(index) {
this.prewLoading = true
@ -210,7 +224,6 @@ export default {
'floorId': this.floorOptions[index].id
}
FetchInitLibraryRegionList(params).then(res => {
console.log(res)
this.allCoverData = res.content
if (this.floorOptions[index].floorMap) {
this.imageUrl = this.baseApi + '/api/fileRelevant/getImg?imgId=' + this.floorOptions[index].floorMap
@ -220,7 +233,6 @@ export default {
if (this.allCoverData.length !== 0) {
this.currentMarkData = this.allCoverData[0]
console.log('this.currentMarkData', this.currentMarkData)
const parsedSignPoints = this.allCoverData.map(item => {
const signPoint = JSON.parse(item.signPoint)
return {
@ -263,103 +275,5 @@ export default {
</script>
<style lang="scss" scoped>
.container-right{
// height: calc(100% - 20px) !important;
// overflow: hidden;
}
.venue-content{
position: relative;
overflow: hidden;
background-color: #fff;
}
.crud-opts{
position: absolute;
right: 20px;
top: 10px;
}
.venue-left{
flex: 1;
margin-right: 0 !important;
height: calc(100vh - 192px);
overflow: hidden;
.venue-preview{
height: 633px !important;
}
}
.venue-right{
display: flex;
flex-direction: column;
width: 400px;
height: calc(100vh - 192px);
padding: 50px 10px 20px 10px !important;
.lib-right-item{
position: relative;
// padding: 10px;
// height: calc(100% / 3);
padding-bottom: 10px;
margin-bottom: 10px;
border: 1px solid #E8F2FF;
border-radius: 4px;
h4{
padding: 6px 10px;
background-color: #E8F2FF;
color: #000;
line-height: 30px;
border-bottom: 1px solid #edeff3;
}
.refresh-date{
position: absolute;
right: 14px;
top: 10px;
font-size: 12px;
line-height: 30px;
}
}
}
.data-right-list {
padding-top: 10px;
li{
display: flex;
justify-content: flex-start;
align-items: center;
line-height: 36px;
p{
width: 80px;
font-weight: bold;
text-align: right;
}
span{
width: 140px;
display: block;
text-align: right;
i{
font-style: normal;
font-weight: bold;
padding: 0 10px;
color: #0348f3;
}
&.percentage{
width: auto;
}
}
}
}
.total-data{
display: flex;
justify-content: flex-start;
align-items: center;
position: absolute;
right: 12px;
top: 60px;
font-size: 14px;
padding: 4px 6px;
color: #fff;
background-color: rgba(0,0,0,.5);
border-radius: 4px;
p{
margin-left: 10px;
}
}
</style>

158
src/views/visualCheck/checkManage/dataScreening/module/form.vue

@ -0,0 +1,158 @@
<template>
<el-dialog append-to-body :close-on-click-modal="false" :modal-append-to-body="false" :before-close="handleCloseForm" :visible="formVisible" title="新增盘点">
<span class="dialog-right-top" />
<span class="dialog-left-bottom" />
<div class="setting-dialog">
<el-form ref="form" :inline="true" :model="form" :rules="rules" size="small" label-width="80px">
<el-form-item label="盘点单号" prop="stockBill">
<el-input v-model="form.stockBill" disabled />
</el-form-item>
<el-form-item label="盘点类型" prop="stockTypeName">
<el-input v-model="form.stockTypeName" disabled />
</el-form-item>
<el-form-item label="目标位置" prop="stockRegion">
<el-input v-model="form.stockRegion" disabled />
</el-form-item>
<el-form-item label="目标数量" prop="stockGridNumName">
<el-input v-model="form.stockGridNumName" disabled />
</el-form-item>
<el-row>
<el-form-item label="备注" prop="stockRemarks">
<el-input v-model="form.stockRemarks" type="textarea" style="width: 572px;" :rows="4" />
</el-form-item>
</el-row>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="text" @click="handleCloseForm">取消</el-button>
<el-button :loading="crud.status.cu === 2" type="primary" @click="handleComfiredEditing">保存</el-button>
</div>
</div>
</el-dialog>
</template>
<script>
import crudStockTaskLog from '@/api/stockTaskLog/index'
import CRUD, { form } from '@crud/crud'
const defaultForm = { stockTypeName: '', stockType: null, stockBill: null, stockRegion: '', stockGridNum: null, stockGridNumName: null, stockRemarks: null, regionId: null, shelfId: null, gridShelf: null, gridId: null }
export default {
name: 'DataForm',
mixins: [
form(function() {
return Object.assign({ }, defaultForm)
})
],
data() {
return {
formVisible: false,
rules: {
stockBill: [
{ required: true, message: '请输入盘点单号', trigger: 'blur' }
],
stockTypeName: [
{ required: true, message: '请输入盘点类型', trigger: 'blur' }
],
stockRegion: [
{ required: true, message: '请输入目标位置', trigger: 'blur' }
],
stockGridNumName: [
{ required: true, message: '请输入目标数量', trigger: 'blur' }
]
}
}
},
methods: {
setData(type) {
this.form.stockType = type
const typeMap = {
1: {
regionId: null,
shelfId: null,
gridShelf: null,
gridId: null,
stockTypeName: '全量盘点'
},
2: {
regionId: this.form.regionId || null,
shelfId: null,
gridShelf: null,
gridId: null,
stockTypeName: '区域盘点'
},
4: {
regionId: null,
shelfId: this.form.shelfId || null,
gridShelf: null,
gridId: null,
stockTypeName: '书架盘点'
},
5: {
regionId: null,
shelfId: this.form.shelfId || null,
gridShelf: this.form.gridShelf || null,
gridId: null,
stockTypeName: '架位盘点'
},
6: {
regionId: null,
shelfId: null,
gridShelf: null,
gridId: this.form.gridId || null,
stockTypeName: '层位盘点'
}
}
const { regionId, shelfId, gridShelf, gridId, stockTypeName } = typeMap[type] || {}
const params = { regionId, shelfId, gridShelf, gridId }
this.form.stockTypeName = stockTypeName
Promise.all([
crudStockTaskLog.FetchNewBillNo(),
crudStockTaskLog.FetchStockGirdNum(params)
]).then(([newBillNoRes, stockGridNumRes]) => {
this.form.stockBill = newBillNoRes
this.form.stockGridNumName = stockGridNumRes + ' / 层位'
this.form.stockGridNum = stockGridNumRes
}).catch(error => {
console.error(error)
})
},
handleCloseForm() {
this.$refs['form'].clearValidate()
this.$refs['form'].resetFields()
// this.form = {}
this.formVisible = false
},
handleComfiredEditing() {
this.$refs['form'].validate((valid) => {
if (valid) {
delete this.form.stockGridNumName
delete this.form.stockTypeName
console.log('this.form', this.form)
// crudStockTaskLog.add(this.form).then((res) => {
// if (res.code !== 500) {
// this.$message({ message: '', type: 'success', offset: 8 })
// } else {
// this.$message({ message: res.message, type: 'error', offset: 8 })
// }
// this.handleCloseForm()
// // this.$emit('refresh')
// }).catch(err => {
// console.log(err)
// })
} else {
return false
}
})
},
//
[CRUD.HOOK.afterValidateCU](crud) {
console.log(crud.form)
delete crud.form.stockGridNumName
delete crud.form.stockTypeName
return true
}
}
}
</script>
<style lang="scss" scoped>
</style>

148
src/views/visualCheck/checkManage/dataScreening/regionsList.vue

@ -7,13 +7,14 @@
<router-link :to="{ path: '/check/check/dataScreening', query: {floorTabIndex: floorTabIndex }}">
{{ floorName }}
</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="venue-content dataScreening-content">
<crudOperation :permission="permission">
<template v-slot:middle>
<el-button v-permission="permission.add" size="mini" @click="crud.toAdd">
<el-button v-permission="permission.add" class="check-btn" size="mini" @click="toAdd(2)">
<i class="iconfont icon-shengchengpandiandan" />
区域盘点
</el-button>
@ -34,7 +35,7 @@
<!-- 最右侧装饰img -->
<span class="tab-right-img" />
</ul>
<CanvasPreview ref="previewRefs" page-preview="region" :current-mark-data="currentMarkData" :image-url="imageUrl" />
<CanvasPreview ref="previewRefs" v-loading="prewLoading" page-preview="region" :current-mark-data="currentMarkData" :image-url="imageUrl" />
</div>
</div>
<div class="venue-right">
@ -61,54 +62,24 @@
</div>
</div>
</div>
<!-- form -->
<el-dialog append-to-body :close-on-click-modal="false" :modal-append-to-body="false" :before-close="crud.cancelCU" :visible="crud.status.cu > 0" :title="crud.status.title">
<span class="dialog-right-top" />
<span class="dialog-left-bottom" />
<div class="setting-dialog">
<el-form ref="form" :inline="true" :model="form" :rules="rules" size="small" label-width="80px">
<el-form-item label="盘点单号" prop="taskName">
<el-input v-model="form.taskName" />
</el-form-item>
<el-form-item label="盘点类型" prop="taskType">
<el-input v-model="form.taskType" />
</el-form-item>
<el-form-item label="目标位置" prop="location">
<el-input v-model="form.location" />
</el-form-item>
<el-form-item label="目标数量" prop="number">
<el-input v-model="form.number" />
</el-form-item>
<el-row>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" style="width: 572px;" :rows="4" />
</el-form-item>
</el-row>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="text" @click="crud.cancelCU">取消</el-button>
<el-button :loading="crud.status.cu === 2" type="primary" @click="crud.submitCU">保存</el-button>
</div>
</div>
</el-dialog>
<eForm ref="eform" />
</div>
</template>
<script>
import crudRegion from '@/api/area/index'
import { FetchInitBookShelfList } from '@/api/shelf/index'
import CRUD, { presenter, header, form, crud } from '@crud/crud'
import CRUD, { presenter, header, crud } from '@crud/crud'
import crudOperation from '@crud/CRUD.operation'
import { mapGetters } from 'vuex'
import defaultImg from '@/assets/images/system/default-img.jpg'
import bookSwiper from '@/views/components/bookSwiper.vue'
import CanvasPreview from '@/views/components/canvasPreview.vue'
import eForm from './module/form'
const defaultForm = { id: null, taskType: null, taskName: null, location: null, number: null, remark: null }
export default {
name: 'DataScreening',
components: { crudOperation, bookSwiper, CanvasPreview },
components: { crudOperation, bookSwiper, CanvasPreview, eForm },
cruds() {
return CRUD({ title: '区域总览', url: 'api/libraryRegion/initLibraryRegionList', crudMethod: { ...crudRegion }, sort: [], optShow: {
add: false,
@ -120,10 +91,11 @@ export default {
}
})
},
mixins: [presenter(), header(), form(defaultForm), crud()],
mixins: [presenter(), header(), crud()],
data() {
const _this = this
return {
prewLoading: false,
regionOptions: [],
floorName: null,
currentRegionId: null,
@ -155,20 +127,6 @@ export default {
add: ['admin', 'floor:add'],
edit: ['admin', 'floor:edit'],
del: ['admin', 'floor:del']
},
rules: {
taskName: [
{ required: true, message: '请输入盘点单号', trigger: 'blur' }
],
taskType: [
{ required: true, message: '请输入盘点类型', trigger: 'blur' }
],
location: [
{ required: true, message: '请输入目标位置', trigger: 'blur' }
],
number: [
{ required: true, message: '请输入目标数量', trigger: 'blur' }
]
}
}
},
@ -211,7 +169,14 @@ export default {
[CRUD.HOOK.afterValidateCU](crud) {
return true
},
toAdd(type) {
this.$refs.eform.formVisible = true
this.$refs.eform.form.regionId = this.regionOptions[this.tabIndex].id
this.$refs.eform.form.stockRegion = this.regionOptions[this.tabIndex].floorName + this.regionOptions[this.tabIndex].regionName
this.$refs.eform.setData(type)
},
changeActiveTab(index) {
this.prewLoading = true
this.tabIndex = index
const params = {
'floorId': this.regionOptions[index].floorId,
@ -251,6 +216,9 @@ export default {
})
} else {
this.currentMarkData = {}
setTimeout(() => {
this.prewLoading = false
}, 500)
}
}).catch(() => {
})
@ -269,81 +237,5 @@ export default {
</script>
<style lang="scss" scoped>
.container-right{
min-height: calc(100vh - 232px) !important;
}
.venue-content{
position: relative;
}
.crud-opts{
position: absolute;
right: 20px;
top: 10px;
}
.venue-left{
flex: 1;
margin-right: 0 !important;
.venue-preview{
height: 633px !important;
}
}
.venue-right{
display: flex;
flex-direction: column;
width: 400px;
padding: 50px 10px 20px 10px !important;
.lib-right-item{
position: relative;
// padding: 10px;
// height: calc(100% / 3);
padding-bottom: 10px;
margin-bottom: 10px;
border: 1px solid #E8F2FF;
border-radius: 4px;
h4{
padding: 6px 10px;
background-color: #E8F2FF;
color: #000;
line-height: 30px;
border-bottom: 1px solid #edeff3;
}
.refresh-date{
position: absolute;
right: 14px;
top: 10px;
font-size: 12px;
line-height: 30px;
}
}
}
.data-right-list {
padding-top: 10px;
li{
display: flex;
justify-content: flex-start;
align-items: center;
line-height: 36px;
p{
width: 80px;
font-weight: bold;
text-align: right;
}
span{
width: 140px;
display: block;
text-align: right;
i{
font-style: normal;
font-weight: bold;
padding: 0 10px;
color: #0348f3;
}
&.percentage{
width: auto;
}
}
}
}
</style>

123
src/views/visualCheck/checkManage/dataScreening/shelfList.vue

@ -7,20 +7,21 @@
<router-link :to="{ path: '/check/check/dataScreening', query: {floorTabIndex: floorTabIndex }}">
{{ floorName }}
</router-link>
<span>-</span>
<span>/</span>
<router-link :to="{ path: '/dataScreening/regions', query: {regionTabIndex: regionTabIndex }}">
{{ regionName }}
</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="venue-content dataScreening-content">
<crudOperation :permission="permission">
<template v-slot:middle>
<el-select v-model="layerVal" clearable size="small" placeholder="楼层" class="filter-item" style="width: 100px; margin-right: 20px;">
<el-select v-model="layerVal" clearable size="small" placeholder="楼层" class="filter-item" style="width: 100px; margin-right: 10px;">
<el-option v-for="item in layerOptions" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
<el-button v-permission="permission.add" size="mini" @click="crud.toAdd">
<el-button v-permission="permission.add" class="check-btn" size="mini" @click="toAdd(4)">
<i class="iconfont icon-shengchengpandiandan" />
书架盘点
</el-button>
@ -111,51 +112,21 @@
</div>
</div>
</div>
<!-- form -->
<el-dialog append-to-body :close-on-click-modal="false" :modal-append-to-body="false" :before-close="crud.cancelCU" :visible="crud.status.cu > 0" :title="crud.status.title">
<span class="dialog-right-top" />
<span class="dialog-left-bottom" />
<div class="setting-dialog">
<el-form ref="form" :inline="true" :model="form" :rules="rules" size="small" label-width="80px">
<el-form-item label="盘点单号" prop="taskName">
<el-input v-model="form.taskName" />
</el-form-item>
<el-form-item label="盘点类型" prop="taskType">
<el-input v-model="form.taskType" />
</el-form-item>
<el-form-item label="目标位置" prop="location">
<el-input v-model="form.location" />
</el-form-item>
<el-form-item label="目标数量" prop="number">
<el-input v-model="form.number" />
</el-form-item>
<el-row>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" style="width: 572px;" :rows="4" />
</el-form-item>
</el-row>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="text" @click="crud.cancelCU">取消</el-button>
<el-button :loading="crud.status.cu === 2" type="primary" @click="crud.submitCU">保存</el-button>
</div>
</div>
</el-dialog>
<eForm ref="eform" />
</div>
</template>
<script>
import { FetchInitShelfGridByShelfId, FetchBookShelfDetails } from '@/api/shelf/index'
import crudRegion from '@/api/area/index'
import CRUD, { presenter, header, form, crud } from '@crud/crud'
import CRUD, { presenter, header, crud } from '@crud/crud'
import crudOperation from '@crud/CRUD.operation'
import { mapGetters } from 'vuex'
import eForm from './module/form'
const defaultForm = { id: null, taskType: null, taskName: null, location: null, number: null, remark: null }
export default {
name: 'DataScreening',
components: { crudOperation },
components: { crudOperation, eForm },
cruds() {
return CRUD({ title: '架位总览', url: 'api/libraryRegion/initLibraryRegionList', crudMethod: { ...crudRegion }, sort: [], optShow: {
add: false,
@ -168,7 +139,7 @@ export default {
queryOnPresenterCreated: false
})
},
mixins: [presenter(), header(), form(defaultForm), crud()],
mixins: [presenter(), header(), crud()],
data() {
const _this = this
return {
@ -198,7 +169,6 @@ export default {
slideChangeTransitionStart: function() {
_this.cellIndex = null
_this.swiperActiveIndex = this.activeIndex
console.log('activeIndexffff', this.swiperActiveIndex)
_this.swiperTitle.slideTo(this.activeIndex, 500, false)
}
}
@ -215,20 +185,6 @@ export default {
edit: ['admin', 'floor:edit'],
del: ['admin', 'floor:del']
},
rules: {
taskName: [
{ required: true, message: '请输入盘点单号', trigger: 'blur' }
],
taskType: [
{ required: true, message: '请输入盘点类型', trigger: 'blur' }
],
location: [
{ required: true, message: '请输入目标位置', trigger: 'blur' }
],
number: [
{ required: true, message: '请输入目标数量', trigger: 'blur' }
]
},
popoverIndex: null,
popoverVisible: [],
popoverStyles: []
@ -270,7 +226,6 @@ export default {
return Array.from({ length: this.rackNum }, (_, i) => i + 1).map(x => x.toString())
}
} else {
console.log('fff')
return []
}
}
@ -319,6 +274,12 @@ export default {
[CRUD.HOOK.afterValidateCU](crud) {
return true
},
toAdd(type) {
this.$refs.eform.formVisible = true
this.$refs.eform.form.shelfId = this.bookShelfDetails.id
this.$refs.eform.form.stockRegion = this.floorName + this.regionName + this.bookShelfDetails.shelfName
this.$refs.eform.setData(type)
},
removeAreaPrefix(gridNames) {
const index = gridNames.indexOf('区')
if (index !== -1) {
@ -350,8 +311,6 @@ export default {
const sortMethod = sortFunction[shelfType][floorType]
this.booShelfGrid = this[sortMethod](res)
console.log(this.booShelfGrid[0].gridShelf)
this.popoverVisible = Array(this.booShelfGrid.length).fill(false)
setTimeout(() => {
this.listLoading = false
@ -453,11 +412,13 @@ export default {
rowType: this.rowType,
toward: item.toward
}
this.handleToGrids(this.cellInfo)
this.currentShelfAllGrid = this.booShelfGrid.filter(gird => gird.gridShelf === item.gridShelf)
this.handleToGrids(this.cellInfo, this.currentShelfAllGrid)
},
handleToGrids(data) {
handleToGrids(data, currentShelfAllGrid) {
this.$router.push({ path: '/dataScreening/gird' })
localStorage.setItem('dataScreenShelf', JSON.stringify(data))
localStorage.setItem('dataScreenShelfAllGrid', JSON.stringify(currentShelfAllGrid))
localStorage.setItem('dataScreenShelfTableIndex', this.tabIndex)
},
showPopover(index) {
@ -502,50 +463,6 @@ export default {
.container-right{
min-height: calc(100vh - 232px) !important;
}
.venue-content{
position: relative;
}
.crud-opts{
position: absolute;
right: 20px;
top: 10px;
}
.venue-left{
flex: 1;
margin-right: 0 !important;
.venue-preview{
height: 633px !important;
}
}
.venue-right{
display: flex;
flex-direction: column;
width: 400px;
padding: 50px 10px 20px 10px !important;
.lib-right-item{
position: relative;
padding-bottom: 10px;
margin-bottom: 10px;
border: 1px solid #E8F2FF;
border-radius: 4px;
h4{
padding: 6px 10px;
background-color: #E8F2FF;
color: #000;
line-height: 30px;
border-bottom: 1px solid #edeff3;
}
.refresh-date{
position: absolute;
right: 14px;
top: 10px;
font-size: 12px;
line-height: 30px;
}
}
}
.data-right-list {
padding-top: 10px;
li{

62
src/views/visualCheck/checkManage/statistic/reverseShelf/index.vue

@ -1,14 +1,14 @@
<template>
<div class="operateLog-main">
<Search :is-log-type="isLogType" :is-center="isCenter" @handleClearOperateData="handleDelt" />
<Search :is-shelf-type="isShelfType" />
<div class="statistic-shelf">
<el-card class="box-card">
<div slot="header" class="clearfix">
<span>架满列表上架率 100% - 80%</span>
</div>
<div v-for="(item,index) in leftData" :key="index" class="statistic-item">
<span class="statistic-item-name">{{ item.girdName }}</span>
<el-progress :percentage="item.percentage" :stroke-width="36" :color="customColorMethod" />
<span class="statistic-item-name">{{ item.gridName }}</span>
<el-progress :percentage="item.prop" :stroke-width="36" :color="customColorMethod" />
</div>
</el-card>
<el-card class="box-card">
@ -16,8 +16,8 @@
<span>架空列表上架率 0% - 50%</span>
</div>
<div v-for="(item,index) in rightData" :key="index" class="statistic-item">
<span class="statistic-item-name">{{ item.girdName }}</span>
<el-progress :percentage="item.percentage" :stroke-width="36" :color="customColorMethod" />
<span class="statistic-item-name">{{ item.gridName }}</span>
<el-progress :percentage="item.prop" :stroke-width="36" :color="customColorMethod" />
</div>
</el-card>
</div>
@ -25,18 +25,17 @@
</template>
<script>
import { FetchInitSuggestTilting } from '@/api/stockTask/index'
import Search from '../search.vue'
import CRUD, { presenter, crud } from '@crud/crud'
import { mapGetters } from 'vuex'
export default {
name: 'OperateLog',
name: 'ReverseShelf',
components: { Search },
mixins: [presenter(), crud()],
cruds() {
return CRUD({
url: 'api/log/initLog',
title: '操作日志',
return CRUD({ title: '建议倒架', url: 'api/stocktask-task/initSuggestTilting',
query: { page: null, size: null },
optShow: {
add: false,
edit: false,
@ -44,7 +43,8 @@ export default {
download: false,
reset: false,
group: false
}
},
queryOnPresenterCreated: false
})
},
@ -52,7 +52,7 @@ export default {
},
data() {
return {
isLogType: 'operate',
isShelfType: 'reverse',
leftData: [
{ id: 0, percentage: 100, girdName: '一楼区域A001排01架1层' },
{ id: 0, percentage: 100, girdName: '一楼区域A001排01架1层' },
@ -76,15 +76,43 @@ export default {
'user'
])
},
mounted() {
created() {
this.getListAll()
},
methods: {
[CRUD.HOOK.beforeRefresh]() {
if (this.isCenter) {
this.crud.query.username = this.user.username
} else {
this.crud.query[this.optionVal] = this.keyWord
},
getListAll() {
const sendRequest = (orderType) => {
const params = {
'orderType': orderType,
'floorId': this.crud.query.floorId,
'regionId': this.crud.query.regionId
}
return FetchInitSuggestTilting(params)
.then(res => {
console.log('res', res)
return res
})
.catch(error => {
console.error(error)
throw error
})
}
// orderType 1. 2
Promise.all([sendRequest(1), sendRequest(2)])
.then((results) => {
console.log('所有请求结果:', results)
this.leftData = results[0]
this.rightData = results[1]
})
.catch((error) => {
console.error(error)
})
//
// sendRequest(1);
// sendRequest(2);
},
customColorMethod(percentage) {
if (percentage === 0) {

109
src/views/visualCheck/checkManage/statistic/search.vue

@ -1,9 +1,24 @@
<template>
<div class="head-container">
<div class="head-search">
<el-select v-model="query.floor" clearable size="small" placeholder="楼层区域" class="filter-item" style="width: 200px" @change="crud.toQuery">
<!-- <el-select v-model="query.floorId" clearable size="small" placeholder="楼层区域" class="filter-item" style="width: 200px" @change="crud.toQuery">
<el-option v-for="item in options" :key="item.key" :label="item.display_name" :value="item.key" />
</el-select>
</el-select> -->
<!-- -->
<treeselect
v-model="search"
:options="regionOptions"
flat
:multiple="false"
:clearable="false"
placeholder="请选择楼层区域"
:normalizer="normalizer"
:default-expand-level="levelNumber"
style="width: 235px;"
@select="node=>treeSelectInput(node)"
>
<div slot="value-label" slot-scope="{ node }">{{ getAutoNameUnknown(node.label) }}</div>
</treeselect>
<el-button class="filter-item filter-search" size="mini" type="success" icon="el-icon-search" @click="crud.toQuery">搜索</el-button>
<el-button class="filter-item filter-refresh" size="mini" type="warning" icon="el-icon-refresh-left" @click="resetQuery()">重置</el-button>
</div>
@ -19,23 +34,28 @@
</template>
<script>
import { FetchRegionTree } from '@/api/deviceVI/index'
import CRUD, { header, crud } from '@crud/crud'
import crudOperation from '@crud/CRUD.operation'
import { mapGetters } from 'vuex'
import { exportFile } from '@/utils/index'
import Treeselect from '@riophae/vue-treeselect'
import '@riophae/vue-treeselect/dist/vue-treeselect.css'
import qs from 'qs'
export default {
components: { crudOperation },
components: { crudOperation, Treeselect },
mixins: [header(), crud()],
props: {
isLogType: {
isShelfType: {
type: String,
default: ''
}
},
data() {
return {
options: []
search: null,
regionOptions: [],
levelNumber: 4
}
},
computed: {
@ -45,11 +65,72 @@ export default {
])
},
created() {
FetchRegionTree().then(res => {
this.regionOptions = [this.transformData(res)]
}).catch(() => {
})
},
methods: {
getAutoNameUnknown(name) {
if (name.lastIndexOf('unknown') > -1) {
return name.split('(')[0]
} else {
return name
}
},
normalizer(node) {
if (node.children && !node.children.length) {
delete node.children
}
return {
id: node.id,
label: node.label,
children: node.children,
isDisabled: node.fondsId
}
},
transformData(data) {
return {
id: data.fondsId,
fondsId: data.fondsId,
label: data.fondsName,
children: data.floors.map(floor => ({
id: floor.id,
floorId: floor.id,
label: floor.floorName,
children: floor.regions.map(region => ({
id: region.id,
regionId: region.id,
label: region.regionName,
parentFloorId: floor.id
}))
}))
}
},
[CRUD.HOOK.beforeRefresh]() {
console.log('this.search', this.search)
},
treeSelectInput(value) {
console.log(value)
const selectKey = value
if (selectKey.hasOwnProperty('floorId')) {
this.crud.query.floorId = selectKey.id
} else if (selectKey.hasOwnProperty('regionId')) {
this.crud.query.floorId = selectKey.parentFloorId
} else {
this.crud.query.floorId = null
}
this.crud.query.regionId = selectKey.hasOwnProperty('regionId') ? selectKey.id : null
if (this.isShelfType === 'seq') {
this.crud.toQuery()
} else {
this.$parent.getListAll()
}
},
resetQuery() {
this.search = null
this.crud.query.floorId = null
this.crud.query.regionId = null
this.crud.toQuery()
},
doExport(data) {
@ -90,9 +171,19 @@ export default {
::v-deep .crud-opts-left{
position: relative;
}
.double-click-btn{
top: 4px !important;
right: 0;
left: -156px !important;
.head-search{
::v-deep .vue-treeselect{
font-size: 13px !important;
z-index: 99999;
.vue-treeselect__control{
font-size: 13px !important;
height: 34px !important;
.vue-treeselect__placeholder{
line-height: 34px !important;
}
}
}
}
</style>

61
src/views/visualCheck/checkManage/statistic/seqShelf/index.vue

@ -1,19 +1,24 @@
<template>
<div style="height: calc(100vh - 236px);">
<Search :is-log-type="isLogType" @handleClearData="handleDelt" />
<Search :is-shelf-type="isShelfType" />
<el-table
ref="table"
v-loading="crud.loading"
:data="crud.data"
style="width: 100%;"
height="calc(100vh - 396px)"
@row-click="clickRowHandler"
@selection-change="crud.selectionChangeHandler"
>
<el-table-column prop="account" label="层位" min-width="150" align="center" />
<el-table-column prop="username" label="所属楼层" align="center" min-width="150" />
<el-table-column prop="fondsName" label="所属区域" align="center" min-width="150" />
<el-table-column prop="det" label="当前错架率" align="center" min-width="180" />
<el-table-column prop="createTime" label="更新时间" align="center" min-width="180">
<el-table-column prop="gridName" label="层位" min-width="150" />
<el-table-column prop="floorName" label="所属楼层" min-width="150" />
<el-table-column prop="regionName" label="所属区域" min-width="150" />
<el-table-column prop="prop" label="当前错架率" min-width="180">
<template slot-scope="scope">
<div>在架: {{ scope.row.onShelfNum }} / 错架{{ scope.row.onErrorShelfNum }} / {{ scope.row.prop }} </div>
</template>
</el-table-column>
<el-table-column prop="createTime" label="更新时间" min-width="180">
<template slot-scope="scope">
<div>{{ scope.row.createTime | parseTime }}</div>
</template>
@ -24,32 +29,15 @@
</template>
<script>
import { FetchClearLoginLog } from '@/api/system/logs'
import CRUD, { presenter, crud, header } from '@crud/crud'
import pagination from '@crud/Pagination'
import Search from '../search.vue'
// import { parseTime, saveAs, getBlob } from '@/utils/index'
export default {
name: 'LoginLog',
name: 'SeqShelf',
components: { pagination, Search },
filters: {
parseRole(val) {
const regex = /name=(.*)\)/
const match = regex.exec(val)
let role = ''
if (match) {
role = match[1]
} else {
role = val
}
return role
}
},
mixins: [presenter(), crud(), header()],
cruds() {
return CRUD({
url: 'api/log/initLoginLog',
sort: [],
return CRUD({ title: '建议顺架', url: 'api/stocktask-task/initErrorProbaDesc', sort: [],
optShow: {
add: false,
edit: false,
@ -62,32 +50,13 @@ export default {
},
data() {
return {
isLogType: 'login',
isShelfType: 'seq',
selections: []
}
},
methods: {
handleDelt() {
this.$confirm('此操作将清空所选数据' + this.crud.title + '<span>你是否还要继续?</span>', '提示', {
confirmButtonText: '继续',
cancelButtonText: '取消',
type: 'warning',
dangerouslyUseHTMLString: true
}).then(() => {
this.crud.delAllLoading = true
FetchClearLoginLog().then(() => {
this.$message({ message: '清空成功', type: 'success', offset: 8 })
this.crud.delAllLoading = false
this.crud.refresh()
}).catch(err => {
this.crud.delAllLoading = false
console.log(err)
})
}).catch(() => {
})
},
clickRowHandler(row) {
this.$refs.table.toggleRowSelection(row) //
this.$refs.table.toggleRowSelection(row)
}
}
}

17
src/views/visualCheck/venueDevice/bookshelf/index.vue

@ -9,10 +9,10 @@
<div class="head-container">
<div class="head-search">
<!-- 搜索 -->
<el-select v-model="selectFloorVal" clearable size="small" placeholder="楼层" class="filter-item" style="width: 80px" value-key="id" @change="changeBeforeFloor">
<el-select v-model="selectFloorVal" size="small" placeholder="楼层" class="filter-item" style="width: 80px" value-key="id" @change="changeBeforeFloor">
<el-option v-for="(item,index) in floorOptions" :key="index" :label="item.floorName" :value="item" />
</el-select>
<el-select v-model="selectRegionVal" clearable size="small" placeholder="区域" class="filter-item" style="width: 120px" value-key="id" @change="changeBeforeRegion">
<el-select v-model="selectRegionVal" size="small" placeholder="区域" class="filter-item" style="width: 140px" value-key="id" @change="changeBeforeRegion">
<el-option v-for="(item,index) in regionOptions" :key="index" :label="item.regionName" :value="item" />
</el-select>
<!-- <el-input v-model="query.search" clearable size="small" placeholder="输入关键字搜索" prefix-icon="el-icon-search" style="width: 200px;" class="filter-item" @clear="crud.toQuery" @keyup.enter.native="crud.toQuery" /> -->
@ -52,7 +52,7 @@
</template>
</el-table-column>
<el-table-column prop="floorName" label="所属楼层" />
<el-table-column prop="regionName" label="所属区域" />
<el-table-column prop="regionName" label="所属区域" min-width="100" />
<el-table-column prop="signPoint" label="标注">
<template slot-scope="scope">
<span :class="['row-state', scope.row.signPoint ? 'end-state' : 'cancel-state' ]">{{ scope.row.signPoint ? '已标注': '未标注' }}</span>
@ -127,9 +127,11 @@
</el-form-item>
</el-row>
<el-form-item label="书架规格" prop="rackSpecs">
<el-input-number v-model.number="form.shelfFloor" :min="1" :max="999" controls-position="right" style="width: 90px;" />
<span style="padding:0 12px;"></span>
<el-input-number v-model.number="form.shelfShelf" :min="1" :max="999" controls-position="right" style="width: 90px;" />
<el-input-number v-model.number="form.shelfFloor" :min="1" :max="999" controls-position="right" style="width:80px;" />
<span style="font-size: 12px;"></span>
<span style="padding:0 2px;"></span>
<el-input-number v-model.number="form.shelfShelf" :min="1" :max="999" controls-position="right" style="width: 80px;" />
<span style="font-size: 12px;"></span>
</el-form-item>
<el-form-item label="架起始标" prop="startShelf">
<el-input-number v-model.number="form.startShelf" :min="1" :max="999" controls-position="right" />
@ -202,7 +204,7 @@ import defaultImg from '@/assets/images/system/default-img.jpg'
import MarkCover from '@/views/components/mark.vue'
import { fabric } from 'fabric'
const defaultForm = { id: null, floorName: null, floorId: null, regionName: null, rowType: 1, toward: 1, shelfRow: '', shelfName: '', shelfShelf: null, shelfFloor: null, startShelf: null, shelfType: null, floorType: null, shelfRule: 2, shelfErrorJudge: 2, signPoint: '' }
const defaultForm = { id: null, floorName: null, floorId: null, regionName: null, rowType: 1, toward: 1, shelfRow: '', shelfName: '', shelfShelf: null, shelfFloor: null, startShelf: null, shelfType: 1, floorType: 1, shelfRule: 2, shelfErrorJudge: 2, signPoint: '' }
export default {
name: 'Bookshelf',
components: { crudOperation, pagination, MarkCover },
@ -467,7 +469,6 @@ export default {
}
FetchInitLibraryRegionList(params).then(res => {
this.regionOptions = res.content
console.log('this.regionOptions', this.regionOptions)
if (this.regionOptions.length > 0) {
this.selectRegionVal = this.regionOptions[0]
this.crud.query.regionId = this.selectRegionVal.id

5
src/views/visualCheck/venueDevice/bookshelfPosition/index.vue

@ -94,8 +94,9 @@
</ul>
<el-button size="mini" class="edit-callNumber" @click="handleEditGridNum">
<!-- <i class="iconfont icon-yulan" /> -->
<i>&nbsp;&nbsp;&nbsp;</i>
<i>索书号</i>
<!-- <i>&nbsp;&nbsp;&nbsp;</i>
<i>索书号</i> -->
编辑索书号
</el-button>
</div>
<ul class="layer-handle">

10
src/views/visualCheck/venueDevice/device/index.vue

@ -62,7 +62,7 @@
</el-button>
</template>
<template v-slot:right>
<el-button type="primary" size="mini" :disabled="activeRightBtn" @click="openBindShelf('')"><i class="iconfont icon-bangding" />书架绑定</el-button>
<el-button type="primary" size="mini" :disabled="activeRightBtn || crud.selections[0].shelfCount !== 0" @click="openBindShelf('')"><i class="iconfont icon-bangding" />书架绑定</el-button>
</template>
</crudOperation>
</div>
@ -82,13 +82,13 @@
<el-table-column prop="deviceName" label="设备名称" />
<el-table-column prop="deviveCode" label="设备编号" />
<!-- <el-table-column prop="ipv4" label="接口IP" /> -->
<el-table-column prop="ipv4" label="接口IP" show-overflow-tooltip>
<el-table-column prop="ipv4" label="接口IP" min-width="120">
<template slot-scope="scope">
<span v-if="scope.row.ipv4"> {{ scope.row.ipv4 }} </span>
<span v-else></span>
</template>
</el-table-column>
<el-table-column label="端口" prop="rtsp">
<el-table-column label="端口" prop="rtsp" width="50">
<template slot-scope="scope">
<span v-if="scope.row.rtsp"> {{ scope.row.rtsp }} </span>
<span v-else></span>
@ -102,8 +102,8 @@
<el-table-column prop="shelfCount" label="已绑架位" />
<el-table-column prop="fondsName" label="所属机构" />
<el-table-column prop="floorName" label="所属楼层" />
<el-table-column prop="regionName" label="所属区域" />
<el-table-column :show-overflow-tooltip="true" prop="createTime" label="创建日期" width="160">
<el-table-column prop="regionName" label="所属区域" min-width="120" />
<el-table-column :show-overflow-tooltip="true" prop="createTime" label="创建日期" width="140">
<template slot-scope="scope">
<div>{{ scope.row.createTime | parseTime }}</div>
</template>

Loading…
Cancel
Save