From 169c4730c227b35e7d061326aebe9f978f0ab4c8 Mon Sep 17 00:00:00 2001 From: shishuaikang <280848880@qq.com> Date: 星期二, 21 十一月 2023 10:43:31 +0800 Subject: [PATCH] web:安全管理=>区域巡检提交 --- web/src/api/modules/safety.js | 16 web/src/views/SecureManage/RiskGrad/AreaPolling.vue | 391 -------------------- web/src/views/SecureManage/RiskGrad/components/TaskPunchcard.vue | 318 ++++++++++++++++ web/src/components/element/Table.vue | 4 web/src/views/SecureManage/RiskGrad/components/PollingTask.vue | 405 +++++++++++++++++++++ web/src/plugins/directive.js | 1 6 files changed, 751 insertions(+), 384 deletions(-) diff --git a/web/src/api/modules/safety.js b/web/src/api/modules/safety.js index 7926c5f..ad2c24f 100644 --- a/web/src/api/modules/safety.js +++ b/web/src/api/modules/safety.js @@ -236,11 +236,21 @@ }, // 区域巡检 polling: { - getLists: params => - axios.post('/secure/regioninspection/selectPageList', params), + /* 巡检任务 */ + getLists: params => axios.post('/secure/regioninspection/selectPageList', params), insert: params => axios.post('/secure/regioninspection/insertAndUpdate', params), update: params => axios.post('/secure/regioninspection/insertAndUpdate', params), - delete: params => axios.get('/secure/regioninspection/delete', { params }) + delete: params => axios.get('/secure/regioninspection/delete', { params }), + /* 任务打卡 */ + taskcardGetlists: params => axios.post('/secure/regionInspectionRecord/selectPageList', params), + taskcardGetregions: params => axios.post('/secure/regionInspectionRecord/selectInfo', params), + taskcardGetregionInfo: params => axios.post('/secure/regionInspectionRecord/regionInfo', params), + taskcardExport: params => axios({ + method: 'post', + url:'/secure/regionInspectionRecord/export', + responseType:'blob', + data: params, + }), } }, /** diff --git a/web/src/components/element/Table.vue b/web/src/components/element/Table.vue index 6460b08..cea6aa4 100644 --- a/web/src/components/element/Table.vue +++ b/web/src/components/element/Table.vue @@ -150,5 +150,9 @@ overflow: auto; border: none; height: 100%; + + ::v-deep .cell { + white-space: pre-wrap; + } } </style> \ No newline at end of file diff --git a/web/src/plugins/directive.js b/web/src/plugins/directive.js index ded1455..cbc0d89 100644 --- a/web/src/plugins/directive.js +++ b/web/src/plugins/directive.js @@ -12,6 +12,7 @@ value === 'insert' && (el.className += ' search_btn') value === 'update' && (el.className += ' table_btn') value === 'delete' && (el.className += ' delete_btn') + value === 'export' && (el.className += ' search_btn') } else { el.parentNode.removeChild(el) } diff --git a/web/src/views/SecureManage/RiskGrad/AreaPolling.vue b/web/src/views/SecureManage/RiskGrad/AreaPolling.vue index 5a9c94f..3a0ed7f 100644 --- a/web/src/views/SecureManage/RiskGrad/AreaPolling.vue +++ b/web/src/views/SecureManage/RiskGrad/AreaPolling.vue @@ -7,400 +7,29 @@ <el-tab-pane label="任务打卡" name="second"></el-tab-pane> </el-tabs> </div> - <div class="main_header"> - <div class="header_item"> - <span class="header_label">巡检任务:</span> - <el-input size="mini" v-model="queryInfo.task" placeholder="请输入巡检任务" clearable></el-input> - </div> - <div class="header_item"> - <span class="header_label">巡检人员:</span> - <el-input size="mini" v-model="queryInfo.realName" placeholder="请输入巡检人员" clearable></el-input> - </div> - <div class="header_item"> - <el-button icon="el-icon-search" v-permission="'search'" @click="queryReset">查询</el-button> - <el-button icon="el-icon-plus" v-permission="'insert'" @click="addRow">新增</el-button> - </div> - </div> - <div class="main_content"> - <cpn-table :table-index="true" :table-loading="tableConfig.loading" :table-data="tableConfig.tableData" - :table-columns="tableConfig.tableColumns" :page-total="tableConfig.total" :page-num.sync="queryInfo.pageNum" - :page-size.sync="queryInfo.pageSize" :page-change="pageChange"> - </cpn-table> - </div> - <!-- dialog --> - <el-dialog width="400px" class="prop_dialog" v-if="isRenderDialog" :title="dialogTitle" :visible.sync="asyncVisible" - @close="closeForm"> - - <!-- <cpn-form :form-config="formConfig" :form-items="formConfig.formItems"></cpn-form> --> - - <el-form class="rule_form" ref="ruleForm" :model="ruleForm" :rules="rules" label-width="auto"> - - <el-form-item label="巡检任务:" prop="task"> - <el-input v-model="ruleForm.task" placeholder="请输入巡检任务" clearable></el-input> - </el-form-item> - - <el-form-item label="巡检标准:" prop="standard"> - <el-input type="textarea" v-model="ruleForm.standard" placeholder="请输入巡检标准" clearable></el-input> - </el-form-item> - - <el-form-item label="巡检人员:" prop="realNames"> - <el-select v-model="ruleForm.realNames" multiple value-key="id" placeholder="请选择巡检人员"> - <el-option v-for="item in allPersons" :key="item.id" :label="item.label" :value="item"></el-option> - </el-select> - </el-form-item> - - <div class="divider"><span>巡检路线</span></div> - - <el-form-item label-width="0" v-for="(itemP, index) in ruleForm.paths " :key="index" :prop="'paths.' + - index + '.value'" :rules="{ required: true, message: '请选择巡检路线', trigger: 'change' }"> - <el-select style="margin-right: 10px;width: 323px;" v-model="itemP.value" value-key="id" - placeholder="请选择巡检路线"> - <el-option v-for=" item in allPath" :key="item.id" :label="item.label" :value="item"></el-option> - </el-select> - <el-button class="delete_btn" @click="delPath(itemP)">删除</el-button> - <el-button class="table_btn" v-show="index === ruleForm.paths.length - 1" - @click="addPath">添加</el-button> - </el-form-item> - <!-- <el-form-item label="区域名称:" prop="regionHazardInformId"> - <el-select v-model="ruleForm.regionHazardInformId" placeholder="请选择区域名称"> - <el-option v-for="item in areaNames" :key="item.id" :label="item.region" :value="item.id"> - </el-option> - </el-select> - </el-form-item> --> - </el-form> - <div slot="footer"> - <el-button @click="asyncVisible = false">取 消</el-button> - <el-button class="submit_btn" @click="onSubmit('ruleForm')">提 交</el-button> - </div> - </el-dialog> + <component :is="cpns[activeName]"></component> </div> </template> <script> -import {throttle} from '@/plugins/public' -import cpnTable from '@/components/element/Table' -// import cpnForm from '@/components/element/Form' +import PollingTask from './components/PollingTask' // 巡检任务 +import TaskPunchcard from './components/TaskPunchcard' // 任务打卡 export default { data() { return { - isRenderDialog: false, - asyncVisible: false, - activeName: 'first', // tabs切换 - submitMode: '', // 提交方式: add / update - allPersons: [], // 巡检人员 - allPath: [], // 巡检路线 - queryInfo: { - pageNum: 1, - pageSize: 10, - task: '', - realName: '', - }, - ruleForm: { - id: '', - task: '', - standard: '', - realNames: [], - paths: [ - {value: ''}, - ], - }, - rules: { - task: [{required: true, message: '请输入巡检任务', trigger: 'blur'}], - standard: [{required: true, message: '请输入巡检标准', trigger: 'blur'}], - realNames: [{required: true, message: '请选择巡检人员', trigger: 'change'}], - }, - tableConfig: { - loading: true, - tableData: [], - tableColumns: [], - total: 0, - }, - formConfig: {} + activeName: 'first', + cpns: { + first: 'PollingTask', + second: 'TaskPunchcard', + } } }, components: { - cpnTable, - // cpnForm, + PollingTask, + TaskPunchcard, }, - computed: { - isUpdate() { - return this.submitMode === 'update' - }, - dialogTitle() { - return this.isUpdate ? '修改巡检任务' : '新增巡检任务' - }, - }, - beforeCreate() { - this.$http = this.$api.Safety.RiskGrad.polling - }, - created() { - this.setTableColumn() - this.setFormColumn() - this.getLists() - }, - methods: { - // 获取table列表数据 - getLists() { - let params = this.queryInfo - let tableConfig = this.tableConfig - this.$http.getLists(params).then(res => { - if (res.statusMsg === 'ok') { - tableConfig.total = res.data.total - tableConfig.tableData = res.data.list - } - tableConfig.loading = false - }) - }, - // 获取管服人员数据(巡检人员) - getPerson() { - return new Promise(resolve => { - this.$api.Personnerl.SEARCHMORTGAGEELIST({ - userType: 1, - pageNum: 1, - pageSize: 9999 - }).then((res) => { - if (res.success) { - const list = res.data.list - const out = [] - list.forEach(item => { - out.push({ - id: item.userId, - label: item.realName, - }) - }) - this.allPersons.push(...out) - resolve() - } - }) - }) - }, - // 获取巡检路线 - getPath() { - new Promise(resolve => { - this.$api.Safety.RiskGrad.warning.getLists({ - pageNum: 1, - pageSize: 9999 - }).then((res) => { - if (res.success) { - const list = res.data.list - const out = [] - list.forEach(item => { - out.push({ - id: item.id, - label: item.region - }) - }) - this.allPath.push(...out) - resolve() - } - }) - }) - }, - // 初始化 table 配置 - setTableColumn() { - this.tableConfig.tableColumns = [ - {index: true}, - {name: "巡检任务", key: "task"}, - {name: "巡检标准", key: "standard"}, - {name: "巡检人员", key: "regionUsersList", formatter: row => row.realNames}, - {name: "巡检路线", key: "regionList", formatter: row => row.regions}, - { - operation: true, name: "操作", width: 140, value: [ - {name: "修改", permission: "update", handleRow: this.updateRow}, - {name: "删除", permission: "delete", handleRow: this.deleteRow},] - }, - ] - }, - // 初始化 form 配置 - setFormColumn() { - this.formConfig = { - formModels: { - task: '', - standard: '', - realNames: [], - }, - formItems: [ - {type: 'input', label: '巡检任务'}, - {type: 'textarea', label: '巡检标准'}, - { - type: 'select', label: '用户状态', options: this.allPersons, - } - // { - // type: 'datepicker', label: '创建时间', otherOptions: { - // startPlaceholder: '开始时间', - // endPlaceholder: '结束时间', - // type: 'daterange', - // 'unlink-panels': true - // } - // } - ], - itemColLayout: { - span: 8 - } - } - }, - // 查询按钮列表信息 - queryReset() { - this.queryInfo.pageNum = 1 - this.queryInfo.pageSize = 10 - this.getLists() - }, - // 重置表单 - resetForm(formName) { - this.$refs[formName].resetFields() - this.ruleForm.paths = [{value: ''}] - }, - // 显示表单 - async showForm() { - !this.allPath.length && this.getPath() - !this.allPersons.length && this.getPerson() - !this.isRenderDialog && (this.isRenderDialog = true) - this.asyncVisible = true - }, - closeForm() { - this.resetForm('ruleForm') - this.asyncVisible = false - }, - // 添加数据 - addRow() { - this.submitMode = 'add' - this.showForm() - - - console.log(this.allPersons) - console.log(this.formConfig) - }, - updateRow(row) { - this.submitMode = 'update' - this.showForm() - this.$nextTick(() => { - const {id, task, standard, regionUsersList, regionList} = row - const realNames = regionUsersList.map(item => { - return { - id: item.userId, - label: item.realName, - } - }) - const paths = regionList.map(item => { - return { - value: { - id: item.regionHazardInformId, - label: item.region, - }, - } - }) - this.ruleForm = { - id, - task, - standard, - realNames, - paths, - } - }) - }, - deleteRow(row) { - const params = {id: row.id} - this.$confirm("该操作将删除该信息,是否继续删除?", "提示", { - confirmButtonText: "确定", - cancelButtonText: "取消", - type: "warning" - }).then(() => { - this.$http.delete(params).then(res => { - if (res.statusMsg === 'ok') { - this.queryReset() - this.$message.success("删除成功!") - } else { - this.$message.warning(res.statusMsg) - } - }) - }).catch(() => { - this.$message.warning("您已取消") - }) - - }, - // 提交表单 - onSubmit: throttle(function (formName) { - this.$refs[formName].validate(valid => { - if (!valid) return - const {id, task, standard, realNames, paths} = this.ruleForm - const regionList = paths.map((item, index) => { - return { - sort: index + 1, - regionHazardInformId: item.value.id, - } - }) - const regionUsersList = realNames.map(item => { - return { - userId: item.id, - } - }) - const params = { - task, - standard, - regionList, - regionUsersList, - } - if (this.isUpdate) { - // 更新 - params.id = id - this.$http.update(params).then((res) => { - if (res.statusMsg === 'ok') { - this.closeForm() - this.getLists() - this.$message.success('更新成功!') - } else { - this.$message.warning(res.statusMsg) - } - }) - } else { - // 添加 - this.$http.insert(params).then((res) => { - if (res.statusMsg === 'ok') { - this.closeForm() - this.getLists() - this.$message.success('添加成功!') - } else { - this.$message.warning(res.statusMsg) - } - }) - } - }) - }, 1000), - addPath() { - this.ruleForm.paths.push({ - value: '' - }) - }, - delPath(item) { - var index = this.ruleForm.paths.indexOf(item) - if (index !== -1) { - this.ruleForm.paths.splice(index, 1) - } - }, - pageChange() { - this.getLists() - }, - } } </script> <style lang="scss" scoped> @import '@/style/layout-main.scss'; - -.divider { - position: relative; - margin-bottom: 30px; - text-indent: 10px; - color: #fff; - border-left: 3px solid #18F6F8; - - &::after { - content: ""; - position: absolute; - left: 0; - bottom: -8px; - width: 100%; - padding: 20px 0; - border-bottom: 1px solid #0C4D6F; - } -} </style> \ No newline at end of file diff --git a/web/src/views/SecureManage/RiskGrad/components/PollingTask.vue b/web/src/views/SecureManage/RiskGrad/components/PollingTask.vue new file mode 100644 index 0000000..e02fce3 --- /dev/null +++ b/web/src/views/SecureManage/RiskGrad/components/PollingTask.vue @@ -0,0 +1,405 @@ +<!-- 安全管理 ==> 风险分级管控 => 区域巡检(巡检任务)--> +<template> + <div> + <div class="main_header"> + <div class="header_item"> + <span class="header_label">巡检任务:</span> + <el-input size="mini" v-model="queryInfo.task" placeholder="请输入巡检任务" clearable></el-input> + </div> + <div class="header_item"> + <span class="header_label">巡检人员:</span> + <el-input size="mini" v-model="queryInfo.realName" placeholder="请输入巡检人员" clearable></el-input> + </div> + <div class="header_item"> + <el-button icon="el-icon-search" v-permission="'search'" @click="queryReset">查询</el-button> + <el-button icon="el-icon-plus" v-permission="'insert'" @click="addRow">新增</el-button> + </div> + </div> + <div class="main_content"> + <cpn-table :table-index="true" :table-loading="tableConfig.loading" :table-data="tableConfig.tableData" + :table-columns="tableConfig.tableColumns" :page-total="tableConfig.total" :page-num.sync="queryInfo.pageNum" + :page-size.sync="queryInfo.pageSize" :page-change="pageChange"> + </cpn-table> + </div> + <!-- dialog --> + <el-dialog width="400px" class="prop_dialog" v-if="isRenderDialog" :title="dialogTitle" :visible.sync="asyncVisible" + @close="closeForm"> + + <!-- <cpn-form :form-config="formConfig" :form-items="formConfig.formItems"></cpn-form> --> + + <el-form class="rule_form" ref="ruleForm" :model="ruleForm" :rules="rules" label-width="auto"> + + <el-form-item label="巡检任务:" prop="task"> + <el-input v-model="ruleForm.task" placeholder="请输入巡检任务" clearable></el-input> + </el-form-item> + + <el-form-item label="巡检标准:" prop="standard"> + <el-input type="textarea" v-model="ruleForm.standard" placeholder="请输入巡检标准" clearable></el-input> + </el-form-item> + + <el-form-item label="巡检人员:" prop="realNames"> + <el-select v-model="ruleForm.realNames" multiple value-key="id" placeholder="请选择巡检人员"> + <el-option v-for="item in allPersons" :key="item.id" :label="item.label" :value="item"></el-option> + </el-select> + </el-form-item> + + <div class="divider"><span>巡检路线</span></div> + + <el-form-item label-width="0" v-for="(itemP, index) in ruleForm.paths " :key="index" :prop="'paths.' + + index + '.value'" :rules="{ required: true, message: '请选择巡检路线', trigger: 'change' }"> + <el-select style="margin-right: 10px;width: 323px;" v-model="itemP.value" value-key="id" + placeholder="请选择巡检路线"> + <el-option v-for=" item in allPath" :key="item.id" :label="item.label" :value="item"></el-option> + </el-select> + <el-button class="delete_btn" @click="delPath(itemP)">删除</el-button> + <el-button class="table_btn" v-show="index === ruleForm.paths.length - 1" + @click="addPath">添加</el-button> + </el-form-item> + <!-- <el-form-item label="区域名称:" prop="regionHazardInformId"> + <el-select v-model="ruleForm.regionHazardInformId" placeholder="请选择区域名称"> + <el-option v-for="item in areaNames" :key="item.id" :label="item.region" :value="item.id"> + </el-option> + </el-select> + </el-form-item> --> + </el-form> + <div slot="footer"> + <el-button @click="asyncVisible = false">取 消</el-button> + <el-button class="submit_btn" @click="onSubmit('ruleForm')">提 交</el-button> + </div> + </el-dialog> + </div> +</template> +<script> +import {throttle} from '@/plugins/public' +import cpnTable from '@/components/element/Table' +// import cpnForm from '@/components/element/Form' +export default { + data() { + return { + isRenderDialog: false, + asyncVisible: false, + submitMode: '', // 提交方式: add / update + allPersons: [], // 巡检人员 + allPath: [], // 巡检路线 + queryInfo: { + pageNum: 1, + pageSize: 10, + task: '', + realName: '', + }, + ruleForm: { + id: '', + task: '', + standard: '', + realNames: [], + paths: [ + {value: ''}, + ], + }, + rules: { + task: [{required: true, message: '请输入巡检任务', trigger: 'blur'}], + standard: [{required: true, message: '请输入巡检标准', trigger: 'blur'}], + realNames: [{required: true, message: '请选择巡检人员', trigger: 'change'}], + }, + tableConfig: { + loading: '', + tableData: [], + tableColumns: [], + total: 0, + }, + formConfig: {} + } + }, + components: { + cpnTable, + // cpnForm, + }, + computed: { + isUpdate() { + return this.submitMode === 'update' + }, + dialogTitle() { + return this.isUpdate ? '修改巡检任务' : '新增巡检任务' + }, + }, + beforeCreate() { + this.$http = this.$api.Safety.RiskGrad.polling + }, + created() { + this.setTableColumn() + this.setFormColumn() + this.getLists() + }, + methods: { + // 获取table列表数据 + getLists() { + let params = this.queryInfo + let tableConfig = this.tableConfig + tableConfig.loading = true + this.$http.getLists(params).then(res => { + if (res.statusMsg === 'ok') { + tableConfig.total = res.data.total + tableConfig.tableData = res.data.list + } + tableConfig.loading = false + }) + }, + // 获取管服人员数据(巡检人员) + getPerson() { + return new Promise(resolve => { + this.$api.Personnerl.SEARCHMORTGAGEELIST({ + userType: 1, + pageNum: 1, + pageSize: 9999 + }).then((res) => { + if (res.success) { + const list = res.data.list + const out = [] + list.forEach(item => { + out.push({ + id: item.userId, + label: item.realName, + }) + }) + this.allPersons.push(...out) + resolve() + } + }) + }) + }, + // 获取巡检路线 + getPath() { + new Promise(resolve => { + this.$api.Safety.RiskGrad.warning.getLists({ + pageNum: 1, + pageSize: 9999 + }).then((res) => { + if (res.success) { + const list = res.data.list + const out = [] + list.forEach(item => { + out.push({ + id: item.id, + label: item.region + }) + }) + this.allPath.push(...out) + resolve() + } + }) + }) + }, + // 初始化 table 配置 + setTableColumn() { + this.tableConfig.tableColumns = [ + {index: true}, + {name: "巡检任务", key: "task"}, + {name: "巡检标准", key: "standard"}, + {name: "巡检人员", key: "regionUsersList", formatter: row => row.realNames}, + { + name: "巡检路线", align: 'left', key: "regions", formatter: row => { + return row.regions.replace(/,/g, ',\n') + } + }, + { + name: "巡检状态", key: "status", width: 120, formatter: row => { + return row.status === 1 ? '已完成' : '待巡检' + } + }, + { + operation: true, name: "操作", width: 140, value: [ + {name: "修改", permission: "update", handleRow: this.updateRow}, + {name: "删除", permission: "delete", handleRow: this.deleteRow},] + }, + ] + }, + // 初始化 form 配置 + setFormColumn() { + this.formConfig = { + formModels: { + task: '', + standard: '', + realNames: [], + }, + formItems: [ + {type: 'input', label: '巡检任务'}, + {type: 'textarea', label: '巡检标准'}, + { + type: 'select', label: '用户状态', options: this.allPersons, + } + // { + // type: 'datepicker', label: '创建时间', otherOptions: { + // startPlaceholder: '开始时间', + // endPlaceholder: '结束时间', + // type: 'daterange', + // 'unlink-panels': true + // } + // } + ], + itemColLayout: { + span: 8 + } + } + }, + // 查询按钮列表信息 + queryReset() { + this.queryInfo.pageNum = 1 + this.queryInfo.pageSize = 10 + this.getLists() + }, + // 重置表单 + resetForm(formName) { + this.$refs[formName].resetFields() + this.ruleForm.paths = [{value: ''}] + }, + // 显示表单 + async showForm() { + !this.allPath.length && this.getPath() + !this.allPersons.length && this.getPerson() + !this.isRenderDialog && (this.isRenderDialog = true) + this.asyncVisible = true + }, + closeForm() { + this.resetForm('ruleForm') + this.asyncVisible = false + }, + // 添加数据 + addRow() { + this.submitMode = 'add' + this.showForm() + }, + updateRow(row) { + this.submitMode = 'update' + this.showForm() + this.$nextTick(() => { + const {id, task, standard, regionUsersList, regionList} = row + const realNames = regionUsersList.map(item => { + return { + id: item.userId, + label: item.realName, + } + }) + const paths = regionList.map(item => { + return { + value: { + id: item.regionHazardInformId, + label: item.region, + }, + } + }) + this.ruleForm = { + id, + task, + standard, + realNames, + paths, + } + }) + }, + deleteRow(row) { + const params = {id: row.id} + this.$confirm("该操作将删除该信息,是否继续删除?", "提示", { + confirmButtonText: "确定", + cancelButtonText: "取消", + type: "warning" + }).then(() => { + this.$http.delete(params).then(res => { + if (res.statusMsg === 'ok') { + this.queryReset() + this.$message.success("删除成功!") + } else { + this.$message.warning(res.statusMsg) + } + }) + }).catch(() => { + this.$message.warning("您已取消") + }) + + }, + // 提交表单 + onSubmit: throttle(function (formName) { + this.$refs[formName].validate(valid => { + if (!valid) return + const {id, task, standard, realNames, paths} = this.ruleForm + const regionList = paths.map((item, index) => { + return { + sort: index + 1, + regionHazardInformId: item.value.id, + } + }) + const regionUsersList = realNames.map(item => { + return { + userId: item.id, + } + }) + const params = { + task, + standard, + regionList, + regionUsersList, + } + if (this.isUpdate) { + // 更新 + params.id = id + this.$http.update(params).then((res) => { + if (res.statusMsg === 'ok') { + this.closeForm() + this.getLists() + this.$message.success('更新成功!') + } else { + this.$message.warning(res.statusMsg) + } + }) + } else { + // 添加 + this.$http.insert(params).then((res) => { + if (res.statusMsg === 'ok') { + this.closeForm() + this.getLists() + this.$message.success('添加成功!') + } else { + this.$message.warning(res.statusMsg) + } + }) + } + }) + }, 1000), + addPath() { + this.ruleForm.paths.push({ + value: '' + }) + }, + delPath(item) { + var index = this.ruleForm.paths.indexOf(item) + if (index !== -1) { + this.ruleForm.paths.splice(index, 1) + } + }, + pageChange() { + this.getLists() + }, + } +} +</script> + +<style lang="scss" scoped> +@import '@/style/layout-main.scss'; + +.divider { + position: relative; + margin-bottom: 30px; + text-indent: 10px; + color: #fff; + border-left: 3px solid #18F6F8; + + &::after { + content: ""; + position: absolute; + left: 0; + bottom: -8px; + width: 100%; + padding: 20px 0; + border-bottom: 1px solid #0C4D6F; + } +} +</style> \ No newline at end of file diff --git a/web/src/views/SecureManage/RiskGrad/components/TaskPunchcard.vue b/web/src/views/SecureManage/RiskGrad/components/TaskPunchcard.vue new file mode 100644 index 0000000..b0063ac --- /dev/null +++ b/web/src/views/SecureManage/RiskGrad/components/TaskPunchcard.vue @@ -0,0 +1,318 @@ +<!-- 安全管理 ==> 风险分级管控 => 区域巡检(任务打卡)--> +<template> + <div> + <div class="main_header"> + <div class="header_item"> + <span class="header_label">巡检人:</span> + <el-input size="mini" v-model="queryInfo.realName" placeholder="请输入巡检人" clearable></el-input> + </div> + <div class="header_item"> + <span class="header_label">巡检状态:</span> + <el-select size="mini" v-model="queryInfo.status"> + <el-option v-for="item in queryStatus" :key="item.value" :label="item.label" :value="item.value" + placeholder="请选择巡检状态"></el-option> + </el-select> + </div> + <div class="header_item"> + <span class="header_label">时间范围:</span> + <el-date-picker type="daterange" v-model="times" value-format="yyyy-MM-dd" start-placeholder="起始时间" + end-placeholder="结束时间" @change="changeTime" clear></el-date-picker> + </div> + <div class="header_item"> + <el-button icon="el-icon-search" v-permission="'search'" @click="queryReset">查询</el-button> + <el-button icon="el-icon-plus" v-permission="'export'" @click="exportExcel">导出Excel</el-button> + </div> + </div> + <div class="main_content"> + <cpn-table :table-index="true" :table-loading="tableConfig.loading" :table-data="tableConfig.tableData" + :table-columns="tableConfig.tableColumns" :page-total="tableConfig.total" :page-num.sync="queryInfo.pageNum" + :page-size.sync="queryInfo.pageSize" :page-change="pageChange"> + </cpn-table> + </div> + + <!-- 详情dialog --> + <el-dialog width="400px" class="prop_dialog" v-if="isRenderDialog" title="详情" :visible.sync="asyncVisible"> + + <el-form class="rule_form" label-width="auto"> + + <div class="divider"></div> + + <el-form-item label="巡检任务:">{{ info.task }}</el-form-item> + + <el-form-item label="巡检标准:">{{ info.standard }}</el-form-item> + + <el-form-item label="巡检人员:">{{ info.name }}</el-form-item> + + <div class="divider"><span>巡检路线</span></div> + + <div class="regions"> + <div class="region" v-for="item in info.regions" :key="item.regionId" + @click="regionClick(item.regionId)">{{ + item.region }} + </div> + </div> + </el-form> + </el-dialog> + + <!-- 区域信息dialog --> + <el-dialog width="400px" class="prop_dialog" v-if="regionInfos.isRenderDialog" title="详情" + :visible.sync="regionInfos.asyncVisible"> + + <el-form class="rule_form" label-width="auto"> + + <div class="divider"></div> + + <el-form-item label="巡检时间:">{{ regionInfos.time }}</el-form-item> + + <el-form-item label="巡检区域:">{{ regionInfos.region }}</el-form-item> + + <el-form-item label="巡检结果:">{{ regionInfos.res }}</el-form-item> + + <el-form-item label="上传图片:"> + <el-image class="image" v-for="(item, index) in regionInfos.img" :key="index" :src="item" fit="contain" + :preview-src-list="regionInfos.img"></el-image> + </el-form-item> + + <el-form-item label="获取当前位置:">{{ regionInfos.location }}</el-form-item> + </el-form> + </el-dialog> + </div> +</template> +<script> +import cpnTable from '@/components/element/Table' +import {downFiles} from '@/plugins/public' +export default { + data() { + return { + isRenderDialog: false, + asyncVisible: false, + info: { // 详情信息 + task: '', + standard: '', + name: '', + regions: [], + }, + userId: '', // 存储点击后的用户id + taskId: '', // 存储点击后的巡检任务id + times: [], // 时间范围 + queryStatus: [ + {value: '0', label: '待巡检'}, + {value: '1', label: '已完成'}, + ], + queryInfo: { + pageNum: 1, + pageSize: 10, + status: '', + realName: '', + startTime: '', + endTime: '', + }, + tableConfig: { + loading: '', + tableData: [], + tableColumns: [], + total: 0, + }, + regionInfos: { // 巡检路线详情 + isRenderDialog: false, + asyncVisible: false, + time: '', // 巡检时间 + region: '', // 巡检区域 + res: '', // 巡检结果 + img: '', // 上传的图片 + location: '', // 位置 + } + } + }, + components: { + cpnTable, + }, + beforeCreate() { + this.$http = this.$api.Safety.RiskGrad.polling + }, + created() { + this.setTableColumn() + this.getLists() + }, + methods: { + // 获取table列表数据 + getLists() { + let params = this.queryInfo + let tableConfig = this.tableConfig + tableConfig.loading = true + this.$http.taskcardGetlists(params).then(res => { + if (res.statusMsg === 'ok') { + tableConfig.total = res.data.total + tableConfig.tableData = res.data.list + } + tableConfig.loading = false + }) + }, + // 获取巡检路线的id (用来点击展示详情) + getRegionId() { + + }, + // 初始化 table 配置 + setTableColumn() { + this.tableConfig.tableColumns = [ + {index: true}, + {name: "巡检时间", key: "inspectionTime"}, + {name: "巡检任务", key: "task"}, + { + name: "巡检路线", align: 'left', key: "region", formatter: row => { + return row.region.replace(/,/g, ',\n') + } + }, + {name: "巡检人", key: "realName"}, + { + name: "巡检状态", key: "status", width: 120, formatter: row => { + return row.status === 1 ? '已完成' : '待巡检' + } + }, + { + operation: true, name: "操作", width: 120, value: [ + {name: "详情", handleRow: this.detailRow}] + }, + ] + }, + // 查询按钮列表信息 + queryReset() { + this.queryInfo.pageNum = 1 + this.queryInfo.pageSize = 10 + this.getLists() + }, + showDialog() { + if (!this.isRenderDialog) { + this.isRenderDialog = true + } + this.asyncVisible = true + }, + showRegionDialog() { + if (!this.regionInfos.isRenderDialog) { + this.regionInfos.isRenderDialog = true + } + this.regionInfos.asyncVisible = true + }, + detailRow(row) { + this.info.task = row.task + this.info.standard = row.standard + this.info.name = row.realName + this.info.regions = [] + + this.userId = row.userId + this.taskId = row.regionInspectionId + const params = { + userId: row.userId, + regionInspectionId: row.regionInspectionId, + } + this.$http.taskcardGetregions(params).then(res => { + if (res.statusMsg === 'ok') { + let regions = [] + res.data.regionList.forEach(item => { + regions.push({ + regionId: item.regionHazardInformId, + region: item.region, + }) + }) + this.info.regions.push(...regions) + } + }) + this.showDialog() + }, + regionClick(regionId) { + const params = { + userId: this.userId, + regionInspectionId: this.taskId, + regionHazardInformId: regionId, + } + this.$http.taskcardGetregionInfo(params).then(res => { + if (res.statusMsg === 'ok') { + this.regionInfos.time = res.data.inspectionTime + this.regionInfos.region = res.data.region + this.regionInfos.res = res.data.result + this.regionInfos.location = res.data.location + this.regionInfos.img = [] + + if (res.data.imgPaths) { + let arr = [] + res.data.imgPaths.split(',').forEach(item => { + arr.push(process.env.VUE_APP_BASE_URL + '/' + item) + }) + this.regionInfos.img.push(...arr) + } + } + this.showRegionDialog() + }) + }, + exportExcel() { + let params = this.queryInfo + this.$http.taskcardExport(params).then(res => { + downFiles(res, '任务打卡', 'xls') + }) + }, + changeTime(times) { + if (times.length) { + this.queryInfo.startTime = times[0] + this.queryInfo.endTime = times[1] + } + }, + pageChange() { + this.getLists() + }, + } +} +</script> + +<style lang="scss" scoped> +@import '@/style/layout-main.scss'; + +.rule_form { + color: #fff; + + ::v-deep .el-form-item__content { + display: block; + } + + .image { + flex: none; + width: 91px; + height: 120px; + margin-right: 15px; + border-radius: 5px; + border: 1px solid #0c5983; + + img { + width: 100%; + } + } +} + +.regions { + text-align: center; + + .region { + line-height: 34px; + margin-bottom: 16px; + background: rgba(56, 175, 247, .25); + cursor: pointer; + } +} + +.divider { + position: relative; + margin-bottom: 30px; + text-indent: 10px; + color: #fff; + border-left: 3px solid #18F6F8; + + &::after { + content: ""; + position: absolute; + left: 0; + bottom: -8px; + width: 100%; + padding: 20px 0; + border-bottom: 1px solid #0C4D6F; + } +} +</style> \ No newline at end of file -- Gitblit v1.9.3