应急指挥功能模块

liujun0703-新项目开发
liujun 2024-07-19 10:50:07 +08:00
parent d7b3457641
commit 46393379cd
11 changed files with 811 additions and 14 deletions

View File

@ -13,6 +13,7 @@
<script type="text/javascript" charset="utf-8" src="https://api.tianditu.gov.cn/api?v=4.0&tk=e8a16137fd226a62a23cc7ba5c9c78ce"></script>
<script type="text/javascript" src="./static/map/cesium91/CesiumUnminified/Cesium.js"></script>
<script type="text/javascript" src="./static/map/cesium91/CustomCesiumSDK.js"></script>
<script type="text/javascript" src="https://api.map.baidu.com/api?v=1.0&type=webgl&ak=OElqFYoKiAH8KFtph8ftLKF5NlNrbCUr"></script>
<link href="./static/map/cesium91/CesiumUnminified/Widgets/widgets.css" rel="stylesheet"/>
</head>
<body>

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

View File

@ -0,0 +1,39 @@
<template>
<div>
<div id="map"/>
</div>
</template>
<script>
let mapInstance
export default {
data() {
return {
}
},
mounted() {
this.fnMapInit()
},
beforeDestroy() {
mapInstance = null
},
methods: {
fnMapInit() {
mapInstance = new window.BMapGL.Map('map')
mapInstance.centerAndZoom(new window.BMapGL.Point('119.502057', '39.933306'), 15)
mapInstance.enableScrollWheelZoom(true)
},
addPoint() {
}
}
}
</script>
<style scoped lang="scss">
#map {
width: calc(100vw - 210px);
height: calc(100vh - 84px);
}
</style>

View File

@ -0,0 +1,19 @@
<template>
<div>
<mapAssembly/>
</div>
</template>
<script>
import mapAssembly from './components/mapAssembly.vue'
export default {
components: { mapAssembly },
data() {
return {}
}
}
</script>
<style scoped>
</style>

View File

@ -0,0 +1,152 @@
<template>
<el-dialog :visible.sync="visible" :title="title" :v-loading="loading" :before-close="handleClose" width="600px">
<el-form ref="form" :model="form" :rules="rules" label-position="right" label-width="100px">
<el-form-item label="图标名称:" prop="NAME">
<el-input v-model="form.NAME" prop="NAME" style="width: 300px"/>
</el-form-item>
<el-form-item label="类型:" prop="TYPE">
<el-select v-model="form.TYPE" prop="TYPE" style="width: 300px">
<el-option
v-for="item in typeList"
:key="item.DICTIONARIES_ID"
:label="item.name"
:value="item.DICTIONARIES_ID"/>
</el-select>
</el-form-item>
<el-form-item label="图标:" prop="FILE_PATH">
<upload-img
:file-list.sync="form.file"
:multiple="false"
:accept="'.jpg,.png,.gif,.bmp,.jpeg,.jpeg'"
:limit="1"
:upload-type="1"
append-to-body/>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="handleClose"> </el-button>
<el-button type="primary" @click="uploadFile"> </el-button>
</span>
</el-dialog>
</template>
<script>
import { requestFN } from '@/utils/request'
import { upload } from '@/utils/upload'
import uploadImg from '../../../util/uploadImg/index.vue'
export default {
components: { uploadImg },
props: {
title: {
type: String,
default: '新增'
}
},
data() {
return {
visible: false,
loading: false,
config: config,
form: {
NAME: '',
TYPE: '',
TYPE_NAME: '',
FILE_PATH: [],
file: []
},
rules: {},
tree: [],
typeList: []
}
},
methods: {
async init(row) {
await this.getDic()
if (row) {
this.form = JSON.parse(JSON.stringify(row))
this.$set(this.form, 'file', [{ url: config.fileUrl + row.FILE_PATH }])
this.visible = true
} else {
this.visible = true
}
},
goBack() {
this.$parent.activeName = 'list'
},
uploadFile() {
this.$refs.form.validate((valid) => {
if (valid) {
this.loading = true
const formData = new FormData()
if (this.form.file[0] && this.form.file[0].raw) {
for (let i = 0; i < this.form.file.length; i++) {
if (this.form.file[i].raw) {
formData.append('FFILE', this.form.file[i].raw)
}
}
upload('/file/upload', formData).then((data) => {
this.confirm(data.fileurl)
}).catch((e) => {
console.log(e)
})
} else {
this.confirm(this.form.FILE_PATH)
}
} else {
return false
}
})
},
confirm(filePath) {
this.form.FILE_PATH = filePath
// type
this.form.TYPE_NAME = this.typeList.find((item) => {
return item.DICTIONARIES_ID === this.form.TYPE
}).name
requestFN(
'/bi/emergency/saveOrUpdate', this.form
).then((data) => {
this.loading = false
this.handleClose()
this.$emit('refresh')
}).catch((e) => {
this.loading = false
})
},
getDic() {
return new Promise((resolve, reject) => {
requestFN('/dictionaries/listTree', { PARENT_ID: '8cb69dfee64945ce9b644478d1ceff99' })
.then((data) => {
this.typeList = JSON.parse(data.zTreeNodes)
resolve()
}).catch((e) => {
console.log(e)
reject()
})
})
},
handleClose() {
this.form = {
NAME: '',
TYPE: '',
TYPE_NAME: '',
FILE_PATH: [],
file: []
}
this.visible = false
}
}
}
</script>
<style lang="sass" scoped>
.table-ui
td
line-height: 34px
.tbg
width: 200px
.ui-foot
text-align: center
margin-top: 20px
</style>

View File

@ -0,0 +1,407 @@
<template>
<div>
<div class="app-container">
<el-form ref="form" :rules="rules" :model="form" label-width="140px">
<div class="collection_h1">
<h1>临时用电作业许可证</h1>
</div>
<div class="mb-20">
<table class="table-ui">
<tr>
<td class="bbg">用电单位</td>
<td>{{ pd.ELECTRICITY_UNIT }}</td>
<td class="bbg">作业证编号</td>
<td>{{ pd.CHECK_NO }}</td>
</tr>
<tr>
<td class="bbg">用电原因</td>
<td>{{ pd.WORK_CONTENT }}</td>
<td class="bbg">作业地点</td>
<td>{{ pd.WORK_PLACE }}</td>
</tr>
<tr>
<td class="bbg">电源接入点</td>
<td>{{ pd.ACCESS_POINT }}</td>
<td class="bbg">用电设备及功率</td>
<td>{{ pd.EQUIPMENT_POWER }}</td>
</tr>
<tr>
<td class="bbg">危险性分析</td>
<td>{{ pd.RISK_ANALYSIS }}</td>
<td class="bbg">作业实施时间</td>
<td>
{{ formatTime(pd.WORK_START_DATE) }} {{ formatTime(pd.WORK_END_DATE) }}
</td>
</tr>
<tr>
<td class="bbg">安全交底人</td>
<td>{{ pd.SECURITY_CONFIDANT }}</td>
<td class="bbg">作业人员</td>
<td>
<div v-for="(item, index) in pd.WORK_OPERATOR_NAME" :key="index+Math.random()">
{{ index + 1 }}. <span style="margin: 0 15px 0 5px">{{ pd.WORK_OPERATOR_NAME[index] }}</span> 作业证号{{ pd.WORK_OPERATOR_NUMBER[index] }}
</div>
</td>
</tr>
<tr v-for="item in gasList" :key="item.ELECTRICITYGAS_ID">
<td colspan="4" style="padding: 0;">
<table class="table-vi">
<tr>
<td>分析时间</td>
<td>{{ item.ANALYZE_TIME }}</td>
<td>分析点</td>
<td>{{ item.ANALYZE_PLACE }}</td>
</tr>
<tr>
<td>分析结果</td>
<td>{{ item.ANALYZE_RESULT }}</td>
<td>分析人</td>
<td>{{ item.ANALYZE_USER }}</td>
</tr>
</table>
</td>
</tr>
<tr>
<td colspan="4" style="padding: 0;">
<table class="table-vi">
<tr>
<th>主要安全措施</th>
<th class="ccenter select">选项</th>
</tr>
<tr v-for="item in measuresList" :key="item.BUS_ELECTRICITY_MEASURES_ID">
<td>
{{ item.PROTECTIVE_MEASURES }}
</td>
<td class="ccenter select">
<span v-if="item.STATUS=='1'"><input type="radio" disabled checked>合格</span>
<span v-if="item.STATUS=='-1'"><input type="radio" disabled checked>不合格</span>
<span v-if="item.STATUS=='2'"><input type="radio" disabled checked>不涉及</span>
</td>
</tr>
</table>
</td>
</tr>
<tr v-if="otherProtectiveMeasures.length > 0">
<td colspan="4" style="padding: 0;">
<table class="table-vi">
<tr>
<th colspan="2">补充措施</th>
</tr>
<tr v-for="(item,i) in otherProtectiveMeasures" :key="item">
<td v-if="item" class="bbg">
{{ i+1 }}
<!--<span v-if="i==0"></span>
<span v-else-if="i==1">配送电单位</span>
<span v-else-if="i==2">审批人</span>-->
</td>
<td v-if="item">{{ item }}</td>
</tr>
</table>
</td>
</tr>
<tr>
<td colspan="2">
<div><span>安全措施确认人</span>
<span />
</div>
<span class="print-approval-img">
<img v-if="pd.CONFIRM_USER_SIGNER_PATH" :src="config.fileUrl+pd.CONFIRM_USER_SIGNER_PATH">
</span>
<span v-if="pd.CONFIRM_USER_SIGNER_TIME">{{ formatTime(pd.CONFIRM_USER_SIGNER_TIME) }}</span>
</td>
<td colspan="2">
<div><span>作业单位</span>
<span/>
</div>
<span class="print-approval-img">
<img v-if="pd.WORK_USER_SIGNER_PATH" :src="config.fileUrl+pd.WORK_USER_SIGNER_PATH">
</span>
<span v-if="pd.WORK_USER_SIGNER_TIME">{{ formatTime(pd.WORK_USER_SIGNER_TIME) }}</span>
</td>
</tr>
<tr>
<td colspan="2">
<div><span>运维保障部门</span>
<span/>
</div>
<span class="print-approval-img">
<img v-if="pd.ASSURE_USER_SIGNER_PATH" :src="config.fileUrl+pd.ASSURE_USER_SIGNER_PATH">
</span>
<span v-if="pd.ASSURE_USER_SIGNER_TIME">{{ formatTime(pd.ASSURE_USER_SIGNER_TIME) }}</span>
</td>
<td colspan="2">
<div><span>临时用电审批</span>
<span/>
</div>
<span class="print-approval-img">
<img v-if="pd.APPROVE_USER_SIGNER_PATH" :src="config.fileUrl+pd.APPROVE_USER_SIGNER_PATH">
</span>
<span v-if="pd.APPROVE_USER_SIGNER_TIME">{{ formatTime(pd.APPROVE_USER_SIGNER_TIME) }}</span>
</td>
</tr>
</table>
</div>
<div class="level-title">
<h1>作业验收</h1>
</div>
<div class="mb-20">
<el-col :span="12">
<el-form-item label="验收结果" prop="ACCEPT_RESULT_NAME">
<el-radio-group v-model="form.ACCEPT_RESULT_NAME">
<el-radio :label="'通过'">通过</el-radio>
<el-radio :label="'不通过'">不通过</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="验收时间" prop="ACCEPT_TIME">
<el-date-picker v-model="form.ACCEPT_TIME" format="yyyy-MM-dd HH:mm" value-format="yyyy-MM-dd HH:mm" type="datetime" placeholder="用电结束时间" />
</el-form-item>
</el-col>
</div>
</el-form>
</div>
<el-dialog :visible.sync="dialogMap" :title="'坐标位置'" width="80%">
<div>
<iframe :src="iframeSrc" frameborder="0" allowtransparency="true" width="100%" height="600"/>
</div>
</el-dialog>
<el-dialog v-if="dialogWriteSign" :visible.sync="dialogWriteSign" title="手写签字" width="600px" @close="dialogWriteSign = false">
<WriteSign :width="600" :height="300" @subCanvas="subCanvas"/>
</el-dialog>
<div class="ui-height" style="height: 160px" />
<div class="ui-foot">
<el-button @click="goBack"> </el-button>
<el-button type="primary" @click="confirm('1')"> </el-button>
</div>
</div>
</template>
<script>
import { requestFN } from '@/utils/request'
import dateformat from '@/utils/dateformat'
import SelectTree from '@/components/SelectTree'
import WriteSign from '@/components/WriteSign'
import formatDate from '@/utils/dateformat'
export default {
components: { SelectTree, WriteSign },
data() {
return {
config: config,
dialogMap: false,
iframeSrc: '',
treeData: [],
defaultProps: {
value: 'id',
children: 'nodes',
label: 'name'
},
assureUserList: [],
approveUserList: [],
pd: {
WORK_OPERATOR_ID: [],
WORK_OPERATOR_NAME: [],
WORK_OPERATOR_NUMBER: []
}, //
measuresList: [],
form: {
ELECTRICITY_ID: this.$parent.ELECTRICITY_ID,
ACCEPT_RESULT_NAME: '', //
ACCEPT_TIME: formatDate(new Date(), 'YYYY-MM-DD HH:mm'), //
APPLY_STATUS: '4',
CHECK_STATUS: '1',
OPERATOR: JSON.parse(sessionStorage.getItem('user')).USER_ID,
ACTION_USER: JSON.parse(sessionStorage.getItem('user')).NAME
}, //
rules: {
ACCEPT_RESULT_NAME: [{ required: true, message: '请选择验收结果', trigger: 'blur' }],
ACCEPT_TIME: [{ required: true, message: '请选择验收时间', trigger: 'blur' }]
},
gasList: [],
otherProtectiveMeasures: [],
props: {
multiple: true,
emitPath: false,
value: 'id',
label: 'name',
children: 'children'
},
optionsJson: [],
dialogWriteSign: false
}
},
created() {
this.getDict()
this.getData(this.$parent.ELECTRICITY_ID)
},
methods: {
handleMap() {
this.dialogMap = true
this.iframeSrc = this.config.weburl + 'static/maplocation.html?t=' + Math.random()
},
getData(ELECTRICITY_ID) {
this.listLoading = true
requestFN(
'/electricity/goEdit',
{
ELECTRICITY_ID: ELECTRICITY_ID
}
).then((data) => {
this.listLoading = false
this.pd = data.pd // map
this.measuresList = data.measuresList // map
this.gasList = data.gasList // map
this.otherProtectiveMeasures = this.validStr(this.pd.OTHER_PROTECTIVE_MEASURES.replace(/;_;/g, '')) ? this.pd.OTHER_PROTECTIVE_MEASURES.split(';_;') : []
if (!this.pd.WORK_OPERATOR_ID) {
this.$set(this.pd, 'WORK_OPERATOR_ID', [])
} else {
this.pd.WORK_OPERATOR_ID = this.pd.WORK_OPERATOR_ID.split(',')
}
if (!this.pd.WORK_OPERATOR_NAME) {
this.$set(this.pd, 'WORK_OPERATOR_NAME', [])
} else {
this.pd.WORK_OPERATOR_NAME = this.pd.WORK_OPERATOR_NAME.split(',')
}
if (!this.pd.WORK_OPERATOR_NUMBER) {
this.$set(this.pd, 'WORK_OPERATOR_NUMBER', [])
} else {
this.pd.WORK_OPERATOR_NUMBER = this.pd.WORK_OPERATOR_NUMBER.split(',')
}
}).catch((e) => {
this.listLoading = false
})
},
//
confirm(status) {
console.log(this.form)
this.$refs.form.validate(valid => {
if (valid) {
this.listLoading = true
const loading = this.$loading({
lock: true,
text: '数据保存中...',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
})
if (this.form.ACCEPT_RESULT_NAME === '通过') {
this.form.APPLY_STATUS = '4'
this.form.CHECK_STATUS = '1'
} else {
this.form.APPLY_STATUS = '3'
this.form.CHECK_STATUS = '3'
}
requestFN(
'/electricity/editStatus',
{ ...this.form }
).then((data) => {
loading.close()
this.$message({
message: '临时用电作业审批完成。',
type: 'success'
})
this.goBack()
}).catch((e) => {
loading.close()
})
} else {
return false
}
})
},
/** 手写板*/
showModal() {
this.dialogWriteSign = true
},
//
subCanvas(img64) {
// console.info('img64' + img64)
this.form.APPROVE_USER_SIGNER_PATH = img64
this.form.APPROVE_USER_SIGNER_TIME = formatDate(new Date(), 'YYYY-MM-DD HH:mm')
this.dialogWriteSign = false
},
getTreeList() {
return new Promise((resolve) => {
requestFN(
'/department/listTree',
{}
).then((data) => {
this.treeData = JSON.parse(data.zTreeNodes)
resolve()
}).catch((e) => {
})
})
},
updateDept(deptId, list) {
if (list === 'assureUserList') {
this.form.ASSURE_USER_ID = ''
this.form.ASSURE_DEPARTMENT_NAME = this.$refs['deptTree_ASSURE']._data.valueTitle
console.info(this.form)
} else if (list === 'approveUserList') {
this.form.APPROVE_USER_ID = ''
this.form.APPROVE_DEPARTMENT_NAME = this.$refs['deptTree_APPROVE']._data.valueTitle
}
this.getUserList(deptId, list)
},
getUserList(deptId, list) {
requestFN(
'/user/listAll',
{
DEPARTMENT_ID: deptId,
NOMAIN: '1'
}
).then((data) => {
this[list] = data.userList
this.$forceUpdate()
}).catch((e) => {
})
},
//
getDict() {
},
formatTime(date, column) {
if (date) {
return dateformat(date, 'YYYY年MM月DD日HH时mm分')
} else {
return ''
}
},
formatDate(date, column) {
if (date) {
return dateformat(date, 'YYYY-MM-DD')
} else {
return ''
}
},
goBack() {
this.$parent.activeName = 'List'
}
}
}
</script>
<style lang="sass" scoped>
.print-approval-p10
padding: 20px 0
span
vertical-align: middle
.ud-flex
display: flex
.print-approval-img
width: 200px
height: 97px
display: inline-block
img
width: 100%
height: 100%
</style>

View File

@ -0,0 +1,156 @@
<template>
<div class="app-container">
<el-row>
<el-form label-width="80px" label-position="left">
<el-col :span="12">
<el-form-item label="名称:">
<el-input v-model="form.NAME"/>
</el-form-item>
</el-col>
</el-form>
<el-button type="primary" icon="el-icon-search" style="margin-left: 30px" @click="getQuery"></el-button>
<el-button class="filter-item" type="default" icon="el-icon-refresh" @click="resetQuery"></el-button>
</el-row>
<el-table
v-loading="loading"
ref="multipleTable"
:data="list"
:row-key="getRowKey"
:header-cell-style="{'font-weight': 'bold','color': '#000'}"
tooltip-effect="dark"
border
fit
highlight-current-row>
<el-table-column :reserve-selection="true" type="selection" width="55" align="center"/>
<el-table-column type="index" label="序号" width="50" align="center"/>
<el-table-column prop="NAME" label="名称"/>
<el-table-column prop="TYPE_NAME" label="类型名称"/>
<el-table-column prop="FILE_PATH" label="图标类型">
<template slot-scope="{row}">
<el-image
:src="config.fileUrl + row.FILE_PATH"
:preview-src-list="[config.fileUrl +row.FILE_PATH]"
style="width: 100px; height: 100px"/>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="220">
<template slot-scope="{row}">
<el-button type="danger" icon="el-icon-delete" plain @click="handleDelete(row.EMERGENCY_ICON_ID)">
</el-button>
<el-button type="primary" icon="el-icon-edit" @click="goDetail(row)"></el-button>
</template>
</el-table-column>
</el-table>
<div class="page-btn-group">
<div>
<el-button type="primary" @click="handleAdd"></el-button>
</div>
<pagination :total="total" :page.sync="page.page" :limit.sync="page.limit" @pagination="getList"/>
</div>
<add ref="add" @refresh="getList"/>
</div>
</template>
<script>
import Pagination from '@/components/Pagination' // el-pagination
import { requestFN } from '@/utils/request'
import waves from '@/directive/waves'
import Add from './add.vue'
export default {
components: { Add, Pagination },
directives: { waves },
data() {
return {
config: config,
loading: true,
add: false,
del: false,
edit: false,
list: [],
page: {
page: 1,
limit: 20
},
total: 0,
form: {
NAME: ''
}
}
},
created() {
this.getList()
},
methods: {
getRowKey(row) {
return this.validStr(row) ? row.EMERGENCY_ICON_ID : ''
},
//
getQuery() {
this.$refs.multipleTable.clearSelection()
this.getList()
},
resetQuery() {
this.form.NAME = ''
},
//
getList() {
this.loading = true
requestFN('bi/emergency/list?showCount=' + this.page.limit + '&currentPage=' + this.page.page, this.form).then((data) => {
this.loading = false
this.list = data.varList
this.page.total = data.page.totalResult
this.hasButton()
}).catch((e) => {
this.loading = false
})
},
//
hasButton() {
var keys = 'electricity:add,electricity:del,electricity:edit,toExcel'
requestFN(
'/head/hasButton',
{
keys: keys
}
).then((data) => {
this.add = data.electricityfhadminadd //
this.del = data.electricityfhadmindel //
this.edit = data.electricityfhadminedit //
}).catch((e) => {
this.listLoading = false
})
},
handleAdd() {
this.$refs.add.init()
},
goDetail(row) {
this.$refs.add.init(row)
},
handleDelete(id) {
this.$confirm('确定要删除该条数据?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
requestFN(
'/bi/emergency/delete', { id: id }
).then((data) => {
this.getList()
this.$message({
type: 'success',
message: '删除成功!'
})
}).catch((e) => {
console.log(e)
})
}).catch(() => {
this.$message({
type: 'info',
message: '已取消删除'
})
})
}
}
}
</script>

View File

@ -0,0 +1,32 @@
<template>
<div>
<List v-show="activeName === 'List'" ref="list" />
<Detail v-if="activeName === 'Detail'"/>
</div>
</template>
<script>
import List from './components/list'
import Detail from './components/detail'
export default {
components: {
List, Detail
},
data() {
return {
activeName: 'List',
ELECTRICITY_ID: ''
}
},
watch: {
activeName(val) {
if (val === 'List') {
this.$refs.list.getList()
}
}
}
}
</script>
<style scoped>
</style>

View File

@ -9,22 +9,13 @@
:on-exceed="handleExceed"
:accept="accept"
:class="{hide:hideFlag}"
:on-preview="handlePictureCardPreview"
:on-remove="handleRemove"
action="#"
list-type="picture-card">
<i slot="default" class="el-icon-plus"/>
<div slot="file" slot-scope="{file}">
<el-image :src="file.url" alt=""/>
<span class="el-upload-list__item-actions">
<span @click="handlePictureCardPreview(file)">
<i class="el-icon-zoom-in"/>
</span>
<span class="el-upload-list__item-delete" @click="handleRemove(file)">
<i class="el-icon-delete"/>
</span>
</span>
</div>
</el-upload>
<el-dialog :visible.sync="dialogVisible" :append-to-body="appendToBody">
<el-dialog :visible.sync="dialogVisible" :append-to-body="appendToBody" title="图片预览">
<img :src="dialogImageUrl" width="100%" alt="">
</el-dialog>
</div>
@ -63,8 +54,8 @@ export default {
}
},
methods: {
handleRemove(file) {
this.fileList.splice(this.fileList.findIndex(item => item.uid === file.uid), 1)
handleRemove(file, fileList) {
this.$emit('update:fileList', fileList)
if (this.hideUpload) {
if (this.fileList.length < this.limit) {
this.hideFlag = false