From 9083fd270cd172f998eb2dd3dfae59187a70cb1a Mon Sep 17 00:00:00 2001
From: quanyawei <401863037@qq.com>
Date: Sat, 07 Oct 2023 09:31:11 +0800
Subject: [PATCH] Merge branch 'feature_1.0'

---
 src/views/toCarryOutLegislativeReforms/components/queryForm.vue                                  |  169 +++
 package-lock.json                                                                                |    4 
 src/assets/images/3.jpg                                                                          |    0 
 src/utils/dic.js                                                                                 |   33 
 src/views/login/index.vue                                                                        |    3 
 src/router/dynamicRouter.js                                                                      |   26 
 src/views/toCarryOutLegislativeReforms/reform/index.vue                                          |  502 +++++++++
 src/views/toCarryOutLegislativeReforms/components/newWorkOrder.vue                               |  393 +++++++
 src/views/personnel/index.vue                                                                    |   50 
 src/views/toCarryOutLegislativeReforms/components/workOrderInformation.vue                       |  575 ++++++++++
 src/views/toCarryOutLegislativeReforms/summaryPage/index.vue                                     |  417 +++++++
 src/views/toCarryOutLegislativeReforms/summaryPage/components/pollutionClassificationEcharts.vue |  151 ++
 src/components/UploadExcel/index.vue                                                             |  253 ++++
 src/assets/images/1.jpg                                                                          |    0 
 src/views/toCarryOutLegislativeReforms/summaryPage/components/reportTypeEcharts.vue              |  154 ++
 package.json                                                                                     |    1 
 src/views/toCarryOutLegislativeReforms/delay/index.vue                                           |  324 ++++++
 src/views/toCarryOutLegislativeReforms/delay/componets/queryForm.vue                             |  147 ++
 src/assets/images/4.png                                                                          |    0 
 src/assets/images/2.png                                                                          |    0 
 20 files changed, 3,195 insertions(+), 7 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 49e55c3..a62ed5f 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -9931,8 +9931,8 @@
     },
     "lodash": {
       "version": "4.17.21",
-      "resolved": "https://registry.npm.taobao.org/lodash/download/lodash-4.17.21.tgz?cache=0&sync_timestamp=1613835860585&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flodash%2Fdownload%2Flodash-4.17.21.tgz",
-      "integrity": "sha1-Z5WRxWTDv/quhFTPCz3zcMPWkRw="
+      "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz",
+      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
     },
     "lodash.debounce": {
       "version": "4.0.8",
diff --git a/package.json b/package.json
index 0039fd1..2d6487c 100644
--- a/package.json
+++ b/package.json
@@ -35,6 +35,7 @@
     "leaflet-velocity": "^1.7.0",
     "less": "^4.1.1",
     "less-loader": "^6.2.0",
+    "lodash": "^4.17.21",
     "moment": "^2.29.4",
     "node-sass": "^4.14.1",
     "normalize.css": "7.0.0",
diff --git a/src/assets/images/1.jpg b/src/assets/images/1.jpg
new file mode 100644
index 0000000..44ecbf5
--- /dev/null
+++ b/src/assets/images/1.jpg
Binary files differ
diff --git a/src/assets/images/2.png b/src/assets/images/2.png
new file mode 100644
index 0000000..cae32e5
--- /dev/null
+++ b/src/assets/images/2.png
Binary files differ
diff --git a/src/assets/images/3.jpg b/src/assets/images/3.jpg
new file mode 100644
index 0000000..c97f4b2
--- /dev/null
+++ b/src/assets/images/3.jpg
Binary files differ
diff --git a/src/assets/images/4.png b/src/assets/images/4.png
new file mode 100644
index 0000000..9a72bef
--- /dev/null
+++ b/src/assets/images/4.png
Binary files differ
diff --git a/src/components/UploadExcel/index.vue b/src/components/UploadExcel/index.vue
new file mode 100644
index 0000000..ff357cd
--- /dev/null
+++ b/src/components/UploadExcel/index.vue
@@ -0,0 +1,253 @@
+<template>
+  <div>
+    <el-upload
+      :limit="limit"
+      :action="uploadUrl"
+      accept="image/*,video/*"
+      :data="{sysCode}"
+      :file-list="UrlList"
+      :headers="{ token: token }"
+      list-type="picture-card"
+      :before-upload="before_upload"
+      :on-change="handleImgChange"
+      :on-success="handleUploadSuccess"
+    >
+      <i slot="default" class="el-icon-plus" />
+      <div slot="file" slot-scope="{ file }">
+        <img
+          v-if="file.type == 1"
+          class="el-upload-list__item-thumbnail"
+          :src="file.url"
+          alt=""
+        >
+        <video v-if="file.type == 2" :src="file.url" style="width: 100%">
+          ������������������������ video ���������
+        </video>
+        <audio
+          v-if="file.type == 3"
+          controls
+          :src="file.url"
+          style="width: 100%"
+        >
+          ������������������������������������������
+        </audio>
+        <span class="el-upload-list__item-actions">
+          <span
+            class="el-upload-list__item-preview"
+            @click="handlePictureCardPreview(file)"
+          >
+            <i class="el-icon-zoom-in" />
+          </span>
+          <span
+            v-if="!disabled"
+            class="el-upload-list__item-delete"
+            @click="handleImgRemove(file)"
+          >
+            <i class="el-icon-delete" />
+          </span>
+        </span>
+      </div>
+    </el-upload>
+    <el-dialog :visible.sync="dialogVisible" width="600px" append-to-body :modal-append-to-body="false" :destroy-on-close="true" @close="handleCancel">
+      <div style="text-align: center;">
+        <img
+          v-if="dialogType == 1"
+          class="el-upload-list__item-thumbnail"
+          style="width: 300px;height: 500px"
+          :src="dialogImageUrl"
+          alt=""
+        >
+        <video
+          v-if="dialogType == 2"
+          ref="video"
+          style="width: 300px;height: 500px"
+          :src="dialogImageUrl"
+          controls
+          autoplay
+        />
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { getToken } from '@/utils/auth'
+import bus from '@/Bus'
+export default {
+  name: 'UploadExcel',
+  props: {
+    uploadUrl: {
+      type: String,
+      required: true
+    },
+    sysCode: {
+      type: String,
+      required: true
+    }
+  },
+  data() {
+    return {
+      token: getToken(),
+      limit: 9, // ������������������
+      dialogImageUrl: null,
+      dialogVisible: false,
+      UrlList: [],
+      disabled: false,
+      dialogType: null,
+      fileBaseList: [],
+      fileChangeList: []
+    }
+  },
+
+  methods: {
+    handleCancel(e) {
+      this.dialogVisible = false
+
+      setTimeout(() => {
+        if (this.$refs.video) {
+          this.$refs.video.pause()
+        }
+
+        this.dialogImageUrl = ''
+      }, 200)
+    },
+    // ���������
+    before_upload(file) {
+      const fileSize = file.size
+      const FIVE_M = 100 * 1024 * 1024
+      // ���������������������2M
+      if (fileSize > FIVE_M) {
+        this.$message.error('������������1002M')
+        return false
+      }
+      const name = file.name.substring(file.name.lastIndexOf('.') + 1)
+      const nameList = ['png', 'jpg', 'jpeg', 'bmp', 'gif', 'jpe', 'mp4', 'm2v', 'mkv']
+      if (!nameList.includes(name)) {
+        this.$message.error('������������������������������')
+        return false
+      }
+      return true
+    },
+
+    handlePictureCardPreview(file) {
+      console.log('file', file)
+      // const baseUrl = `${requestObj.baseUrl}/static/img/`
+      this.dialogImageUrl = file.url
+      console.log('this.dialogImageUrl', file)
+      this.dialogType = file.type
+      this.dialogVisible = true
+    },
+    // ������������
+    handleImgChange(file, fileList) {
+      bus.$emit('changeFileAfterList', 'change', fileList)
+
+      this.UrlList = fileList
+    },
+    // ������������
+    handleImgRemove(file, fileList) {
+      fileList = this.UrlList
+      const index = fileList.indexOf(file)
+      fileList.splice(index, 1)
+      bus.$emit('changeFileAfterList', 'detail', fileList)
+    },
+    // ������������������
+    handleUploadSuccess(response, file, fileList) {
+      console.log(file)
+      this.UrlList.push({
+        url: file.url
+      })
+      bus.$emit('changeFileAfterList', 'success', fileList)
+      file.type = this.matchType(file.response.data.fileName)
+    },
+
+    // ��������������������������� ������������
+    /*
+     * @param: fileName - ������������
+     * @param: ������������ 1) ��������������� - false
+     * @param: ������������ 2) ������������ - image
+     * @param: ������������ 8) ������ ������ - video
+     * @param: ������������ 9) ������ ������ - radio
+     * @param: ������������ 10) ��������������� - other
+     */
+    matchType(fileName) {
+      // ������������
+      var suffix = ''
+      // ������������������
+      var result = ''
+      try {
+        var flieArr = fileName.split('.')
+        suffix = flieArr[flieArr.length - 1]
+      } catch (err) {
+        suffix = ''
+      }
+      // fileName��������������� false
+      if (!suffix) {
+        result = false
+        return result
+      }
+      // ������������
+      var imglist = ['png', 'jpg', 'jpeg', 'bmp', 'gif', 'jpe']
+      // ������������������
+      result = imglist.some(function(item) {
+        return item === suffix
+      })
+      if (result) {
+        result = '1'
+        return result
+      }
+      // ������ ������
+      var videolist = ['mp4', 'm2v', 'mkv']
+      result = videolist.some(function(item) {
+        return item === suffix
+      })
+      if (result) {
+        result = '2'
+        return result
+      }
+      // ������ ������
+      var radiolist = ['mp3', 'wav', 'wmv', 'flac']
+      result = radiolist.some(function(item) {
+        return item === suffix
+      })
+      if (result) {
+        result = '3'
+        return result
+      }
+      // ������ ������������
+      result = 'other'
+      return result
+    }
+
+  }
+}
+</script>
+<style lang="scss" scope>
+.avatar-uploader .el-upload {
+  border: 1px dashed #d9d9d9;
+  border-radius: 6px;
+  cursor: pointer;
+  position: relative;
+  overflow: hidden;
+}
+.avatar-uploader .el-upload:hover {
+  border-color: #409eff;
+}
+.avatar-uploader-icon {
+  font-size: 28px;
+  color: #8c939d;
+  width: 148px;
+  height: 148px;
+  line-height: 148px;
+  text-align: center;
+}
+.avatar {
+  width: 148px;
+  max-height: 148px;
+  display: block;
+}
+.avatar-video {
+  width: 200px;
+  max-height: 200px;
+  display: block;
+}
+</style>
diff --git a/src/router/dynamicRouter.js b/src/router/dynamicRouter.js
index 1246779..5358aeb 100644
--- a/src/router/dynamicRouter.js
+++ b/src/router/dynamicRouter.js
@@ -196,7 +196,25 @@
   component: () => import('@/views/dailyreport/index'),
   meta: { title: '������������������', icon: 'example' }
 }
-
+// ������������
+const summaryPage = {
+  path: 'toCarryOutLegislativeReforms/summaryPage',
+  name: 'summaryPage',
+  component: () => import('@/views/toCarryOutLegislativeReforms/summaryPage/index'),
+  meta: { title: '������������', icon: 'example' }
+}
+const reform = {
+  path: 'toCarryOutLegislativeReforms/reform',
+  name: 'reform',
+  component: () => import('@/views/toCarryOutLegislativeReforms/reform/index'),
+  meta: { title: '������������', icon: 'example' }
+}
+const delay = {
+  path: 'toCarryOutLegislativeReforms/delay',
+  name: 'delay',
+  component: () => import('@/views/toCarryOutLegislativeReforms/delay/index'),
+  meta: { title: '������������', icon: 'example' }
+}
 
 // ���������������������������
 const ruleMapping = {
@@ -226,6 +244,9 @@
   dailyreport,
   sectionReport,
   Listdata,
+  summaryPage,
+  reform,
+  delay
   // Equidata
 }
 
@@ -242,6 +263,7 @@
 export function routerMenus() {
   const routersMenu = JSON.parse(store.state.user.menus)
   // ��������������������������������� ���������������������������
+  console.log('routersMenu',routersMenu)
   const currentRoutes = router.options.routes
   if (routersMenu.length > 0) {
     routersMenu.forEach(item => {
@@ -263,7 +285,7 @@
           if (temp !== undefined) {
             currentRoutes[currentRoutes.length - 1].children.push(temp)
           } else {
-            console.log('������������������������������������������������������������')
+            console.log('������������������������������������������������������������1')
           }
         })
       } else {
diff --git a/src/utils/dic.js b/src/utils/dic.js
new file mode 100644
index 0000000..da381ed
--- /dev/null
+++ b/src/utils/dic.js
@@ -0,0 +1,33 @@
+// ���������������������axios
+import requestObj from '@/utils/request'
+const request = requestObj.service
+export function getDict() {
+  request({
+    url: '/dict/list',
+    method: 'get'
+  })
+    .then((result) => {
+      // console.log('������', result)
+      console.log('������', objToArr(result.data))
+      localStorage.setItem('dict', JSON.stringify(result.data))
+      localStorage.setItem('dictObj', JSON.stringify(objToArr(result.data)))
+    })
+    .catch((err) => {
+      console.log('err', err)
+    })
+}
+// ���������������obj
+export function arrToObj(arr) {
+  return arr.reduce((obj, item) => {
+    obj[item.value] = item.name
+    return obj
+  }, {})
+}
+export function objToArr(obj) {
+  const objde = {}
+
+  for (const key in obj) {
+    objde[key] = arrToObj(obj[key])
+  }
+  return objde
+}
diff --git a/src/views/login/index.vue b/src/views/login/index.vue
index ea9242d..e9b6b3a 100644
--- a/src/views/login/index.vue
+++ b/src/views/login/index.vue
@@ -74,7 +74,7 @@
 import { getMenus } from '@/router/dynamicRouter.js'
 // import store from '@/store'
 import { getToken, removeToken } from '@/utils/auth'
-
+import { getDict } from '@/utils/dic.js'
 export default {
   name: 'Login',
   data() {
@@ -142,6 +142,7 @@
             .then((res) => {
               new Promise((resolve, reject) => {
                 getMenus()
+                getDict()
                 resolve()
               }).then(() => {
                 setTimeout(() => {
diff --git a/src/views/personnel/index.vue b/src/views/personnel/index.vue
index bb5aa50..8164ed6 100644
--- a/src/views/personnel/index.vue
+++ b/src/views/personnel/index.vue
@@ -13,7 +13,11 @@
             border
             style="width: 100%"
             :stripe="true"
-          >
+          ><el-table-column
+             prop="unitId"
+             label="������������"
+             :formatter="unitIdFormatter"
+           />
             <el-table-column
               prop="account"
               label="������������"
@@ -80,6 +84,16 @@
         <el-form-item label="������������" :label-width="formLabelWidth" prop="userName">
           <el-input v-model="form.userName" autocomplete="off" />
         </el-form-item>
+        <el-form-item label="������������" :label-width="formLabelWidth">
+          <el-select v-model="form.unitId" placeholder="���������" size="small" style="width: 100%;">
+            <el-option
+              v-for="item in unitList"
+              :key="item.unitId"
+              :label="item.unitName"
+              :value="item.unitId"
+            />
+          </el-select>
+        </el-form-item>
         <el-form-item label="������" :label-width="formLabelWidth" prop="mobile">
           <el-input v-model="form.mobile" autocomplete="off" />
         </el-form-item>
@@ -114,6 +128,16 @@
         </el-form-item>
         <el-form-item label="������������" :label-width="formLabelWidth" prop="userName">
           <el-input v-model="formEdit.userName" autocomplete="off" />
+        </el-form-item>
+        <el-form-item label="������������" :label-width="formLabelWidth">
+          <el-select v-model="formEdit.unitId" placeholder="���������" size="small" style="width: 100%;">
+            <el-option
+              v-for="item in unitList"
+              :key="item.unitId"
+              :label="item.unitName"
+              :value="item.unitId"
+            />
+          </el-select>
         </el-form-item>
         <el-form-item label="������" :label-width="formLabelWidth" prop="mobile">
           <el-input v-model="formEdit.mobile" autocomplete="off" />
@@ -190,6 +214,7 @@
     // ������������������
     return {
       options: [],
+      unitList: [],
       radio1: '',
       value: '',
       value1: '',
@@ -202,6 +227,7 @@
       dialogEdit: false,
       dialogRole: false,
       form: {
+        unitId: '',
         account: '',
         password: '',
         userName: '',
@@ -212,6 +238,7 @@
       },
       formEdit: {
         id: 0,
+        unitId: '',
         account: '',
         password: '',
         userName: '',
@@ -260,6 +287,7 @@
   },
   // ������������ - ��������������������������������� this ���������
   created() {
+    this.getUnitList()
     this.personnelList()
     this.roleList()
   },
@@ -282,6 +310,7 @@
       this.form.account = ''
       this.form.password = ''
       this.form.userName = ''
+      this.form.unitId = ''
       this.form.mobile = ''
       this.form.email = ''
       this.form.wechat = ''
@@ -314,6 +343,19 @@
         })
       })
     },
+    unitIdFormatter(val) {
+      const data = this.unitList.find(item => item && item.unitId === val.unitId)
+      return data ? data.unitName : ''
+    },
+    // ������������������list
+    getUnitList() {
+      this.$request({
+        url: '/allocation/unit',
+        method: 'get'
+      }).then((res) => {
+        this.unitList = res.data
+      })
+    },
     // ������������������
     personnelAdd() {
       if (this.form.account && this.form.password && this.form.userName) {
@@ -324,6 +366,7 @@
             account: this.form.account,
             password: this.$encrypt(this.form.password),
             userName: this.form.userName,
+            unitId: Number(this.form.unitId),
             mobile: this.form.mobile,
             email: this.form.email,
             wechat: this.form.wechat,
@@ -384,6 +427,7 @@
       this.form.id = row.id
       this.form.account = row.account
       this.form.userName = row.userName
+      this.form.unitId = row.unitId
       this.form.mobile = row.mobile
       this.form.email = row.email
       this.form.wechat = row.wechat
@@ -394,6 +438,7 @@
       this.formEdit.userName = ''
       this.formEdit.mobile = ''
       this.formEdit.email = ''
+      this.formEdit.unitId = ''
       this.formEdit.wechat = ''
       this.formEdit.expireTime = ''
       this.formEdit.password = ''
@@ -403,7 +448,7 @@
     // ������������������
     personnelEdit() {
       // return
-      if (this.formEdit.userName !== this.form.userName || this.formEdit.password !== this.form.password || this.formEdit.mobile !== this.form.mobile || this.formEdit.wechat !== this.form.wechat || this.formEdit.email !== this.form.email || this.formEdit.expireTime !== this.form.expireTime) {
+      if (this.formEdit.unitId !== this.form.unitId || this.formEdit.userName !== this.form.userName || this.formEdit.password !== this.form.password || this.formEdit.mobile !== this.form.mobile || this.formEdit.wechat !== this.form.wechat || this.formEdit.email !== this.form.email || this.formEdit.expireTime !== this.form.expireTime) {
         this.$request({
           url: '/user/update',
           method: 'post',
@@ -412,6 +457,7 @@
             password: this.formEdit.password ? this.$encrypt(this.formEdit.password) : null,
             userName: this.formEdit.userName ? this.formEdit.userName : null,
             mobile: this.formEdit.mobile ? this.formEdit.mobile : null,
+            unitId: Number(this.formEdit.unitId) ? Number(this.formEdit.unitId) : null,
             email: this.formEdit.email ? this.formEdit.email : null,
             wechat: this.formEdit.wechat ? this.formEdit.wechat : null,
             expireTime: this.formEdit.expireTime ? this.formEdit.expireTime : null
diff --git a/src/views/toCarryOutLegislativeReforms/components/newWorkOrder.vue b/src/views/toCarryOutLegislativeReforms/components/newWorkOrder.vue
new file mode 100644
index 0000000..3a5489f
--- /dev/null
+++ b/src/views/toCarryOutLegislativeReforms/components/newWorkOrder.vue
@@ -0,0 +1,393 @@
+<template>
+  <div>
+    <el-dialog :title="title" :visible.sync="visible" top="30px" width="900px" center :before-close="close">
+      <div slot="title" class="titBox">
+        <div>{{ parentFormData.allocationNum }}</div>
+        <div>{{ title }}</div>
+      </div>
+      <div>
+        <el-form ref="ruleForm" :disabled="pageState==='detail'" label-width="100px" :model="formData" class="demo-form-inline" :rules="rules">
+          <el-row>
+            <el-col :span="12">
+              <el-form-item label="���������������" prop="escalationTime" class="span">
+                <el-date-picker
+                  v-model="formData.escalationTime"
+                  value-format="yyyy-MM-dd"
+                  size="small"
+                  type="date"
+                  placeholder="������������"
+                />
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="���������������" prop="pollutePosition" class="span">
+                <el-input v-model="formData.pollutePosition" type="text" placeholder="���������" size="small" />
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row>
+            <el-col :span="12">
+              <el-form-item label="���������������" prop="unitId" class="span">
+                <el-select v-model="formData.unitId" placeholder="���������" size="small">
+                  <el-option
+                    v-for="item in unitList"
+                    :key="item.unitId"
+                    :label="item.unitName"
+                    :value="item.unitId"
+                  />
+                </el-select>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="���������������" prop="polluteType" class="span">
+                <el-select v-model="formData.polluteType" placeholder="���������" size="small">
+                  <el-option
+                    v-for="item in polluteList"
+                    :key="item.dataKey"
+                    :label="item.dataValue"
+                    :value="item.dataKey"
+                  />
+                </el-select>
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row>
+            <el-col :span="12">
+              <el-form-item label="���������������" prop="changeType" class="span">
+                <el-select v-model="formData.changeType" placeholder="���������" size="small" @change="changeEnumList">
+                  <el-option
+                    v-for="item in Dic.changeEnum"
+                    :key="item.value"
+                    :label="item.name"
+                    :value="item.value"
+                  />
+                </el-select>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="���������������" prop="changeDay" class="span">
+                <el-input-number v-model="formData.changeDay" :disabled="formData.changeType===1" :min="0" label="���������" />
+                <!-- <el-input v-model.number="formData.changeDay" :disabled="formData.changeType===1" type="text" placeholder="���������" size="small" /> -->
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row>
+            <el-col :span="12">
+              <el-form-item label="���������������" prop="escalationUnitId" class="span">
+                <el-select v-model="formData.escalationUnitId" placeholder="���������" size="small">
+                  <el-option
+                    v-for="item in unitList"
+                    :key="item.unitId"
+                    :label="item.unitName"
+                    :value="item.unitId"
+                  />
+                </el-select>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="������������" prop="escalationName" class="span">
+                <el-input v-model="formData.escalationName" type="text" placeholder="���������" size="small" />
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row>
+            <el-col :span="24">
+              <el-form-item label="���������������" prop="investigationType" class="span">
+                <el-radio-group v-model="formData.investigationType" size="small">
+                  <el-radio v-for="(item) in Dic.investigationEnum" :key="item.value" :label="item.value">{{ item.name }}</el-radio>
+                </el-radio-group>
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row>
+            <el-form-item label="���������������" prop="problemDescribe" class="span">
+              <el-input v-model="formData.problemDescribe" type="textarea" :rows="4" placeholder="���������������" />
+            </el-form-item>
+          </el-row>
+          <el-row>
+            <el-form-item label="���������">
+              <div>
+                <div v-if="pageState==='edit'">
+                  <div v-for="(file,index) in fileBaseListCover" :key="file.fileId+index" class="block">
+                    <el-image
+                      v-if="file.fileType ===1"
+                      style="width: 100px; height: 100px"
+                      :src="file.url"
+                      :preview-src-list="getPreviewImages(file.fileId,fileBaseList)"
+                      :initial-index="index"
+                    />
+                    <video v-else :src="file.url" style="width: 100px; height: 100px" @click="openVideo(file)">
+                      ������������������������ video ���������
+                    </video>
+                  </div>
+                </div>
+              </div>
+              <uploadFile v-if="pageState!=='detail'" :upload-url="uploadTermExcelUrl" :sys-code="sysCode" />
+            </el-form-item>
+          </el-row>
+        </el-form>
+      </div>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="close">������</el-button>
+        <el-button v-if="pageState!=='detail'" type="info" @click="handleSubmit('9')">������</el-button>
+        <el-button v-if="pageState!=='detail'" type="primary" @click="handleSubmit('10')">������</el-button>
+      </div>
+    </el-dialog>
+    <el-dialog :visible.sync="videoVisible" width="600px" :modal-append-to-body="false" :destroy-on-close="true" @close="handleCancel">
+      <div style="text-align: center;">
+        <video
+          ref="video"
+          style="width: 300px;height: 500px"
+          :src="dialogImageUrl"
+          controls
+          autoplay
+        />
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import uploadFile from '@/components/UploadExcel/index'
+import bus from '@/Bus'
+import requestObj from '@/utils/request'
+import _ from 'lodash'
+export default {
+  components: { uploadFile },
+  props: {
+    title: { type: String, default: '' },
+    visible: { type: Boolean, required: true },
+    pageState: { type: String, required: true, default: 'add' },
+    parentFormData: { type: Object, default: () => {} }
+  },
+  data() {
+    return {
+      videoVisible: false,
+      formData: {
+        fileBaseList: [],
+        escalationName: '',
+        changeDay: 0,
+        investigationType: 1
+      },
+      fileBaseList: [],
+      fileBaseListCover: [],
+      sysCode: '1010201', //
+      Dic: JSON.parse(localStorage.getItem('dict')),
+      unitList: [],
+      polluteList: [],
+      dialogImageUrl: '',
+      rules: {
+        escalationTime: [
+          { required: true, message: '���������������������', trigger: 'change' }
+        ],
+        pollutePosition: [
+          { required: true, message: '���������������������', trigger: 'blur' }
+        ],
+        unitId: [
+          { required: true, message: '���������������������', trigger: 'change' }
+        ],
+        polluteType: [
+          { required: true, message: '���������������������', trigger: 'change' }
+        ],
+        changeType: [
+          { required: true, message: '���������������������', trigger: 'change' }
+        ],
+        changeDay: [
+          { required: true, message: '���������������', trigger: 'blur' }
+        ],
+        escalationUnitId: [
+          { required: true, message: '���������������������', trigger: 'change' }
+        ],
+        investigationType: [
+          { required: true, message: '���������������������', trigger: 'change' }
+        ],
+        escalationName: [
+          { required: true, message: '������������������', trigger: 'blur' }
+        ],
+        problemDescribe: [
+          { required: true, message: '���������������������', trigger: 'blur' }
+        ]
+      }
+    }
+  },
+  computed: {
+    uploadTermExcelUrl() {
+      return `${requestObj.baseUrl}/file/upload`
+    }
+  },
+  watch: {
+    'pageState': {
+      handler(newVal) {
+        if (this.pageState === 'edit') {
+          if (this.parentFormData.fileBaseList && this.parentFormData.fileBaseList.length > 0) {
+            this.parentFormData.fileBaseList.forEach(item => {
+              if (item.fileType === 1) {
+                this.fileBaseList.push(`${requestObj.baseUrl}file/preview/${item.fileId}`) // ������
+              }
+              // const srcApi = item.fileType === 1 ? api + 'preview/' : api + 'preview/cover/'
+              // this.fileBaseList.push(`${requestObj.baseUrl}file/preview/${item.fileId}`) // ������
+              this.fileBaseListCover.push({
+                url: item.fileType === 1 ? `${requestObj.baseUrl}file/preview/cover/${item.fileId}` : `${requestObj.baseUrl}file/preview/${item.fileId}`,
+                fileType: item.fileType,
+                fileId: item.fileId,
+                fileName: item.fileName
+              })
+            })
+            console.log('fileBaseList', this.fileBaseList)
+          }
+        }
+      },
+      deep: true,
+      immediate: true
+    }
+  },
+  created() {
+    console.log('oldValue', this.parentFormData)
+    if (!(JSON.stringify(this.parentFormData) === '{}')) {
+      this.formData = this.parentFormData
+      this.formData.polluteType = String(this.parentFormData.polluteType)
+    } else {
+      const name = this.$store.state.user.name
+      this.formData.escalationName = name
+    }
+
+    this.getUnitList()
+    this.getContaminateList()
+    bus.$on('changeFileAfterList', (type, fileList) => {
+      this.formData.fileBaseList = []
+      if (fileList.length > 0) {
+        fileList.map((item) => {
+          if (item.response) {
+            console.log('item.response.data', item.response.data)
+            this.formData.fileBaseList.push(item.response.data)
+          }
+        })
+      }
+    })
+  },
+  methods: {
+    getPreviewImages(index, list) {
+      let startIndex = 0
+      const chechList = _.cloneDeep(list)
+      chechList.forEach((item, i) => {
+        const str = item.substring(item.lastIndexOf('/') + 1)
+        console.log('str', str)
+        if (Number(str) === Number(index)) {
+          startIndex = i
+        }
+      })
+
+      console.log('index', index)
+      console.log('startIndex', startIndex)
+      var imgList = [...list]
+      if (index === 0) return imgList
+      var start = imgList.splice(startIndex)
+      var remain = imgList.splice(0, startIndex)
+      return start.concat(remain)
+    },
+    openVideo(item) {
+      console.log('item', item)
+      this.dialogImageUrl = item.url
+      this.videoVisible = true
+    },
+    handleCancel() {
+      this.dialogImageUrl = ''
+      this.videoVisible = false
+    },
+    changeEnumList(val) {
+      if (val === 1) {
+        this.formData.changeDay = 0
+      }
+    },
+    // ������������������list
+    getUnitList() {
+      this.$request({
+        url: '/allocation/unit',
+        method: 'get'
+      }).then((res) => {
+        this.unitList = res.data
+      })
+    },
+    getContaminateList() {
+      this.$request({
+        url: '/allocation/contaminate',
+        method: 'get'
+      }).then((res) => {
+        this.polluteList = res.data
+      })
+    },
+    close() {
+      this.$nextTick(function() {
+        this.$refs.ruleForm.resetFields()
+      })
+      this.$emit('update:visible', false)
+    },
+    handleSubmit(val) {
+      console.log('this.formData', this.formData)
+      if (this.fileBaseListCover && this.fileBaseListCover.length > 0) {
+        this.fileBaseListCover.forEach(item => {
+          this.formData.fileBaseList.push({
+            fileId: item.fileId,
+            fileName: item.fileName
+          })
+        })
+      }
+      this.formData.state = val
+      this.$refs.ruleForm.validate((valid) => {
+        if (valid) {
+          // this.formData.fileBaseList = [...this.parentFormData.fileBaseList, this.formData.fileBaseList]
+          this.$emit('handleSubmit', this.formData)
+        } else {
+          return false
+        }
+      })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.titBox{
+  position: relative;
+  font-size: 18px;
+  div:first-child{
+    position: absolute;
+    left: 10px;
+  }
+  div{
+    display: inline-block;
+  }
+}
+.block {
+    display: inline-block !important;
+    margin-right: 10px;
+}
+.textBox {
+    display: flex;
+    justify-content: space-between;
+    margin-left: 15px;
+}
+
+.el-dialog__body>div {
+    border-bottom: 1px dashed rgba(187, 187, 187, 1);
+}
+.span{
+  /deep/.el-form-item__content {
+
+      div {
+          width: 100%;
+      }
+  }
+}
+
+.textare {
+    /deep/.el-form-item__content {
+        width: 800px;
+
+        div {
+            width: 100%;
+        }
+    }
+  }
+
+</style>
diff --git a/src/views/toCarryOutLegislativeReforms/components/queryForm.vue b/src/views/toCarryOutLegislativeReforms/components/queryForm.vue
new file mode 100644
index 0000000..5acefb7
--- /dev/null
+++ b/src/views/toCarryOutLegislativeReforms/components/queryForm.vue
@@ -0,0 +1,169 @@
+<template>
+  <div>
+    <div class="search-form">
+      <el-form :inline="true" :model="formData" class="demo-form-inline">
+        <el-form-item label="���������������">
+          <el-input v-model="formData.allocationNum" placeholder="���������������" size="small" clearable />
+        </el-form-item>
+
+        <el-form-item label="���������������">
+          <el-date-picker
+            v-model="formData.startTime"
+            style="width:92%"
+            size="small"
+            value-format="yyyy-MM-dd"
+            type="date"
+            placeholder="������������"
+          />
+
+        </el-form-item>
+        <el-form-item label="���������������">
+          <el-date-picker
+            v-model="formData.endTime"
+            style="width:92%"
+            size="small"
+            value-format="yyyy-MM-dd"
+            type="date"
+            placeholder="������������"
+          />
+        </el-form-item>
+        <el-form-item label="���������������" class="rddd">
+          <el-select v-model="formData.unitId" size="small" clearable placeholder="���������">
+            <el-option
+              v-for="item in unitList"
+              :key="item.unitId"
+              :label="item.unitName"
+              :value="item.unitId"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="���������������">
+          <el-select v-model="formData.polluteType" size="small" clearable placeholder="���������">
+            <el-option
+              v-for="item in polluteList"
+              :key="item.dataKey"
+              :label="item.dataValue"
+              :value="item.dataKey"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="���������������">
+          <el-select v-model="formData.investigationType" size="small" clearable placeholder="���������">
+            <el-option
+              v-for="item in Dic.investigationEnum"
+              :key="item.value"
+              :label="item.name"
+              :value="item.value"
+            />
+          </el-select>
+        </el-form-item>
+
+        <el-form-item label="���������������">
+          <el-select v-model="formData.changeType" placeholder="���������" clearable size="small">
+            <el-option
+              v-for="item in Dic.changeEnum"
+              :key="item.value"
+              :label="item.name"
+              :value="item.value"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="���������������">
+          <el-select v-model="formData.state" size="small" clearable placeholder="���������">
+            <el-option
+              v-for="item in Dic.allocationApproveEnum"
+              :key="item.value"
+              :label="item.name"
+              :value="item.value"
+            />
+          </el-select>
+        </el-form-item>
+
+        <el-form-item label="���������������">
+          <el-select v-model="formData.isInvalid " placeholder="���������" clearable size="small">
+            <el-option
+              v-for="item in Dic.yesOrNo"
+              :key="item.value"
+              :label="item.name"
+              :value="item.value"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" size="small" @click="onSubmit">������</el-button>
+          <el-button type="primary" size="small" @click="handleAdd">������</el-button>
+        </el-form-item>
+      </el-form>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  props: {
+    searchType: { type: String, default: '' }
+  },
+  data() {
+    return {
+      formData: {
+        isInvalid: 0
+      },
+      unitList: [],
+      Dic: JSON.parse(localStorage.getItem('dict')),
+      polluteList: [],
+      valueTime: [],
+      isReform: false
+    }
+  },
+
+  created() {
+    this.getUnitList()
+    this.getContaminateList()
+    console.log('searchType', this.searchType)
+  },
+  methods: {
+    // ������������������list
+    getUnitList() {
+      this.$request({
+        url: '/allocation/unit',
+        method: 'get'
+      }).then((res) => {
+        this.unitList = res.data
+      })
+    },
+    getContaminateList() {
+      this.$request({
+        url: '/allocation/contaminate',
+        method: 'get'
+      }).then((res) => {
+        this.polluteList = res.data
+      })
+    },
+    onSubmit() {
+      this.$emit('handleSearch', this.formData)
+    },
+    handleAdd() {
+      this.$emit('handleAdd', '12122')
+    }
+  }
+}
+</script>
+
+<style scoped lang="scss">
+.search-form {
+    margin: 20px;
+    margin-bottom: 0px;
+   /deep/ .el-input__suffix{
+      right: 20;
+    }
+   /deep/ .el-form-item__content{
+      width: auto;
+    }
+}
+/deep/.el-form-item__label{
+  font-size: 16px;
+}
+/deep/.el-form-item{
+  margin-bottom: 5px;
+}
+</style>
diff --git a/src/views/toCarryOutLegislativeReforms/components/workOrderInformation.vue b/src/views/toCarryOutLegislativeReforms/components/workOrderInformation.vue
new file mode 100644
index 0000000..575969e
--- /dev/null
+++ b/src/views/toCarryOutLegislativeReforms/components/workOrderInformation.vue
@@ -0,0 +1,575 @@
+<template>
+  <div>
+    <el-dialog :title="dialogData.title" top="30px" :visible.sync="visible" width="900px" center :before-close="close">
+      <div slot="title" class="titBox">
+        <div>{{ parentFormData.allocationNum }}</div>
+        <div>{{ dialogData.title }}</div>
+      </div>
+      <div>
+        <div v-if="dialogData.pageType !=='delay'" class="stepsList">
+          <el-steps :space="200" :active="parentFormData.approveList.length+1" align-center>
+            <el-step
+              v-for="(item,index) in setepList"
+              :key="index"
+              :title="'' + item.createName + ' ' + item.stateName"
+              :description="item.createTime"
+            />
+          </el-steps>
+        </div>
+        <div class="inforData">
+          <el-descriptions title="������������" :column="parseInt('4')">
+            <el-descriptions-item label="������������" label-class-name="itemSpan">{{ parentFormData.escalationTime }}</el-descriptions-item>
+            <el-descriptions-item label="������������" label-class-name="itemSpan">{{ parentFormData.pollutePosition }}</el-descriptions-item>
+            <el-descriptions-item label="������������" label-class-name="itemSpan">{{ unitIdFormatter }}</el-descriptions-item>
+            <el-descriptions-item label="������������" label-class-name="itemSpan">{{ polluteTypeFormatter }}</el-descriptions-item>
+            <el-descriptions-item label="������������" label-class-name="itemSpan">{{ dictObj.changeEnum[parentFormData.changeType] }}</el-descriptions-item>
+            <el-descriptions-item label="������������" label-class-name="itemSpan">{{ parentFormData.changeDay }}</el-descriptions-item>
+            <el-descriptions-item label="������������" label-class-name="itemSpan">{{ updataUnitIdFormatter }}</el-descriptions-item>
+            <el-descriptions-item label="���������" label-class-name="itemSpan">{{ parentFormData.escalationName }}</el-descriptions-item>
+          </el-descriptions>
+          <el-descriptions :column="parseInt('1')">
+            <el-descriptions-item label="������������" label-class-name="itemSpan" :content-style="{'width': '80%'}">{{ parentFormData.problemDescribe }}</el-descriptions-item>
+            <el-descriptions-item label="������" label-class-name="itemSpan" :content-style="{'width': '80%'}">
+              <div>
+                <div v-for="(file,index) in fileBaseListCover" :key="file.id+index" class="block">
+                  <el-image
+                    v-if="file.fileType ===1"
+                    style="width: 100px; height: 100px"
+                    :src="file.url"
+                    :preview-src-list="getPreviewImages(file.id,fileBaseList)"
+                    :initial-index="index"
+                  />
+                  <video v-else :src="file.url" style="width: 100px; height: 100px" @click="openVideo(file)">
+                    ������������������������ video ���������
+                  </video>
+                </div>
+              </div>
+            </el-descriptions-item>
+          </el-descriptions>
+        </div>
+        <!-- ������������������ -->
+        <div v-if="dialogData.pageType ==='work'" class="rectification">
+          <div>
+            <el-form label-width="90px" class="demo-form-inline">
+              <div style="display: flex;">
+                <el-form-item label="������������:">
+                  <el-radio-group v-model="workForme.isChange">
+                    <el-radio :label="0">���</el-radio>
+                    <el-radio :label="1">���</el-radio>
+                  </el-radio-group>
+                </el-form-item>
+                <el-form-item label="���������:">
+                  <el-input v-model="workForme.changeName" size="mini" placeholder="������������������" />
+                </el-form-item>
+              </div>
+              <el-form-item label="������������:">
+                <el-input
+                  v-model="workForme.changeDescribe"
+                  type="textarea"
+                  :autosize="{ minRows: 2, maxRows: 4}"
+                  placeholder="���������������"
+                />
+              </el-form-item>
+              <el-row>
+                <el-form-item label="������:">
+                  <uploadFile :upload-url="uploadTermExcelUrl" :sys-code="dialogData.sysCode" />
+                </el-form-item>
+              </el-row>
+
+            </el-form>
+          </div>
+        </div>
+        <!-- ������������ -->
+        <div v-if="(dialogData.pageType ==='detail'||dialogData.pageType ==='approve' )&& parentFormData.state >=30">
+          <el-row class="rectificationContent">
+            <el-col :span="12"><div class="grid-content bg-purple" />
+              <el-descriptions title="������������" :column="parseInt('2')">
+                <el-descriptions-item label="������������" label-class-name="itemSpan">{{ parentFormData.changeType }}</el-descriptions-item>
+                <el-descriptions-item label="���������" label-class-name="itemSpan">{{ parentFormData.changeName }}</el-descriptions-item>
+              </el-descriptions>
+              <el-descriptions :column="parseInt('1')">
+                <el-descriptions-item label="������������" label-class-name="itemSpan">{{ parentFormData.changeDescribe }}</el-descriptions-item>
+              </el-descriptions>
+            </el-col>
+            <el-col :span="12"><div class="grid-content bg-purple-light" />
+              <el-row>
+                <el-col :span="3" style="margin-top: 40px;font-size: 15px;color: #101010;"><div class="grid-content bg-purple" />���������</el-col>
+                <el-col :span="21"><div class="grid-content bg-purple-light" />
+                  <div>
+                    <div v-for="(file,index) in fileChangeListCover" :key="file.id+index" class="block">
+                      <el-image
+                        v-if="file.fileType ===1"
+                        style="width: 100px; height: 100px"
+                        :src="file.url"
+                        :preview-src-list="getPreviewImages(file.id,fileChangeList)"
+                        :initial-index="index"
+                      />
+                      <video v-else :src="file.url" style="width: 100px; height: 100px" @click="openVideo(file)">
+                        ������������������������ video ���������
+                      </video>
+                    </div>
+                  </div>
+                </el-col>
+              </el-row>
+            </el-col>
+          </el-row>
+        </div>
+        <!-- ������������ -->
+        <div v-if="dialogData.pageType ==='detail'&& parentFormData.state>30">
+          <el-row class="rectificationContent">
+            <el-col :span="12"><div class="grid-content bg-purple" />
+              <el-descriptions title="������������" :column="2">
+                <el-descriptions-item label="������������" label-class-name="itemSpan">{{ parentFormData.checkScore }}</el-descriptions-item>
+              </el-descriptions>
+              <el-descriptions :column="1">
+                <el-descriptions-item label="������" label-class-name="itemSpan">{{ parentFormData.checkDescribe }}</el-descriptions-item>
+              </el-descriptions>
+            </el-col>
+            <el-col :span="12"><div class="grid-content bg-purple-light" />
+              <el-row>
+                <el-col :span="3" style="margin-top: 40px;font-size: 15px;color: #101010;"><div class="grid-content bg-purple" />���������</el-col>
+                <el-col :span="21"><div class="grid-content bg-purple-light" />
+                  <div>
+                    <div>
+                      <div v-for="(file,index) in fileApproveListCover" :key="file.id+index" class="block">
+                        <el-image
+                          v-if="file.fileType ===1"
+                          style="width: 100px; height: 100px"
+                          :src="file.url"
+                          :preview-src-list="getPreviewImages(file.id,fileApproveList)"
+                          :initial-index="index"
+                        />
+                        <video v-else :src="file.url" style="width: 100px; height: 100px" @click="openVideo(file)">
+                          ������������������������ video ���������
+                        </video>
+                      </div>
+                    </div>
+                  </div>
+                </el-col>
+              </el-row>
+            </el-col>
+          </el-row>
+        </div>
+        <!-- ������������ -->
+        <div v-if="(dialogData.pageType ==='delay' && (dialogData.pageState ==='view' ||dialogData.pageState ==='edit'))">
+          <el-row class="rectificationContent">
+            <el-col :span="12"><div class="grid-content bg-purple" />
+              <el-descriptions title="������������" :column="1">
+                <el-descriptions-item label="������������" label-class-name="itemSpan">{{ parentFormData.extensionNum }}</el-descriptions-item>
+                <el-descriptions-item label="������������" label-class-name="itemSpan">{{ parentFormData.remake }}</el-descriptions-item>
+              </el-descriptions>
+            </el-col>
+            <el-col :span="12"><div class="grid-content bg-purple-light" />
+              <el-row>
+                <el-col :span="3" style="margin-top: 40px;font-size: 15px;color: #101010;"><div class="grid-content bg-purple" />���������</el-col>
+                <el-col :span="21"><div class="grid-content bg-purple-light" />
+                  <div>
+                    <div v-for="(file,index) in fileDelayListCover" :key="file.id+index" class="block">
+                      <el-image
+                        v-if="file.fileType ===1"
+                        style="width: 100px; height: 100px"
+                        :src="file.url"
+                        :preview-src-list="getPreviewImages(file.id,fileDelayList)"
+                        :initial-index="index"
+                      />
+                      <video v-else :src="file.url" style="width: 100px; height: 100px" @click="openVideo(file)">
+                        ������������������������ video ���������
+                      </video>
+                    </div>
+                  </div></el-col>
+              </el-row>
+            </el-col>
+          </el-row>
+        </div>
+        <!-- ������������ -->
+        <div v-if="dialogData.pageType ==='approve'" class="examineAndApprove">
+          <el-form label-width="90px" :model="rectificationFromData" class="demo-form-inline">
+            <el-form-item label="������������:">
+              <el-input v-model="approveForm.checkScore" style="width: 120px;" size="mini" />
+            </el-form-item>
+            <el-form-item label="������:">
+              <el-input
+                v-model="approveForm.checkDescribe"
+                type="textarea"
+                :autosize="{ minRows: 2, maxRows: 4}"
+                placeholder="���������������"
+              />
+            </el-form-item>
+            <el-form-item label="������:">
+              <uploadFile :upload-url="uploadTermExcelUrl" :sys-code="dialogData.sysCode" />
+            </el-form-item>
+          </el-form>
+        </div>
+        <!-- ������������ -->
+        <div v-if="dialogData.pageType ==='delay' && ( dialogData.pageState ==='approve')" class="examineAndApprove">
+          <el-form label-width="90px" :model="rectificationFromData" class="demo-form-inline">
+            <el-form-item label="������������:">
+              <el-input v-model="delayForm.extensionNum" style="width: 200px;" />
+            </el-form-item>
+            <el-form-item label="������������:">
+              <el-input
+                v-model="delayForm.remake"
+                type="textarea"
+                :autosize="{ minRows: 2, maxRows: 4}"
+                placeholder="���������������"
+              />
+            </el-form-item>
+            <el-form-item label="������:">
+              <uploadFile :upload-url="uploadTermExcelUrl" :sys-code="dialogData.sysCode" />
+            </el-form-item>
+          </el-form>
+        </div>
+      </div>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="close()">������</el-button>
+        <el-button v-if="dialogData.pageType ==='approve'" type="danger" @click="handleSubmit(50)">������</el-button>
+        <el-button v-if="dialogData.pageType ==='delay'&& dialogData.pageState ==='edit'" type="danger" @click="handleDelaySubmit(50)">������</el-button>
+        <el-button v-if="dialogData.pageType ==='delay'&& dialogData.pageState ==='edit'" type="primary" @click="handleDelaySubmit(40)">������</el-button>
+        <el-button v-if="dialogData.pageType !=='detail'&& dialogData.pageState ==='approve'" type="primary" @click="handleSubmit(40)">������</el-button>
+      </div>
+    </el-dialog>
+    <el-dialog :visible.sync="videoVisible" width="600px" :modal-append-to-body="false" :destroy-on-close="true" @close="handleCancel">
+      <div style="text-align: center;">
+        <video
+          ref="video"
+          style="width: 300px;height: 500px"
+          :src="dialogImageUrl"
+          controls
+          autoplay
+        />
+      </div>
+    </el-dialog>
+  </div>
+</template>
+p
+<script>
+import _ from 'lodash'
+import uploadFile from '@/components/UploadExcel/index'
+import Bus from '@/Bus'
+import requestObj from '@/utils/request'
+
+export default {
+  components: {
+    uploadFile
+  },
+  props: {
+    dialogData: { type: Object, default: () => {} },
+    visible: { type: Boolean, required: true }
+  },
+  data() {
+    return {
+      centerDialogVisible: true,
+      workForme: {
+        isChange: 0,
+        changeName: '',
+        changeDescribe: ''
+      },
+      approveForm: {
+        checkScore: '',
+        checkDescribe: ''
+      },
+      delayForm: {
+        remake: '',
+        extensionNum: ''
+      },
+      rectificationFromData: {
+
+      },
+      dialogVisibleMainGraph: false,
+      hasFile: '',
+      setepListAdd: {
+        set1: [
+          { createName: '', stateName: '������', createTime: '' },
+          { createName: '', stateName: '������', createTime: '' },
+          { createName: '', stateName: '������', createTime: '' }
+        ],
+        set2: [
+          { createName: '', stateName: '������', createTime: '' },
+          { createName: '', stateName: '������', createTime: '' }
+        ],
+        set3: [
+          { createName: '', stateName: '������', createTime: '' }
+        ]
+      },
+      unitList: [],
+      polluteList: [],
+      fileList: [],
+      Dic: JSON.parse(localStorage.getItem('dict')),
+      dictObj: JSON.parse(localStorage.getItem('dictObj')),
+      fileBaseList: [],
+      fileChangeList: [],
+      fileApproveList: [],
+      fileBaseListCover: [],
+      fileChangeListCover: [],
+      fileApproveListCover: [],
+      fileDelayListCover: [],
+      fileDelayList: [],
+      videoVisible: false,
+      dialogImageUrl: ''
+    }
+  },
+  computed: {
+    uploadTermExcelUrl() {
+      return `${requestObj.baseUrl}/file/upload`
+    },
+    parentFormData() {
+      console.log('parentFormData.approveList', this.dialogData.parentFormData)
+      return this.dialogData.parentFormData
+    },
+    updataUnitIdFormatter: function() {
+      const data = this.unitList.find(item => item && item.unitId === this.dialogData.parentFormData.escalationUnitId)
+      return data ? data.unitName : ''
+    },
+    unitIdFormatter: function() {
+      const data = this.unitList.find(item => item && item.unitId === this.dialogData.parentFormData.unitId)
+      return data ? data.unitName : ''
+    },
+    polluteTypeFormatter: function() {
+      const data = this.polluteList.find(item => item && parseInt(item.dataKey) === this.dialogData.parentFormData.polluteType)
+      return data ? data.dataValue : ''
+    },
+    setepList() {
+      const leng = this.dialogData.parentFormData.approveList.length
+      let data = _.cloneDeep(this.dialogData.parentFormData.approveList)
+
+      if (leng === 1) {
+        data = [...data, ...this.setepListAdd.set1]
+      }
+      if (leng === 2) {
+        data = [...data, ...this.setepListAdd.set2]
+      }
+      if (leng === 3) {
+        data = [...data, ...this.setepListAdd.set3]
+      }
+      console.log('data', leng)
+      return data
+    }
+  },
+  watch: {
+    'parentFormData': {
+      handler(newVal) {
+        this.searchthisFileList(newVal)
+      },
+      deep: true,
+      immediate: true
+    }
+  },
+  created() {
+    const name = this.$store.state.user.name
+    this.workForme.changeName = name
+    this.getContaminateList()
+    this.getUnitList()
+    Bus.$on('changeFileAfterList', (type, fileList) => {
+      console.log('fileList', fileList)
+      this.fileList = []
+      if (fileList.length > 0) {
+        fileList.map((item) => {
+          if (item.response) {
+            this.fileList.push(item.response.data)
+          }
+        })
+      }
+    })
+  },
+  methods: {
+    getPreviewImages(index, list) {
+      let startIndex = 0
+      const chechList = _.cloneDeep(list)
+      chechList.forEach((item, i) => {
+        const str = item.substring(item.lastIndexOf('/') + 1)
+        if (Number(str) === Number(index)) {
+          startIndex = i
+        }
+      })
+      console.log('startIndex', startIndex)
+      var imgList = [...list]
+      if (index === 0) return imgList
+      var start = imgList.splice(startIndex)
+      var remain = imgList.splice(0, startIndex)
+      return start.concat(remain)
+    },
+    openVideo(item) {
+      console.log('item', item)
+      this.dialogImageUrl = item.url
+      this.videoVisible = true
+    },
+    handleCancel() {
+      this.dialogImageUrl = ''
+      this.videoVisible = false
+    },
+    searchthisFileList(newVal) {
+      if (newVal.fileBaseList && newVal.fileBaseList.length > 0) {
+        newVal.fileBaseList.forEach(item => {
+          if (item.fileType === 1) {
+            this.fileBaseList.push(`${requestObj.baseUrl}/file/preview/${item.fileId}`) // ������
+          }
+
+          this.fileBaseListCover.push({
+            url: item.fileType === 1 ? `${requestObj.baseUrl}/file/preview/cover/${item.fileId}` : `${requestObj.baseUrl}/file/preview/${item.fileId}`,
+            fileType: item.fileType,
+            id: item.fileId
+          })
+        })
+        console.log('fileBaseList', this.fileBaseList)
+      }
+      if (newVal.fileChangeList && newVal.fileChangeList.length > 0) {
+        newVal.fileChangeList.forEach(item => {
+          if (item.fileType === 1) {
+            this.fileChangeList.push(`${requestObj.baseUrl}/file/preview/${item.fileId}`) // ������
+          }
+          this.fileChangeListCover.push({
+            url: item.fileType === 1 ? `${requestObj.baseUrl}/file/preview/cover/${item.fileId}` : `${requestObj.baseUrl}/file/preview/${item.fileId}`,
+            fileType: item.fileType,
+            id: item.fileId
+          })
+        })
+      }
+      if (newVal.fileApproveList && newVal.fileApproveList.length > 0) {
+        newVal.fileApproveList.forEach(item => {
+          if (item.fileType === 1) {
+            this.fileApproveList.push(`${requestObj.baseUrl}/file/preview/${item.fileId}`) // ������
+          }
+          this.fileApproveList.push(`${requestObj.baseUrl}/file/preview/${item.fileId}`) // ������
+          this.fileApproveListCover.push({
+            url: item.fileType === 1 ? `${requestObj.baseUrl}/file/preview/cover/${item.fileId}` : `${requestObj.baseUrl}/file/preview/${item.fileId}`,
+            fileType: item.fileType,
+            id: item.fileId
+          })
+        })
+      }
+      if (newVal.fileList && newVal.fileList.length > 0) {
+        newVal.fileList.forEach(item => {
+          if (item.fileType === 1) {
+            this.fileDelayList.push(`${requestObj.baseUrl}/file/preview/${item.fileId}`) // ������
+          }
+          this.fileDelayList.push(`${requestObj.baseUrl}/file/preview/${item.fileId}`) // ������
+          this.fileDelayListCover.push({
+            url: item.fileType === 1 ? `${requestObj.baseUrl}/file/preview/cover/${item.fileId}` : `${requestObj.baseUrl}/file/preview/${item.fileId}`,
+            fileType: item.fileType,
+            id: item.fileId
+          })
+        })
+      }
+    },
+    close() {
+      this.$emit('update:visible', false)
+    },
+    // ������������������list
+    getUnitList() {
+      this.$request({
+        url: '/allocation/unit',
+        method: 'get'
+      }).then((res) => {
+        this.unitList = res.data
+      })
+    },
+    handleDelaySubmit(state) {
+      this.$request({
+        url: '/allocationExtension/check',
+        method: 'get',
+        params: {
+          id: this.dialogData.parentFormData.id,
+          state: state
+        }
+      }).then((res) => {
+        if (res.code === 0) {
+          this.$emit('update:visible', false)
+          this.$emit('handeleSumit')
+        } else {
+          this.$message.error(res.message)
+        }
+      })
+    },
+    handleSubmit(state) {
+      // ������
+      let api = '/allocation/change'
+      let data = {}
+      console.log('this.dialogData.pageType', this.dialogData.pageType)
+      if (this.dialogData.pageType === 'work') {
+        api = '/allocation/change'
+        data = {
+          'allocationId': this.dialogData.parentFormData.allocationId,
+          ...this.workForme,
+          'fileChangeList': this.fileList,
+          state: 30
+        }
+      } else if (this.dialogData.pageType === 'approve') {
+        api = '/allocation/check'
+        data = {
+          'allocationId': this.dialogData.parentFormData.allocationId,
+          ...this.approveForm,
+          'fileApproveList': this.fileList,
+          state: state
+        }
+      } else if (this.dialogData.pageType === 'delay') {
+        api = '/allocation/applyfor'
+        data = {
+          'allocationId': this.dialogData.parentFormData.allocationId,
+          ...this.delayForm,
+          'fileList': this.fileList
+        }
+      }
+      this.$request({
+        url: api,
+        method: 'post',
+        data: data
+      }).then((res) => {
+        if (res.code === 0) {
+          this.$emit('update:visible', false)
+          this.$emit('handeleSumit')
+        } else {
+          this.$message.error(res.message)
+        }
+      })
+    },
+    getContaminateList() {
+      this.$request({
+        url: '/allocation/contaminate',
+        method: 'get'
+      }).then((res) => {
+        this.polluteList = res.data
+      })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.titBox{
+  position: relative;
+  font-size: 18px;
+  div:first-child{
+    position: absolute;
+    left: 10px;
+  }
+  div{
+    display: inline-block;
+  }
+}
+.stepsList {
+  border-bottom: 1px dashed rgba(187, 187, 187, 1);
+  padding-bottom: 10px;
+}
+.inforData{
+  margin-top: 20px;
+  border-bottom: 1px dashed rgba(187, 187, 187, 1);
+  padding-bottom: 10px;
+  font-size: 15px!important;
+  color: rgba(16, 16, 16, 1)!important;
+}
+  /deep/.itemSpan{
+    width: 70px;
+    text-align: right;
+    font-size: 15px;
+    color: rgba(16, 16, 16, 1);
+  }
+  .rectification ,.examineAndApprove,.rectificationContent{
+    margin-top: 20px;
+    border-bottom: 1px dashed rgba(187, 187, 187, 1);
+    margin-bottom: 10px;
+  }
+  .block {
+    display: inline-block;
+    margin-right: 10px;
+}
+</style>
diff --git a/src/views/toCarryOutLegislativeReforms/delay/componets/queryForm.vue b/src/views/toCarryOutLegislativeReforms/delay/componets/queryForm.vue
new file mode 100644
index 0000000..7f99c37
--- /dev/null
+++ b/src/views/toCarryOutLegislativeReforms/delay/componets/queryForm.vue
@@ -0,0 +1,147 @@
+<template>
+  <div>
+    <div class="search-form">
+      <el-form :inline="true" :model="formData" class="demo-form-inline">
+        <el-form-item label="���������������">
+          <el-input v-model="formData.allocationNum" placeholder="���������������" size="small" clearable />
+        </el-form-item>
+
+        <el-form-item label="���������������">
+          <el-date-picker
+            v-model="formData.startTime"
+            style="width:92%"
+            size="small"
+            value-format="yyyy-MM-dd"
+            type="date"
+            placeholder="������������"
+          />
+
+        </el-form-item>
+        <el-form-item label="���������������">
+          <el-date-picker
+            v-model="formData.endTime"
+            style="width:92%"
+            size="small"
+            value-format="yyyy-MM-dd"
+            type="date"
+            placeholder="������������"
+          />
+        </el-form-item>
+
+        <el-form-item label="���������������">
+          <el-select v-model="formData.unitId" size="small" clearable placeholder="���������">
+            <el-option
+              v-for="item in unitList"
+              :key="item.unitId"
+              :label="item.unitName"
+              :value="item.unitId"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="���������������">
+          <el-select v-model="formData.polluteType" size="small" clearable placeholder="���������">
+            <el-option
+              v-for="item in polluteList"
+              :key="item.dataKey"
+              :label="item.dataValue"
+              :value="item.dataKey"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="���������������">
+          <el-select v-model="formData.changeType" placeholder="���������" clearable size="small">
+            <el-option
+              v-for="item in Dic.changeEnum"
+              :key="item.value"
+              :label="item.name"
+              :value="item.value"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="���������������">
+          <el-select v-model="formData.state" placeholder="���������" clearable size="small">
+            <el-option
+              v-for="item in Dic.allocationExtensionApproveEnum"
+              :key="item.value"
+              :label="item.name"
+              :value="item.value"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" size="small" @click="onSubmit">������</el-button>
+          <el-button v-if="searchType==='reform'" type="primary" size="small" @click="handleAdd">������</el-button>
+        </el-form-item>
+      </el-form>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  props: {
+    searchType: { type: String, default: '' }
+  },
+  data() {
+    return {
+      formData: {},
+      unitList: [],
+      Dic: JSON.parse(localStorage.getItem('dict')),
+      polluteList: [],
+      valueTime: [],
+      isReform: false
+    }
+  },
+
+  created() {
+    this.getUnitList()
+    this.getContaminateList()
+    console.log('searchType', this.searchType)
+  },
+  methods: {
+    // ������������������list
+    getUnitList() {
+      this.$request({
+        url: '/allocation/unit',
+        method: 'get'
+      }).then((res) => {
+        this.unitList = res.data
+      })
+    },
+    getContaminateList() {
+      this.$request({
+        url: '/allocation/contaminate',
+        method: 'get'
+      }).then((res) => {
+        this.polluteList = res.data
+      })
+    },
+    onSubmit() {
+      this.$emit('handleSearch', this.formData)
+    },
+    handleAdd() {
+      this.$emit('handleAdd', '12122')
+    }
+  }
+}
+</script>
+
+<style scoped lang="scss">
+
+.search-form {
+    margin: 20px;
+    margin-bottom: 0px;
+   /deep/ .el-input__suffix{
+      right: 20;
+    }
+   /deep/ .el-form-item__content{
+      width: auto;
+    }
+}
+/deep/.el-form-item__label{
+  font-size: 16px;
+}
+/deep/.el-form-item{
+  margin-bottom: 5px;
+}
+</style>
diff --git a/src/views/toCarryOutLegislativeReforms/delay/index.vue b/src/views/toCarryOutLegislativeReforms/delay/index.vue
new file mode 100644
index 0000000..f5c0c48
--- /dev/null
+++ b/src/views/toCarryOutLegislativeReforms/delay/index.vue
@@ -0,0 +1,324 @@
+<template>
+  <div class="main">
+    <div>
+      <searchBar v-if="searchType" :search-type="searchType" @handleSearch="handleSearch" @handleAdd="handleOpenDialog(null,'add')" />
+      <div class="tab">
+        <el-table
+          :data="tableData"
+          border
+          size="mini"
+          max-height="680"
+          style="width: 100%"
+          :header-cell-style="{
+            color: '#101111', fontSize: '16px'
+          }"
+        >
+          <el-table-column
+            type="index"
+            label="������"
+            width="60px"
+            align="center"
+          />
+          <el-table-column
+            align="center"
+            prop="allocationNum"
+            label="������"
+          />
+          <el-table-column
+            align="center"
+            prop="createTime"
+            label="������"
+          />
+          <el-table-column
+            align="center"
+            prop="unitId"
+            label="������������"
+            :formatter="unitIdFormatter"
+          />
+          <el-table-column
+            align="center"
+            prop="polluteType"
+            label="������������"
+            :formatter="polluteTypeFormatter"
+          />
+          <el-table-column
+            align="center"
+            prop="changeType"
+            label="������������"
+          >
+            <template slot-scope="scope">
+              <div>  {{ dictObj.changeEnum[scope.row.changeType] }}</div>
+            </template>
+          </el-table-column>
+          <el-table-column
+            align="center"
+            prop="extensionNum"
+            width="60px"
+            label="������������"
+          >
+            <template slot-scope="scope">
+              <div>  {{ scope.row.extensionNum }}���</div>
+            </template>
+          </el-table-column>
+          <el-table-column
+            align="center"
+            prop="address"
+            width="80px"
+            label="������"
+          >
+            <template slot-scope="scope">
+              <el-tag v-if="scope.row.state===40" type="success" size="medium ">
+                {{ stateFormatter(scope.row) }}
+              </el-tag>
+              <el-tag v-if="scope.row.state===50" type="danger" size="medium ">
+                {{ stateFormatter(scope.row) }}
+              </el-tag>
+              <el-tag v-if="scope.row.state===9" type="info" size="medium ">
+                {{ stateFormatter(scope.row) }}
+              </el-tag>
+              <el-tag v-if="scope.row.state===20" type="warning" size="medium ">
+                {{ stateFormatter(scope.row) }}
+              </el-tag>
+              <el-tag v-if="scope.row.state===10" type="warning" size="medium ">
+                {{ stateFormatter(scope.row) }}
+              </el-tag>
+              <el-tag v-if="scope.row.state===30" type="warning" size="medium ">
+                {{ stateFormatter(scope.row) }}
+              </el-tag>
+            </template>
+          </el-table-column>
+          <el-table-column
+            align="center"
+          >
+            <template slot="header">
+              <div>������������</div>
+              <div>���������</div>
+            </template>
+            <template slot-scope="scope">
+              <div> {{ scope.row.escalationName }}</div>
+              <div> {{ updatUnitIdFormatter(scope.row) }}</div>
+
+            </template>
+          </el-table-column>
+          <el-table-column
+            align="center"
+          >
+            <template slot="header">
+              <div>���������</div>
+              <div>������������</div>
+            </template>
+            <template slot-scope="scope">
+              <div>{{ scope.row.updateName }}</div>
+              <div>{{ scope.row.updateTime }}</div>
+            </template>
+          </el-table-column>
+          <el-table-column
+            align="center"
+            prop="address"
+            width="100px"
+            label="������"
+          >
+            <template slot-scope="scope">
+              <el-button type="text" size="medium" @click="openWorkOrdinDialog(scope.row,'detail')">������</el-button>
+              <el-button v-if="scope.row.state===30&&scope.row.isApprove===1" type="text" size="medium" @click="openWorkOrdinDialog(scope.row,'approve')">������</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+      </div>
+      <div class="pagina">
+        <el-pagination
+          background
+          :current-page="pagination.currentPage"
+          :page-sizes="pagination.pageSizes"
+          :page-size="pagination.pageSize"
+          :total="pagination.totalCount"
+          layout="total, sizes, prev, pager, next, jumper"
+          @size-change="handleSizeChange"
+          @current-change="handleCurrentChange"
+        />
+      </div>
+    </div>
+    <workOrderInformation v-if="workOrdinDialogVisible" :dialog-data="dialogData" :visible.sync="workOrdinDialogVisible" @handeleSumit="handeleWorkSumbit" />
+  </div>
+</template>
+
+<script>
+import workOrderInformation from '@/views/toCarryOutLegislativeReforms/components/workOrderInformation'
+import searchBar from '@/views/toCarryOutLegislativeReforms/delay/componets/queryForm'
+export default {
+  components: {
+    searchBar,
+    workOrderInformation
+  },
+  data() {
+    return {
+      Dic: JSON.parse(localStorage.getItem('dict')),
+      dictObj: JSON.parse(localStorage.getItem('dictObj')),
+      workOrdinDialogVisible: false,
+      formData: {},
+      tableData: [],
+      polluteList: [],
+      unitList: [],
+      searchType: 'delay',
+      pagination: {
+        currentPage: 1,
+        // ������������������������������������������(���������������������������)
+        totalCount: 0,
+        // ������������������������������
+        pageSizes: [10, 20, 30, 40],
+        // ������������������������������������������
+        pageSize: 10
+      },
+      searchData: {}
+    }
+  },
+  created() {
+    this.getUnitList()
+    this.getContaminateList()
+    this.handleSearch()
+  },
+  methods: {
+    handeleWorkSumbit() {
+      this.handleSearch()
+    },
+    handleSearch(obj) {
+      this.searchData.isInvalid = 0
+      if (obj) {
+        this.searchData = obj
+      }
+      this.$request({
+        url: '/allocationExtension/page',
+        method: 'post',
+        data: {
+          ...obj,
+          'page': this.pagination
+        }
+      }).then((res) => {
+        this.tableData = res.data.list
+        this.pagination.totalCount = res.data.page.totalNum
+      })
+    },
+    // ������
+    // ���������������������
+    handleSizeChange(val) {
+      // ���������������������������
+      this.pagination.pageSize = val
+      // ���������������������������������������������������������������������������
+      this.pagination.currentPage = 1
+      this.handleSearch()
+    },
+    // ���������������
+    handleCurrentChange(val) {
+      // ���������������������
+      this.pagination.currentPage = val
+      this.handleSearch()
+      // console.log(val)
+    },
+    openWorkOrdinDialog(row, type) {
+      this.$request({
+        url: '/allocationExtension/detail',
+        method: 'get',
+        params: {
+          id: row.id
+        }
+      }).then((res) => {
+        this.parentFormData = res.data
+        this.workOrdinDialogVisible = true
+        if (type === 'detail') {
+          this.dialogData = {
+            title: '���������������',
+            parentFormData: res.data,
+            pageState: 'view',
+            pageType: 'delay',
+            sysCode: '1010202'
+          }
+        } else if (type === 'approve') {
+          this.dialogData = {
+            title: '������������������',
+            parentFormData: res.data,
+            pageState: 'edit',
+            pageType: 'delay',
+            sysCode: '1010202'
+          }
+        }
+      })
+    },
+    updatUnitIdFormatter(val) {
+      const data = this.unitList.find(item => item && item.unitId === val.escalationUnitId)
+      return data ? data.unitName : ''
+    },
+    unitIdFormatter(val) {
+      const data = this.unitList.find(item => item && item.unitId === val.unitId)
+      return data ? data.unitName : ''
+    },
+    polluteTypeFormatter(val) {
+      const data = this.polluteList.find(item => item && parseInt(item.dataKey) === val.polluteType)
+      return data ? data.dataValue : ''
+    },
+    investigationTypeFormatter(val) {
+      return this.dictObj.investigationEnum[val.investigationType]
+    },
+    stateFormatter(val) {
+      return this.dictObj.allocationApproveEnum[val.state]
+    },
+    isInvalidFormatter(val) {
+      return this.dictObj.yesOrNo[val.isInvalid]
+    },
+    // ������������������list
+    getUnitList() {
+      this.$request({
+        url: '/allocation/unit',
+        method: 'get'
+      }).then((res) => {
+        this.unitList = res.data
+        console.log(' JSON.stringify(this.unitList)', this.unitList)
+      })
+    },
+    getContaminateList() {
+      this.$request({
+        url: '/allocation/contaminate',
+        method: 'get'
+      }).then((res) => {
+        this.polluteList = res.data
+      })
+    }
+  }
+}
+</script>
+
+<style scoped lang="scss">
+.main{
+    padding: 20px;
+    padding-top: 0px;
+    height: 100%;
+    overflow: overlay;
+}
+.tab {
+    margin-top: 0px;
+   /deep/ .el-tag{
+      font-size: 16px;
+    }
+}
+// /deep/ .el-table__body-wrapper {
+//     overflow: scroll;
+//     position: relative;
+//     overflow-x: hidden;
+//     max-height: 400px;
+// }
+.pagina{
+    margin-top: 10px;
+}
+/deep/ .el-table__row{
+  font-size: 18px;
+}
+.el-pagination {
+  padding: 0;
+  .el-select{
+    /deep/.el-input{
+      margin:0;
+    }
+  }
+
+}
+</style>
+
diff --git a/src/views/toCarryOutLegislativeReforms/reform/index.vue b/src/views/toCarryOutLegislativeReforms/reform/index.vue
new file mode 100644
index 0000000..ea5f8c4
--- /dev/null
+++ b/src/views/toCarryOutLegislativeReforms/reform/index.vue
@@ -0,0 +1,502 @@
+<template>
+  <div class="main">
+    <div>
+      <searchBar v-if="searchType" :search-type="'reform'" @handleSearch="handleSearch" @handleAdd="handleOpenDialog(null,'add')" />
+      <newWorkOrder
+        v-if="centerDialogVisible"
+        ref="newWorkOrder"
+        :parent-form-data="parentFormData"
+        :title="title"
+        :page-state="pageState"
+        :visible.sync="centerDialogVisible"
+        @handleSubmit="newHandleSubmit"
+      />
+      <div class="tab">
+        <el-table
+          size="mini"
+          :data="tableData"
+          border
+          max-height="680"
+          style="width: 100%"
+          :header-cell-style="{
+            color: '#101111', fontSize: '16px'
+          }"
+        >
+          <el-table-column
+            type="index"
+            label="������"
+            width="60px"
+            align="center"
+          />
+          <el-table-column
+            align="center"
+          >
+            <template slot="header">
+              <div>������</div>
+              <div>������������</div>
+            </template>
+            <template slot-scope="scope">
+              <div> {{ scope.row.allocationNum }}</div>
+              <div> {{ scope.row.escalationTime }}</div>
+
+            </template>
+          </el-table-column>
+          <el-table-column
+            align="center"
+            prop="unitId"
+            label="������������"
+            :formatter="unitIdFormatter"
+          />
+          <el-table-column
+            align="center"
+            prop="polluteType"
+            label="������������"
+            width="120px"
+            :formatter="polluteTypeFormatter"
+          />
+          <el-table-column
+            align="center"
+          >
+            <template slot="header">
+              <div>������������</div>
+              <div>������������</div>
+            </template>
+            <template slot-scope="scope">
+              <div>  {{ dictObj.changeEnum[scope.row.changeType] }}</div>
+              <div v-show="scope.row.changeType && scope.row.changeType===2" :class="[Number(scope.row.residueDay) < 0 ? errorClass : '']">
+                <span v-if="Number(scope.row.residueDay) < 0">
+                  ������ {{ Math.abs(scope.row.residueDay) }}���
+                </span>
+                <span v-else>
+                  {{ scope.row.residueDay }}���
+                </span>
+
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column
+            align="center"
+            prop="investigationType"
+            label="������������"
+            width="100px"
+            :formatter="investigationTypeFormatter"
+          />
+          <el-table-column
+            align="center"
+            prop="state"
+            width="100px"
+            label="������������"
+          >
+            <template slot-scope="scope">
+              <el-tag v-if="scope.row.state===40" type="success">
+                {{ stateFormatter(scope.row) }}
+              </el-tag>
+              <el-tag v-if="scope.row.state===50" type="danger">
+                {{ stateFormatter(scope.row) }}
+              </el-tag>
+              <el-tag v-if="scope.row.state===9" type="info">
+                {{ stateFormatter(scope.row) }}
+              </el-tag>
+              <el-tag v-if="scope.row.state===20" type="warning">
+                {{ stateFormatter(scope.row) }}
+              </el-tag>
+              <el-tag v-if="scope.row.state===10" type="warning">
+                {{ stateFormatter(scope.row) }}
+              </el-tag>
+              <el-tag v-if="scope.row.state===30" type="warning">
+                {{ stateFormatter(scope.row) }}
+              </el-tag>
+            </template>
+          </el-table-column>
+          <el-table-column
+            align="center"
+            prop="isInvalid"
+            label="������������"
+            width="60px"
+            :formatter="isInvalidFormatter"
+          />
+          <el-table-column
+            align="center"
+          >
+            <template slot="header">
+              <div>������������</div>
+              <div>���������</div>
+            </template>
+            <template slot-scope="scope">
+              <div> {{ scope.row.escalationName }}</div>
+              <div> {{ updatUnitIdFormatter(scope.row) }}</div>
+
+            </template>
+          </el-table-column>
+          <el-table-column
+            align="center"
+          >
+            <template slot="header">
+              <div>���������</div>
+              <div>������������</div>
+            </template>
+            <template slot-scope="scope">
+              <div>{{ scope.row.updateName }}</div>
+              <div>{{ scope.row.updateTime }}</div>
+            </template>
+          </el-table-column>
+          <el-table-column
+            align="center"
+            prop="createTime"
+            width="100px"
+            label="������"
+          >
+            <template slot-scope="scope">
+              <el-button type="text" size="medium" @click="openWorkOrdinDialog(scope.row,'detail')">������</el-button>
+              <el-button v-if="scope.row.state===9" type="text" size="medium" @click="handleOpenDialog(scope.row,'edit')">������</el-button>
+              <el-button v-if="scope.row.state>30&&scope.row.isInvalid===0" type="text" size="medium" @click="handleCancel(scope.row)">������</el-button>
+              <el-button v-if="scope.row.state===20" type="text" size="medium" @click="openWorkOrdinDialog(scope.row,'work')">������</el-button>
+              <el-button v-if="scope.row.state===30&&scope.row.isApprove===1" type="text" size="medium" @click="openWorkOrdinDialog(scope.row,'approve')">������</el-button>
+              <el-button v-if="scope.row.state===20&&scope.row.changeType===2&&scope.row.applyState===0" type="text" size="medium" @click="openWorkOrdinDialog(scope.row,'delay')">������������</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+      </div>
+      <div class="pagina">
+        <el-pagination
+          background
+          :current-page="pagination.currentPage"
+          :page-sizes="pagination.pageSizes"
+          :page-size="pagination.pageSize"
+          :total="pagination.totalCount"
+          layout="total, sizes, prev, pager, next, jumper"
+          @size-change="handleSizeChange"
+          @current-change="handleCurrentChange"
+        />
+      </div>
+    </div>
+    <workOrderInformation v-if="workOrdinDialogVisible" :dialog-data="dialogData" :visible.sync="workOrdinDialogVisible" @handeleSumit="handeleSumit" />
+    <el-dialog
+      title="������"
+      :visible.sync="dialogVisible"
+      width="600px"
+      :before-close="handleClose"
+      center
+    >
+      <div>
+        <el-form label-width="100px">
+          <el-form-item label="���������������" style="margin-right: 30px;">
+            <el-input
+              v-model="invalidReason"
+              type="textarea"
+              :autosize="{ minRows: 2, maxRows: 10}"
+              placeholder="���������������"
+            />
+          </el-form-item>
+        </el-form>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="handleClose">��� ���</el-button>
+        <el-button type="primary" @click="handleInvalid">��� ���</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import searchBar from '@/views/toCarryOutLegislativeReforms/components/queryForm'
+import newWorkOrder from '@/views/toCarryOutLegislativeReforms/components/newWorkOrder'
+import workOrderInformation from '@/views/toCarryOutLegislativeReforms/components/workOrderInformation'
+export default {
+  components: {
+    searchBar,
+    newWorkOrder,
+    workOrderInformation
+  },
+  data() {
+    return {
+      errorClass: 'errorClass',
+      searchType: 'reform',
+      pagination: {
+        currentPage: 1,
+        // ������������������������������������������(���������������������������)
+        totalCount: 0,
+        // ������������������������������
+        pageSizes: [10, 20, 30, 40],
+        // ������������������������������������������
+        pageSize: 10
+      },
+      formData: {},
+      tableData: [
+      ],
+      dialogData: {
+        title: '������',
+        parentFormData: {},
+        pageState: 'work'
+      },
+      pageStats: 'add',
+      workOrdinDialogVisible: false,
+      centerDialogVisible: false,
+      dialogVisible: false,
+      unitList: [],
+      polluteList: [],
+      Dic: JSON.parse(localStorage.getItem('dict')),
+      dictObj: JSON.parse(localStorage.getItem('dictObj')),
+      parentFormData: {},
+      pageState: 'add',
+      invalidReason: '',
+      slectRow: {},
+      title: '',
+      searchData: {
+        isInvalid: 0
+      }
+    }
+  },
+
+  created() {
+    this.handleSearch()
+    this.getUnitList()
+    this.getContaminateList()
+  },
+  methods: {
+    handleCancel(row) {
+      this.dialogVisible = true
+      this.slectRow = row
+    },
+    handleClose() {
+      this.dialogVisible = false
+    },
+    handleInvalid() {
+      this.$request({
+        url: '/allocation/invalid',
+        method: 'get',
+        params: {
+          id: this.slectRow.allocationId,
+          invalidReason: this.invalidReason
+        }
+      }).then((res) => {
+        if (res.code === 0) {
+          this.$message({
+            message: '������������',
+            type: 'success'
+          })
+          this.dialogVisible = false
+        } else {
+          this.$message.error(res.message)
+        }
+      })
+    },
+    // ������
+    handleOpenDialog(row, type) {
+      this.pageState = type
+      this.parentFormData = {}
+      if (type === 'add') {
+        this.title = '���������������'
+        this.centerDialogVisible = true
+      } else {
+        this.title = '���������������'
+        this.$request({
+          url: '/allocation/detail',
+          method: 'get',
+          params: {
+            id: row.allocationId
+          }
+        }).then((res) => {
+          this.parentFormData = res.data
+          console.log(this.parentFormData)
+          this.centerDialogVisible = true
+        })
+      }
+    },
+    updatUnitIdFormatter(val) {
+      const data = this.unitList.find(item => item && item.unitId === val.escalationUnitId)
+      return data ? data.unitName : ''
+    },
+    unitIdFormatter(val) {
+      const data = this.unitList.find(item => item && item.unitId === val.unitId)
+      return data ? data.unitName : ''
+    },
+    polluteTypeFormatter(val) {
+      const data = this.polluteList.find(item => item && parseInt(item.dataKey) === val.polluteType)
+      return data ? data.dataValue : ''
+    },
+    investigationTypeFormatter(val) {
+      return this.dictObj.investigationEnum[val.investigationType]
+    },
+    stateFormatter(val) {
+      console.log('valval', val)
+      return this.dictObj.allocationApproveEnum[val.state]
+    },
+    isInvalidFormatter(val) {
+      return this.dictObj.yesOrNo[val.isInvalid]
+    },
+    // ������������������list
+    getUnitList() {
+      this.$request({
+        url: '/allocation/unit',
+        method: 'get'
+      }).then((res) => {
+        if (res.code === 0) {
+          this.unitList = res.data
+        } else {
+          this.$message.error(res.message)
+        }
+      })
+    },
+    getContaminateList() {
+      this.$request({
+        url: '/allocation/contaminate',
+        method: 'get'
+      }).then((res) => {
+        if (res.code === 0) {
+          this.polluteList = res.data
+        } else {
+          this.$message.error(res.message)
+        }
+      })
+    },
+    handeleSumit() {
+      this.handleSearch()
+    },
+    // ������
+    newHandleSubmit(obj) {
+      console.log(obj)
+      console.log(this.parentFormData)
+      let api = '/allocation/insert'
+      if (this.pageState !== 'add') {
+        api = '/allocation/update'
+        // obj.fileBaseList = [...this.parentFormData.fileBaseList, ... obj.fileBaseList]
+      }
+      this.$request({
+        url: api,
+        method: 'post',
+        data: {
+          ...obj
+        }
+      }).then((res) => {
+        if (res.code === 0) {
+          this.centerDialogVisible = false
+
+          this.handleSearch()
+        } else {
+          this.$message.error(res.message)
+        }
+      })
+    },
+    handleSearch(obj) {
+      this.searchData.isInvalid = 0
+      if (obj) {
+        this.searchData = obj
+      }
+      this.$request({
+        url: '/allocation/page',
+        method: 'post',
+        data: {
+          ...this.searchData,
+          'page': this.pagination
+        }
+      }).then((res) => {
+        if (res.code === 0) {
+          this.tableData = res.data.list
+          this.pagination.totalCount = res.data.page.totalNum
+        } else {
+          this.$message.error(res.message)
+        }
+      })
+    },
+    // ������
+    // ���������������������
+    handleSizeChange(val) {
+      // ���������������������������
+      this.pagination.pageSize = val
+      // ���������������������������������������������������������������������������
+      this.pagination.currentPage = 1
+      this.handleSearch()
+    },
+    // ���������������
+    handleCurrentChange(val) {
+      // ���������������������
+      this.pagination.currentPage = val
+      this.handleSearch()
+      // console.log(val)
+    },
+    openWorkOrdinDialog(row, type) {
+      this.$request({
+        url: '/allocation/detail',
+        method: 'get',
+        params: {
+          id: row.allocationId
+        }
+      }).then((res) => {
+        this.parentFormData = res.data
+        this.workOrdinDialogVisible = true
+        if (type === 'work') {
+          this.dialogData = {
+            title: '���������������',
+            parentFormData: res.data,
+            pageType: 'work',
+            pageState: 'approve',
+            sysCode: '1010202'
+          }
+        } else if (type === 'approve') {
+          this.dialogData = {
+            title: '���������������',
+            parentFormData: res.data,
+            pageType: 'approve',
+            pageState: 'approve',
+            sysCode: '1010203'
+          }
+        } else if (type === 'detail') {
+          this.dialogData = {
+            title: '���������',
+            parentFormData: res.data,
+            pageType: 'detail'
+          }
+        } else if (type === 'delay') {
+          this.dialogData = {
+            title: '���������������',
+            parentFormData: res.data,
+            pageType: 'delay',
+            pageState: 'approve',
+            sysCode: '1251701'
+          }
+        }
+      })
+    }
+  }
+}
+</script>
+
+<style scoped lang="scss">
+.main{
+    padding: 20px;
+    padding-top: 0px;
+    height: 100%;
+    overflow: overlay;
+}
+.tab {
+    margin-top: 0px;
+   /deep/ .el-tag{
+      font-size: 16px;
+    }
+}
+// /deep/ .el-table__body-wrapper {
+//     overflow: scroll;
+//     position: relative;
+//     overflow-x: hidden;
+//     max-height: 400px;
+// }
+.pagina{
+    margin-top: 10px;
+}
+/deep/ .el-table__row{
+  font-size: 18px;
+}
+.el-pagination {
+  padding: 0;
+  .el-select{
+    /deep/.el-input{
+      margin:0;
+    }
+  }
+
+}
+.errorClass{
+  color: red;
+}
+</style>
diff --git a/src/views/toCarryOutLegislativeReforms/summaryPage/components/pollutionClassificationEcharts.vue b/src/views/toCarryOutLegislativeReforms/summaryPage/components/pollutionClassificationEcharts.vue
new file mode 100644
index 0000000..f8a130b
--- /dev/null
+++ b/src/views/toCarryOutLegislativeReforms/summaryPage/components/pollutionClassificationEcharts.vue
@@ -0,0 +1,151 @@
+<template>
+  <div :class="className" :style="{ height: height, width: width }" />
+</template>
+
+<script>
+// import echarts from 'echarts'
+import * as echarts from 'echarts'
+require('echarts/theme/macarons') // echarts theme
+// import resize from '@/components/Echarts/mixins/resize'
+export default {
+  // mixins: [resize],
+  props: {
+    className: {
+      type: String,
+      default: 'chart'
+    },
+    width: {
+      type: String,
+      default: '100%'
+    },
+    height: {
+      type: String,
+      default: '290px'
+    },
+    chartData: {
+      type: Array,
+      required: false,
+      default: () => []
+    }
+  },
+  data() {
+    return {
+      chart: null,
+      seriesData: []
+    }
+  },
+  watch: {
+    'chartData': {
+      handler(newVal) {
+        console.log('newVal', newVal)
+        this.seriesData = []
+        this.seriesData = newVal
+        this.$nextTick(() => {
+          this.initChart()
+        })
+      },
+      deep: true,
+      immediate: true
+    }
+  },
+  mounted() {
+    this.$nextTick(() => {
+      this.initChart()
+    })
+  },
+  beforeDestroy() {
+    if (!this.chart) {
+      return
+    }
+    this.chart.dispose()
+    this.chart = null
+  },
+  methods: {
+    initChart() {
+      this.chart = echarts.init(this.$el, 'macarons')
+      this.chart.clear()
+      this.setOptions()
+    },
+    setOptions() {
+      // function fontSize(res) {
+      //     let clientWidth =
+      //         window.innerWidth ||
+      //         document.documentElement.clientWidth ||
+      //         document.body.clientWidth
+      //     if (!clientWidth) return
+      //     let fontSize = 100 * (clientWidth / 1920)
+      //     return res * fontSize
+      // }
+
+      this.chart.setOption(
+        {
+          color: ['#F56463', '#00C6FF', '#F09615', '#0079E6', '#a814ff', '#03b915'],
+          legend: {
+            itemHeight: 14,
+            itemWidth: 14,
+            icon: 'rect',
+            orient: 'vertical',
+            top: 'center',
+            right: '5%',
+            textStyle: {
+              align: 'left',
+              color: '#',
+              verticalAlign: 'middle',
+              rich: {
+                name: {
+                  width: 80,
+                  fontSize: 16
+                },
+                value: {
+                  width: 20,
+                  align: 'right',
+                  fontFamily: 'Medium',
+                  fontSize: 16
+                },
+                rate: {
+                  width: 10,
+                  align: 'right',
+                  fontSize: 16
+                }
+              }
+            },
+            data: this.seriesData,
+            formatter: (name) => {
+              if (this.seriesData.length) {
+                const item = this.seriesData.filter((item) => item.name === name)[0]
+                return `{name|${name}}{value| ${item.value}}`
+              }
+            }
+          },
+          tooltip: {
+            trigger: 'item',
+            backgroundColor: 'rgba(255,255,255,.8)', // ������������rgba������������������������������
+            color: 'gray'
+          },
+          series: [
+            {
+              name: '',
+              type: 'pie',
+              radius: ['30%', '80%'],
+              center: ['35%', '50%'],
+              roseType: 'radius',
+              label: {
+                formatter: '{d}%'
+              },
+              labelLine: {
+                length: 1,
+                length2: 20
+              },
+              data: this.seriesData
+            }
+          ]
+        },
+        true
+      )
+      this.chart.resize()
+      window.onresize = this.chart.resize
+    }
+  }
+}
+</script>
+
diff --git a/src/views/toCarryOutLegislativeReforms/summaryPage/components/reportTypeEcharts.vue b/src/views/toCarryOutLegislativeReforms/summaryPage/components/reportTypeEcharts.vue
new file mode 100644
index 0000000..a81c9a0
--- /dev/null
+++ b/src/views/toCarryOutLegislativeReforms/summaryPage/components/reportTypeEcharts.vue
@@ -0,0 +1,154 @@
+<template>
+  <div id="myPieChart" :style="{ height: height, width: width }" />
+</template>
+
+<script>
+// import echarts from 'echarts'
+import * as echarts from 'echarts'
+require('echarts/theme/macarons') // echarts theme
+// import resize from '@/components/Echarts/mixins/resize'
+export default {
+  // mixins: [resize],
+  props: {
+    className: {
+      type: String,
+      default: 'chart'
+    },
+    width: {
+      type: String,
+      default: '100%'
+    },
+    height: {
+      type: String,
+      default: '290px'
+    },
+    cylindricalityData: {
+      type: Array,
+      required: false,
+      default: () => []
+    }
+  },
+  data() {
+    return {
+      chart: null,
+      seriesData: [],
+      namelist: []
+    }
+  },
+  watch: {
+    'cylindricalityData': {
+      handler(newVal) {
+        console.log('newVal', newVal)
+        this.seriesData = []
+        this.namelist = []
+        const arr = []
+
+        newVal.forEach(item => {
+          arr.push({
+            name: item.name,
+            type: 'bar',
+            barWidth: '40%',
+            data: [item.value]
+          })
+          this.namelist.push(item.name)
+        })
+        this.seriesData = arr
+        this.$nextTick(() => {
+          this.initChart()
+        })
+      },
+      deep: true,
+      immediate: true
+    }
+  },
+  mounted() {
+    this.$nextTick(() => {
+      this.initChart()
+    })
+  },
+  beforeDestroy() {
+    if (!this.chart) {
+      return
+    }
+    this.chart.dispose()
+    this.chart = null
+  },
+  methods: {
+    initChart() {
+      if (this.chart) {
+        this.chart.dispose()
+      }
+      const chartDom = document.getElementById('myPieChart')
+      this.chart = echarts.init(chartDom)
+      this.chart.clear()
+      this.setOptions()
+    },
+    setOptions() {
+      // function fontSize(res) {
+      //     let clientWidth =
+      //         window.innerWidth ||
+      //         document.documentElement.clientWidth ||
+      //         document.body.clientWidth
+      //     if (!clientWidth) return
+      //     let fontSize = 100 * (clientWidth / 1920)
+      //     return res * fontSize
+      // }
+
+      this.chart.setOption(
+        {
+          tooltip: {
+            trigger: 'axis',
+            backgroundColor: 'rgba(255,255,255,.8)', // ������������rgba������������������������������
+            color: 'gray',
+            axisPointer: {
+              type: 'line'
+            }
+          },
+          grid: {
+            left: '3%',
+            right: '4%',
+            bottom: '3%',
+            containLabel: true
+          },
+          xAxis: [{
+            type: 'category',
+            data: this.namelist,
+            axisTick: {
+              show: false,
+              alignWithLabel: true
+            },
+            axisLine: {
+              show: false
+            },
+            axisLabel: {
+              color: '#989898'
+            }
+          }],
+          yAxis: [{
+            type: 'value',
+            axisTick: {
+              show: false
+            },
+            axisLine: {
+              show: false
+            },
+            splitLine: {
+              lineStyle: {
+                color: '#ebebeb'
+              }
+            },
+            axisLabel: {
+              color: '#8c8c8c'
+            }
+          }],
+          series: this.seriesData
+        },
+        true
+      )
+      this.chart.resize()
+      window.onresize = this.chart.resize
+    }
+  }
+}
+</script>
+
diff --git a/src/views/toCarryOutLegislativeReforms/summaryPage/index.vue b/src/views/toCarryOutLegislativeReforms/summaryPage/index.vue
new file mode 100644
index 0000000..cb5917f
--- /dev/null
+++ b/src/views/toCarryOutLegislativeReforms/summaryPage/index.vue
@@ -0,0 +1,417 @@
+<template>
+  <div class="main">
+    <div class="timeSelect">
+      <el-radio-group
+        v-model="searchForm.number"
+        style="margin-left:20px"
+        @input="changeNumber"
+      >
+        <el-radio-button label="1">���1������</el-radio-button>
+        <el-radio-button label="2">���2������</el-radio-button>
+        <el-radio-button label="3">���3������</el-radio-button>
+        <el-radio-button label="6">���6������</el-radio-button>
+        <el-radio-button label="12">���12������</el-radio-button>
+      </el-radio-group>
+      <el-date-picker
+        v-model="timeInterval"
+        el-time-picker
+        type="daterange"
+        value-format="yyyy-MM-dd"
+        range-separator="���"
+        start-placeholder="������������"
+        end-placeholder="������������"
+        @change="changeNumber"
+      />
+    </div>
+    <div class="agentSummary">
+      <div class="circle">
+        <div>������������</div>
+        <div>{{ responeForm.total }}</div>
+      </div>
+      <div class="circle">
+        <div>���������</div>
+        <div>{{ responeForm.unComplete }}</div>
+      </div>
+      <div class="circle">
+        <div>���������</div>
+        <div>{{ responeForm.complete }}</div>
+      </div>
+      <div class="circle">
+        <div>������</div>
+        <div>{{ responeForm.overdue }}</div>
+      </div>
+    </div>
+    <div class="overviewAndDetails">
+      <el-tabs
+        v-model="activeName"
+        @tab-click="handleClick"
+      >
+        <el-tab-pane
+          label="������"
+          name="first"
+        >
+          <div>
+            <div class="tit">
+              <span>
+                ���������������������������
+              </span>
+              <el-button
+                type="primary"
+                plain
+                size="small"
+                style="float: right;"
+                @click="ecxport"
+              >
+                ������
+              </el-button>
+            </div>
+            <div class="tab">
+              <el-table
+                :data="tableData"
+                border
+                max-height="400"
+                style="width: 100%"
+                :header-cell-style="{
+                  background: '#99D4FF', color: '#101111', fontSize: '16px'
+                }"
+              >
+                <el-table-column
+                  align="center"
+                  prop="unitName"
+                  label="������������"
+                />
+                <el-table-column
+                  align="center"
+                  prop="total"
+                  label="���������"
+                />
+                <el-table-column
+                  align="center"
+                  prop="number"
+                  label="���������"
+                />
+                <el-table-column
+                  align="center"
+                  prop="unNumber"
+                  label="���������"
+                />
+                <el-table-column
+                  align="center"
+                  prop="rate"
+                  label="���������"
+                />
+                <el-table-column
+                  align="center"
+                  prop="deduction"
+                  label="������"
+                />
+                <el-table-column
+                  align="center"
+                  prop="marks"
+                  label="������"
+                />
+                <el-table-column
+                  align="center"
+                  prop="totalPoints"
+                  label="���������"
+                />
+              </el-table>
+            </div>
+          </div>
+        </el-tab-pane>
+        <el-tab-pane
+          label="������"
+          name="second"
+        >
+          <div>
+            <div>
+              <p style="text-align: center;">
+                ���������������
+                <el-select v-model="unitId" size="small" placeholder="���������" @change="changeUnitId">
+                  <el-option
+                    v-for="item in unitList"
+                    :key="item.unitId"
+                    :label="item.unitName"
+                    :value="item.unitId"
+                  />
+                </el-select>
+              </p>
+            </div>
+            <div class="chartsTitle">
+              <p>������������</p>
+              <p>������������</p>
+            </div>
+            <div class="caets">
+              <div>
+                <pollutionClassificationEcharts
+                  v-if="activeName === 'second'"
+                  ref="leftEcharts"
+                  :chart-data="chartData"
+                />
+              </div>
+              <div>
+                <reportTypeEcharts
+                  v-if="activeName === 'second'"
+                  ref="rightEcharts"
+                  :cylindricality-data="cylindricalityData"
+                />
+              </div>
+            </div>
+          </div>
+        </el-tab-pane>
+      </el-tabs>
+    </div>
+  </div>
+</template>
+
+<script>
+import pollutionClassificationEcharts from '@/views/toCarryOutLegislativeReforms/summaryPage/components/pollutionClassificationEcharts'
+import reportTypeEcharts from '@/views/toCarryOutLegislativeReforms/summaryPage/components/reportTypeEcharts'
+export default {
+  components: {
+    pollutionClassificationEcharts,
+    reportTypeEcharts
+  },
+  data() {
+    return {
+      mount: '',
+      timeInterval: [],
+      polluteList: [],
+      unitList: [],
+      activeName: 'first',
+      tableData: [],
+      responsibleUnit: '',
+      searchForm: {
+        number: 1,
+        startTime: '',
+        endTime: ''
+      },
+      unitId: '',
+      responeForm: {
+        total: '',
+        complete: '',
+        unComplete: '',
+        overdue: ''
+      },
+      chartData: [],
+      cylindricalityData: []
+    }
+  },
+  created() {
+    this.getUnitList()
+    this.getContaminateList()
+    this.handleSearch()
+  },
+  methods: {
+    ecxport() {
+      this.$request({
+        url: '/allocation/unitExel',
+        method: 'get',
+        responseType: 'blob',
+        params: {
+          startTime: this.timeInterval[0],
+          endTime: this.timeInterval[1],
+          number: Number(this.searchForm.number)
+        }
+      }).then((res) => {
+        this.getOutExcel('������������������.xlsx', res)
+      })
+    },
+    getOutExcel(fileName, res) {
+      const blob = new Blob([res], { type: 'application/x-xls' })
+      if (window.navigator.msSaveOrOpenBlob) {
+        // ������ IE & EDGE
+        navigator.msSaveBlob(blob, fileName)
+      } else {
+        var link = document.createElement('a')
+        // ������������������������URL������
+        const url = window.URL || window.webkitURL || window.moxURL
+        // ������������������
+        link.href = url.createObjectURL(blob)
+        // ������������������
+        link.download = fileName
+        // ������������������
+        link.click()
+        // ������������������������
+        url.revokeObjectURL(link.href)
+      }
+    },
+    unitIdFormatter(val) {
+      const data = this.unitList.find(item => item && item.unitId === val.unitId)
+      return data ? data.unitName : ''
+    },
+    changeNumber(val) {
+      this.handleSearch()
+    },
+    handleClick(tab, event) {
+      console.log(tab)
+    },
+    changeUnitId() {
+      this.$request({
+        url: '/allocation/selectUnitView',
+        method: 'get',
+        params: {
+          startTime: this.timeInterval[0],
+          endTime: this.timeInterval[1],
+          number: Number(this.searchForm.number),
+          unitId: this.unitId
+        }
+      }).then((res) => {
+        if (res.code === 0) {
+          this.chartData = []
+          this.chartData = this.cylindricalityData
+          this.chartData = res.data.polluteType
+          this.cylindricalityData = res.data.escalationType
+        } else {
+          this.$message.error(res.message)
+        }
+      })
+    },
+    handleSearch() {
+      this.$request({
+        url: '/allocation/selectUnitView',
+        method: 'get',
+        params: {
+          startTime: this.timeInterval[0],
+          endTime: this.timeInterval[1],
+          number: Number(this.searchForm.number)
+        }
+      }).then((res) => {
+        if (res.code === 0) {
+          this.responeForm = res.data
+          this.tableData = res.data.unitView
+          this.chartData = res.data.polluteType
+          this.cylindricalityData = res.data.escalationType
+        } else {
+          this.$message.error(res.message)
+        }
+      })
+    },
+    // ������������������list
+    getUnitList() {
+      this.$request({
+        url: '/allocation/unit',
+        method: 'get'
+      }).then((res) => {
+        this.unitList = res.data
+        console.log(' JSON.stringify(this.unitList)', this.unitList)
+      })
+    },
+    getContaminateList() {
+      this.$request({
+        url: '/allocation/contaminate',
+        method: 'get'
+      }).then((res) => {
+        this.polluteList = res.data
+      })
+    }
+  }
+}
+</script>
+
+<style scoped lang="scss">
+$red:  url('~@/assets/images/1.jpg') ;
+$orange:url('~@/assets/images/2.png');
+$yellow:url('~@/assets/images/3.jpg');
+$green:url('~@/assets/images/4.png');
+$bgcolorlist: $red $orange $yellow $green;
+
+.main {
+  /deep/ .el-table__row{
+  font-size: 18px;
+}
+  background: #bbbbbb;
+  min-height: 800px;
+  padding: 15px 10px;
+  overflow: scroll;
+
+  .timeSelect {
+    width: 100%;
+    height: 80px;
+    line-height: 80px;
+    background-color: rgba(255, 255, 255, 1);
+    color: rgba(16, 16, 16, 1);
+    font-size: 14px;
+  }
+
+  .agentSummary {
+    display: flex;
+    justify-content: space-around;
+    align-items: center;
+    height: 195px;
+    background-color: rgba(255, 255, 255, 1);
+    margin-top: 20px;
+
+    @for $i from 1 to length($bgcolorlist) + 1 {
+      .circle:nth-child(#{$i}) {
+        background-repeat: no-repeat;
+        background-size: cover;
+        background-position: center center;
+        background-image: nth($bgcolorlist, $i);
+        // background-image: radial-gradient(ellipse farthest-side at bottom right, rgba(153, 212, 255, 1), 50%, transparent 50%, transparent),
+        //     radial-gradient(ellipse farthest-side at top right, rgba(153, 212, 255, 1), 30%, transparent 30%, transparent);
+      }
+    }
+
+    .circle {
+      box-shadow: 0px 2px 6px 0px rgba(0, 0, 0, 0.4);
+      border-radius: 5px;
+      width: 200px;
+      height: 90px;
+      align-items: center;
+      color: rgba(255, 255, 255, 1);
+      font-size: 20px;
+      font-weight: 700;
+      display: flex;
+      justify-content: center;
+      flex-wrap: wrap;
+      flex-direction: column;
+    }
+  }
+
+  .overviewAndDetails {
+    height: 550px;
+    margin-top: 20px;
+    background-color: rgba(255, 255, 255, 1);
+    padding: 15px;
+
+    .tit {
+      width: 100%;
+      display: inline-block;
+      color: rgba(16, 16, 16, 1);
+      font-size: 24px;
+      text-align: center;
+    }
+
+    .tab {
+      margin-top: 10px;
+    }
+    .caets {
+      width: 100%;
+
+      div {
+        display: inline-block;
+        margin-top: 10px;
+        width: 49%;
+        height: 200px;
+      }
+
+      div:nth-child(1) {
+        border-right: 1px dashed rgba(221, 221, 221, 1);
+      }
+    }
+
+    .chartsTitle {
+      width: 100%;
+
+      p {
+        display: inline-block;
+        width: 49%;
+        text-align: center;
+        font-size: 24px;
+        font-weight: 700;
+      }
+    }
+  }
+}
+</style>

--
Gitblit v1.8.0