Browse Source

页面优化完善

master
xuhuajiao 4 months ago
parent
commit
1e2f38af06
  1. 10
      src/api/storeManage/deviceManage/device.js
  2. 11
      src/api/system/zkt.js
  3. 2
      src/router/index.js
  4. 7
      src/router/routers.js
  5. 2
      src/views/archivesManage/archivesCheck/module/addCheck.vue
  6. 2
      src/views/archivesManage/archivesCheck/module/checkDetail.vue
  7. 72
      src/views/archivesManage/archivesList/archivesAnjuan/index.vue
  8. 70
      src/views/archivesManage/archivesList/archivesJuannei/index.vue
  9. 7
      src/views/archivesManage/archivesList/module/archivesInfo/index.vue
  10. 6
      src/views/archivesManage/archivesList/module/packing/index.vue
  11. 4
      src/views/archivesManage/archivesSearch/index.vue
  12. 2
      src/views/archivesManage/archivesSearch/module/detailDialog.vue
  13. 2
      src/views/archivesManage/caseManage/caseList/index-oldPrint.vue
  14. 4
      src/views/archivesManage/caseManage/caseList/index.vue
  15. 2
      src/views/archivesManage/caseManage/caseList/module/detailDialog.vue
  16. 43
      src/views/archivesManage/caseManage/caseList/module/form.vue
  17. 2
      src/views/archivesManage/caseManage/caseList/module/print.vue
  18. 2
      src/views/archivesManage/outInStorage/inStorage/index.vue
  19. 2
      src/views/archivesManage/outInStorage/inStorage/module/handDialog.vue
  20. 2
      src/views/archivesManage/outInStorage/module/detailDialog.vue
  21. 2
      src/views/archivesManage/outInStorage/outInHistory/index.vue
  22. 2
      src/views/archivesManage/outInStorage/outStorage/index.vue
  23. 15
      src/views/components/AccessDoor.vue
  24. 9
      src/views/environmentalScreen/index.js
  25. 11
      src/views/environmentalScreen/index.vue
  26. 861
      src/views/home-old.vue
  27. 422
      src/views/home.vue
  28. 287
      src/views/screenVideo/index.vue
  29. 676
      src/views/storeManage/deviceManage/module/deviceDetail-old.vue
  30. 54
      src/views/storeManage/deviceManage/module/deviceDetail.vue

10
src/api/storeManage/deviceManage/device.js

@ -155,4 +155,12 @@ export function FetchCallExternalStopMove(params) {
}) })
} }
export default { add, edit, del, getSupplier, getDeviceType, getDeviceById, getDesecabinetById, getRotarycabinetById, getDeviceList, FetchIsOnline, FetchInBorrowByQuCol, unbind, FetchCallExternalOpenCol, FetchCallExternalResetCol, FetchCallExternalVent, FetchCallExternalStopMove }
// 根据设备IP查看设备是否在线
export function FetchPingIP(params) {
return request({
url: 'api/device/pingIP' + '?' + qs.stringify(params, { indices: false }),
method: 'get'
})
}
export default { add, edit, del, getSupplier, getDeviceType, getDeviceById, getDesecabinetById, getRotarycabinetById, getDeviceList, FetchIsOnline, FetchInBorrowByQuCol, unbind, FetchCallExternalOpenCol, FetchCallExternalResetCol, FetchCallExternalVent, FetchCallExternalStopMove, FetchPingIP }

11
src/api/system/zkt.js

@ -37,6 +37,15 @@ export function FetchRealTimeZKTLog(params) {
}) })
} }
// 海康门禁日志
export function FetchInitHikDoorLog(params) {
return request({
url: 'api/securitydoor/initHikDoorLog',
method: 'get',
params
})
}
export function FetchHikMajor(params) { export function FetchHikMajor(params) {
return request({ return request({
url: 'api/securitydoor/getHikMajor', url: 'api/securitydoor/getHikMajor',
@ -53,4 +62,4 @@ export function FetchHikMinor(params) {
}) })
} }
export default { add, FetchZKTDoorList, FetchInitZktParam, FetchRealTimeZKTLog, FetchHikMajor, FetchHikMinor }
export default { add, FetchZKTDoorList, FetchInitZktParam, FetchRealTimeZKTLog, FetchInitHikDoorLog, FetchHikMajor, FetchHikMinor }

2
src/router/index.js

@ -9,7 +9,7 @@ import { filterAsyncRouter } from '@/store/modules/permission'
NProgress.configure({ showSpinner: false })// NProgress Configuration NProgress.configure({ showSpinner: false })// NProgress Configuration
const whiteList = ['/login', '/envScreen']// no redirect whitelist
const whiteList = ['/login', '/envScreen', '/videoScreen']// no redirect whitelist
router.beforeEach((to, from, next) => { router.beforeEach((to, from, next) => {
if (to.meta.title) { if (to.meta.title) {

7
src/router/routers.js

@ -60,7 +60,12 @@ export const constantRouterMap = [
}, },
{ {
path: '/envScreen', path: '/envScreen',
component: (resolve) => require(['@/views/environmentalScreen/index'], resolve),
component: (resolve) => require(['@/views/environmentalScreen/index.vue'], resolve),
hidden: true
},
{
path: '/videoScreen',
component: (resolve) => require(['@/views/screenVideo/index.vue'], resolve),
hidden: true hidden: true
} }
] ]

2
src/views/archivesManage/archivesCheck/module/addCheck.vue

@ -133,7 +133,7 @@
<el-table-column prop="depositNum" label="已装" align="center" min-width="56" /> <el-table-column prop="depositNum" label="已装" align="center" min-width="56" />
<el-table-column prop="caseName" label="盒名称" :show-overflow-tooltip="true" align="center" min-width="190" /> <el-table-column prop="caseName" label="盒名称" :show-overflow-tooltip="true" align="center" min-width="190" />
<el-table-column prop="tid" label="TID" align="center" min-width="180" /> <el-table-column prop="tid" label="TID" align="center" min-width="180" />
<el-table-column prop="barcode" label="条形码" align="center" min-width="120" />
<!-- <el-table-column prop="barcode" label="条形码" align="center" min-width="120" /> -->
<el-table-column label="存放位置" align="center" min-width="300"> <el-table-column label="存放位置" align="center" min-width="300">
<template slot-scope="scope"> <template slot-scope="scope">
<span v-if="!scope.row.folderLocationDetails">-</span> <span v-if="!scope.row.folderLocationDetails">-</span>

2
src/views/archivesManage/archivesCheck/module/checkDetail.vue

@ -108,7 +108,7 @@
<el-table-column prop="borrowNum" align="center" label="已借" min-width="60" /> <el-table-column prop="borrowNum" align="center" label="已借" min-width="60" />
<el-table-column prop="caseName" label="盒名称" :show-overflow-tooltip="true" align="center" min-width="190" /> <el-table-column prop="caseName" label="盒名称" :show-overflow-tooltip="true" align="center" min-width="190" />
<el-table-column prop="tid" label="TID" align="center" min-width="220" :show-overflow-tooltip="true" /> <el-table-column prop="tid" label="TID" align="center" min-width="220" :show-overflow-tooltip="true" />
<el-table-column prop="barcode" label="条形码" align="center" min-width="140" :show-overflow-tooltip="true" />
<!-- <el-table-column prop="barcode" label="条形码" align="center" min-width="140" :show-overflow-tooltip="true" /> -->
<el-table-column label="存放位置" align="center" min-width="300"> <el-table-column label="存放位置" align="center" min-width="300">
<template slot-scope="scope"> <template slot-scope="scope">
<span v-if="!scope.row.folderLocationDetails">-</span> <span v-if="!scope.row.folderLocationDetails">-</span>

72
src/views/archivesManage/archivesList/archivesAnjuan/index.vue

@ -40,6 +40,7 @@
<el-button class="filter-item" size="mini" type="success" icon="el-icon-search" @click="getTableList()">搜索</el-button> <el-button class="filter-item" size="mini" type="success" icon="el-icon-search" @click="getTableList()">搜索</el-button>
</div> </div>
<div v-if="!recycleMain.isRecycle" class="archives-handler-btn"> <div v-if="!recycleMain.isRecycle" class="archives-handler-btn">
<!-- 装盒btn 多选 --> <!-- 装盒btn 多选 -->
<!-- <svg-icon icon-class="zhuanghe" /> --> <!-- <svg-icon icon-class="zhuanghe" /> -->
<el-button class="packing-btn iconfont icon-sr-dn-pz" type="primary" :disabled="selectedCategory.isType === 5 ? selections.length === 0 : selections.length !== 1" @click="handlePacking(selections,0)"><svg-icon icon-class="zhuanghe" class="svg-arc-style" />装盒</el-button> <el-button class="packing-btn iconfont icon-sr-dn-pz" type="primary" :disabled="selectedCategory.isType === 5 ? selections.length === 0 : selections.length !== 1" @click="handlePacking(selections,0)"><svg-icon icon-class="zhuanghe" class="svg-arc-style" />装盒</el-button>
@ -47,9 +48,10 @@
<el-button v-if="selectedCategory.isType === 3 || selectedCategory.isType === 2" class="part-btn iconfont" type="primary" :disabled="selections.length !== 1" @click="handlePacking(selections,1)"><svg-icon icon-class="partzhuanghe" class="svg-arc-style" />分卷装盒</el-button> <el-button v-if="selectedCategory.isType === 3 || selectedCategory.isType === 2" class="part-btn iconfont" type="primary" :disabled="selections.length !== 1" @click="handlePacking(selections,1)"><svg-icon icon-class="partzhuanghe" class="svg-arc-style" />分卷装盒</el-button>
<!-- <el-button class="warehousing-btn iconfont" type="primary">入库</el-button> --> <!-- <el-button class="warehousing-btn iconfont" type="primary">入库</el-button> -->
<!-- 借阅btn 多选 --> <!-- 借阅btn 多选 -->
<el-button v-if="selectedCategory.isType !== 3" class="lending-btn iconfont" :disabled="selections.length === 0" type="primary" @click="handleLending"><i class="iconfont icon-chuku-fanbai" style="margin-right: 6px;" />借阅</el-button>
<!-- <el-button v-if="selectedCategory.isType !== 3" class="lending-btn iconfont" :disabled="selections.length === 0" type="primary" @click="handleLending"><i class="iconfont icon-chuku-fanbai" style="margin-right: 6px;" />借阅</el-button> -->
<!-- 绑定标签btn 单选 --> <!-- 绑定标签btn 单选 -->
<el-button v-if="selectedCategory.isType !== 3" class="binding-btn iconfont" type="primary" :disabled="selections.length !== 1" @click="bindingTag(selections)"><svg-icon icon-class="bindbiaoqian" class="svg-arc-style" />绑定标签</el-button> <el-button v-if="selectedCategory.isType !== 3" class="binding-btn iconfont" type="primary" :disabled="selections.length !== 1" @click="bindingTag(selections)"><svg-icon icon-class="bindbiaoqian" class="svg-arc-style" />绑定标签</el-button>
<el-button :loading="codeLoading" class="warehousing-btn iconfont" type="primary" :disabled="selections.length === 0" @click="onPrint(selections)"><svg-icon icon-class="print" class="svg-arc-style" />打印标签</el-button>
</div> </div>
<div ref="printDiv" style="display: none;"> <div ref="printDiv" style="display: none;">
@ -191,6 +193,14 @@
</div> </div>
</el-dialog> </el-dialog>
<el-dialog title="标签打印" :visible.sync="printDialogVisible" width="800px">
<span class="dialog-right-top" />
<span class="dialog-left-bottom" />
<div class="setting-dialog">
<print ref="printComponent" :print-list="printLabelList" />
</div>
</el-dialog>
</div> </div>
</template> </template>
@ -206,10 +216,11 @@ import BindingTagDlg from '@/views/components/BindingTagDlg'
import UploadFile from '../module/uploadFile/index' import UploadFile from '../module/uploadFile/index'
import RestoreArchives from '../module/restoreArchives/index' import RestoreArchives from '../module/restoreArchives/index'
import DeltArchives from '../module/deltArchives/index' import DeltArchives from '../module/deltArchives/index'
import Print from '@/views/archivesManage/caseManage/caseList/module/print'
export default { export default {
name: 'ArchivesAnjuan', name: 'ArchivesAnjuan',
components: { PreviewForm, ArchivesInfo, Packing, BindingTagDlg, UploadFile, RestoreArchives, DeltArchives },
components: { PreviewForm, ArchivesInfo, Packing, BindingTagDlg, UploadFile, RestoreArchives, DeltArchives, Print },
mixins: [ mixins: [
header(), header(),
form({}), form({}),
@ -261,7 +272,10 @@ export default {
anjuanInputSelect: '', anjuanInputSelect: '',
stateOptions: [], stateOptions: [],
isAnjuan: true, // -/ isAnjuan: true, // -/
lengingVisible: false //
lengingVisible: false, //
codeLoading: false,
printDialogVisible: false, //
printLabelList: [] //
} }
}, },
computed: { computed: {
@ -342,6 +356,58 @@ export default {
mounted() { mounted() {
}, },
methods: { methods: {
//
onPrint(res) {
this.codeLoading = true
if (res && res.length !== 0) {
this.printLabelList = res.map(item => {
return {
lsfFileVarList: [
{
lsfFileVar: {
varname: 'barcode', //
// varvalue: '' + item.barcode
// varvalue: '\r\n10000001'
// varvalue: '15000000001'
varvalue: item.archive_no
}
},
{
lsfFileVar: {
varname: 'title',
// varvalue: '' + item.title
// varvalue: '\r\n'
// varvalue: ''
varvalue: item.maintitle
}
},
{
lsfFileVar: {
varname: 'nativePlace',
// varvalue: '\r\n'
// varvalue: ''
varvalue: item.native_place
}
}
]
}
})
//
this.printDialogVisible = true
this.$nextTick(() => {
this.$refs.printComponent.connectprinter()
})
this.codeLoading = false
} else {
this.$message({
message: '无相关可打印条码数据!',
type: 'warning'
})
this.codeLoading = false
}
},
// /query // /query
resetQuery() { resetQuery() {
if (this.selectedCategory.isType === 5) { if (this.selectedCategory.isType === 5) {

70
src/views/archivesManage/archivesList/archivesJuannei/index.vue

@ -42,9 +42,10 @@
</div> </div>
<div v-if="!recycleMain.isRecycle" class="archives-handler-btn"> <div v-if="!recycleMain.isRecycle" class="archives-handler-btn">
<!-- 借阅btn 多选 --> <!-- 借阅btn 多选 -->
<el-button class="lending-btn iconfont" :disabled="selections.length === 0" type="primary" @click="handleLending"><i class="iconfont icon-chuku-fanbai" style="margin-right: 6px;" />借阅</el-button>
<!-- <el-button class="lending-btn iconfont" :disabled="selections.length === 0" type="primary" @click="handleLending"><i class="iconfont icon-chuku-fanbai" style="margin-right: 6px;" />借阅</el-button> -->
<!-- 绑定标签btn 单选 --> <!-- 绑定标签btn 单选 -->
<el-button class="binding-btn iconfont" type="primary" :disabled="selections.length !== 1" @click="bindingTag(selections)"><svg-icon icon-class="bindbiaoqian" class="svg-arc-style" />绑定标签</el-button> <el-button class="binding-btn iconfont" type="primary" :disabled="selections.length !== 1" @click="bindingTag(selections)"><svg-icon icon-class="bindbiaoqian" class="svg-arc-style" />绑定标签</el-button>
<el-button :loading="codeLoading" class="warehousing-btn iconfont" type="primary" :disabled="selections.length === 0" @click="onPrint(selections)"><svg-icon icon-class="print" class="svg-arc-style" />打印标签</el-button>
</div> </div>
<div ref="printDiv" style="display: none;"> <div ref="printDiv" style="display: none;">
@ -183,6 +184,13 @@
</div> </div>
</div> </div>
</el-dialog> </el-dialog>
<el-dialog title="标签打印" :visible.sync="printDialogVisible" width="800px">
<span class="dialog-right-top" />
<span class="dialog-left-bottom" />
<div class="setting-dialog">
<print ref="printComponent" :print-list="printLabelList" />
</div>
</el-dialog>
</div> </div>
</template> </template>
@ -198,9 +206,11 @@ import UploadFile from '../module/uploadFile/index'
import RestoreArchives from '../module/restoreArchives/index' import RestoreArchives from '../module/restoreArchives/index'
import DeltArchives from '../module/deltArchives/index' import DeltArchives from '../module/deltArchives/index'
import { FetchIsExistBorrow, FetchAddArchivesWaitRegister } from '@/api/archivesManage/lendManage' import { FetchIsExistBorrow, FetchAddArchivesWaitRegister } from '@/api/archivesManage/lendManage'
import Print from '@/views/archivesManage/caseManage/caseList/module/print'
export default { export default {
name: 'ArchivesJuannei', name: 'ArchivesJuannei',
components: { PreviewForm, ArchivesInfo, BindingTagDlg, UploadFile, RestoreArchives, DeltArchives },
components: { PreviewForm, ArchivesInfo, BindingTagDlg, UploadFile, RestoreArchives, DeltArchives, Print },
mixins: [ mixins: [
header(), header(),
form({}), form({}),
@ -257,7 +267,10 @@ export default {
{ value: '4', label: '在库' }, { value: '4', label: '在库' },
{ value: '5', label: '待借' }, { value: '5', label: '待借' },
{ value: '6', label: '已借' } { value: '6', label: '已借' }
]
],
codeLoading: false,
printDialogVisible: false, //
printLabelList: [] //
} }
}, },
computed: { computed: {
@ -292,6 +305,57 @@ export default {
mounted() { mounted() {
}, },
methods: { methods: {
//
onPrint(res) {
this.codeLoading = true
if (res && res.length !== 0) {
this.printLabelList = res.map(item => {
return {
lsfFileVarList: [
{
lsfFileVar: {
varname: 'barcode', //
// varvalue: '' + item.barcode
// varvalue: '\r\n10000001'
// varvalue: '15000000001'
varvalue: item.archive_no
}
},
{
lsfFileVar: {
varname: 'title',
// varvalue: '' + item.title
// varvalue: '\r\n'
// varvalue: ''
varvalue: item.maintitle
}
},
{
lsfFileVar: {
varname: 'nativePlace',
// varvalue: '\r\n'
// varvalue: ''
varvalue: item.native_place
}
}
]
}
})
//
this.printDialogVisible = true
this.$nextTick(() => {
this.$refs.printComponent.connectprinter()
})
this.codeLoading = false
} else {
this.$message({
message: '无相关可打印条码数据!',
type: 'warning'
})
this.codeLoading = false
}
},
stateSelect(val) { stateSelect(val) {
this.page.page = 1 this.page.page = 1
this.query.queryType = val this.query.queryType = val

7
src/views/archivesManage/archivesList/module/archivesInfo/index.vue

@ -108,13 +108,18 @@ export default {
}, },
methods: { methods: {
getDetial(rowId, searchCategoryId) { getDetial(rowId, searchCategoryId) {
const params = { const params = {
categoryId: searchCategoryId || this.categoryId, categoryId: searchCategoryId || this.categoryId,
archivesId: rowId archivesId: rowId
} }
FetchArchivesDetails(params).then(data => { FetchArchivesDetails(params).then(data => {
this.archivesDetailsData = data
this.archivesDetailsData = data.filter(item => {
return item.fieldName !== 'barcode'
})
// this.archivesDetailsData = data
console.log('archivesDetailsData', this.archivesDetailsData)
// / // /
this.archivesDetailsData.forEach(item => { this.archivesDetailsData.forEach(item => {
if (item.fieldName === 'borrow_type') { if (item.fieldName === 'borrow_type') {

6
src/views/archivesManage/archivesList/module/packing/index.vue

@ -37,7 +37,7 @@
<el-table-column prop="depositNum" label="已装" min-width="100" align="center" /> <el-table-column prop="depositNum" label="已装" min-width="100" align="center" />
<el-table-column prop="caseName" label="盒名称" min-width="60" align="center" /> <el-table-column prop="caseName" label="盒名称" min-width="60" align="center" />
<el-table-column prop="tid" label="TID" min-width="120" align="center" /> <el-table-column prop="tid" label="TID" min-width="120" align="center" />
<el-table-column prop="barcode" label="条形码" min-width="120" align="center" />
<!-- <el-table-column prop="barcode" label="条形码" min-width="120" align="center" /> -->
<el-table-column prop="create_date" label="操作" min-width="100" align="center"> <el-table-column prop="create_date" label="操作" min-width="100" align="center">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button class="packing-handle-btn iconfont" @click="handleCartoning(scope.row)"><svg-icon icon-class="zhuanghe" class="svg-arc-style" />装盒</el-button> <el-button class="packing-handle-btn iconfont" @click="handleCartoning(scope.row)"><svg-icon icon-class="zhuanghe" class="svg-arc-style" />装盒</el-button>
@ -58,7 +58,7 @@
<el-table-column prop="depositNum" label="已装" width="60" align="center" /> <el-table-column prop="depositNum" label="已装" width="60" align="center" />
<el-table-column prop="caseName" label="盒名称" show-overflow-tooltip align="center" /> <el-table-column prop="caseName" label="盒名称" show-overflow-tooltip align="center" />
<el-table-column prop="tid" label="TID" show-overflow-tooltip align="center" /> <el-table-column prop="tid" label="TID" show-overflow-tooltip align="center" />
<el-table-column prop="barcode" label="条形码" show-overflow-tooltip align="center" />
<!-- <el-table-column prop="barcode" label="条形码" show-overflow-tooltip align="center" /> -->
<el-table-column prop="create_date" label="操作" align="center"> <el-table-column prop="create_date" label="操作" align="center">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button class="packing-handle-btn iconfont" @click="handlePartParking(scope.row,scope.$index)"><svg-icon icon-class="zhuanghe" class="svg-arc-style" />装盒</el-button> <el-button class="packing-handle-btn iconfont" @click="handlePartParking(scope.row,scope.$index)"><svg-icon icon-class="zhuanghe" class="svg-arc-style" />装盒</el-button>
@ -78,7 +78,7 @@
<el-table-column prop="depositNum" label="已装" width="60" align="center" /> <el-table-column prop="depositNum" label="已装" width="60" align="center" />
<el-table-column prop="caseName" label="盒名称" show-overflow-tooltip align="center" /> <el-table-column prop="caseName" label="盒名称" show-overflow-tooltip align="center" />
<el-table-column prop="tid" label="TID" show-overflow-tooltip align="center" /> <el-table-column prop="tid" label="TID" show-overflow-tooltip align="center" />
<el-table-column prop="barcode" label="条形码" show-overflow-tooltip align="center" />
<!-- <el-table-column prop="barcode" label="条形码" show-overflow-tooltip align="center" /> -->
<el-table-column prop="create_date" label="操作" align="center"> <el-table-column prop="create_date" label="操作" align="center">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button class="packing-recall-btn iconfont" @click="cancelParking(scope.row,scope.$index)"><svg-icon icon-class="chehui" class="svg-arc-style" />撤销</el-button> <el-button class="packing-recall-btn iconfont" @click="cancelParking(scope.row,scope.$index)"><svg-icon icon-class="chehui" class="svg-arc-style" />撤销</el-button>

4
src/views/archivesManage/archivesSearch/index.vue

@ -33,8 +33,8 @@
</div> </div>
<div v-if="this.$route.path.indexOf('dashboard') === -1" class="search-result"> <div v-if="this.$route.path.indexOf('dashboard') === -1" class="search-result">
<div v-show="isShow" class="search-title"> <div v-show="isShow" class="search-title">
<el-button v-if="resNum !== 0" class="lending-btn iconfont" :disabled="selections.length === 0" type="primary" @click="handleLending"><i class="iconfont icon-chuku-fanbai" style="margin-right: 6px;" />借阅</el-button>
<p v-else class="search-res-left">检索结果</p>
<!-- <el-button v-if="resNum !== 0" class="lending-btn iconfont" :disabled="selections.length === 0" type="primary" @click="handleLending"><i class="iconfont icon-chuku-fanbai" style="margin-right: 6px;" />借阅</el-button> -->
<p v-if="resNum === 0" class="search-res-left">检索结果</p>
<p :class="{'search-res-num' : resNum !== 0 }">本次检索结果共计{{ resNum }}条数据</p> <p :class="{'search-res-num' : resNum !== 0 }">本次检索结果共计{{ resNum }}条数据</p>
<el-checkbox v-if="resNum !== 0" v-model="fixedStatusBar">隐藏状态栏</el-checkbox> <el-checkbox v-if="resNum !== 0" v-model="fixedStatusBar">隐藏状态栏</el-checkbox>
</div> </div>

2
src/views/archivesManage/archivesSearch/module/detailDialog.vue

@ -63,7 +63,7 @@
<span :class="['color-white', rowData.borrow_type ? 'row-state row-lending' : '' ]">{{ rowData.borrow_type | borrowStatus }}</span> <span :class="['color-white', rowData.borrow_type ? 'row-state row-lending' : '' ]">{{ rowData.borrow_type | borrowStatus }}</span>
</p> </p>
</div> </div>
<p class="sin-row"><span class="color-blue">条形码</span><span class="color-white">{{ rowData.barcode }}</span></p>
<!-- <p class="sin-row"><span class="color-blue">条形码</span><span class="color-white">{{ rowData.barcode }}</span></p> -->
</div> </div>
</div> </div>
<!-- 元数据 --> <!-- 元数据 -->

2
src/views/archivesManage/caseManage/caseList/index-oldPrint.vue

@ -51,7 +51,7 @@
<el-table-column prop="depositNum" label="已装" align="center" min-width="56" /> <el-table-column prop="depositNum" label="已装" align="center" min-width="56" />
<el-table-column prop="caseName" label="盒名称" :show-overflow-tooltip="true" align="center" min-width="150" /> <el-table-column prop="caseName" label="盒名称" :show-overflow-tooltip="true" align="center" min-width="150" />
<el-table-column prop="tid" label="TID" align="center" min-width="180" /> <el-table-column prop="tid" label="TID" align="center" min-width="180" />
<el-table-column prop="barcode" label="条形码" align="center" min-width="120" />
<!-- <el-table-column prop="barcode" label="条形码" align="center" min-width="120" /> -->
<el-table-column label="存放位置" align="center" min-width="300"> <el-table-column label="存放位置" align="center" min-width="300">
<template slot-scope="scope"> <template slot-scope="scope">
<span v-if="!scope.row.folderLocationDetails">-</span> <span v-if="!scope.row.folderLocationDetails">-</span>

4
src/views/archivesManage/caseManage/caseList/index.vue

@ -18,7 +18,7 @@
<template v-slot:rightButtonGroup> <template v-slot:rightButtonGroup>
<div class="archives-handler-btn"> <div class="archives-handler-btn">
<!-- 批量打印条形码 --> <!-- 批量打印条形码 -->
<el-button :loading="codeLoading" class="warehousing-btn iconfont" type="primary" :disabled="crud.selections.length === 0" @click="onPrint(crud.selections)"><svg-icon icon-class="print" class="svg-arc-style" />批量打印条形码</el-button>
<!-- <el-button :loading="codeLoading" class="warehousing-btn iconfont" type="primary" :disabled="crud.selections.length === 0" @click="onPrint(crud.selections)"><svg-icon icon-class="print" class="svg-arc-style" />批量打印条形码</el-button> -->
<el-button :loading="contentLoading" class="part-btn iconfont" type="primary" :disabled="crud.selections.length !== 1" @click="getPrintData"><svg-icon icon-class="print" class="svg-arc-style" />打印目录</el-button> <el-button :loading="contentLoading" class="part-btn iconfont" type="primary" :disabled="crud.selections.length !== 1" @click="getPrintData"><svg-icon icon-class="print" class="svg-arc-style" />打印目录</el-button>
<el-button class="packing-btn iconfont icon-chaihe-fanbai" type="primary" :disabled="crud.selections.length === 0" @click="openCase(crud.selections)">拆盒</el-button> <el-button class="packing-btn iconfont icon-chaihe-fanbai" type="primary" :disabled="crud.selections.length === 0" @click="openCase(crud.selections)">拆盒</el-button>
<el-button class="binding-btn iconfont icon-bangding-fanbai" type="primary" :disabled="crud.selections.length !== 1" @click="bindingTag(crud.selections)">绑定标签</el-button> <el-button class="binding-btn iconfont icon-bangding-fanbai" type="primary" :disabled="crud.selections.length !== 1" @click="bindingTag(crud.selections)">绑定标签</el-button>
@ -52,7 +52,7 @@
<el-table-column prop="depositNum" label="已装" align="center" min-width="56" /> <el-table-column prop="depositNum" label="已装" align="center" min-width="56" />
<el-table-column prop="caseName" label="盒名称" :show-overflow-tooltip="true" align="center" min-width="150" /> <el-table-column prop="caseName" label="盒名称" :show-overflow-tooltip="true" align="center" min-width="150" />
<el-table-column prop="tid" label="TID" align="center" min-width="180" /> <el-table-column prop="tid" label="TID" align="center" min-width="180" />
<el-table-column prop="barcode" label="条形码" align="center" min-width="120" />
<!-- <el-table-column prop="barcode" label="条形码" align="center" min-width="120" /> -->
<el-table-column label="存放位置" align="center" min-width="300"> <el-table-column label="存放位置" align="center" min-width="300">
<template slot-scope="scope"> <template slot-scope="scope">
<span v-if="!scope.row.folderLocationDetails">-</span> <span v-if="!scope.row.folderLocationDetails">-</span>

2
src/views/archivesManage/caseManage/caseList/module/detailDialog.vue

@ -7,7 +7,7 @@
<div style="padding:0 10px"> <div style="padding:0 10px">
<div class="dpflex"> <div class="dpflex">
<p class="left"><span class="color-blue">盒名称</span><span class="color-white">{{ rowData.caseName }}</span></p> <p class="left"><span class="color-blue">盒名称</span><span class="color-white">{{ rowData.caseName }}</span></p>
<p class="right"><span class="color-blue">盒条码</span><span class="color-white">{{ rowData.barcode }}</span></p>
<!-- <p class="right"><span class="color-blue">盒条码</span><span class="color-white">{{ rowData.barcode }}</span></p> -->
</div> </div>
<div class="dpflex"> <div class="dpflex">
<p class="left"><span class="color-blue">存放位置</span> <p class="left"><span class="color-blue">存放位置</span>

43
src/views/archivesManage/caseManage/caseList/module/form.vue

@ -7,9 +7,9 @@
<el-form-item label="盒名称" prop="caseName"> <el-form-item label="盒名称" prop="caseName">
<el-input v-model="form.caseName" style="width: 370px;" /> <el-input v-model="form.caseName" style="width: 370px;" />
</el-form-item> </el-form-item>
<el-form-item label="条形码" prop="barcode">
<!-- <el-form-item label="条形码" prop="barcode">
<el-input v-model="form.barcode" style="width: 370px;" :disabled="crud.status.edit" /> <el-input v-model="form.barcode" style="width: 370px;" :disabled="crud.status.edit" />
</el-form-item>
</el-form-item> -->
</el-form> </el-form>
<div slot="footer" class="dialog-footer"> <div slot="footer" class="dialog-footer">
<el-button :loading="crud.status.cu === 2" type="primary" @click="crud.submitCU"> <el-button :loading="crud.status.cu === 2" type="primary" @click="crud.submitCU">
@ -22,12 +22,13 @@
<script> <script>
import { form } from '@crud/crud' import { form } from '@crud/crud'
import { caseNameIsRepeat, barcodeIsRepeat } from '@/api/archivesManage/caseManage'
// barcodeIsRepeat
import { caseNameIsRepeat } from '@/api/archivesManage/caseManage'
const defaultForm = { const defaultForm = {
id: null, id: null,
caseName: null,
barcode: null
caseName: null
// barcode: null
} }
export default { export default {
mixins: [form(defaultForm)], mixins: [form(defaultForm)],
@ -45,27 +46,27 @@ export default {
}) })
} }
} }
var checkBarcode = (rule, value, callback) => {
if (value) {
barcodeIsRepeat({ caseId: this.form.id, barcode: value }).then((res) => {
if (res) {
callback(new Error('条形码重复'))
} else {
callback()
}
})
} else {
callback()
}
}
// var checkBarcode = (rule, value, callback) => {
// if (value) {
// barcodeIsRepeat({ caseId: this.form.id, barcode: value }).then((res) => {
// if (res) {
// callback(new Error(''))
// } else {
// callback()
// }
// })
// } else {
// callback()
// }
// }
return { return {
rules: { rules: {
caseName: [ caseName: [
{ validator: checkCaseName, trigger: 'blur' } { validator: checkCaseName, trigger: 'blur' }
],
barcode: [
{ validator: checkBarcode, trigger: 'blur' }
] ]
// barcode: [
// { validator: checkBarcode, trigger: 'blur' }
// ]
} }
} }
} }

2
src/views/archivesManage/caseManage/caseList/module/print.vue

@ -62,7 +62,7 @@ export default {
} }
}, },
created() { created() {
const ZMINConfig = process.env.NODE_ENV === 'production' ? window.g.ZMINConfig : { ip: '127.0.0.1', port: '1808', filePath: '/home/it0/zmin/新标签01.lsf' }
const ZMINConfig = process.env.NODE_ENV === 'production' ? window.g.ZMINConfig : { ip: '127.0.0.1', port: '1808', filePath: '/home/it0/mb/mb01.lsf' }
console.log('ZMINConfig', ZMINConfig) console.log('ZMINConfig', ZMINConfig)
this.serverIP = ZMINConfig.ip this.serverIP = ZMINConfig.ip

2
src/views/archivesManage/outInStorage/inStorage/index.vue

@ -52,7 +52,7 @@
<el-table-column prop="depositNum" align="center" label="已装" min-width="80" /> <el-table-column prop="depositNum" align="center" label="已装" min-width="80" />
<el-table-column prop="caseName" align="center" label="盒名称" min-width="150" /> <el-table-column prop="caseName" align="center" label="盒名称" min-width="150" />
<el-table-column prop="tid" align="center" label="TID" min-width="200" /> <el-table-column prop="tid" align="center" label="TID" min-width="200" />
<el-table-column prop="barcode" align="center" label="条形码" width="150" />
<!-- <el-table-column prop="barcode" align="center" label="条形码" width="150" /> -->
<el-table-column prop="folderLocationDetails" align="center" label="存放位置" min-width="260"> <el-table-column prop="folderLocationDetails" align="center" label="存放位置" min-width="260">
<template slot-scope="scope"> <template slot-scope="scope">
<div v-if="scope.row.folderLocationDetails && scope.row.folderLocationDetails.includes(',')"> <div v-if="scope.row.folderLocationDetails && scope.row.folderLocationDetails.includes(',')">

2
src/views/archivesManage/outInStorage/inStorage/module/handDialog.vue

@ -12,7 +12,7 @@
<el-table-column type="index" align="center" label="序号" width="60" /> <el-table-column type="index" align="center" label="序号" width="60" />
<el-table-column prop="caseName" align="center" label="盒名称" width="200" /> <el-table-column prop="caseName" align="center" label="盒名称" width="200" />
<el-table-column prop="tid" align="center" label="TID" width="180" /> <el-table-column prop="tid" align="center" label="TID" width="180" />
<el-table-column prop="barcode" align="center" label="条形码" width="140" />
<!-- <el-table-column prop="barcode" align="center" label="条形码" width="140" /> -->
<el-table-column prop="folderLocationDetails" align="center" label="存放位置" width="300"> <el-table-column prop="folderLocationDetails" align="center" label="存放位置" width="300">
<template v-if="scope.row.folderLocationDetails !== null" slot-scope="scope"> <template v-if="scope.row.folderLocationDetails !== null" slot-scope="scope">
<div v-if="scope.row.folderLocationDetails.includes(',')"> <div v-if="scope.row.folderLocationDetails.includes(',')">

2
src/views/archivesManage/outInStorage/module/detailDialog.vue

@ -17,7 +17,7 @@
</p> </p>
</div> </div>
<div class="dpflex"> <div class="dpflex">
<p class="left"><span class="color-blue">条形码:</span><span v-if="rowData.barcode" class="color-white">{{ rowData.barcode }}</span></p>
<!-- <p class="left"><span class="color-blue">条形码:</span><span v-if="rowData.barcode" class="color-white">{{ rowData.barcode }}</span></p> -->
<p class="right"><span class="color-blue">TID:</span><span class="color-white">{{ rowData.tid }}</span></p> <p class="right"><span class="color-blue">TID:</span><span class="color-white">{{ rowData.tid }}</span></p>
</div> </div>
<div class="dpflex"> <div class="dpflex">

2
src/views/archivesManage/outInStorage/outInHistory/index.vue

@ -52,7 +52,7 @@
<el-table-column prop="depositNum" label="已装" align="center" width="80" /> <el-table-column prop="depositNum" label="已装" align="center" width="80" />
<el-table-column prop="caseName" label="盒名称" align="center" min-width="150" /> <el-table-column prop="caseName" label="盒名称" align="center" min-width="150" />
<el-table-column prop="tid" label="TID" align="center" min-width="200" /> <el-table-column prop="tid" label="TID" align="center" min-width="200" />
<el-table-column prop="barcode" label="条形码" align="center" min-width="150" />
<!-- <el-table-column prop="barcode" label="条形码" align="center" min-width="150" /> -->
<el-table-column prop="folderLocationDetails" align="center" label="存放位置" min-width="260"> <el-table-column prop="folderLocationDetails" align="center" label="存放位置" min-width="260">
<template slot-scope="scope"> <template slot-scope="scope">
<div v-if="scope.row.folderLocationDetails && scope.row.folderLocationDetails.includes(',')"> <div v-if="scope.row.folderLocationDetails && scope.row.folderLocationDetails.includes(',')">

2
src/views/archivesManage/outInStorage/outStorage/index.vue

@ -28,7 +28,7 @@
<el-table-column prop="depositNum" label="已装" align="center" min-width="80" /> <el-table-column prop="depositNum" label="已装" align="center" min-width="80" />
<el-table-column prop="caseName" align="center" label="盒名称" min-width="150" /> <el-table-column prop="caseName" align="center" label="盒名称" min-width="150" />
<el-table-column prop="tid" align="center" label="TID" min-width="200" /> <el-table-column prop="tid" align="center" label="TID" min-width="200" />
<el-table-column prop="barcode" label="条形码" align="center" min-width="150" />
<!-- <el-table-column prop="barcode" label="条形码" align="center" min-width="150" /> -->
<el-table-column prop="folderLocationDetails" align="center" label="存放位置" min-width="260"> <el-table-column prop="folderLocationDetails" align="center" label="存放位置" min-width="260">
<template slot-scope="scope"> <template slot-scope="scope">
<div v-if="scope.row.folderLocationDetails && scope.row.folderLocationDetails.includes(',')"> <div v-if="scope.row.folderLocationDetails && scope.row.folderLocationDetails.includes(',')">

15
src/views/components/AccessDoor.vue

@ -8,22 +8,23 @@
</p> </p>
</h3> </h3>
<el-table ref="table" style="min-width: 100%;" :height="height" :data="tableData" class="warehose-el-table" stripe @row-click="toPage"> <el-table ref="table" style="min-width: 100%;" :height="height" :data="tableData" class="warehose-el-table" stripe @row-click="toPage">
<el-table-column prop="createTime" label="时间" align="center" width="100">
<el-table-column prop="time" label="时间" align="center" width="100">
<template slot-scope="scope"> <template slot-scope="scope">
<div>{{ scope.row.createTime | parseTime }}</div>
<div>{{ scope.row.time | parseTime }}</div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="位置" align="center" width="120">
<el-table-column label="姓名" align="center" width="120">
<template slot-scope="scope"> <template slot-scope="scope">
<div>{{ scope.row.deviceName }}</div>
<div>{{ scope.row.name }}</div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="alarmMsg" label="警情" align="center" />
<el-table-column prop="minorName" label="警情" align="center" />
</el-table> </el-table>
</div> </div>
</template> </template>
<script> <script>
import { accessDoor } from '@/api/home/accessDoor/accessDoor'
// import { accessDoor } from '@/api/home/accessDoor/accessDoor'
import { FetchInitHikDoorLog } from '@/api/system/zkt'
import { mapGetters } from 'vuex' import { mapGetters } from 'vuex'
export default { export default {
name: 'AccessDoor', name: 'AccessDoor',
@ -125,7 +126,7 @@ export default {
} }
}, },
getAccessdoor() { getAccessdoor() {
accessDoor({ page: 0, size: 30 }).then((data) => {
FetchInitHikDoorLog({ page: 0, size: 30 }).then((data) => {
if (data.content && data.content.length > 0) { if (data.content && data.content.length > 0) {
this.tableData.splice(0, data.content.length, ...data.content) this.tableData.splice(0, data.content.length, ...data.content)
} }

9
src/views/environmentalScreen/index.js

@ -140,6 +140,15 @@ export const mockIpData = {
// 'dw': 'ppm', // 'dw': 'ppm',
// 'SUBID': 5, // 'SUBID': 5,
// 'TIME': '2025-12-11 13:25:09' // 'TIME': '2025-12-11 13:25:09'
// },
// {
// 'IP': '192.168.99.101:5003',
// 'subName': 'PM10浓度',
// 'WYID': '192.168.99.101:5003_5',
// 'value': '101.00',
// 'dw': 'ppm',
// 'SUBID': 5,
// 'TIME': '2025-12-11 13:25:09'
// } // }
], ],
'timestamp': 1765430551410 'timestamp': 1765430551410

11
src/views/environmentalScreen/index.vue

@ -54,7 +54,8 @@
</div> </div>
<div class="env-main-right"> <div class="env-main-right">
<!-- 门禁记录 --> <!-- 门禁记录 -->
<security-door :height="'calc(100% - 38px)'" style="margin-bottom: 15px;" />
<!-- <security-door :height="'calc(100% - 38px)'" style="margin-bottom: 15px;" /> -->
<AccessDoor :height="'calc(100% - 40px)'" style="margin-bottom: 15px;" />
<!-- 报警记录 --> <!-- 报警记录 -->
<warehouse-warning :height="'calc(100% - 38px)'" /> <warehouse-warning :height="'calc(100% - 38px)'" />
</div> </div>
@ -66,7 +67,8 @@
import { getCurrentTime } from '@/utils/index' import { getCurrentTime } from '@/utils/index'
import lendAcross from '@/views/components/echarts/lendAcross.vue' import lendAcross from '@/views/components/echarts/lendAcross.vue'
import WarehouseWarning from '@/views/components/WarehouseWarning' import WarehouseWarning from '@/views/components/WarehouseWarning'
import SecurityDoor from '@/views/components/SecurityDoor'
// import SecurityDoor from '@/views/components/SecurityDoor'
import AccessDoor from '@/views/components/AccessDoor'
import displayConfigApi from '@/api/storeManage/displayConfig' import displayConfigApi from '@/api/storeManage/displayConfig'
// import thirdApi from '@/api/thirdApi' // import thirdApi from '@/api/thirdApi'
import { statisticsCrud } from '@/views/system/archiveStatistics/mixins/statistics' import { statisticsCrud } from '@/views/system/archiveStatistics/mixins/statistics'
@ -88,7 +90,8 @@ export default {
name: 'EnvironmentalScreen', name: 'EnvironmentalScreen',
components: { components: {
WarehouseWarning, WarehouseWarning,
SecurityDoor,
// SecurityDoor,
AccessDoor,
lendAcross lendAcross
}, },
mixins: [statisticsCrud], mixins: [statisticsCrud],
@ -177,7 +180,7 @@ export default {
const currentIp = this.getNextIp() const currentIp = this.getNextIp()
this.currentDeviceName = this.ipToNameMap[currentIp] || '' this.currentDeviceName = this.ipToNameMap[currentIp] || ''
await this.getRealTimeData(currentIp) await this.getRealTimeData(currentIp)
}, 5000)
}, 10000)
console.log(`启动IP轮询,共${this.allDeviceIds.length}个有效IP:`, this.allDeviceIds) console.log(`启动IP轮询,共${this.allDeviceIds.length}个有效IP:`, this.allDeviceIds)
} }

861
src/views/home-old.vue

@ -0,0 +1,861 @@
<template>
<div class="dashboard-container">
<div class="dashboard-editor-container">
<!-- <github-corner class="github-corner" /> -->
<panel-group />
<!-- <el-row style="background:#fff;padding:16px 16px 0;margin-bottom:32px;">
<line-chart :chart-data="lineChartData" />
</el-row> -->
<el-row :gutter="20" style="margin-bottom:20px;height: 152px;">
<el-col :xs="24" :sm="24" :lg="8">
<!-- search-area -->
<div class="container-left" style="height: 100%;margin: 0; position: relative;">
<span class="right-top-line" />
<span class="left-bottom-line" />
<h3 class=" table-title" style="margin-bottom: 26px;">
<p class="title-arrow">
档案检索
</p>
</h3>
<SearchAcrives :is-home-search="isHomeSearch" />
</div>
</el-col>
<el-col :xs="24" :sm="24" :lg="8">
<div class="container-left" style="height: 100%;margin: 0; position: relative;">
<span class="right-top-line" />
<span class="left-bottom-line" />
<h3 class=" table-title">
<p class="title-arrow">
<i class="iconfont icon-kongqizhiliangshuju" />环境数据
</p>
</h3>
<div class="home-floor-tab">
<p :class="{ 'active-floor': floorEnvIndex == 0 }" @click="changeFloorEnvTab(0)">3楼</p>
<!-- <p :class="{ 'active-floor': floorEnvIndex == 1 }" @click="changeFloorEnvTab(1)">7楼</p> -->
</div>
<el-carousel ref="carouselEnvRef" trigger="click" :interval="10000" indicator-position="none" height="110px" arrow="never" @change="handleEnvChange">
<el-carousel-item>
<div class="warehouse-tab" style="display: flex; justify-content: center; align-items: center; height: calc(100%); ">
<div class="five-bottom">
<!-- <p class="env-title">档案库</p> -->
<ul class="leakage-list">
<li :class="{ 'leakage-warn': topDisplayData.DAK_DIV_TOP_001.curstatus > 0 }">
<p>温度</p>
<span>{{ topDisplayData.DAK_DIV_TOP_001.curValue }}</span>
</li>
<li :class="{ 'leakage-warn': topDisplayData.DAK_DIV_TOP_002.curstatus > 0 }">
<p>湿度</p>
<span>{{ topDisplayData.DAK_DIV_TOP_002.curValue }}</span>
</li>
<li :class="{ 'leakage-warn': topDisplayData.DAK_DIV_TOP_003.curstatus > 0 }">
<p>CO2</p>
<span>{{ topDisplayData.DAK_DIV_TOP_003.curValue }}</span>
</li>
<li :class="{ 'leakage-warn': topDisplayData.DAK_DIV_TOP_005.curstatus > 0 }">
<p>PM2.5</p>
<span>{{ topDisplayData.DAK_DIV_TOP_005.curValue }}</span>
</li>
<li :class="{ 'leakage-warn': topDisplayData.DAK_DIV_TOP_006.curstatus > 0 }">
<p>PM10</p>
<span>{{ topDisplayData.DAK_DIV_TOP_006.curValue }}</span>
</li>
<li :class="{ 'leakage-warn': topDisplayData.DAK_DIV_TOP_004.curstatus > 0 }">
<p>TVOC</p>
<span>{{ topDisplayData.DAK_DIV_TOP_004.curValue }}</span>
</li>
</ul>
</div>
<!-- <div style="display: flex; justify-content:space-between; align-items: center;">
<div class="five-bottom">
<p class="env-title">整理室</p>
<ul class="leakage-list">
<li :class="{ 'leakage-warn': oaoMessage.ZLS_MO_OAO_001.alarmState }">
<p>温度</p>
<span>{{ oaoMessage.ZLS_MO_OAO_001.wendu }}</span>
</li>
<li :class="{ 'leakage-warn': oaoMessage.ZLS_MO_OAO_001.alarmState }">
<p>湿度</p>
<span>{{ oaoMessage.ZLS_MO_OAO_001.sidu }}</span>
</li>
</ul>
</div>
<div class="five-bottom" style="padding-right: 13px;">
<p class="env-title">阅览室</p>
<ul class="leakage-list">
<li :class="{ 'leakage-warn': oaoMessage.YLS_MO_OAO_001.alarmState }">
<p>温度</p>
<span>{{ oaoMessage.YLS_MO_OAO_001.wendu }}</span>
</li>
<li :class="{ 'leakage-warn': oaoMessage.YLS_MO_OAO_001.alarmState}">
<p>湿度</p>
<span>{{ oaoMessage.YLS_MO_OAO_001.sidu }}</span>
</li>
</ul>
</div>
</div> -->
</div>
</el-carousel-item>
<!-- <el-carousel-item>
<div class="warehouse-tab" style="height: calc(100%); padding-left: 15px;">
<div style="display: flex; justify-content: flex-start; align-items: center;">
<p class="env-title">现行<br>文件室</p>
<ul class="leakage-list">
<li :class="{ 'leakage-warn': topDisplayData.XXW_DIV_TOP_001.curstatus > 0 }">
<p>温度</p>
<span>{{ topDisplayData.XXW_DIV_TOP_001.curValue }}</span>
</li>
<li :class="{ 'leakage-warn': topDisplayData.XXW_DIV_TOP_002.curstatus > 0 }">
<p>湿度</p>
<span>{{ topDisplayData.XXW_DIV_TOP_002.curValue }}</span>
</li>
<li :class="{ 'leakage-warn': topDisplayData.XXW_DIV_TOP_003.curstatus > 0 }">
<p>CO2</p>
<span>{{ topDisplayData.XXW_DIV_TOP_003.curValue }}</span>
</li>
<li :class="{ 'leakage-warn': topDisplayData.XXW_DIV_TOP_005.curstatus > 0 }">
<p>PM2.5</p>
<span>{{ topDisplayData.XXW_DIV_TOP_005.curValue }}</span>
</li>
<li :class="{ 'leakage-warn': topDisplayData.XXW_DIV_TOP_006.curstatus > 0 }">
<p>PM10</p>
<span>{{ topDisplayData.XXW_DIV_TOP_006.curValue }}</span>
</li>
<li :class="{ 'leakage-warn': topDisplayData.XXW_DIV_TOP_004.curstatus > 0 }">
<p>TVOC</p>
<span>{{ topDisplayData.XXW_DIV_TOP_004.curValue }}</span>
</li>
</ul>
</div>
<div style="display: flex; justify-content: flex-start; align-items: center;">
<p class="env-title">待销<br>文件室</p>
<ul class="leakage-list">
<li :class="{ 'leakage-warn': topDisplayData.DXW_DIV_TOP_001.curstatus > 0 }">
<p>温度</p>
<span>{{ topDisplayData.DXW_DIV_TOP_001.curValue }}</span>
</li>
<li :class="{ 'leakage-warn': topDisplayData.DXW_DIV_TOP_002.curstatus > 0 }">
<p>湿度</p>
<span>{{ topDisplayData.DXW_DIV_TOP_002.curValue }}</span>
</li>
<li :class="{ 'leakage-warn': topDisplayData.DXW_DIV_TOP_003.curstatus > 0 }">
<p>CO2</p>
<span>{{ topDisplayData.DXW_DIV_TOP_003.curValue }}</span>
</li>
<li :class="{ 'leakage-warn': topDisplayData.DXW_DIV_TOP_005.curstatus > 0 }">
<p>PM2.5</p>
<span>{{ topDisplayData.DXW_DIV_TOP_005.curValue }}</span>
</li>
<li :class="{ 'leakage-warn': topDisplayData.DXW_DIV_TOP_006.curstatus > 0 }">
<p>PM10</p>
<span>{{ topDisplayData.DXW_DIV_TOP_006.curValue }}</span>
</li>
<li :class="{ 'leakage-warn': topDisplayData.DXW_DIV_TOP_004.curstatus > 0 }">
<p>TVOC</p>
<span>{{ topDisplayData.DXW_DIV_TOP_004.curValue }}</span>
</li>
</ul>
</div>
</div>
</el-carousel-item> -->
</el-carousel>
</div>
</el-col>
<el-col :xs="24" :sm="24" :lg="8">
<div class="container-left" style="height: 100%;margin: 0; position: relative;">
<span class="right-top-line" />
<span class="left-bottom-line" />
<h3 class=" table-title">
<p class="title-arrow">
<svg-icon icon-class="a-3Dkufang" class-name="warehouse-svg" />3D库房
</p>
</h3>
<div class="home-floor-tab">
<p :class="{ 'active-floor': floorIndex == 0 }" @click="changeFloorTab(0)">3楼</p>
<!-- <p :class="{ 'active-floor': floorIndex == 1 }" @click="changeFloorTab(1)">7楼</p> -->
</div>
<el-carousel ref="carouselRef" trigger="click" :interval="4000" indicator-position="none" height="110px" arrow="never" @change="handleChange">
<el-carousel-item>
<div class="warehouse-tab">
<ul class="warehouse-nav">
<li @click="changeActiveTab(1,0)">
<span />
<p>全景图</p>
</li>
<!-- <li @click="changeActiveTab(1,1)">
<span />
<p>档案库</p>
</li>
<li @click="changeActiveTab(1,2)">
<span />
<p>整理室</p>
</li>
<li @click="changeActiveTab(1,3)">
<span />
<p>阅览室</p>
</li> -->
</ul>
</div>
</el-carousel-item>
<!-- <el-carousel-item>
<div class="warehouse-tab">
<ul class="warehouse-nav">
<li @click="changeActiveTab(0,4)">
<span />
<p>全景图</p>
</li>
<li @click="changeActiveTab(0,5)">
<span />
<p>现行文件室</p>
</li>
<li @click="changeActiveTab(0,6)">
<span />
<p>待销文件室</p>
</li>
</ul>
</div>
</el-carousel-item> -->
</el-carousel>
</div>
</el-col>
</el-row>
<el-row :gutter="20" style="margin-bottom:20px;height: calc(50vh - 251px);">
<el-col :xs="24" :sm="24" :lg="8">
<!-- 待办事项 -->
<div class="container-wrap">
<span class="right-top-line" />
<span class="left-bottom-line" />
<h3 class="table-title">
<p class="title-arrow">
<svg-icon icon-class="tongzhigonggao" class-name="warehouse-svg" />待办事项
</p>
</h3>
<div style="height: calc(100% - 40px);overflow-y: auto;overflow-x: hidden;">
<ul v-if="waitBorrowerData.length !== 0" class="todo-list">
<li v-for="(item,index) in waitBorrowerData" :key="index" :class="item.title.includes('警告') || item.title.includes('逾期') ? 'warn-info' :''" @click="handleToWaiting(item)">
<el-tooltip class="item" effect="dark" :content="item.title" :enterable="false" placement="top">
<p>{{ item.title }}</p>
</el-tooltip>
<span>{{ item.update_time | parseTime }}</span>
</li>
</ul>
<div v-else class="empty-main" style="height: 100%;">
<svg-icon icon-class="empty" class-name="empty-img" />
<p>暂无数据</p>
</div>
</div>
</div>
</el-col>
<el-col :xs="24" :sm="24" :lg="8">
<!-- 门禁记录 -->
<security-door :height="'calc(100% - 40px)'" />
</el-col>
<el-col :xs="24" :sm="24" :lg="8">
<!-- 报警记录 -->
<warehouse-warning :height="'calc(100% - 40px)'" />
</el-col>
</el-row>
<el-row :gutter="20" style="height: calc(50vh - 251px);">
<el-col :xs="24" :sm="24" :lg="8">
<!-- 档案借阅 -->
<div class="container-wrap">
<span class="right-top-line" />
<span class="left-bottom-line" />
<h3 class="table-title">
<p class="title-arrow">档案借阅</p>
</h3>
<div class="chart-wrapper">
<lend-across :lend-data="lendData" />
</div>
</div>
</el-col>
<el-col :xs="24" :sm="24" :lg="8">
<!-- 档案类别 -->
<div class="container-wrap">
<span class="right-top-line" />
<span class="left-bottom-line" />
<h3 class="table-title">
<p class="title-arrow">档案类别</p>
</h3>
<div class="chart-wrapper">
<cate-pie :cate-data="cateData" />
</div>
</div>
</el-col>
<el-col :xs="24" :sm="24" :lg="8">
<!-- 档案类型 -->
<div class="container-wrap">
<span class="right-top-line" />
<span class="left-bottom-line" />
<h3 class="table-title">
<p class="title-arrow">档案类型</p>
</h3>
<div v-if="typeData.length !== 0" class="chart-wrapper">
<type-pie :type-data="typeData" />
</div>
<div v-else class="empty-main">
<svg-icon icon-class="empty" class-name="empty-img" />
<p>暂无数据</p>
</div>
</div>
</el-col>
</el-row>
</div>
</div>
</template>
<script>
import PanelGroup from './dashboard/PanelGroup'
import lendAcross from '@/views/components/echarts/lendAcross.vue'
import catePie from '@/views/components/echarts/catePie.vue'
import typePie from '@/views/components/echarts/typePie.vue'
import WarehouseWarning from '@/views/components/WarehouseWarning'
import SecurityDoor from '@/views/components/SecurityDoor'
import SearchAcrives from '@/views/archivesManage/archivesSearch/index'
import { statisticsCrud } from '@/views/system/archiveStatistics/mixins/statistics'
import { FetchWaitBorrower } from '@/api/archivesManage/lendManage'
import displayConfigApi from '@/api/storeManage/displayConfig'
import thirdApi from '@/api/thirdApi'
import { mapGetters } from 'vuex'
export default {
name: 'Dashboard',
components: {
WarehouseWarning,
SecurityDoor,
PanelGroup,
lendAcross,
catePie,
typePie,
SearchAcrives
},
mixins: [statisticsCrud],
data() {
return {
waitBorrowerData: [],
floorIndex: 0,
floorEnvIndex: 0,
isHomeSearch: false,
roomId: null,
allDisplayConfigData: [],
displayConfigData: [],
url: '',
allDeviceIds: [],
oaoMessage: {
ZLS_MO_OAO_001: {
show: false,
wendu: '',
sidu: '',
alarmState: 0
},
YLS_MO_OAO_001: {
show: false,
wendu: '',
sidu: '',
alarmState: 0
}
},
topDisplayData: {
DAK_DIV_TOP_001: {
show: false,
curValue: '',
unit: '',
curstatus: 0
},
DAK_DIV_TOP_002: {
show: false,
curValue: '',
unit: '',
curstatus: 0
},
DAK_DIV_TOP_003: {
show: false,
curValue: '',
unit: '',
curstatus: 0
},
DAK_DIV_TOP_004: {
show: false,
curValue: '',
unit: '',
curstatus: 0
},
DAK_DIV_TOP_005: {
show: false,
curValue: '',
unit: '',
curstatus: 0
},
DAK_DIV_TOP_006: {
show: false,
curValue: '',
unit: '',
curstatus: 0
},
// 7F
DXW_DIV_TOP_001: {
show: false,
curValue: '',
unit: '',
curstatus: 0
},
DXW_DIV_TOP_002: {
show: false,
curValue: '',
unit: '',
curstatus: 0
},
DXW_DIV_TOP_003: {
show: false,
curValue: '',
unit: '',
curstatus: 0
},
DXW_DIV_TOP_004: {
show: false,
curValue: '',
unit: '',
curstatus: 0
},
DXW_DIV_TOP_005: {
show: false,
curValue: '',
unit: '',
curstatus: 0
},
DXW_DIV_TOP_006: {
show: false,
curValue: '',
unit: '',
curstatus: 0
},
// 7F /
XXW_DIV_TOP_001: {
show: false,
curValue: '',
unit: '',
curstatus: 0
},
XXW_DIV_TOP_002: {
show: false,
curValue: '',
unit: '',
curstatus: 0
},
XXW_DIV_TOP_003: {
show: false,
curValue: '',
unit: '',
curstatus: 0
},
XXW_DIV_TOP_004: {
show: false,
curValue: '',
unit: '',
curstatus: 0
},
XXW_DIV_TOP_005: {
show: false,
curValue: '',
unit: '',
curstatus: 0
},
XXW_DIV_TOP_006: {
show: false,
curValue: '',
unit: '',
curstatus: 0
}
}
}
},
computed: {
...mapGetters([
'roles'
])
},
async created() {
this.getWaitBorrower()
this.roomId = null
const params = {
storeroomId: null,
isQueryAll: 1
}
this.allDisplayConfigData = await displayConfigApi.list(params)
this.allDisplayConfigData.forEach(element => {
if (element.isDisplay && element.bindState && element.deviceInfo && (element.divPosition.includes('OAO') || element.divPosition.includes('TOP') || element.divPosition.includes('LS'))) {
this.allDeviceIds.push(element.deviceInfo.deviceId)
if (!this.url) {
this.url = 'http://' + element.deviceInfo.deviceIp + ':' + element.deviceInfo.devicePort
}
}
})
this.displayConfigData = this.allDisplayConfigData.filter((item) => { return item.isDisplay && item.bindState && item.deviceInfo && (item.divPosition.includes('OAO') || item.divPosition.includes('TOP') || item.divPosition.includes('LS')) })
await this.getRealTimeData()
},
mounted() {
},
methods: {
handleChange(index) {
this.floorIndex = index
},
handleEnvChange(index) {
this.floorEnvIndex = index
},
changeFloorTab(index) {
this.floorIndex = index
const carousel = this.$refs.carouselRef
carousel.setActiveItem(index)
},
changeFloorEnvTab(index) {
this.floorEnvIndex = index
const carousel = this.$refs.carouselEnvRef
carousel.setActiveItem(index)
},
// handleSetLineChartData(type) {
// this.lineChartData = lineChartData[type]
// },
getWaitBorrower() {
FetchWaitBorrower().then(data => {
if (data) {
this.waitBorrowerData = data
}
})
},
changeActiveTab(floorId, roomId) {
if (this.roles.includes('admin') || this.roles.includes('warehouse3D')) {
this.$router.push({
name: 'warehouse3D',
params: {
floorId: floorId,
roomId: roomId
}
})
} else {
this.$message({
message: '当前账号没有权限',
type: 'warning'
})
}
},
handleToWaiting(item) {
if (this.roles.includes('admin') || this.roles.includes('lendManage:list')) {
// 0
// 1
// 2
// 3
let locationIndex = 0
if (item.title.includes('待借档案')) {
locationIndex = 0
} else if (item.title.includes('借出确认')) {
locationIndex = 1
} else if (item.title.includes('逾期警告')) {
locationIndex = 2
} else if (item.title.includes('即将到期')) {
locationIndex = 2
}
this.$router.push({
name: 'lendManage',
params: {
locationIndex: locationIndex
}
})
} else {
this.$message({
message: '当前账号没有权限',
type: 'warning'
})
}
},
getRealTimeData() {
if (this.allDeviceIds.length > 0) {
thirdApi.getRealTimeData({ ids: this.allDeviceIds, url: this.url }).then((data) => {
// this.oaoMessage.splice(0, this.oaoMessage.length)
this.displayConfigData.forEach(element => {
if (element.divPosition.includes('TOP') && element.deviceSpecParams[0]) {
// div
const result = data.find((item) => {
return item.property_id === element.deviceSpecParams[0].paramId && item.device_id === element.deviceInfo.deviceId
})
if (result) {
this.$set(this.topDisplayData, element.divPosition, {
show: true,
curValue: result.curvalue,
unit: result.unit,
curstatus: result.curstatus
})
} else {
this.$set(this.topDisplayData, element.divPosition, {
show: false
})
}
} else if (element.divPosition.includes('OAO')) {
const wenduParamId = element.deviceSpecParams.find((item) => { return item.paramName === '温度' })?.paramId
const siduParamId = element.deviceSpecParams.find((item) => { return item.paramName === '湿度' })?.paramId
let wendu = {}
let sidu = {}
if (wenduParamId) {
wendu = data.find((item) => {
return item.property_id === wenduParamId && item.device_id === element.deviceInfo.deviceId
})
}
if (siduParamId) {
sidu = data.find((item) => {
return item.property_id === siduParamId && item.device_id === element.deviceInfo.deviceId
})
}
this.$set(this.oaoMessage, element.divPosition, {
show: true,
wendu: (wendu?.curvalue) ? (Math.round(wendu?.curvalue)) : '-',
sidu: (sidu?.curvalue) ? (Math.round(sidu?.curvalue)) : '-',
alarmState: (wendu && wendu.curstatus > 0) || (sidu && sidu.curstatus > 0)
})
}
})
})
}
}
}
}
</script>
<style rel="stylesheet/scss" lang="scss" scoped>
@import "~@/assets/styles/lend-manage.scss";
.dashboard-editor-container {
padding: 20px;
background-color: #031435;
position: relative;
.chart-wrapper {
height: calc(100% - 40px);
}
}
@media (max-width: 1024px) {
.chart-wrapper {
padding: 8px;
}
}
.warehouse-tab {
color: #fff;
.warehouse-nav {
display: flex;
justify-content: space-around;
position: absolute;
bottom: 15px;
z-index: 11;
width: 100%;
padding: 0;
li {
display: flex;
flex-direction: column;
align-items: center;
flex-wrap: nowrap;
align-content: center;
justify-content: center;
height: 90px;
text-align: right;
font-size: 14px;
position: relative;
&:hover {
cursor: pointer;
}
span {
width: 72px;
height: 52px;
margin-bottom: 7px;
}
p {
text-align: left;
}
&:first-child span {
background: url("~@/assets/images/tab_fullview_logo.png") no-repeat;
}
&:nth-child(2) span {
background: url("~@/assets/images/tab_archives_logo.png") no-repeat;
}
&:nth-child(3) span {
background: url("~@/assets/images/tab_collate_logo.png") no-repeat;
}
&:nth-child(4) span {
background: url("~@/assets/images/tab_read_logo.png") no-repeat;
}
}
}
}
.el-col {
height: 100%;
}
.container-left,
.container-right,
.container-wrap,
.el-card,
.header-container-wrap {
min-height: 100%;
}
.warehose-el-table ::v-deep .el-table__header-wrapper {
box-shadow: inset 0px 0px 6px 1px #339cff;
background: none !important;
}
.container-wrap {
min-height: auto;
height: 100%;
// overflow: hidden;
}
.todo-list {
padding: 0 20px;
& li {
height: 42px;
line-height: 42px;
margin-bottom: 10px;
font-size: 13px;
color: #ffffff;
background: #02255f;
box-shadow: inset 0px 0px 6px 1px #339cff;
border-radius: 26px;
opacity: 1;
cursor: pointer;
&.warn-info{
color: #F65163;
box-shadow: inset 0px 0px 15px 1px #f65164;
}
& p {
display: inline-block;
width: calc(100% - 140px);
padding-left: 10px;
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
word-break: break-all;
}
& span {
float: right;
padding-right: 10px;
}
}
}
::v-deep
.el-table--striped
.el-table__body
tr.el-table__row--striped
td.el-table__cell {
background: #02255f;
}
.search-area {
width: 100%;
height: 100%;
margin: 0;
display: flex;
align-items: center;
justify-content: center;
}
::v-deep .search-main{
padding: 0 0 0 20px;
.head-container{
padding: 0;
width: 100% !important;
.search-input {
width: 100% !important;
}
.input-with-select{
width: 100% !important;
}
}
}
.home-floor-tab{
position: absolute;
right: 14px;
top: 10px;
color: #fff;
display: flex;
justify-self: flex-start;
p{
font-size: 14px;
padding:2px 6px;
margin-right: 6px;
color: #339cff;
border: 1px solid #339cff;
border-radius: 4px;
cursor: pointer;
&.active-floor,
&:hover{
color: #fff;
background-color: #113d72;
}
}
}
.icon-kongqizhiliangshuju{
font-size: 14px;
color: #F65163;
margin-right: 6px
}
.env-title{
width: 50px;
height: 40px;
line-height: 20px;
text-align: center;
font-size: 12px;
margin: 10px 10px 0 0;
}
.leakage-list {
display: flex;
justify-content:flex-start;
flex: 1;
text-align: left;
font-size: 10px;
li {
position: relative;
display: flex;
justify-content: flex-start;
flex-wrap: wrap;
align-items: center;
width: 60px;
height: 40px;
border: 1px solid #3581cc;
background-color: #02255f;
border-radius: 2px;
padding: 4px;
margin: 10px 10px 0 0;
font-size: 12px;
&::before {
content: "";
position: absolute;
top: 2px;
right: 2px;
width: 0;
height: 0;
border-color: transparent #339cff;
border-width: 0 4px 4px 0;
border-style: solid;
}
p {
width: 100%;
}
span{
width: 100%;
color: #18B08F;
text-align: right;
}
&.leakage-warn {
border-color: #f65164;
box-shadow: inset 0px 0px 15px 1px #f65164;
color: #f65164;
&::before {
border-color: transparent #f65164;
}
span {
color: #f65164;
}
}
}
}
.five-bottom{
display: flex;
justify-content: flex-start;
align-items: center;
.env-title{
line-height: 40px;
}
}
</style>

422
src/views/home.vue

@ -1,11 +1,7 @@
<template> <template>
<div class="dashboard-container"> <div class="dashboard-container">
<div class="dashboard-editor-container"> <div class="dashboard-editor-container">
<!-- <github-corner class="github-corner" /> -->
<panel-group /> <panel-group />
<!-- <el-row style="background:#fff;padding:16px 16px 0;margin-bottom:32px;">
<line-chart :chart-data="lineChartData" />
</el-row> -->
<el-row :gutter="20" style="margin-bottom:20px;height: 152px;"> <el-row :gutter="20" style="margin-bottom:20px;height: 152px;">
<el-col :xs="24" :sm="24" :lg="8"> <el-col :xs="24" :sm="24" :lg="8">
<!-- search-area --> <!-- search-area -->
@ -31,14 +27,13 @@
</h3> </h3>
<div class="home-floor-tab"> <div class="home-floor-tab">
<p :class="{ 'active-floor': floorEnvIndex == 0 }" @click="changeFloorEnvTab(0)">3楼</p> <p :class="{ 'active-floor': floorEnvIndex == 0 }" @click="changeFloorEnvTab(0)">3楼</p>
<!-- <p :class="{ 'active-floor': floorEnvIndex == 1 }" @click="changeFloorEnvTab(1)">7楼</p> -->
</div> </div>
<el-carousel ref="carouselEnvRef" trigger="click" :interval="10000" indicator-position="none" height="110px" arrow="never" @change="handleEnvChange"> <el-carousel ref="carouselEnvRef" trigger="click" :interval="10000" indicator-position="none" height="110px" arrow="never" @change="handleEnvChange">
<el-carousel-item> <el-carousel-item>
<div class="warehouse-tab" style="display: flex; justify-content: center; align-items: center; height: calc(100%); "> <div class="warehouse-tab" style="display: flex; justify-content: center; align-items: center; height: calc(100%); ">
<div class="five-bottom"> <div class="five-bottom">
<!-- <p class="env-title">档案库</p> --> <!-- <p class="env-title">档案库</p> -->
<ul class="leakage-list">
<!-- <ul class="leakage-list">
<li :class="{ 'leakage-warn': topDisplayData.DAK_DIV_TOP_001.curstatus > 0 }"> <li :class="{ 'leakage-warn': topDisplayData.DAK_DIV_TOP_001.curstatus > 0 }">
<p>温度</p> <p>温度</p>
<span>{{ topDisplayData.DAK_DIV_TOP_001.curValue }}</span> <span>{{ topDisplayData.DAK_DIV_TOP_001.curValue }}</span>
@ -63,100 +58,20 @@
<p>TVOC</p> <p>TVOC</p>
<span>{{ topDisplayData.DAK_DIV_TOP_004.curValue }}</span> <span>{{ topDisplayData.DAK_DIV_TOP_004.curValue }}</span>
</li> </li>
</ul>
</ul> -->
<ul v-if="newAlarm && newAlarm.length !== 0" class="leakage-list">
<li v-for="item in newAlarm" :key="item.SUBID">
<div class="msg-txt">
<p>{{ item.subName }}</p>
<span>{{ item.value }}</span>
</div> </div>
<!-- <div style="display: flex; justify-content:space-between; align-items: center;">
<div class="five-bottom">
<p class="env-title">整理室</p>
<ul class="leakage-list">
<li :class="{ 'leakage-warn': oaoMessage.ZLS_MO_OAO_001.alarmState }">
<p>温度</p>
<span>{{ oaoMessage.ZLS_MO_OAO_001.wendu }}</span>
</li>
<li :class="{ 'leakage-warn': oaoMessage.ZLS_MO_OAO_001.alarmState }">
<p>湿度</p>
<span>{{ oaoMessage.ZLS_MO_OAO_001.sidu }}</span>
</li>
</ul>
</div>
<div class="five-bottom" style="padding-right: 13px;">
<p class="env-title">阅览室</p>
<ul class="leakage-list">
<li :class="{ 'leakage-warn': oaoMessage.YLS_MO_OAO_001.alarmState }">
<p>温度</p>
<span>{{ oaoMessage.YLS_MO_OAO_001.wendu }}</span>
</li>
<li :class="{ 'leakage-warn': oaoMessage.YLS_MO_OAO_001.alarmState}">
<p>湿度</p>
<span>{{ oaoMessage.YLS_MO_OAO_001.sidu }}</span>
</li> </li>
</ul> </ul>
</div> </div>
</div> -->
</div> </div>
</el-carousel-item> </el-carousel-item>
<!-- <el-carousel-item>
<div class="warehouse-tab" style="height: calc(100%); padding-left: 15px;">
<div style="display: flex; justify-content: flex-start; align-items: center;">
<p class="env-title">现行<br>文件室</p>
<ul class="leakage-list">
<li :class="{ 'leakage-warn': topDisplayData.XXW_DIV_TOP_001.curstatus > 0 }">
<p>温度</p>
<span>{{ topDisplayData.XXW_DIV_TOP_001.curValue }}</span>
</li>
<li :class="{ 'leakage-warn': topDisplayData.XXW_DIV_TOP_002.curstatus > 0 }">
<p>湿度</p>
<span>{{ topDisplayData.XXW_DIV_TOP_002.curValue }}</span>
</li>
<li :class="{ 'leakage-warn': topDisplayData.XXW_DIV_TOP_003.curstatus > 0 }">
<p>CO2</p>
<span>{{ topDisplayData.XXW_DIV_TOP_003.curValue }}</span>
</li>
<li :class="{ 'leakage-warn': topDisplayData.XXW_DIV_TOP_005.curstatus > 0 }">
<p>PM2.5</p>
<span>{{ topDisplayData.XXW_DIV_TOP_005.curValue }}</span>
</li>
<li :class="{ 'leakage-warn': topDisplayData.XXW_DIV_TOP_006.curstatus > 0 }">
<p>PM10</p>
<span>{{ topDisplayData.XXW_DIV_TOP_006.curValue }}</span>
</li>
<li :class="{ 'leakage-warn': topDisplayData.XXW_DIV_TOP_004.curstatus > 0 }">
<p>TVOC</p>
<span>{{ topDisplayData.XXW_DIV_TOP_004.curValue }}</span>
</li>
</ul>
</div>
<div style="display: flex; justify-content: flex-start; align-items: center;">
<p class="env-title">待销<br>文件室</p>
<ul class="leakage-list">
<li :class="{ 'leakage-warn': topDisplayData.DXW_DIV_TOP_001.curstatus > 0 }">
<p>温度</p>
<span>{{ topDisplayData.DXW_DIV_TOP_001.curValue }}</span>
</li>
<li :class="{ 'leakage-warn': topDisplayData.DXW_DIV_TOP_002.curstatus > 0 }">
<p>湿度</p>
<span>{{ topDisplayData.DXW_DIV_TOP_002.curValue }}</span>
</li>
<li :class="{ 'leakage-warn': topDisplayData.DXW_DIV_TOP_003.curstatus > 0 }">
<p>CO2</p>
<span>{{ topDisplayData.DXW_DIV_TOP_003.curValue }}</span>
</li>
<li :class="{ 'leakage-warn': topDisplayData.DXW_DIV_TOP_005.curstatus > 0 }">
<p>PM2.5</p>
<span>{{ topDisplayData.DXW_DIV_TOP_005.curValue }}</span>
</li>
<li :class="{ 'leakage-warn': topDisplayData.DXW_DIV_TOP_006.curstatus > 0 }">
<p>PM10</p>
<span>{{ topDisplayData.DXW_DIV_TOP_006.curValue }}</span>
</li>
<li :class="{ 'leakage-warn': topDisplayData.DXW_DIV_TOP_004.curstatus > 0 }">
<p>TVOC</p>
<span>{{ topDisplayData.DXW_DIV_TOP_004.curValue }}</span>
</li>
</ul>
</div>
</div>
</el-carousel-item> -->
</el-carousel> </el-carousel>
</div> </div>
</el-col> </el-col>
@ -181,39 +96,9 @@
<span /> <span />
<p>全景图</p> <p>全景图</p>
</li> </li>
<!-- <li @click="changeActiveTab(1,1)">
<span />
<p>档案库</p>
</li>
<li @click="changeActiveTab(1,2)">
<span />
<p>整理室</p>
</li>
<li @click="changeActiveTab(1,3)">
<span />
<p>阅览室</p>
</li> -->
</ul> </ul>
</div> </div>
</el-carousel-item> </el-carousel-item>
<!-- <el-carousel-item>
<div class="warehouse-tab">
<ul class="warehouse-nav">
<li @click="changeActiveTab(0,4)">
<span />
<p>全景图</p>
</li>
<li @click="changeActiveTab(0,5)">
<span />
<p>现行文件室</p>
</li>
<li @click="changeActiveTab(0,6)">
<span />
<p>待销文件室</p>
</li>
</ul>
</div>
</el-carousel-item> -->
</el-carousel> </el-carousel>
</div> </div>
</el-col> </el-col>
@ -247,7 +132,8 @@
</el-col> </el-col>
<el-col :xs="24" :sm="24" :lg="8"> <el-col :xs="24" :sm="24" :lg="8">
<!-- 门禁记录 --> <!-- 门禁记录 -->
<security-door :height="'calc(100% - 40px)'" />
<!-- <security-door :height="'calc(100% - 40px)'" /> -->
<AccessDoor :height="'calc(100% - 40px)'" />
</el-col> </el-col>
<el-col :xs="24" :sm="24" :lg="8"> <el-col :xs="24" :sm="24" :lg="8">
<!-- 报警记录 --> <!-- 报警记录 -->
@ -309,20 +195,34 @@ import lendAcross from '@/views/components/echarts/lendAcross.vue'
import catePie from '@/views/components/echarts/catePie.vue' import catePie from '@/views/components/echarts/catePie.vue'
import typePie from '@/views/components/echarts/typePie.vue' import typePie from '@/views/components/echarts/typePie.vue'
import WarehouseWarning from '@/views/components/WarehouseWarning' import WarehouseWarning from '@/views/components/WarehouseWarning'
import SecurityDoor from '@/views/components/SecurityDoor'
// import SecurityDoor from '@/views/components/SecurityDoor'
import AccessDoor from '@/views/components/AccessDoor'
import SearchAcrives from '@/views/archivesManage/archivesSearch/index' import SearchAcrives from '@/views/archivesManage/archivesSearch/index'
import { statisticsCrud } from '@/views/system/archiveStatistics/mixins/statistics' import { statisticsCrud } from '@/views/system/archiveStatistics/mixins/statistics'
import { FetchWaitBorrower } from '@/api/archivesManage/lendManage' import { FetchWaitBorrower } from '@/api/archivesManage/lendManage'
import displayConfigApi from '@/api/storeManage/displayConfig'
import thirdApi from '@/api/thirdApi'
// import displayConfigApi from '@/api/storeManage/displayConfig'
// import thirdApi from '@/api/thirdApi'
import alarmApi from '@/api/home/alarm'
// import { allDeviceData, mockIpData } from '@/views/environmentalScreen/index.js'
// // mock
// const mockFetchDataForIP = (params) => {
// return new Promise((resolve) => {
// setTimeout(() => {
// const ip = params.ip
// const result = mockIpData[ip] || { code: 200, message: '', data: [], timestamp: Date.now() }
// resolve(result.data)
// }, 500)
// })
// }
import { mapGetters } from 'vuex' import { mapGetters } from 'vuex'
export default { export default {
name: 'Dashboard', name: 'Dashboard',
components: { components: {
WarehouseWarning, WarehouseWarning,
SecurityDoor,
// SecurityDoor,
AccessDoor,
PanelGroup, PanelGroup,
lendAcross, lendAcross,
catePie, catePie,
@ -391,82 +291,26 @@ export default {
curValue: '', curValue: '',
unit: '', unit: '',
curstatus: 0 curstatus: 0
},
// 7F
DXW_DIV_TOP_001: {
show: false,
curValue: '',
unit: '',
curstatus: 0
},
DXW_DIV_TOP_002: {
show: false,
curValue: '',
unit: '',
curstatus: 0
},
DXW_DIV_TOP_003: {
show: false,
curValue: '',
unit: '',
curstatus: 0
},
DXW_DIV_TOP_004: {
show: false,
curValue: '',
unit: '',
curstatus: 0
},
DXW_DIV_TOP_005: {
show: false,
curValue: '',
unit: '',
curstatus: 0
},
DXW_DIV_TOP_006: {
show: false,
curValue: '',
unit: '',
curstatus: 0
},
// 7F /
XXW_DIV_TOP_001: {
show: false,
curValue: '',
unit: '',
curstatus: 0
},
XXW_DIV_TOP_002: {
show: false,
curValue: '',
unit: '',
curstatus: 0
},
XXW_DIV_TOP_003: {
show: false,
curValue: '',
unit: '',
curstatus: 0
},
XXW_DIV_TOP_004: {
show: false,
curValue: '',
unit: '',
curstatus: 0
},
XXW_DIV_TOP_005: {
show: false,
curValue: '',
unit: '',
curstatus: 0
},
XXW_DIV_TOP_006: {
show: false,
curValue: '',
unit: '',
curstatus: 0
}
} }
},
// FullView
newAlarm: [],
aqiValue: 45,
aqiStatus: '健康',
keepIndicators: [
'二氧化碳',
'甲醛',
'综合气体',
'PM2.5浓度',
'PM10浓度',
'温度',
'湿度',
'空气质量'
],
ipToNameMap: {}, // IP
currentDeviceName: '', //
currentIpIndex: 0, // IP
excludeIpList: ['192.168.99.101:6003'] // IP
} }
}, },
computed: { computed: {
@ -476,26 +320,114 @@ export default {
}, },
async created() { async created() {
this.getWaitBorrower() this.getWaitBorrower()
this.roomId = null
const params = {
storeroomId: null,
isQueryAll: 1
}
this.allDisplayConfigData = await displayConfigApi.list(params)
this.allDisplayConfigData.forEach(element => {
if (element.isDisplay && element.bindState && element.deviceInfo && (element.divPosition.includes('OAO') || element.divPosition.includes('TOP') || element.divPosition.includes('LS'))) {
this.allDeviceIds.push(element.deviceInfo.deviceId)
if (!this.url) {
this.url = 'http://' + element.deviceInfo.deviceIp + ':' + element.deviceInfo.devicePort
}
// console.log('allDeviceData:', allDeviceData)
// this.allDisplayConfigData = allDeviceData
// this.handleDeviceIpList()
//
await alarmApi.FetchYpGetSite().then((data) => {
if (data && data.length > 0) {
this.allDisplayConfigData = data
// IP
this.handleDeviceIpList()
} else {
this.allDisplayConfigData = []
} }
}) })
this.displayConfigData = this.allDisplayConfigData.filter((item) => { return item.isDisplay && item.bindState && item.deviceInfo && (item.divPosition.includes('OAO') || item.divPosition.includes('TOP') || item.divPosition.includes('LS')) })
await this.getRealTimeData()
//
if (this.allDeviceIds.length > 0) {
this.currentDeviceName = this.ipToNameMap[this.allDeviceIds[0]] || ''
await this.getRealTimeData(this.allDeviceIds[0])
console.log('初始加载IP数据:', this.allDeviceIds[0])
} else {
console.warn('无有效设备IP,停止轮询')
this.newAlarm = []
}
}, },
mounted() { mounted() {
if (this.allDeviceIds.length > 0) {
this.dataTimer = setInterval(async() => {
const currentIp = this.getNextIp()
this.currentDeviceName = this.ipToNameMap[currentIp] || ''
await this.getRealTimeData(currentIp)
}, 10000)
console.log(`启动IP轮询,共${this.allDeviceIds.length}个有效IP:`, this.allDeviceIds)
}
}, },
methods: { methods: {
/**
* 处理设备IP列表去重+排除+名称映射
*/
handleDeviceIpList() {
const ipSet = new Set()
this.ipToNameMap = {}
this.allDisplayConfigData.forEach(element => {
const ip = (element.IP || '').trim()
if (ip && !this.excludeIpList.includes(ip)) {
ipSet.add(ip)
this.ipToNameMap[ip] = element.Name || `未知设备(${ip})`
console.log('有效设备IP:', ip, '设备名称:', element.Name)
} else if (this.excludeIpList.includes(ip)) {
console.log('排除指定IP:', ip, '设备名称:', element.Name)
} else if (!ip) {
console.log('过滤空IP:', element.Name)
}
})
this.allDeviceIds = Array.from(ipSet)
},
/**
* 获取下一个轮询IP循环切换
*/
getNextIp() {
if (this.allDeviceIds.length === 0) return ''
const ip = this.allDeviceIds[this.currentIpIndex]
this.currentIpIndex = (this.currentIpIndex + 1) % this.allDeviceIds.length
console.log(`轮询切换 - 当前IP:${ip},下一个索引:${this.currentIpIndex}`)
return ip
},
/**
* 请求指定IP的实时数据过滤+AQI计算
*/
async getRealTimeData(targetIp) {
if (!targetIp) {
this.newAlarm = []
this.currentDeviceName = ''
return
}
try {
console.log(`开始请求IP【${targetIp}】的实时数据(模拟)`)
//
// const data = await mockFetchDataForIP({ ip: targetIp })
//
const data = await alarmApi.FetchDataForIP({ ip: targetIp })
//
const filteredData = data.filter(item =>
this.keepIndicators.includes(item.subName)
)
if (filteredData.length > 0) {
this.newAlarm = filteredData
console.log(`IP【${targetIp}】(${this.currentDeviceName}) 过滤后的数据:`, filteredData)
} else {
this.newAlarm = []
this.aqiValue = 45
this.aqiStatus = '健康'
console.log(`IP【${targetIp}】(${this.currentDeviceName}) 无需要的指标数据`)
}
} catch (error) {
this.newAlarm = []
this.aqiValue = 45
this.aqiStatus = '健康'
this.currentDeviceName = ''
console.error(`IP【${targetIp}】数据请求失败:`, error)
}
},
handleChange(index) { handleChange(index) {
this.floorIndex = index this.floorIndex = index
}, },
@ -566,54 +498,6 @@ export default {
type: 'warning' type: 'warning'
}) })
} }
},
getRealTimeData() {
if (this.allDeviceIds.length > 0) {
thirdApi.getRealTimeData({ ids: this.allDeviceIds, url: this.url }).then((data) => {
// this.oaoMessage.splice(0, this.oaoMessage.length)
this.displayConfigData.forEach(element => {
if (element.divPosition.includes('TOP') && element.deviceSpecParams[0]) {
// div
const result = data.find((item) => {
return item.property_id === element.deviceSpecParams[0].paramId && item.device_id === element.deviceInfo.deviceId
})
if (result) {
this.$set(this.topDisplayData, element.divPosition, {
show: true,
curValue: result.curvalue,
unit: result.unit,
curstatus: result.curstatus
})
} else {
this.$set(this.topDisplayData, element.divPosition, {
show: false
})
}
} else if (element.divPosition.includes('OAO')) {
const wenduParamId = element.deviceSpecParams.find((item) => { return item.paramName === '温度' })?.paramId
const siduParamId = element.deviceSpecParams.find((item) => { return item.paramName === '湿度' })?.paramId
let wendu = {}
let sidu = {}
if (wenduParamId) {
wendu = data.find((item) => {
return item.property_id === wenduParamId && item.device_id === element.deviceInfo.deviceId
})
}
if (siduParamId) {
sidu = data.find((item) => {
return item.property_id === siduParamId && item.device_id === element.deviceInfo.deviceId
})
}
this.$set(this.oaoMessage, element.divPosition, {
show: true,
wendu: (wendu?.curvalue) ? (Math.round(wendu?.curvalue)) : '-',
sidu: (sidu?.curvalue) ? (Math.round(sidu?.curvalue)) : '-',
alarmState: (wendu && wendu.curstatus > 0) || (sidu && sidu.curstatus > 0)
})
}
})
})
}
} }
} }
} }
@ -800,22 +684,24 @@ export default {
.leakage-list { .leakage-list {
display: flex; display: flex;
justify-content:flex-start; justify-content:flex-start;
flex-wrap: wrap;
flex: 1; flex: 1;
text-align: left; text-align: left;
font-size: 10px; font-size: 10px;
padding-left: 10px;
li { li {
position: relative; position: relative;
display: flex; display: flex;
justify-content: flex-start; justify-content: flex-start;
flex-wrap: wrap; flex-wrap: wrap;
align-items: center; align-items: center;
width: 60px;
width: 72px;
height: 40px; height: 40px;
border: 1px solid #3581cc; border: 1px solid #3581cc;
background-color: #02255f; background-color: #02255f;
border-radius: 2px; border-radius: 2px;
padding: 4px; padding: 4px;
margin: 10px 10px 0 0;
margin: 6px 10px 0 0;
font-size: 12px; font-size: 12px;
&::before { &::before {
content: ""; content: "";

287
src/views/screenVideo/index.vue

@ -0,0 +1,287 @@
<template>
<div class="env-container">
<div class="env-top-title" />
<div class="current-date">{{ nowDate }}</div>
<div class="env-main">
<div v-if="cameraList.length > 0" class="video-grid">
<div
v-for="(camera, index) in cameraList"
:key="camera.id || index"
class="video-item"
>
<div class="camera-name">{{ camera.deviceInfo.deviceName }}</div>
<video
:id="`video-${index}`"
controls
autoplay
muted
width="100%"
height="100%"
/>
</div>
</div>
<!-- 无摄像头提示 -->
<div v-else class="no-camera">
暂无配置的摄像头信息
</div>
</div>
</div>
</template>
<script>
import { getCurrentTime } from '@/utils/index'
import displayConfigApi from '@/api/storeManage/displayConfig'
export default {
name: 'ScreenVideo',
components: {},
mixins: [],
data() {
return {
nowDate: '',
timer: null,
cameraList: [],
webRtcServers: [],
camera_ip: '127.0.0.1:9527'
}
},
async created() {
this.timer = setInterval(() => {
this.nowDate = getCurrentTime()
}, 1000)
},
mounted() {
this.getVideoUrl()
},
beforeDestroy() {
if (this.timer) clearInterval(this.timer)
this.cleanupAllVideoStreams()
},
methods: {
// cam
getVideoUrl() {
displayConfigApi.list({ storeroomId: '01A1DC2123C2B75E1A579D', isQueryAll: 1 }).then((res) => {
console.log('摄像头列表', res)
if (res && res.length > 0) {
this.cameraList = res.filter(item => item.divPosition && item.divPosition.includes('cam'))
if (this.cameraList.length > 0) {
this.$nextTick(() => {
this.initAllVideos()
})
} else {
this.$message({
message: '未找到配置的摄像头',
type: 'warning'
})
}
} else {
this.$message({
message: '请先配置摄像头',
type: 'error'
})
}
}).catch(error => {
console.error('获取摄像头列表失败', error)
this.$message({
message: '获取摄像头配置失败',
type: 'error'
})
})
},
//
initAllVideos() {
const linkSrc = process.env.NODE_ENV === 'production'
? window.g.ApiWebRtcServerUrl
: process.env.VUE_APP_WEBRTCSTREAMER_API
this.camera_ip = linkSrc
//
this.cleanupAllVideoStreams()
// webrtc
this.cameraList.forEach((camera, index) => {
const videoId = `video-${index}`
const hkConfig = {
username: camera.deviceInfo.deviceAccount,
password: camera.deviceInfo.devicePassword,
ip: camera.deviceInfo.deviceIp,
port: camera.deviceInfo.devicePort
}
console.log(`初始化摄像头${index + 1}`, hkConfig)
try {
// webrtc
// eslint-disable-next-line no-undef
const webRtcServer = new WebRtcStreamer(videoId, location.protocol + '//' + this.camera_ip)
// RTSP
const rtspUrl = `rtsp://${hkConfig.username}:${hkConfig.password}@${hkConfig.ip}:${hkConfig.port}/h264/1/1`
webRtcServer.connect(rtspUrl)
this.webRtcServers.push({
index,
server: webRtcServer,
rtspUrl
})
} catch (error) {
console.error(`初始化摄像头${index + 1}失败`, error)
this.$message({
message: `摄像头${camera.deviceInfo.deviceName}连接失败`,
type: 'error'
})
}
})
},
//
cleanupAllVideoStreams() {
this.webRtcServers.forEach(({ server }) => {
try {
if (server && typeof server.disconnect === 'function') {
server.disconnect()
}
} catch (error) {
console.warn('清理视频流失败:', error)
}
})
this.cameraList.forEach((_, index) => {
const videoElem = document.getElementById(`video-${index}`)
if (videoElem) {
videoElem.src = ''
videoElem.load()
}
})
this.webRtcServers = []
},
//
reloadCamera(index) {
const camera = this.cameraList[index]
if (!camera) return
//
if (this.webRtcServers[index]) {
try {
this.webRtcServers[index].server.disconnect()
} catch (error) {
console.warn('断开摄像头失败', error)
}
}
//
const hkConfig = {
username: camera.deviceInfo.deviceAccount,
password: camera.deviceInfo.devicePassword,
ip: camera.deviceInfo.deviceIp,
port: camera.deviceInfo.devicePort
}
const videoId = `video-${index}`
// eslint-disable-next-line no-undef
const webRtcServer = new WebRtcStreamer(videoId, location.protocol + '//' + this.camera_ip)
const rtspUrl = `rtsp://${hkConfig.username}:${hkConfig.password}@${hkConfig.ip}:${hkConfig.port}/h264/1/1`
webRtcServer.connect(rtspUrl)
this.webRtcServers[index] = {
index,
server: webRtcServer,
rtspUrl
}
}
}
}
</script>
<style lang="scss" scoped>
@import "~@/assets/styles/lend-manage.scss";
.env-container {
width: 100%;
height: calc(100vh);
background-color: #031435;
.env-top-title {
width: calc(100vw);
height: 130px;
background: url("~@/assets/images/largeScreen/top-title.png") no-repeat 0 -14px;
background-size: contain;
}
.current-date {
position: fixed;
top: 25px;
right: 150px;
font-size: 16px;
color: #3a99fd;
z-index: 10;
}
.env-main {
padding: 20px;
height: calc(100vh - 130px);
overflow: auto;
}
//
.video-grid {
display: grid;
//
grid-template-columns: repeat(auto-fill, minmax(600px, 1fr));
gap: 20px;
height: 100%;
}
.video-item {
background: #000;
border-radius: 8px;
overflow: hidden;
height: 100%;
min-height: 400px;
padding-bottom: 40px;
.camera-name {
padding: 10px 15px;
background: rgba(0, 0, 0, 0.7);
color: #3a99fd;
font-size: 16px;
font-weight: 500;
}
video {
display: block;
object-fit: contain;
}
}
//
.no-camera {
display: flex;
align-items: center;
justify-content: center;
height: 100%;
color: #3a99fd;
font-size: 20px;
}
}
//
@media (max-width: 1440px) {
.video-grid {
grid-template-columns: repeat(auto-fill, minmax(400px, 1fr));
}
.video-item {
min-height: 300px;
}
}
@media (max-width: 768px) {
.video-grid {
grid-template-columns: 1fr;
}
.current-date {
right: 20px;
font-size: 14px;
}
}
</style>

676
src/views/storeManage/deviceManage/module/deviceDetail-old.vue

@ -0,0 +1,676 @@
<template>
<div>
<!--工具栏-->
<div class="head-container" style="padding:0 0 20px 0">
<crudOperation :permission="permission">
<template v-slot:left>
<el-button v-permission="permission.add" size="mini" type="primary" icon="el-icon-plus" :disabled="!activeAddBtn" @click="selectDeviceType">新增</el-button>
</template>
<template v-slot:right>
<el-button v-permission="permission.del" icon="el-icon-delete" size="mini" :loading="crud.delAllLoading" :disabled="crud.selections && crud.selections.length === 0" @click="toDelete(crud.selections)">删除</el-button>
<el-select v-model="deviceType" class="filter-item" style="margin-left:10px" placeholder="全部" @change="crud.toQuery">
<el-option :key="0" label="全部" value="" />
<el-option v-for="item in deviceTypeOptions" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</template>
<template v-slot:rightButtonGroup>
<div class="archives-handler-btn">
<el-button class="binding-mac-btn iconfont icon-bangdingshebei-fanbai" type="primary" :disabled="crud.selections.length !== 1 || (crud.selections[0].deviceTypeId && crud.selections[0].deviceTypeId.name !== '桌面式RFID读写器')" @click="bindingMac()">绑定设备</el-button>
<el-button class="binding-param-btn iconfont icon-bangdingcanshu-fanbai" type="primary" :disabled="crud.selections.length !== 1 || (crud.selections[0].deviceTypeId && (crud.selections[0].deviceTypeId.name !== '漏水传感器' && crud.selections[0].deviceTypeId.name !== '温湿度感应器' && crud.selections[0].deviceTypeId.name !== '空气质量检测设备'))" @click="bindingParam(crud.selections[0].id)">绑定参数</el-button>
</div>
</template>
</crudOperation>
</div>
<!--表单组件-->
<el-dialog ref="dialog" class="deviceForm" append-to-body :close-on-click-modal="false" :before-close="crud.cancelCU" :visible="crud.status.cu > 0" :title="addTypeStr" @open="open">
<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-input v-model="form.storeroomId" type="hidden" /> -->
<el-form-item v-if="selectedDeviceType !== '密集架' " label="设备厂商" prop="supplier">
<el-select v-model="form.supplier" style="width: 370px;" :disabled="crud.status.edit === 1">
<el-option v-for="item in supplierOptions" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item v-if="isInsidedevices || isOutsidedevices" label="设备ID" prop="deviceId">
<el-input v-model="form.deviceId" style="width: 370px;" :disabled="crud.status.edit === 1" />
</el-form-item>
<el-form-item label="设备名称" prop="deviceName">
<el-input v-model="form.deviceName" style="width: 370px;" />
</el-form-item>
<el-form-item v-if="selectedDeviceType === '智能密集架' || selectedDeviceType === '回转柜' || selectedDeviceType === '摄像头' || isInsidedevices" label="接口IP" prop="deviceIp">
<el-input v-model="form.deviceIp" style="width: 370px;" />
</el-form-item>
<el-form-item v-if="selectedDeviceType === '智能密集架' || selectedDeviceType === '回转柜' || selectedDeviceType === '摄像头' || isInsidedevices" label="端口" prop="devicePort">
<el-input v-model="form.devicePort" style="width: 370px;" />
</el-form-item>
<!-- 智能密集架 || 回转柜 -->
<el-form-item v-if="selectedDeviceType === '智能密集架' || selectedDeviceType === '回转柜'" label="库房代码" prop="storeroomCode">
<el-input v-model="form.storeroomCode" style="width: 370px;" />
</el-form-item>
<!-- 智能密集架 -->
<el-form-item v-if="selectedDeviceType === '智能密集架'" label="区号" prop="areaNo">
<el-input v-model="form.areaNo" style="width: 370px;" :disabled="crud.status.edit === 1" />
</el-form-item>
<el-form-item v-if="selectedDeviceType === '智能密集架'|| selectedDeviceType === '密集架'" label="起始列号" prop="firstColumnNo">
<el-input v-model.number="form.firstColumnNo" style="width: 150px;" :disabled="crud.status.edit === 1" />
</el-form-item>
<el-form-item v-if="selectedDeviceType === '智能密集架' || selectedDeviceType === '密集架'" label="总列数" prop="sumColumnNo">
<el-input v-model.number="form.sumColumnNo" style="width: 150px;" :disabled="crud.status.edit === 1" />
</el-form-item>
<el-form-item v-if="selectedDeviceType === '智能密集架' || selectedDeviceType === '密集架'" label="节数" prop="partNo">
<el-input v-model.number="form.partNo" style="width: 150px;" :disabled="crud.status.edit === 1" />
</el-form-item>
<!-- 回转柜 || 摄像头 -->
<el-form-item v-if="selectedDeviceType === '回转柜' || selectedDeviceType === '摄像头'" label="账号" prop="deviceAccount">
<el-input v-model="form.deviceAccount" style="width: 370px;" />
</el-form-item>
<el-form-item v-if="selectedDeviceType === '回转柜' || selectedDeviceType === '摄像头'" label="密码" prop="devicePassword">
<el-input v-model="form.devicePassword" style="width: 370px;" />
</el-form-item>
<!-- 回转柜 -->
<el-form-item v-if="selectedDeviceType === '回转柜'" label="柜号" prop="cupboardNo">
<el-input v-model="form.cupboardNo" style="width: 370px;" :disabled="crud.status.edit === 1" />
</el-form-item>
<!-- 摄像头 -->
<el-form-item v-if="selectedDeviceType === '摄像头'" label="频道" prop="videoRoute">
<el-input v-model="form.videoRoute" style="width: 370px;" />
</el-form-item>
<!-- 智能密集架 || 回转柜 -->
<el-form-item v-if="selectedDeviceType === '智能密集架' || selectedDeviceType === '回转柜' || selectedDeviceType === '密集架'" label="层数" prop="rowNo">
<el-input v-model.number="form.rowNo" style="width: 150px;" :disabled="crud.status.edit === 1" />
</el-form-item>
<!-- 回转柜 -->
<el-form-item v-if="selectedDeviceType === '回转柜'" label="每层列数" prop="columnRowNo">
<el-input v-model.number="form.columnRowNo" style="width: 150px;" :disabled="crud.status.edit === 1" />
</el-form-item>
<!-- 智能密集架 || 回转柜 -->
<el-form-item v-if="selectedDeviceType === '智能密集架' || selectedDeviceType === '回转柜'" label="联动操作" prop="isLinkage">
<el-checkbox v-model="form.isLinkage.lend" @change="checked=>isLinkageChange(checked,'lend')">借出</el-checkbox>
<el-checkbox v-model="form.isLinkage.borrow" @change="checked=>isLinkageChange(checked,'borrow')">归还</el-checkbox>
<el-checkbox v-model="form.isLinkage.inBound" @change="checked=>isLinkageChange(checked,'inBound')">入库</el-checkbox>
<el-checkbox v-model="form.isLinkage.outBound" @change="checked=>isLinkageChange(checked,'outBound')">出库</el-checkbox>
</el-form-item>
<el-form-item v-if="selectedDeviceType === '智能密集架' || selectedDeviceType === '回转柜'" label="回调确认" prop="isCallback">
<el-checkbox v-model="form.isCallback.lend" @change="checked=>isCallbackChange(checked,'lend')">借出</el-checkbox>
<el-checkbox v-model="form.isCallback.borrow" @change="checked=>isCallbackChange(checked,'lend')">归还</el-checkbox>
<el-checkbox v-model="form.isCallback.inBound" @change="checked=>isCallbackChange(checked,'lend')">入库</el-checkbox>
<el-checkbox v-model="form.isCallback.outBound" @change="checked=>isCallbackChange(checked,'lend')">出库</el-checkbox>
</el-form-item>
<el-form-item v-if="selectedDeviceType === '智能密集架' || selectedDeviceType === '回转柜'" label="下发通知" prop="isNotice" style="display: block;">
<el-checkbox v-model="form.isNotice">通知</el-checkbox>
</el-form-item>
<el-form-item label="维保信息" prop="maintenanceInfo">
<el-input v-model="form.maintenanceInfo" type="textarea" style="width: 370px;" :rows="6" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button :loading="crud.status.cu === 2" type="primary" @click="crud.submitCU">保存</el-button>
</div>
</div>
</el-dialog>
<el-dialog title="删除设备" :visible.sync="deleteVisible" :before-close="handleClose">
<span class="dialog-right-top" />
<span class="dialog-left-bottom" />
<div class="setting-dialog">
<div class="dialog-delt">
<p><span>确定删除当前设备吗</span></p>
</div>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click.native="handleConfirm">确定</el-button>
</div>
</div>
</el-dialog>
<el-dialog :close-on-click-modal="false" :visible.sync="selectDeviceTypeVisible" title="新增设备">
<span class="dialog-right-top" />
<span class="dialog-left-bottom" />
<div class="setting-dialog">
<el-form size="small" label-width="80px">
<el-form-item label="设备类型">
<el-select v-model="selectedDeviceType" style="width: 370px;">
<el-option v-for="item in deviceTypeOptions" :key="item.id" :label="item.name" :value="item.name" />
</el-select>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="nextStep()">
下一步
</el-button>
</div>
</div>
</el-dialog>
<el-dialog :close-on-click-modal="false" :visible.sync="bindingMacVisible" title="绑定设备">
<span class="dialog-right-top" />
<span class="dialog-left-bottom" />
<div class="setting-dialog">
<el-form size="small" label-width="140px">
<el-form-item label="当前电脑Mac地址">
<el-input v-model="currentMac" style="width: 370px;" :disabled="true" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="doBindingMac()">
确定绑定
</el-button>
</div>
</div>
</el-dialog>
<bindParams ref="bindingParamsDlg" @refresh="crud.refresh" />
<div class="container-right" style="min-height: calc(100vh - 242px);">
<span class="right-top-line" />
<span class="left-bottom-line" />
<!--表格渲染-->
<el-table ref="table" v-loading="crud.loading" :data="crud.data" highlight-current-row style="width: 100%;" height="calc(100vh - 295px)" @selection-change="selectionChangeHandler" @row-click="clickRowHandler">
<el-table-column align="center" type="selection" width="50" />
<el-table-column align="center" type="index" label="序号" width="55" />
<el-table-column align="center" prop="storeroomId.name" label="所属区域" width="100" show-overflow-tooltip />
<el-table-column align="center" label="设备状态" width="100">
<template slot-scope="scope">
<span v-if="scope.row.deviceState === null" class="el-icon-loading" />
<span v-else :class="{ 'spk-a': scope.row.deviceState === 1, 'off-line': scope.row.deviceState !== 1 }" />
</template>
</el-table-column>
<el-table-column align="center" prop="deviceTypeId.name" label="设备类型" show-overflow-tooltip />
<el-table-column align="center" prop="supplierId.name" label="设备厂商" width="100" show-overflow-tooltip />
<el-table-column align="center" prop="deviceName" label="设备名称" show-overflow-tooltip />
<el-table-column align="center" label="设备ID" show-overflow-tooltip>
<template slot-scope="scope">
<span v-if="scope.row.deviceId"> {{ scope.row.deviceId }} </span>
<span v-else></span>
</template>
</el-table-column>
<el-table-column align="center" label="接口IP" width="120" show-overflow-tooltip>
<template slot-scope="scope">
<span v-if="scope.row.deviceIp"> {{ scope.row.deviceIp }} </span>
<span v-else></span>
</template>
</el-table-column>
<el-table-column align="center" label="端口" width="90">
<template slot-scope="scope">
<span v-if="scope.row.devicePort"> {{ scope.row.devicePort }} </span>
<span v-else></span>
</template>
</el-table-column>
<el-table-column align="center" label="绑定设备" width="100">
<template slot-scope="scope">
<span v-if="scope.row.deviceSpecParamId && scope.row.deviceSpecParamId.macAddress !== null"> 已绑定 </span>
<span v-else></span>
</template>
</el-table-column>
<el-table-column align="center" label="绑定参数" width="100">
<template slot-scope="scope">
<span v-if="scope.row.deviceSpecParamId && scope.row.deviceSpecParamId.paramId !== null"> 已绑定 </span>
<span v-else></span>
</template>
</el-table-column>
</el-table>
<!--分页组件-->
<pagination />
</div>
</div>
</template>
<script>
import crudDevice from '@/api/storeManage/deviceManage/device'
import macApi from '@/api/storeManage/deviceManage/mac'
import paramApi from '@/api/storeManage/deviceManage/param'
import CRUD, { presenter, header, form } from '@crud/crud'
import crudOperation from '@crud/CRUD.operation'
import pagination from '@crud/Pagination'
import bindParams from './bindParams'
const defaultForm = { supplier: null, id: null, deviceId: null, deviceName: null, deviceIp: null, devicePort: null, rowNo: null, areaNo: null, sumColumnNo: null, firstColumnNo: null, partNo: null, storeroomCode: null, columnRowNo: null, deviceAccount: null, devicePassword: null, cupboardNo: null, videoRoute: null, isLinkage: { stateType: 1, lend: false, borrow: false, inBound: false, outBound: false }, isCallback: { stateType: 2, lend: false, borrow: false, inBound: false, outBound: false }, isNotice: false, maintenanceInfo: null }
export default {
components: { crudOperation, pagination, bindParams },
cruds() {
return [
CRUD({
title: '设备', url: 'api/device/list',
crudMethod: { ...crudDevice },
optShow: {
add: false,
edit: true,
del: false,
reset: false,
download: false,
group: false
},
sort: ['sequence,asc']
})
]
},
mixins: [
presenter(),
header(),
form(defaultForm)
],
props: {
activeAddBtn: {
type: Boolean
}
},
data() {
return {
storeroomId: null,
deviceType: null, //
needRefreshTree: false,
permission: {
add: ['admin', 'device:add'],
edit: ['admin', 'device:edit'],
del: ['admin', 'device:del']
},
deleteVisible: false,
selectDeviceTypeVisible: false,
bindingMacVisible: false,
currentMac: '',
deviceTypeOptions: [],
selectedDeviceType: '密集架', //
supplierOptions: [] //
}
},
computed: {
addTypeStr() {
const addType = this.deviceTypeOptions.find(deviceType => deviceType.name === this.selectedDeviceType)
const preTitle = this.crud.status.add > CRUD.STATUS.NORMAL ? '新增' : '编辑'
if (addType) {
return preTitle + addType.name
} else {
return preTitle
}
},
isInsidedevices() {
if (this.selectedDeviceType === '空调' || this.selectedDeviceType === '桌面式RFID读写器' || this.selectedDeviceType === '盘点机' || this.selectedDeviceType === '恒湿机' || this.selectedDeviceType === '漏水传感器' || this.selectedDeviceType === '温湿度感应器' || this.selectedDeviceType === '空气质量检测设备' || this.selectedDeviceType === '漏水传感器') {
return true
} else {
return false
}
},
isOutsidedevices() {
if (this.selectedDeviceType === '通道门' || this.selectedDeviceType === '手持式RFID读写器') {
return true
} else {
return false
}
},
rules() {
// const checkDeviceIp = (rule, value, callback) => {
// const reg = /^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$/
// if (reg.test(value)) {
// callback()
// } else {
// callback(new Error('IP'))
// }
// }
const checkDevicePort = (rule, value, callback) => {
const reg = /^([0-9]|[1-9]\d{1,3}|[1-5]\d{4}|6[0-4]\d{4}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])$/
if (reg.test(value)) {
callback()
} else {
callback(new Error('端口号输入错误'))
}
}
const validateRule = {
// deviceInfo.
supplier: [
{ required: true, message: '请选择设备产商', trigger: 'blur' }
],
deviceName: [
{ required: true, message: '请输入设备名称', trigger: 'blur' }
]
}
if (this.isInsidedevices || this.isOutsidedevices) {
this.$set(validateRule, 'deviceId', [
{ required: true, message: '请输入设备ID', trigger: 'blur' }
])
}
if (this.selectedDeviceType === '智能密集架' || this.selectedDeviceType === '密集架' || this.selectedDeviceType === '回转柜' || this.selectedDeviceType === '摄像头' || this.isInsidedevices) {
this.$set(validateRule, 'deviceIp', [
{ required: true, message: '请输入接口IP', trigger: 'blur' }
// ,
// { validator: checkDeviceIp, trigger: 'blur' }
])
this.$set(validateRule, 'devicePort', [
{ required: true, message: '请输入端口号', trigger: 'blur' },
{ validator: checkDevicePort, trigger: 'blur' }
])
if (this.selectedDeviceType === '智能密集架') {
this.$set(validateRule, 'areaNo', [
{ required: true, message: '请输入区号', trigger: 'blur' }
])
this.$set(validateRule, 'firstColumnNo', [
{ required: true, message: '请输入起始列号', trigger: 'blur' }
])
this.$set(validateRule, 'sumColumnNo', [
{ required: true, message: '请输入总列数', trigger: 'blur' }
])
this.$set(validateRule, 'partNo', [
{ required: true, message: '请输入节数', trigger: 'blur' }
])
this.$set(validateRule, 'rowNo', [
{ required: true, message: '请输入层数', trigger: 'blur' }
])
} else if (this.selectedDeviceType === '密集架') {
this.$set(validateRule, 'firstColumnNo', [
{ required: true, message: '请输入起始列号', trigger: 'blur' }
])
this.$set(validateRule, 'sumColumnNo', [
{ required: true, message: '请输入总列数', trigger: 'blur' }
])
this.$set(validateRule, 'partNo', [
{ required: true, message: '请输入节数', trigger: 'blur' }
])
this.$set(validateRule, 'rowNo', [
{ required: true, message: '请输入层数', trigger: 'blur' }
])
} else if (this.selectedDeviceType === '回转柜' || this.selectedDeviceType === '摄像头') {
// ||
this.$set(validateRule, 'deviceAccount', [
{ required: true, message: '请输入账号', trigger: 'blur' }
])
this.$set(validateRule, 'devicePassword', [
{ required: true, message: '请输入密码', trigger: 'blur' }
])
if (this.selectedDeviceType === '回转柜') {
this.$set(validateRule, 'cupboardNo', [
{ required: true, message: '请输入柜号', trigger: 'blur' }
])
this.$set(validateRule, 'rowNo', [
{ required: true, message: '请输入层数', trigger: 'blur' }
])
this.$set(validateRule, 'columnRowNo', [
{ required: true, message: '请输入每层列数', trigger: 'blur' }
])
} else {
//
this.$set(validateRule, 'videoRoute', [
{ required: true, message: '请输入频道', trigger: 'blur' }
])
}
}
}
return validateRule
}
},
created() {
crudDevice.getDeviceType().then((data) => {
this.deviceTypeOptions.splice(0, 0, ...data)
})
},
methods: {
// null
// async
async [CRUD.HOOK.beforeToEdit](crud, form) {
if (form.deviceTypeId.name === '智能密集架' || form.deviceTypeId.name === '密集架' || form.deviceTypeId.name === '回转柜') {
if (form.deviceTypeId.name === '智能密集架') {
//
await crudDevice.getDesecabinetById({ deviceInfoId: this.crud.selections[0].id }).then((data) => {
form.rowNo = data.rowNo
form.areaNo = data.areaNo
form.sumColumnNo = data.sumColumnNo
form.firstColumnNo = data.firstColumnNo
form.partNo = data.partNo
form.storeroomCode = data.storeroomCode
})
} else if (form.deviceTypeId.name === '密集架') {
//
await crudDevice.getDesecabinetById({ deviceInfoId: this.crud.selections[0].id }).then((data) => {
form.rowNo = data.rowNo
form.areaNo = data.areaNo
form.sumColumnNo = data.sumColumnNo
form.firstColumnNo = data.firstColumnNo
form.partNo = data.partNo
form.storeroomCode = data.storeroomCode
})
} else if (form.deviceTypeId.name === '回转柜') {
//
await crudDevice.getRotarycabinetById({ deviceInfoId: this.crud.selections[0].id }).then((data) => {
form.columnRowNo = data.columnRowNo
form.cupboardNo = data.cupboardNo
form.rowNo = data.rowNo
form.storeroomCode = data.storeroomCode
})
}
//
await crudDevice.getDeviceById({ deviceInfoId: this.crud.selections[0].id }).then((data) => {
if (data.length === 3) {
form.isLinkage = data.find(element => element.stateType === 1)
form.isCallback = data.find(element => element.stateType === 2)
}
})
}
form.supplier = form.supplierId.id
this.selectedDeviceType = form.deviceTypeId.name
crud.status.edit = CRUD.STATUS.PREPARED
crud.getDataStatus(this.crud.selections[0].id).edit = CRUD.STATUS.PREPARED
return false
},
[CRUD.HOOK.beforeSubmit]() {
this.crud.form.supplierId = this.supplierOptions.find(item => item.id === this.crud.form.supplier)
this.crud.form.deviceTypeId = this.deviceTypeOptions.find(item => item.name === this.selectedDeviceType)
},
//
[CRUD.HOOK.beforeRefresh]() {
if (this.storeroomId) {
this.crud.query.storeroomId = this.storeroomId.id
}
if (this.deviceType !== '0') {
this.crud.query.deviceTypeId = this.deviceType
}
},
// isLinkagenull,isLinkage.lend
[CRUD.HOOK.afterRefresh](crud) {
console.log('crud.data', crud.data)
let selectedElementId = null
crud.data.forEach(element => {
element.isLinkage = { stateType: 1, lend: null, borrow: null, inBound: null, outBound: null }
element.isCallback = { stateType: 2, lend: null, borrow: null, inBound: null, outBound: null }
// element.deviceState = null
// 线
// 1. 7305DE3D273B0CAC079538
// 2. 65D1886B0F864291766421
// 3. 6A48C971F5C9ECA358A2DA
// 线
// 1.RFID 3B85FA21FDAFBB618B5D40
// deviceTypeId.id
// 1. DD656054BE3D1DF1E2F1FC
// 2.RFID E2767FEACA9CE0E3B16B89
// 3.E58C8D7C896BCB9A408A78湿 7882487E0C15304A3758AF 250AE644EC43E4EC954A81
if (element.deviceTypeId.id === '7305DE3D273B0CAC079538' || element.deviceTypeId.id === '65D1886B0F864291766421') {
// +
element.deviceState = 1
} else if (element.deviceTypeId.id === '3B85FA21FDAFBB618B5D40') {
// RFID
element.deviceState = 0
} else if (element.deviceTypeId.id === 'DD656054BE3D1DF1E2F1FC') {
//
element.deviceState = null
this.getDeviceState(element)
} else if (element.deviceTypeId.id === 'DD656054BE3D1DF1E2F1FC') {
//
element.deviceState = null
this.getDeviceState(element)
} else if (element.deviceTypeId.id === 'E2767FEACA9CE0E3B16B89') {
// RFID
element.deviceState = null
this.getDeviceState(element)
} else if (element.deviceTypeId.id === 'E58C8D7C896BCB9A408A78' || element.deviceTypeId.id === '7882487E0C15304A3758AF' || element.deviceTypeId.id === '250AE644EC43E4EC954A81') {
element.deviceState = null
selectedElementId = element.id
}
})
if (selectedElementId) {
crudDevice.FetchIsOnline({ deviceId: selectedElementId })
.then((data) => {
crud.data.forEach(element => {
if (element.deviceTypeId.id === 'E58C8D7C896BCB9A408A78' || element.deviceTypeId.id === '7882487E0C15304A3758AF' || element.deviceTypeId.id === '250AE644EC43E4EC954A81') {
element.deviceState = data === true ? 1 : 0
}
})
})
.catch((error) => {
console.error(error)
})
}
},
getDeviceState(element) {
crudDevice.FetchIsOnline({ deviceId: element.id }).then((data) => {
element.deviceState = data === true ? 1 : 0
}).catch((error) => {
console.error(error)
})
},
//
[CRUD.HOOK.afterValidateCU](crud) {
if (crud.status.edit === 1) {
const storeroomId = this.crud.selections[0].storeroomId
this.crud.form.storeroomId = {
'id': storeroomId.id,
'pid': storeroomId.pid,
'name': storeroomId.name,
'remark': storeroomId.remark,
'sort': storeroomId.sort
}
} else {
this.crud.form.storeroomId = {
'id': this.storeroomId.id,
'pid': this.storeroomId.pid,
'name': this.storeroomId.name,
'remark': this.storeroomId.remark,
'sort': this.storeroomId.sort
}
}
},
clickRowHandler(row) {
this.$refs.table.toggleRowSelection(row)
},
selectionChangeHandler(val) {
this.crud.selections = val
},
toDelete(data) {
this.deleteVisible = true
},
handleConfirm() {
this.deleteVisible = false
this.crud.delAllLoading = true
this.crud.doDelete(this.crud.selections)
},
handleClose(done) {
done()
},
selectDeviceType() {
this.selectDeviceTypeVisible = true
},
nextStep() {
this.selectDeviceTypeVisible = false
this.crud.toAdd()
},
open() {
this.supplierOptions.splice(0, this.supplierOptions.length)
crudDevice.getSupplier().then((data) => {
this.supplierOptions.splice(0, 0, ...data)
})
},
bindingMac() {
macApi.getMac().then((data) => {
this.currentMac = data
this.bindingMacVisible = true
})
},
doBindingMac() {
macApi.bindMac({ deviceId: this.crud.selections[0].id, macAddress: this.currentMac }).then((data) => {
this.bindingMacVisible = false
this.$message({
message: '绑定成功',
type: 'success'
})
})
},
bindingParam(id) {
this.$refs.bindingParamsDlg.deviceInfoId = id
paramApi.getParams({ deviceInfoId: id }).then((data) => {
this.$refs.bindingParamsDlg.params = data
this.$refs.bindingParamsDlg.bindParamsVisible = true
})
},
isLinkageChange(value, type) {
if (!value && this.form.isCallback[type]) {
this.$message.error('取消对应回调选项后才能取消联动操作')
this.form.isLinkage[type] = true
}
},
isCallbackChange(value, type) {
if (value && !this.form.isLinkage[type]) {
this.$message.error('选中对应联动选项后才能勾选回调操作')
this.form.isCallback[type] = false
}
}
}
}
</script>
<style rel="stylesheet/scss" lang="scss" scoped>
.archives-handler-btn {
.el-button {
padding: 0 13px 0 13px;
::v-deep span {
margin-left: 10px;
}
&.binding-mac-btn {
border-color: #fd8042;
background-color: #fd8042;
&.is-disabled {
border-color: #7e4021;
background-color: #7e4021;
}
}
&.binding-param-btn {
border-color: #1aae93;
background-color: #1aae93;
&.is-disabled {
border-color: #0d5649;
background-color: #0d5649;
}
}
&.is-disabled {
color: #666;
}
}
.iconfont {
line-height: 28px;
}
margin-left: auto;
}
.spk-a {
display: inline-block;
width: 12px;
height: 12px;
border-radius: 6px;
background-color: #1aae93;
box-shadow: 0px 0px 6px 1px #1aae93;
vertical-align: middle;
}
.off-line {
display: inline-block;
width: 12px;
height: 12px;
border-radius: 6px;
background-color: #F65163;
box-shadow: 0px 0px 6px 1px #F65163;
vertical-align: middle;
}
.deviceForm{
::v-deep .el-dialog .el-dialog__body{
max-height: 680px !important;
overflow: hidden;
overflow-y: scroll;
.el-checkbox{
color: #fff;
}
}
}
</style>

54
src/views/storeManage/deviceManage/module/deviceDetail.vue

@ -460,63 +460,19 @@ export default {
this.crud.query.deviceTypeId = this.deviceType this.crud.query.deviceTypeId = this.deviceType
} }
}, },
// isLinkagenull,isLinkage.lend
[CRUD.HOOK.afterRefresh](crud) { [CRUD.HOOK.afterRefresh](crud) {
console.log('crud.data', crud.data) console.log('crud.data', crud.data)
let selectedElementId = null
crud.data.forEach(element => { crud.data.forEach(element => {
element.isLinkage = { stateType: 1, lend: null, borrow: null, inBound: null, outBound: null }
element.isCallback = { stateType: 2, lend: null, borrow: null, inBound: null, outBound: null }
// element.deviceState = null
// 线
// 1. 7305DE3D273B0CAC079538
// 2. 65D1886B0F864291766421
// 3. 6A48C971F5C9ECA358A2DA
// 线
// 1.RFID 3B85FA21FDAFBB618B5D40
// deviceTypeId.id
// 1. DD656054BE3D1DF1E2F1FC
// 2.RFID E2767FEACA9CE0E3B16B89
// 3.E58C8D7C896BCB9A408A78湿 7882487E0C15304A3758AF 250AE644EC43E4EC954A81
if (element.deviceTypeId.id === '7305DE3D273B0CAC079538' || element.deviceTypeId.id === '65D1886B0F864291766421') {
// +
element.deviceState = 1
} else if (element.deviceTypeId.id === '3B85FA21FDAFBB618B5D40') {
// RFID
element.deviceState = 0
} else if (element.deviceTypeId.id === 'DD656054BE3D1DF1E2F1FC') {
//
element.deviceState = null
this.getDeviceState(element)
} else if (element.deviceTypeId.id === 'DD656054BE3D1DF1E2F1FC') {
//
element.deviceState = null
console.log('element', element)
if (element.deviceIp) {
this.getDeviceState(element) this.getDeviceState(element)
} else if (element.deviceTypeId.id === 'E2767FEACA9CE0E3B16B89') {
// RFID
element.deviceState = null
this.getDeviceState(element)
} else if (element.deviceTypeId.id === 'E58C8D7C896BCB9A408A78' || element.deviceTypeId.id === '7882487E0C15304A3758AF' || element.deviceTypeId.id === '250AE644EC43E4EC954A81') {
element.deviceState = null
selectedElementId = element.id
}
})
if (selectedElementId) {
crudDevice.FetchIsOnline({ deviceId: selectedElementId })
.then((data) => {
crud.data.forEach(element => {
if (element.deviceTypeId.id === 'E58C8D7C896BCB9A408A78' || element.deviceTypeId.id === '7882487E0C15304A3758AF' || element.deviceTypeId.id === '250AE644EC43E4EC954A81') {
element.deviceState = data === true ? 1 : 0
} else {
element.deviceState = 0
} }
}) })
})
.catch((error) => {
console.error(error)
})
}
}, },
getDeviceState(element) { getDeviceState(element) {
crudDevice.FetchIsOnline({ deviceId: element.id }).then((data) => {
crudDevice.FetchPingIP({ ip: element.deviceIp }).then((data) => {
element.deviceState = data === true ? 1 : 0 element.deviceState = data === true ? 1 : 0
}).catch((error) => { }).catch((error) => {
console.error(error) console.error(error)

Loading…
Cancel
Save