From 9cbd3ec7007bac8b7ae5d49d2e521889fda28822 Mon Sep 17 00:00:00 2001
From: 马宇豪 <978517621@qq.com>
Date: 星期四, 19 十二月 2024 14:22:30 +0800
Subject: [PATCH] 修改数据上报

---
 src/views/dataUpload/peopleLocate/components/addReport.vue                    |    6 
 src/api/dataUpload/educateTrain/index.ts                                      |   21 
 src/views/dataUpload/saftyBaseInfo/saftyFiles/index.vue                       |  284 ++++++++++
 src/api/dataUpload/saftyBaseInfo/judgeReport.ts                               |   42 +
 src/views/dataUpload/educateTrain/trainPlan/components/addReport.vue          |  281 ++++++++++
 src/views/dataUpload/saftyBaseInfo/productionAbility/components/addReport.vue |  248 ++++++++
 src/views/dataUpload/saftyBaseInfo/saftyFiles/components/addReport.vue        |  236 ++++++++
 src/views/dataUpload/educateTrain/trainPlan/index.vue                         |  271 +++++++++
 src/views/dataUpload/saftyBaseInfo/productionAbility/index.vue                |  265 +++++++++
 9 files changed, 1,651 insertions(+), 3 deletions(-)

diff --git a/src/api/dataUpload/educateTrain/index.ts b/src/api/dataUpload/educateTrain/index.ts
index 02cae8c..42f3fe5 100644
--- a/src/api/dataUpload/educateTrain/index.ts
+++ b/src/api/dataUpload/educateTrain/index.ts
@@ -43,6 +43,27 @@
                 method: 'post',
                 data: data
             });
+        },
+        getTrainPlanList: (data: object) => {
+            return request({
+                url: import.meta.env.VITE_API_URL + `/report/assemble/train/plan/list`,
+                method: 'post',
+                data: data
+            });
+        },
+        addTrainPlan: (data: Array<any>) => {
+            return request({
+                url: import.meta.env.VITE_API_URL + `/report/assemble/train/plan`,
+                method: 'post',
+                data: data
+            });
+        },
+        delTrainPlan: (data: object) => {
+            return request({
+                url: import.meta.env.VITE_API_URL + `/report/assemble/train/plan/del`,
+                method: 'post',
+                data: data
+            });
         }
     };
 }
diff --git a/src/api/dataUpload/saftyBaseInfo/judgeReport.ts b/src/api/dataUpload/saftyBaseInfo/judgeReport.ts
index adfbc48..08a87db 100644
--- a/src/api/dataUpload/saftyBaseInfo/judgeReport.ts
+++ b/src/api/dataUpload/saftyBaseInfo/judgeReport.ts
@@ -148,6 +148,48 @@
                 method: 'post',
                 data: data
             });
+        },
+        getCapacityList: (data: object) => {
+            return request({
+                url: import.meta.env.VITE_API_URL + `/report/assemble/craft/capacity/manage/list`,
+                method: 'post',
+                data: data
+            });
+        },
+        addCapacity: (data: object) => {
+            return request({
+                url: import.meta.env.VITE_API_URL + `/report/assemble/craft/capacity/manage`,
+                method: 'post',
+                data: data
+            });
+        },
+        delCapacity: (data: object) => {
+            return request({
+                url: import.meta.env.VITE_API_URL + `/report/assemble/craft/capacity/manage/del`,
+                method: 'post',
+                data: data
+            });
+        },
+        getSafeFileList: (data: object) => {
+            return request({
+                url: import.meta.env.VITE_API_URL + `/report/assemble/safe/manage/file/list`,
+                method: 'post',
+                data: data
+            });
+        },
+        addSafeFile: (data: object) => {
+            return request({
+                url: import.meta.env.VITE_API_URL + `/report/assemble/safe/manage/file`,
+                method: 'post',
+                data: data
+            });
+        },
+        delSafeFile: (data: object) => {
+            return request({
+                url: import.meta.env.VITE_API_URL + `/report/assemble/safe/manage/file/del`,
+                method: 'post',
+                data: data
+            });
         }
     };
 }
diff --git a/src/views/dataUpload/educateTrain/trainPlan/components/addReport.vue b/src/views/dataUpload/educateTrain/trainPlan/components/addReport.vue
new file mode 100644
index 0000000..61d4651
--- /dev/null
+++ b/src/views/dataUpload/educateTrain/trainPlan/components/addReport.vue
@@ -0,0 +1,281 @@
+<template>
+  <div class="system-add-user-container">
+    <el-dialog :title="title" v-model="isShowDialog" width="50%">
+      <el-form :model="form" size="default" ref="formRef" :rules="rules" label-width="160px">
+        <el-row :gutter="35">
+          <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
+            <el-form-item label="培训计划名称" prop="planName">
+              <el-input v-model.trim="form.planName" placeholder="培训计划名称" clearable></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
+            <el-form-item label="培训形式" prop="planMode">
+              <el-radio-group v-model="form.planMode">
+                <el-radio :label="1">线上</el-radio>
+                <el-radio :label="2">线下</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
+            <el-form-item label="线下培训印证照片">
+              <el-upload accept="image/*" multiple list-type="picture-card" :action="uploadUrl" :headers="header"
+                         method="post" :on-exceed="showTip" :on-preview="handlePictureCardPreview"
+                         :on-success="handleAvatarSuccess" :limit='2' v-model:file-list="fileList"
+                         :before-upload="picSize" :on-remove="handleRemove" :before-remove="beforeRemove">
+                <el-icon>
+                  <Plus/>
+                </el-icon>
+                <template #tip>
+                  <div class="el-upload__tip">上传图片尺寸小于5M,最多可上传5张</div>
+                </template>
+              </el-upload>
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
+            <el-form-item label="培训时间" prop="planBeginTime">
+              <el-date-picker
+                  v-model="timeRange"
+                  @change="changeRange"
+                  type="datetimerange"
+                  range-separator="至"
+                  start-placeholder="开始日期"
+                  end-placeholder="结束日期"
+                  value-format="YYYY-MM-DD HH:mm:ss"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20" v-if="title == '新增上报'? false : true">
+            <el-form-item label="删除状态" prop="deleted">
+              <el-radio-group v-model="form.deleted">
+                <el-radio :label="0">未删除</el-radio>
+                <el-radio :label="1">已删除</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <el-dialog v-model="imgDialog">
+        <img width="100%" :src="imageUrl" alt="Preview Image"/>
+      </el-dialog>
+      <template #footer>
+        <span class="dialog-footer">
+            <el-button @click="isShowDialog = !isShowDialog" size="default">取 消</el-button>
+            <el-button type="primary" v-throttle @click="onSubmit" size="default">确 定</el-button>
+        </span>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script lang="ts">
+import {reactive, toRefs, onMounted, defineComponent, ref} from 'vue';
+import {ElMessageBox, ElMessage} from 'element-plus';
+import axios from "axios";
+import {workApplyApi} from "/@/api/specialWorkSystem/workApply";
+import Cookies from "js-cookie";
+import {judgeReportApi} from "/@/api/dataUpload/saftyBaseInfo/judgeReport";
+import {educateTrainApi} from "/@/api/dataUpload/educateTrain";
+
+// 定义接口来定义对象的类型
+interface DataState {
+  title: string
+  isShowDialog: boolean
+  form: {
+    uuid: string
+    planName: string
+    planMode: number | null
+    offlineFile: string
+    planBeginTime: string
+    planEndTime: string
+    deleted: number | null
+  }
+  timeRange: [],
+  rules: {},
+  fileList: [],
+  uploadUrl: string,
+  header: {},
+  imgDialog: boolean,
+  imageUrl: string
+}
+
+export default defineComponent({
+  name: 'reportDialog',
+  setup(props, context) {
+    const formRef = ref()
+    const state = reactive<DataState>({
+      title: '',
+      isShowDialog: false,
+      form: {
+        uuid: '',
+        planName: '',
+        planMode: null,
+        offlineFile: '',
+        planBeginTime: '',
+        planEndTime: '',
+        deleted: 0,
+      },
+      rules: {
+        planName: [{required: true, message: '请填写培训计划名称', trigger: 'blur'}],
+        planMode: [{required: true, message: '请选择培训形式', trigger: 'blur'}],
+        planBeginTime: [{required: true, message: '请选择培训开始结束时间', trigger: 'blur'}]
+      },
+      timeRange: [],
+      fileList: [],
+      uploadUrl: import.meta.env.VITE_API_URL + '/account/file/upload',
+      header: {
+        uid: Cookies.get('uid'),
+        Authorization: Cookies.get('token')
+      },
+      imgDialog: false,
+      imageUrl: ''
+    })
+
+    // 页面加载时
+    onMounted(() => {
+
+    })
+    // 打开弹窗
+    const open = (type: string, data: object) => {
+      state.isShowDialog = true;
+      if (type === 'add') {
+        state.title = '新增上报'
+        state.form = {
+          uuid: '',
+          planName: '',
+          planMode: null,
+          offlineFile: '',
+          planBeginTime: '',
+          planEndTime: '',
+          deleted: 0,
+        }
+        state.fileList = []
+      } else {
+        state.title = '重新上报'
+        Object.keys(state.form).forEach(key => {
+          if (Object.prototype.hasOwnProperty.call(data, key)) {
+            state.form[key] = JSON.parse(JSON.stringify(data))[key];
+          }
+        })
+        state.timeRange = [state.form.planBeginTime,state.form.planEndTime]
+        if (data.offlineFile !== '') {
+          state.fileList = data.offlineFile.split(',').map((i, index) => {
+            return {
+              url: i,
+              name: i
+            }
+          })
+        } else {
+          state.fileList = []
+        }
+
+        // state.form = {
+        //   uuid: data.uuid,
+        //   planName: '',
+        //   craftContent: '',
+        //   mainProdEquip: '',
+        //   keyParts: '',
+        //   hazardCode: '',
+        //   msds: '',
+        //   hazardCharacter: '',
+        //   parameterIndex: '',
+        //   controlMean: '',
+        //   offlineFile: '',
+        //   reactionType: '',
+        //   keyMonitorUnit: ''
+        // }
+      }
+    };
+
+    const changeRange=(value)=>{
+      if(!value){
+        state.form.planBeginTime = ""
+        state.form.planEndTime = ""
+      }else {
+        state.form.planBeginTime = state.timeRange[0]
+        state.form.planEndTime = state.timeRange[1]
+      }
+    }
+
+    // 新增修改
+    const onSubmit = async () => {
+      formRef.value.validate(async (valid: Boolean) => {
+        if (valid) {
+          state.form.offlineFile = state.fileList.map(i => i.name).join(',')
+          const res = await educateTrainApi().addTrainPlan([state.form])
+          if (res.data.code == '200') {
+            ElMessage({
+              type: 'success',
+              message: '数据上报成功'
+            })
+            state.isShowDialog = false
+            state.fileList = []
+          } else {
+            ElMessage({
+              type: 'warning',
+              message: res.data.msg
+            })
+          }
+          context.emit('refresh')
+        } else {
+          ElMessage({
+            type: 'warning',
+            message: '请完善基本信息'
+          })
+        }
+      })
+    }
+
+    // 图片上传
+    const showTip = () => {
+      ElMessage({
+        type: 'warning',
+        message: '超出文件上传数量'
+      });
+    }
+
+    const picSize = async (rawFile: any) => {
+      if (rawFile.size / 1024 / 1024 > 5) {
+        ElMessage({
+          type: 'warning',
+          message: '文件大小不能超过5M'
+        });
+        return false
+      }
+    }
+
+    const handleAvatarSuccess = (res: any, uploadFile: any) => {
+      if (res) {
+        uploadFile.name = res
+      } else {
+        ElMessage({
+          type: 'warning',
+          message: '文件上传失败'
+        })
+      }
+    }
+
+    const handlePictureCardPreview = (uploadFile) => {
+      state.imageUrl = uploadFile.url
+      state.imgDialog = true;
+    }
+
+    const handleRemove = (file, uploadFiles, type) => {
+      state.fileList = uploadFiles
+    }
+
+
+    return {
+      formRef,
+      showTip,
+      picSize,
+      changeRange,
+      handleAvatarSuccess,
+      handlePictureCardPreview,
+      handleRemove,
+      open,
+      onSubmit,
+      ...toRefs(state)
+    };
+  }
+});
+</script>
diff --git a/src/views/dataUpload/educateTrain/trainPlan/index.vue b/src/views/dataUpload/educateTrain/trainPlan/index.vue
new file mode 100644
index 0000000..fbc7046
--- /dev/null
+++ b/src/views/dataUpload/educateTrain/trainPlan/index.vue
@@ -0,0 +1,271 @@
+<template>
+    <div class="home-container">
+        <div style="height: 100%">
+          <div class="homeCard">
+            <div class="main-card">
+            <el-row class="cardTop">
+              <el-col :span="12" class="mainCardBtn">
+                <el-button type="primary" icon="Plus" size="default" @click="openDialog('add',{})">新增</el-button>
+              </el-col>
+            </el-row>
+            <el-table :data="reportData" style="width: 100%" height="calc(100% - 48px)" :header-cell-style="{ background: '#fafafa' }">
+              <el-table-column prop="id" label="id" show-overflow-tooltip></el-table-column>
+              <el-table-column prop="planName" label="培训计划名称" show-overflow-tooltip></el-table-column>
+              <el-table-column prop="planMode" label="培训形式" show-overflow-tooltip>
+                <template #default="scope">
+                  {{ scope.row.planMode == 1? '线上':scope.row.planMode == 2? '线下':'--' }}
+                </template>
+              </el-table-column>
+              <el-table-column prop="offlineFile" label="印证照片" show-overflow-tooltip>
+                <template #default="scope">
+                  <div v-if="scope.row.offlineFile && scope.row.offlineFile !== ''">
+                    <el-image
+                        v-for="(item,index) in scope.row.offlineFile.split(',')"
+                        style="width: 50px; height: 50px"
+                        :src="item"
+                        fit="cover"
+                        :preview-teleported= true
+                    />
+                  </div>
+                </template>
+              </el-table-column>
+              <el-table-column prop="planBeginTime" label="培训开始时间" show-overflow-tooltip></el-table-column>
+              <el-table-column prop="planEndTime" label="培训结束时间" show-overflow-tooltip></el-table-column>
+              <el-table-column prop="createDate" label="创建时间" show-overflow-tooltip></el-table-column>
+              <el-table-column prop="updateDate" label="修改时间" show-overflow-tooltip></el-table-column>
+              <el-table-column label="操作" width="140">
+                  <template #default="scope">
+                    <el-button size="small" text type="primary" @click="openDialog('update',scope.row)">重新上报</el-button>
+                    <el-button style="color: red" size="small" text type="primary" @click="onRowDel(scope.row)">删除</el-button>
+                  </template>
+              </el-table-column>
+            </el-table>
+            <div class="pageBtn">
+              <el-pagination @size-change="onHandleSizeChange" small="false" @current-change="onHandleCurrentChange" class="page-position" :pager-count="5" :page-sizes="[10, 20, 30]" v-model:current-page="listQuery.pageIndex" background v-model:page-size="listQuery.pageSize" layout="total, sizes, prev, pager, next, jumper" :total="total"> </el-pagination>
+            </div>
+            </div>
+          </div>
+        </div>
+        <add-report ref="reportRef" @refresh="getData"></add-report>
+    </div>
+</template>
+
+<script lang="ts">
+import { toRefs, reactive, onMounted, ref, defineComponent } from 'vue'
+import { ElMessageBox, ElMessage } from 'element-plus'
+import { Plus } from '@element-plus/icons-vue'
+import addReport from "./components/addReport.vue"
+import {judgeReportApi} from "/@/api/dataUpload/saftyBaseInfo/judgeReport";
+import axios from "axios";
+import Cookies from "js-cookie";
+import {educateTrainApi} from "/@/api/dataUpload/educateTrain";
+
+// 定义接口来定义对象的类型
+interface TableDataRow {
+  id: number|null
+  updateDate: string
+  createDate: string
+  planName: string
+  planMode: number|null
+  offlineFile: string
+  planBeginTime: string
+  planEndTime: string
+}
+interface TableDataState {
+  reportData: [],
+  listQuery: {
+    searchParams: {}
+    pageIndex: number
+    pageSize: number
+  }
+  total: null | number
+  baseUrl: string
+}
+
+export default defineComponent({
+    name: 'trainPlan',
+    components: {addReport },
+    setup() {
+      const reportRef= ref();
+      const state = reactive<TableDataState>({
+        reportData: [],
+        listQuery: {
+          searchParams: {},
+          pageIndex: 1,
+          pageSize: 10
+        },
+        total: null,
+        baseUrl: import.meta.env.VITE_API_URL
+      });
+
+      // 页面加载时
+      onMounted(() => {
+        getData()
+        console.log(state.baseUrl)
+      });
+
+      const getData = async ()=>{
+        const res = await educateTrainApi().getTrainPlanList(state.listQuery)
+        if(res.data.code == 200){
+          state.reportData = res.data.data
+          state.total = res.data.total
+        }else{
+          ElMessage({
+            type: 'warning',
+            message: res.data.msg
+          })
+        }
+      }
+
+      const openDialog=(type:string,data:object)=>{
+        reportRef.value.open(type,data)
+      }
+
+      // 删除用户
+      const onRowDel = (row: TableDataRow) => {
+          ElMessageBox.confirm(`此操作将永久删除计划名称:“${row.planName}”,是否继续?`, '提示', {
+              confirmButtonText: '确认',
+              cancelButtonText: '取消',
+              type: 'warning'
+          })
+              .then(async () => {
+                const res = await educateTrainApi().delTrainPlan({ids: [row.id]})
+                if(res.data.code == 200){
+                  ElMessage({
+                    type: 'success',
+                    message: '删除成功'
+                  })
+                  await getData()
+                }else{
+                  ElMessage({
+                    type: 'warning',
+                    message: res.data.msg
+                  })
+                }
+              })
+              .catch(() => {});
+      };
+      // 分页改变
+      const onHandleSizeChange = (val: number) => {
+          state.listQuery.pageSize = val;
+          getData()
+      };
+      // 分页改变
+      const onHandleCurrentChange = (val: number) => {
+          state.listQuery.pageIndex = val;
+          getData()
+      };
+
+      const openFile=(file: string)=>{
+        axios.get(import.meta.env.VITE_API_URL + file,{headers:{'Content-Type': 'application/json','Authorization': `${Cookies.get('token')}`,'uid':`${Cookies.get('uid')}`},responseType: 'blob'}).then(res=>{
+          if (res) {
+            const link = document.createElement('a')
+            let blob = new Blob([res.data],{type: res.data.type})
+            link.style.display = "none";
+            link.href = URL.createObjectURL(blob); // 创建URL
+            window.open(link.href)
+          } else {
+            ElMessage({
+              type: 'warning',
+              message: '文件读取失败'
+            });
+          }
+        })
+      }
+
+      return {
+        reportRef,
+        openDialog,
+        openFile,
+        getData,
+        onRowDel,
+        onHandleSizeChange,
+        onHandleCurrentChange,
+        ...toRefs(state)
+      };
+    }
+});
+</script>
+<style lang="scss" scoped>
+.home-container {
+  height: calc(100vh - 144px);
+  box-sizing: border-box;
+  overflow: hidden;
+  .demo-tabs {
+    width: 100%;
+    height: 100%;
+
+    &::v-deep(.el-tabs__content) {
+      height: calc(100% - 60px);
+    }
+
+    .el-tab-pane {
+      height: 100%;
+    }
+  }
+  .homeCard {
+    width: 100%;
+    padding: 20px;
+    box-sizing: border-box;
+    background: #fff;
+    border-radius: 4px;
+
+    .main-card {
+      width: 100%;
+      height: 100%;
+      .cardTop {
+        display: flex;
+        align-items: center;
+        justify-content: space-between;
+        margin-bottom: 20px;
+        .mainCardBtn {
+          margin: 0;
+        }
+      }
+      .pageBtn {
+        height: 60px;
+        display: flex;
+        align-items: center;
+        justify-content: right;
+
+        .demo-pagination-block + .demo-pagination-block {
+          margin-top: 10px;
+        }
+        .demo-pagination-block .demonstration {
+          margin-bottom: 16px;
+        }
+      }
+    }
+    &:last-of-type {
+      height: calc(100% - 100px);
+    }
+  }
+  .el-row {
+    display: flex;
+    align-items: center;
+    margin-bottom: 20px;
+    &:last-child {
+      margin-bottom: 0;
+    }
+    .grid-content {
+      align-items: center;
+      min-height: 36px;
+    }
+
+    .topInfo {
+      display: flex;
+      align-items: center;
+      font-size: 16px;
+      font-weight: bold;
+
+      & > div {
+        white-space: nowrap;
+        margin-right: 20px;
+      }
+    }
+  }
+  .el-card {
+    border: 0;
+  }
+}
+</style>
diff --git a/src/views/dataUpload/peopleLocate/components/addReport.vue b/src/views/dataUpload/peopleLocate/components/addReport.vue
index 4eb5c4c..bef28f2 100644
--- a/src/views/dataUpload/peopleLocate/components/addReport.vue
+++ b/src/views/dataUpload/peopleLocate/components/addReport.vue
@@ -167,7 +167,7 @@
         floorNo: '',
         handleTime: '',
         handleInfo: '',
-        thirdAddress: 'http://124.88.37.66:8081/location_system_5.4.9/map3d/index.html'
+        thirdAddress: 'http://117.190.40.54:8081/location_system_5.4.9/login/login.html?company=GUOTAI&version=5.4.9'
       },
       rules:{
         serialNumber: [{ required: true, message: '请填写序号', trigger: 'blur' }],
@@ -218,7 +218,7 @@
           floorNo: '',
           handleTime: '',
           handleInfo: '',
-          thirdAddress: 'http://124.88.37.66:8081/location_system_5.4.9/map3d/index.html'
+          thirdAddress: 'http://117.190.40.54:8081/location_system_5.4.9/login/login.html?company=GUOTAI&version=5.4.9'
         }
       }else{
         state.title = '重新上报';
@@ -237,7 +237,7 @@
           floorNo: '',
           handleTime: '',
           handleInfo: '',
-          thirdAddress: 'http://124.88.37.66:8081/location_system_5.4.9/map3d/index.html'
+          thirdAddress: 'http://117.190.40.54:8081/location_system_5.4.9/login/login.html?company=GUOTAI&version=5.4.9'
         }
       }
     };
diff --git a/src/views/dataUpload/saftyBaseInfo/productionAbility/components/addReport.vue b/src/views/dataUpload/saftyBaseInfo/productionAbility/components/addReport.vue
new file mode 100644
index 0000000..988e0ba
--- /dev/null
+++ b/src/views/dataUpload/saftyBaseInfo/productionAbility/components/addReport.vue
@@ -0,0 +1,248 @@
+<template>
+  <div class="system-add-user-container">
+    <el-dialog :title="title" v-model="isShowDialog" width="50%">
+      <el-form :model="form" size="default" ref="formRef" :rules="rules" label-width="120px">
+        <el-row :gutter="20">
+          <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12" class="mb20">
+            <el-form-item label="生产工艺" prop="craftId">
+              <el-select v-model="form.craftId" filterable placeholder="请选择生产工艺" clearable style="width: 100%">
+                <el-option v-for="(item,index) in craftList" :key="index" :label="item.craftName" :value="item.uuid"/>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12" class="mb20">
+            <el-form-item label="年份" prop="theYear">
+              <el-date-picker
+                  v-model="form.theYear"
+                  type="year"
+                  style="width: 100%"
+                  value-format="YYYY"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12" class="mb20">
+            <el-form-item label="一月产能" prop="janCapacity">
+              <el-input v-model.number.trim="form.janCapacity" placeholder="一月产能" type="number"/>
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12" class="mb20">
+            <el-form-item label="二月产能" prop="febCapacity">
+              <el-input v-model.number.trim="form.febCapacity" placeholder="二月产能" type="number"/>
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12" class="mb20">
+            <el-form-item label="三月产能" prop="marCapacity">
+              <el-input v-model.number.trim="form.marCapacity" placeholder="三月产能" type="number"/>
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12" class="mb20">
+            <el-form-item label="四月产能" prop="aprCapacity">
+              <el-input v-model.number.trim="form.aprCapacity" placeholder="四月产能" type="number"/>
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12" class="mb20">
+            <el-form-item label="五月产能" prop="mayCapacity">
+              <el-input v-model.number.trim="form.mayCapacity" placeholder="五月产能" type="number"/>
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12" class="mb20">
+            <el-form-item label="六月产能" prop="juneCapacity">
+              <el-input v-model.number.trim="form.juneCapacity" placeholder="六月产能" type="number"/>
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12" class="mb20">
+            <el-form-item label="七月产能" prop="julyCapacity">
+              <el-input v-model.number.trim="form.julyCapacity" placeholder="七月产能" type="number"/>
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12" class="mb20">
+            <el-form-item label="八月产能" prop="augCapacity">
+              <el-input v-model.number.trim="form.augCapacity" placeholder="八月产能" type="number"/>
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12" class="mb20">
+            <el-form-item label="九月产能" prop="sepCapacity">
+              <el-input v-model.number.trim="form.sepCapacity" placeholder="九月产能" type="number"/>
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12" class="mb20">
+            <el-form-item label="十月产能" prop="octCapacity">
+              <el-input v-model.number.trim="form.octCapacity" placeholder="十月产能" type="number"/>
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12" class="mb20">
+            <el-form-item label="十一月产能" prop="noveCapacity">
+              <el-input v-model.number.trim="form.noveCapacity" placeholder="十一月产能" type="number"/>
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12" class="mb20">
+            <el-form-item label="十二月产能" prop="decCapacity">
+              <el-input v-model.number.trim="form.decCapacity" placeholder="十二月产能" type="number"/>
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20" v-if="title == '新增上报'? false : true">
+            <el-form-item label="删除状态" prop="deleted">
+              <el-radio-group v-model="form.deleted">
+                <el-radio :label="0">未删除</el-radio>
+                <el-radio :label="1">已删除</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <template #footer>
+        <span class="dialog-footer">
+            <el-button @click="isShowDialog = !isShowDialog" size="default">取 消</el-button>
+            <el-button type="primary" v-throttle @click="onSubmit" size="default">确 定</el-button>
+        </span>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script lang="ts">
+import { reactive, toRefs, onMounted, defineComponent, ref } from 'vue';
+import {ElMessageBox, ElMessage, FormRules, FormInstance} from 'element-plus';
+import axios from "axios";
+import {contractorApi} from "/@/api/dataUpload/contractorManage";
+import Cookies from "js-cookie";
+import {judgeReportApi} from "/@/api/dataUpload/saftyBaseInfo/judgeReport";
+
+// 定义接口来定义对象的类型
+interface DataState {
+  title: string
+  isShowDialog: boolean
+  form: {
+    uuid: string
+    craftId: string
+    theYear: string
+    janCapacity: number | null
+    febCapacity: number | null
+    marCapacity: number | null
+    aprCapacity: number | null
+    mayCapacity: number | null
+    juneCapacity: number | null
+    julyCapacity: number | null
+    augCapacity: number | null
+    sepCapacity: number | null
+    octCapacity: number | null
+    noveCapacity: number | null
+    decCapacity: number | null
+    deleted: number | null
+  }
+  rules:{}
+  craftList: []
+}
+
+export default defineComponent({
+  name: 'reportDialog',
+  props: [],
+  setup(props, context) {
+    const formRef = ref()
+    const addFormRef = ref()
+    const state = reactive<DataState>({
+      title: '',
+      isShowDialog: false,
+      form: {
+        uuid: '',
+        craftId: '',
+        theYear: '',
+        janCapacity: null,
+        febCapacity: null,
+        marCapacity: null,
+        aprCapacity: null,
+        mayCapacity: null,
+        juneCapacity: null,
+        julyCapacity: null,
+        augCapacity: null,
+        sepCapacity: null,
+        octCapacity: null,
+        noveCapacity: null,
+        decCapacity: null,
+        deleted: 0
+      },
+      rules:{
+        craftId: [{ required: true, message: '请选择生产工艺', trigger: 'blur' }],
+        theYear: [{ required: true, message: '请输入所属年份', trigger: 'blur' }]
+      },
+      craftList: []
+    })
+
+    // 页面加载时
+    onMounted(() => {
+
+    })
+    // 打开弹窗
+    const open = (type: string, data: object, list: []) => {
+      state.isShowDialog = true
+      state.craftList = list
+      if (type === 'add') {
+        state.title = '新增上报';
+        state.form = {
+          uuid: '',
+          craftId: '',
+          theYear: '',
+          janCapacity: null,
+          febCapacity: null,
+          marCapacity: null,
+          aprCapacity: null,
+          mayCapacity: null,
+          juneCapacity: null,
+          julyCapacity: null,
+          augCapacity: null,
+          sepCapacity: null,
+          octCapacity: null,
+          noveCapacity: null,
+          decCapacity: null,
+          deleted: 0
+        }
+      }else{
+        state.title = '重新上报';
+        Object.keys(state.form).forEach(key => {
+          if (Object.prototype.hasOwnProperty.call(data,key)) {
+            state.form[key] = JSON.parse(JSON.stringify(data))[key];
+          }
+        })
+        state.form.theYear = state.form.theYear.toString()
+        state.form.deleted = 0
+      }
+    }
+
+    // 新增修改
+    const onSubmit = async () => {
+      formRef.value.validate(async (valid:Boolean) => {
+        if(valid){
+          const res = await judgeReportApi().addCapacity([state.form])
+          if(res.data.code == 200){
+            ElMessage({
+              type:'success',
+              message:'数据上报成功'
+            })
+            state.isShowDialog = false
+          }else{
+            ElMessage({
+              type:'warning',
+              message:res.data.msg
+            })
+          }
+          context.emit('refresh');
+        }else{
+          ElMessage({
+            type:'warning',
+            message:'请完善基本信息'
+          })
+        }
+      })
+    }
+
+
+    return {
+      formRef,
+      addFormRef,
+      open,
+      onSubmit,
+      ...toRefs(state)
+    };
+  }
+});
+</script>
diff --git a/src/views/dataUpload/saftyBaseInfo/productionAbility/index.vue b/src/views/dataUpload/saftyBaseInfo/productionAbility/index.vue
new file mode 100644
index 0000000..7690e7d
--- /dev/null
+++ b/src/views/dataUpload/saftyBaseInfo/productionAbility/index.vue
@@ -0,0 +1,265 @@
+<template>
+    <div class="home-container">
+        <div style="height: 100%">
+          <div class="homeCard">
+            <div class="main-card">
+            <el-row class="cardTop">
+              <el-col :span="12" class="mainCardBtn">
+                <el-button type="primary" icon="Plus" size="default" @click="openDialog('add',{})">新增</el-button>
+              </el-col>
+            </el-row>
+            <el-table :data="reportData" style="width: 100%" height="calc(100% - 48px)" :header-cell-style="{ background: '#fafafa' }">
+              <el-table-column prop="id" label="id" show-overflow-tooltip></el-table-column>
+              <el-table-column prop="craftId" label="生产工艺id" show-overflow-tooltip></el-table-column>
+              <el-table-column prop="theYear" label="所属年份" show-overflow-tooltip></el-table-column>
+              <el-table-column prop="janCapacity" label="一月" show-overflow-tooltip></el-table-column>
+              <el-table-column prop="febCapacity" label="二月" show-overflow-tooltip></el-table-column>
+              <el-table-column prop="marCapacity" label="三月" show-overflow-tooltip></el-table-column>
+              <el-table-column prop="aprCapacity" label="四月" show-overflow-tooltip></el-table-column>
+              <el-table-column prop="mayCapacity" label="五月" show-overflow-tooltip></el-table-column>
+              <el-table-column prop="juneCapacity" label="六月" show-overflow-tooltip></el-table-column>
+              <el-table-column prop="julyCapacity" label="七月" show-overflow-tooltip></el-table-column>
+              <el-table-column prop="augCapacity" label="八月" show-overflow-tooltip></el-table-column>
+              <el-table-column prop="sepCapacity" label="九月" show-overflow-tooltip></el-table-column>
+              <el-table-column prop="octCapacity" label="十月" show-overflow-tooltip></el-table-column>
+              <el-table-column prop="noveCapacity" label="十一月" show-overflow-tooltip></el-table-column>
+              <el-table-column prop="decCapacity" label="十二月" show-overflow-tooltip></el-table-column>
+              <el-table-column prop="updateUser" label="修改人" show-overflow-tooltip></el-table-column>
+              <el-table-column prop="updateDate" label="修改时间" show-overflow-tooltip></el-table-column>
+              <el-table-column label="操作" width="140">
+                  <template #default="scope">
+                    <el-button size="small" text type="primary" @click="openDialog('update',scope.row)">重新上报</el-button>
+                    <el-button style="color: red" size="small" text type="primary" @click="onRowDel(scope.row)">删除</el-button>
+                  </template>
+              </el-table-column>
+            </el-table>
+            <div class="pageBtn">
+              <el-pagination @size-change="onHandleSizeChange" small="false" @current-change="onHandleCurrentChange" class="page-position" :pager-count="5" :page-sizes="[10, 20, 30]" v-model:current-page="listQuery.pageIndex" background v-model:page-size="listQuery.pageSize" layout="total, sizes, prev, pager, next, jumper" :total="total"> </el-pagination>
+            </div>
+            </div>
+          </div>
+        </div>
+        <add-report ref="reportRef" @refresh="getData"></add-report>
+    </div>
+</template>
+
+<script lang="ts">
+import { toRefs, reactive, onMounted, ref, defineComponent } from 'vue'
+import { ElMessageBox, ElMessage } from 'element-plus'
+import { Plus } from '@element-plus/icons-vue'
+import addReport from "./components/addReport.vue"
+import {contractorApi} from "/@/api/dataUpload/contractorManage";
+import Cookies from "js-cookie";
+import axios from "axios";
+import {judgeReportApi} from "/@/api/dataUpload/saftyBaseInfo/judgeReport";
+interface TableDataState {
+  reportData: []
+  craftList: []
+  listQuery: {
+    pageIndex: number
+    pageSize: number
+  }
+  total: null | number
+  userTypeList: Array<any>
+}
+
+export default defineComponent({
+    name: 'productionAbility',
+    components: {addReport },
+    setup() {
+      const reportRef= ref();
+      const state = reactive<TableDataState>({
+        reportData: [],
+        craftList: [],
+        listQuery: {
+          pageIndex: 1,
+          pageSize: 10
+        },
+        total: null,
+        userTypeList: [
+          {
+            name: '主要负责人',
+            value: 1
+          },
+          {
+            name: '安全管理人员',
+            value: 2
+          },
+          {
+            name: '特殊作业人员',
+            value: 3
+          }
+        ]
+      });
+
+      // 页面加载时
+      onMounted(async() => {
+        await getData()
+        await getCraftList()
+      })
+
+      const getData = async ()=>{
+        const res = await judgeReportApi().getCapacityList(state.listQuery)
+        if(res.data.code == 200){
+          state.reportData = res.data.data
+          state.total = res.data.total
+        }else{
+          ElMessage({
+            type: 'warning',
+            message: res.data.msg
+          })
+        }
+      }
+
+      const getCraftList = async ()=>{
+        const res = await judgeReportApi().getProductList({searchParams: {}, pageIndex: 1, pageSize: 999})
+        if(res.data.code == 200){
+          state.craftList = res.data.data
+        }else{
+          ElMessage({
+            type: 'warning',
+            message: res.data.msg
+          })
+        }
+      }
+
+      const openDialog=(type:string,data:object)=>{
+        reportRef.value.open(type,data,state.craftList)
+      }
+
+      // 删除用户
+      const onRowDel = (row: Object) => {
+          ElMessageBox.confirm(`此操作将永久删除该记录,是否继续?`, '提示', {
+              confirmButtonText: '确认',
+              cancelButtonText: '取消',
+              type: 'warning'
+          })
+              .then(async () => {
+                const res = await judgeReportApi().delCapacity({ids: [row.id]})
+                if(res.data.code == 200){
+                  ElMessage({
+                    type: 'success',
+                    message: '删除成功'
+                  })
+                  await getData()
+                }else{
+                  ElMessage({
+                    type: 'warning',
+                    message: res.data.msg
+                  })
+                }
+              })
+              .catch(() => {});
+      };
+      // 分页改变
+      const onHandleSizeChange = (val: number) => {
+          state.listQuery.pageSize = val;
+          getData()
+      };
+      // 分页改变
+      const onHandleCurrentChange = (val: number) => {
+          state.listQuery.pageIndex = val;
+          getData()
+      };
+
+      const viewPdf=(item: Object)=>{
+        console.log(item.filePath,555)
+        window.open(item.filePath)
+      }
+
+      return {
+        reportRef,
+        openDialog,
+        getData,
+        viewPdf,
+        onRowDel,
+        onHandleSizeChange,
+        onHandleCurrentChange,
+        ...toRefs(state)
+      };
+    }
+});
+</script>
+<style lang="scss" scoped>
+.home-container {
+  height: calc(100vh - 144px);
+  box-sizing: border-box;
+  overflow: hidden;
+  .demo-tabs {
+    width: 100%;
+    height: 100%;
+
+    &::v-deep(.el-tabs__content) {
+      height: calc(100% - 60px);
+    }
+
+    .el-tab-pane {
+      height: 100%;
+    }
+  }
+  .homeCard {
+    width: 100%;
+    padding: 20px;
+    box-sizing: border-box;
+    background: #fff;
+    border-radius: 4px;
+
+    .main-card {
+      width: 100%;
+      height: 100%;
+      .cardTop {
+        display: flex;
+        align-items: center;
+        justify-content: space-between;
+        margin-bottom: 20px;
+        .mainCardBtn {
+          margin: 0;
+        }
+      }
+      .pageBtn {
+        height: 60px;
+        display: flex;
+        align-items: center;
+        justify-content: right;
+
+        .demo-pagination-block + .demo-pagination-block {
+          margin-top: 10px;
+        }
+        .demo-pagination-block .demonstration {
+          margin-bottom: 16px;
+        }
+      }
+    }
+    &:last-of-type {
+      height: calc(100% - 100px);
+    }
+  }
+  .el-row {
+    display: flex;
+    align-items: center;
+    margin-bottom: 20px;
+    &:last-child {
+      margin-bottom: 0;
+    }
+    .grid-content {
+      align-items: center;
+      min-height: 36px;
+    }
+
+    .topInfo {
+      display: flex;
+      align-items: center;
+      font-size: 16px;
+      font-weight: bold;
+
+      & > div {
+        white-space: nowrap;
+        margin-right: 20px;
+      }
+    }
+  }
+  .el-card {
+    border: 0;
+  }
+}
+</style>
diff --git a/src/views/dataUpload/saftyBaseInfo/saftyFiles/components/addReport.vue b/src/views/dataUpload/saftyBaseInfo/saftyFiles/components/addReport.vue
new file mode 100644
index 0000000..44be539
--- /dev/null
+++ b/src/views/dataUpload/saftyBaseInfo/saftyFiles/components/addReport.vue
@@ -0,0 +1,236 @@
+<template>
+  <div class="system-add-user-container">
+    <el-dialog :title="title" v-model="isShowDialog" width="50%">
+      <el-form :model="form" size="default" ref="formRef" :rules="rules" label-width="150px">
+        <el-row :gutter="35">
+          <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
+            <el-form-item label="文件名称" prop="fileName">
+              <el-input v-model.trim="form.fileName" placeholder="文件名称" clearable></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
+            <el-form-item label="文件类型" prop="fileType">
+              <el-select v-model="form.fileType" style="width: 100%">
+                <el-option
+                    v-for="item in typeList"
+                    :key="item.value"
+                    :label="item.label"
+                    :value="item.value"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
+            <el-form-item label="附件" prop="filePath">
+              <el-upload accept=".pdf" :action="uploadUrl" :headers="header" method="post" :on-exceed="showTip" :on-success="handleAvatarSuccess" :limit='1' v-model:file-list="fileList" :before-upload="picSize" :on-remove="handleRemove" :before-remove="beforeRemove">
+                <el-button type="primary">点击上传</el-button>
+                <template #tip>
+                  <div class="el-upload__tip">仅支持上传pdf文件,尺寸小于5M,最多可上传1张</div>
+                </template>
+              </el-upload>
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20" v-if="title == '新增上报'? false : true">
+            <el-form-item label="删除状态" prop="deleted">
+              <el-radio-group v-model="form.deleted">
+                <el-radio :label="0">未删除</el-radio>
+                <el-radio :label="1">已删除</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <template #footer>
+        <span class="dialog-footer">
+            <el-button @click="isShowDialog = !isShowDialog" size="default">取 消</el-button>
+            <el-button type="primary" v-throttle @click="onSubmit" size="default">确 定</el-button>
+        </span>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script lang="ts">
+import { reactive, toRefs, onMounted, defineComponent, ref } from 'vue';
+import { ElMessageBox, ElMessage } from 'element-plus';
+import axios from "axios";
+import {workApplyApi} from "/@/api/specialWorkSystem/workApply";
+import {userApi} from '/@/api/systemManage/user'
+import Cookies from "js-cookie";
+import {judgeReportApi} from "/@/api/dataUpload/saftyBaseInfo/judgeReport";
+
+// 定义接口来定义对象的类型
+interface DataState {
+  title: string;
+  isShowDialog: boolean;
+  form: {
+    uuid: string
+    fileName: string
+    filePath: string
+    deleted: number | null
+    fileType: number | null
+  }
+  rules:{},
+  fileList: [],
+  typeList: Array<any>
+  uploadUrl: string,
+  header: {}
+}
+
+export default defineComponent({
+  name: 'reportDialog',
+  setup(props, context) {
+    const formRef = ref()
+    const checkFile = (rule: any, value: any, callback: any) => {
+      if(state.fileList.length == 0){
+        callback(new Error("请上传文件"))
+      } else {
+        callback();
+      }
+    }
+    const state = reactive<DataState>({
+      title: '',
+      isShowDialog: false,
+      form: {
+        uuid: '',
+        fileName: '',
+        filePath: '',
+        deleted: 0,
+        fileType: null
+      },
+      rules:{
+        fileName: [{ required: true, message: '请填写文件名称', trigger: 'blur'}],
+        fileType: [{ required: true, message: '请选择文件类型', trigger: 'blur'}],
+        filePath: [{ required: true, validator: checkFile, trigger: 'blur'}],
+      },
+      fileList: [],
+      typeList: [],
+      uploadUrl: import.meta.env.VITE_API_URL + '/account/file/upload',
+      header: {
+        uid: Cookies.get('uid'),
+        Authorization: Cookies.get('token')
+      }
+    })
+
+    // 页面加载时
+    onMounted(() => {
+
+    })
+    // 打开弹窗
+    const open = (type: string, data: object,typeList: Array<any>) => {
+      state.isShowDialog = true;
+      state.typeList = typeList
+      if (type === 'add') {
+        state.title = '新增上报';
+        state.form = {
+          uuid: '',
+          fileName: '',
+          filePath: '',
+          deleted: 0,
+          fileType: null
+        }
+        state.fileList = []
+      }else{
+        state.title = '重新上报';
+        Object.keys(state.form).forEach(key => {
+          if (Object.prototype.hasOwnProperty.call(data,key)) {
+            state.form[key] = JSON.parse(JSON.stringify(data))[key];
+          }
+        })
+        if(data.filePath !== ''){
+          state.fileList = state.form.filePath.split(',').map((i,index) => {
+            return {
+              url:  i,
+              name: '文件' + (index+1)
+            }
+          })
+        }else{
+          state.fileList = []
+        }
+        // state.form = {
+        //   type: 1,
+        //   uuid: data.uuid,
+        //   fileName: '',
+        //   remarks: '',
+        //   evaluateTime: '',
+        //   files: '',
+        //   deleted: '0'
+        // }
+      }
+    };
+
+    // 图片上传
+    const showTip =()=>{
+      ElMessage({
+        type: 'warning',
+        message: '超出文件上传数量'
+      });
+    }
+
+    const picSize = async(rawFile: any) => {
+      if(rawFile.size / 1024 / 1024 > 5){
+        ElMessage({
+          type: 'warning',
+          message: '文件大小不能超过5M'
+        });
+        return false
+      }
+    }
+
+    const handleAvatarSuccess = (res:any, uploadFile: any) => {
+      if(res){
+          uploadFile.name = res
+          state.form.filePath = res
+      }else{
+        ElMessage({
+          type: 'warning',
+          message: '文件上传失败'
+        })
+      }
+    }
+
+    const handleRemove = (file, uploadFiles,type) => {
+      state.form.filePath = ''
+    }
+
+    // 新增修改
+    const onSubmit = async () => {
+      formRef.value.validate(async (valid:Boolean) => {
+        if(valid){
+            const res = await judgeReportApi().addSafeFile([state.form])
+            if(res.data.code == '200'){
+              ElMessage({
+                type:'success',
+                message:'数据上报成功'
+              })
+              state.isShowDialog = false
+              state.fileList = []
+            }else{
+              ElMessage({
+                type:'warning',
+                message:res.data.msg
+              })
+            }
+            context.emit('refresh');
+        }else{
+          ElMessage({
+            type:'warning',
+            message:'请完善基本信息'
+          })
+        }
+      })
+    }
+
+    return {
+      formRef,
+      showTip,
+      picSize,
+      handleAvatarSuccess,
+      handleRemove,
+      open,
+      onSubmit,
+      ...toRefs(state)
+    };
+  }
+});
+</script>
diff --git a/src/views/dataUpload/saftyBaseInfo/saftyFiles/index.vue b/src/views/dataUpload/saftyBaseInfo/saftyFiles/index.vue
new file mode 100644
index 0000000..0fcd1ba
--- /dev/null
+++ b/src/views/dataUpload/saftyBaseInfo/saftyFiles/index.vue
@@ -0,0 +1,284 @@
+<template>
+  <div class="home-container">
+    <div style="height: 100%">
+      <div class="homeCard">
+        <div class="main-card">
+          <el-row class="cardTop">
+            <el-col :span="12" class="mainCardBtn">
+              <el-button type="primary" icon="Plus" size="default" @click="openDialog('add',{})">新增</el-button>
+            </el-col>
+          </el-row>
+          <el-table :data="reportData" style="width: 100%" height="calc(100% - 48px)"
+                    :header-cell-style="{ background: '#fafafa' }">
+            <el-table-column prop="id" label="id" show-overflow-tooltip></el-table-column>
+            <el-table-column prop="fileName" label="文件名称" show-overflow-tooltip></el-table-column>
+            <el-table-column prop="fileType" label="文件类型" show-overflow-tooltip>
+              <template #default="scope">
+                {{ typeList.find(i => i.value == scope.row.fileType)?.label }}
+              </template>
+            </el-table-column>
+            <el-table-column prop="updateUser" label="修改人" show-overflow-tooltip></el-table-column>
+            <el-table-column prop="uploadDate" label="上传时间" show-overflow-tooltip></el-table-column>
+            <el-table-column label="操作" width="140">
+              <template #default="scope">
+                <el-button size="small" text type="primary" @click="openDialog('update',scope.row)">重新上报</el-button>
+                <el-button size="small" v-if="scope.row.filePath !== ''" text type="primary" @click="openFile(scope.row.filePath)">查看</el-button>
+                <el-button style="color: red" size="small" text type="primary" @click="onRowDel(scope.row)">删除</el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+          <div class="pageBtn">
+            <el-pagination @size-change="onHandleSizeChange" small="false" @current-change="onHandleCurrentChange"
+                           class="page-position" :pager-count="5" :page-sizes="[10, 20, 30]"
+                           v-model:current-page="listQuery.pageIndex" background v-model:page-size="listQuery.pageSize"
+                           layout="total, sizes, prev, pager, next, jumper" :total="total"></el-pagination>
+          </div>
+        </div>
+      </div>
+    </div>
+    <add-report ref="reportRef" @refresh="getData"></add-report>
+  </div>
+</template>
+
+<script lang="ts">
+import {toRefs, reactive, onMounted, ref, defineComponent} from 'vue'
+import {ElMessageBox, ElMessage} from 'element-plus'
+import {Plus} from '@element-plus/icons-vue'
+import addReport from "./components/addReport.vue"
+import {judgeReportApi} from "/@/api/dataUpload/saftyBaseInfo/judgeReport";
+import axios from "axios";
+import Cookies from "js-cookie";
+
+// 定义接口来定义对象的类型
+interface TableDataRow {
+  id: number | null
+  fileType: number | null
+  fileName: string
+  updateUser: string
+  uploadDate: string
+  filePath: string
+}
+
+interface TableDataState {
+  reportData: [],
+  listQuery: {
+    searchParams: {}
+    pageIndex: number
+    pageSize: number
+  }
+  total: null | number
+  typeList: Array<object>
+}
+
+export default defineComponent({
+  name: 'saftyFile',
+  components: {addReport},
+  setup() {
+    const reportRef = ref();
+    const state = reactive<TableDataState>({
+      reportData: [],
+      listQuery: {
+        searchParams: {},
+        pageIndex: 1,
+        pageSize: 10
+      },
+      total: null,
+      typeList: [
+        {
+          value: 1,
+          label: '安全管理制度'
+        },
+        {
+          value: 2,
+          label: '安全操作规程',
+        },
+        {
+          value: 3,
+          label: '全员安全生产责任制'
+        }
+      ]
+    });
+
+    // 页面加载时
+    onMounted(() => {
+      getData()
+    });
+
+    const getData = async () => {
+      const res = await judgeReportApi().getSafeFileList(state.listQuery)
+      if (res.data.code == 200) {
+        state.reportData = res.data.data
+        state.total = res.data.total
+      } else {
+        ElMessage({
+          type: 'warning',
+          message: res.data.msg
+        })
+      }
+    }
+
+    const openDialog = (type: string, data: object) => {
+      reportRef.value.open(type, data, state.typeList)
+    }
+
+    const openFile = (file: string) => {
+      // axios.get(file,{headers:{'Content-Type': 'application/json','Authorization': `${Cookies.get('token')}`,'uid':`${Cookies.get('uid')}`},responseType: 'blob'}).then(res=>{
+      //   if (res) {
+      //     const link = document.createElement('a')
+      //     let blob = new Blob([res.data],{type: 'application/pdf'})
+      //     link.style.display = "none";
+      //     link.href = URL.createObjectURL(blob); // 创建URL
+      //     window.open(link.href)
+      //   } else {
+      //     ElMessage({
+      //       type: 'warning',
+      //       message: '文件读取失败'
+      //     });
+      //   }
+      // })
+      window.open(file)
+    }
+
+    // 删除用户
+    const onRowDel = (row: TableDataRow) => {
+      ElMessageBox.confirm(`此操作将永久删除文件名称:“${row.fileName}”,是否继续?`, '提示', {
+        confirmButtonText: '确认',
+        cancelButtonText: '取消',
+        type: 'warning'
+      })
+          .then(async () => {
+            const res = await judgeReportApi().delSafeFile({ids: [row.id]})
+            if (res.data.code == '200') {
+              ElMessage({
+                type: 'success',
+                message: '删除成功'
+              })
+              await getData()
+            } else {
+              ElMessage({
+                type: 'warning',
+                message: res.data.msg
+              })
+            }
+          })
+          .catch(() => {
+          });
+    };
+    // 分页改变
+    const onHandleSizeChange = (val: number) => {
+      state.listQuery.pageSize = val;
+      getData()
+    };
+    // 分页改变
+    const onHandleCurrentChange = (val: number) => {
+      state.listQuery.pageIndex = val;
+      getData()
+    };
+
+    return {
+      reportRef,
+      openFile,
+      openDialog,
+      getData,
+      onRowDel,
+      onHandleSizeChange,
+      onHandleCurrentChange,
+      ...toRefs(state)
+    };
+  }
+});
+</script>
+<style lang="scss" scoped>
+.home-container {
+  height: calc(100vh - 144px);
+  box-sizing: border-box;
+  overflow: hidden;
+
+  .demo-tabs {
+    width: 100%;
+    height: 100%;
+
+    &::v-deep(.el-tabs__content) {
+      height: calc(100% - 60px);
+    }
+
+    .el-tab-pane {
+      height: 100%;
+    }
+  }
+
+  .homeCard {
+    width: 100%;
+    padding: 20px;
+    box-sizing: border-box;
+    background: #fff;
+    border-radius: 4px;
+
+    .main-card {
+      width: 100%;
+      height: 100%;
+
+      .cardTop {
+        display: flex;
+        align-items: center;
+        justify-content: space-between;
+        margin-bottom: 20px;
+
+        .mainCardBtn {
+          margin: 0;
+        }
+      }
+
+      .pageBtn {
+        height: 60px;
+        display: flex;
+        align-items: center;
+        justify-content: right;
+
+        .demo-pagination-block + .demo-pagination-block {
+          margin-top: 10px;
+        }
+
+        .demo-pagination-block .demonstration {
+          margin-bottom: 16px;
+        }
+      }
+    }
+
+    &:last-of-type {
+      height: calc(100% - 100px);
+    }
+  }
+
+  .el-row {
+    display: flex;
+    align-items: center;
+    margin-bottom: 20px;
+
+    &:last-child {
+      margin-bottom: 0;
+    }
+
+    .grid-content {
+      align-items: center;
+      min-height: 36px;
+    }
+
+    .topInfo {
+      display: flex;
+      align-items: center;
+      font-size: 16px;
+      font-weight: bold;
+
+      & > div {
+        white-space: nowrap;
+        margin-right: 20px;
+      }
+    }
+  }
+
+  .el-card {
+    border: 0;
+  }
+}
+</style>

--
Gitblit v1.9.2