叶松
2023-11-28 5e19b759566b2bf0aed0771206cea54aaba0874e
web/src/views/SecureManage/NipCheck/NipTips.vue
@@ -1,3 +1,416 @@
<template>
    <div>防患举报</div>
</template>
  <div class="main">
    <div class="main_header">
      <div class="header_item">
        <span class="header_label">举报时间:</span>
        <el-date-picker
            v-model="search.time"
            type="daterange"
            value-format="yyyy-MM-dd HH:mm:ss"
            :default-time="['00:00:00','23:59:59']"
            range-separator="-"
            start-placeholder="起始时间"
            end-placeholder="结束时间">
        </el-date-picker>
      </div>
      <div class="header_item">
        <el-button icon="el-icon-search" v-if="showButton('search')" @click="searchButtonInfo(true)">查询</el-button>
        <el-button class="search_btn" icon="el-icon-plus" v-if="showButton('insert')" @click="exportFiles">导出Excel</el-button>
      </div>
    </div>
    <div class="main_content">
      <el-table
        v-loading="loading"
        :data="dataList"
        height="100%">
        <el-table-column align="center" label="序号" width="60">
          <template #default="scope">
            <span>{{(pageNum - 1) * pageSize + scope.$index + 1}}</span>
          </template>
        </el-table-column>
        <el-table-column prop="createTime" label="举报时间" align="center" width="150"></el-table-column>
        <el-table-column prop="dangerLocation" label="隐患地点" align="center" ></el-table-column>
        <el-table-column prop="title" label="隐患标题" align="center" show-overflow-tooltip></el-table-column>
        <el-table-column prop="reporter" label="提交人" align="center" show-overflow-tooltip></el-table-column>
        <el-table-column prop="levelName" label="隐患等级" align="center" show-overflow-tooltip></el-table-column>
        <el-table-column prop="auditStatusName" label="审核状态" align="center" width="150"></el-table-column>
        <el-table-column prop="integral" label="积分" align="center" ></el-table-column>
        <el-table-column label="操作" align="center" width="250">
          <template #default="{ row }">
            <el-button class="table_btn" size="mini" v-if="showButton('update')" @click="updateProp(row)">修改</el-button>
            <!-- <el-button class="delete_btn" size="mini" v-if="showButton('delete')" @click="deleteInfo(row)">删除</el-button> -->
            <el-button class="table_btn" size="mini" v-if="showButton('update')&&row.auditStatus!==1" @click="checkHidden(row)">审核</el-button>
          </template>
        </el-table-column>
      </el-table>
    </div>
    <div class="main_footer">
      <el-pagination
        background
        @current-change="changePageNum"
        @size-change="changePageSize"
        :current-page="pageNum"
        :page-sizes="[10, 20, 50, 100]"
        :page-size="pageSize"
        layout="total, sizes, prev, pager, next, jumper"
        :total="total">
      </el-pagination>
    </div>
    <el-dialog
      class="prop_dialog"
      :title="asyncTitle? '隐患审核' :'修改隐患'"
      :close-on-click-modal="false"
      :visible.sync="asyncVisible"
      width="45%">
      <el-form ref="ruleForm" :model="ruleForm" :rules="rules" label-width="auto" class="rule_form">
        <el-form-item label="举报时间:" prop="createTime">
            <el-date-picker
                v-model="ruleForm.createTime"
                type="date"
                :disabled="disabled"
                format="yyyy-MM-dd HH:mm:ss"
                value-format="yyyy-MM-dd HH:mm:ss"
                placeholder="请选择举报时间">
            </el-date-picker>
        </el-form-item>
        <el-form-item label="隐患地点:" prop="dangerLocation">
          <el-select v-model="ruleForm.dangerLocation" placeholder="请选择隐患地点" clearable  :disabled="disabled">
                <el-option
                    v-for="item in positonOptions"
                    :key="item.dictId"
                    :label="item.dictName"
                    :value="item.dictId">
                </el-option>
            </el-select>
        </el-form-item>
        <el-form-item label="隐患标题" prop="title">
          <el-input v-model="ruleForm.title" :size="size" type="textarea" :rows="5" clearable placeholder="请输入隐患标题"  :disabled="disabled"></el-input>
        </el-form-item>
        <el-form-item label="问题照片:" prop="imageList">
          <upload-image :file-list="imageList"  @delectImage="delectImage" :disabled="disabled" style="overflow:auto">
                <template #info>
                    <span>支持jpg、png、gif格式文件</span>
                </template>
            </upload-image>
        </el-form-item>
        <el-form-item label="提交人:" prop="reporter" v-if="asyncTitle">
          <el-input v-model="ruleForm.reporter" :size="size" clearable placeholder="请输入提交人" :disabled="true"></el-input>
        </el-form-item>
        <el-form-item label="隐患等级:" prop="level" v-if="asyncTitle">
          <el-select v-model="ruleForm.level" placeholder="请选择隐患等级" clearable>
                <el-option
                    v-for="item in optionsLevel"
                    :key="item.value"
                    :label="item.label"
                    :value="item.value">
                </el-option>
            </el-select>
        </el-form-item>
        <el-form-item label="积分值:" prop="integral" v-if="asyncTitle">
          <el-input v-model="ruleForm.integral" :size="size" clearable placeholder="请输入积分值" ></el-input>
        </el-form-item>
      </el-form>
      <div slot="footer">
        <el-button @click="asyncVisible = false">取 消</el-button>
        <el-button class="submit_btn" @click="asyncTitle ? submitInsert() : submitUpdate()">提 交</el-button>
      </div>
    </el-dialog>
  </div>
</template>
<script>
import { buttonPinia } from '../../../pinia/index';
import UploadImage from '../../../components/uploadImage.vue'
import { throttle, changeSize,downFiles } from '../../../plugins/public'; // 导入节流、动态切换组件尺寸方法
  export default {
    components:{
       UploadImage,
    },
    data() {
      return {
        size: changeSize(), // 组件尺寸
        pageNum: 1,
        pageSize: 10,
        search:{},//查询条件
        total: 0,
        disabled:false,
        loading: false,
        userId:null,//创建人
        dataList: [], //举报隐患信息列表
        positonOptions:[],//隐患地点
        imageList:[],
        asyncTitle: true, // 对话框title 新增:true  修改:false
        asyncVisible: false, // 添加 修改对话框
        optionsLevel:[
            {
                label:'一般隐患',
                value:1
            },
            {
                label:'重大隐患',
                value:2
            },
            {
                label:'不存在',
                value:3
            }
        ],
        ruleForm: {
        }, // 按钮表单
        rules: {
          dangerLocation: [{
            required: true,
            message: '请输入隐患地点',
            trigger: 'change'
          }],
          title: [{
            required: true,
            message: '请输入隐患标题',
            trigger: 'blur'
          }],
          reporter: [{
            required: true,
            message: '请输入提交人',
            trigger: 'blur'
          }],
          createTime: [{
            required: true,
            message: '请选择举报时间',
            trigger: 'change'
          }],
          level: [{
            required: true,
            message: '请选择隐患等级',
            trigger: 'blur'
          }],
          integral:[{
            required: true,
            message: '请输入积分',
            trigger: 'blur'
          }],
        },
        optionsType:[],//设备类型
        optionsDevice:[],//设备名称
        optionsUser:[],//负责人
        dictId:null,
      }
    },
    watch: {
      asyncVisible(bol) {
        if(!bol) {
          this.ruleForm = {};
          this.$refs.ruleForm.resetFields();
        }
      }
    },
    mounted() {
      const that = this;
      // 根据窗口大小动态修改组件尺寸
      window.onresize = () => {
        that.size = changeSize();
      }
      that.searchButtonInfo(true);
      that.searchPositionInfos()
    },
    methods: {
      //获取隐患地点
      searchPositionInfos(){
        let params = {
            pageNum: 1,
            pageSize: 100000000
        }
        this.$api.Dictionary.searchDictionary(params).then(res=>{
            if(res.statusMsg === 'ok'){
                this.positonOptions = res.data.list.filter(item =>item.dictType === 'danger_region')
            }else{
                this.$message.warning(res.statusMsg)
            }
        })
      },
      // 查询按钮列表信息
      searchButtonInfo(bol) {
        if(bol) {
          this.pageNum = 1;
        }
        let params = Object.assign({},this.search,{
          pageNum: this.pageNum,
          pageSize: this.pageSize
        })
        params.startTime = this.search.time&&this.search.time[0]
        params.endTime = this.search.time&&this.search.time[1]
        delete params.time
        this.loading = true;
        this.$api.Safety.searchHiddenLists(params).then((res) => {
          if(res.statusMsg === 'ok') {
            this.total = res.data.total;
            this.dataList = res.data.list;
          }
          this.loading = false;
        })
      },
    //删除上传图片
    delectImage(item){
        let uploadId = item.id
        this.imageList.splice(this.imageList.findIndex(itm => itm.id === uploadId),1)
        this.$message.success("删除成功!")
    },
      // 审核按钮
      checkHidden(row) {
        this.userId = row.createUser
        this.asyncTitle = true;
        this.imageList = []
        this.asyncVisible = true;
        this.disabled = true
        this.$api.Safety.detailsHiddenInfo({id: row.id}).then(res=>{
            if(res.statusMsg === 'ok'){
                this.ruleForm = res.data
                res.data.imgEntities.map(item=>{
                    this.imageList.push({
                        id: this.imageList.length + 1,
                        url:`https://szpipe.thhy-tj.com/${item.imgPath}`,
                        name:item.imgPath,
                        nameImg:item.imgName
                    })
                })
            }else{
                this.$message.warning(res.statusMsg)
            }
        })
      },
    // 转圈圈
      functionLoading() {
          this.loadingView = this.$loading({
              lock: true,
              text: '请稍后...',
              spinner: 'el-icon-loading',
              background: 'rgba(0, 0, 0, 0.7)'
          });
      },
      //导出excel
      exportFiles(){
        let params = {}
        params.startTime = this.search.time&&this.search.time[0]
        params.endTime = this.search.time&&this.search.time[1]
        delete params.time
        this.functionLoading();
        this.$api.Safety.exportHiddenFiles(params).then(res => {
            downFiles(res, '举报信息', 'xls')
            this.loadingView.close()
        })
        .catch(() => {
            this.loadingView.close();
        })
      },
      // 修改按钮信息
      updateProp(row) {
        this.imageList = []
        this.asyncTitle = false;
        this.asyncVisible = true;
        this.disabled = false
        this.$api.Safety.detailsHiddenInfo({id: row.id}).then(res=>{
            if(res.statusMsg === 'ok'){
                this.ruleForm = res.data
                this.dictId = res.data.dictId
                res.data.imgEntities.map(item=>{
                    this.imageList.push({
                        id: this.imageList.length + 1,
                        url:`https://szpipe.thhy-tj.com/${item.imgPath}`,
                        name:item.imgPath,
                        nameImg:item.imgName
                    })
                })
            }else{
                this.$message.warning(res.statusMsg)
            }
        })
      },
      // 删除按钮信息
      deleteInfo(row) {
        this.$confirm("该操作将删除该信息,是否继续删除?", "提示", {
          confirmButtonText: "确定",
          cancelButtonText: "取消",
          type: "warning"
       })
       .then(() => {
         this.$api.Safety.deleteHiddenInfo({id: row.id})
        .then(res => {
          if(res.statusMsg === 'ok') {
            this.searchButtonInfo(true);
            this.$message.success("删除成功!");
          } else {
            this.$message.warning(res.statusMsg);
          }
        })
       })
       .catch(() => {
         this.$message.warning("您已取消");
       })
      },
      // 提交审核按钮信息
      submitInsert: throttle(function() {
        this.$refs.ruleForm.validate((valid) => {
          if(valid) {
            const params = Object.assign({}, this.ruleForm);
            let arrTitle = []
            this.imageList&&this.imageList.forEach(item=>{
                arrTitle.push({imgPath:item.name})
            })
            params.imgEntities = arrTitle
            params.createUser = this.userId
            this.$api.Safety.checkHiddenInfo(params).then((res) => {
              if(res.statusMsg === 'ok') {
                this.asyncVisible = false;
                this.searchButtonInfo(true);
                this.$message.success('审核成功!');
              } else {
                this.$message.warning(res.statusMsg);
              }
            })
          }
        })
      }, 3000),
      // 提交修改按钮信息
      submitUpdate: throttle(function() {
        this.$refs.ruleForm.validate((valid) => {
          if(valid) {
            const params = Object.assign({}, this.ruleForm);
            let arrTitle = []
            this.imageList&&this.imageList.forEach(item=>{
                arrTitle.push({imgPath:item.name})
            })
            params.imgEntities = arrTitle
            params.dictId = this.dictId
            this.$api.Safety.updateHiddenInfo(params).then((res) => {
              if(res.statusMsg === 'ok') {
                this.asyncVisible = false;
                this.searchButtonInfo(true);
                this.$message.success('修改成功!');
              } else {
                this.$message.warning(res.statusMsg);
              }
            })
          }
        })
      }, 3000),
      // 判断按钮权限信息
      showButton(str) {
        const pinia = buttonPinia();
        return pinia.$state.buttonInfo.includes(str);
      },
      // 切换页数
      changePageNum(page) {
        this.pageNum = page;
        this.searchButtonInfo();
      },
      // 切换每页条数
      changePageSize(size) {
        this.pageSize = size;
        this.searchButtonInfo();
      }
    }
  }
</script>
<style lang="sass" scoped>
@import '../../../style/layout-main.scss';
</style>