From 0eb20ecb8d06fb2dbc0741566ebbfc1160e33ecb Mon Sep 17 00:00:00 2001
From: zhouwx <1175765986@qq.com>
Date: 星期一, 14 四月 2025 15:01:05 +0800
Subject: [PATCH] 接口对接

---
 src/api/company/peopleCar.js                                |   30 
 src/views/firework/alarm/index.vue                          |  239 ++++++
 src/store/modules/user.js                                   |    2 
 src/views/firework/humiture/index.vue                       |  218 +++++
 src/views/firework/peopleCar/components/peopleCarDialog.vue |  163 ++++
 src/views/firework/warehouse/components/warehouseDialog.vue |  338 +++++++++
 src/api/company/alarm.js                                    |   18 
 src/views/firework/humiture/components/dataDialog.vue       |   72 +
 src/views/firework/warehouse/index.vue                      |  153 +++
 src/api/company/people.js                                   |   30 
 src/views/firework/people/index.vue                         |  158 ++++
 src/views/firework/warning/components/feedbackDialog.vue    |  148 ++++
 src/api/company/warning.js                                  |   26 
 src/utils/request.js                                        |    6 
 .env.development                                            |    2 
 src/api/area.js                                             |    3 
 src/views/firework/people/components/peopleDialog.vue       |  212 +++++
 src/views/firework/warning/index.vue                        |  207 +++++
 src/views/firework/peopleCar/index.vue                      |  141 +++
 src/views/firework/permit/index.vue                         |    1 
 20 files changed, 2,124 insertions(+), 43 deletions(-)

diff --git a/.env.development b/.env.development
index a0c49bb..737903e 100644
--- a/.env.development
+++ b/.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'
diff --git a/src/api/area.js b/src/api/area.js
index 368886e..4abee95 100644
--- a/src/api/area.js
+++ b/src/api/area.js
@@ -10,4 +10,5 @@
         method: 'get',
         params: params
     })
-}
\ No newline at end of file
+}
+
diff --git a/src/api/company/alarm.js b/src/api/company/alarm.js
new file mode 100644
index 0000000..477a828
--- /dev/null
+++ b/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
+    })
+}
diff --git a/src/api/company/people.js b/src/api/company/people.js
new file mode 100644
index 0000000..6b4125a
--- /dev/null
+++ b/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
+    })
+}
diff --git a/src/api/company/peopleCar.js b/src/api/company/peopleCar.js
new file mode 100644
index 0000000..9732c08
--- /dev/null
+++ b/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
+    })
+}
diff --git a/src/api/company/warning.js b/src/api/company/warning.js
new file mode 100644
index 0000000..46b93ab
--- /dev/null
+++ b/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
+    })
+}
diff --git a/src/store/modules/user.js b/src/store/modules/user.js
index 64c4016..fe3d953 100644
--- a/src/store/modules/user.js
+++ b/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;
diff --git a/src/utils/request.js b/src/utils/request.js
index d1d37bb..d7d05aa 100644
--- a/src/utils/request.js
+++ b/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)
     }
   },
diff --git a/src/views/firework/alarm/index.vue b/src/views/firework/alarm/index.vue
index 762e8b7..3e6b437 100644
--- a/src/views/firework/alarm/index.vue
+++ b/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>
diff --git a/src/views/firework/humiture/components/dataDialog.vue b/src/views/firework/humiture/components/dataDialog.vue
new file mode 100644
index 0000000..c5a2afc
--- /dev/null
+++ b/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>
diff --git a/src/views/firework/humiture/index.vue b/src/views/firework/humiture/index.vue
index 762e8b7..dcb763b 100644
--- a/src/views/firework/humiture/index.vue
+++ b/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>
diff --git a/src/views/firework/people/components/peopleDialog.vue b/src/views/firework/people/components/peopleDialog.vue
new file mode 100644
index 0000000..c52d394
--- /dev/null
+++ b/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>
diff --git a/src/views/firework/people/index.vue b/src/views/firework/people/index.vue
index 32d05de..4451873 100644
--- a/src/views/firework/people/index.vue
+++ b/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>
diff --git a/src/views/firework/peopleCar/components/peopleCarDialog.vue b/src/views/firework/peopleCar/components/peopleCarDialog.vue
new file mode 100644
index 0000000..17af073
--- /dev/null
+++ b/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>
diff --git a/src/views/firework/peopleCar/index.vue b/src/views/firework/peopleCar/index.vue
index 762e8b7..b14f94f 100644
--- a/src/views/firework/peopleCar/index.vue
+++ b/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>
diff --git a/src/views/firework/permit/index.vue b/src/views/firework/permit/index.vue
index 762e8b7..bd5adfa 100644
--- a/src/views/firework/permit/index.vue
+++ b/src/views/firework/permit/index.vue
@@ -9,3 +9,4 @@
 <style scoped lang="scss">
 
 </style>
+
diff --git a/src/views/firework/warehouse/components/warehouseDialog.vue b/src/views/firework/warehouse/components/warehouseDialog.vue
new file mode 100644
index 0000000..c21769b
--- /dev/null
+++ b/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>
diff --git a/src/views/firework/warehouse/index.vue b/src/views/firework/warehouse/index.vue
index 762e8b7..52eaff2 100644
--- a/src/views/firework/warehouse/index.vue
+++ b/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>
diff --git a/src/views/firework/warning/components/feedbackDialog.vue b/src/views/firework/warning/components/feedbackDialog.vue
new file mode 100644
index 0000000..ff61449
--- /dev/null
+++ b/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>
diff --git a/src/views/firework/warning/index.vue b/src/views/firework/warning/index.vue
index 762e8b7..a5c482a 100644
--- a/src/views/firework/warning/index.vue
+++ b/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>

--
Gitblit v1.9.2