Browse Source

查漏补缺/优化

master
xuhuajiao 5 months ago
parent
commit
60586a25d5
  1. 10
      src/api/book/index.js
  2. 6
      src/api/system/new.js
  3. 20
      src/assets/styles/index.scss
  4. 7
      src/assets/styles/manage.scss
  5. 4
      src/layout/components/Navbar.vue
  6. 19
      src/main.js
  7. 44
      src/utils/index.js
  8. 13
      src/views/components/bookSwiper.vue
  9. 6
      src/views/components/canvasPreview.vue
  10. 6
      src/views/components/checkSwiper.vue
  11. 4
      src/views/home.vue
  12. 116
      src/views/login.vue
  13. 7
      src/views/system/log/search.vue
  14. 10
      src/views/system/notify/index.vue
  15. 143
      src/views/visualCheck/bookstore/book/index.vue
  16. 6
      src/views/visualCheck/bookstore/collection/index.vue
  17. 15
      src/views/visualCheck/checkManage/bookSearch/index.vue
  18. 11
      src/views/visualCheck/checkManage/bookshelfSearch/index.vue
  19. 20
      src/views/visualCheck/checkManage/checkLog/index.vue
  20. 158
      src/views/visualCheck/checkManage/dataScreening/girdList.vue
  21. 6
      src/views/visualCheck/checkManage/dataScreening/shelfList.vue
  22. 10
      src/views/visualCheck/checkManage/positionMixins/index.js
  23. 4
      src/views/visualCheck/checkManage/statistic/reverseShelf/index.vue
  24. 6
      src/views/visualCheck/checkManage/statistic/seqShelf/index.vue
  25. 6
      src/views/visualCheck/checkManage/upDownLog/index.vue
  26. 6
      src/views/visualCheck/venueDevice/bookshelfPosition/index.vue

10
src/api/book/index.js

@ -57,4 +57,12 @@ export function FetchInitBookDetailsSearchInto(params) {
})
}
export default { add, edit, del, FetchInitBookBasiceList, FetchBookBasiceByISBN, FetchFastDownShelf, FetchInitBookDetailsSearchInto }
// 图书基本信息总数
export function FetchInitBookBasiceCount(params) {
return request({
url: 'api/bookBasice/initBookBasiceCount' + '?' + qs.stringify(params, { indices: false }),
method: 'get'
})
}
export default { add, edit, del, FetchInitBookBasiceList, FetchBookBasiceByISBN, FetchFastDownShelf, FetchInitBookDetailsSearchInto, FetchInitBookBasiceCount }

6
src/api/system/new.js

@ -3,7 +3,7 @@ import request from '@/utils/request'
// 我的系统通知
export function FetchMySystemNotice(params) {
return request({
url: 'api/news/mySystemNotice',
url: 'api/notice/mySystemNotice',
method: 'get',
params
})
@ -12,7 +12,7 @@ export function FetchMySystemNotice(params) {
// 通知详情
export function FetchInitNoticeDetails(data) {
return request({
url: 'api/news/initNoticeDetails',
url: 'api/notice/initNoticeDetails',
method: 'post',
data
})
@ -21,7 +21,7 @@ export function FetchInitNoticeDetails(data) {
// 全部已读
export function FetchReadedAll(data) {
return request({
url: 'api/news/readedAll',
url: 'api/notice/readedAll',
method: 'post',
data
})

20
src/assets/styles/index.scss

@ -323,4 +323,24 @@ ul{
left: 0 !important;
margin-top: 0 !important;
margin-right: 30px !important;
}
.login-info{
.el-dialog__body{
padding: 10px 20px 30px 20px;
line-height: 30px;
color:#0C0E1E;
h4{
font-size: 18px;
}
.text-item{
margin-bottom: 10px;
h5{
font-size: 14px;
}
p{
text-indent: 2em;
}
}
}
}

7
src/assets/styles/manage.scss

@ -52,7 +52,7 @@
}
.double-click-btn{
position: inherit;
margin-left: 20px;
margin: 0 0 0 20px !important;
font-weight: normal;
border: 1px solid #545b65;
border-radius: 13px;
@ -640,6 +640,11 @@
}
}
}
.tip-bottom{
font-size: 12px;
padding: 5px 0 10px 0;
text-align: center;
}
.positionDialog{

4
src/layout/components/Navbar.vue

@ -3,7 +3,7 @@
<logo v-if="showLogo" :collapse="isCollapse" />
<div class="right-menu">
<!-- 主题切换 -->
<el-dropdown trigger="click">
<!-- <el-dropdown trigger="click">
<div class="message-icon cart-main" style="cursor: pointer;">
<span class="iconfont icon-zhuti" />
</div>
@ -17,7 +17,7 @@
<i class="el-icon-check" :style="{display: themeValue === 'dark'?'':'none'}" />
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</el-dropdown> -->
<!-- 消息中心 -->
<el-dropdown ref="messageDrop" class="message-center right-menu-item hover-effect" trigger="click">
<!-- 消息中心 -小红点数量 -->

19
src/main.js

@ -4,7 +4,7 @@ import 'normalize.css/normalize.css'
import Element from 'element-ui'
// 数据字典
import dict from './components/Dict'
// import dict from './components/Dict'
// 权限指令
import checkPer from '@/utils/permission'
@ -39,11 +39,24 @@ if (localStorage.getItem('themeValue')) {
}
// 全局注册过滤 - 时间
import { parseTime } from '@/utils/index.js'
import { parseTime, removeQUPrefix, removeQuLayerPrefix, removeMianBeforeRefix } from '@/utils/index.js'
Vue.filter('parseTime', function(time, cFormat) {
return parseTime(time, cFormat)
})
Vue.filter('removeQUPrefix', function(gridNames) {
return removeQUPrefix(gridNames)
})
Vue.filter('removeQuLayerPrefix', function(gridNames) {
return removeQuLayerPrefix(gridNames)
})
Vue.filter('removeMianBeforeRefix', function(gridNames) {
return removeMianBeforeRefix(gridNames)
})
// 解决el-radio报错
Vue.directive('removeAriaHidden', {
bind(el, binding) {
@ -59,7 +72,7 @@ Vue.use(checkPer)
Vue.use(VueHighlightJS)
Vue.use(VueViewer)
Vue.use(permission)
Vue.use(dict)
// Vue.use(dict)
Vue.use(Element, {
size: Cookies.get('size') || 'small' // set element-ui default size
})

44
src/utils/index.js

@ -486,3 +486,47 @@ export function timeToTimestamp(time) {
// timestamp = timestamp / 1000
return timestamp
}
// 01区001排A面01架1层
// 过滤去掉'区' 001排A面01架1层
export function removeQUPrefix(gridNames) {
// 首先判断 gridNames 是否不为 null 且不为 undefined
if (gridNames !== null && gridNames !== undefined) {
const index = gridNames.indexOf('区')
if (index !== -1) {
return gridNames.substring(index + 1)
}
return gridNames
} else {
// 如果 gridNames 为 null 或 undefined,则可以根据需要返回一个默认值,这里返回 null
return null
}
}
// 过滤去掉‘面’后的架和层 01区001排A面
export function removeMianAfterRefix(gridNames) {
const index = gridNames.indexOf('面')
if (index !== -1) {
return gridNames.substring(0, index + 1)
}
return gridNames
}
// 过滤去掉‘面’前面的区/排/面 01架1层
export function removeMianBeforeRefix(gridNames) {
const index = gridNames.indexOf('面')
if (index !== -1) {
return gridNames.substring(index + 1)
}
return gridNames
}
// 过滤去掉‘区/层’ 001排A面01架
export function removeQuLayerPrefix(gridNames) {
return gridNames.replace(/\d*区|\d*层/g, '')
}
// 只保留排和面 001排A面
export function removePrefix(gridNames) {
return gridNames.replace(/\d+区(\d+排)([A-Z]面)\d+架\d+层/g, '$1$2')
}

13
src/views/components/bookSwiper.vue

@ -44,12 +44,23 @@
style="width: 100%"
height="150"
>
<el-table-column
v-if="swiperActiveIndex === 1"
prop="regionName"
label="楼层区域"
>
<template slot-scope="scope">
{{ scope.row.floorName + scope.row.regionName }}
</template>
</el-table-column>
<!-- :show-overflow-tooltip="true" -->
<el-table-column
prop="title"
:label="swiperActiveIndex === 1 ? '书架' :'书名'"
>
<template slot-scope="scope">
{{ swiperActiveIndex === 0 ? scope.row.title : scope.row.grid_name }}
<span v-if="swiperActiveIndex === 0">{{ scope.row.title }}</span>
<span v-else>{{ scope.row.grid_name | removeQUPrefix }}</span>
</template>
</el-table-column>
<el-table-column

6
src/views/components/canvasPreview.vue

@ -223,7 +223,8 @@ export default {
<li><p>在架</p><span><i>${this.tooltipInfo.onShelfNum}</i></span></li>
<li><p>错架</p><span><i>${this.tooltipInfo.errorShelfNum}</i></span> <span class="percentage">${this.tooltipInfo.errorShelfProbo}</span></li>
<li><p>错序</p><span><i>${this.tooltipInfo.errorOrderNum}</i></span><span class="percentage">${this.tooltipInfo.errorOrderProbo}</span></li>
</ul>`
</ul>
<div class="tip-bottom">提示双击查看详情</div>`
} else if (self.pagePreview === 'region') {
document.getElementById('tooltip').innerHTML =
`<div class="tooltip-top">
@ -235,7 +236,8 @@ export default {
<li><p>在架</p><span><i>${this.tooltipInfo.onShelfNum}</i></span></li>
<li><p>错架</p><span><i>${this.tooltipInfo.errorShelfNum}</i></span> <span class="percentage">${this.tooltipInfo.errorShelfProbo}</span></li>
<li><p>错序</p><span><i>${this.tooltipInfo.errorOrderNum}</i></span><span class="percentage">${this.tooltipInfo.errorOrderProbo}</span></li>
</ul>`
</ul>
<div class="tip-bottom">提示双击查看详情</div>`
}
// var rectLeft = e.target.left + e.target.width - 100

6
src/views/components/checkSwiper.vue

@ -55,7 +55,11 @@
<el-table-column
prop="gridName"
label="层位"
/>
>
<template slot-scope="scope">
{{ scope.row.gridName | removeQUPrefix }}
</template>
</el-table-column>
<el-table-column
prop="prop"
:label="swiperActiveIndex === 1 ? '上架率' :'错架率'"

4
src/views/home.vue

@ -16,14 +16,14 @@
<div class="home-flowable" style="height: calc(100% - 54px); overflow-x: hidden;">
<div class="home-tab">
<span :class="{'home-tab-active': flowableTabIndex == 0}">未完成({{ stockLogIncompleteData.length !==0? stockLogIncompleteData.length: 0 }})</span>
<span :class="{'home-tab-active': flowableTabIndex == 1}">完成({{ stockLogCompletedData.length !==0? stockLogCompletedData.length: 0 }})</span>
<span :class="{'home-tab-active': flowableTabIndex == 1}">结束({{ stockLogCompletedData.length !==0? stockLogCompletedData.length: 0 }})</span>
<!-- <span :class="{'home-tab-active': flowableTabIndex == 2}">已完成({{ flowableData.length !==0? flowableData.length: 0 }})</span>
<span :class="{'home-tab-active': flowableTabIndex == 3}" @click="toMoreProcess">更多任务</span> -->
</div>
<div class="home-flowable-list" style="height: calc(100% - 45px); overflow-y: auto; overflow-x: hidden;">
<el-table v-if="stockLogIncompleteData.length !== 0" height="calc(100%)" :data="stockLogIncompleteData" class="archives-table" stripe style="width: 100%">
<el-table-column prop="stockBill" label="盘点单号" />
<el-table-column prop="stockRegion" label="目标位置" />
<el-table-column prop="stockRegion" label="目标位置" min-width="180" />
<el-table-column prop="stockGridNum" label="目标数量" align="right">
<template slot-scope="scope">
<div>{{ scope.row.stockGridNum + ' / '+ (scope.row.totalGridNum?scope.row.totalGridNum:'0') +' 层位' }}</div>

116
src/views/login.vue

@ -56,11 +56,11 @@
<!-- 底部 -->
<div v-if="$store.state.settings.showFooter" id="el-login-footer">
<div class="login-footer-link">
<a href="https://beian.miit.gov.cn/#/Integrated/index" target="_blank">帮助</a>
<a href="javascript:;" @click="helpVisible=true">帮助</a>
<span> | </span>
<a href="https://beian.miit.gov.cn/#/Integrated/index" target="_blank">隐私</a>
<a href="javascript:;" @click="secretVisible=true">隐私</a>
<span> | </span>
<a href="https://beian.miit.gov.cn/#/Integrated/index" target="_blank">条款</a>
<a href="javascript:;" @click="termVisible=true">条款</a>
</div>
<span v-html="$store.state.settings.footerTxt" />
<!-- <span> </span>
@ -68,6 +68,105 @@
$store.state.settings.caseNumber
}}</a> -->
</div>
<!-- 帮助中心 -->
<el-dialog class="login-info" append-to-body :close-on-click-modal="false" :modal-append-to-body="false" :visible="helpVisible" title="帮助中心" :before-close="handleClose">
<span class="dialog-right-top" />
<span class="dialog-left-bottom" />
<div class="setting-dialog">
<h4>账户相关</h4>
<div class="text-item">
<h5>1.如何注册账号</h5>
<p>统一由系统管理员在系统中添加用户并分配权限账号初始默认密码为123456账号创建完成后交予用户使用用户登录自己的账号后可在个人中心修改账号密码</p>
</div>
<div class="text-item">
<h5>2.忘记登录密码怎么办</h5>
<p>联系系统管理员由系统管理员在系统找到对应的账号操作密码重置用户账号的密码将恢复到初始默认密码123456再次交予用户使用</p>
</div>
<h4>产品使用</h4>
<div class="text-item">
<h5>1.服务功能如何操作</h5>
<p>用户输入账号密码后登录系统系统会根据该账号的权限给出对应的功能页面用户可按照操作说明中的操作办法进行系统的使用</p>
</div>
<h4>联系我们</h4>
<div class="text-item">
<p>客服电话[具体号码]服务时间为周一至周五 8:30 - 17:30</p>
<p>邮箱[邮箱地址]我们会在 24 小时内回复您的邮件</p>
</div>
</div>
</el-dialog>
<!-- 隐私政策 -->
<el-dialog class="login-info" append-to-body :close-on-click-modal="false" :modal-append-to-body="false" :visible="secretVisible" title="隐私政策" :before-close="handleClose">
<span class="dialog-right-top" />
<span class="dialog-left-bottom" />
<div class="setting-dialog">
<div class="text-item">
<p>本隐私政策旨在说明我们如何收集使用共享和保护您在使用本网站过程中的个人信息</p>
</div>
<div class="text-item">
<h5>信息收集</h5>
<p>我们收集的个人信息包括但不限于您的姓名电子邮箱手机号码等在您使用特定功能时我们会获取相关信息</p>
</div>
<div class="text-item">
<h5>信息使用</h5>
<p>我们使用收集的信息为您提供优质服务如处理业务改进系统交互根据您的偏好提供个性化推荐不会将您的个人信息用于未经您同意的其他目的</p>
</div>
<div class="text-item">
<h5>信息共享</h5>
<p>我们不会向第三方出售您的个人信息仅在以下情况共享与合作伙伴协作提供服务如大数据显示消息通知等且要求合作伙伴严格保密应法律要求或司法程序向有权机关披露</p>
</div>
<div class="text-item">
<h5>信息安全</h5>
<p>我们采用加密技术访问控制等安全措施保护您的信息免遭未经授权的访问使用或泄露定期对系统进行安全评估与维护</p>
</div>
<div class="text-item">
<h5>用户权利</h5>
<p>您有权查询更正删除个人信息登录账号后 个人中心 中可进行相关操作也可通过联系系统管理员或运维人员协助处理</p>
</div>
<div class="text-item">
<h5>政策更新</h5>
<p>本政策会适时更新更新后将在系统显著位置发布通知建议您定期查看</p>
</div>
</div>
</el-dialog>
<!-- 使用条款 -->
<el-dialog class="login-info" append-to-body :close-on-click-modal="false" :modal-append-to-body="false" :visible="termVisible" title="使用条款" :before-close="handleClose">
<span class="dialog-right-top" />
<span class="dialog-left-bottom" />
<div class="setting-dialog">
<div class="text-item">
<p>在使用本网站前请仔细阅读并同意以下条款使用本系统即表示您接受这些条款的约束</p>
</div>
<div class="text-item">
<h5>服务内容</h5>
<p>本网站为用户提供 [详细服务内容图书盘点信息发布等] 服务不断更新与优化服务体验</p>
</div>
<div class="text-item">
<h5>用户义务</h5>
<p>1.用户应遵守法律法规不得发布任何违法有害侵权淫秽暴力等内容</p>
<p>2.不得利用系统进行恶意攻击干扰正常运营或通过不正当手段获取信息</p>
</div>
<div class="text-item">
<h5>知识产权</h5>
<p>系统所有内容包括但不限于文字图片软件其知识产权归本公司所有未经书面许可用户不得复制传播修改系统内容</p>
</div>
<div class="text-item">
<h5>责任限制</h5>
<p>因不可抗力网络故障等原因导致系统服务中断或用户数据丢失我们不承担责任在法律允许范围内对用户因使用系统产生的间接附带损失赔偿责任以实际损失为限</p>
</div>
<div class="text-item">
<h5>服务终止</h5>
<p>若用户严重违反本条款如多次发布违法内容恶意破坏系统我们有权不经通知立即终止其服务且不退还已支付费用</p>
</div>
<div class="text-item">
<h5>争议解决</h5>
<p>如发生争议双方同意提交 [仲裁机构名称] 仲裁或向 [管辖法院名称] 提起诉讼适用 [具体法律]</p>
</div>
</div>
</el-dialog>
</div>
</template>
@ -104,7 +203,10 @@ export default {
]
},
loading: false,
redirect: undefined
redirect: undefined,
helpVisible: false,
secretVisible: false,
termVisible: false
}
},
watch: {
@ -207,6 +309,11 @@ export default {
this.$message({ message: '当前登录状态已过期,请重新登录!', type: 'warning', duration: 5000, offset: 8 })
Cookies.remove('point')
}
},
handleClose() {
this.helpVisible = false
this.secretVisible = false
this.termVisible = false
}
}
}
@ -336,4 +443,5 @@ export default {
}
}
}
</style>

7
src/views/system/log/search.vue

@ -199,8 +199,9 @@ export default {
position: relative;
}
.double-click-btn{
top: 4px !important;
right: 0;
left: -156px !important;
margin: 0 20px 0 0 !important;
// top: 4px !important;
// right: 20px;
// left: -156px !important;
}
</style>

10
src/views/system/notify/index.vue

@ -242,12 +242,10 @@ export default {
}
}
::v-deep .crud-opts-left{
position: relative;
}
.double-click-btn{
top: 4px !important;
right: 0;
left: -156px !important;
margin: 0 20px 0 0 !important;
// top: 4px !important;
// right: 20px;
// left: -156px !important;
}
</style>

143
src/views/visualCheck/bookstore/book/index.vue

@ -1,5 +1,22 @@
<template>
<div class="app-container row-container" style="height: calc(100vh - 140px);">
<!-- <div v-if="!isResult" class="search-main">
<span class="bg_icon1" />
<span class="bg_icon2" />
<span class="bg_icon3" />
<span class="bg_icon4" />
<div class="search-content">
<h2>图书检索</h2>
<div class="common-search">
<div class="search-input">
<el-input v-model="search" placeholder="请输入检索关键字" class="input-with-select" @keyup.enter.native="handleSearch" />
<el-button slot="append" @click="handleSearch"><i class="iconfont icon-sousuo" />搜索</el-button>
</div>
<div style="margin: 20px 0; text-align: center; color: #1c1c1c;">书库内图书数量<span style="display: inline-block; padding: 0 4px 0 0; font-weight: bold;">{{ totalBookCount }}</span>/ </div>
</div>
</div>
</div> -->
<!-- <div v-else> -->
<!--工具栏-->
<div class="head-container">
<div class="head-search">
@ -7,7 +24,7 @@
v-model="keyWord"
size="small"
clearable
placeholder="请输入输入搜索关键词"
placeholder="请输入检索关键字"
style="width: 320px;"
class="input-prepend filter-item"
@clear="crud.toQuery"
@ -104,6 +121,7 @@
<!--分页组件-->
<pagination v-if="crud.data.length!==0" />
</div>
<!-- </div> -->
</div>
</template>
@ -116,6 +134,7 @@ import pagination from '@crud/Pagination'
import UploadCover from '@/views/components/upload.vue'
import { mapGetters } from 'vuex'
// queryOnPresenterCreated: false
const defaultForm = { id: null, title: null, author: null, isbn: null, classNo: null, publisher: null, bookCover: null, bookRecNo: null }
export default {
name: 'Book',
@ -170,7 +189,10 @@ export default {
publisher: [
{ required: true, message: '出版社不可为空', trigger: 'blur' }
]
}
},
totalBookCount: 0,
isResult: false,
search: ''
}
},
computed: {
@ -178,6 +200,13 @@ export default {
'baseApi'
])
},
created() {
// crudBook.FetchInitBookBasiceCount().then(res => {
// this.totalBookCount = res
// }).catch(err => {
// console.log(err)
// })
},
methods: {
[CRUD.HOOK.beforeRefresh]() {
if (this.status === null) {
@ -206,6 +235,24 @@ export default {
console.log(crud.form)
return true
},
handleSearch() {
if (this.search) {
this.isResult = true
this.keyWord = this.search
this.crud.toQuery()
} else {
this.$message({ message: '请输入检索关键字段', type: 'error', offset: 8 })
}
},
toSearch() {
if (this.keyWord) {
this.search = ''
this.isResult = true
this.crud.toQuery()
} else {
this.$message({ message: '请输入检索关键字段', type: 'error', offset: 8 })
}
},
searchChange(val) {
if (val) {
this.keyWord = ''
@ -217,10 +264,12 @@ export default {
}
},
resetQuery() {
this.search = ''
this.keyWord = ''
this.crud.query[this.optionVal] = this.keyWord
this.status = null
this.crud.toQuery()
this.crud.data = []
// this.crud.toQuery()
},
handleCover(value) {
console.log(value)
@ -296,4 +345,92 @@ export default {
height: 180px;
}
}
.search-main{
position: relative;
width: 100%;
height: calc(100vh - 182px);
background: url('~@/assets/images/archives/bg.png') no-repeat;
background-size: 100% 100%;
& span{
display: block;
}
.bg_icon1{
position: absolute;
left: 110px;
top: 400px;
width: 236px;
height: 116px;
background: url('~@/assets/images/archives/ys1.png') no-repeat;
background-size: 100% 100%;
}
.bg_icon2{
position: absolute;
left: 50%;
bottom: 60px;
width: 472px;
height: 377px;
margin-left: -236px;
background: url('~@/assets/images/archives/ys2.png') no-repeat;
background-size: 100% 100%;
}
.bg_icon3{
position: absolute;
right: 240px;
bottom: 40px;
width: 136px;
height: 152px;
background: url('~@/assets/images/archives/ys3.png') no-repeat;
background-size: 100% 100%;
}
.bg_icon4{
position: absolute;
right: 110px;
top: 50%;
width: 170px;
height: 136px;
margin-top: -58px;
background: url('~@/assets/images/archives/ys4.png') no-repeat;
background-size: 100% 100%;
}
}
.search-content{
padding-top: 120px;
h2{
font-size: 40px;
text-align: center;
color: #1C1C1C;
margin-bottom: 40px;
}
}
.common-search{
width: 800px;
margin: 0 auto;
.search-input{
position: relative;
display: flex;
justify-content: space-between;
width: 800px;
height: 54px;
background-color: #fff;
border-radius: 3px;
.input-with-select{
::v-deep .el-input__inner{
width: 664px;
height: 54px !important;
font-size: 14px;
padding: 0 20px;
border: none;
}
}
.el-button{
width: 136px;
background-color: #0348F3;
font-size: 16px;
color: #fff;
border-radius: 0 3px 3px 0;
}
}
}
</style>

6
src/views/visualCheck/bookstore/collection/index.vue

@ -141,7 +141,11 @@
</el-table-column>
<el-table-column prop="floorName" label="所在楼层" />
<el-table-column prop="regionName" label="所在区域" />
<el-table-column prop="gridName" label="所在架位" />
<el-table-column prop="gridName" label="所在架位">
<template slot-scope="scope">
<div>{{ scope.row.gridName | removeQUPrefix }}</div>
</template>
</el-table-column>
<el-table-column prop="collectionName" label="所属馆藏" />
<el-table-column prop="createTime" label="创建日期" :show-overflow-tooltip="true">
<template slot-scope="scope">

15
src/views/visualCheck/checkManage/bookSearch/index.vue

@ -1,5 +1,6 @@
<template>
<div class="app-container row-container">
<div class="head-container">
<div class="head-search">
<!-- 搜索 -->
@ -76,7 +77,6 @@
<!--分页组件-->
<pagination v-if="crud.data.length!==0" />
</div>
<!-- form 功能隐藏待定 -->
<el-dialog append-to-body :close-on-click-modal="false" :modal-append-to-body="false" :before-close="handleCloseDialog" :visible="addBookShelfVisible" title="批量上架">
<span class="dialog-right-top" />
@ -203,7 +203,7 @@
<li><span>所属机构</span>{{ user.fonds.fondsName }}</li>
<li><span>所属楼层</span>{{ positionContent.floorName }}</li>
<li><span>所属区域</span>{{ positionContent.regionName }}</li>
<li><span>所属书架</span>{{ positionContent.gridName }}</li>
<li><span>所属书架</span>{{ positionTitle }}</li>
<li><span>题名</span>{{ positionContent.bookName }}</li>
</ul>
<div class="position-content">
@ -230,7 +230,7 @@
class="data-shelf-cell"
:style="cellStyle"
>
<span class="cell-name">{{ removeAreaPrefix(cell.gridName) }}</span>
<span class="cell-name">{{ cell.gridName | removeMianBeforeRefix }}</span>
</li>
</ul>
</div>
@ -252,6 +252,7 @@ import rrOperation from '@crud/RR.operation'
import pagination from '@crud/Pagination'
import { mapGetters } from 'vuex'
import defaultImg from '@/assets/images/system/default-img.jpg'
import { removeQUPrefix } from '@/utils/index'
const defaultForm = { id: null, floorId: null, regionId: null, shelfId: null, girdId: null }
export default {
@ -265,7 +266,8 @@ export default {
download: false,
group: false,
reset: true
}})
}
})
},
mixins: [presenter(), header(), form(defaultForm), crud(), positionCrud],
data() {
@ -305,6 +307,7 @@ export default {
tabIndex: 0,
defaultImg: defaultImg,
imageUrl: defaultImg
}
},
computed: {
@ -328,6 +331,7 @@ export default {
[CRUD.HOOK.afterValidateCU](crud) {
return false
},
getLocation(row) {
const parts = []
if (row.floorName) {
@ -337,7 +341,7 @@ export default {
parts.push(row.regionName)
}
if (row.gridName) {
parts.push(row.gridName)
parts.push(removeQUPrefix(row.gridName))
}
return parts.length > 0 ? parts.join('-') : '-'
},
@ -535,4 +539,5 @@ export default {
}
}
}
</style>

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

@ -39,7 +39,11 @@
@row-click="clickRowHandler"
>
<el-table-column type="selection" align="center" width="55" />
<el-table-column prop="gridName" label="层位名称" />
<el-table-column prop="gridName" label="层位名称">
<template slot-scope="scope">
{{ scope.row.gridName | removeQUPrefix }}
</template>
</el-table-column>
<el-table-column prop="floorName" label="所属楼层" />
<el-table-column prop="regionName" label="所属区域" />
<el-table-column prop="isCheck" label="盘点开关" align="center">
@ -86,7 +90,7 @@
<li><span>所属机构</span>{{ user.fonds.fondsName }}</li>
<li><span>所属楼层</span>{{ positionContent.floorName }}</li>
<li><span>所属区域</span>{{ positionContent.regionName }}</li>
<li><span>所属书架</span>{{ positionContent.gridName }}</li>
<li><span>所属书架</span>{{ positionTitle }}</li>
</ul>
<div class="position-content">
<div class="position-left">
@ -112,7 +116,7 @@
class="data-shelf-cell"
:style="cellStyle"
>
<span class="cell-name">{{ removeAreaPrefix(cell.gridName) }}</span>
<span class="cell-name">{{ cell.gridName | removeMianBeforeRefix }}</span>
</li>
</ul>
</div>
@ -278,5 +282,4 @@ export default {
margin-right: 20px;
}
}
</style>

20
src/views/visualCheck/checkManage/checkLog/index.vue

@ -11,12 +11,13 @@
<i slot="prefix" class="iconfont icon-zhuangtai" />
<el-option v-for="item in TypeOptions" :key="item.key" :label="item.display_name" :value="item.key" />
</el-select>
<date-range-picker v-model="blurryTime" class="date-item" />
<el-input v-model="query.search" clearable size="small" placeholder="输入单号/备注关键字搜索" prefix-icon="el-icon-search" style="width: 220px;" class="filter-item" @clear="crud.toQuery" @keyup.enter.native="crud.toQuery" />
<rrOperation />
</div>
<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="crud.toAdd">
<i class="iconfont icon-shengchengpandiandan" />
全量盘点
</el-button>
@ -180,7 +181,11 @@
:data="detailTable"
style="width: 100%;"
>
<el-table-column prop="gridName" label="层位架" min-width="180" :show-overflow-tooltip="true" />
<el-table-column prop="gridName" label="层位架" min-width="180" :show-overflow-tooltip="true">
<template slot-scope="scope">
{{ scope.row.gridName | removeQUPrefix }}
</template>
</el-table-column>
<el-table-column prop="floorName" label="楼层" />
<el-table-column prop="regionName" label="区域" min-width="120" />
<el-table-column prop="booksheflCount" label="盘点详情" min-width="280" :show-overflow-tooltip="true">
@ -238,6 +243,7 @@ import crudOperation from '@crud/CRUD.operation'
import rrOperation from '@crud/RR.operation'
import pagination from '@crud/Pagination'
import taskStockLogEcharts from '@/views/components/echarts/taskStockLog.vue'
import DateRangePicker from '@/components/DateRangePicker'
import { mapGetters } from 'vuex'
import { parseTime, saveAs, getBlob } from '@/utils/index'
import qs from 'qs'
@ -245,7 +251,7 @@ import qs from 'qs'
const defaultForm = { stockTypeName: '全量盘点', stockType: 1, stockBill: null, stockRegion: '全部区域', stockGridNum: null, stockGridNumName: null, totalGridNum: null, stockRemarks: null, regionId: null, shelfId: null, gridShelf: null, gridId: null }
export default {
name: 'CheckLog',
components: { crudOperation, rrOperation, pagination, taskStockLogEcharts },
components: { crudOperation, rrOperation, pagination, taskStockLogEcharts, DateRangePicker },
cruds() {
return CRUD({ title: '盘点日志', idField: 'billId', url: 'api/stocktask-task/initStockLogList', crudMethod: { ...crudStockTaskLog }, sort: [], optShow: {
add: false,
@ -273,6 +279,7 @@ export default {
{ key: 5, display_name: '架位盘点' },
{ key: 6, display_name: '层位盘点' }
],
blurryTime: null,
tabIndex: 0,
detailVisible: false,
dbRowData: {},
@ -314,6 +321,13 @@ export default {
},
methods: {
[CRUD.HOOK.beforeRefresh]() {
if (this.blurryTime) {
this.crud.query.startTime = this.blurryTime[0]
this.crud.query.endTime = this.blurryTime[1]
} else {
this.crud.query.startTime = null
this.crud.query.endTime = null
}
},
[CRUD.HOOK.afterRefresh](crud) {
},

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

@ -40,7 +40,7 @@
<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)">
<li v-for="(activity, index) in checkDateLine" :key="index" class="el-timeline-item" style="cursor: pointer;" @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" />
@ -82,8 +82,29 @@
<span class="gird-left-line" />
<span class="gird-right-line" />
<div class="layer-left">
<div class="layer-left-book">
<div
<swiper
ref="swiperListShelf"
class="shelf-swiper"
:options="swiperListShelfOptions"
:auto-update="true"
:auto-destroy="true"
>
<swiper-slide
v-for="(book,i) in item.books"
:key="i"
ref="swiperSlideItem"
:class="['book-item', { 'red-active' : book.bookStatus === '错架'} ,{ 'blue-active' : book.bookStatus === '错序'}]"
>
<span
class="book-name"
@mouseenter="showPopover(index, i, $event)"
@mouseleave="hidePopover"
>{{ book.bookName }}</span>
</swiper-slide>
</swiper>
<!--<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 === '错序'}]"
@ -92,11 +113,11 @@
>
<span class="book-name">{{ book.bookName }}</span>
</div>
</div>
</div> -->
</div>
<div class="layer-right-handle">
<div class="layer-info-header">
<h4>{{ item.gridName }}</h4>
<h4>{{ item.gridName | removeQUPrefix }}</h4>
<!-- <span>2024-11-28 09:46</span> -->
</div>
<div class="layer-right-content">
@ -143,10 +164,9 @@
</div>
<!-- 详情 -->
<el-dialog class="dialog-grid-detail" append-to-body :close-on-click-modal="false" :visible.sync="detailVisible" :title="detailCurrent.gridName +'- 详情'" @close="handleCloseDialog">
<el-dialog class="dialog-grid-detail" append-to-body :close-on-click-modal="false" :visible.sync="detailVisible" :title="detailTitle" @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">
@ -258,7 +278,7 @@ 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'
import { parseTime, saveAs, getBlob, removeQUPrefix, removePrefix } from '@/utils/index'
import { swiper, swiperSlide } from 'vue-awesome-swiper'
import 'swiper/dist/css/swiper.css'
@ -285,6 +305,7 @@ export default {
detailVisible: false,
detailImgVisible: false,
detailTable: [],
detailTitle: '',
detailCurrent: {},
tabdialogIndex: 0,
listLoading: false,
@ -340,7 +361,11 @@ export default {
freeMode: true
},
isCompare: false,
shouldShowResetButton: false
shouldShowResetButton: false,
swiperListShelfOptions: {
slidesPerView: 'auto',
freeMode: true
}
}
},
computed: {
@ -351,6 +376,9 @@ export default {
swiperList() {
return this.$refs.swiperList.$el.swiper
},
swiperListShelf() {
return this.$refs.swiperListShelf.$el.swiper
},
cellStyle: function() {
const h = '76px'
const w = '100%/' + this.rackNum
@ -414,7 +442,7 @@ export default {
}
this.updateParts(dataScreenShelf.gridName)
// /
this.tabListData = [{ name: dataScreenShelf.regionName + ' - ' + this.removeAreaPrefix(dataScreenShelf.gridName) }]
this.tabListData = [{ name: dataScreenShelf.regionName + ' - ' + removePrefix(dataScreenShelf.gridName) }]
// dataScreenShelf.rowType === 1
// ? dataScreenShelf.toward === 1
@ -445,20 +473,6 @@ export default {
})
}
},
removeQUPrefix(gridNames) {
const index = gridNames.indexOf('区')
if (index !== -1) {
return gridNames.substring(index + 1)
}
return gridNames
},
removeAreaPrefix(gridNames) {
const index = gridNames.indexOf('面')
if (index !== -1) {
return gridNames.substring(0, index + 1)
}
return gridNames
},
getLocation(row) {
const parts = []
if (row.floorName) {
@ -468,7 +482,7 @@ export default {
parts.push(row.regionName)
}
if (row.gridName) {
parts.push(row.gridName)
parts.push(removeQUPrefix(row.gridName))
}
return parts.length > 0 ? parts.join('-') : '-'
},
@ -540,8 +554,8 @@ export default {
this.$refs.eform.form.gridShelf = null
this.$refs.eform.form.gridId = item.id
this.$refs.eform.form.toward = this.getGridToward
this.$refs.eform.form.stockRegion = this.removeQUPrefix(item.gridName)
this.$refs.eform.gridStockRegion = this.floorName + '-' + this.regionName + '-' + this.removeQUPrefix(item.gridName)
this.$refs.eform.form.stockRegion = removeQUPrefix(item.gridName)
this.$refs.eform.gridStockRegion = this.floorName + '-' + this.regionName + '-' + removeQUPrefix(item.gridName)
// } else {
// this.$message({ message: '', type: 'error', offset: 8 })
// }
@ -573,6 +587,12 @@ export default {
handleDetail(item) {
this.detailVisible = true
this.detailTable = item.books
if (this.checkDateLine.length !== 0) {
this.detailTitle = removeQUPrefix(item.gridName) + ' - 详情 - ' + (this.checkDateLine[this.timeIndex].stockType === 0 ? '现在' : this.checkDateLine[this.timeIndex].endTime)
} else {
this.detailTitle = removeQUPrefix(item.gridName) + ' - 详情'
}
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`
@ -773,9 +793,8 @@ export default {
}
FetchShowByBillIdAndShelfIdAndGridShelf(params).then(res => {
this.shelfAllGridData.forEach((item) => {
console.log(item.id)
const gridId = item.id
if (res.hasOwnProperty(gridId)) {
if (res.gridShelfList.hasOwnProperty(gridId)) {
this.$set(item, 'books', res.gridShelfList[gridId])
}
})
@ -887,6 +906,7 @@ export default {
margin-top: 4px;
overflow: hidden;
overflow-y: scroll;
margin-right: -16px;
}
.gird-layer{
@ -906,7 +926,7 @@ export default {
}
.gird-right-line{
position: absolute;
right: calc(298px);
right: calc(308px);
top: 0;
display: block;
width: 6px;
@ -916,56 +936,56 @@ export default {
z-index: 999;
}
.layer-left{
width: calc(100% - 240px);
width: calc(100% - 220px);
height: 130px;
margin-right: 5px;
padding: 0 16px 0 20px;
padding: 0 10px;
background: url('~@/assets/images/shelf02.png') repeat left top;
background-size: 10% 100%;
overflow: hidden;
overflow-x: scroll;
// 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%;
}
}
}
}
.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: -14px;
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;
width: 320px;
padding: 0 10px;
background-color: #E8F2FF;
margin: 3px 5px;
@ -1139,4 +1159,12 @@ export default {
}
}
}
.shelf-swiper{
::v-deep .swiper-wrapper{
height: 120px;
padding: 0 10px;
// overflow: hidden;
}
}
</style>

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

@ -89,11 +89,12 @@
<i class="update-time">2024-11-28 09:46</i>
</div>
<ul>
<li><p>架位</p><em class="percentage"><i style="color: #fff;">{{ removeAreaPrefix(cell.gridName) }}</i></em></li>
<li><p>架位</p><em class="percentage"><i style="color: #fff;">{{ cell.gridName | removeQuLayerPrefix }}</i></em></li>
<li><p>在架</p><em><i>{{ itemStockData.onShelfNum }}</i></em></li>
<li><p>错架</p><em><i>{{ itemStockData.errorShelfNum }}</i></em> <em class="percentage">{{ itemStockData.errorShelfProbo }}</em></li>
<li><p>错序</p><em><i>{{ itemStockData.errorOrderNum }}</i></em><em class="percentage">{{ itemStockData.errorOrderProbo }}</em></li>
</ul>
<div class="tip-bottom">提示双击查看详情</div>
</div>
</el-popover>
</li>
@ -335,9 +336,6 @@ export default {
'shelfId': this.bookShelfDetails.id
}
},
removeAreaPrefix(gridNames) {
return gridNames.replace(/\d*区|\d*层/g, '')
},
getInitShelfGridByShelfId(shelfId, toward) {
this.listLoading = true
// rowType 1 2

10
src/views/visualCheck/checkManage/positionMixins/index.js

@ -1,5 +1,6 @@
import { FetchInitShelfGridByShelfId, FetchBookShelfDetails } from '@/api/shelf/index'
import defaultImg from '@/assets/images/system/default-img.jpg'
import { removeQUPrefix } from '@/utils/index'
import { mapGetters } from 'vuex'
import { fabric } from 'fabric'
export const positionCrud = {
@ -68,13 +69,6 @@ export const positionCrud = {
},
// 组件共用方法
methods: {
removeAreaPrefix(gridNames) {
const index = gridNames.indexOf('面')
if (index !== -1) {
return gridNames.substring(index + 1)
}
return gridNames
},
handlePosition(row) {
if (this.canvasPreview.lowerCanvasEl) {
this.canvasPreview.clear()
@ -84,7 +78,7 @@ export const positionCrud = {
this.currentMarkData = {}
this.positionVisible = true
this.positionTitle = row.gridName
this.positionTitle = removeQUPrefix(row.gridName)
this.positionContent = row
this.updateParts(row.gridName)

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

@ -7,7 +7,7 @@
<span>架满列表上架率 100% - 80%</span>
</div>
<div v-for="(item,index) in leftData" :key="index" class="statistic-item">
<span class="statistic-item-name">{{ item.gridName }}</span>
<span class="statistic-item-name">{{ item.gridName | removeQUPrefix }}</span>
<el-progress :percentage="item.prop" :stroke-width="36" :color="customColorMethod" />
</div>
</el-card>
@ -16,7 +16,7 @@
<span>架空列表上架率 0% - 50%</span>
</div>
<div v-for="(item,index) in rightData" :key="index" class="statistic-item">
<span class="statistic-item-name">{{ item.gridName }}</span>
<span class="statistic-item-name">{{ item.gridName | removeQUPrefix }}</span>
<el-progress :percentage="item.prop" :stroke-width="36" :color="customColorMethod" />
</div>
</el-card>

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

@ -10,7 +10,11 @@
@row-click="clickRowHandler"
@selection-change="crud.selectionChangeHandler"
>
<el-table-column prop="gridName" label="层位" />
<el-table-column prop="gridName" label="层位">
<template slot-scope="scope">
{{ scope.row.gridName | removeQUPrefix }}
</template>
</el-table-column>
<el-table-column prop="floorName" label="所属楼层" />
<el-table-column prop="regionName" label="所属区域" />
<el-table-column prop="prop" label="在架" align="right">

6
src/views/visualCheck/checkManage/upDownLog/index.vue

@ -52,7 +52,11 @@
<el-table-column prop="bookName" label="题名" />
<el-table-column prop="sortmark" label="索书号" />
<el-table-column prop="barcode" label="条码" />
<el-table-column prop="gridName" label="目标层位" />
<el-table-column prop="gridName" label="目标层位">
<template slot-scope="scope">
{{ scope.row.gridName | removeQUPrefix }}
</template>
</el-table-column>
<el-table-column prop="billNo" label="盘点单号" />
<el-table-column prop="createBy" label="操作者" width="100" />
<el-table-column prop="createTime" label="操作时间">

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

@ -70,8 +70,8 @@
class="swiper-slide-content"
>
<ul class="cabinet-row" :style="rowStyle">
<li v-for="(item,index) in booShelfGrid" :key="index" class="cabinet-cell" :style="cellStyle" :class="{ active: index === cellIndex }" @click="handleCellCurrent(item,index)">
<span>{{ removeAreaPrefix(item.gridName) }}</span>
<li v-for="(shelf,i) in booShelfGrid" :key="i" class="cabinet-cell" :style="cellStyle" :class="{ active: i === cellIndex }" @click="handleCellCurrent(shelf,i)">
<span>{{ shelf.gridName | removeQUPrefix }}</span>
</li>
</ul>
</swiper-slide>
@ -85,7 +85,7 @@
<span v-if="bookSortValue === 'false'" class="row-state other-state">无序倒架</span>
<span v-else class="row-state ing-state">有序倒架</span>
</div>
<h5 class="layer-name">{{ cellInfo.gridName }}</h5>
<h5 class="layer-name">{{ cellInfo.gridName | removeQUPrefix }}</h5>
<div class="layer-code-sort">
<ul>
<!-- I247.58/586 -->

Loading…
Cancel
Save