【前端】智能库房综合管理系统前端项目
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

488 lines
16 KiB

<template>
<div>
<div class="head-container">
<el-button class="iconfont icon-fabu-fanbai" size="mini" @click="handleSend">发布</el-button>
<el-button icon="el-icon-edit" size="mini" :disabled="!(selections.length === 1)" @click="handleEdit">修改</el-button>
<el-button icon="el-icon-delete" size="mini" :disabled="!selections.length" @click="handleDel">删除</el-button>
</div>
<div class="app-container container-wrap">
<span class="right-top-line" />
<span class="left-bottom-line" />
<!--表格渲染-->
<el-table
ref="table"
v-loading="isLoading"
:default-sort="{prop: 'create_time', order: 'descending'}"
:data="tableData"
style="width: 100%;"
height="calc(100vh - 294px)"
@row-click="clickRowHandler"
@selection-change="selectionChangeHandler"
>
<el-table-column type="selection" width="55" align="center" />
<el-table-column type="index" label="序号" width="100" align="center" />
<el-table-column prop="noticeContent" :show-overflow-tooltip="true" label="通知内容" min-width="200" align="center" />
<el-table-column prop="noticeType" label="消息类型" align="center" min-width="150">
<!-- <span v-if="scope.row.noticeType===1">系统消息</span> -->
<span>系统消息</span>
</el-table-column>
<el-table-column prop="pushTo" :show-overflow-tooltip="true" label="推送对象" align="center" min-width="150">
<template slot-scope="scope">
<span v-if="typeof(scope.row.pushTo)==='string'">{{ scope.row.pushTo }}</span>
<div v-if="!(typeof(scope.row.pushTo)==='string')" class="tag-hidden">
<!-- <el-tag v-for="(item,i) in scope.row.pushTo" :key="i" style="margin-left:3px;color: #fff">{{ item }}</el-tag> -->
{{ scope.row.pushTo.join(',') }}
</div>
</template>
</el-table-column>
<el-table-column prop="update_by" label="推送人" align="center" min-width="150" />
<el-table-column prop="create_time" :sortable="true" label="推送时间" align="center" min-width="180">
<template slot-scope="scope">
<div>{{ scope.row.create_time | parseTime }}</div>
</template>
</el-table-column>
</el-table>
<el-pagination
:page-size.sync="page.size"
:total="page.total"
:current-page.sync="page.page"
style="margin-top: 8px;"
layout="total, prev, pager, next, sizes"
@size-change="sizeChangeHandler($event)"
@current-change="pageChangeHandler"
/>
<!-- 发布 -->
<el-dialog append-to-body :close-on-click-modal="false" :visible.sync="sendVisible" title="发布通知" @close="handleClose">
<span class="dialog-right-top" />
<span class="dialog-left-bottom" />
<div class="setting-dialog">
<el-form ref="formDom" :rules="rules" :model="sendForm" size="small" label-width="80px" style="margin-left:85px">
<el-form-item label="消息类型" prop="msgType" class="down-select">
<el-select v-model="noticeType" placeholder="请选择" style="width:315px">
<el-option
v-for="item in msgTypeOptions"
:key="item.name"
:label="item.label"
:value="item.value"
:disabled="item.disabled"
/>
</el-select>
</el-form-item>
<el-form-item label="发布内容" prop="notification" style="margin-bottom:8px">
<textarea v-model="sendForm.notification" cols="38" rows="6" />
</el-form-item>
<el-form-item label="推送对象" prop="">
<el-radio-group v-model="pushObj" @change="pushObjChange">
<el-radio label="用户">用户</el-radio>
<el-radio label="设备">设备</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="选择对象" prop="paramName">
<el-select ref="selectBox" v-model="selectOptions" multiple :collapse-tags="showTags" clearable placeholder="请选择" style="width:315px" @change="changeSelect">
<!-- <el-option key="全选" label="全选" value="全选" /> -->
<el-option v-for="item in sendObjOptions" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button v-loading="btnloading" type="primary" @click="handleSave">保存</el-button>
</div>
</div>
</el-dialog>
<!-- 删除 -->
<el-dialog :visible.sync="delVisible" title="提示">
<span class="dialog-right-top" />
<span class="dialog-left-bottom" />
<div class="setting-dialog">
<p class="delMsg">确定删除所选消息吗?</p>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="handleDelConfirm">确定</el-button>
</div>
</div>
</el-dialog>
</div>
</div>
</template>
<script>
import { noticeCreate, getAllDev, getAllUser, getNoticeList, noticeDel } from '@/api/system/logs'
export default {
name: 'NotifyManage',
inject: ['reload'],
data() {
return {
isLoading: false,
tableData: [],
selections: [],
sendVisible: false,
delVisible: false,
sendForm: {
// msgType: 1,
notification: '',
// pushObj: '用户',
sendObj: ['全选']
},
pushObj: '用户',
checked: '',
noticeType: 1,
msgTypeOptions: [
{ value: 1, label: '系统通知' }
// { value: 2, label: '报警消息', disabled: true },
// { value: 3, label: '借还消息', disabled: true },
// { value: 4, label: '下载消息', disabled: true }
],
userOptions: [],
devOptions: [],
selectOptions: [],
oldSelect: null,
showTags: true,
rules: {
// msgType: [
// { required: true, message: '请选择类型', trigger: 'blur' }
// ],
notification: [
{ required: true, message: '请填写内容', trigger: 'blur' }
],
pushObj: [
{ required: true, message: '请选择推送对象', trigger: 'blur' }
]
},
allUser: null,
allDev: null,
page: {
total: 0,
size: 10,
page: 1
},
btnloading: false,
isEdit: null
}
},
computed: {
sendObjOptions() {
if (this.pushObj === '用户') {
return this.userOptions
} else {
return this.devOptions
}
}
},
async created() {
await this.getUser()
await this.getDev()
this.getTableData()
},
methods: {
getParams() {
const params = {
page: null,
size: null,
sort: 'createTime,desc'
}
params.page = this.page.page - 1
params.size = this.page.size
return params
},
getTableData() {
this.isLoading = true
getNoticeList(this.getParams()).then(res => { // 获取列表
console.log(res, 'res')
const table = res.content
this.page.total = res.totalElements
table.forEach(item => {
item.pushTo = null
item.pushVal = null
if (item.pushType === 2) { // 推送对象为设备
item.pushVal = item.noticeDevices.map(i => { return i.deviceInfoId })
item.pushTo = item.noticeDevices.map(i => {
let dev = null
this.devOptions.forEach(val => {
if (val.value === i.deviceInfoId) {
dev = val.label
}
})
return dev
})
} else if (item.pushType === 1) { // 推送对象为用户
item.pushVal = item.noticeUsers.map(i => { return i.userId })
item.pushTo = item.noticeUsers.map(i => {
let user = null
this.userOptions.forEach(val => {
if (val.value === i.userId) {
user = val.label
}
})
return user
})
}
// 去重
const arrTo = []
const arrVal = []
item.pushTo.forEach(i => {
if (arrTo.indexOf(i) === -1 && i !== null) {
arrTo.push(i)
}
})
item.pushVal.forEach(i => {
if (arrVal.indexOf(i) === -1 && i !== null) {
arrVal.push(i)
}
})
item.pushVal = arrVal
if (item.pushType === 1) { // 用户
item.pushTo = arrVal.length === this.userOptions.length - 1 ? '全部用户' : arrTo
} else {
item.pushTo = arrVal.length === this.devOptions.length - 1 ? '全部设备' : arrTo
}
})
this.tableData = table
this.isLoading = false
})
},
// 获取用户
async getUser() {
await getAllUser().then(res => {
const arr0 = [{ value: 0, label: '全部用户' }]
const arr = res.map(item => {
const val = item.id
const lab = item.dept.name + '-' + item.username
const obj = {
value: val,
label: lab
}
return obj
})
this.userOptions = arr0.concat(arr)
})
},
// 获取设备
async getDev() {
await getAllDev().then(res => {
const arr0 = [{ value: 0, label: '全部设备' }]
const arr = res.map(item => {
const val = item.id
const lab = item.deviceName
const obj = {
value: val,
label: lab
}
return obj
})
this.devOptions = arr0.concat(arr)
})
},
// 每页条数改变
sizeChangeHandler(e) {
this.loading = true
this.page.size = e
this.page.page = 1
this.getTableData()
this.loading = false
},
// 当前页改变
pageChangeHandler(e) {
this.loading = true
this.page.page = e
this.getTableData()
this.loading = false
},
clickRowHandler(row) {
// this.$refs.table.clearSelection()
this.$refs.table.toggleRowSelection(row) // 单选选中
},
selectionChangeHandler(val) {
this.selections = val
console.log(val)
},
// 发布
handleSend() {
this.defaultSelAll()
this.isEdit = false
this.sendVisible = true
},
// 修改
handleEdit() {
this.isEdit = true
this.sendForm.notification = this.selections[0].noticeContent
const temp = this.selections[0].pushVal
if (this.selections[0].pushType === 1) {
this.pushObj = '用户'
this.selectOptions = temp.length === this.userOptions.length - 1 ? [0, ...temp] : temp
} else {
this.pushObj = '设备'
this.selectOptions = temp.length === this.devOptions.length - 1 ? [0, ...temp] : temp
}
this.sendVisible = true
},
// 保存
handleSave() {
this.$refs.formDom.validate((valid) => {
if (valid) {
this.noticeSend(this.getPushParams())
} else {
return false
}
})
},
getPushParams() { // 发布消息参数
const params = {}
params.noticeType = this.noticeType
params.noticeContent = this.sendForm.notification
//* ************** */
if (this.pushObj === '用户') { // 选择用户
params.pushType = 1
params.userId = this.selectOptions.filter(item => item !== 0)
} else { // 选择设备
params.pushType = 2
params.deviceInfoId = this.selectOptions.filter(item => item !== 0)
}
if (this.isEdit) {
params.id = this.selections[0].id
}
console.log(params, '参数')
return params
},
// 调用发布接口
noticeSend(params) {
noticeCreate(params).then(res => {
if (res === 'SUCCESS') {
this.btnloading = false
this.sendVisible = false
// this.getTableData()
this.reload()
this.$message({
message: '发布成功',
type: 'success'
})
this.$refs.formDom.resetFields()
this.$refs.formDom.clearValidate()
} else {
this.btnloading = false
this.$message.error('发布失败')
}
})
},
handleClose() {
this.$refs.formDom.resetFields()
this.$refs.formDom.clearValidate()
this.sendForm.notification = ''
this.pushObj = '用户'
this.noticeType = 1
},
// 删除
handleDel() {
this.delVisible = true
},
// 删除确认
handleDelConfirm() {
const params = this.selections.map(item => { return item.id })
noticeDel(params).then(res => {
if (res === 'SUCCESS') {
// this.getTableData()
this.delVisible = false
this.reload()
this.$message({
message: '删除成功',
type: 'success'
})
} else {
this.$message.error('删除失败')
}
})
},
// 选择器 推送对象
handelChange(val) {
if (val.length === this.sendObjOptions.length) {
this.checked = true
} else {
this.checked = false
}
},
// 默认全选
defaultSelAll() {
this.selectOptions = this.sendObjOptions.map(item => { return item.value })
this.oldSelect = this.selectOptions
this.showTags = true
},
changeSelect(val) {
if (val[val.length - 1] === 0) { // 选中全选
this.defaultSelAll()
this.$refs.selectBox.$el.querySelector('.el-input__inner').style.height = '34px'
} else {
const arr1 = this.oldSelect.filter(item => item !== 0)
const arr2 = val.filter(item => item !== 0)
if (arr1.length === arr2.length) { // 取消全选
this.selectOptions = []
} else if (arr1.length < arr2.length && arr2.length === this.sendObjOptions.length - 1) {
this.defaultSelAll() // 除全选时都选中 此时加入全选
this.$refs.selectBox.$el.querySelector('.el-input__inner').style.height = '34px'
} else {
this.selectOptions = this.selectOptions.filter(item => item !== 0) // 取消其他选项时 去除全选
this.showTags = false
}
this.oldSelect = this.selectOptions
}
},
pushObjChange(val) {
if (val) {
this.defaultSelAll()
this.showTags = true
}
}
}
}
</script>
<style lang="scss" scoped>
@import '~@/assets/styles/lend-manage.scss';
.head-container{
padding-bottom: 0;
}
.container-wrap{
min-height: calc(100vh - 242px)
}
textarea{
background-color: #021941;
border: 1px solid #339CFF;
border-radius: 3px;
&:focus{
outline: none;
}
caret-color: #fff;
color: #fff;
padding: 10px 12px;
font-size: 14px;
}
::v-deep .el-radio-group{
width: 315px;
height: 32px;
border: 1px solid #339CFF;
border-radius: 3px;
padding-left: 14px;
display: flex;
label{
display: flex;
align-items: center;
margin-right: 50px;
span{
color: #3A99FD;
margin-left: 10px;
}
}
}
.el-checkbox{
display: flex;
justify-content: right;
align-items: center;
padding-right: 20px;
}
::v-deep .el-form-item__error{
top: 93%;
}
.tag-hidden{
width: 100%;
overflow: hidden;
text-overflow:ellipsis;
white-space: nowrap;
}
</style>