From 4bb5b47acbe07a47120b6454483ce411295e0716 Mon Sep 17 00:00:00 2001
From: liukangdong <898885815@qq.com>
Date: 星期四, 06 六月 2024 15:27:37 +0800
Subject: [PATCH] ..

---
 admin/src/views/task/dangetDetail.vue                   |  846 +++++++++++++++++
 admin/src/views/task/visSubDetail.vue                   |  647 +++++++++++++
 /dev/null                                               |  417 --------
 admin/src/views/task/visReportDetail.vue                |  594 ++++++++++++
 admin/src/views/task/index.vue                          |  177 ++-
 admin/src/views/business/reportRecord.vue               |  145 ++
 admin/src/api/platform/index.js                         |   14 
 admin/src/api/business/approve.js                       |   22 
 admin/src/components/business/OperaCarUseBookWindow.vue |   17 
 admin/src/api/business/index.js                         |    1 
 10 files changed, 2,381 insertions(+), 499 deletions(-)

diff --git a/admin/src/api/business/approve.js b/admin/src/api/business/approve.js
index 4c427e6..4c96cf1 100644
--- a/admin/src/api/business/approve.js
+++ b/admin/src/api/business/approve.js
@@ -16,3 +16,25 @@
 export function taskCenterPage (data) {
   return request.post('/visitsAdmin/cloudService/business/staging/taskPage', data)
 }
+// 璁垮璁板綍璇︽儏
+export function getVisitedDetail (data) {
+  return request.get('/visitsAdmin/cloudService/web/visitor/detail', {
+    params: { ...data }
+  })
+}
+// 璁垮鎶ュ璇︽儏
+export function getVisitedReDetail (data) {
+  return request.get('visitsAdmin/cloudService/business/visits/' + data.id)
+}
+// 闅愭偅璇︽儏
+export function hiddenDangerDetail (id) {
+  return request.get('/visitsAdmin/cloudService/business/hiddenDanger/' + id)
+}
+// 浠诲姟涓績 闅愭偅杞氦
+export function transferHiddenDanger (data) {
+  return request.post('/visitsAdmin/cloudService/business/hiddenDanger/transferHiddenDanger', data)
+}
+// 浠诲姟涓績 澶勭悊
+export function dealHiddenDanger (data) {
+  return request.post('/visitsAdmin/cloudService/business/hiddenDanger/dealHiddenDanger', data)
+}
diff --git a/admin/src/api/business/index.js b/admin/src/api/business/index.js
index 1948cdc..9527106 100644
--- a/admin/src/api/business/index.js
+++ b/admin/src/api/business/index.js
@@ -11,3 +11,4 @@
 export function approveTemplByType (type) {
   return request.get(`/visitsAdmin/cloudService/business/approveTempl/${type}`)
 }
+export const uploadUrl = 'visitsAdmin/cloudService/public/upload'
diff --git a/admin/src/api/platform/index.js b/admin/src/api/platform/index.js
new file mode 100644
index 0000000..87e9ea7
--- /dev/null
+++ b/admin/src/api/platform/index.js
@@ -0,0 +1,14 @@
+import request from '@/utils/request'
+
+// 鏈堝彴鍒楄〃
+export function getPlatform (data) {
+  return request.post('/visitsAdmin/cloudService/business/platform/page', data, {
+    trim: true
+  })
+}
+// 鏈堝彴璋冨害涓績 鍒楄〃
+export function getPlatformJob (data) {
+  return request.post('/visitsAdmin/cloudService/business/platformJob/page', data, {
+    trim: true
+  })
+}
diff --git a/admin/src/components/business/OperaCarUseBookWindow.vue b/admin/src/components/business/OperaCarUseBookWindow.vue
index 0e55630..b92af71 100644
--- a/admin/src/components/business/OperaCarUseBookWindow.vue
+++ b/admin/src/components/business/OperaCarUseBookWindow.vue
@@ -298,14 +298,6 @@
 </script>
 
 <style lang="scss" scoped>
-.side_title{
-  font-weight: 600;
-  font-size: 18px;
-  color: #111111;
-  margin-bottom: 20px;
-  margin-left: 20px;
-  margin-top: 20px;
-}
 .upload_box {
   width: 84px;
   height: 84px;
@@ -324,7 +316,14 @@
     font-size: 12px;
   }
 }
-
+.side_title{
+  font-weight: 600;
+  font-size: 18px;
+  color: #111111;
+  margin-bottom: 20px;
+  margin-left: 20px;
+  margin-top: 20px;
+}
 .modal_wrap {
   display: flex;
   height: 100%;
diff --git a/admin/src/views/business/reportRecord.vue b/admin/src/views/business/reportRecord.vue
index 348d2ef..98ee6a0 100644
--- a/admin/src/views/business/reportRecord.vue
+++ b/admin/src/views/business/reportRecord.vue
@@ -1,30 +1,106 @@
 <template>
   <div class="main_app">
-    <QueryForm v-model="filters" :query-form-config="queryFormConfig" @handleQuery="getList(1)" @clear="clear" />
-    <el-table v-loading="loading" :data="list" stripe row-key="id" default-expand-all>
-      <el-table-column prop="" label="鍏ュ洯杞﹁締" min-width="100" show-overflow-tooltip></el-table-column>
-      <el-table-column prop="" label="鍏徃鍚嶇О" min-width="120" show-overflow-tooltip></el-table-column>
-      <el-table-column prop="" label="鑱旂郴浜轰俊鎭�" min-width="100" show-overflow-tooltip></el-table-column>
-      <el-table-column prop="" label="鎵嬫満鍙�" min-width="120" show-overflow-tooltip></el-table-column>
-      <el-table-column prop="" label="琚浜�" min-width="120" show-overflow-tooltip></el-table-column>
-      <el-table-column prop="" label="鎷滆鏃堕棿" min-width="120" show-overflow-tooltip></el-table-column>
-      <el-table-column prop="" label="鎷滆浜嬬敱" min-width="80" show-overflow-tooltip></el-table-column>
-      <el-table-column prop="" fixed="right" label="鐘舵��" min-width="100"></el-table-column>
+    <QueryForm
+      v-model="filters"
+      :query-form-config="queryFormConfig"
+      @handleQuery="getList(1)"
+      @clear="clear"
+    />
+    <el-table
+      v-loading="loading"
+      :data="dataList"
+      stripe
+      row-key="id"
+      default-expand-all
+    >
+      <el-table-column
+        prop="carNos"
+        label="鍏ュ洯杞﹁締"
+        min-width="100px"
+      ></el-table-column>
+      <el-table-column
+        prop="companyName"
+        label="鍏徃鍚嶇О"
+        min-width="100px"
+      ></el-table-column>
+      <el-table-column
+        prop="name"
+        label="鑱旂郴浜轰俊鎭�"
+        min-width="100px"
+      ></el-table-column>
+      <el-table-column
+        prop="phone"
+        label="鎵嬫満鍙�"
+        min-width="100px"
+      ></el-table-column>
+      <el-table-column
+        prop="receptMemberName"
+        label="琚浜�"
+        min-width="100px"
+      ></el-table-column>
+      <el-table-column label="鎷滆鏃堕棿" min-width="170px">
+        <template slot-scope="{ row }">
+          <span>璧凤細{{ row.starttime }}</span
+          ><br />
+          <span>姝細{{ row.endtime }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column
+        prop="reason"
+        label="鎷滆浜嬬敱"
+        min-width="100px"
+      ></el-table-column>
+      <el-table-column
+        prop="status"
+        fixed="right"
+        label="鐘舵��"
+        min-width="100px"
+      >
+        <template slot-scope="{ row }">
+          <span style="color: rgba(245, 154, 35, 0.996)" v-if="row.status === 0"
+            >寰呮彁浜ゅ鎵�</span
+          >
+          <span v-if="row.status === 1" style="color: rgba(245, 154, 35, 0.996)"
+            >瀹℃壒涓�</span
+          >
+          <span v-if="row.status === 2" style="color: rgba(245, 154, 35, 0.996)"
+            >瀹℃牳閫氳繃</span
+          >
+          <span style="color: gray" v-if="row.status === 3">瀹℃牳涓嶉�氳繃</span>
+          <span v-if="row.status === 4" style="color: gray">鍙栨秷</span>
+          <span v-if="row.status === 5" style="color: green">棰勭害鎴愬姛</span>
+          <span v-if="row.status === 6" style="color: gray">棰勭害澶辫触</span>
+          <span v-if="row.status === 7" style="color: green">鎷滆涓�</span>
+          <span v-if="row.status === 8" style="color: red">宸茬绂�</span>
+          <span v-if="row.status === 9" style="color: gray">宸插け鏁�</span>
+        </template>
+      </el-table-column>
       <el-table-column label="鎿嶄綔" width="230" fixed="right">
-        <template slot-scope="{row}">
-          <el-button type="text" @click="handleDetail(row)" v-permissions="['business:company:update']">鏌ョ湅璇︽儏</el-button>
+        <template slot-scope="{ row }">
+          <el-button
+            type="text"
+            @click="handleDetail(row)"
+            v-permissions="['business:company:update']"
+            >鏌ョ湅璇︽儏</el-button
+          >
         </template>
       </el-table-column>
     </el-table>
-    <pagination @size-change="handleSizeChange" @current-change="getList" :pagination="pagination" />
-    <ReportDetail v-if="isShowDetail" ref="DetailRef" />
+    <pagination
+      @size-change="handleSizeChange"
+      @current-change="getList"
+      :pagination="pagination"
+    />
+    <ReportDetail v-if="isShowReport" ref="VisReportDetailRef" />
   </div>
 </template>
 
 <script>
 import Pagination from '@/components/common/Pagination'
 import QueryForm from '@/components/common/QueryForm'
-import ReportDetail from './page-components/ReportDetail.vue'
+// import ReportDetail from './page-components/ReportDetail.vue'
+import ReportDetail from '@/views/task/visReportDetail.vue'
+import { fetchList } from '@/api/business/visits'
 export default {
   components: {
     ReportDetail,
@@ -33,18 +109,19 @@
   },
   data () {
     return {
-      isShowDetail: false,
+      isShowReport: false,
       activeTab: '0',
       filters: {},
+      dataList: [],
       queryFormConfig: {
         formItems: [
           {
-            filed: 'idCard',
+            filed: 'carNos',
             type: 'input',
             label: '杞︾墝鍙�'
           },
           {
-            filed: 'name',
+            filed: 'companyName',
             type: 'input',
             label: '鍏徃鍚嶇О'
           }
@@ -60,19 +137,38 @@
         capacity: 10,
         page: 1
       },
-      list: [{}],
       total: 0
     }
   },
+  created () {
+    this.getList()
+  },
   methods: {
-    handleDetail () {
-      this.isShowDetail = true
+    handleDetail (row) {
+      this.isShowReport = true
       this.$nextTick(() => {
-        this.$refs.DetailRef.isShowModal = true
+        this.$nextTick(() => {
+          this.$refs.VisReportDetailRef.id = row.id
+          this.$refs.VisReportDetailRef.type = 1
+          this.$refs.VisReportDetailRef.getDetail()
+          this.$refs.VisReportDetailRef.isShowModal = true
+        })
       })
     },
-    getList (page) {},
-    clear () { },
+    getList (page) {
+      const { pagination, filters } = this
+      pagination.page = page || pagination.page
+      fetchList({
+        model: { ...filters, type: 2 },
+        ...pagination
+      }).then(res => {
+        this.dataList = res.records || []
+      })
+    },
+    clear () {
+      this.filters = {}
+      this.getList(0)
+    },
     handleSizeChange (capacity) {
       this.pagination.capacity = capacity
     }
@@ -81,5 +177,4 @@
 </script>
 
 <style lang="scss" scoped>
-
 </style>
diff --git a/admin/src/views/task/dangetDetail.vue b/admin/src/views/task/dangetDetail.vue
new file mode 100644
index 0000000..76d3a71
--- /dev/null
+++ b/admin/src/views/task/dangetDetail.vue
@@ -0,0 +1,846 @@
+<template>
+  <GlobalWindow :title="title" :visible.sync="isShowModal" @confirm="confirm">
+    <div class="modal_wrap">
+      <div class="modal_content">
+        <div class="header">
+          <div class="left">
+            <div class="h1">{{ cateList[type] }}</div>
+            <div class="time">鎻愪氦鏃堕棿锛歿{ info.createDate }}</div>
+          </div>
+          <div class="right">{{ statusMap[info.status] }}</div>
+        </div>
+        <div class="info">
+          <div class="title">闅愭偅闅忔墜鎷嶄俊鎭�</div>
+          <div class="list">
+            <div class="item">
+              <div class="label">鎻愭姤浜�</div>
+              <div class="value">
+                {{ info.memberName }} {{ info.memberPhone }}
+              </div>
+            </div>
+            <div class="item">
+              <div class="label">闅愭偅鍖哄煙</div>
+              <div class="value">{{ info.areaName }}</div>
+            </div>
+            <div class="item">
+              <div class="label">闅愭偅绫诲瀷</div>
+              <div class="value">{{ info.categoryName }}</div>
+            </div>
+            <div class="item">
+              <div class="label">闅愭偅鎻忚堪</div>
+              <div class="value">{{ info.content }}</div>
+            </div>
+            <div class="item file">
+              <div class="label">鐜板満鎯呭喌</div>
+              <div class="value">
+                <div class="file_list">
+                  <template v-for="item in info.submitFileList">
+                    <img
+                      v-if="item.type == 0"
+                      :key="item.id"
+                      :src="item.fileurlFull"
+                      mode="widthFix"
+                      class="img"
+                    />
+                    <video
+                      v-if="item.type == 1"
+                      :key="item.id"
+                      :src="item.fileurlFull"
+                      class="img"
+                      controls
+                    />
+                  </template>
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="side">
+        <div class="side_title">瀹℃壒娴佺▼</div>
+        <div
+          class="list"
+          v-if="
+            info.approveDateVO != null && info.approveDateVO.approveList != null
+          "
+        >
+          <div
+            class="item"
+            v-for="(item, index) in info.approveDateVO.approveList"
+            :key="item.id"
+          >
+            <div
+              class="separate"
+              v-if="index < info.approveDateVO.approveList.length - 1"
+            ></div>
+            <div class="info">
+              <img
+                src="@/assets/icons/ic_tongguo.png"
+                class="iconnew"
+                v-if="item.status == 2"
+              />
+              <img
+                src="@/assets/icons/ic_dangqian.png"
+                class="iconnew"
+                v-if="item.status == 1"
+              />
+              <img
+                src="@/assets/icons/ic_jujue.png"
+                class="iconnew"
+                v-if="item.status == 3"
+              />
+              <img
+                src="@/assets/icons/ic_grey.png"
+                class="iconnew"
+                v-if="item.status == null || item.status == 0"
+              />
+              <div style="display: inline" v-if="item.approveType != 1">
+                <img
+                  v-if="item.faceImg != null && item.faceImg != ''"
+                  :src="item.faceImg"
+                  class="avatar"
+                  alt=""
+                />
+                <img
+                  v-if="item.faceImg == null || item.faceImg == ''"
+                  src="@/assets/avatar/man.png"
+                  class="avatar"
+                  alt=""
+                />
+              </div>
+              <div style="display: inline" v-if="item.approveType == 1">
+                <img
+                  v-if="item.type != 1"
+                  src="@/assets/icons/ic_duoren.png"
+                  class="avatar"
+                  alt=""
+                />
+                <img
+                  v-if="item.type == 1"
+                  src="@/assets/icons/ic_chaosong.png"
+                  class="avatar"
+                  alt=""
+                />
+              </div>
+              <div class="content">
+                <div class="line">
+                  <div class="name">{{ item.title }}</div>
+                  <div class="time">{{ item.checkDate }}</div>
+                </div>
+                <div class="line">
+                  <div class="company">
+                    {{ item.memberName }}
+                    <div
+                      style="display: inline"
+                      v-if="item.statusInfo != null && item.statusInfo != ''"
+                    >
+                      锛�<span class="status-green">{{
+                        item.statusInfo || ""
+                      }}</span
+                      >锛�
+                    </div>
+                  </div>
+                </div>
+              </div>
+            </div>
+            <div
+              v-if="
+                item.approveType != 1 &&
+                item.checkInfo != null &&
+                item.checkInfo != ''
+              "
+              class="remark"
+            >
+              {{ item.checkInfo || "" }}
+            </div>
+            <div v-if="item.approveType == 1" class="childList">
+              <div
+                class="m_content company"
+                v-for="item1 in item.approveList"
+                :key="item1.id"
+              >
+                <img
+                  v-if="item1.faceImg != null && item1.faceImg != ''"
+                  :src="item1.faceImg"
+                  class="avatar"
+                  alt=""
+                />
+                <img
+                  v-if="item1.faceImg == null || item1.faceImg == ''"
+                  src="@/assets/avatar/man.png"
+                  class="avatar"
+                  alt=""
+                />
+                <span> {{ item1.memberName }}</span>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <!--  -->
+    <template v-slot:footer>
+      <el-button @click="handleAppr" type="primary" class="status-red"
+        >澶勭悊</el-button
+      >
+      <el-button @click="isShowTransfer = true" type="primary" plain
+        >杞氦</el-button
+      >
+      <el-button @click="isShowBack = true" type="danger" plain>閫�鍥�</el-button>
+      <el-button @click="isShowModal = false">杩斿洖</el-button>
+    </template>
+    <!--  鍚屾剰/鎷掔粷 -->
+    <el-dialog
+      append-to-body
+      title="闅愭偅杞氦"
+      :visible.sync="isShowTransfer"
+      width="600px"
+    >
+      <el-form
+        :model="transferForm"
+        :rules="handleRules"
+        ref="transferForm"
+        label-width="100px"
+        class="demo-ruleForm"
+      >
+        <el-form-item label="闅愭偅杞氦浜�" prop="checkUserId">
+          <el-select
+            v-model="transferForm.checkUserId"
+            filterable
+            placeholder="璇烽�夋嫨 鍗曢��"
+          >
+            <el-option
+              v-for="item in memberList"
+              :key="item.id"
+              :label="item.name"
+              :value="item.id"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="isShowTransfer = false">鍙栨秷</el-button>
+        <el-button :loading="subLoading" type="primary" @click="onTransfer"
+          >纭畾</el-button
+        >
+      </span>
+    </el-dialog>
+    <!-- 闅愭偅 -->
+    <el-dialog
+      append-to-body
+      title="闅愭偅鏁存敼"
+      :visible.sync="isShowProblem"
+      width="600px"
+    >
+      <el-form
+        :model="handleParam"
+        :rules="handleRules"
+        ref="handleForm"
+        label-width="100px"
+      >
+        <el-form-item label="鏁存敼鏃堕棿" prop="dealTime">
+          <el-date-picker
+            class="w300"
+            value-format="yyyy-MM-dd hh:mm:ss"
+            type="datetime"
+            placeholder="閫夋嫨鏃ユ湡"
+            v-model="handleParam.dealTime"
+          />
+        </el-form-item>
+        <el-form-item label="鏁存敼鍓�" prop="dealBeforeFileList">
+          <div class="upload_wrap">
+            <el-upload
+              class="avatar-uploader"
+              :action="uploadUrl"
+              :show-file-list="false"
+              :on-success="handleAvatarSuccess"
+              :before-upload="beforeAvatarUpload"
+            >
+              <img v-if="param.url" :src="param.url" class="avatar" />
+              <div v-else class="upload_box">
+                <el-icon class="el-icon-plus icon" />
+                <div class="text">鍥剧墖/瑙嗛</div>
+              </div>
+            </el-upload>
+            <template v-if="handleParam.dealBeforeFileList">
+              <div
+                class="img_wrap"
+                v-for="(img, i) in handleParam.dealBeforeFileList"
+                :key="i"
+              >
+                <img v-if="img.type == 0" :src="img.fileurlFull" alt="" />
+                <video
+                  v-if="img.type == 1"
+                  :src="img.fileurlFull"
+                  controls
+                  alt=""
+                />
+              </div>
+            </template>
+          </div>
+        </el-form-item>
+        <el-form-item label="鏁存敼鍚�" prop="dealAfterFileList">
+          <div class="upload_wrap">
+            <el-upload
+              class="avatar-uploader"
+              :action="uploadUrl"
+              :show-file-list="false"
+              :on-success="handleAfterSuccess"
+              :before-upload="beforeAvatarUpload"
+            >
+              <img v-if="param.url" :src="param.url" class="avatar" />
+              <div v-else class="upload_box">
+                <el-icon class="el-icon-plus icon" />
+                <div class="text">鍥剧墖/瑙嗛</div>
+              </div>
+            </el-upload>
+            <template v-if="handleParam.dealAfterFileList">
+              <div
+                class="img_wrap"
+                v-for="(img, i) in handleParam.dealAfterFileList"
+                :key="i"
+              >
+                <img v-if="img.type == 0" :src="img.fileurlFull" alt="" />
+                <video
+                  v-if="img.type == 1"
+                  :src="img.fileurlFull"
+                  controls
+                  alt=""
+                />
+              </div>
+            </template>
+          </div>
+        </el-form-item>
+        <el-form-item label="鏁存敼璇存槑">
+          <el-input
+            type="textarea"
+            placeholder="璇峰~鍐欒鏄�"
+            :rows="4"
+            v-model="handleParam.checkInfo"
+          />
+        </el-form-item>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="isShowProblem = false">鍙栨秷</el-button>
+        <el-button type="primary" :loading="subLoading" @click="onSubAppr"
+          >纭畾</el-button
+        >
+      </span>
+    </el-dialog>
+    <el-dialog
+      append-to-body
+      title="闅愭偅閫�鍥�"
+      :visible.sync="isShowBack"
+      width="600px"
+    >
+      <el-form
+        :model="backForm"
+        :rules="handleRules"
+        ref="backForm"
+        label-width="100px"
+      >
+        <el-form-item label="鏁存敼鏃堕棿" prop="dealTime">
+          <el-date-picker
+            class="w300"
+            value-format="yyyy-MM-dd hh:mm:ss"
+            type="datetime"
+            placeholder="閫夋嫨鏃ユ湡"
+            v-model="backForm.dealTime"
+          />
+        </el-form-item>
+        <el-form-item label="鏁存敼鍓�">
+          <div class="upload_wrap">
+            <el-upload
+              class="avatar-uploader"
+              :action="uploadUrl"
+              :show-file-list="false"
+              :on-success="handleBackSuccess"
+              :before-upload="beforeAvatarUpload"
+            >
+              <div class="upload_box">
+                <el-icon class="el-icon-plus icon" />
+                <div class="text">鍥剧墖/瑙嗛</div>
+              </div>
+            </el-upload>
+            <template v-if="backForm.dealBeforeFileList">
+              <div
+                class="img_wrap"
+                v-for="(img, i) in backForm.dealBeforeFileList"
+                :key="i"
+              >
+                <img v-if="img.type == 0" :src="img.fileurlFull" alt="" />
+                <video
+                  v-if="img.type == 1"
+                  :src="img.fileurlFull"
+                  controls
+                  alt=""
+                />
+              </div>
+            </template>
+          </div>
+        </el-form-item>
+        <el-form-item label="鏁存敼璇存槑">
+          <el-input
+            type="textarea"
+            placeholder="璇峰~鍐欒鏄�"
+            :rows="4"
+            v-model="backForm.checkInfo"
+          />
+        </el-form-item>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="isShowBack = false">鍙栨秷</el-button>
+        <el-button type="primary" :loading="subLoading" @click="onSubBack"
+          >纭畾</el-button
+        >
+      </span>
+    </el-dialog>
+  </GlobalWindow>
+</template>
+
+<script>
+import GlobalWindow from '@/components/common/GlobalWindow'
+import { memberList } from '@/api/business/hiddenDangerParam'
+import {
+  uploadFile,
+  hiddenDangerDetail,
+  dealHiddenDanger,
+  transferHiddenDanger
+} from '@/api/index'
+
+export default {
+  components: { GlobalWindow },
+  data () {
+    return {
+      id: '',
+      type: '',
+      uploadUrl: uploadFile,
+
+      title: '璁垮棰勭害璇︽儏',
+      isShowModal: false,
+      info: {},
+      isShowAppr: false,
+      apprTitle: '鍚屾剰',
+      subLoading: false,
+      param: {},
+      handleParam: {},
+      backForm: {},
+      isShowBack: false,
+      isShowTransfer: false,
+      transferForm: {},
+      memberList: [],
+      isShowProblem: false,
+      rules: {
+        checkInfo: [{ required: true, message: '璇疯緭鍏�', trigger: 'blur' }]
+      },
+      handleRules: {
+        dealTime: [{ required: true, message: '璇烽�夋嫨', trigger: 'change' }],
+        dealBeforeFileList: [{ type: 'array', required: true, message: '璇烽�夋嫨', trigger: 'change' }],
+        checkUserId: [{ required: true, message: '璇烽�夋嫨', trigger: 'change' }],
+        dealAfterFileList: [{ type: 'array', required: true, message: '璇烽�夋嫨', trigger: 'change' }]
+      },
+      statusMap: {
+        0: '寰呭鎵�',
+        1: '瀹℃壒涓�',
+        2: '瀹℃壒閫氳繃',
+        3: '瀹℃壒鏈�氳繃',
+        4: '宸插彇娑�',
+        5: '浠栦汉鎴栫',
+        6: '浠栦汉鎷掔粷'
+      },
+      cateList: {
+        0: '璁垮鐢宠',
+        1: '璁垮鎶ュ',
+        2: '鐢ㄨ溅鐢宠',
+        3: '闅愭偅闅忔墜鎷�',
+        4: '鐗╂祦杞︾敵璇�'
+      }
+    }
+  },
+  created() {
+    this.getMemberList()
+  },
+  methods: {
+    onSubAppr () {
+      this.$refs.handleForm.validate((valid) => {
+        if (!valid) {
+          return
+        }
+        this.subLoading = true
+        dealHiddenDanger({
+          ...this.handleParam,
+          status: 1,
+          id: this.id
+        })
+          .then(res => {
+            this.subLoading = false
+            this.$tip.apiSuccess('澶勭悊鎴愬姛')
+            this.getDetail()
+            this.isShowProblem = false
+          })
+          .finally(() => {
+            this.subLoading = false
+          })
+      })
+    },
+    onSubBack () {
+      this.$refs.backForm.validate((valid) => {
+        if (!valid) {
+          return
+        }
+        this.subLoading = true
+        dealHiddenDanger({
+          ...this.backForm,
+          status: 2,
+          id: this.id
+        })
+          .then(res => {
+            this.subLoading = false
+            this.$tip.apiSuccess('閫�鍥炴垚鍔�')
+            this.getDetail()
+            this.isShowProblem = false
+          })
+          .finally(() => {
+            this.subLoading = false
+          })
+      })
+    },
+    onTransfer () {
+      this.$refs.transferForm.validate((valid) => {
+        if (!valid) {
+          return
+        }
+        this.subLoading = true
+        transferHiddenDanger({
+          ...this.transferForm,
+          id: this.id
+        })
+          .then(res => {
+            this.subLoading = false
+            if (res.code !== 200) return
+            this.$tip.apiSuccess('杞氦鎴愬姛')
+            this.getDetail()
+            this.isShowTransfer = false
+          })
+          .finally(() => {
+            this.subLoading = false
+          })
+      })
+    },
+    getMemberList () {
+      memberList({}).then(res => {
+        this.memberList = res || []
+      })
+    },
+    getDetail () {
+      const { id } = this
+      hiddenDangerDetail(id).then(res => {
+        this.info = res
+      })
+    },
+    handleAppr (val) {
+      this.isShowProblem = true
+    },
+    confirm () {
+      console.log('--')
+    },
+    handleTransfer () {
+      this.isShowProblem = true
+    },
+    reject () { },
+    handleAvatarSuccess (res) {
+      if (res.code === 200) {
+        const str = res.data.url.indexOf('png') > 0 || res.data.url.indexOf('jpg') > 0
+        const arr = this.handleParam.dealBeforeFileList || []
+        arr.push({
+          type: str ? 0 : 1,
+          fileurl: res.data.imgaddr,
+          fileurlFull: res.data.url
+        })
+        this.$set(this.handleParam, 'dealBeforeFileList', arr)
+      }
+    },
+    handleAfterSuccess (res) {
+      if (res.code === 200) {
+        const str = res.data.url.indexOf('png') > 0 || res.data.url.indexOf('jpg') > 0
+        const arr = this.handleParam.dealAfterFileList || []
+        arr.push({
+          type: str ? 0 : 1,
+          fileurl: res.data.imgaddr,
+          fileurlFull: res.data.url
+        })
+        this.$set(this.handleParam, 'dealAfterFileList', arr)
+      }
+    },
+    handleBackSuccess (res) {
+      if (res.code === 200) {
+        const str = res.data.url.indexOf('png') > 0 || res.data.url.indexOf('jpg') > 0
+        const arr = this.backForm.dealBeforeFileList || []
+        arr.push({
+          type: str ? 0 : 1,
+          fileurl: res.data.imgaddr,
+          fileurlFull: res.data.url
+        })
+        this.$set(this.backForm, 'dealBeforeFileList', arr)
+      }
+    },
+    beforeAvatarUpload () { }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.upload_wrap {
+  display: flex;
+  flex-wrap: wrap;
+  .img_wrap {
+    width: 85px;
+    margin-right: 10px;
+    margin-bottom: 10px;
+    img,
+    video {
+      width: 100%;
+    }
+  }
+}
+.upload_box {
+  width: 84px;
+  height: 84px;
+  border-radius: 4px;
+  background-color: #f7f7f7;
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  align-items: center;
+  color: #999999;
+  border: 1px solid #e4e4e4;
+  .icon {
+    font-size: 24px;
+  }
+  .text {
+    font-size: 12px;
+  }
+}
+.side_title {
+  font-weight: 600;
+  font-size: 18px;
+  color: #111111;
+  margin-bottom: 20px;
+  margin-left: 20px;
+  margin-top: 20px;
+}
+.modal_wrap {
+  display: flex;
+  height: 100%;
+  .modal_content {
+    flex: 1;
+    padding: 0px 30px;
+    border-radius: 8px;
+    overflow: hidden;
+    height: 100%;
+
+    .title {
+      font-weight: 600;
+      font-size: 18px;
+      color: #333333;
+      margin-bottom: 20px;
+      margin-top: 30px;
+    }
+    .info {
+      .list {
+        display: flex;
+        flex-wrap: wrap;
+
+        .item {
+          display: flex;
+          width: 40%;
+          margin-bottom: 20px;
+          &:nth-of-type(2n) {
+            width: 60%;
+          }
+
+          .label {
+            color: #888888;
+            width: 100px;
+          }
+          .file_list {
+            display: flex;
+            .img {
+              width: 200px;
+              margin-right: 12px;
+              margin-bottom: 12px;
+            }
+          }
+          .value {
+            color: #111111;
+          }
+        }
+        .file {
+          width: 100%;
+        }
+      }
+    }
+
+    .header {
+      display: flex;
+      justify-content: space-between;
+      align-items: center;
+      padding: 20px 30px;
+      margin: 0 -30px;
+      border-radius: 8px 8px 0 0;
+      background: linear-gradient(to right, #f2f6fe, #cadffa);
+
+      .h1 {
+        font-weight: 600;
+        font-size: 22px;
+        color: #111111;
+        margin-bottom: 8px;
+      }
+
+      .time {
+        font-size: 14px;
+        color: #999999;
+      }
+
+      .right {
+        height: 40px;
+        font-size: 16px;
+        color: #ffffff;
+        line-height: 40px;
+        padding: 0 20px;
+        background: #207ff7;
+        box-shadow: 4px 4px 0px 0px rgba(32, 127, 247, 0.16);
+        border-radius: 16px 0px 16px 0px;
+      }
+    }
+    .table_info {
+      .name_wrap {
+        display: flex;
+        align-items: center;
+        .avatar {
+          width: 40px;
+          height: 40px;
+          border-radius: 50%;
+          margin-right: 12px;
+        }
+        .content {
+          .line {
+            display: flex;
+          }
+          .tag {
+            color: #b2cbf9;
+            border: 1px solid #b2cbf9;
+            padding: 0px 4px;
+            border-radius: 4px;
+            margin-left: 6px;
+          }
+        }
+      }
+    }
+  }
+
+  .side {
+    height: 100%;
+    width: 420px;
+    background: #ffffff;
+    border-left: 20px solid #f7f7f7;
+    .list {
+      .item {
+        padding: 8px 0;
+        position: relative;
+        .separate {
+          position: absolute;
+          border-left: 2px dashed #cccccc;
+          left: 31px;
+          height: calc(100% - 36px);
+          top: 49px;
+        }
+        .avatar {
+          width: 40px;
+          height: 40px;
+          border-radius: 50%;
+          margin: 0 12px 0 16px;
+          //border: 1px solid;
+        }
+        .childList {
+          display: flex;
+          flex-wrap: wrap;
+          margin-left: 100px;
+        }
+        .company {
+          font-size: 13px;
+          color: #888888;
+          .status {
+            color: #00ba67;
+          }
+        }
+        .m_content {
+          display: flex;
+          flex-direction: column;
+          align-items: center;
+          justify-content: center;
+          margin-bottom: 4px;
+        }
+        .info {
+          display: flex;
+          align-items: center;
+          margin-left: 20px;
+          .icon {
+            position: relative;
+            z-index: 11;
+            color: #53b76f;
+            font-size: 24px;
+          }
+          .icon1 {
+            position: relative;
+            z-index: 11;
+            color: deepskyblue;
+            font-size: 24px;
+          }
+          .icon2 {
+            position: relative;
+            z-index: 11;
+            color: #dc362e;
+            font-size: 24px;
+          }
+          .iconnew {
+            width: 24px;
+            height: 24px;
+          }
+          .icon3 {
+            position: relative;
+            z-index: 11;
+            color: gray;
+            font-size: 24px;
+          }
+          .content {
+            flex: 1;
+            .line {
+              display: flex;
+              justify-content: space-between;
+              align-content: center;
+              margin-bottom: 6px;
+              .name {
+                font-weight: 600;
+                font-size: 16px;
+                color: #111111;
+              }
+              .time {
+                color: #888888;
+              }
+            }
+          }
+        }
+        .remark {
+          background: #f7f7f7;
+          border-radius: 4px;
+          padding: 13px 15px;
+          color: #666666;
+          margin-left: 100px;
+        }
+      }
+    }
+  }
+}
+</style>
diff --git a/admin/src/views/task/index.vue b/admin/src/views/task/index.vue
index 0e66235..fd6b9ad 100644
--- a/admin/src/views/task/index.vue
+++ b/admin/src/views/task/index.vue
@@ -7,12 +7,13 @@
       @clear="clear"
     />
     <!--  -->
-    <el-tabs v-model="filters.queryType">
+    <el-tabs v-model="filters.queryType" @tab-click="(e) => getList(1)">
       <el-tab-pane label="寰呭鐞�" name="0">
         <template #label>
           <span
             >寰呭鐞�
             <el-badge
+              v-if="headData.noticeWaitNum"
               :value="headData.noticeWaitNum"
               class="item"
               type="danger"
@@ -21,21 +22,48 @@
           </span>
         </template>
       </el-tab-pane>
-      <el-tab-pane
-        :value="headData.noticeDealNum"
-        label="宸插鐞�"
-        name="1"
-      ></el-tab-pane>
-      <el-tab-pane
-        :value="headData.noticeCreateNum"
-        label="鎴戝彂璧风殑"
-        name="2"
-      ></el-tab-pane>
-      <el-tab-pane
-        :value="headData.noticeCopyNum"
-        label="鎶勯�佹垜鐨�"
-        name="3"
-      ></el-tab-pane>
+      <el-tab-pane :value="headData.noticeDealNum" label="宸插鐞�" name="1">
+        <template #label>
+          <span
+            >宸插鐞�
+            <el-badge
+              v-if="headData.noticeDealNum"
+              :value="headData.noticeDealNum"
+              class="item"
+              type="danger"
+            >
+            </el-badge>
+          </span>
+        </template>
+      </el-tab-pane>
+      <el-tab-pane :value="headData.noticeCreateNum" label="鎴戝彂璧风殑" name="2">
+        <template #label>
+          <span
+            >鎴戝彂璧风殑
+            <el-badge
+              v-if="headData.noticeCreateNum"
+              :value="headData.noticeCreateNum"
+              class="item"
+              type="danger"
+            >
+            </el-badge>
+          </span>
+        </template>
+      </el-tab-pane>
+      <el-tab-pane :value="headData.noticeCopyNum" label="鎶勯�佹垜鐨�" name="3">
+        <template #label>
+          <span
+            >鎶勯�佹垜鐨�
+            <el-badge
+              v-if="headData.noticeCopyNum"
+              :value="headData.noticeCopyNum"
+              class="item"
+              type="danger"
+            >
+            </el-badge>
+          </span>
+        </template>
+      </el-tab-pane>
     </el-tabs>
     <el-table
       v-loading="loading"
@@ -46,19 +74,24 @@
     >
       <el-table-column prop="name" label="浠诲姟绫诲瀷" min-width="100">
         <template v-slot="scope">
-          <span>{{ cateList[scope.row.objType].name }}</span>
+          <span
+            v-if="
+              (scope.row.objType || scope.row.objType == 0) &&
+              cateList[scope.row.objType].name
+            "
+            >{{ cateList[scope.row.objType].name }}</span
+          >
         </template>
       </el-table-column>
-      <el-table-column
-        prop="name"
-        label="鎻愪氦浜�"
-        min-width="80"
-      ></el-table-column>
-      <el-table-column
-        prop="createDate"
-        label="鎻愪氦鏃堕棿"
-        min-width="100"
-      ></el-table-column>
+      <el-table-column label="鎻愪氦浜�" min-width="80">
+        <template v-slot="scope">
+          <span v-if="scope.row.title">{{
+            scope.row.title.split(" - ")[1]
+          }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="createDate" label="鎻愪氦鏃堕棿" min-width="100">
+      </el-table-column>
       <el-table-column label="鎿嶄綔" width="230" fixed="right">
         <template slot-scope="{ row }">
           <el-button
@@ -76,13 +109,26 @@
       :pagination="pagination"
     />
     <TaskDetail v-if="isShowDetail" ref="DetailRef" />
+    <VisReportDetail v-if="isShowReport" ref="VisReportDetailRef" />
+    <DangetDetail v-if="isShowDanger" ref="DangetDetailRef" />
+    <!-- 鐢ㄨ溅鐢宠 -->
+    <OperaCarUseBookWindow ref="OperaDetailsWindow" @success="getList"/>
+    <!-- 闅愭偅 -->
+    <OperaHiddenDangerWindow ref="OperaHiddenDangerWindow" @success="getList"/>
+    <!-- 棰勭害璇︽儏 -->
+     <OperaVisitsDesWindow ref="OperaVisitsDesWindow" />
   </div>
 </template>
 
 <script>
 import Pagination from '@/components/common/Pagination'
 import QueryForm from '@/components/common/QueryForm'
-import TaskDetail from './taskDetail.vue'
+import TaskDetail from './visSubDetail.vue'
+import VisReportDetail from './visReportDetail.vue'
+import DangetDetail from './dangetDetail.vue'
+import OperaCarUseBookWindow from '@/components/business/OperaCarUseBookWindow'
+import OperaHiddenDangerWindow from '@/components/business/OperaHiddenDangerWindow'
+import OperaVisitsDesWindow from '@/components/business/OperaVisitsDesWindow'
 import {
   taskCenterHead,
   taskCenterPage
@@ -90,14 +136,21 @@
 export default {
   components: {
     TaskDetail,
+    VisReportDetail,
+    DangetDetail,
     QueryForm,
-    Pagination
+    Pagination,
+    OperaCarUseBookWindow,
+    OperaHiddenDangerWindow,
+    OperaVisitsDesWindow
   },
   data () {
     return {
       isShowDetail: false,
+      isShowReport: false,
+      isShowDanger: false,
       filters: {
-        queryType: 0
+        queryType: '0'
       },
       queryFormConfig: {
         formItems: [
@@ -105,12 +158,13 @@
             filed: 'type',
             type: 'select',
             label: '浠诲姟绫诲瀷',
+            clearable: false,
             options: [
-              { label: '璁垮鐢宠', value: 0 },
-              { label: '璁垮鎶ュ', value: 1 },
-              { label: '鐢ㄨ溅鐢宠', value: 2 },
-              { label: '闅愭偅闅忔墜鎷�', value: 3 },
-              { label: '鐗╂祦杞︾敵璇�', value: 4 }
+              { label: '璁垮鐢宠', value: '0' },
+              { label: '璁垮鎶ュ', value: '1' },
+              { label: '鐢ㄨ溅鐢宠', value: '2' },
+              { label: '闅愭偅闅忔墜鎷�', value: '3' },
+              { label: '鐗╂祦杞︾敵璇�', value: '4' }
             ]
           },
           {
@@ -121,15 +175,11 @@
         ],
         online: true
       },
-      loading: false,
-      sorting: false,
-      searchForm: {
-        // type: 1
-      },
       pagination: {
         capacity: 10,
         page: 1
       },
+      loading: false,
       dataList: [],
       headData: {},
       total: 0,
@@ -148,23 +198,49 @@
     this.getList()
   },
   methods: {
-    handleDetail () {
-      this.isShowDetail = true
-      this.$nextTick(() => {
-        this.$refs.DetailRef.isShowModal = true
-      })
+    handleDetail (row) {
+      if (row.objType === 2) {
+        this.$refs.OperaDetailsWindow.open('鍏姟杞︾敵璇疯鎯�', row)
+        return
+      }
+      if (row.objType === 1) {
+        this.isShowReport = true
+        this.$nextTick(() => {
+          this.$refs.VisReportDetailRef.id = row.objId
+          this.$refs.VisReportDetailRef.type = row.objType
+          this.$refs.VisReportDetailRef.getDetail()
+          this.$refs.VisReportDetailRef.isShowModal = true
+        })
+        return
+      }
+      if (row.objType === 3) {
+        const obj = { ...row, id: row.objId }
+        this.$refs.OperaHiddenDangerWindow.open('闅愭偅闅忔墜鎷嶈鎯�', obj)
+        return
+      }
+      if (row.objType === 0) {
+        this.isShowDetail = true
+        this.$nextTick(() => {
+          this.$refs.DetailRef.id = row.objId
+          this.$refs.DetailRef.type = row.objType
+          this.$refs.DetailRef.getDetail()
+          this.$refs.DetailRef.isShowModal = true
+        })
+      }
     },
     getList (page) {
+      console.log(this.filters)
       const { filters, pagination } = this
-      if (filters.selDate && filters.length > 0) {
+      if (filters.selDate && filters.selDate.length > 0) {
         filters.startDate = filters.selDate[0]
         filters.endDate = filters.selDate[1]
       } else {
         filters.startDate = null
         filters.endDate = null
       }
+      pagination.page = page || pagination.page
       taskCenterPage({
-        model: { ...filters },
+        model: { ...filters, queryType: Number(filters.queryType) },
         ...pagination
       }).then(res => {
         console.log('res', res)
@@ -181,7 +257,12 @@
         this.headData = res
       })
     },
-    clear () { },
+    clear () {
+      this.filters = {
+        queryType: '0'
+      }
+      this.getList(0)
+    },
     handleSizeChange (capacity) {
       this.pagination.capacity = capacity
     }
diff --git a/admin/src/views/task/taskDetail.vue b/admin/src/views/task/taskDetail.vue
deleted file mode 100644
index 3337491..0000000
--- a/admin/src/views/task/taskDetail.vue
+++ /dev/null
@@ -1,417 +0,0 @@
-<template>
-  <GlobalWindow
-    :title="title"
-    text="鍚屾剰"
-    backText="鎷掔粷"
-    :visible.sync="isShowModal"
-    @confirm="confirm"
-    @close="reject"
-  >
-    <div class="modal_wrap">
-      <div class="modal_content">
-        <div class="header">
-          <div class="left">
-            <div class="h1">璁垮棰勭害</div>
-            <div class="time">鎻愪氦鏃堕棿锛�</div>
-          </div>
-          <div class="right">寰呭鏍�</div>
-        </div>
-        <div class="info">
-          <div class="title">璁垮棰勭害淇℃伅</div>
-          <div class="list">
-            <div class="item">
-              <div class="label">琚浜�</div>
-              <div class="value"></div>
-            </div>
-            <div class="item">
-              <div class="label">鏉ヨ鏃堕棿</div>
-              <div class="value"></div>
-            </div>
-            <div class="item">
-              <div class="label">鏉ヨ浜嬬敱</div>
-              <div class="value"></div>
-            </div>
-            <div class="item">
-              <div class="label">闅忚杞﹁締</div>
-              <div class="value"></div>
-            </div>
-            <div class="item">
-              <div class="label">鏂藉伐浜哄憳</div>
-              <div class="value"></div>
-            </div>
-            <div class="item">
-              <div class="label">鏂藉伐鍐呭</div>
-              <div class="value"></div>
-            </div>
-          </div>
-        </div>
-        <div class="table_info">
-          <div class="title">璁垮淇℃伅</div>
-          <el-table :data="detail.datalist" border fit>
-            <el-table-column label="濮撳悕" prop="" min-width="150">
-              <template slot-scope="{ row }">
-                <div class="name_wrap">
-                  <image src="" class="avatar" mode="" />
-                  <div class="content">
-                    <div class="line">
-                      <div class="name">鏉庝笢</div>
-                      <div class="tag">鐢宠浜�</div>
-                    </div>
-                    <div class="line placeholder9">1888888</div>
-                  </div>
-                </div>
-              </template>
-            </el-table-column>
-            <el-table-column label="鎬у埆" prop="" min-width="40" />
-            <el-table-column label="璇佷欢绫诲瀷" prop="" min-width="80" />
-            <el-table-column label="璇佷欢鍙风爜" prop="" min-width="120" />
-            <el-table-column label="鍏徃鍚嶇О" prop="" min-width="120" />
-            <el-table-column label="浜鸿劯鐓х墖" prop="" min-width="80">
-              <template slot-scope="{ row }">
-                <el-image :src="row.url" :preview-src-list="[row.url]"> </el-image>
-              </template>
-            </el-table-column>
-          </el-table>
-        </div>
-      </div>
-      <div class="side">
-        <div class="side_title">瀹℃壒娴佺▼</div>
-        <div class="list">
-          <div class="item">
-            <div class="separate"></div>
-            <div class="info">
-              <i class="el-icon-success icon"></i>
-              <img src="" class="avatar" alt="" />
-              <div class="content">
-                <div class="line">
-                  <div class="name">鍒樻煇鍒樻煇</div>
-                  <div class="time">2020-02-02 12:20</div>
-                </div>
-                <div class="line">
-                  <div class="company">涓浗绉诲姩鏈夐檺鍏徃</div>
-                </div>
-              </div>
-            </div>
-          </div>
-          <div class="item">
-            <!-- <div v-if="" class="separate"></div> -->
-            <div class="info">
-              <i class="el-icon-success icon"></i>
-              <img src="" class="avatar" alt="" />
-              <div class="content">
-                <div class="line">
-                  <div class="name">鍒樻煇鍒樻煇</div>
-                  <div class="time">2020-02-02 12:20</div>
-                </div>
-                <div class="line">
-                  <div class="company">
-                    涓浗绉诲姩鏈夐檺鍏徃( <span class="status">宸插悓鎰�</span> )
-                  </div>
-                </div>
-              </div>
-            </div>
-            <div class="remark">鎻愪氦绾﹀ソ鐨�</div>
-          </div>
-        </div>
-      </div>
-    </div>
-    <!--  -->
-    <template #btns>
-      <el-button type="primary" plain @click="handleTransfer">杞氦</el-button>
-    </template>
-    <!--  鍚屾剰/鎷掔粷 -->
-    <el-dialog
-      append-to-body
-      :title="apprTitle"
-      :visible.sync="isShowAppr"
-      width="480px"
-    >
-      <el-input
-        type="textarea"
-        :placeholder="apprTitle + '璇存槑锛岄潪蹇呭~'"
-        :rows="4"
-        v-model="param.explain"
-      />
-      <span slot="footer" class="dialog-footer">
-        <el-button @click="isShowAppr = false">鍙栨秷</el-button>
-        <el-button type="primary" @click="isShowAppr = false">纭畾</el-button>
-      </span>
-    </el-dialog>
-    <!-- 闅愭偅 -->
-    <el-dialog
-      append-to-body
-      title="闅愭偅"
-      :visible.sync="isShowProblem"
-      width="480px"
-    >
-      <el-form :model="param" :rules="rules" ref="ruleForm" label-width="100px">
-        <el-form-item label="閫�鍥炴椂闂�">
-          <el-date-picker
-            class="w300"
-            value-format="yyyy-MM-dd"
-            type="date"
-            placeholder="閫夋嫨鏃ユ湡"
-            v-model="param.date"
-          />
-        </el-form-item>
-        <el-form-item label="鏁存敼鍓�">
-          <div class="df_ac">
-            <img src="@/assets/avatar/man.png" />
-            <el-upload
-              class="avatar-uploader"
-              action="https://jsonplaceholder.typicode.com/posts/"
-              :show-file-list="false"
-              :on-success="handleAvatarSuccess"
-              :before-upload="beforeAvatarUpload"
-            >
-              <img v-if="param.url" :src="param.url" class="avatar" />
-              <div v-else class="upload_box">
-                <el-icon class="el-icon-plus icon" />
-                <div class="text">鍥剧墖/瑙嗛</div>
-              </div>
-            </el-upload>
-          </div>
-        </el-form-item>
-        <el-form-item label="閫�鍥炶鏄�">
-          <el-input
-            type="textarea"
-            placeholder="璇峰~鍐欒鏄�"
-            :rows="4"
-            v-model="param.explain"
-          />
-        </el-form-item>
-      </el-form>
-      <span slot="footer" class="dialog-footer">
-        <el-button @click="isShowProblem = false">鍙栨秷</el-button>
-        <el-button type="primary" @click="isShowProblem = false"
-          >纭畾</el-button
-        >
-      </span>
-    </el-dialog>
-  </GlobalWindow>
-</template>
-
-<script>
-import GlobalWindow from '@/components/common/GlobalWindow'
-export default {
-  components: { GlobalWindow },
-  data() {
-    return {
-      title: '璁垮棰勭害璇︽儏',
-      isShowModal: false,
-      detail: {
-        datalist: [{}]
-      },
-
-      isShowAppr: false,
-      apprTitle: '鍚屾剰',
-      param: {},
-
-      isShowProblem: false,
-      rules: {}
-    }
-  },
-  methods: {
-    confirm() {
-      console.log('--')
-    },
-    handleTransfer() {
-      this.isShowProblem = true
-    },
-    reject() { },
-    handleAvatarSuccess() { },
-    beforeAvatarUpload() { }
-  }
-}
-</script>
-
-<style lang="scss" scoped>
-.upload_box {
-  width: 84px;
-  height: 84px;
-  border-radius: 4px;
-  background-color: #f7f7f7;
-  display: flex;
-  flex-direction: column;
-  justify-content: center;
-  align-items: center;
-  color: #999999;
-  border: 1px solid #e4e4e4;
-  .icon {
-    font-size: 24px;
-  }
-  .text {
-    font-size: 12px;
-  }
-}
-.modal_wrap {
-  display: flex;
-  height: 100%;
-  .modal_content {
-    flex: 1;
-    padding: 0px 30px;
-    border-radius: 8px;
-    overflow: hidden;
-    height: 100%;
-
-    .title {
-      font-weight: 600;
-      font-size: 18px;
-      color: #333333;
-      margin-bottom: 20px;
-      margin-top: 30px;
-    }
-
-    .info {
-      .list {
-        display: flex;
-        flex-wrap: wrap;
-
-        .item {
-          display: flex;
-          width: 40%;
-          margin-bottom: 20px;
-          &:nth-of-type(2n) {
-            width: 60%;
-          }
-
-          .label {
-            color: #888888;
-            width: 68px;
-          }
-
-          .value {
-            color: #111111;
-          }
-        }
-      }
-    }
-
-    .header {
-      display: flex;
-      justify-content: space-between;
-      align-items: center;
-      padding: 20px 30px;
-      margin: 0 -30px;
-      border-radius: 8px 8px 0 0;
-      background: linear-gradient(to right, #f2f6fe, #cadffa);
-
-      .h1 {
-        font-weight: 600;
-        font-size: 22px;
-        color: #111111;
-        margin-bottom: 8px;
-      }
-
-      .time {
-        font-size: 14px;
-        color: #999999;
-      }
-
-      .right {
-        height: 40px;
-        font-size: 16px;
-        color: #ffffff;
-        line-height: 40px;
-        padding: 0 20px;
-        background: #207ff7;
-        box-shadow: 4px 4px 0px 0px rgba(32, 127, 247, 0.16);
-        border-radius: 16px 0px 16px 0px;
-      }
-    }
-    .table_info {
-      .name_wrap {
-        display: flex;
-        align-items: center;
-        .avatar {
-          width: 40px;
-          height: 40px;
-          border-radius: 50%;
-          margin-right: 12px;
-        }
-        .content {
-          .line {
-            display: flex;
-          }
-          .tag {
-            color: #b2cbf9;
-            border: 1px solid #b2cbf9;
-            padding: 0px 4px;
-            border-radius: 4px;
-            margin-left: 6px;
-          }
-        }
-      }
-    }
-  }
-
-  .side {
-    height: 100%;
-    width: 420px;
-    background: #ffffff;
-    border-left: 20px solid #f7f7f7;
-    .list {
-      .item {
-        padding: 8px 0;
-        position: relative;
-        .separate {
-          position: absolute;
-          border-left: 2px dashed #cccccc;
-          left: 51px;
-          height: calc(100% - 24px);
-          top: 46px;
-        }
-        .info {
-          display: flex;
-          align-items: center;
-          margin-left: 40px;
-          .icon {
-            position: relative;
-            z-index: 11;
-            color: #53b76f;
-            font-size: 24px;
-          }
-          .avatar {
-            width: 40px;
-            height: 40px;
-            border-radius: 50%;
-            margin: 0 12px 0 16px;
-            border: 1px solid;
-          }
-          .content {
-            flex: 1;
-            .line {
-              display: flex;
-              justify-content: space-between;
-              align-content: center;
-              margin-bottom: 6px;
-              .name {
-                font-weight: 600;
-                font-size: 16px;
-                color: #111111;
-              }
-              .time {
-                color: #888888;
-              }
-              .company {
-                font-size: 13px;
-                color: #888888;
-                .status {
-                  color: #00ba67;
-                }
-              }
-            }
-          }
-        }
-        .remark {
-          background: #f7f7f7;
-          border-radius: 4px;
-          padding: 13px 15px;
-          color: #666666;
-          margin-left: 120px;
-        }
-      }
-    }
-  }
-}
-</style>
diff --git a/admin/src/views/task/visReportDetail.vue b/admin/src/views/task/visReportDetail.vue
new file mode 100644
index 0000000..fa7d122
--- /dev/null
+++ b/admin/src/views/task/visReportDetail.vue
@@ -0,0 +1,594 @@
+<template>
+  <GlobalWindow :title="title" :visible.sync="isShowModal" @confirm="confirm">
+    <div class="modal_wrap">
+      <div class="modal_content">
+        <div class="header">
+          <div class="left">
+            <div class="h1">{{ cateList[type] }}</div>
+            <div class="time">鎻愪氦鏃堕棿锛歿{ info.createDate }}</div>
+          </div>
+          <div class="right">{{ statusMap[info.status] }}</div>
+        </div>
+        <div class="info">
+          <div class="title">璁垮鎶ュ淇℃伅</div>
+          <div class="list">
+            <div class="item">
+              <div class="label">琚浜�</div>
+              <div class="value">{{ info.receptMemberName }} {{ info.receptMemberDepartment }}</div>
+            </div>
+            <div class="item">
+              <div class="label">鏉ヨ鏃堕棿</div>
+              <div class="value">{{ info.starttime }}鑷硔{ info.endtime }}</div>
+            </div>
+             <div class="item">
+              <div class="label">鏉ヨ鍗曚綅</div>
+              <div class="value">{{ info.companyName }}</div>
+            </div>
+            <div class="item">
+              <div class="label">鏉ヨ浜嬬敱</div>
+              <div class="value">{{ info.reason }}</div>
+            </div>
+            <div class="item">
+              <div class="label">鑱旂郴浜�</div>
+              <div class="value">{{ info.name }} {{ info.phone }}</div>
+            </div>
+            <div class="item">
+              <div class="label">鍏ュ洯杞﹁締</div>
+              <div class="value">{{ info.carNos }}</div>
+            </div>
+            <div class="item">
+              <div class="label">闅忚溅浜烘暟</div>
+              <div class="value">{{ info.memberNum || 0 }}浜�</div>
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="side">
+        <div class="side_title">瀹℃壒娴佺▼</div>
+        <div
+          class="list"
+          v-if="
+            info.approveDateVO != null && info.approveDateVO.approveList != null
+          "
+        >
+          <div
+            class="item"
+            v-for="(item, index) in info.approveDateVO.approveList"
+            :key="item.id"
+          >
+            <div
+              class="separate"
+              v-if="index < info.approveDateVO.approveList.length - 1"
+            ></div>
+            <div class="info">
+              <img
+                src="@/assets/icons/ic_tongguo.png"
+                class="iconnew"
+                v-if="item.status == 2"
+              />
+              <img
+                src="@/assets/icons/ic_dangqian.png"
+                class="iconnew"
+                v-if="item.status == 1"
+              />
+              <img
+                src="@/assets/icons/ic_jujue.png"
+                class="iconnew"
+                v-if="item.status == 3"
+              />
+              <img
+                src="@/assets/icons/ic_grey.png"
+                class="iconnew"
+                v-if="item.status == null || item.status == 0"
+              />
+              <div style="display: inline" v-if="item.approveType != 1">
+                <img
+                  v-if="item.faceImg != null && item.faceImg != ''"
+                  :src="item.faceImg"
+                  class="avatar"
+                  alt=""
+                />
+                <img
+                  v-if="item.faceImg == null || item.faceImg == ''"
+                  src="@/assets/avatar/man.png"
+                  class="avatar"
+                  alt=""
+                />
+              </div>
+              <div style="display: inline" v-if="item.approveType == 1">
+                <img
+                  v-if="item.type != 1"
+                  src="@/assets/icons/ic_duoren.png"
+                  class="avatar"
+                  alt=""
+                />
+                <img
+                  v-if="item.type == 1"
+                  src="@/assets/icons/ic_chaosong.png"
+                  class="avatar"
+                  alt=""
+                />
+              </div>
+              <div class="content">
+                <div class="line">
+                  <div class="name">{{ item.title }}</div>
+                  <div class="time">{{ item.checkDate }}</div>
+                </div>
+                <div class="line">
+                  <div class="company">
+                    {{ item.memberName }}
+                    <div
+                      style="display: inline"
+                      v-if="item.statusInfo != null && item.statusInfo != ''"
+                    >
+                      锛�<span class="status-green">{{
+                        item.statusInfo || ""
+                      }}</span
+                      >锛�
+                    </div>
+                  </div>
+                </div>
+              </div>
+            </div>
+            <div
+              v-if="
+                item.approveType != 1 &&
+                item.checkInfo != null &&
+                item.checkInfo != ''
+              "
+              class="remark"
+            >
+              {{ item.checkInfo || "" }}
+            </div>
+            <div v-if="item.approveType == 1" class="childList">
+              <div
+                class="m_content company"
+                v-for="item1 in item.approveList"
+                :key="item1.id"
+              >
+                <img
+                  v-if="item1.faceImg != null && item1.faceImg != ''"
+                  :src="item1.faceImg"
+                  class="avatar"
+                  alt=""
+                />
+                <img
+                  v-if="item1.faceImg == null || item1.faceImg == ''"
+                  src="@/assets/avatar/man.png"
+                  class="avatar"
+                  alt=""
+                />
+                <span> {{ item1.memberName }}</span>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <!--  -->
+    <template v-slot:footer>
+      <el-button
+        @click="handleAppr(2)"
+        type="primary"
+        class="status-red"
+        v-if="
+          info.approveDateVO != null &&
+          info.approveDateVO.canBeApproved != null &&
+          info.approveDateVO.canBeApproved == 1
+        "
+        >鍚屾剰</el-button
+      >
+      <el-button
+        @click="handleAppr(3)"
+        type="danger"
+        v-if="
+          info.approveDateVO != null &&
+          info.approveDateVO.canBeApproved != null &&
+          info.approveDateVO.canBeApproved == 1
+        "
+        >鎷掔粷</el-button
+      >
+      <el-button @click="isShowModal = false">杩斿洖</el-button>
+    </template>
+    <!--  鍚屾剰/鎷掔粷 -->
+    <el-dialog
+      append-to-body
+      :title="apprTitle"
+      :visible.sync="isShowAppr"
+      width="480px"
+    >
+      <el-form :model="param" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm">
+        <el-form-item :prop="param.status == 3 ? 'checkInfo' : ''" :label="param.status == 2 ? '鍚屾剰璇存槑' : '鎷掔粷璇存槑'">
+          <el-input
+            type="textarea"
+            :placeholder="
+              param.status == 2 ? '鍚屾剰璇存槑锛岄潪蹇呭~' : '鎷掔粷璇存槑蹇呭~'
+            "
+            :rows="4"
+            v-model="param.checkInfo"
+          />
+        </el-form-item>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="isShowAppr = false">鍙栨秷</el-button>
+        <el-button :loading="subLoading" type="primary" @click="onSubAppr">纭畾</el-button>
+      </span>
+    </el-dialog>
+    <!-- 闅愭偅 -->
+    <el-dialog
+      append-to-body
+      title="闅愭偅"
+      :visible.sync="isShowProblem"
+      width="480px"
+    >
+      <el-form :model="param" :rules="rules" ref="ruleForm" label-width="100px">
+        <el-form-item label="閫�鍥炴椂闂�">
+          <el-date-picker
+            class="w300"
+            value-format="yyyy-MM-dd"
+            type="date"
+            placeholder="閫夋嫨鏃ユ湡"
+            v-model="param.date"
+          />
+        </el-form-item>
+        <el-form-item label="鏁存敼鍓�">
+          <div class="df_ac">
+            <img src="@/assets/avatar/man.png" />
+            <el-upload
+              class="avatar-uploader"
+              action="https://jsonplaceholder.typicode.com/posts/"
+              :show-file-list="false"
+              :on-success="handleAvatarSuccess"
+              :before-upload="beforeAvatarUpload"
+            >
+              <img v-if="param.url" :src="param.url" class="avatar" />
+              <div v-else class="upload_box">
+                <el-icon class="el-icon-plus icon" />
+                <div class="text">鍥剧墖/瑙嗛</div>
+              </div>
+            </el-upload>
+          </div>
+        </el-form-item>
+        <el-form-item label="閫�鍥炶鏄�">
+          <el-input
+            type="textarea"
+            placeholder="璇峰~鍐欒鏄�"
+            :rows="4"
+            v-model="param.explain"
+          />
+        </el-form-item>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="isShowProblem = false">鍙栨秷</el-button>
+        <el-button type="primary" @click="isShowProblem = false"
+          >纭畾</el-button
+        >
+      </span>
+    </el-dialog>
+  </GlobalWindow>
+</template>
+
+<script>
+import GlobalWindow from '@/components/common/GlobalWindow'
+import {
+  getVisitedReDetail,
+  approveDo
+} from '@/api'
+export default {
+  components: { GlobalWindow },
+  data () {
+    return {
+      id: '',
+      type: '',
+
+      title: '璁垮棰勭害璇︽儏',
+      isShowModal: false,
+      info: {},
+      isShowAppr: false,
+      apprTitle: '鍚屾剰',
+      subLoading: false,
+      param: {},
+
+      isShowProblem: false,
+      rules: {
+        checkInfo: [{ required: true, message: '璇疯緭鍏�', trigger: 'blur' }]
+      },
+      statusMap: {
+        0: '寰呭鎵�',
+        1: '瀹℃壒涓�',
+        2: '瀹℃壒閫氳繃',
+        3: '瀹℃壒鏈�氳繃',
+        4: '宸插彇娑�',
+        5: '浠栦汉鎴栫',
+        6: '浠栦汉鎷掔粷'
+      },
+      cateList: {
+        0: '璁垮鐢宠',
+        1: '璁垮鎶ュ',
+        2: '鐢ㄨ溅鐢宠',
+        3: '闅愭偅闅忔墜鎷�',
+        4: '鐗╂祦杞︾敵璇�'
+      }
+    }
+  },
+  methods: {
+    onSubAppr () {
+      this.$refs.ruleForm.validate((valid) => {
+        if (!valid) {
+          return
+        }
+        this.$dialog.actionConfirm('鎿嶄綔纭', this.param.status === 2 ? '鎮ㄧ‘璁ゅ悓鎰忚鐢宠鍚楋紵' : '鎮ㄧ‘璁ゆ嫆缁濊鐢宠鍚楋紵')
+          .then(() => {
+            this.subLoading = true
+            approveDo({
+              objId: this.id,
+              objType: 2,
+              status: this.param.status,
+              checkInfo: this.param.checkInfo
+            })
+              .then(res => {
+                this.subLoading = false
+                this.$tip.apiSuccess('澶勭悊鎴愬姛')
+                this.getDetail()
+                this.isShowAppr = false
+              })
+              .finally(() => {
+                this.subLoading = false
+              })
+          })
+      })
+    },
+    getDetail () {
+      const { id } = this
+      getVisitedReDetail({ id }).then(res => {
+        this.info = res
+      })
+    },
+    handleAppr (val) {
+      this.$set(this.param, 'status', val)
+      this.isShowAppr = true
+    },
+    confirm () {
+      console.log('--')
+    },
+    handleTransfer () {
+      this.isShowProblem = true
+    },
+    reject () { },
+    handleAvatarSuccess () { },
+    beforeAvatarUpload () { }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.upload_box {
+  width: 84px;
+  height: 84px;
+  border-radius: 4px;
+  background-color: #f7f7f7;
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  align-items: center;
+  color: #999999;
+  border: 1px solid #e4e4e4;
+  .icon {
+    font-size: 24px;
+  }
+  .text {
+    font-size: 12px;
+  }
+}
+.side_title {
+  font-weight: 600;
+  font-size: 18px;
+  color: #111111;
+  margin-bottom: 20px;
+  margin-left: 20px;
+  margin-top: 20px;
+}
+.modal_wrap {
+  display: flex;
+  height: 100%;
+  .modal_content {
+    flex: 1;
+    padding: 0px 30px;
+    border-radius: 8px;
+    overflow: hidden;
+    height: 100%;
+
+    .title {
+      font-weight: 600;
+      font-size: 18px;
+      color: #333333;
+      margin-bottom: 20px;
+      margin-top: 30px;
+    }
+    .info {
+      .list {
+        display: flex;
+        flex-wrap: wrap;
+
+        .item {
+          display: flex;
+          width: 40%;
+          margin-bottom: 20px;
+          &:nth-of-type(2n) {
+            width: 60%;
+          }
+
+          .label {
+            color: #888888;
+            width: 100px;
+          }
+
+          .value {
+            color: #111111;
+          }
+        }
+      }
+    }
+
+    .header {
+      display: flex;
+      justify-content: space-between;
+      align-items: center;
+      padding: 20px 30px;
+      margin: 0 -30px;
+      border-radius: 8px 8px 0 0;
+      background: linear-gradient(to right, #f2f6fe, #cadffa);
+
+      .h1 {
+        font-weight: 600;
+        font-size: 22px;
+        color: #111111;
+        margin-bottom: 8px;
+      }
+
+      .time {
+        font-size: 14px;
+        color: #999999;
+      }
+
+      .right {
+        height: 40px;
+        font-size: 16px;
+        color: #ffffff;
+        line-height: 40px;
+        padding: 0 20px;
+        background: #207ff7;
+        box-shadow: 4px 4px 0px 0px rgba(32, 127, 247, 0.16);
+        border-radius: 16px 0px 16px 0px;
+      }
+    }
+    .table_info {
+      .name_wrap {
+        display: flex;
+        align-items: center;
+        .avatar {
+          width: 40px;
+          height: 40px;
+          border-radius: 50%;
+          margin-right: 12px;
+        }
+        .content {
+          .line {
+            display: flex;
+          }
+          .tag {
+            color: #b2cbf9;
+            border: 1px solid #b2cbf9;
+            padding: 0px 4px;
+            border-radius: 4px;
+            margin-left: 6px;
+          }
+        }
+      }
+    }
+  }
+
+  .side {
+    height: 100%;
+    width: 420px;
+    background: #ffffff;
+    border-left: 20px solid #f7f7f7;
+    .list {
+      .item {
+        padding: 8px 0;
+        position: relative;
+        .separate {
+          position: absolute;
+          border-left: 2px dashed #cccccc;
+          left: 31px;
+          height: calc(100% - 36px);
+          top: 49px;
+        }
+        .avatar {
+          width: 40px;
+          height: 40px;
+          border-radius: 50%;
+          margin: 0 12px 0 16px;
+          //border: 1px solid;
+        }
+        .childList {
+          display: flex;
+          flex-wrap: wrap;
+          margin-left: 100px;
+        }
+        .company {
+          font-size: 13px;
+          color: #888888;
+          .status {
+            color: #00ba67;
+          }
+        }
+        .m_content {
+          display: flex;
+          flex-direction: column;
+          align-items: center;
+          justify-content: center;
+          margin-bottom: 4px;
+        }
+        .info {
+          display: flex;
+          align-items: center;
+          margin-left: 20px;
+          .icon {
+            position: relative;
+            z-index: 11;
+            color: #53b76f;
+            font-size: 24px;
+          }
+          .icon1 {
+            position: relative;
+            z-index: 11;
+            color: deepskyblue;
+            font-size: 24px;
+          }
+          .icon2 {
+            position: relative;
+            z-index: 11;
+            color: #dc362e;
+            font-size: 24px;
+          }
+          .iconnew {
+            width: 24px;
+            height: 24px;
+          }
+          .icon3 {
+            position: relative;
+            z-index: 11;
+            color: gray;
+            font-size: 24px;
+          }
+          .content {
+            flex: 1;
+            .line {
+              display: flex;
+              justify-content: space-between;
+              align-content: center;
+              margin-bottom: 6px;
+              .name {
+                font-weight: 600;
+                font-size: 16px;
+                color: #111111;
+              }
+              .time {
+                color: #888888;
+              }
+            }
+          }
+        }
+        .remark {
+          background: #f7f7f7;
+          border-radius: 4px;
+          padding: 13px 15px;
+          color: #666666;
+          margin-left: 100px;
+        }
+      }
+    }
+  }
+}
+</style>
diff --git a/admin/src/views/task/visSubDetail.vue b/admin/src/views/task/visSubDetail.vue
new file mode 100644
index 0000000..b9595dc
--- /dev/null
+++ b/admin/src/views/task/visSubDetail.vue
@@ -0,0 +1,647 @@
+<template>
+  <GlobalWindow :title="title" :visible.sync="isShowModal" @confirm="confirm">
+    <div class="modal_wrap">
+      <div class="modal_content">
+        <div class="header">
+          <div class="left">
+            <div class="h1">{{ cateList[type] }}</div>
+            <div class="time">鎻愪氦鏃堕棿锛歿{ info.createDate }}</div>
+          </div>
+          <div class="right">{{ statusMap[info.status] }}</div>
+        </div>
+        <div class="info">
+          <div class="title">璁垮棰勭害淇℃伅</div>
+          <div class="list">
+            <div class="item">
+              <div class="label">琚浜�</div>
+              <div class="value">{{ info.visitUserName }}</div>
+            </div>
+            <div class="item">
+              <div class="label">鏉ヨ鏃堕棿</div>
+              <div class="value">{{ info.visitTime }}</div>
+            </div>
+            <div class="item">
+              <div class="label">鏉ヨ浜嬬敱</div>
+              <div class="value">{{ info.visitReason }}</div>
+            </div>
+            <div class="item">
+              <div class="label">闅忚杞﹁締</div>
+              <div class="value">{{ info.carNos }}</div>
+            </div>
+            <div class="item">
+              <div class="label">鏂藉伐浜哄憳</div>
+              <div class="value">{{ info.type == "0" ? "鍚�" : "鏄�" }}</div>
+            </div>
+            <div class="item">
+              <div class="label">鏂藉伐鍐呭</div>
+              <div class="value">{{ info.constructionReason }}</div>
+            </div>
+          </div>
+        </div>
+        <div class="table_info">
+          <div class="title">璁垮淇℃伅</div>
+          <el-table :data="[info]" border fit>
+            <el-table-column label="濮撳悕" prop="" min-width="150">
+              <template slot-scope="{ row }">
+                <div class="name_wrap">
+                  <image
+                    :src="
+                      row.prefix
+                        ? row.prefix
+                        : require('@/assets/avatar/man.png')
+                    "
+                    class="avatar"
+                    mode=""
+                  />
+                  <div class="content">
+                    <div class="line">
+                      <div class="name">{{ row.name }}</div>
+                      <div class="tag">鐢宠浜�</div>
+                    </div>
+                    <div class="line placeholder9">{{ row.phone }}</div>
+                  </div>
+                </div>
+              </template>
+            </el-table-column>
+            <!-- <el-table-column label="鎬у埆" prop="" min-width="40" /> -->
+            <el-table-column
+              label="璇佷欢绫诲瀷"
+              prop="idcardTypeName"
+              min-width="80"
+            />
+            <el-table-column
+              label="璇佷欢鍙风爜"
+              prop="idCardDecode"
+              min-width="120"
+            />
+            <el-table-column
+              label="鍏徃鍚嶇О"
+              prop="companyName"
+              min-width="120"
+            />
+            <el-table-column label="浜鸿劯鐓х墖" prop="" min-width="80">
+              <template slot-scope="{ row }">
+                <el-image :src="row.prefix" :preview-src-list="[row.prefix]">
+                </el-image>
+              </template>
+            </el-table-column>
+          </el-table>
+        </div>
+      </div>
+      <div class="side">
+        <div class="side_title">瀹℃壒娴佺▼</div>
+        <div
+          class="list"
+          v-if="
+            info.approveDateVO != null && info.approveDateVO.approveList != null
+          "
+        >
+          <div
+            class="item"
+            v-for="(item, index) in info.approveDateVO.approveList"
+            :key="item.id"
+          >
+            <div
+              class="separate"
+              v-if="index < info.approveDateVO.approveList.length - 1"
+            ></div>
+            <div class="info">
+              <img
+                src="@/assets/icons/ic_tongguo.png"
+                class="iconnew"
+                v-if="item.status == 2"
+              />
+              <img
+                src="@/assets/icons/ic_dangqian.png"
+                class="iconnew"
+                v-if="item.status == 1"
+              />
+              <img
+                src="@/assets/icons/ic_jujue.png"
+                class="iconnew"
+                v-if="item.status == 3"
+              />
+              <img
+                src="@/assets/icons/ic_grey.png"
+                class="iconnew"
+                v-if="item.status == null || item.status == 0"
+              />
+              <div style="display: inline" v-if="item.approveType != 1">
+                <img
+                  v-if="item.faceImg != null && item.faceImg != ''"
+                  :src="item.faceImg"
+                  class="avatar"
+                  alt=""
+                />
+                <img
+                  v-if="item.faceImg == null || item.faceImg == ''"
+                  src="@/assets/avatar/man.png"
+                  class="avatar"
+                  alt=""
+                />
+              </div>
+              <div style="display: inline" v-if="item.approveType == 1">
+                <img
+                  v-if="item.type != 1"
+                  src="@/assets/icons/ic_duoren.png"
+                  class="avatar"
+                  alt=""
+                />
+                <img
+                  v-if="item.type == 1"
+                  src="@/assets/icons/ic_chaosong.png"
+                  class="avatar"
+                  alt=""
+                />
+              </div>
+              <div class="content">
+                <div class="line">
+                  <div class="name">{{ item.title }}</div>
+                  <div class="time">{{ item.checkDate }}</div>
+                </div>
+                <div class="line">
+                  <div class="company">
+                    {{ item.memberName }}
+                    <div
+                      style="display: inline"
+                      v-if="item.statusInfo != null && item.statusInfo != ''"
+                    >
+                      锛�<span class="status-green">{{
+                        item.statusInfo || ""
+                      }}</span
+                      >锛�
+                    </div>
+                  </div>
+                </div>
+              </div>
+            </div>
+            <div
+              v-if="
+                item.approveType != 1 &&
+                item.checkInfo != null &&
+                item.checkInfo != ''
+              "
+              class="remark"
+            >
+              {{ item.checkInfo || "" }}
+            </div>
+            <div v-if="item.approveType == 1" class="childList">
+              <div
+                class="m_content company"
+                v-for="item1 in item.approveList"
+                :key="item1.id"
+              >
+                <img
+                  v-if="item1.faceImg != null && item1.faceImg != ''"
+                  :src="item1.faceImg"
+                  class="avatar"
+                  alt=""
+                />
+                <img
+                  v-if="item1.faceImg == null || item1.faceImg == ''"
+                  src="@/assets/avatar/man.png"
+                  class="avatar"
+                  alt=""
+                />
+                <span> {{ item1.memberName }}</span>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <!--  -->
+    <template v-slot:footer>
+      <el-button
+        @click="handleAppr(2)"
+        type="primary"
+        class="status-red"
+        v-if="
+          info.approveDateVO != null &&
+          info.approveDateVO.canBeApproved != null &&
+          info.approveDateVO.canBeApproved == 1
+        "
+        >鍚屾剰</el-button
+      >
+      <el-button
+        @click="handleAppr(3)"
+        type="danger"
+        v-if="
+          info.approveDateVO != null &&
+          info.approveDateVO.canBeApproved != null &&
+          info.approveDateVO.canBeApproved == 1
+        "
+        >鎷掔粷</el-button
+      >
+      <el-button @click="isShowModal = false">杩斿洖</el-button>
+    </template>
+    <!--  鍚屾剰/鎷掔粷 -->
+    <el-dialog
+      append-to-body
+      :title="apprTitle"
+      :visible.sync="isShowAppr"
+      width="480px"
+    >
+      <el-form :model="param" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm">
+        <el-form-item :prop="param.status == 3 ? 'checkInfo' : ''" :label="param.status == 2 ? '鍚屾剰璇存槑' : '鎷掔粷璇存槑'">
+          <el-input
+            type="textarea"
+            :placeholder="
+              param.status == 2 ? '鍚屾剰璇存槑锛岄潪蹇呭~' : '鎷掔粷璇存槑蹇呭~'
+            "
+            :rows="4"
+            v-model="param.checkInfo"
+          />
+        </el-form-item>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="isShowAppr = false">鍙栨秷</el-button>
+        <el-button :loading="subLoading" type="primary" @click="onSubAppr">纭畾</el-button>
+      </span>
+    </el-dialog>
+    <!-- 闅愭偅 -->
+    <el-dialog
+      append-to-body
+      title="闅愭偅"
+      :visible.sync="isShowProblem"
+      width="480px"
+    >
+      <el-form :model="param" :rules="rules" ref="ruleForm" label-width="100px">
+        <el-form-item label="閫�鍥炴椂闂�">
+          <el-date-picker
+            class="w300"
+            value-format="yyyy-MM-dd"
+            type="date"
+            placeholder="閫夋嫨鏃ユ湡"
+            v-model="param.date"
+          />
+        </el-form-item>
+        <el-form-item label="鏁存敼鍓�">
+          <div class="df_ac">
+            <img src="@/assets/avatar/man.png" />
+            <el-upload
+              class="avatar-uploader"
+              action="https://jsonplaceholder.typicode.com/posts/"
+              :show-file-list="false"
+              :on-success="handleAvatarSuccess"
+              :before-upload="beforeAvatarUpload"
+            >
+              <img v-if="param.url" :src="param.url" class="avatar" />
+              <div v-else class="upload_box">
+                <el-icon class="el-icon-plus icon" />
+                <div class="text">鍥剧墖/瑙嗛</div>
+              </div>
+            </el-upload>
+          </div>
+        </el-form-item>
+        <el-form-item label="閫�鍥炶鏄�">
+          <el-input
+            type="textarea"
+            placeholder="璇峰~鍐欒鏄�"
+            :rows="4"
+            v-model="param.explain"
+          />
+        </el-form-item>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="isShowProblem = false">鍙栨秷</el-button>
+        <el-button type="primary" @click="isShowProblem = false"
+          >纭畾</el-button
+        >
+      </span>
+    </el-dialog>
+  </GlobalWindow>
+</template>
+
+<script>
+import GlobalWindow from '@/components/common/GlobalWindow'
+import {
+  getVisitedDetail,
+  approveDo
+} from '@/api'
+export default {
+  components: { GlobalWindow },
+  data () {
+    return {
+      id: '',
+      type: '',
+
+      title: '璁垮棰勭害璇︽儏',
+      isShowModal: false,
+      info: {},
+      isShowAppr: false,
+      apprTitle: '鍚屾剰',
+      subLoading: false,
+      param: {},
+
+      isShowProblem: false,
+      rules: {
+        checkInfo: [{ required: true, message: '璇疯緭鍏�', trigger: 'blur' }]
+      },
+      statusMap: {
+        0: '寰呭鎵�',
+        1: '瀹℃壒涓�',
+        2: '瀹℃壒閫氳繃',
+        3: '瀹℃壒鏈�氳繃',
+        4: '宸插彇娑�',
+        5: '浠栦汉鎴栫',
+        6: '浠栦汉鎷掔粷'
+      },
+      cateList: {
+        0: '璁垮鐢宠',
+        1: '璁垮鎶ュ',
+        2: '鐢ㄨ溅鐢宠',
+        3: '闅愭偅闅忔墜鎷�',
+        4: '鐗╂祦杞︾敵璇�'
+      }
+    }
+  },
+  methods: {
+    onSubAppr () {
+      this.$refs.ruleForm.validate((valid) => {
+        if (!valid) {
+          return
+        }
+        this.$dialog.actionConfirm('鎿嶄綔纭', this.param.status === 2 ? '鎮ㄧ‘璁ゅ悓鎰忚鐢宠鍚楋紵' : '鎮ㄧ‘璁ゆ嫆缁濊鐢宠鍚楋紵')
+          .then(() => {
+            this.subLoading = true
+            approveDo({
+              objId: this.id,
+              objType: this.info.type,
+              status: this.param.status,
+              checkInfo: this.param.checkInfo
+            })
+              .then(res => {
+                this.subLoading = false
+                this.$tip.apiSuccess('澶勭悊鎴愬姛')
+                this.getDetail()
+                this.isShowAppr = false
+              })
+              .finally(() => {
+                this.subLoading = false
+              })
+          })
+      })
+    },
+    getDetail () {
+      const { id, type } = this
+      console.log(id, type)
+      switch (type) {
+      case 0:
+        getVisitedDetail({ id }).then(res => {
+          this.info = res
+        })
+        break
+
+      default:
+        break
+      }
+    },
+    handleAppr (val) {
+      this.$set(this.param, 'status', val)
+      this.isShowAppr = true
+    },
+    confirm () {
+      console.log('--')
+    },
+    handleTransfer () {
+      this.isShowProblem = true
+    },
+    reject () { },
+    handleAvatarSuccess () { },
+    beforeAvatarUpload () { }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.upload_box {
+  width: 84px;
+  height: 84px;
+  border-radius: 4px;
+  background-color: #f7f7f7;
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  align-items: center;
+  color: #999999;
+  border: 1px solid #e4e4e4;
+  .icon {
+    font-size: 24px;
+  }
+  .text {
+    font-size: 12px;
+  }
+}
+.side_title {
+  font-weight: 600;
+  font-size: 18px;
+  color: #111111;
+  margin-bottom: 20px;
+  margin-left: 20px;
+  margin-top: 20px;
+}
+.modal_wrap {
+  display: flex;
+  height: 100%;
+  .modal_content {
+    flex: 1;
+    padding: 0px 30px;
+    border-radius: 8px;
+    overflow: hidden;
+    height: 100%;
+
+    .title {
+      font-weight: 600;
+      font-size: 18px;
+      color: #333333;
+      margin-bottom: 20px;
+      margin-top: 30px;
+    }
+    .info {
+      .list {
+        display: flex;
+        flex-wrap: wrap;
+
+        .item {
+          display: flex;
+          width: 40%;
+          margin-bottom: 20px;
+          &:nth-of-type(2n) {
+            width: 60%;
+          }
+
+          .label {
+            color: #888888;
+            width: 100px;
+          }
+
+          .value {
+            color: #111111;
+          }
+        }
+      }
+    }
+
+    .header {
+      display: flex;
+      justify-content: space-between;
+      align-items: center;
+      padding: 20px 30px;
+      margin: 0 -30px;
+      border-radius: 8px 8px 0 0;
+      background: linear-gradient(to right, #f2f6fe, #cadffa);
+
+      .h1 {
+        font-weight: 600;
+        font-size: 22px;
+        color: #111111;
+        margin-bottom: 8px;
+      }
+
+      .time {
+        font-size: 14px;
+        color: #999999;
+      }
+
+      .right {
+        height: 40px;
+        font-size: 16px;
+        color: #ffffff;
+        line-height: 40px;
+        padding: 0 20px;
+        background: #207ff7;
+        box-shadow: 4px 4px 0px 0px rgba(32, 127, 247, 0.16);
+        border-radius: 16px 0px 16px 0px;
+      }
+    }
+    .table_info {
+      .name_wrap {
+        display: flex;
+        align-items: center;
+        .avatar {
+          width: 40px;
+          height: 40px;
+          border-radius: 50%;
+          margin-right: 12px;
+        }
+        .content {
+          .line {
+            display: flex;
+          }
+          .tag {
+            color: #b2cbf9;
+            border: 1px solid #b2cbf9;
+            padding: 0px 4px;
+            border-radius: 4px;
+            margin-left: 6px;
+          }
+        }
+      }
+    }
+  }
+
+  .side {
+    height: 100%;
+    width: 420px;
+    background: #ffffff;
+    border-left: 20px solid #f7f7f7;
+    .list {
+      .item {
+        padding: 8px 0;
+        position: relative;
+        .separate {
+          position: absolute;
+          border-left: 2px dashed #cccccc;
+          left: 31px;
+          height: calc(100% - 36px);
+          top: 49px;
+        }
+        .avatar {
+          width: 40px;
+          height: 40px;
+          border-radius: 50%;
+          margin: 0 12px 0 16px;
+          //border: 1px solid;
+        }
+        .childList {
+          display: flex;
+          flex-wrap: wrap;
+          margin-left: 100px;
+        }
+        .company {
+          font-size: 13px;
+          color: #888888;
+          .status {
+            color: #00ba67;
+          }
+        }
+        .m_content {
+          display: flex;
+          flex-direction: column;
+          align-items: center;
+          justify-content: center;
+          margin-bottom: 4px;
+        }
+        .info {
+          display: flex;
+          align-items: center;
+          margin-left: 20px;
+          .icon {
+            position: relative;
+            z-index: 11;
+            color: #53b76f;
+            font-size: 24px;
+          }
+          .icon1 {
+            position: relative;
+            z-index: 11;
+            color: deepskyblue;
+            font-size: 24px;
+          }
+          .icon2 {
+            position: relative;
+            z-index: 11;
+            color: #dc362e;
+            font-size: 24px;
+          }
+          .iconnew {
+            width: 24px;
+            height: 24px;
+          }
+          .icon3 {
+            position: relative;
+            z-index: 11;
+            color: gray;
+            font-size: 24px;
+          }
+          .content {
+            flex: 1;
+            .line {
+              display: flex;
+              justify-content: space-between;
+              align-content: center;
+              margin-bottom: 6px;
+              .name {
+                font-weight: 600;
+                font-size: 16px;
+                color: #111111;
+              }
+              .time {
+                color: #888888;
+              }
+            }
+          }
+        }
+        .remark {
+          background: #f7f7f7;
+          border-radius: 4px;
+          padding: 13px 15px;
+          color: #666666;
+          margin-left: 100px;
+        }
+      }
+    }
+  }
+}
+</style>

--
Gitblit v1.9.3