烟花爆竹批发企业仓库安全风险监测前端
zhouwx
2025-04-14 0eb20ecb8d06fb2dbc0741566ebbfc1160e33ecb
接口对接
已修改11个文件
已添加9个文件
2167 ■■■■■ 文件已修改
.env.development 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/area.js 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/company/alarm.js 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/company/people.js 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/company/peopleCar.js 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/company/warning.js 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/store/modules/user.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/request.js 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/firework/alarm/index.vue 239 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/firework/humiture/components/dataDialog.vue 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/firework/humiture/index.vue 218 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/firework/people/components/peopleDialog.vue 212 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/firework/people/index.vue 158 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/firework/peopleCar/components/peopleCarDialog.vue 163 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/firework/peopleCar/index.vue 141 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/firework/permit/index.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/firework/warehouse/components/warehouseDialog.vue 338 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/firework/warehouse/index.vue 153 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/firework/warning/components/feedbackDialog.vue 148 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/firework/warning/index.vue 207 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.env.development
@@ -7,7 +7,7 @@
# 烟花爆竹批发企业仓库安全监测预警/开发环境
#贺哥
VITE_APP_BASE_API = 'http://192.168.2.11:8100'
VITE_APP_BASE_API = 'http://192.168.2.58:8100'
#线上
#VITE_APP_BASE_API = 'http://47.108.222.15:8185/signature'
src/api/area.js
@@ -10,4 +10,5 @@
        method: 'get',
        params: params
    })
}
}
src/api/company/alarm.js
对比新文件
@@ -0,0 +1,18 @@
import request from '@/utils/request'
import {getToken} from "@/utils/auth";
export function getAlarm(params) {
    return request({
        url: '/originalAlarm/pageList',
        method: 'post',
        data: params
    })
}
export function editAlarm(params) {
    return request({
        url: '/originalAlarm/editAlarmInfo',
        method: 'get',
        params: params
    })
}
src/api/company/people.js
对比新文件
@@ -0,0 +1,30 @@
import request from '@/utils/request'
import {getToken} from "@/utils/auth";
export function getPeople(params) {
    return request({
        url: '/originalPerson/pageList',
        method: 'post',
        data: params
    })
}
export function addPeople(data) {
    return request({
        url: '/originalPerson/addOrUpdate',
        method: 'post',
        data: data
    })
}
export function delPeople(data) {
    return request({
        url: `/originalPerson/delete`,
        method: 'post',
        params: data
    })
}
src/api/company/peopleCar.js
对比新文件
@@ -0,0 +1,30 @@
import request from '@/utils/request'
import {getToken} from "@/utils/auth";
export function getPeopleCar(params) {
    return request({
        url: '/originalPerson/selectOriginalPersonCar',
        method: 'post',
        data: params
    })
}
export function addPeopleCar(data) {
    return request({
        url: '/originalPerson/addOrUpdateCar',
        method: 'post',
        data: data
    })
}
export function delPeopleCar(data) {
    return request({
        url: `/originalPerson/delOriginalCarPerson`,
        method: 'post',
        params: data
    })
}
src/api/company/warning.js
对比新文件
@@ -0,0 +1,26 @@
import request from '@/utils/request'
import {getToken} from "@/utils/auth";
export function getWarning(params) {
    return request({
        url: '/originalAlarm/earlyPushPageList',
        method: 'post',
        data: params
    })
}
export function pushWarning(params) {
    return request({
        url: '/originalAlarm/editEarlyPush',
        method: 'post',
        data: params
    })
}
export function delWarning(data) {
    return request({
        url: `/originalAlarm/delEarlyPush`,
        method: 'post',
        params: data
    })
}
src/store/modules/user.js
@@ -22,7 +22,7 @@
        const identity = userInfo.identity
        return new Promise( (resolve, reject) => {
          login(username, password).then( async res => {
            setToken(res.token)
            setToken(res.result.token)
            this.token = res.token
            const user = res.result
            const avatar = (user.avatar == "" || user.avatar == null) ? defAva : import.meta.env.VITE_APP_BASE_API + user.avatar;
src/utils/request.js
@@ -117,7 +117,11 @@
    } else if (code != 200 && code != 100) {
      ElNotification.error({ title: msg })
      return Promise.reject('error')
    } else {
    } else if(msg == '用户不存在'){
      ElNotification.error({ title: msg })
      return Promise.reject('error')
    }
    else {
      return  Promise.resolve(res.data)
    }
  },
src/views/firework/alarm/index.vue
@@ -1,11 +1,236 @@
<script setup>
</script>
<template>
  <div class="app-container">
    <div style="display: flex;justify-content: space-between;margin-bottom: 10px">
      <el-form :inline="true" style="display: flex;align-items: center;flex-wrap: wrap;" >
        <el-form-item>
          <el-date-picker
              v-model="data.dateRange"
              value-format="YYYY-MM-DD"
              type="daterange"
              range-separator="-"
              start-placeholder="开始日期"
              end-placeholder="结束日期"
              style="width: 300px"
          ></el-date-picker>
        </el-form-item>
        <el-form-item label="状态:" >
          <el-select
              v-model="data.queryParams.filter.alarmStatus"
              placeholder="请选择"
              style="width: 100%"
          >
            <el-option
                v-for="item in data.statusList"
                :key="item.id"
                :label="item.name"
                :value="item.id"
            />
          </el-select>
        </el-form-item>
        <el-form-item >
          <el-button
              type="primary"
              @click="getList"
          >查询</el-button>
          <el-button
              type="primary"
              plain
              @click="reset"
          >重置</el-button>
        </el-form-item>
      </el-form>
    </div>
    <!-- 表格数据 -->
    <el-table v-loading="loading" :data="dataList" :border="true">
      <el-table-column label="序号" type="index" align="center" width="80" />
      <el-table-column label="企业" prop="companyName" align="center"  />
      <el-table-column label="仓库" prop="storeName" align="center" />
      <el-table-column label="库房" prop="storeroomName" align="center" />
      <el-table-column label="报警类型" prop="alarmType" align="center" >
        <template #default="scope">
          <span>{{scope.row.alarmType == 1 ? '超员作业' : scope.row.alarmType == 2?'堵塞通道':scope.row.alarmType == 3?'超高超量':scope.row.alarmType == 4?'非法入侵':scope.row.alarmType == 5?'摄像头遮挡偏移':scope.row.alarmType == 6?'温度':scope.row.alarmType == 7?'湿度':'--'}}</span>
        </template>
      </el-table-column>
      <el-table-column label="报警状态" prop="alarmStatus" align="center" >
        <template #default="scope">
          <span>{{scope.row.alarmStatus == 1 ? '已消警' : '未消警'}}</span>
        </template>
      </el-table-column>
      <el-table-column label="报警图片" prop="alarmFile" align="center" >
        <template #default="scope">
          <div class="demo-image__preview" v-if="scope.row.alarmFile">
            <el-image
                style="width: 100px; height: 100px"
                :src="scope.row.alarmFile"
                :zoom-rate="1.2"
                :max-scale="7"
                :min-scale="0.2"
                :preview-src-list="[scope.row.alarmFile]"
                :initial-index="0"
                fit="cover"
                :preview-teleported= true
            />
          </div>
        </template>
      </el-table-column>
      <el-table-column label="报警时间" prop="warningDate" align="center" width="120" />
      <el-table-column label="消警时间" prop="clearDate" align="center" width="120" >
        <template #default="scope">
          <span v-if="scope.row.clearDate">{{scope.row.clearDate}}</span>
          <span v-else>—</span>
        </template>
      </el-table-column>
      <el-table-column label="操作" align="center" class-name="small-padding fixed-width"  >
        <template #default="scope">
          <el-button link type="primary" v-if="scope.row.alarmStatus == 0" @click="handelAlarm(scope.row)">消警</el-button>
          <span v-else>—</span>
        </template>
      </el-table-column>
    </el-table>
    <pagination
        v-show="total > 0"
        :total="total"
        v-model:page="queryParams.pageIndex"
        v-model:limit="queryParams.pageSize"
        @pagination="getList"
    />
  </div>
</template>
<style scoped lang="scss">
<script setup>
import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue";
import {ElMessage, ElMessageBox} from "element-plus";
import {delTemplate, getTemplate} from "@/api/signAgreement/template";
import {editAlarm, getAlarm} from "@/api/company/alarm";
import Cookies from "js-cookie";
const { proxy } = getCurrentInstance();
const loading = ref(false);
const dialogRef = ref();
const createSignRef = ref();
const data = reactive({
  queryParams: {
    pageIndex: 1,
    pageSize: 10,
    filter: {
      alarmStartTime: '',
      alarmEndTime: '',
      alarmStatus: null,
      companyCode: '',
    }
  },
  total: 0,
  dataList: [],
  statusList: [
    {
      id: 1,
      name: '已消警'
    },
    {
      id: 0,
      name: '未消警'
    },
  ],
  dateRange:[]
});
</style>
const { queryParams, total, dataList } = toRefs(data);
const classHourRef = ref();
onMounted(()=>{
  const info = JSON.parse(Cookies.get('userInfo'))
  data.queryParams.filter.companyCode = info.companynumber
  getList()
})
onUnmounted(()=>{
})
const addProject = (type,value) => {
  dialogRef.value.openDialog(type,value)
}
const getList = async () => {
  loading.value = true
  data.queryParams.filter.alarmStartTime = data.dateRange[0]
  data.queryParams.filter.alarmEndTime = data.dateRange[1]
  const res = await getAlarm(data.queryParams)
  if(res.code == 200){
    data.dataList = res.result.records
    //     .map(item => {
    //   return {
    //     ...item,
    //     alarmFile: ''
    //   }
    // })
    data.total = res.result.total
  }else{
    ElMessage.warning(res.message)
  }
  loading.value = false
}
/** 重置新增的表单以及其他数据  */
function reset() {
  data.queryParams = {
    pageIndex: 1,
    pageSize: 10,
    filter: {
      alarmStartTime: '',
      alarmEndTime: '',
      alarmStatus: null,
      companyCode: '',
    }
  }
  data.dateRange = []
  getList()
}
const handleDelete = (val) => {
  ElMessageBox.confirm(
      '确定删除此条数据?',
      '提示',
      {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning',
      })
      .then( async() => {
        const res = await delTemplate(val.id)
        if(res.code == 200){
          ElMessage.success('数据删除成功')
          await getList()
        }else{
          ElMessage.warning(res.message)
        }
      })
}
const handelAlarm = (val) => {
  ElMessageBox.confirm(
      '确定对此条数据消警?',
      '提示',
      {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning',
      })
      .then( async() => {
        const param = {
          id: val.id
        }
        const res = await editAlarm(param)
        if(res.code == 200){
          ElMessage.success('消警成功')
          await getList()
        }else{
          ElMessage.warning(res.message)
        }
      })
}
const getRowKeys = (row) => {
  return row.name
}
</script>
src/views/firework/humiture/components/dataDialog.vue
对比新文件
@@ -0,0 +1,72 @@
<template>
  <div class="notice">
    <el-dialog
        v-model="dialogVisible"
        title="历史记录"
        width="50%"
        :before-close="handleClose"
        :close-on-press-escape="false"
        :close-on-click-modal="false"
    >
      <el-table v-loading="loading" :data="state.tableList" :border="true">
        <el-table-column label="序号" type="index" align="center" width="80" />
        <el-table-column label="探测器" prop="createTime" align="center"  />
        <el-table-column label="浓度值" prop="basicName" align="center" />
        <el-table-column label="状态" prop="tabooBasicName" align="center" />
        <el-table-column label="属性" prop="tabooBasicName" align="center" />
        <el-table-column label="时间" prop="updateBy" align="center" />
      </el-table>
      <pagination
          v-show="total > 0"
          :total="total"
          v-model:page="queryParams.pageNum"
          v-model:limit="queryParams.pageSize"
          @pagination="getList"
      />
    </el-dialog>
  </div>
</template>
<script setup>
import {reactive, ref, toRefs} from "vue";
const dialogVisible = ref(false);
const emit = defineEmits(["getList"]);
const loading = ref(false)
const state = reactive({
  tableList: [],
  total: 0,
  queryParams: {
    pageNum: 1,
    pageSize: 5,
  },
})
const { queryParams, total } = toRefs(state);
const openDialog = async (type,value) => {
  dialogVisible.value = true;
}
const getList = async () => {
  // loading.value = true
  // const res = await getAvoidInfoPage(state.queryParams)
  // if(res.code == 200){
  //   state.tableList = res.data.list
  //   state.total = res.data.total
  // }else{
  //   ElMessage.warning(res.message)
  // }
  // loading.value = false
}
const handleClose = () => {
  dialogVisible.value = false;
  emit("getList")
}
defineExpose({
  openDialog
});
</script>
<style scoped lang="scss">
</style>
src/views/firework/humiture/index.vue
@@ -1,11 +1,221 @@
<template>
  <div class="app-container">
    <!--    表格部分-->
<!--   <div style="font-weight: 600;font-size: 20px;">最近报警记录</div>-->
    <div style="margin-top: 10px">
      <el-table v-loading="loading" :data="state.tableList" :border="true">
        <el-table-column label="序号" type="index" align="center" width="80" />
        <el-table-column label="仓库" prop="createTime" align="center"  />
        <el-table-column label="库房" prop="basicName" align="center" />
        <el-table-column label="温度值" prop="tabooBasicName" align="center" />
        <el-table-column label="同步时间" prop="updateBy" align="center" />
        <el-table-column label="湿度值" prop="tabooBasicName" align="center" />
        <el-table-column label="同步时间" prop="updateBy" align="center" />
      </el-table>
      <pagination
          v-show="total > 0"
          :total="total"
          v-model:page="queryParams.pageNum"
          v-model:limit="queryParams.pageSize"
          @pagination="getListAll"
      />
    </div>
    <!--    卡片部分-->
    <el-scrollbar max-height="420px" style="padding-right: 10px;overflow-x: hidden;" v-if="state.dataList && state.dataList.length >0">
<!--      <el-row :gutter="20" style="margin-top: 5px;margin-left: 5px">-->
<!--        <el-col v-for="(item,index) in state.dataList" :key="index" :span="8">-->
      <div style="display: flex;align-items: center;flex-wrap: wrap">
        <div v-for="(item,index) in state.dataList" :key="index" style="width: 350px;margin: 20px 30px">
          <el-card class="card-item " shadow="always">
            <div style="display: flex;flex-direction: column">
              <div style="font-size: 18px;font-weight: 700;margin-bottom: 15px">{{item.room}}—{{item.stock}}—{{item.device}}</div>
              <div style="display: flex;align-items: center">
                <img src="@/assets/images/device.png" />
                <div style="display: flex;flex-direction: column">
                  <div style="display: flex;justify-content: space-between;margin-bottom: 10px">
                    <span>温度:{{item.warm}}</span>
                    <el-button type="primary" plain style="margin-left: 15px" @click="openData('温度',item)">历史数据</el-button>
                  </div>
                  <div style="display: flex;justify-content: space-between">
                    <span>湿度:{{item.humidity}}</span>
                    <el-button type="primary" plain style="margin-left: 15px" @click="openData('湿度',item)">历史数据</el-button>
                  </div>
                </div>
              </div>
            </div>
          </el-card>
        </div>
      </div>
<!--        </el-col>-->
<!--      </el-row>-->
    </el-scrollbar>
    <el-empty v-else></el-empty>
    <d-dialog ref="dialogRef" @getList="getListAll"></d-dialog>
  </div>
</template>
<script setup>
import {onMounted, reactive, ref, toRefs} from "vue";
import {ElMessage} from "element-plus";
import dDialog from './components/dataDialog.vue'
const dialogRef = ref(null)
const state = reactive({
  queryParams: {
    pageNum: 1,
    pageSize: 5,
    warningType: ''
  },
  cardQueryParams: {
    warningType: ''
  },
  total: 0,
  dataList: [
    {
      id: 1,
      room: '仓库名称',
      stock: '库存名称',
      device: '设备1',
      humidity: '18%RH',
      warm: '18°'
    },
    {
      id: 1,
      room: '仓库名称',
      stock: '库存名称',
      device: '设备1',
      humidity: '18%RH',
      warm: '18°'
    },
    {
      id: 1,
      room: '仓库名称',
      stock: '库存名称',
      device: '设备1',
      humidity: '18%RH',
      warm: '18°'
    },
    {
      id: 1,
      room: '仓库名称',
      stock: '库存名称',
      device: '设备1',
      humidity: '18%RH',
      warm: '18°'
    },
    {
      id: 1,
      room: '仓库名称',
      stock: '库存名称',
      device: '设备1',
      humidity: '18%RH',
      warm: '18°'
    },
  ],
  tableList: []
});
const { queryParams,cardQueryParams, total, dataList } = toRefs(state);
const loading = ref(false);
onMounted(()=>{
  getListPage()
  getList()
})
const getListPage = async () => {
  // loading.value = true
  // const res = await getAvoidInfoPage(state.queryParams)
  // if(res.code == 200){
  //   state.tableList = res.data.list
  //   state.total = res.data.total
  // }else{
  //   ElMessage.warning(res.message)
  // }
  // loading.value = false
}
const getList = async () => {
  // const res = await getAvoidList(state.cardQueryParams)
  // if(res.code == 200){
  //   state.dataList = res.data
  // }else{
  //   ElMessage.warning(res.message)
  // }
}
const openData = (type,val) => {
  dialogRef.value.openDialog(type,val);
}
const getListAll = () => {
  getListPage()
  getList()
}
</script>
<template>
</template>
<style scoped lang="scss">
.app-container{
  .card-item{
    //height: 160px;
    margin-bottom: 10px;
    //min-width: 300px;
  }
  .title-font{
    display:flex;
    align-items: center;
    padding: 3px 15px;
    font-size: 14px;
    margin-right: 10px;
    border-radius: 5px
  }
  .card-item-red{
    cursor: pointer;
    color: #f56c6c;
    background-color: rgb(254, 240.3, 240.3);
    border: 1px solid rgb(253, 225.6, 225.6);
  }
  .card-item-red-title{
    cursor: pointer;
    color: #f56c6c;
    background-color: rgb(254, 240.3, 240.3);
    border: 1px solid rgb(253, 225.6, 225.6);
  }
  .card-item-red-titleChoose{
    color: #f6d1d1;
    background-color: #f55d5d;
  }
  .card-item-yellow{
    color: #e6a23c;
    background-color: rgb(252.5, 245.7, 235.5);
    border: 1px solid rgb(250, 236.4, 216);
  }
  .card-item-yellow-title{
    cursor: pointer;
    color: #f1950b;
    background-color: rgb(252.5, 245.7, 235.5);
    border: 1px solid rgb(250, 236.4, 216);
  }
  .card-item-yellow-titleChoose{
    color: #f6e7d1;
    background-color: #f1a902;
  }
  .card-item-blue-title{
    cursor: pointer;
    color: #409eff;
    background-color: rgb(235.9, 245.3, 255);
    border: 1px solid rgb(216.8, 235.6, 255);
  }
  .card-item-blue-titleChoose{
    color: #d7e6f6;
    background-color: #2da0ef;
  }
  :deep(.is-horizontal) {
    height: 0;
    left: 0;
    display: none;
  }
  :deep(.el-scrollbar__wrap) {
    overflow-x: hidden;
  }
}
</style>
src/views/firework/people/components/peopleDialog.vue
对比新文件
@@ -0,0 +1,212 @@
<template>
  <div class="notice">
    <el-dialog
        v-model="dialogVisible"
        :title="title"
        width="500px"
        :before-close="handleClose"
        :close-on-press-escape="false"
        :close-on-click-modal="false"
    >
      <el-form :model="state.form" size="default" ref="busRef" :rules="state.formRules" label-width="150px" >
        <el-form-item label="姓名:" prop="personName" >
          <el-input v-model="state.form.personName" placeholder="请输入姓名"></el-input>
        </el-form-item>
        <el-form-item label="人员类型:"  prop="personType">
          <el-select
              v-model="state.form.personType"
              placeholder="请选择"
              style="width: 100%"
          >
            <el-option
                v-for="item in state.typeList"
                :key="item.id"
                :label="item.name"
                :value="item.id"
            />
          </el-select>
        </el-form-item>
        <el-form-item label="联系方式:" prop="mb" >
          <el-input v-model="state.form.mb" placeholder="请输入联系方式"></el-input>
        </el-form-item>
      </el-form>
      <template #footer>
        <span class="dialog-footer">
            <el-button @click="handleClose" size="default">取 消</el-button>
            <el-button type="primary"  @click="onSubmit" size="default" v-preReClick>确认</el-button>
        </span>
      </template>
    </el-dialog>
  </div>
</template>
<script setup>
import {onMounted, reactive, ref, toRefs} from 'vue'
import {ElMessage} from "element-plus";
import {listDept} from "@/api/system/dept";
import {listUser} from "@/api/system/user";
import {addTemplate, editTemplate} from "@/api/signAgreement/template";
import {addType, editType, getSignType} from "@/api/signAgreement/signType";
import {getInfo} from "@/api/login";
import {getToken} from "@/utils/auth";
import {verifyPhone} from "@/utils/validate";
import Cookies from "js-cookie";
import {addPeople} from "@/api/company/people";
const uploadFileUrl = ref(import.meta.env.VITE_APP_BASE_API + "/common/upload"); // 上传文件服务器地址
const { proxy } = getCurrentInstance();
const dialogVisible = ref(false);
const title = ref("");
const busRef = ref();
const length = ref()
const emit = defineEmits(["getList"]);
const startPhone = ref('');
const validateUserPhone = (rule, value, callback)=>{
  if(value === ''){
    callback(new Error('请输入手机号'))
  }else if(state.title == '编辑' && value == startPhone.value){
    callback()
  } else{
    if(!verifyPhone(value)){
      callback(new Error('手机号格式有误'))
    }else{
      callback()
    }
  }
}
const state = reactive({
  form: {
    id: '',
    personName: '',
    companyCode: '',
    personType:null,
    mb: '',
  },
  typeList: [
    {
      id: 1,
      name: '法定代表人'
    },
    {
      id: 2,
      name: '主要负责人'
    },
    {
      id: 3,
      name: '安全负责人'
    },
    {
      id: 4,
      name: '保管员'
    },
    {
      id: 5,
      name: '守护员'
    },
  ],
  formRules:{
    personName: [{ required: true, trigger: "blur", message:'请输入姓名' }],
    mb: [{ required: true, trigger: "blur", validator: validateUserPhone }],
    personType: [{ required: true, trigger: "blur", message:'请选择人员类型' }],
  },
})
onMounted(()=>{
})
const openDialog = async (type,value) => {
  title.value = type === 'add' ? '新增' : '编辑'
  const info = JSON.parse(Cookies.get('userInfo'))
  state.form.companyCode = info.companynumber
  if(type === 'edit') {
    const data = JSON.parse(JSON.stringify(value))
    Object.keys(state.form).forEach(key => {
      if(data[key]){
        state.form[key] = data[key]
      }
    })
    startPhone.value = value.phone
  }
  dialogVisible.value = true;
}
const onSubmit = async () => {
  console.log('form',state.form)
  const valid = await busRef.value.validate();
  if(valid){
    if(title.value === '新增'){
      const {id, ...data} = JSON.parse(JSON.stringify(state.form))
      const res = await addPeople(data)
      if(res.code == 200){
        ElMessage({
          type: 'success',
          message: '新增成功'
        });
      }else{
        ElMessage.warning(res.message)
      }
      emit("getList")
      busRef.value.clearValidate();
      reset();
      dialogVisible.value = false;
    }else if(title.value === '编辑'){
      const {...data} = JSON.parse(JSON.stringify(state.form))
      const res = await addPeople(data)
      if(res.code == 200){
        ElMessage({
          type: 'success',
          message: '编辑成功'
        });
      }else{
        ElMessage.warning(res.message)
      }
      emit("getList")
      busRef.value.clearValidate();
      reset();
      dialogVisible.value = false;
    }
  }
}
const handleClose = () => {
  busRef.value.clearValidate();
  reset();
  dialogVisible.value = false;
  emit("getList")
}
const reset = () => {
  state.form = {
    id: '',
    personName: '',
    companyCode: '',
    personType:null,
    mb: '',
  }
}
defineExpose({
  openDialog
});
</script>
<style scoped lang="scss">
.notice{
  :deep(.el-form .el-form-item__label) {
    font-size: 15px;
  }
  :deep(.el-form-item__content) {
    width: 100%;
  }
  .file {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
  }
  .custom-iframe {
    border: 1px solid #9b9999;
    /* 隐藏原生滚动条 */
    overflow: hidden;
  }
}
</style>
src/views/firework/people/index.vue
@@ -1,11 +1,155 @@
<script setup>
</script>
<template>
  <div>1</div>
  <div class="app-container">
    <div style="display: flex;justify-content: space-between;margin-bottom: 10px">
      <el-form :inline="true" style="display: flex;align-items: center;flex-wrap: wrap;" >
        <el-form-item>
          <el-button
              type="primary"
              plain
              icon="Plus"
              @click="addProject('add',{})"
          >
            新增
          </el-button>
        </el-form-item>
        <el-form-item label="姓名:" >
          <el-input v-model="data.queryParams.filter.companyName" placeholder="请输入姓名"></el-input>
        </el-form-item>
        <el-form-item >
          <el-button
              type="primary"
              @click="getList"
          >查询</el-button>
          <el-button
              type="primary"
              plain
              @click="reset"
          >重置</el-button>
        </el-form-item>
      </el-form>
    </div>
    <!-- 表格数据 -->
    <el-table v-loading="loading" :data="dataList" :border="true">
      <el-table-column label="序号" type="index" align="center" width="80" />
      <el-table-column label="姓名" prop="personName" align="center"  />
      <el-table-column label="人员类型" prop="personType" align="center" >
        <template #default="scope">
          <span>{{scope.row.personType == 1 ? '法定代表人' : scope.row.personType == 2?'主要负责人':scope.row.personType == 3?'安全负责人':scope.row.personType == 4?'保管员':scope.row.personType == 5?'守护员':''}}</span>
        </template>
      </el-table-column>
      <el-table-column label="联系方式" prop="mb" align="center" />
      <el-table-column label="创建人" prop="createBy" align="center" />
      <el-table-column label="修改人" prop="updateBy" align="center" />
      <el-table-column label="创建时间" prop="createDate" align="center" width="110" />
      <el-table-column label="修改时间" prop="updateDate" align="center"  width="110"/>
      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="250" >
        <template #default="scope">
          <el-button link type="primary" @click="addProject('edit',scope.row)">编辑</el-button>
          <el-button link type="danger" @click="handleDelete(scope.row)">删除</el-button>
        </template>
      </el-table-column>
    </el-table>
    <pagination
        v-show="total > 0"
        :total="total"
        v-model:page="queryParams.pageIndex"
        v-model:limit="queryParams.pageSize"
        @pagination="getList"
    />
    <peopleDialog ref="dialogRef" @getList="getList"></peopleDialog>
  </div>
</template>
<style scoped lang="scss">
<script setup>
import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue";
import {ElMessage, ElMessageBox} from "element-plus";
import peopleDialog from './components/peopleDialog.vue'
import Cookies from "js-cookie";
import {delTemplate, getTemplate} from "@/api/signAgreement/template";
import {delPeople, getPeople} from "@/api/company/people";
const { proxy } = getCurrentInstance();
const loading = ref(false);
const dialogRef = ref();
const createSignRef = ref();
const data = reactive({
  queryParams: {
    pageIndex: 1,
    pageSize: 10,
    filter: {
      companyName: '',
      companyCode: ''
    }
  },
  total: 0,
  dataList: []
});
</style>
const { queryParams, total, dataList } = toRefs(data);
const classHourRef = ref();
onMounted(()=>{
  const info = JSON.parse(Cookies.get('userInfo'))
  data.queryParams.filter.companyCode = info.companynumber
  getList()
})
onUnmounted(()=>{
})
const addProject = (type,value) => {
  dialogRef.value.openDialog(type,value)
}
const getList = async () => {
  loading.value = true
  const res = await getPeople(data.queryParams)
  if(res.code == 200){
    data.dataList = res.result.records
    data.total = res.result.total
  }else{
    ElMessage.warning(res.message)
  }
  loading.value = false
}
/** 重置新增的表单以及其他数据  */
function reset() {
  data.queryParams = {
    pageIndex: 1,
    pageSize: 10,
    filter: {
      companyName: '',
      companyCode: ''
    }
  }
  getList()
}
const handleDelete = (val) => {
  ElMessageBox.confirm(
      '确定删除此条数据?',
      '提示',
      {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning',
      })
      .then( async() => {
        const param = {
         id:val.id
        }
        const res = await delPeople(param)
        if(res.code == 200){
          ElMessage.success('数据删除成功')
          await getList()
        }else{
          ElMessage.warning(res.message)
        }
      })
}
const getRowKeys = (row) => {
  return row.name
}
</script>
src/views/firework/peopleCar/components/peopleCarDialog.vue
对比新文件
@@ -0,0 +1,163 @@
<template>
  <div class="notice">
    <el-dialog
        v-model="dialogVisible"
        :title="title"
        width="500px"
        :before-close="handleClose"
        :close-on-press-escape="false"
        :close-on-click-modal="false"
    >
      <el-form :model="state.form" size="default" ref="busRef" :rules="state.formRules" label-width="150px" >
        <el-form-item label="人员数量:" prop="personCount" >
          <el-input v-model="state.form.personCount" placeholder="请输入人员数量" @input="state.form.personCount= state.form.personCount.replace(/[^\d]/g,'')"></el-input>
        </el-form-item>
        <el-form-item label="车辆数量:" prop="carCount" >
          <el-input v-model="state.form.carCount" placeholder="请输入车辆数量" @input="state.form.carCount= state.form.carCount.replace(/[^\d]/g,'')"></el-input>
        </el-form-item>
      </el-form>
      <template #footer>
        <span class="dialog-footer">
            <el-button @click="handleClose" size="default">取 消</el-button>
            <el-button type="primary"  @click="onSubmit" size="default" v-preReClick>确认</el-button>
        </span>
      </template>
    </el-dialog>
  </div>
</template>
<script setup>
import {onMounted, reactive, ref, toRefs} from 'vue'
import {ElMessage} from "element-plus";
import {listDept} from "@/api/system/dept";
import {listUser} from "@/api/system/user";
import {addTemplate, editTemplate} from "@/api/signAgreement/template";
import {addType, editType, getSignType} from "@/api/signAgreement/signType";
import {getInfo} from "@/api/login";
import {getToken} from "@/utils/auth";
import {verifyPhone} from "@/utils/validate";
import Cookies from "js-cookie";
import {addPeople} from "@/api/company/people";
import {addPeopleCar} from "@/api/company/peopleCar";
const uploadFileUrl = ref(import.meta.env.VITE_APP_BASE_API + "/common/upload"); // 上传文件服务器地址
const { proxy } = getCurrentInstance();
const dialogVisible = ref(false);
const title = ref("");
const busRef = ref();
const length = ref()
const emit = defineEmits(["getList"]);
const startPhone = ref('');
const state = reactive({
  form: {
    id: '',
    carCount: null,
    companyCode: '',
    personCount:null,
  },
  formRules:{
    carCount: [{ required: true, trigger: "blur", message:'请输入车辆数量' }],
    personCount: [{ required: true, trigger: "blur", message:'请选择人员数量' }],
  },
})
onMounted(()=>{
})
const openDialog = async (type,value) => {
  title.value = type === 'add' ? '新增' : '编辑'
  const info = JSON.parse(Cookies.get('userInfo'))
  state.form.companyCode = info.companynumber
  if(type === 'edit') {
    const data = JSON.parse(JSON.stringify(value))
    Object.keys(state.form).forEach(key => {
      if(data[key]){
        state.form[key] = data[key]
      }
    })
    startPhone.value = value.phone
  }
  dialogVisible.value = true;
}
const onSubmit = async () => {
  console.log('form',state.form)
  const valid = await busRef.value.validate();
  if(valid){
    if(title.value === '新增'){
      const {id, ...data} = JSON.parse(JSON.stringify(state.form))
      const res = await addPeopleCar(data)
      if(res.code == 200){
        ElMessage({
          type: 'success',
          message: '新增成功'
        });
      }else{
        ElMessage.warning(res.message)
      }
      emit("getList")
      busRef.value.clearValidate();
      reset();
      dialogVisible.value = false;
    }else if(title.value === '编辑'){
      const {...data} = JSON.parse(JSON.stringify(state.form))
      const res = await addPeopleCar(data)
      if(res.code == 200){
        ElMessage({
          type: 'success',
          message: '编辑成功'
        });
      }else{
        ElMessage.warning(res.message)
      }
      emit("getList")
      busRef.value.clearValidate();
      reset();
      dialogVisible.value = false;
    }
  }
}
const handleClose = () => {
  busRef.value.clearValidate();
  reset();
  dialogVisible.value = false;
  emit("getList")
}
const reset = () => {
  state.form = {
    id: '',
    carCount: null,
    companyCode: '',
    personCount:null,
  }
}
defineExpose({
  openDialog
});
</script>
<style scoped lang="scss">
.notice{
  :deep(.el-form .el-form-item__label) {
    font-size: 15px;
  }
  :deep(.el-form-item__content) {
    width: 100%;
  }
  .file {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
  }
  .custom-iframe {
    border: 1px solid #9b9999;
    /* 隐藏原生滚动条 */
    overflow: hidden;
  }
}
</style>
src/views/firework/peopleCar/index.vue
@@ -1,11 +1,138 @@
<script setup>
</script>
<template>
  <div class="app-container">
    <div style="display: flex;justify-content: space-between;margin-bottom: 10px">
      <el-form :inline="true" style="display: flex;align-items: center;flex-wrap: wrap;" >
        <el-form-item>
          <el-button
              type="primary"
              plain
              icon="Plus"
              @click="addProject('add',{})"
          >
            新增
          </el-button>
        </el-form-item>
      </el-form>
    </div>
    <!-- 表格数据 -->
    <el-table v-loading="loading" :data="dataList" :border="true">
      <el-table-column label="序号" type="index" align="center" width="80" />
      <el-table-column label="企业" prop="companyName" align="center"  />
      <el-table-column label="人员数量" prop="personCount" align="center" />
      <el-table-column label="车辆数量" prop="carCount" align="center" />
      <el-table-column label="数据采集时间" prop="collectTime" align="center" />
      <el-table-column label="创建人" prop="createBy" align="center" />
      <el-table-column label="修改人" prop="updateBy" align="center" />
      <el-table-column label="创建时间" prop="createDate" align="center" width="110" />
      <el-table-column label="修改时间" prop="updateDate" align="center"  width="110"/>
      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="250" >
        <template #default="scope">
          <el-button link type="primary" @click="addProject('edit',scope.row)">编辑</el-button>
          <el-button link type="danger" @click="handleDelete(scope.row)">删除</el-button>
        </template>
      </el-table-column>
    </el-table>
    <pagination
        v-show="total > 0"
        :total="total"
        v-model:page="queryParams.pageIndex"
        v-model:limit="queryParams.pageSize"
        @pagination="getList"
    />
    <peopleDialog ref="dialogRef" @getList="getList"></peopleDialog>
  </div>
</template>
<style scoped lang="scss">
<script setup>
import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue";
import {ElMessage, ElMessageBox} from "element-plus";
import peopleDialog from './components/peopleCarDialog.vue'
import Cookies from "js-cookie";
import {delTemplate, getTemplate} from "@/api/signAgreement/template";
import {delPeople, getPeople} from "@/api/company/people";
import {delPeopleCar, getPeopleCar} from "@/api/company/peopleCar";
const { proxy } = getCurrentInstance();
const loading = ref(false);
const dialogRef = ref();
const createSignRef = ref();
const data = reactive({
  queryParams: {
    pageIndex: 1,
    pageSize: 10,
    filter: {
      companyName: '',
      companyCode: ''
    }
  },
  total: 0,
  dataList: []
});
</style>
const { queryParams, total, dataList } = toRefs(data);
const classHourRef = ref();
onMounted(()=>{
  const info = JSON.parse(Cookies.get('userInfo'))
  data.queryParams.filter.companyCode = info.companynumber
  getList()
})
onUnmounted(()=>{
})
const addProject = (type,value) => {
  dialogRef.value.openDialog(type,value)
}
const getList = async () => {
  loading.value = true
  const res = await getPeopleCar(data.queryParams)
  if(res.code == 200){
    data.dataList = res.result.records
    data.total = res.result.total
  }else{
    ElMessage.warning(res.message)
  }
  loading.value = false
}
/** 重置新增的表单以及其他数据  */
function reset() {
  data.queryParams = {
    pageIndex: 1,
    pageSize: 10,
    filter: {
      companyName: '',
      companyCode: ''
    }
  }
  getList()
}
const handleDelete = (val) => {
  ElMessageBox.confirm(
      '确定删除此条数据?',
      '提示',
      {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning',
      })
      .then( async() => {
        const param = {
          id:val.id
        }
        const res = await delPeopleCar(param)
        if(res.code == 200){
          ElMessage.success('数据删除成功')
          await getList()
        }else{
          ElMessage.warning(res.message)
        }
      })
}
const getRowKeys = (row) => {
  return row.name
}
</script>
src/views/firework/permit/index.vue
@@ -9,3 +9,4 @@
<style scoped lang="scss">
</style>
src/views/firework/warehouse/components/warehouseDialog.vue
对比新文件
@@ -0,0 +1,338 @@
<template>
  <div class="notice">
    <el-dialog
        v-model="dialogVisible"
        width="900px"
        :before-close="handleClose"
        :close-on-press-escape="false"
        :close-on-click-modal="false"
    >
      <template #header>
        <div style="text-align: center; width: 100%;font-size: 18px;font-weight: 600">
          <span>{{title}}仓库</span>
        </div>
      </template>
      <el-form :model="state.form" size="default" ref="busRef" :rules="state.formRules" label-width="117px" >
        <el-form-item>
          <div style="font-size: 16px;font-weight: 600;margin-top: -25px;margin-left: -110px;margin-bottom: -15px">仓库基本信息</div>
        </el-form-item>
        <el-row :gutter="24">
          <el-col :span="12">
            <el-form-item label="仓库名称:" prop="name" >
              <el-input v-model="state.form.name" placeholder="请输入仓库名称"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="仓库面积:" prop="name" >
              <el-input v-model="state.form.name" placeholder="请输入仓库面积"></el-input>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="24">
          <el-col :span="12">
            <el-form-item label="仓库编号:" prop="name" >
              <el-input v-model="state.form.name" placeholder="请输入仓库编号"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="核定药量:" prop="name" >
              <el-input v-model="state.form.name" placeholder="请输入核定药量"></el-input>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="24">
          <el-col :span="12">
            <el-form-item label="危险等级:" prop="name" >
              <el-select
                  v-model="state.form.typeId"
                  placeholder="请选择"
                  style="width: 100%"
              >
                <el-option
                    v-for="item in state.typeList"
                    :key="item.id"
                    :label="item.name"
                    :value="item.id"
                />
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="核定人员数量:" prop="name" >
              <el-input v-model="state.form.name" placeholder="请输入核定人员数量"></el-input>
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
      <div style="display: flex;align-items: center">
        <div style="font-size: 16px;font-weight: 600;margin: 10px">库房列表</div>
        <el-button style="margin-left: 10px" type="primary" @click="addRoom">新增库房</el-button>
      </div>
      <el-table :data="state.storeroomList" style="width: 100%;margin-top: 15px" border>
        <el-table-column label="序号" type="index" align="center" width="80" />
        <el-table-column prop="name" label="库房名称" align="center">
          <template #default="{ row }">
            <el-form :model="row" :rules="rules">
              <el-form-item prop="name">
                <el-input
                    v-model="row.name"
                />
              </el-form-item>
            </el-form>
          </template>
        </el-table-column>
        <el-table-column prop="code" label="库房编号" align="center">
          <template #default="{ row }">
            <el-form :model="row" :rules="rules">
              <el-form-item prop="code">
                <el-input
                    v-model="row.code"
                />
              </el-form-item>
            </el-form>
          </template>
        </el-table-column>
        <el-table-column prop="area" label="面积" align="center">
          <template #default="{ row }">
            <el-form :model="row" :rules="rules">
              <el-form-item prop="area">
                <el-input
                    v-model="row.area"
                />
              </el-form-item>
            </el-form>
          </template>
        </el-table-column>
        <el-table-column prop="level" label="危险等级" align="center">
          <template #default="{ row }">
            <el-form :model="row" :rules="rules">
              <el-form-item prop="level">
                <el-input
                    v-model="row.level"
                />
              </el-form-item>
            </el-form>
          </template>
        </el-table-column>
        <el-table-column prop="level" label="核定药量" align="center">
          <template #default="{ row }">
            <el-form :model="row" :rules="rules">
              <el-form-item prop="level">
                <el-input
                    v-model="row.level"
                />
              </el-form-item>
            </el-form>
          </template>
        </el-table-column>
        <el-table-column prop="num" label="核定人员" align="center">
          <template #default="{ row }">
            <el-form :model="row" :rules="rules" >
              <el-form-item prop="num" >
                <el-input
                    v-model="row.num"
                />
              </el-form-item>
            </el-form>
          </template>
        </el-table-column>
        <el-table-column label="操作" align="center" class-name="small-padding fixed-width" >
          <template #default="scope">
            <el-button link type="danger" @click="delRoom(scope.row)">删除</el-button>
          </template>
        </el-table-column>
      </el-table>
      <template #footer>
        <span class="dialog-footer">
            <el-button @click="handleClose" size="default">取 消</el-button>
            <el-button type="primary"  @click="onSubmit" size="default" v-preReClick>确认</el-button>
        </span>
      </template>
    </el-dialog>
  </div>
</template>
<script setup>
import {reactive, ref, toRefs} from 'vue'
import {ElMessage} from "element-plus";
import {listDept} from "@/api/system/dept";
import {listUser} from "@/api/system/user";
import {addTemplate, editTemplate} from "@/api/signAgreement/template";
import {addType, editType, getSignType} from "@/api/signAgreement/signType";
import {getInfo} from "@/api/login";
import {getToken} from "@/utils/auth";
import {verifyPhone} from "@/utils/validate";
const uploadFileUrl = ref(import.meta.env.VITE_APP_BASE_API + "/common/upload"); // 上传文件服务器地址
const { proxy } = getCurrentInstance();
const dialogVisible = ref(false);
const title = ref("");
const busRef = ref();
const length = ref()
const emit = defineEmits(["getList"]);
const startPhone = ref('');
const validateUserPhone = (rule, value, callback)=>{
  if(value === ''){
    callback(new Error('请输入手机号'))
  }else if(state.title == '编辑' && value == startPhone.value){
    callback()
  } else{
    if(!verifyPhone(value)){
      callback(new Error('手机号格式有误'))
    }
  }
}
const state = reactive({
  form: {
    id: '',
    name: '',
    typeId:null,
    phone: '',
  },
  typeList: [
    {
      id: 1,
      name: '法定代表人'
    },
    {
      id: 2,
      name: '主要负责人'
    },
    {
      id: 3,
      name: '安全负责人'
    },
    {
      id: 4,
      name: '保管员'
    },
    {
      id: 5,
      name: '守护员'
    },
  ],
  storeroomList: [],
  formRules:{
    name: [{ required: true, trigger: "blur", message:'请输入姓名' }],
    phone: [{ required: true, trigger: "blur", validator: validateUserPhone }],
    typeId: [{ required: true, trigger: "blur", message:'请选择人员类型' }],
  },
})
const rules = {
  name: [
    { required: true, message: "姓名不能为空", trigger: "blur" },
  ],
};
const openDialog = async (type,value) => {
  title.value = type === 'add' ? '新增' : '编辑'
  if(type === 'edit') {
    state.form = JSON.parse(JSON.stringify(value))
    startPhone.value = value.phone
  }
  dialogVisible.value = true;
}
const onSubmit = async () => {
  console.log('form',state.form)
  const valid = await busRef.value.validate();
  if(valid){
    if(title.value === '新增'){
      const {id,fileList, ...data} = JSON.parse(JSON.stringify(state.form))
      // const res = await addTemplate(data)
      // if(res.code === 200){
      //   ElMessage({
      //     type: 'success',
      //     message: '新增成功'
      //   });
      // }else{
      //   ElMessage.warning(res.message)
      // }
      emit("getList")
      busRef.value.clearValidate();
      reset();
      dialogVisible.value = false;
    }else if(title.value === '编辑'){
      const {...data} = JSON.parse(JSON.stringify(state.form))
      const res = await editTemplate(data)
      // if(res.code === 200){
      //   ElMessage({
      //     type: 'success',
      //     message: '编辑成功'
      //   });
      // }else{
      //   ElMessage.warning(res.message)
      // }
      emit("getList")
      busRef.value.clearValidate();
      reset();
      dialogVisible.value = false;
    }
  }
}
const addRoom = () => {
  state.storeroomList.push({})
}
const delRoom = (val) => {
  console.log('val',val)
  if(Object.keys(val).length === 0){
    const index = state.storeroomList.findIndex(item => Object.keys(item).length === 0)
    if(index != -1){
      state.storeroomList.splice(index,1)
    }
  }else {
    const index = state.storeroomList.findIndex(item => item == val)
    if(index != -1){
      state.storeroomList.splice(index,1)
    }
  }
}
const handleClose = () => {
  busRef.value.clearValidate();
  reset();
  dialogVisible.value = false;
  emit("getList")
}
const reset = () => {
  state.form = {
    id: '',
    name: '',
    typeId:null,
    phone: '',
  }
  state.storeroomList = []
}
defineExpose({
  openDialog
});
</script>
<style scoped lang="scss">
.notice{
  :deep(.el-form .el-form-item__label) {
    font-size: 15px;
  }
  :deep(.el-form-item__content) {
    width: 100%;
  }
  .file {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
  }
  .custom-iframe {
    border: 1px solid #9b9999;
    /* 隐藏原生滚动条 */
    overflow: hidden;
  }
}
</style>
src/views/firework/warehouse/index.vue
@@ -1,11 +1,150 @@
<script setup>
</script>
<template>
  <div class="app-container">
    <div style="display: flex;justify-content: space-between;">
      <el-form :inline="true" style="display: flex;align-items: center;flex-wrap: wrap;" >
        <el-form-item>
          <el-button
              type="primary"
              plain
              icon="Plus"
              @click="addProject('add',{})"
          >
            新增
          </el-button>
        </el-form-item>
        <!--        <el-form-item label="姓名:" >-->
        <!--          <el-input v-model="data.queryParams.name" placeholder="请输入姓名"></el-input>-->
        <!--        </el-form-item>-->
        <!--        <el-form-item >-->
        <!--          <el-button-->
        <!--              type="primary"-->
        <!--              @click="getList"-->
        <!--          >查询</el-button>-->
        <!--          <el-button-->
        <!--              type="primary"-->
        <!--              plain-->
        <!--              @click="reset"-->
        <!--          >重置</el-button>-->
        <!--        </el-form-item>-->
      </el-form>
    </div>
    <!-- 表格数据 -->
    <el-table v-loading="loading" :data="dataList" :border="true">
      <el-table-column label="序号" type="index" align="center" width="80" />
      <el-table-column label="仓库名称" prop="name" align="center"  />
      <el-table-column label="仓库编号" prop="type" align="center" />
      <el-table-column label="面积" prop="phone" align="center" />
      <el-table-column label="危险等级" prop="createBy" align="center" />
      <el-table-column label="核定药量" prop="createBy" align="center" />
      <el-table-column label="核定人员" prop="updateBy" align="center" />
      <el-table-column label="创建人" prop="createTime" align="center" />
      <el-table-column label="创建时间" prop="updateTime" align="center" />
      <el-table-column label="修改人" prop="updateBy" align="center" />
      <el-table-column label="修改时间" prop="updateTime" align="center" />
      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" >
        <template #default="scope">
          <el-button link type="primary" @click="addProject('edit',scope.row)">编辑</el-button>
          <el-button link type="danger" @click="handleDelete(scope.row)">删除</el-button>
        </template>
      </el-table-column>
    </el-table>
    <pagination
        v-show="total > 0"
        :total="total"
        v-model:page="queryParams.pageIndex"
        v-model:limit="queryParams.pageSize"
        @pagination="getList"
    />
    <warehouseDialog ref="dialogRef" @getList="getList"></warehouseDialog>
  </div>
</template>
<style scoped lang="scss">
<script setup>
import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue";
import {ElMessage, ElMessageBox} from "element-plus";
import warehouseDialog from './components/warehouseDialog.vue'
import {delTemplate, getTemplate} from "@/api/signAgreement/template";
import {getWarning} from "@/api/company/warning";
import Cookies from "js-cookie";
const { proxy } = getCurrentInstance();
const loading = ref(false);
const dialogRef = ref();
const createSignRef = ref();
const data = reactive({
  queryParams: {
    pageIndex: 1,
    pageSize: 10,
    filter: {
      companyName: '',
      companyCode: ''
    }
  },
  total: 0,
  dataList: []
});
</style>
const { queryParams, total, dataList } = toRefs(data);
const classHourRef = ref();
onMounted(()=>{
  const info = JSON.parse(Cookies.get('userInfo'))
  data.queryParams.filter.companyCode = info.companynumber
  getList()
})
onUnmounted(()=>{
})
const addProject = (type,value) => {
  dialogRef.value.openDialog(type,value)
}
const getList = async () => {
  loading.value = true
  const res = await getWarning(data.queryParams)
  if(res.code == 200){
    data.dataList = res.result.records
    data.total = res.result.total
  }else{
    ElMessage.warning(res.message)
  }
  loading.value = false
}
/** 重置新增的表单以及其他数据  */
function reset() {
  data.queryParams = {
    pageIndex: 1,
    pageSize: 10,
    filter: {
      companyName: '',
      companyCode: ''
    }
  }
  getList()
}
const handleDelete = (val) => {
  ElMessageBox.confirm(
      '确定删除此条数据?',
      '提示',
      {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning',
      })
      .then( async() => {
        const res = await delTemplate(val.id)
        if(res.code == 200){
          ElMessage.success('数据删除成功')
          await getList()
        }else{
          ElMessage.warning(res.message)
        }
      })
}
const getRowKeys = (row) => {
  return row.name
}
</script>
src/views/firework/warning/components/feedbackDialog.vue
对比新文件
@@ -0,0 +1,148 @@
<template>
  <div class="notice">
    <el-dialog
        v-model="dialogVisible"
        title="提交反馈"
        width="500px"
        :before-close="handleClose"
        :close-on-press-escape="false"
        :close-on-click-modal="false"
    >
      <el-form :model="state.form" size="default" ref="busRef" :rules="state.formRules" label-width="77px" >
        <el-form-item label="企业名:" prop="name" >
          <span>{{ state.form.companyName }}</span>
        </el-form-item>
<!--        <el-row :gutter="12">-->
<!--          <el-col :span="10">-->
<!--            <el-form-item label="仓库:" prop="name" >-->
<!--              <span>{{ state.form.companyName }}</span>-->
<!--            </el-form-item>-->
<!--          </el-col>-->
<!--          <el-col :span="12">-->
<!--            <el-form-item label="库房:" prop="name" >-->
<!--              <span>{{ state.form.companyName }}</span>-->
<!--            </el-form-item>-->
<!--          </el-col>-->
<!--        </el-row>-->
        <el-form-item label="风险等级:" prop="phone" >
          <span>{{ state.form.riskLevel == 1 ? '重大' : state.form.riskLevel == 2?'较大': state.form.riskLevel == 3?'一般': state.form.riskLevel == 4 ? '低': ''}}</span>
        </el-form-item>
      </el-form>
      <div>
        <span style="font-size: 15px;font-weight: 700;">反馈意见:</span>
        <el-input v-model='state.form.feedBack' type="textarea" :rows="5" style="margin-top: 10px"></el-input>
      </div>
      <template #footer>
        <span class="dialog-footer">
            <el-button @click="handleClose" size="default">取 消</el-button>
            <el-button type="primary"  @click="onSubmit" size="default" v-preReClick>确认</el-button>
        </span>
      </template>
    </el-dialog>
  </div>
</template>
<script setup>
import {reactive, ref, toRefs} from 'vue'
import {ElMessage} from "element-plus";
import {listDept} from "@/api/system/dept";
import {listUser} from "@/api/system/user";
import {addTemplate, editTemplate} from "@/api/signAgreement/template";
import {addType, editType, getSignType} from "@/api/signAgreement/signType";
import {getInfo} from "@/api/login";
import {getToken} from "@/utils/auth";
import {verifyPhone} from "@/utils/validate";
import {pushWarning} from "@/api/company/warning";
const { proxy } = getCurrentInstance();
const dialogVisible = ref(false);
const title = ref("");
const busRef = ref();
const length = ref()
const emit = defineEmits(["getList"]);
const state = reactive({
  form: {
    id: '',
    feedBack: '',
  },
  formRules:{
    feedBack: [{ required: true, trigger: "blur", message:'请输入反馈内容' }],
  },
})
const openDialog = async (type,value) => {
  if(type === 'edit') {
    state.form = JSON.parse(JSON.stringify(value))
  }
  dialogVisible.value = true;
}
const onSubmit = async () => {
  const valid = await busRef.value.validate();
  if(valid){
    if(!state.form.feedBack){
      ElMessage.warning('请输入反馈意见')
      return
    }
      const { ...data} = JSON.parse(JSON.stringify(state.form))
      const param = {
        id: data.id,
        feedBack: data.feedBack
      }
      const res = await pushWarning(param)
      if(res.code == 200){
        ElMessage({
          type: 'success',
          message: '提交成功'
        });
      }else{
        ElMessage.warning(res.message)
      }
      emit("getList")
      busRef.value.clearValidate();
      reset();
      dialogVisible.value = false;
  }
}
const handleClose = () => {
  busRef.value.clearValidate();
  reset();
  dialogVisible.value = false;
  emit("getList")
}
const reset = () => {
  state.form = {
    id: '',
    feedBack: '',
  }
}
defineExpose({
  openDialog
});
</script>
<style scoped lang="scss">
.notice{
  :deep(.el-form .el-form-item__label) {
    font-size: 15px;
  }
  :deep(.el-form-item__content) {
    width: 100%;
  }
  .file {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
  }
  .custom-iframe {
    border: 1px solid #9b9999;
    /* 隐藏原生滚动条 */
    overflow: hidden;
  }
}
</style>
src/views/firework/warning/index.vue
@@ -1,11 +1,204 @@
<script setup>
</script>
<template>
  <div class="app-container">
    <div style="display: flex;justify-content: space-between;">
      <el-form :inline="true" style="display: flex;align-items: center;flex-wrap: wrap;" >
        <el-form-item>
          <el-date-picker
              v-model="data.dateRange"
              value-format="YYYY-MM-DD"
              type="daterange"
              range-separator="-"
              start-placeholder="开始日期"
              end-placeholder="结束日期"
              style="width: 300px"
          ></el-date-picker>
        </el-form-item>
        <el-form-item label="状态:" >
          <el-select
              v-model="data.queryParams.filter.pushType"
              placeholder="请选择"
              style="width: 100%"
          >
            <el-option
                v-for="item in data.statusList"
                :key="item.id"
                :label="item.name"
                :value="item.id"
            />
          </el-select>
        </el-form-item>
        <el-form-item >
          <el-button
              type="primary"
              @click="getList"
          >查询</el-button>
          <el-button
              type="primary"
              plain
              @click="reset"
          >重置</el-button>
        </el-form-item>
      </el-form>
    </div>
    <!-- 表格数据 -->
    <el-table v-loading="loading" :data="dataList" :border="true">
      <el-table-column label="序号" type="index" align="center" width="80" />
      <el-table-column label="企业名称" prop="companyName" align="center"  />
      <el-table-column label="市(地、州)" prop="type" align="center" width="120" >
        <template #default="scope">
          <span>{{scope.row.provinceName}}-{{scope.row.cityName}}</span>
        </template>
      </el-table-column>
      <el-table-column label="区县" prop="areaName" align="center" />
      <el-table-column label="风险等级" prop="riskLevel" align="center" >
        <template #default="scope">
          <span>{{scope.row.riskLevel == 1 ? '重大' :scope.row.riskLevel == 2?'较大':scope.row.riskLevel == 3?'一般':scope.row.riskLevel == 4 ? '低': ''}}</span>
        </template>
      </el-table-column>
      <el-table-column label="推送状态" prop="pushType" align="center" >
        <template #default="scope">
          <span>{{scope.row.pushType == 0 ? '未下发' :scope.row.pushType == 1 ? '已下发' : '已反馈' }}</span>
        </template>
      </el-table-column>
      <el-table-column label="推送内容" prop="pushContent" align="center" />
      <el-table-column label="反馈意见" prop="feedback" align="center" >
        <template #default="scope">
          <span v-if="scope.row.feedback">{{scope.row.feedback}}</span>
          <span v-else>--</span>
        </template>
      </el-table-column>
      <el-table-column label="创建时间" prop="createDate" align="center" width="120" />
      <el-table-column label="创建人" prop="createBy" align="center" />
      <el-table-column label="更新时间" prop="updateDate" align="center" width="120" />
      <el-table-column label="更新者" prop="updateBy" align="center" />
      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="150" >
        <template #default="scope">
          <el-button link type="primary" v-if="scope.row.pushType != 2" @click="addProject('edit',scope.row)">提交反馈</el-button>
          <el-button link type="danger" @click="handleDelete(scope.row)">删除</el-button>
        </template>
      </el-table-column>
    </el-table>
    <pagination
        v-show="total > 0"
        :total="total"
        v-model:page="queryParams.pageIndex"
        v-model:limit="queryParams.pageSize"
        @pagination="getList"
    />
    <feedback ref="dialogRef" @getList="getList"></feedback>
  </div>
</template>
<style scoped lang="scss">
<script setup>
import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue";
import {ElMessage, ElMessageBox} from "element-plus";
import feedback from './components/feedbackDialog.vue'
import {delTemplate, getTemplate} from "@/api/signAgreement/template";
import {delWarning, getWarning} from "@/api/company/warning";
import Cookies from "js-cookie";
const { proxy } = getCurrentInstance();
const loading = ref(false);
const dialogRef = ref();
const createSignRef = ref();
const data = reactive({
  queryParams: {
    pageIndex: 1,
    pageSize: 10,
    filter: {
      companyName: '',
      companyCode: '',
      createDateStart: '',
      createDateEnd: '',
      pushType: null,
    }
  },
  total: 0,
  dataList: [],
  dateRange: [],
  statusList: [
    {
      id: 1,
      name: '已下发'
    },
    {
      id: 2,
      name: '已反馈'
    },
</style>
  ],
});
const { queryParams, total, dataList } = toRefs(data);
const classHourRef = ref();
onMounted(()=>{
  const info = JSON.parse(Cookies.get('userInfo'))
  data.queryParams.filter.companyCode = info.companynumber
  getList()
})
onUnmounted(()=>{
})
const addProject = (type,value) => {
  dialogRef.value.openDialog(type,value)
}
const getList = async () => {
  loading.value = true
  data.queryParams.filter.alarmStartTime = data.dateRange[0]
  data.queryParams.filter.alarmEndTime = data.dateRange[1]
  const res = await getWarning(data.queryParams)
  if(res.code == 200){
    data.dataList = res.result.records
    data.total = res.result.total
  }else{
    ElMessage.warning(res.message)
  }
  loading.value = false
}
/** 重置新增的表单以及其他数据  */
function reset() {
  data.queryParams = {
    pageIndex: 1,
    pageSize: 10,
    filter: {
      companyName: '',
      companyCode: '',
      createDateStart: '',
      createDateEnd: '',
      pushType: null,
    }
  }
  data.dateRange = []
  getList()
}
const handleDelete = (val) => {
  ElMessageBox.confirm(
      '确定删除此条数据?',
      '提示',
      {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning',
      })
      .then( async() => {
        const param = {
          id:val.id
        }
        const res = await delWarning(param)
        if(res.code == 200){
          ElMessage.success('数据删除成功')
          await getList()
        }else{
          ElMessage.warning(res.message)
        }
      })
}
const getRowKeys = (row) => {
  return row.name
}
</script>