From 624e812b40ac87bf8d7a17b83b4a3bc3bbd901fb Mon Sep 17 00:00:00 2001
From: yangfeng <wanwan926_4@163.com>
Date: 星期四, 03 八月 2023 18:38:58 +0800
Subject: [PATCH] 增加客户服务单(删除工单管理、消费服务单)和客户管理模块详情页

---
 src/components/index.js                                       |    3 
 src/views/client/followupRecords/AddFollowupRecordsDialog.vue |   86 +
 src/views/sales/masterOrder/index.vue                         |   36 
 src/components/makepager/TableCommonView.vue                  |   37 
 src/views/service/orderManage/AddOrderManageDialog.vue        |  458 ++++++++-
 src/views/client/salesLead/index.vue                          |   45 
 src/views/sales/salesReturn/index.vue                         |   25 
 src/views/client/followupRecords/index.vue                    |   79 +
 src/components/layout/components/appsidebar/index.vue         |    4 
 src/views/client/contacts/DetailContacts.vue                  |  363 ++++++++
 src/views/service/serviceContract/index.vue                   |   36 
 src/views/service/serviceFollowup/index.vue                   |   25 
 src/views/sales/contractManage/index.vue                      |   39 
 src/views/sales/salesDetails/index.vue                        |   36 
 src/components/makepager/pager/PagerView.vue                  |    2 
 src/views/client/client/index.vue                             |   77 +
 src/views/sales/subOrder/index.vue                            |   36 
 src/components/makepager/PublicFunctionBtnView.vue            |    4 
 src/views/client/client/DetailClientManage.vue                |  528 ++++++++++++
 src/components/makepager/DetailListCommonBtn.vue              |   73 +
 src/views/sales/refundForm/index.vue                          |   25 
 src/views/client/contacts/index.vue                           |   74 +
 src/views/client/salesLead/DetailSalesLead.vue                |  365 ++++++++
 src/assets/style/index.scss                                   |   10 
 src/views/service/orderManage/index.vue                       |   55 
 src/main.js                                                   |    5 
 src/views/sales/salesOpportunity/index.vue                    |   44 
 src/router/service/index.js                                   |    2 
 src/views/sales/generatePlan/index.vue                        |   25 
 src/views/sales/quotation/index.vue                           |   42 
 30 files changed, 2,351 insertions(+), 288 deletions(-)

diff --git a/src/assets/style/index.scss b/src/assets/style/index.scss
index 555ade6..361de82 100644
--- a/src/assets/style/index.scss
+++ b/src/assets/style/index.scss
@@ -1,3 +1,13 @@
 @import "element-ui/lib/theme-chalk/index.css";
 @import "./variable.scss";
 @import "./reset-element.scss";
+
+ul,
+ol,
+li {
+  list-style: none;
+  padding: 0;
+  margin: 0;
+  border: 0;
+  outline: 0;
+}
diff --git a/src/components/index.js b/src/components/index.js
index 57970cb..14771f4 100644
--- a/src/components/index.js
+++ b/src/components/index.js
@@ -3,8 +3,9 @@
 import PublicFunctionBtnView from "@/components/makepager/PublicFunctionBtnView"
 import PagerView from "@/components/makepager/pager/PagerView"
 import TableCommonView from "@/components/makepager/TableCommonView"
+import DetailListCommonBtn from "@/components/makepager/DetailListCommonBtn"
 
-const components = [SearchCommonView, PublicFunctionBtnView, PagerView, TableCommonView]
+const components = [SearchCommonView, PublicFunctionBtnView, PagerView, TableCommonView, DetailListCommonBtn]
 components.forEach((component) => {
   Vue.component(component.name, component)
 })
diff --git a/src/components/layout/components/appsidebar/index.vue b/src/components/layout/components/appsidebar/index.vue
index 57830b9..a4964d2 100644
--- a/src/components/layout/components/appsidebar/index.vue
+++ b/src/components/layout/components/appsidebar/index.vue
@@ -44,9 +44,9 @@
             <span>鏈嶅姟绠$悊</span>
           </template>
           <el-menu-item index="/service/serviceContract">鏈嶅姟鍚堝悓</el-menu-item>
-          <el-menu-item index="/service/orderManage">宸ュ崟绠$悊</el-menu-item>
+          <el-menu-item index="/service/orderManage">瀹㈡埛鏈嶅姟鍗�</el-menu-item>
           <el-menu-item index="/service/serviceFollowup">鏈嶅姟鍥炶鍗�</el-menu-item>
-          <el-menu-item index="/service/serviceFeeManage">鏈嶅姟鏀惰垂绠$悊</el-menu-item>
+          <!-- <el-menu-item index="/service/serviceFeeManage">鏈嶅姟鏀惰垂绠$悊</el-menu-item> -->
         </el-submenu>
         <!-- <el-submenu index="4">
           <template slot="title">
diff --git a/src/components/makepager/DetailListCommonBtn.vue b/src/components/makepager/DetailListCommonBtn.vue
new file mode 100644
index 0000000..5e3f4c1
--- /dev/null
+++ b/src/components/makepager/DetailListCommonBtn.vue
@@ -0,0 +1,73 @@
+<template>
+  <div class="detail-list">
+    <div class="add" @click="addBtnClick">
+      <i class="el-icon-circle-plus-outline" style="font-size: 15px; margin-right: 5px"></i>
+      <span>鏂板缓</span>
+    </div>
+    <div class="query-class">
+      <div class="query-class-title">鏌ヨ鍒嗙被</div>
+      <el-select v-model="queryClassValue" placeholder="璇烽�夋嫨" class="query-class-sel" size="mini">
+        <el-option v-for="item in queryClassOptions" :key="item.value" :label="item.label" :value="item.value">
+        </el-option>
+      </el-select>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "DetailListCommonBtn",
+  components: {},
+  props: {
+    queryClass: {
+      type: String,
+      default: "1"
+    },
+    queryClassOptions: {
+      type: Array,
+      default: () => []
+    }
+  },
+  data() {
+    return {
+      queryClassValue: this.queryClass
+    }
+  },
+  methods: {
+    addBtnClick() {
+      this.$parent.addBtnClick()
+    }
+  }
+}
+</script>
+
+<!-- Add "scoped" attribute to limit CSS to this component only -->
+<style lang="scss" scoped>
+.detail-list {
+  display: flex;
+  align-items: center;
+  font-size: 12px;
+  .add {
+    color: #2a304d;
+    height: 36px;
+    line-height: 36px;
+    width: 60px;
+    text-align: center;
+    margin-left: 10px;
+    cursor: pointer;
+  }
+  .query-class {
+    display: flex;
+    height: 50px;
+    line-height: 50px;
+    .query-class-title {
+      margin-left: 10px;
+      color: #666;
+    }
+    .query-class-sel {
+      width: 165px;
+      margin-left: 10px;
+    }
+  }
+}
+</style>
diff --git a/src/components/makepager/PublicFunctionBtnView.vue b/src/components/makepager/PublicFunctionBtnView.vue
index af31de2..e7d3b84 100644
--- a/src/components/makepager/PublicFunctionBtnView.vue
+++ b/src/components/makepager/PublicFunctionBtnView.vue
@@ -8,9 +8,9 @@
       <!-- <el-button v-if="submitApproval" size="small" type="text" class="gray width64" @click="submitApprovalBtnClick"
         >鎻愪氦瀹℃壒
       </el-button> -->
-      <!-- <el-button v-if="duplicateCheck" size="small" type="text" class="gray" @click="duplicateCheckBtnClick"
+      <el-button v-if="duplicateCheck" size="small" type="text" class="gray" @click="duplicateCheckBtnClick"
         >鏌ラ噸</el-button
-      > -->
+      >
       <!-- <el-button v-if="importButton" size="small" type="text" class="gray" @click="importBtnClick">瀵煎叆</el-button>
       <el-button v-if="departmentSet" size="small" type="text" class="gray" @click="departmentSetClick"
         >閮ㄩ棬璁剧疆</el-button
diff --git a/src/components/makepager/TableCommonView.vue b/src/components/makepager/TableCommonView.vue
index 129ae2b..80b1e97 100644
--- a/src/components/makepager/TableCommonView.vue
+++ b/src/components/makepager/TableCommonView.vue
@@ -1,5 +1,5 @@
 <template>
-  <div class="page-view">
+  <div class="table-view">
     <el-table
       ref="table"
       border
@@ -32,9 +32,27 @@
               ? "--"
               : dateFormat("YYYY-mm-dd HH:MM:SS", scope.row[item.prop])
           }}</span>
-          <span v-else-if="item.isClick" class="sel-name" @click="selNameClick(scope.row)">{{
+          <span v-else-if="item.isClick && scope.row[item.prop]" class="sel-name" @click="selNameClick(scope.row)">{{
             scope.row[item.prop]
           }}</span>
+          <span
+            v-else-if="item.isSalesLeadClick && scope.row[item.prop]"
+            class="sel-name"
+            @click="selSalesLeadClick(scope.row)"
+            >{{ scope.row[item.prop] }}</span
+          >
+          <span
+            v-else-if="item.isClientClick && scope.row[item.prop]"
+            class="sel-name"
+            @click="selClientClick(scope.row)"
+            >{{ scope.row[item.prop] ? scope.row[item.prop] : "--" }}</span
+          >
+          <span
+            v-else-if="item.isContactClick && scope.row[item.prop]"
+            class="sel-name"
+            @click="selContactsClick(scope.row)"
+            >{{ scope.row[item.prop] }}</span
+          >
           <span v-else>{{ scope.row[item.prop] ? scope.row[item.prop] : "--" }}</span>
         </template>
       </el-table-column>
@@ -184,6 +202,15 @@
     },
     selNameClick(row) {
       this.$emit("selCommonClick", row)
+    },
+    selSalesLeadClick(row) {
+      this.$emit("selSalesLeadClick", row)
+    },
+    selClientClick(row) {
+      this.$emit("selClientClick", row)
+    },
+    selContactsClick(row) {
+      this.$emit("selContactsClick", row)
     }
   }
 }
@@ -191,10 +218,10 @@
 
 <!-- Add "scoped" attribute to limit CSS to this component only -->
 <style lang="scss" scoped>
-.page-view {
-  margin-top: 20px;
+.table-view {
+  // margin-top: 20px;
   margin-right: 10px;
-  margin-bottom: 40px;
+  // margin-bottom: 40px;
   .blue {
     width: 70px;
     text-align: center;
diff --git a/src/components/makepager/pager/PagerView.vue b/src/components/makepager/pager/PagerView.vue
index 6160f1c..df8eae2 100644
--- a/src/components/makepager/pager/PagerView.vue
+++ b/src/components/makepager/pager/PagerView.vue
@@ -18,7 +18,7 @@
   props: {
     pageSizes: {
       type: Array,
-      default: () => [10, 20, 30, 40]
+      default: () => [5, 10, 20, 30, 40]
     },
     layout: {
       type: String,
diff --git a/src/main.js b/src/main.js
index 6b8ee12..8acc4e8 100644
--- a/src/main.js
+++ b/src/main.js
@@ -8,6 +8,11 @@
 import "@/components"
 
 Vue.use(ElementUI)
+// 淇敼榛樿鐐瑰嚮閬僵灞備负涓嶅叧闂�
+ElementUI.MessageBox.setDefaults({
+  closeOnClickModal: false
+})
+ElementUI.Dialog.props.closeOnClickModal.default = false
 
 Vue.config.productionTip = false
 
diff --git a/src/router/service/index.js b/src/router/service/index.js
index a4b6ab2..821c23a 100644
--- a/src/router/service/index.js
+++ b/src/router/service/index.js
@@ -19,7 +19,7 @@
     name: "orderManage",
     component: orderManage,
     meta: {
-      title: "宸ュ崟绠$悊"
+      title: "瀹㈡埛鏈嶅姟鍗�"
     }
   },
   {
diff --git a/src/views/client/client/DetailClientManage.vue b/src/views/client/client/DetailClientManage.vue
new file mode 100644
index 0000000..e1c0423
--- /dev/null
+++ b/src/views/client/client/DetailClientManage.vue
@@ -0,0 +1,528 @@
+<template>
+  <div class="detail-view">
+    <el-drawer
+      :visible.sync="detailConfig.visible"
+      size="80%"
+      :before-close="handleClose"
+      :wrapperClosable="false"
+      :append-to-body="true"
+    >
+      <template slot="title">
+        <div class="header">
+          <span class="header-label">瀹㈡埛鍚嶇О</span>
+          <span class="header-title">{{ detailConfig.infomation.client_name }}</span>
+        </div>
+      </template>
+      <div class="content">
+        <div class="tab-view">
+          <el-tabs v-model="activeName" @tab-click="tabsClick">
+            <el-tab-pane label="璇︽儏" name="first"></el-tab-pane>
+            <el-tab-pane label="鑱旂郴浜�" name="contact"></el-tab-pane>
+            <el-tab-pane label="璺熻繘璁板綍" name="second">
+              <!-- <template slot="label">
+                <div>璺熻繘璁板綍<el-badge type="primary" :value="2"> </el-badge></div>
+              </template> -->
+            </el-tab-pane>
+            <el-tab-pane label="閿�鍞満浼�" name="salesOpportunity"></el-tab-pane>
+            <el-tab-pane label="鎶ヤ环鍗�" name="quotation"></el-tab-pane>
+            <el-tab-pane label="閿�鍞�诲崟" name="master"></el-tab-pane>
+            <el-tab-pane label="閿�鍞瓙鍗�" name="sub"></el-tab-pane>
+            <el-tab-pane label="閿�鍞槑缁嗗崟" name="detail"></el-tab-pane>
+            <el-tab-pane label="鏀舵鍗�" name="plan"></el-tab-pane>
+          </el-tabs>
+        </div>
+        <div v-if="activeName === 'first'" class="detail">
+          <!-- 鍩烘湰淇℃伅 -->
+          <div class="basic-info">
+            <div class="basic-info-label" @click="expandClick('basic')">
+              <i v-if="isBasicExpand" class="el-icon-arrow-down"></i>
+              <i v-else class="el-icon-arrow-up"></i>
+              <span style="margin-left: 10px">鍩烘湰淇℃伅</span>
+            </div>
+            <div v-show="isBasicExpand" class="basic-info-content">
+              <ul>
+                <li v-for="(item, i) in basicInfoList" :key="i">
+                  <div class="left">
+                    <div class="content-title">{{ item.leftStr + "锛�" }}</div>
+                    <div class="content-data">{{ item.leftValue }}</div>
+                  </div>
+                  <div class="right">
+                    <div class="content-title">{{ item.rightStr }}</div>
+                    <div class="content-data">{{ item.rightValue }}</div>
+                  </div>
+                </li>
+              </ul>
+            </div>
+          </div>
+          <!-- 瀹㈡埛棣栬鑱旂郴浜� -->
+          <div class="basic-info">
+            <div class="basic-info-label" @click="expandClick('contact')">
+              <i v-if="isContactExpand" class="el-icon-arrow-down"></i>
+              <i v-else class="el-icon-arrow-up"></i>
+              <span style="margin-left: 10px">瀹㈡埛棣栬鑱旂郴浜�</span>
+            </div>
+            <div v-show="isContactExpand" class="basic-info-content">
+              <ul>
+                <li v-for="(item, i) in contactList" :key="i">
+                  <div class="left">
+                    <div class="content-title">{{ item.leftStr + "锛�" }}</div>
+                    <div class="content-data">{{ item.leftValue }}</div>
+                  </div>
+                  <div class="right">
+                    <div class="content-title">{{ item.rightStr }}</div>
+                    <div class="content-data">{{ item.rightValue }}</div>
+                  </div>
+                </li>
+              </ul>
+            </div>
+          </div>
+          <!-- 鍔ㄦ�佷俊鎭� -->
+          <div class="basic-info">
+            <div class="basic-info-label" @click="expandClick('dynamic')">
+              <i v-if="isDynamicExpand" class="el-icon-arrow-down"></i>
+              <i v-else class="el-icon-arrow-up"></i>
+              <span style="margin-left: 10px">鍔ㄦ�佷俊鎭�</span>
+            </div>
+            <div v-show="isDynamicExpand" class="basic-info-content">
+              <ul>
+                <li v-for="(item, i) in dynamicInfoList" :key="i">
+                  <div class="left">
+                    <div class="content-title">{{ item.leftStr + "锛�" }}</div>
+                    <div class="content-data">{{ item.leftValue }}</div>
+                  </div>
+                  <div class="right">
+                    <div class="content-title">{{ item.rightStr }}</div>
+                    <div class="content-data">{{ item.rightValue }}</div>
+                  </div>
+                </li>
+              </ul>
+            </div>
+          </div>
+          <!-- 宸ュ晢淇℃伅 -->
+          <div class="basic-info">
+            <div class="basic-info-label" @click="expandClick('business')">
+              <i v-if="isBusinessExpand" class="el-icon-arrow-down"></i>
+              <i v-else class="el-icon-arrow-up"></i>
+              <span style="margin-left: 10px">宸ュ晢淇℃伅</span>
+            </div>
+            <div v-show="isBusinessExpand" class="basic-info-content">
+              <ul>
+                <li v-for="(item, i) in businessInfoList" :key="i">
+                  <div class="left">
+                    <div class="content-title">{{ item.leftStr + "锛�" }}</div>
+                    <div class="content-data">{{ item.leftValue }}</div>
+                  </div>
+                  <div class="right">
+                    <div class="content-title">{{ item.rightStr }}</div>
+                    <div class="content-data">{{ item.rightValue }}</div>
+                  </div>
+                </li>
+              </ul>
+            </div>
+          </div>
+          <!-- 鍦板潃淇℃伅 -->
+          <div class="basic-info">
+            <div class="basic-info-label" @click="expandClick('address')">
+              <i v-if="isAddressExpand" class="el-icon-arrow-down"></i>
+              <i v-else class="el-icon-arrow-up"></i>
+              <span style="margin-left: 10px">鍦板潃淇℃伅</span>
+            </div>
+            <div v-show="isAddressExpand" class="basic-info-content">
+              <ul>
+                <li v-for="(item, i) in addressInfoList" :key="i">
+                  <div class="left">
+                    <div class="content-title">{{ item.leftStr + "锛�" }}</div>
+                    <div class="content-data">{{ item.leftValue }}</div>
+                  </div>
+                  <div class="right">
+                    <div class="content-title">{{ item.rightStr }}</div>
+                    <div class="content-data">{{ item.rightValue }}</div>
+                  </div>
+                </li>
+              </ul>
+            </div>
+          </div>
+          <!-- 澶囨敞淇℃伅 -->
+          <div class="basic-info">
+            <div class="basic-info-label" @click="expandClick('remark')">
+              <i v-if="isRemarkExpand" class="el-icon-arrow-down"></i>
+              <i v-else class="el-icon-arrow-up"></i>
+              <span style="margin-left: 10px">澶囨敞淇℃伅</span>
+            </div>
+            <div v-show="isRemarkExpand" class="basic-info-content">
+              <ul>
+                <li>
+                  <div class="left remark">
+                    <div class="content-title">{{ "澶囨敞锛�" }}</div>
+                    <div class="content-data">{{ "澶囨敞鍐呭" }}</div>
+                  </div>
+                </li>
+              </ul>
+            </div>
+          </div>
+          <!-- 闄勪欢淇℃伅 -->
+          <div class="basic-info">
+            <div class="basic-info-label" @click="expandClick('annex')">
+              <i v-if="isAnnexExpand" class="el-icon-arrow-down"></i>
+              <i v-else class="el-icon-arrow-up"></i>
+              <span style="margin-left: 10px">闄勪欢淇℃伅</span>
+            </div>
+            <div v-show="isAnnexExpand" class="basic-info-content">
+              <ul>
+                <li>
+                  <div class="left remark">
+                    <div class="content-title">{{ "闄勪欢锛�" }}</div>
+                    <div class="content-data">{{ "" }}</div>
+                  </div>
+                </li>
+              </ul>
+            </div>
+          </div>
+        </div>
+        <div v-if="activeName === 'contact'" class="second">
+          <Contacts :isDetail="true" />
+        </div>
+        <div v-if="activeName === 'second'" class="second">
+          <FollowupRecords :isDetail="true" />
+        </div>
+        <div v-if="activeName === 'salesOpportunity'" class="second">
+          <SalesOpportunity :isDetail="true" />
+        </div>
+        <div v-if="activeName === 'quotation'" class="second">
+          <Quotation :isDetail="true" />
+        </div>
+        <div v-if="activeName === 'master'" class="second">
+          <MasterOrder :isDetail="true" />
+        </div>
+        <div v-if="activeName === 'sub'" class="second">
+          <SubOrder :isDetail="true" />
+        </div>
+        <div v-if="activeName === 'detail'" class="second">
+          <SalesDetails :isDetail="true" />
+        </div>
+      </div>
+    </el-drawer>
+  </div>
+</template>
+
+<script>
+import FollowupRecords from "@/views/client/followupRecords"
+import Contacts from "@/views/client/contacts"
+import SalesOpportunity from "@/views/sales/salesOpportunity"
+import Quotation from "@/views/sales/quotation"
+import MasterOrder from "@/views/sales/masterOrder"
+import SubOrder from "@/views/sales/subOrder"
+import SalesDetails from "@/views/sales/salesDetails"
+export default {
+  name: "DetailClientManage",
+  props: {
+    clientManageDetail: {
+      type: Object,
+      default: () => {
+        return {
+          visible: false,
+          infomation: {}
+        }
+      }
+    }
+  },
+  components: { FollowupRecords, Contacts, SalesOpportunity, Quotation, MasterOrder, SubOrder, SalesDetails },
+  computed: {},
+  data() {
+    return {
+      detailConfig: this.clientManageDetail,
+      activeName: "first",
+      isBasicExpand: true, // 鍩烘湰淇℃伅灞曞紑
+      basicInfoList: [],
+      isContactExpand: true, // 棣栬鑱旂郴浜�
+      contactList: [],
+      isDynamicExpand: true, // 鍔ㄦ�佷俊鎭�
+      dynamicInfoList: [],
+      isBusinessExpand: true, // 宸ュ晢淇℃伅
+      businessInfoList: [],
+      isAddressExpand: true, // 鍦板潃淇℃伅
+      addressInfoList: [],
+      isRemarkExpand: true, // 澶囨敞淇℃伅
+      isAnnexExpand: true // 闄勪欢淇℃伅
+    }
+  },
+  created() {
+    this.setData()
+  },
+  mounted() {},
+  methods: {
+    setData() {
+      this.basicInfoList = [
+        {
+          leftStr: "瀹㈡埛鍚嶇О",
+          leftValue: this.detailConfig.infomation.client_name,
+          rightStr: "瀹㈡埛缂栧彿",
+          rightValue: this.detailConfig.infomation.number
+        },
+        {
+          leftStr: "瀹㈡埛鐘舵��",
+          leftValue: this.detailConfig.infomation.contact_name,
+          rightStr: "閿�鍞礋璐d汉",
+          rightValue: this.detailConfig.infomation.contact_position
+        },
+        {
+          leftStr: "瀹㈡埛绫诲瀷",
+          leftValue: this.detailConfig.infomation.contact_phone,
+          rightStr: "瀹㈡埛鏉ユ簮",
+          rightValue: "鏂板缓"
+        },
+        {
+          leftStr: "閲嶈绾у埆",
+          leftValue: this.detailConfig.infomation.sales_sources_id,
+          rightStr: "鍏捣鐘舵��",
+          rightValue: this.detailConfig.infomation.member_id
+        },
+        {
+          leftStr: "鎵�灞炲叕娴�",
+          leftValue: "",
+          rightStr: "鏈嶅姟浠h〃",
+          rightValue: ""
+        },
+        {
+          leftStr: "绛惧埌",
+          leftValue: "",
+          rightStr: "涓嬫鍥炶鏃ユ湡",
+          rightValue: ""
+        },
+        {
+          leftStr: "鍒涘缓鏃堕棿",
+          leftValue: "",
+          rightStr: "鏈�鏅氭湇鍔″埌鏈熸棩",
+          rightValue: ""
+        },
+        {
+          leftStr: "鍒涘缓浜�",
+          leftValue: "",
+          rightStr: "",
+          rightValue: ""
+        }
+      ]
+      this.contactList = [
+        {
+          leftStr: "鑱旂郴浜哄鍚�",
+          leftValue: "",
+          rightStr: "鑱旂郴浜烘墜鏈�",
+          rightValue: ""
+        },
+        {
+          leftStr: "鑱旂郴浜鸿亴鍔�",
+          leftValue: "",
+          rightStr: "鑱旂郴浜哄井淇�",
+          rightValue: ""
+        },
+        {
+          leftStr: "鑱旂郴浜篍mail",
+          leftValue: "",
+          rightStr: "",
+          rightValue: ""
+        }
+      ]
+      this.dynamicInfoList = [
+        {
+          leftStr: "鏈�鏂拌仈绯绘棩鏈�",
+          leftValue: "",
+          rightStr: "鏈仈绯诲ぉ鏁�",
+          rightValue: ""
+        },
+        {
+          leftStr: "鏈�鏂版帹杩涙椂闂�",
+          leftValue: "",
+          rightStr: "",
+          rightValue: ""
+        }
+      ]
+      this.businessInfoList = [
+        {
+          leftStr: "鎵�灞炶涓�",
+          leftValue: "",
+          rightStr: "娉曞畾浠h〃浜�",
+          rightValue: ""
+        },
+        {
+          leftStr: "娉ㄥ唽鏃堕棿",
+          leftValue: "",
+          rightStr: "娉ㄥ唽璧勯噾",
+          rightValue: ""
+        },
+        {
+          leftStr: "鍏徃鎬ц川",
+          leftValue: "",
+          rightStr: "瀹㈡埛瑙勬ā",
+          rightValue: ""
+        },
+        {
+          leftStr: "缁忚惀鑼冨洿",
+          leftValue: "",
+          rightStr: "",
+          rightValue: ""
+        }
+      ]
+      this.addressInfoList = [
+        {
+          leftStr: "鍥藉",
+          leftValue: "",
+          rightStr: "鐪佷唤",
+          rightValue: ""
+        },
+        {
+          leftStr: "鍩庡競",
+          leftValue: "",
+          rightStr: "鍖哄煙",
+          rightValue: ""
+        },
+        {
+          leftStr: "璇︾粏鍦板潃",
+          leftValue: "",
+          rightStr: "",
+          rightValue: ""
+        }
+      ]
+    },
+    handleClose() {
+      this.detailConfig.visible = false
+    },
+    // tab鍒囨崲
+    tabsClick(tab, event) {
+      console.log(tab, event)
+    },
+    // 灞曞紑鏀惰捣鐐瑰嚮浜嬩欢
+    expandClick(value) {
+      console.log(value)
+      if (value === "basic") {
+        this.isBasicExpand = !this.isBasicExpand
+      } else if (value === "contact") {
+        this.isContactExpand = !this.isContactExpand
+      } else if (value === "business") {
+        this.isBusinessExpand = !this.isBusinessExpand
+      } else if (value === "dynamic") {
+        this.isDynamicExpand = !this.isDynamicExpand
+      } else if (value === "address") {
+        this.isAddressExpand = !this.isAddressExpand
+      } else if (value === "remark") {
+        this.isRemarkExpand = !this.isRemarkExpand
+      } else if (value === "annex") {
+        this.isAnnexExpand = !this.isAnnexExpand
+      }
+    }
+  }
+}
+</script>
+
+<!-- Add "scoped" attribute to limit CSS to this component only -->
+<style lang="scss" scoped>
+::v-deep {
+  .el-drawer__header {
+    padding: 0;
+    margin-bottom: 0px;
+    .header {
+      height: 56px;
+      display: flex;
+      align-items: center;
+      padding-left: 10px;
+      .header-label {
+        padding: 5px;
+        border-radius: 4px;
+        background-color: #ff6600;
+        color: #fff;
+        font-size: 12px;
+      }
+      .header-title {
+        color: #323232;
+        font-size: 15px;
+        margin-left: 10px;
+        font-weight: inherit;
+      }
+    }
+  }
+  .el-tabs--top .el-tabs__item.is-top:nth-child(2) {
+    padding-left: 20px;
+  }
+  .el-tabs__item.is-active {
+    color: $color-primary;
+  }
+  .el-tabs__item:hover {
+    color: $color-primary;
+  }
+  .el-tabs__active-bar {
+    background-color: $color-primary;
+  }
+  .el-tabs__header {
+    margin: 0;
+  }
+  .el-drawer__body {
+    .content {
+      background-color: rgb(230, 233, 240);
+      padding: 8px;
+      .tab-view {
+        background: #fff;
+        // .tab-view-pane {
+        //   position: relative;
+        .item {
+          position: absolute;
+          top: 0px;
+          right: 0px;
+        }
+        // }
+      }
+      .detail {
+        .basic-info {
+          .basic-info-label {
+            padding-left: 10px;
+            height: 42px;
+            line-height: 42px;
+            background: #f4f8fe;
+            color: #333;
+            font-size: 14px;
+          }
+          .basic-info-content {
+            background: #fff;
+            ul {
+              padding-inline-start: 0;
+            }
+            li {
+              display: flex;
+              font-size: 14px;
+              font-family: PingFangSC;
+              border-bottom: 1px solid #f9f9fb;
+              .left,
+              .right {
+                width: 50%;
+                display: flex;
+                align-items: center;
+                height: 40px;
+                .content-title {
+                  width: 220px;
+                  text-align: right;
+                  color: #555;
+                }
+                .content-data {
+                  text-align: left;
+                  margin-left: 25px;
+                  color: #333;
+                }
+              }
+              .remark {
+                width: 100%;
+              }
+            }
+          }
+        }
+      }
+      .second {
+        background: #fff;
+        .followup-records {
+          .table-view {
+            margin-top: 0 !important;
+            margin-bottom: 0;
+          }
+        }
+      }
+    }
+  }
+}
+</style>
diff --git a/src/views/client/client/index.vue b/src/views/client/client/index.vue
index 6b3fe15..c6688f2 100644
--- a/src/views/client/client/index.vue
+++ b/src/views/client/client/index.vue
@@ -18,18 +18,30 @@
         </div>
       </div>
     </div>
-    <SearchCommonView ref="searchCommonView" :query-class-options="queryClassOptions" :search-options="searchOptions" />
-    <div class="btn-pager">
-      <PublicFunctionBtnView
-        :duplicate-check="true"
-        :list-button="true"
-        :map-button="true"
-        :statistics="true"
-        :operates-list="operatesList"
+    <div class="top">
+      <SearchCommonView
+        ref="searchCommonView"
+        :query-class-options="queryClassOptions"
+        :search-options="searchOptions"
       />
-      <PagerView class="page" :pager-options="pagerOptions" v-on="pagerEvents" />
+      <div class="btn-pager">
+        <PublicFunctionBtnView
+          :duplicate-check="true"
+          :list-button="true"
+          :map-button="true"
+          :statistics="true"
+          :operates-list="operatesList"
+        />
+        <PagerView class="page" :pager-options="pagerOptions" v-on="pagerEvents" />
+      </div>
     </div>
-    <TableCommonView ref="tableListRef" v-loading="loading" :table-list="tableList">
+    <TableCommonView
+      ref="tableListRef"
+      v-loading="loading"
+      :table-list="tableList"
+      @selClientClick="selClientClick"
+      @selContactsClick="selContactsClick"
+    >
       <template slot="tableButton">
         <el-table-column label="鎿嶄綔" width="180">
           <template slot-scope="scope">
@@ -43,11 +55,15 @@
     </TableCommonView>
     <!-- 鏂板缓/缂栬緫瀹㈡埛绠$悊 -->
     <AddClientManageDialog v-if="editConfig.visible" :edit-client-manage-config="editConfig" />
+    <!-- 瀹㈡埛璇︽儏 -->
+    <DetailClientManage v-if="clientDeail.visible" :client-manage-detail="clientDeail" />
+    <!-- 鑱旂郴浜鸿鎯� -->
+    <DetailContacts v-if="contactsDeail.visible" :contacts-detail="contactsDeail" />
   </div>
 </template>
 
 <script>
-import AddClientManageDialog from "@/views/client/client/AddClientManageDialog.vue"
+import AddClientManageDialog from "@/views/client/client/AddClientManageDialog"
 import { getClientList, getDeleteClient } from "@/api/client/client"
 import pageMixin from "@/components/makepager/pager/mixin/pageMixin"
 
@@ -56,7 +72,9 @@
   props: {},
   mixins: [pageMixin],
   components: {
-    AddClientManageDialog
+    AddClientManageDialog,
+    DetailContacts: () => import("@/views/client/contacts/DetailContacts"),
+    DetailClientManage: () => import("@/views/client/client/DetailClientManage")
   },
   computed: {
     searchCommonHeight() {
@@ -93,6 +111,14 @@
         visible: false,
         title: "鏂板缓",
         infomation: {}
+      },
+      contactsDeail: {
+        visible: false,
+        infomation: {}
+      },
+      clientDeail: {
+        visible: false,
+        infomation: {}
       }
     }
   },
@@ -105,13 +131,13 @@
       this.tableList = {
         tableInfomation: [],
         tableColumn: [
-          { label: "瀹㈡埛鍚嶇О", prop: "name", min: 100 }, // 瀹㈡埛鍚嶇О
+          { label: "瀹㈡埛鍚嶇О", prop: "name", min: 100, isClientClick: true }, // 瀹㈡埛鍚嶇О
           { label: "閿�鍞礋璐d汉", prop: "member_id" }, // 閿�鍞礋璐d汉
           { label: "閲嶈绾у埆", prop: "client_level_id" }, // 閲嶈绾у埆
           { label: "涓嬫鍥炶鏃ユ湡", prop: "next_visit_time", isTime: true, min: 90 }, // 涓嬫鍥炶鏃ユ湡
           { label: "璇︾粏鍦板潃", prop: "detail_address", min: 200 }, // 璇︾粏鍦板潃
           { label: "瀹㈡埛鐘舵��", prop: "client_status_id" }, // 瀹㈡埛鐘舵��
-          { label: "鑱旂郴浜哄鍚�", prop: "contact_name" }, // 鑱旂郴浜哄鍚�
+          { label: "鑱旂郴浜哄鍚�", prop: "contact_name", isContactClick: true }, // 鑱旂郴浜哄鍚�
           { label: "鎵嬫満鍙风爜", prop: "contact_phone" } // 鎵嬫満鍙风爜
         ]
       }
@@ -217,6 +243,18 @@
     },
     getSelectArray(val) {
       console.log(val)
+    },
+    // 瀹㈡埛鍚嶇О璇︽儏
+    selClientClick(row) {
+      console.log(row)
+      this.clientDeail.visible = true
+      this.clientDeail.infomation = { ...row, client_name: row.name }
+    },
+    // 鑱旂郴浜鸿鎯�
+    selContactsClick(row) {
+      console.log(row)
+      this.contactsDeail.visible = true
+      this.contactsDeail.infomation = { ...row }
     }
   }
 }
@@ -245,10 +283,13 @@
       }
     }
   }
-  .btn-pager {
-    display: flex;
-    .page {
-      margin-left: auto;
+  .top {
+    margin-bottom: 20px;
+    .btn-pager {
+      display: flex;
+      .page {
+        margin-left: auto;
+      }
     }
   }
 }
diff --git a/src/views/client/contacts/DetailContacts.vue b/src/views/client/contacts/DetailContacts.vue
new file mode 100644
index 0000000..97e078c
--- /dev/null
+++ b/src/views/client/contacts/DetailContacts.vue
@@ -0,0 +1,363 @@
+<template>
+  <div class="detail-view">
+    <el-drawer
+      :visible.sync="detailConfig.visible"
+      size="80%"
+      :before-close="handleClose"
+      :wrapperClosable="false"
+      :append-to-body="true"
+    >
+      <template slot="title">
+        <div class="header">
+          <span class="header-label">鑱旂郴浜哄鍚�</span>
+          <span class="header-title">{{ detailConfig.infomation.contact_name }}</span>
+        </div>
+      </template>
+      <div class="content">
+        <div class="tab-view">
+          <el-tabs v-model="activeName" @tab-click="tabsClick">
+            <el-tab-pane label="璇︽儏" name="first"></el-tab-pane>
+            <el-tab-pane label="璺熻繘璁板綍" name="second">
+              <!-- <template slot="label">
+                <div>璺熻繘璁板綍<el-badge type="primary" :value="2"> </el-badge></div>
+              </template> -->
+            </el-tab-pane>
+            <el-tab-pane label="閿�鍞槑缁嗗崟" name="detail"></el-tab-pane>
+            <el-tab-pane label="鏈嶅姟鍚堝悓" name="serviceContract"></el-tab-pane>
+          </el-tabs>
+        </div>
+        <div v-if="activeName === 'first'" class="detail">
+          <!-- 鍩烘湰淇℃伅 -->
+          <div class="basic-info">
+            <div class="basic-info-label" @click="expandClick('basic')">
+              <i v-if="isBasicExpand" class="el-icon-arrow-down"></i>
+              <i v-else class="el-icon-arrow-up"></i>
+              <span style="margin-left: 10px">鍩烘湰淇℃伅</span>
+            </div>
+            <div v-show="isBasicExpand" class="basic-info-content">
+              <ul>
+                <li v-for="(item, i) in basicInfoList" :key="i">
+                  <div class="left">
+                    <div class="content-title">{{ item.leftStr + "锛�" }}</div>
+                    <div class="content-data">{{ item.leftValue }}</div>
+                  </div>
+                  <div class="right">
+                    <div class="content-title">{{ item.rightStr }}</div>
+                    <div class="content-data">{{ item.rightValue }}</div>
+                  </div>
+                </li>
+              </ul>
+            </div>
+          </div>
+          <!-- 鍦板潃淇℃伅 -->
+          <div class="basic-info">
+            <div class="basic-info-label" @click="expandClick('address')">
+              <i v-if="isAddressExpand" class="el-icon-arrow-down"></i>
+              <i v-else class="el-icon-arrow-up"></i>
+              <span style="margin-left: 10px">鍦板潃淇℃伅</span>
+            </div>
+            <div v-show="isAddressExpand" class="basic-info-content">
+              <ul>
+                <li v-for="(item, i) in addressInfoList" :key="i">
+                  <div class="left">
+                    <div class="content-title">{{ item.leftStr + "锛�" }}</div>
+                    <div class="content-data">{{ item.leftValue }}</div>
+                  </div>
+                  <div class="right">
+                    <div class="content-title">{{ item.rightStr }}</div>
+                    <div class="content-data">{{ item.rightValue }}</div>
+                  </div>
+                </li>
+              </ul>
+            </div>
+          </div>
+          <!-- 澶囨敞淇℃伅 -->
+          <div class="basic-info">
+            <div class="basic-info-label" @click="expandClick('remark')">
+              <i v-if="isRemarkExpand" class="el-icon-arrow-down"></i>
+              <i v-else class="el-icon-arrow-up"></i>
+              <span style="margin-left: 10px">澶囨敞淇℃伅</span>
+            </div>
+            <div v-show="isRemarkExpand" class="basic-info-content">
+              <ul>
+                <li>
+                  <div class="left remark">
+                    <div class="content-title">{{ "澶囨敞锛�" }}</div>
+                    <div class="content-data">{{ "澶囨敞鍐呭" }}</div>
+                  </div>
+                </li>
+              </ul>
+            </div>
+          </div>
+          <!-- 闄勪欢淇℃伅 -->
+          <div class="basic-info">
+            <div class="basic-info-label" @click="expandClick('annex')">
+              <i v-if="isAnnexExpand" class="el-icon-arrow-down"></i>
+              <i v-else class="el-icon-arrow-up"></i>
+              <span style="margin-left: 10px">闄勪欢淇℃伅</span>
+            </div>
+            <div v-show="isAnnexExpand" class="basic-info-content">
+              <ul>
+                <li>
+                  <div class="left remark">
+                    <div class="content-title">{{ "闄勪欢锛�" }}</div>
+                    <div class="content-data">{{ "" }}</div>
+                  </div>
+                </li>
+              </ul>
+            </div>
+          </div>
+        </div>
+        <div v-if="activeName === 'second'" class="second">
+          <FollowupRecords :isDetail="true" />
+        </div>
+        <div v-if="activeName === 'detail'" class="second">
+          <SalesDetails :isDetail="true" />
+        </div>
+        <div v-if="activeName === 'serviceContract'" class="second">
+          <ServiceContract :isDetail="true" />
+        </div>
+      </div>
+    </el-drawer>
+  </div>
+</template>
+
+<script>
+import FollowupRecords from "@/views/client/followupRecords"
+import SalesDetails from "@/views/sales/salesDetails"
+import ServiceContract from "@/views/service/serviceContract"
+export default {
+  name: "DetailContacts",
+  props: {
+    contactsDetail: {
+      type: Object,
+      default: () => {
+        return {
+          visible: false,
+          infomation: {}
+        }
+      }
+    }
+  },
+  components: { FollowupRecords, ServiceContract, SalesDetails },
+  computed: {},
+  data() {
+    return {
+      detailConfig: this.contactsDetail,
+      activeName: "first",
+      isBasicExpand: true, // 鍩烘湰淇℃伅灞曞紑
+      basicInfoList: [],
+      isAddressExpand: true, // 鍦板潃淇℃伅
+      addressInfoList: [],
+      isRemarkExpand: true, // 澶囨敞淇℃伅
+      isAnnexExpand: true // 闄勪欢淇℃伅
+    }
+  },
+  created() {
+    this.setData()
+  },
+  mounted() {},
+  methods: {
+    setData() {
+      this.basicInfoList = [
+        {
+          leftStr: "鑱旂郴浜哄鍚�",
+          leftValue: "",
+          rightStr: "鑱旂郴浜虹紪鍙�",
+          rightValue: ""
+        },
+        {
+          leftStr: "瀹㈡埛鍚嶇О",
+          leftValue: "",
+          rightStr: "鎵嬫満",
+          rightValue: ""
+        },
+        {
+          leftStr: "鑱屽姟",
+          leftValue: "",
+          rightStr: "閿�鍞礋璐d汉",
+          rightValue: ""
+        },
+        {
+          leftStr: "棣栬鑱旂郴浜�",
+          leftValue: "",
+          rightStr: "寰俊鍙�",
+          rightValue: ""
+        },
+        {
+          leftStr: "鐢熸棩",
+          leftValue: "",
+          rightStr: "鑱旂郴浜篍mail",
+          rightValue: ""
+        },
+        {
+          leftStr: "绛惧埌",
+          leftValue: "",
+          rightStr: "涓嬫鍥炶鏃ユ湡",
+          rightValue: ""
+        },
+        {
+          leftStr: "鏈�鏂拌仈绯绘棩鏈�",
+          leftValue: "",
+          rightStr: "鏈仈绯诲ぉ鏁�",
+          rightValue: ""
+        }
+      ]
+      this.addressInfoList = [
+        {
+          leftStr: "鍥藉",
+          leftValue: "",
+          rightStr: "鐪佷唤",
+          rightValue: ""
+        },
+        {
+          leftStr: "鍩庡競",
+          leftValue: "",
+          rightStr: "鍖哄煙",
+          rightValue: ""
+        },
+        {
+          leftStr: "閭紪",
+          leftValue: "",
+          rightStr: "",
+          rightValue: ""
+        }
+      ]
+    },
+    handleClose() {
+      this.detailConfig.visible = false
+    },
+    // tab鍒囨崲
+    tabsClick(tab, event) {
+      console.log(tab, event)
+    },
+    // 灞曞紑鏀惰捣鐐瑰嚮浜嬩欢
+    expandClick(value) {
+      console.log(value)
+      if (value === "basic") {
+        this.isBasicExpand = !this.isBasicExpand
+      } else if (value === "remark") {
+        this.isRemarkExpand = !this.isRemarkExpand
+      } else if (value === "address") {
+        this.isAddressExpand = !this.isAddressExpand
+      } else if (value === "annex") {
+        this.isAnnexExpand = !this.isAnnexExpand
+      }
+    }
+  }
+}
+</script>
+
+<!-- Add "scoped" attribute to limit CSS to this component only -->
+<style lang="scss" scoped>
+::v-deep {
+  .el-drawer__header {
+    padding: 0;
+    margin-bottom: 0px;
+    .header {
+      height: 56px;
+      display: flex;
+      align-items: center;
+      padding-left: 10px;
+      .header-label {
+        padding: 5px;
+        border-radius: 4px;
+        background-color: #ff6600;
+        color: #fff;
+        font-size: 12px;
+      }
+      .header-title {
+        color: #323232;
+        font-size: 15px;
+        margin-left: 10px;
+        font-weight: inherit;
+      }
+    }
+  }
+  .el-tabs--top .el-tabs__item.is-top:nth-child(2) {
+    padding-left: 20px;
+  }
+  .el-tabs__item.is-active {
+    color: $color-primary;
+  }
+  .el-tabs__item:hover {
+    color: $color-primary;
+  }
+  .el-tabs__active-bar {
+    background-color: $color-primary;
+  }
+  .el-tabs__header {
+    margin: 0;
+  }
+  .el-drawer__body {
+    .content {
+      background-color: rgb(230, 233, 240);
+      padding: 8px;
+      .tab-view {
+        background: #fff;
+        // .tab-view-pane {
+        //   position: relative;
+        .item {
+          position: absolute;
+          top: 0px;
+          right: 0px;
+        }
+        // }
+      }
+      .detail {
+        .basic-info {
+          .basic-info-label {
+            padding-left: 10px;
+            height: 42px;
+            line-height: 42px;
+            background: #f4f8fe;
+            color: #333;
+            font-size: 14px;
+          }
+          .basic-info-content {
+            background: #fff;
+            ul {
+              padding-inline-start: 0;
+            }
+            li {
+              display: flex;
+              font-size: 14px;
+              font-family: PingFangSC;
+              border-bottom: 1px solid #f9f9fb;
+              .left,
+              .right {
+                width: 50%;
+                display: flex;
+                align-items: center;
+                height: 40px;
+                .content-title {
+                  width: 220px;
+                  text-align: right;
+                  color: #555;
+                }
+                .content-data {
+                  text-align: left;
+                  margin-left: 25px;
+                  color: #333;
+                }
+              }
+              .remark {
+                width: 100%;
+              }
+            }
+          }
+        }
+      }
+      .second {
+        background: #fff;
+        .followup-records {
+          .table-view {
+            margin-top: 0 !important;
+            margin-bottom: 0;
+          }
+        }
+      }
+    }
+  }
+}
+</style>
diff --git a/src/views/client/contacts/index.vue b/src/views/client/contacts/index.vue
index 6d2325e..ec669d5 100644
--- a/src/views/client/contacts/index.vue
+++ b/src/views/client/contacts/index.vue
@@ -1,11 +1,27 @@
 <template>
   <div class="contacts-view">
-    <SearchCommonView ref="searchCommonView" :query-class-options="queryClassOptions" :search-options="searchOptions" />
-    <div class="btn-pager">
-      <PublicFunctionBtnView :operates-list="operatesList" />
+    <div v-if="isDetail" class="detail-top">
+      <DetailListCommonBtn :query-class-options="queryClassOptions" />
       <PagerView class="page" :pager-options="pagerOptions" v-on="pagerEvents" />
     </div>
-    <TableCommonView ref="tableListRef" v-loading="loading" :table-list="tableList">
+    <div v-else class="top">
+      <SearchCommonView
+        ref="searchCommonView"
+        :query-class-options="queryClassOptions"
+        :search-options="searchOptions"
+      />
+      <div class="btn-pager">
+        <PublicFunctionBtnView :operates-list="operatesList" :allocation="false" />
+        <PagerView class="page" :pager-options="pagerOptions" v-on="pagerEvents" />
+      </div>
+    </div>
+    <TableCommonView
+      ref="tableListRef"
+      v-loading="loading"
+      :table-list="tableList"
+      @selContactsClick="selContactsClick"
+      @selClientClick="selClientClick"
+    >
       <template slot="tableButton">
         <el-table-column label="鎿嶄綔" width="120" fixed="right">
           <template slot-scope="scope">
@@ -18,6 +34,10 @@
     </TableCommonView>
     <!-- 鏂板缓/缂栬緫鑱旂郴浜� -->
     <AddContactsDialog v-if="editConfig.visible" :edit-contacts-config="editConfig" />
+    <!-- 鑱旂郴浜鸿鎯� -->
+    <DetailContacts v-if="contactsDeail.visible" :contacts-detail="contactsDeail" />
+    <!-- 瀹㈡埛璇︽儏 -->
+    <DetailClientManage v-if="clientDeail.visible" :client-manage-detail="clientDeail" />
   </div>
 </template>
 
@@ -27,10 +47,17 @@
 import pageMixin from "@/components/makepager/pager/mixin/pageMixin"
 export default {
   name: "ContactsView",
-  props: {},
+  props: {
+    isDetail: {
+      type: Boolean,
+      default: false
+    }
+  },
   mixins: [pageMixin],
   components: {
-    AddContactsDialog
+    AddContactsDialog,
+    DetailContacts: () => import("@/views/client/contacts/DetailContacts"),
+    DetailClientManage: () => import("@/views/client/client/DetailClientManage")
   },
   computed: {},
   data() {
@@ -59,6 +86,14 @@
         visible: false,
         title: "鏂板缓",
         infomation: {}
+      },
+      contactsDeail: {
+        visible: false,
+        infomation: {}
+      },
+      clientDeail: {
+        visible: false,
+        infomation: {}
       }
     }
   },
@@ -71,8 +106,8 @@
       this.tableList = {
         tableInfomation: [],
         tableColumn: [
-          { label: "鑱旂郴浜哄鍚�", prop: "name", min: 100 }, // 鑱旂郴浜哄鍚�
-          { label: "瀹㈡埛鍚嶇О", prop: "client_name", min: 190 }, // 瀹㈡埛鍚嶇О
+          { label: "鑱旂郴浜哄鍚�", prop: "name", min: 100, isContactClick: true }, // 鑱旂郴浜哄鍚�
+          { label: "瀹㈡埛鍚嶇О", prop: "client_name", min: 190, isClientClick: true }, // 瀹㈡埛鍚嶇О
           { label: "鑱旂郴浜虹紪鍙�", prop: "number", min: 100 }, // 鑱旂郴浜虹紪鍙�
           { label: "鑱屽姟", prop: "position", min: 120 }, // 鑱屽姟
           { label: "鎵嬫満", prop: "phone", min: 100 }, // 鎵嬫満鍙风爜
@@ -156,6 +191,18 @@
     },
     getSelectArray(val) {
       console.log(val)
+    },
+    // 鑱旂郴浜鸿鎯�
+    selContactsClick(row) {
+      console.log(row)
+      this.contactsDeail.visible = true
+      this.contactsDeail.infomation = { ...row, contact_name: row.name }
+    },
+    // 瀹㈡埛鍚嶇О璇︽儏
+    selClientClick(row) {
+      console.log(row)
+      this.clientDeail.visible = true
+      this.clientDeail.infomation = { ...row, client_name: row.Client.name }
     }
   }
 }
@@ -164,7 +211,16 @@
 <!-- Add "scoped" attribute to limit CSS to this component only -->
 <style lang="scss" scoped>
 .contacts-view {
-  .btn-pager {
+  .top {
+    margin-bottom: 20px;
+    .btn-pager {
+      display: flex;
+      .page {
+        margin-left: auto;
+      }
+    }
+  }
+  .detail-top {
     display: flex;
     .page {
       margin-left: auto;
diff --git a/src/views/client/followupRecords/AddFollowupRecordsDialog.vue b/src/views/client/followupRecords/AddFollowupRecordsDialog.vue
index 007f860..457eb0b 100644
--- a/src/views/client/followupRecords/AddFollowupRecordsDialog.vue
+++ b/src/views/client/followupRecords/AddFollowupRecordsDialog.vue
@@ -5,6 +5,8 @@
       :visible.sync="editConfig.visible"
       :width="dialogWidth"
       :before-close="handleClose"
+      append-to-body
+      custom-class="iframe-dialog"
     >
       <el-form
         ref="form"
@@ -553,54 +555,56 @@
 
 <!-- Add "scoped" attribute to limit CSS to this component only -->
 <style lang="scss" scoped>
-.add-followup-records {
-  .basic-info {
-    .basic-info-title {
-      background-color: #f4f8fe;
-      padding-left: 10px;
-      font-size: 15px;
-      font-weight: bold;
-      color: #666;
-      height: 42px;
-      line-height: 42px;
-    }
-    .basic-info-view {
-      margin-top: 10px;
-      padding-right: 40px;
-      .custom-name,
-      .common-select {
+::v-deep {
+  .iframe-dialog .el-dialog__body {
+    .basic-info {
+      .basic-info-title {
+        background-color: #f4f8fe;
+        padding-left: 10px;
+        font-size: 15px;
+        font-weight: bold;
+        color: #666;
+        height: 42px;
+        line-height: 42px;
+      }
+      .basic-info-view {
+        margin-top: 10px;
+        padding-right: 40px;
+        .custom-name,
+        .common-select {
+          display: flex;
+          .common-select-btn {
+            margin-left: 5px;
+            font-size: 18px;
+            cursor: pointer;
+          }
+        }
+        .common-select {
+          .common-select-sel {
+            width: 270px;
+          }
+        }
+      }
+      .annex-view {
         display: flex;
-        .common-select-btn {
-          margin-left: 5px;
-          font-size: 18px;
-          cursor: pointer;
-        }
-      }
-      .common-select {
-        .common-select-sel {
-          width: 270px;
+        color: #6166d3;
+        .setFormat {
+          margin-left: 10px;
         }
       }
     }
-    .annex-view {
+    .unflod-collapse {
       display: flex;
+      height: 30px;
+      justify-content: center;
+      align-items: center;
       color: #6166d3;
-      .setFormat {
-        margin-left: 10px;
-      }
     }
-  }
-  .unflod-collapse {
-    display: flex;
-    height: 30px;
-    justify-content: center;
-    align-items: center;
-    color: #6166d3;
-  }
-  .dialog-footer {
-    background-color: #f5f5f5;
-    height: 55px;
-    line-height: 55px;
+    .dialog-footer {
+      background-color: #f5f5f5;
+      height: 55px;
+      line-height: 55px;
+    }
   }
 }
 </style>
diff --git a/src/views/client/followupRecords/index.vue b/src/views/client/followupRecords/index.vue
index 63e2a72..24a3a97 100644
--- a/src/views/client/followupRecords/index.vue
+++ b/src/views/client/followupRecords/index.vue
@@ -1,11 +1,28 @@
 <template>
   <div class="followup-records">
-    <SearchCommonView ref="searchCommonView" :query-class-options="queryClassOptions" :search-options="searchOptions" />
-    <div class="btn-pager">
-      <PublicFunctionBtnView :statistics="true" :operates-list="operatesList" />
+    <div v-if="isDetail" class="detail-top">
+      <DetailListCommonBtn :query-class-options="queryClassOptions" />
       <PagerView class="page" :pager-options="pagerOptions" v-on="pagerEvents" />
     </div>
-    <TableCommonView ref="tableListRef" v-loading="loading" :table-list="tableList">
+    <div v-else class="top">
+      <SearchCommonView
+        ref="searchCommonView"
+        :query-class-options="queryClassOptions"
+        :search-options="searchOptions"
+      />
+      <div class="btn-pager">
+        <PublicFunctionBtnView :statistics="true" :operates-list="operatesList" />
+        <PagerView class="page" :pager-options="pagerOptions" v-on="pagerEvents" />
+      </div>
+    </div>
+    <TableCommonView
+      ref="tableListRef"
+      v-loading="loading"
+      :table-list="tableList"
+      :select-box="!isDetail"
+      @selContactsClick="selContactsClick"
+      @selClientClick="selClientClick"
+    >
       <template slot="tableButton">
         <el-table-column label="鎿嶄綔" width="120" fixed="right">
           <template slot-scope="scope">
@@ -17,6 +34,10 @@
     </TableCommonView>
     <!-- 鏂板缓/缂栬緫璺熻繘璁板綍 -->
     <AddFollowupRecordsDialog v-if="editConfig.visible" :edit-contacts-config="editConfig" />
+    <!-- 鑱旂郴浜鸿鎯� -->
+    <DetailContacts v-if="contactsDeail.visible" :contacts-detail="contactsDeail" />
+    <!-- 瀹㈡埛璇︽儏 -->
+    <DetailClientManage v-if="clientDeail.visible" :client-manage-detail="clientDeail" />
   </div>
 </template>
 
@@ -27,10 +48,17 @@
 
 export default {
   name: "FollowupRecords",
-  props: {},
+  props: {
+    isDetail: {
+      type: Boolean,
+      default: false
+    }
+  },
   mixins: [pageMixin],
   components: {
-    AddFollowupRecordsDialog
+    AddFollowupRecordsDialog,
+    DetailContacts: () => import("@/views/client/contacts/DetailContacts"),
+    DetailClientManage: () => import("@/views/client/client/DetailClientManage")
   },
   computed: {
     searchCommonHeight() {
@@ -42,6 +70,7 @@
       tableList: {},
       loading: false,
       activeName: "second",
+      queryClassValue: "1",
       queryClassOptions: [
         { value: "1", label: "鍏ㄩ儴" },
         { value: "2", label: "浠婃棩鑱旂郴" },
@@ -64,7 +93,15 @@
         title: "鏂板缓",
         infomation: {}
       },
-      saleChanceName: ""
+      saleChanceName: "",
+      contactsDeail: {
+        visible: false,
+        infomation: {}
+      },
+      clientDeail: {
+        visible: false,
+        infomation: {}
+      }
     }
   },
   created() {
@@ -77,8 +114,8 @@
         tableInfomation: [],
         tableColumn: [
           { label: "涓婚", prop: "topic", min: 120 }, // 涓婚
-          { label: "瀹㈡埛鍚嶇О", prop: "client_name", min: 190 }, // 瀹㈡埛鍚嶇О
-          { label: "鑱旂郴浜哄鍚�", prop: "contact_name", min: 100 }, // 鑱旂郴浜哄鍚�
+          { label: "瀹㈡埛鍚嶇О", prop: "client_name", min: 190, isClientClick: true }, // 瀹㈡埛鍚嶇О
+          { label: "鑱旂郴浜哄鍚�", prop: "contact_name", min: 100, isContactClick: true }, // 鑱旂郴浜哄鍚�
           { label: "瀹㈡埛鐘舵��", prop: "client_status_id", min: 100 }, // 瀹㈡埛鐘舵��
           { label: "鑱旂郴鏂瑰紡", prop: "phone", min: 100 }, // 鑱旂郴鏂瑰紡
           { label: "鑱旂郴浜烘棩鏈�", prop: "follow_time", isTime: true, min: 130 }, // 鑱旂郴浜烘棩鏈�
@@ -93,7 +130,6 @@
         this.searchOptions.push({ value: (i + 1).toString(), label: label })
       }
     },
-    // 璇锋眰鏁版嵁
     // 璇锋眰鏁版嵁
     async getData() {
       this.loading = true
@@ -166,6 +202,18 @@
     },
     getSelectArray(val) {
       console.log(val)
+    },
+    // 鑱旂郴浜鸿鎯�
+    selContactsClick(row) {
+      console.log(row)
+      this.contactsDeail.visible = true
+      this.contactsDeail.infomation = { ...row }
+    },
+    // 瀹㈡埛鍚嶇О璇︽儏
+    selClientClick(row) {
+      console.log(row)
+      this.clientDeail.visible = true
+      this.clientDeail.infomation = { ...row }
     }
   }
 }
@@ -174,7 +222,16 @@
 <!-- Add "scoped" attribute to limit CSS to this component only -->
 <style lang="scss" scoped>
 .followup-records {
-  .btn-pager {
+  .top {
+    margin-bottom: 20px;
+    .btn-pager {
+      display: flex;
+      .page {
+        margin-left: auto;
+      }
+    }
+  }
+  .detail-top {
     display: flex;
     .page {
       margin-left: auto;
diff --git a/src/views/client/salesLead/DetailSalesLead.vue b/src/views/client/salesLead/DetailSalesLead.vue
new file mode 100644
index 0000000..b5b4d88
--- /dev/null
+++ b/src/views/client/salesLead/DetailSalesLead.vue
@@ -0,0 +1,365 @@
+<template>
+  <div class="detail-view">
+    <el-drawer :visible.sync="detailConfig.visible" size="80%" :before-close="handleClose" :wrapperClosable="false">
+      <template slot="title">
+        <div class="header">
+          <span class="header-label">瀹㈡埛鍚嶇О</span>
+          <span class="header-title">{{ detailConfig.infomation.name }}</span>
+        </div>
+      </template>
+      <div class="content">
+        <div class="tab-view">
+          <el-tabs v-model="activeName" @tab-click="tabsClick">
+            <el-tab-pane label="璇︽儏" name="first"></el-tab-pane>
+            <el-tab-pane label="璺熻繘璁板綍" name="second">
+              <!-- <template slot="label">
+                <div>璺熻繘璁板綍<el-badge type="primary" :value="2"> </el-badge></div>
+              </template> -->
+            </el-tab-pane>
+          </el-tabs>
+        </div>
+        <div v-if="activeName === 'first'" class="detail">
+          <!-- 鍩烘湰淇℃伅 -->
+          <div class="basic-info">
+            <div class="basic-info-label" @click="expandClick('basic')">
+              <i v-if="isBasicExpand" class="el-icon-arrow-down"></i>
+              <i v-else class="el-icon-arrow-up"></i>
+              <span style="margin-left: 10px">鍩烘湰淇℃伅</span>
+            </div>
+            <div v-show="isBasicExpand" class="basic-info-content">
+              <ul>
+                <li v-for="(item, i) in basicInfoList" :key="i">
+                  <div class="left">
+                    <div class="content-title">{{ item.leftStr + "锛�" }}</div>
+                    <div class="content-data">{{ item.leftValue }}</div>
+                  </div>
+                  <div class="right">
+                    <div class="content-title">{{ item.rightStr }}</div>
+                    <div class="content-data">{{ item.rightValue }}</div>
+                  </div>
+                </li>
+              </ul>
+            </div>
+          </div>
+          <!-- 鍔ㄦ�佷俊鎭� -->
+          <div class="basic-info">
+            <div class="basic-info-label" @click="expandClick('dynamic')">
+              <i v-if="isDynamicExpand" class="el-icon-arrow-down"></i>
+              <i v-else class="el-icon-arrow-up"></i>
+              <span style="margin-left: 10px">鍔ㄦ�佷俊鎭�</span>
+            </div>
+            <div v-show="isDynamicExpand" class="basic-info-content">
+              <ul>
+                <li v-for="(item, i) in dynamicInfoList" :key="i">
+                  <div class="left">
+                    <div class="content-title">{{ item.leftStr + "锛�" }}</div>
+                    <div class="content-data">{{ item.leftValue }}</div>
+                  </div>
+                  <div class="right">
+                    <div class="content-title">{{ item.rightStr }}</div>
+                    <div class="content-data">{{ item.rightValue }}</div>
+                  </div>
+                </li>
+              </ul>
+            </div>
+          </div>
+          <!-- 鍦板潃淇℃伅 -->
+          <div class="basic-info">
+            <div class="basic-info-label" @click="expandClick('address')">
+              <i v-if="isAddressExpand" class="el-icon-arrow-down"></i>
+              <i v-else class="el-icon-arrow-up"></i>
+              <span style="margin-left: 10px">鍦板潃淇℃伅</span>
+            </div>
+            <div v-show="isAddressExpand" class="basic-info-content">
+              <ul>
+                <li v-for="(item, i) in addressInfoList" :key="i">
+                  <div class="left">
+                    <div class="content-title">{{ item.leftStr + "锛�" }}</div>
+                    <div class="content-data">{{ item.leftValue }}</div>
+                  </div>
+                  <div class="right">
+                    <div class="content-title">{{ item.rightStr }}</div>
+                    <div class="content-data">{{ item.rightValue }}</div>
+                  </div>
+                </li>
+              </ul>
+            </div>
+          </div>
+          <!-- 澶囨敞淇℃伅 -->
+          <div class="basic-info">
+            <div class="basic-info-label" @click="expandClick('remark')">
+              <i v-if="isRemarkExpand" class="el-icon-arrow-down"></i>
+              <i v-else class="el-icon-arrow-up"></i>
+              <span style="margin-left: 10px">澶囨敞淇℃伅</span>
+            </div>
+            <div v-show="isRemarkExpand" class="basic-info-content">
+              <ul>
+                <li>
+                  <div class="left remark">
+                    <div class="content-title">{{ "澶囨敞锛�" }}</div>
+                    <div class="content-data">{{ "澶囨敞鍐呭" }}</div>
+                  </div>
+                </li>
+              </ul>
+            </div>
+          </div>
+        </div>
+        <div v-if="activeName === 'second'" class="second">
+          <FollowupRecords :isDetail="true" />
+        </div>
+      </div>
+    </el-drawer>
+  </div>
+</template>
+
+<script>
+import FollowupRecords from "@/views/client/followupRecords"
+export default {
+  name: "DetailSalesLead",
+  props: {
+    salesLeadDetail: {
+      type: Object,
+      default: () => {
+        return {
+          visible: false,
+          infomation: {}
+        }
+      }
+    }
+  },
+  components: { FollowupRecords },
+  computed: {},
+  data() {
+    return {
+      detailConfig: this.salesLeadDetail,
+      activeName: "first",
+      isBasicExpand: true, // 鍩烘湰淇℃伅灞曞紑
+      basicInfoList: [],
+      isDynamicExpand: true, // 鍔ㄦ�佷俊鎭�
+      dynamicInfoList: [],
+      isAddressExpand: true, // 鍦板潃淇℃伅
+      addressInfoList: [],
+      isRemarkExpand: true, // 澶囨敞淇℃伅
+      remarkInfoList: []
+    }
+  },
+  created() {
+    this.setData()
+  },
+  mounted() {},
+  methods: {
+    setData() {
+      this.basicInfoList = [
+        {
+          leftStr: "瀹㈡埛鍚嶇О",
+          leftValue: this.detailConfig.infomation.name,
+          rightStr: "閿�鍞嚎绱㈢紪鍙�",
+          rightValue: this.detailConfig.infomation.number
+        },
+        {
+          leftStr: "鑱旂郴浜哄鍚�",
+          leftValue: this.detailConfig.infomation.contact_name,
+          rightStr: "鑱旂郴浜鸿亴鍔�",
+          rightValue: this.detailConfig.infomation.contact_position
+        },
+        {
+          leftStr: "鎵嬫満鍙风爜",
+          leftValue: this.detailConfig.infomation.contact_phone,
+          rightStr: "鍟嗘満鐘舵��",
+          rightValue: "鏂板缓"
+        },
+        {
+          leftStr: "鍟嗘満鏉ユ簮",
+          leftValue: this.detailConfig.infomation.sales_sources_id,
+          rightStr: "璐熻矗浜�",
+          rightValue: this.detailConfig.infomation.member_id
+        },
+        {
+          leftStr: "鍒嗛厤鏃ユ湡",
+          leftValue: "",
+          rightStr: "鍏捣鐘舵��",
+          rightValue: ""
+        },
+        {
+          leftStr: "鍒涘缓鏃堕棿",
+          leftValue: "",
+          rightStr: "鍒涘缓浜�",
+          rightValue: ""
+        },
+        {
+          leftStr: "鍏抽棴鍘熷洜",
+          leftValue: "",
+          rightStr: "绛惧埌",
+          rightValue: ""
+        }
+      ]
+      this.dynamicInfoList = [
+        {
+          leftStr: "鏈仈绯诲ぉ鏁�",
+          leftValue: "",
+          rightStr: "鏈�鏂版帹杩涙椂闂�",
+          rightValue: ""
+        },
+        {
+          leftStr: "鏈�鏂拌繘灞�",
+          leftValue: "",
+          rightStr: "鏈�鏂拌仈绯绘棩鏈�",
+          rightValue: ""
+        }
+      ]
+      this.addressInfoList = [
+        {
+          leftStr: "鍥藉",
+          leftValue: "",
+          rightStr: "鐪佷唤",
+          rightValue: ""
+        },
+        {
+          leftStr: "鍩庡競",
+          leftValue: "",
+          rightStr: "鍖哄煙",
+          rightValue: ""
+        },
+        {
+          leftStr: "鍦板潃",
+          leftValue: "",
+          rightStr: "",
+          rightValue: ""
+        }
+      ]
+    },
+    handleClose() {
+      this.detailConfig.visible = false
+    },
+    // tab鍒囨崲
+    tabsClick(tab, event) {
+      console.log(tab, event)
+    },
+    // 灞曞紑鏀惰捣鐐瑰嚮浜嬩欢
+    expandClick(value) {
+      console.log(value)
+      if (value === "basic") {
+        this.isBasicExpand = !this.isBasicExpand
+      } else if (value === "dynamic") {
+        this.isDynamicExpand = !this.isDynamicExpand
+      } else if (value === "address") {
+        this.isAddressExpand = !this.isAddressExpand
+      }
+    }
+  }
+}
+</script>
+
+<!-- Add "scoped" attribute to limit CSS to this component only -->
+<style lang="scss" scoped>
+.detail-view {
+  .header {
+    height: 56px;
+    display: flex;
+    align-items: center;
+    padding-left: 10px;
+    .header-label {
+      padding: 5px;
+      border-radius: 4px;
+      background-color: #ff6600;
+      color: #fff;
+      font-size: 12px;
+    }
+    .header-title {
+      color: #323232;
+      font-size: 15px;
+      margin-left: 10px;
+      font-weight: inherit;
+    }
+  }
+  .content {
+    background-color: rgb(230, 233, 240);
+    padding: 8px;
+    .tab-view {
+      background: #fff;
+      // .tab-view-pane {
+      //   position: relative;
+      .item {
+        position: absolute;
+        top: 0px;
+        right: 0px;
+      }
+      // }
+    }
+    .detail {
+      .basic-info {
+        .basic-info-label {
+          padding-left: 10px;
+          height: 42px;
+          line-height: 42px;
+          background: #f4f8fe;
+          color: #333;
+          font-size: 14px;
+        }
+        .basic-info-content {
+          background: #fff;
+          ul {
+            padding-inline-start: 0;
+          }
+          li {
+            display: flex;
+            font-size: 14px;
+            font-family: PingFangSC;
+            border-bottom: 1px solid #f9f9fb;
+            .left,
+            .right {
+              width: 50%;
+              display: flex;
+              align-items: center;
+              height: 40px;
+              .content-title {
+                width: 220px;
+                text-align: right;
+                color: #555;
+              }
+              .content-data {
+                text-align: left;
+                margin-left: 25px;
+                color: #333;
+              }
+            }
+            .remark {
+              width: 100%;
+            }
+          }
+        }
+      }
+    }
+    .second {
+      background: #fff;
+      .followup-records {
+        .table-view {
+          margin-top: 0 !important;
+          margin-bottom: 0;
+        }
+      }
+    }
+  }
+}
+::v-deep {
+  .el-drawer__header {
+    padding: 0;
+    margin-bottom: 0px;
+  }
+  .el-tabs--top .el-tabs__item.is-top:nth-child(2) {
+    padding-left: 20px;
+  }
+  .el-tabs__item.is-active {
+    color: $color-primary;
+  }
+  .el-tabs__item:hover {
+    color: $color-primary;
+  }
+  .el-tabs__active-bar {
+    background-color: $color-primary;
+  }
+  .el-tabs__header {
+    margin: 0;
+  }
+}
+</style>
diff --git a/src/views/client/salesLead/index.vue b/src/views/client/salesLead/index.vue
index 0602878..565eae5 100644
--- a/src/views/client/salesLead/index.vue
+++ b/src/views/client/salesLead/index.vue
@@ -1,11 +1,17 @@
 <template>
   <div class="sales-lead">
-    <SearchCommonView ref="searchCommonView" :query-class-options="queryClassOptions" :search-options="searchOptions" />
-    <div class="btn-pager">
-      <PublicFunctionBtnView :operates-list="operatesList" />
-      <PagerView class="page" :pager-options="pagerOptions" v-on="pagerEvents" />
+    <div class="top">
+      <SearchCommonView
+        ref="searchCommonView"
+        :query-class-options="queryClassOptions"
+        :search-options="searchOptions"
+      />
+      <div class="btn-pager">
+        <PublicFunctionBtnView :operates-list="operatesList" />
+        <PagerView class="page" :pager-options="pagerOptions" v-on="pagerEvents" />
+      </div>
     </div>
-    <TableCommonView ref="tableListRef" :table-list="tableList">
+    <TableCommonView ref="tableListRef" :table-list="tableList" @selSalesLeadClick="selSalesLeadClick">
       <template slot="tableButton">
         <el-table-column label="鎿嶄綔" width="160">
           <template slot-scope="scope">
@@ -21,6 +27,8 @@
     <AddSalesLeadDialog v-if="editSalesLeadConfig.visible" :edit-sales-lead-config="editSalesLeadConfig" />
     <!-- 瀵煎叆鏂囦欢 -->
     <ImportFileDialog v-if="importConfig.visible" :import-file-config="importConfig" />
+    <!-- 璇︽儏 -->
+    <DetailSalesLead v-if="salesLeadDeail.visible" :sales-lead-detail="salesLeadDeail" />
   </div>
 </template>
 
@@ -29,13 +37,15 @@
 import pageMixin from "@/components/makepager/pager/mixin/pageMixin"
 import ImportFileDialog from "@/views/other/commonDialog/ImportFileDialog"
 import { getSalesLeadsList, getDeleteSalesLeads } from "@/api/client/salesLead"
+import DetailSalesLead from "@/views/client/salesLead/DetailSalesLead"
 
 export default {
   name: "SalesLead",
   props: {},
   components: {
     AddSalesLeadDialog,
-    ImportFileDialog
+    ImportFileDialog,
+    DetailSalesLead
   },
   mixins: [pageMixin],
   computed: {},
@@ -68,6 +78,10 @@
         visible: false,
         title: "鏂板缓",
         infomation: {}
+      },
+      salesLeadDeail: {
+        visible: false,
+        infomation: {}
       }
     }
   },
@@ -80,7 +94,7 @@
       this.tableList = {
         tableInfomation: [],
         tableColumn: [
-          { label: "瀹㈡埛鍚嶇О", prop: "name", min: 190 }, // 瀹㈡埛鍚嶇О
+          { label: "瀹㈡埛鍚嶇О", prop: "name", min: 190, isSalesLeadClick: true }, // 瀹㈡埛鍚嶇О
           { label: "閿�鍞嚎绱㈢紪鍙�", prop: "number", min: 130 }, // 閿�鍞嚎绱㈢紪鍙�
           { label: "鑱旂郴浜哄鍚�", prop: "contact_name", min: 130 }, // 鑱旂郴浜哄鍚�
           { label: "鎵嬫満鍙风爜", prop: "contact_phone", min: 130 }, // 鎵嬫満鍙风爜
@@ -158,6 +172,12 @@
     },
     getSelectArray(val) {
       console.log(val)
+    },
+    // 璇︽儏
+    selSalesLeadClick(row) {
+      console.log(row)
+      this.salesLeadDeail.visible = true
+      this.salesLeadDeail.infomation = { ...row }
     }
   }
 }
@@ -166,10 +186,13 @@
 <!-- Add "scoped" attribute to limit CSS to this component only -->
 <style lang="scss" scoped>
 .sales-lead {
-  .btn-pager {
-    display: flex;
-    .page {
-      margin-left: auto;
+  .top {
+    margin-bottom: 20px;
+    .btn-pager {
+      display: flex;
+      .page {
+        margin-left: auto;
+      }
     }
   }
 }
diff --git a/src/views/sales/contractManage/index.vue b/src/views/sales/contractManage/index.vue
index cf408b5..ff11738 100644
--- a/src/views/sales/contractManage/index.vue
+++ b/src/views/sales/contractManage/index.vue
@@ -1,19 +1,21 @@
 <template>
   <div class="contract-manage">
-    <SearchCommonView
-      ref="searchCommonView"
-      :label-search="true"
-      :query-class-options="queryClassOptions"
-      :search-options="searchOptions"
-    />
-    <div class="btn-pager">
-      <PublicFunctionBtnView
-        :receive="false"
-        :submit-approval="true"
-        ::statistics="true"
-        :operates-list="operatesList"
+    <div class="top">
+      <SearchCommonView
+        ref="searchCommonView"
+        :label-search="true"
+        :query-class-options="queryClassOptions"
+        :search-options="searchOptions"
       />
-      <PagerView class="page" :pager-options="pagerOptions" v-on="pagerEvents" />
+      <div class="btn-pager">
+        <PublicFunctionBtnView
+          :receive="false"
+          :submit-approval="true"
+          ::statistics="true"
+          :operates-list="operatesList"
+        />
+        <PagerView class="page" :pager-options="pagerOptions" v-on="pagerEvents" />
+      </div>
     </div>
     <TableCommonView ref="tableListRef" :table-list="tableList">
       <template slot="tableButton">
@@ -174,10 +176,13 @@
 <!-- Add "scoped" attribute to limit CSS to this component only -->
 <style lang="scss" scoped>
 .contract-manage {
-  .btn-pager {
-    display: flex;
-    .page {
-      margin-left: auto;
+  .top {
+    margin-bottom: 20px;
+    .btn-pager {
+      display: flex;
+      .page {
+        margin-left: auto;
+      }
     }
   }
 }
diff --git a/src/views/sales/generatePlan/index.vue b/src/views/sales/generatePlan/index.vue
index 7357f52..abf5576 100644
--- a/src/views/sales/generatePlan/index.vue
+++ b/src/views/sales/generatePlan/index.vue
@@ -1,9 +1,15 @@
 <template>
   <div class="generate-plan">
-    <SearchCommonView ref="searchCommonView" :query-class-options="queryClassOptions" :search-options="searchOptions" />
-    <div class="btn-pager">
-      <PublicFunctionBtnView :operates-list="operatesList" />
-      <PagerView class="page" :pager-options="pagerOptions" v-on="pagerEvents" />
+    <div class="top">
+      <SearchCommonView
+        ref="searchCommonView"
+        :query-class-options="queryClassOptions"
+        :search-options="searchOptions"
+      />
+      <div class="btn-pager">
+        <PublicFunctionBtnView :operates-list="operatesList" />
+        <PagerView class="page" :pager-options="pagerOptions" v-on="pagerEvents" />
+      </div>
     </div>
     <TableCommonView ref="tableListRef" :table-list="tableList">
       <template slot="tableButton">
@@ -164,10 +170,13 @@
 <!-- Add "scoped" attribute to limit CSS to this component only -->
 <style lang="scss" scoped>
 .generate-plan {
-  .btn-pager {
-    display: flex;
-    .page {
-      margin-left: auto;
+  .top {
+    margin-bottom: 20px;
+    .btn-pager {
+      display: flex;
+      .page {
+        margin-left: auto;
+      }
     }
   }
 }
diff --git a/src/views/sales/masterOrder/index.vue b/src/views/sales/masterOrder/index.vue
index 510d1bb..7c748bf 100644
--- a/src/views/sales/masterOrder/index.vue
+++ b/src/views/sales/masterOrder/index.vue
@@ -1,11 +1,21 @@
 <template>
   <div class="master-order">
-    <SearchCommonView ref="searchCommonView" :query-class-options="queryClassOptions" :search-options="searchOptions" />
-    <div class="btn-pager">
-      <PublicFunctionBtnView :operates-list="operatesList" />
+    <div v-if="isDetail" class="detail-top">
+      <DetailListCommonBtn :query-class-options="queryClassOptions" />
       <PagerView class="page" :pager-options="pagerOptions" v-on="pagerEvents" />
     </div>
-    <TableCommonView ref="tableListRef" :show-summary="showSummary" :table-list="tableList">
+    <div v-else class="top">
+      <SearchCommonView
+        ref="searchCommonView"
+        :query-class-options="queryClassOptions"
+        :search-options="searchOptions"
+      />
+      <div class="btn-pager">
+        <PublicFunctionBtnView :operates-list="operatesList" />
+        <PagerView class="page" :pager-options="pagerOptions" v-on="pagerEvents" />
+      </div>
+    </div>
+    <TableCommonView ref="tableListRef" :show-summary="showSummary" :table-list="tableList" :select-box="!isDetail">
       <template slot="tableButton">
         <el-table-column label="鎿嶄綔" width="90">
           <template slot-scope="scope">
@@ -27,7 +37,12 @@
 
 export default {
   name: "MasterOrder",
-  props: {},
+  props: {
+    isDetail: {
+      type: Boolean,
+      default: false
+    }
+  },
   mixins: [pageMixin],
   components: {
     AddMasterOrderDialog
@@ -168,7 +183,16 @@
 <!-- Add "scoped" attribute to limit CSS to this component only -->
 <style lang="scss" scoped>
 .master-order {
-  .btn-pager {
+  .top {
+    margin-bottom: 20px;
+    .btn-pager {
+      display: flex;
+      .page {
+        margin-left: auto;
+      }
+    }
+  }
+  .detail-top {
     display: flex;
     .page {
       margin-left: auto;
diff --git a/src/views/sales/quotation/index.vue b/src/views/sales/quotation/index.vue
index f583aa4..3a4d5a4 100644
--- a/src/views/sales/quotation/index.vue
+++ b/src/views/sales/quotation/index.vue
@@ -1,16 +1,22 @@
 <template>
   <div class="quotation">
-    <SearchCommonView
-      ref="searchCommonView"
-      :label-search="true"
-      :query-class-options="queryClassOptions"
-      :search-options="searchOptions"
-    />
-    <div class="btn-pager">
-      <PublicFunctionBtnView :submit-approval="true" :operates-list="operatesList" />
+    <div v-if="isDetail" class="detail-top">
+      <DetailListCommonBtn :query-class-options="queryClassOptions" />
       <PagerView class="page" :pager-options="pagerOptions" v-on="pagerEvents" />
     </div>
-    <TableCommonView ref="tableListRef" :table-list="tableList">
+    <div v-else class="top">
+      <SearchCommonView
+        ref="searchCommonView"
+        :label-search="true"
+        :query-class-options="queryClassOptions"
+        :search-options="searchOptions"
+      />
+      <div class="btn-pager">
+        <PublicFunctionBtnView :submit-approval="true" :operates-list="operatesList" />
+        <PagerView class="page" :pager-options="pagerOptions" v-on="pagerEvents" />
+      </div>
+    </div>
+    <TableCommonView ref="tableListRef" :table-list="tableList" :select-box="!isDetail">
       <template slot="tableButton">
         <el-table-column label="鎿嶄綔" width="90">
           <template slot-scope="scope">
@@ -32,7 +38,12 @@
 
 export default {
   name: "QuotationView",
-  props: {},
+  props: {
+    isDetail: {
+      type: Boolean,
+      default: false
+    }
+  },
   mixins: [pageMixin],
   components: {
     AddQuotationDialog
@@ -174,7 +185,16 @@
 <!-- Add "scoped" attribute to limit CSS to this component only -->
 <style lang="scss" scoped>
 .quotation {
-  .btn-pager {
+  .top {
+    margin-bottom: 20px;
+    .btn-pager {
+      display: flex;
+      .page {
+        margin-left: auto;
+      }
+    }
+  }
+  .detail-top {
     display: flex;
     .page {
       margin-left: auto;
diff --git a/src/views/sales/refundForm/index.vue b/src/views/sales/refundForm/index.vue
index bff2637..01da30f 100644
--- a/src/views/sales/refundForm/index.vue
+++ b/src/views/sales/refundForm/index.vue
@@ -1,9 +1,15 @@
 <template>
   <div class="refund-form">
-    <SearchCommonView ref="searchCommonView" :query-class-options="queryClassOptions" :search-options="searchOptions" />
-    <div class="btn-pager">
-      <PublicFunctionBtnView :receive="false" :submit-approval="true" :operates-list="operatesList" />
-      <PagerView class="page" :pager-options="pagerOptions" v-on="pagerEvents" />
+    <div class="top">
+      <SearchCommonView
+        ref="searchCommonView"
+        :query-class-options="queryClassOptions"
+        :search-options="searchOptions"
+      />
+      <div class="btn-pager">
+        <PublicFunctionBtnView :receive="false" :submit-approval="true" :operates-list="operatesList" />
+        <PagerView class="page" :pager-options="pagerOptions" v-on="pagerEvents" />
+      </div>
     </div>
     <TableCommonView ref="tableListRef" :table-list="tableList">
       <template slot="tableButton">
@@ -166,10 +172,13 @@
 <!-- Add "scoped" attribute to limit CSS to this component only -->
 <style lang="scss" scoped>
 .refund-form {
-  .btn-pager {
-    display: flex;
-    .page {
-      margin-left: auto;
+  .top {
+    margin-bottom: 20px;
+    .btn-pager {
+      display: flex;
+      .page {
+        margin-left: auto;
+      }
     }
   }
 }
diff --git a/src/views/sales/salesDetails/index.vue b/src/views/sales/salesDetails/index.vue
index 5cb8aab..52c6d40 100644
--- a/src/views/sales/salesDetails/index.vue
+++ b/src/views/sales/salesDetails/index.vue
@@ -1,11 +1,21 @@
 <template>
   <div class="sales-details">
-    <SearchCommonView ref="searchCommonView" :query-class-options="queryClassOptions" :search-options="searchOptions" />
-    <div class="btn-pager">
-      <PublicFunctionBtnView :submit-approval="true" :operates-list="operatesList" />
+    <div v-if="isDetail" class="detail-top">
+      <DetailListCommonBtn :query-class-options="queryClassOptions" />
       <PagerView class="page" :pager-options="pagerOptions" v-on="pagerEvents" />
     </div>
-    <TableCommonView ref="tableListRef" :show-summary="showSummary" :table-list="tableList">
+    <div v-else class="top">
+      <SearchCommonView
+        ref="searchCommonView"
+        :query-class-options="queryClassOptions"
+        :search-options="searchOptions"
+      />
+      <div class="btn-pager">
+        <PublicFunctionBtnView :submit-approval="true" :operates-list="operatesList" />
+        <PagerView class="page" :pager-options="pagerOptions" v-on="pagerEvents" />
+      </div>
+    </div>
+    <TableCommonView ref="tableListRef" :show-summary="showSummary" :table-list="tableList" :select-box="!isDetail">
       <template slot="tableButton">
         <el-table-column label="鎿嶄綔" width="90">
           <template slot-scope="scope">
@@ -27,7 +37,12 @@
 
 export default {
   name: "SalesDetails",
-  props: {},
+  props: {
+    isDetail: {
+      type: Boolean,
+      default: false
+    }
+  },
   mixins: [pageMixin],
   components: {
     AddSalesDetailsDialog
@@ -188,7 +203,16 @@
 <!-- Add "scoped" attribute to limit CSS to this component only -->
 <style lang="scss" scoped>
 .sales-details {
-  .btn-pager {
+  .top {
+    margin-bottom: 20px;
+    .btn-pager {
+      display: flex;
+      .page {
+        margin-left: auto;
+      }
+    }
+  }
+  .detail-top {
     display: flex;
     .page {
       margin-left: auto;
diff --git a/src/views/sales/salesOpportunity/index.vue b/src/views/sales/salesOpportunity/index.vue
index e3bb315..7885fd1 100644
--- a/src/views/sales/salesOpportunity/index.vue
+++ b/src/views/sales/salesOpportunity/index.vue
@@ -1,14 +1,24 @@
 <template>
   <div class="sales-opportunity">
-    <SearchCommonView ref="searchCommonView" :query-class-options="queryClassOptions" :search-options="searchOptions" />
-    <div class="btn-pager">
-      <PublicFunctionBtnView
-        :duplicate-check="true"
-        :statistics="true"
-        :custom-funnel="true"
-        :operates-list="operatesList"
-      />
+    <div v-if="isDetail" class="detail-top">
+      <DetailListCommonBtn :query-class-options="queryClassOptions" />
       <PagerView class="page" :pager-options="pagerOptions" v-on="pagerEvents" />
+    </div>
+    <div v-else class="top">
+      <SearchCommonView
+        ref="searchCommonView"
+        :query-class-options="queryClassOptions"
+        :search-options="searchOptions"
+      />
+      <div class="btn-pager">
+        <PublicFunctionBtnView
+          :duplicate-check="true"
+          :statistics="true"
+          :custom-funnel="true"
+          :operates-list="operatesList"
+        />
+        <PagerView class="page" :pager-options="pagerOptions" v-on="pagerEvents" />
+      </div>
     </div>
     <TableCommonView ref="tableListRef" :table-list="tableList">
       <template slot="tableButton">
@@ -33,7 +43,12 @@
 
 export default {
   name: "SalesOpportunity",
-  props: {},
+  props: {
+    isDetail: {
+      type: Boolean,
+      default: false
+    }
+  },
   mixins: [pageMixin],
   components: {
     AddSalesOpportunityDialog
@@ -184,7 +199,16 @@
 <!-- Add "scoped" attribute to limit CSS to this component only -->
 <style lang="scss" scoped>
 .sales-opportunity {
-  .btn-pager {
+  .top {
+    margin-bottom: 20px;
+    .btn-pager {
+      display: flex;
+      .page {
+        margin-left: auto;
+      }
+    }
+  }
+  .detail-top {
     display: flex;
     .page {
       margin-left: auto;
diff --git a/src/views/sales/salesReturn/index.vue b/src/views/sales/salesReturn/index.vue
index 09c24fa..87060d6 100644
--- a/src/views/sales/salesReturn/index.vue
+++ b/src/views/sales/salesReturn/index.vue
@@ -1,9 +1,15 @@
 <template>
   <div class="sales-return">
-    <SearchCommonView ref="searchCommonView" :query-class-options="queryClassOptions" :search-options="searchOptions" />
-    <div class="btn-pager">
-      <PublicFunctionBtnView :receive="false" :import-button="false" receive:operates-list="operatesList" />
-      <PagerView class="page" :pager-options="pagerOptions" v-on="pagerEvents" />
+    <div class="top">
+      <SearchCommonView
+        ref="searchCommonView"
+        :query-class-options="queryClassOptions"
+        :search-options="searchOptions"
+      />
+      <div class="btn-pager">
+        <PublicFunctionBtnView :receive="false" :import-button="false" receive:operates-list="operatesList" />
+        <PagerView class="page" :pager-options="pagerOptions" v-on="pagerEvents" />
+      </div>
     </div>
     <TableCommonView ref="tableListRef" :table-list="tableList">
       <template slot="tableButton">
@@ -167,10 +173,13 @@
 <!-- Add "scoped" attribute to limit CSS to this component only -->
 <style lang="scss" scoped>
 .sales-return {
-  .btn-pager {
-    display: flex;
-    .page {
-      margin-left: auto;
+  .top {
+    margin-bottom: 20px;
+    .btn-pager {
+      display: flex;
+      .page {
+        margin-left: auto;
+      }
     }
   }
 }
diff --git a/src/views/sales/subOrder/index.vue b/src/views/sales/subOrder/index.vue
index 886cb82..54c3e39 100644
--- a/src/views/sales/subOrder/index.vue
+++ b/src/views/sales/subOrder/index.vue
@@ -1,11 +1,21 @@
 <template>
   <div class="sub-order">
-    <SearchCommonView ref="searchCommonView" :query-class-options="queryClassOptions" :search-options="searchOptions" />
-    <div class="btn-pager">
-      <PublicFunctionBtnView :operates-list="operatesList" />
+    <div v-if="isDetail" class="detail-top">
+      <DetailListCommonBtn :query-class-options="queryClassOptions" />
       <PagerView class="page" :pager-options="pagerOptions" v-on="pagerEvents" />
     </div>
-    <TableCommonView ref="tableListRef" :show-summary="showSummary" :table-list="tableList">
+    <div v-else class="top">
+      <SearchCommonView
+        ref="searchCommonView"
+        :query-class-options="queryClassOptions"
+        :search-options="searchOptions"
+      />
+      <div class="btn-pager">
+        <PublicFunctionBtnView :operates-list="operatesList" />
+        <PagerView class="page" :pager-options="pagerOptions" v-on="pagerEvents" />
+      </div>
+    </div>
+    <TableCommonView ref="tableListRef" :show-summary="showSummary" :table-list="tableList" :select-box="!isDetail">
       <template slot="tableButton">
         <el-table-column label="鎿嶄綔" width="90">
           <template slot-scope="scope">
@@ -27,7 +37,12 @@
 
 export default {
   name: "SubOrder",
-  props: {},
+  props: {
+    isDetail: {
+      type: Boolean,
+      default: false
+    }
+  },
   mixins: [pageMixin],
   components: {
     AddSubOrderDialog
@@ -172,7 +187,16 @@
 <!-- Add "scoped" attribute to limit CSS to this component only -->
 <style lang="scss" scoped>
 .sub-order {
-  .btn-pager {
+  .top {
+    margin-bottom: 20px;
+    .btn-pager {
+      display: flex;
+      .page {
+        margin-left: auto;
+      }
+    }
+  }
+  .detail-top {
     display: flex;
     .page {
       margin-left: auto;
diff --git a/src/views/service/orderManage/AddOrderManageDialog.vue b/src/views/service/orderManage/AddOrderManageDialog.vue
index 27c15f6..685e1d5 100644
--- a/src/views/service/orderManage/AddOrderManageDialog.vue
+++ b/src/views/service/orderManage/AddOrderManageDialog.vue
@@ -1,7 +1,7 @@
 <template>
   <div class="order-manage">
     <el-dialog
-      :title="editCommonConfig.title + '宸ュ崟绠$悊'"
+      :title="editCommonConfig.title + '瀹㈡埛鏈嶅姟鍗�'"
       :visible.sync="editConfig.visible"
       :width="dialogWidth"
       :before-close="handleClose"
@@ -40,17 +40,30 @@
                 </el-form-item>
               </el-col>
               <el-col :span="12">
-                <el-form-item label="宸ュ崟缂栧彿" prop="number">
+                <el-form-item label="鏈嶅姟鍗曠紪鍙�" prop="number">
                   <el-input v-model="editConfig.infomation.number"></el-input>
                 </el-form-item>
               </el-col>
               <el-col :span="12">
-                <el-form-item label="宸ュ崟鍚嶇О" prop="name">
-                  <el-input v-model="editConfig.infomation.name"></el-input>
+                <el-form-item label="鏈嶅姟鍚堝悓" prop="name">
+                  <div class="custom-name">
+                    <el-autocomplete
+                      v-model="editConfig.infomation.client_name"
+                      :fetch-suggestions="querySearchAsync"
+                      value-key="name"
+                      @select="handleSelectClient"
+                    ></el-autocomplete>
+                    <div class="common-select-btn" @click="selClientClick">
+                      <i class="el-icon-circle-plus-outline" title="閫夋嫨"></i>
+                    </div>
+                    <div class="common-select-btn" @click="clearupClient">
+                      <i class="el-icon-edit-outline" title="娓呴櫎"></i>
+                    </div>
+                  </div>
                 </el-form-item>
               </el-col>
               <el-col :span="12">
-                <el-form-item label="宸ュ崟绫诲瀷" prop="orderType">
+                <el-form-item label="鏁呴殰绫诲埆" prop="orderType">
                   <div class="common-select">
                     <el-select
                       v-model="editConfig.infomation.orderType"
@@ -66,16 +79,113 @@
                 </el-form-item>
               </el-col>
               <el-col :span="12">
-                <el-form-item label="鑱旂郴浜哄鍚�" prop="contactId">
+                <el-form-item label="涓婚" prop="contactId">
+                  <el-input v-model="editConfig.infomation.contactId"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="鍚堝悓璁㈠崟" prop="name">
                   <div class="custom-name">
-                    <el-input v-model="editConfig.infomation.contactId"></el-input>
-                    <div class="common-select-btn"><i class="el-icon-circle-plus-outline" title="閫夋嫨"></i></div>
-                    <div class="common-select-btn"><i class="el-icon-edit" title="缂栬緫"></i></div>
+                    <el-autocomplete
+                      v-model="editConfig.infomation.client_name"
+                      :fetch-suggestions="querySearchAsync"
+                      value-key="name"
+                      @select="handleSelectClient"
+                    ></el-autocomplete>
+                    <div class="common-select-btn" @click="selClientClick">
+                      <i class="el-icon-circle-plus-outline" title="閫夋嫨"></i>
+                    </div>
+                    <div class="common-select-btn" @click="clearupClient">
+                      <i class="el-icon-edit-outline" title="娓呴櫎"></i>
+                    </div>
                   </div>
                 </el-form-item>
               </el-col>
               <el-col :span="12">
-                <el-form-item label="鎶ヤ慨鏉ユ簮" prop="reportSourceId">
+                <el-form-item label="浜у搧绫诲埆" prop="orderType">
+                  <div class="common-select">
+                    <el-select
+                      v-model="editConfig.infomation.orderType"
+                      placeholder="璇烽�夋嫨"
+                      class="common-select-sel"
+                      size="mini"
+                    >
+                      <el-option v-for="item in orderTypeOptions" :key="item.id" :label="item.name" :value="item.id">
+                      </el-option>
+                    </el-select>
+                    <div class="common-select-btn"><i class="el-icon-setting"></i></div>
+                  </div>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="浜у搧鍚嶇О" prop="name">
+                  <div class="custom-name">
+                    <el-autocomplete
+                      v-model="editConfig.infomation.client_name"
+                      :fetch-suggestions="querySearchAsync"
+                      value-key="name"
+                      @select="handleSelectClient"
+                    ></el-autocomplete>
+                    <div class="common-select-btn" @click="selClientClick">
+                      <i class="el-icon-circle-plus-outline" title="閫夋嫨"></i>
+                    </div>
+                    <div class="common-select-btn" @click="clearupClient">
+                      <i class="el-icon-edit-outline" title="娓呴櫎"></i>
+                    </div>
+                  </div>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="鏈嶅姟鏂瑰紡" prop="orderType">
+                  <div class="common-select">
+                    <el-select
+                      v-model="editConfig.infomation.orderType"
+                      placeholder="璇烽�夋嫨"
+                      class="common-select-sel"
+                      size="mini"
+                    >
+                      <el-option v-for="item in orderTypeOptions" :key="item.id" :label="item.name" :value="item.id">
+                      </el-option>
+                    </el-select>
+                    <div class="common-select-btn"><i class="el-icon-setting"></i></div>
+                  </div>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="鏈嶅姟浜哄憳" prop="orderType">
+                  <div class="common-select">
+                    <el-select
+                      v-model="editConfig.infomation.orderType"
+                      placeholder="璇烽�夋嫨"
+                      class="common-select-sel"
+                      size="mini"
+                    >
+                      <el-option v-for="item in orderTypeOptions" :key="item.id" :label="item.name" :value="item.id">
+                      </el-option>
+                    </el-select>
+                  </div>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="鑱旂郴浜哄鍚�" prop="client_name">
+                  <div class="custom-name">
+                    <el-autocomplete
+                      v-model="editConfig.infomation.client_name"
+                      :fetch-suggestions="querySearchAsync"
+                      value-key="name"
+                      @select="handleSelectClient"
+                    ></el-autocomplete>
+                    <div class="common-select-btn" @click="selClientClick">
+                      <i class="el-icon-circle-plus-outline" title="閫夋嫨"></i>
+                    </div>
+                    <div class="common-select-btn" @click="clearupClient">
+                      <i class="el-icon-edit-outline" title="娓呴櫎"></i>
+                    </div>
+                  </div>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="涓ラ噸绋嬪害" prop="reportSourceId">
                   <div class="common-select">
                     <el-select
                       v-model="editConfig.infomation.reportSourceId"
@@ -90,27 +200,192 @@
                   </div>
                 </el-form-item>
               </el-col>
-              <!-- <el-col :span="12">
-                <el-form-item label="閫夋嫨婧愬崟" prop="sourceSheet">
-                  <el-select v-model="editConfig.infomation.sourceSheet" size="mini">
-                    <el-option
-                      v-for="item in sourceSheetOptions"
-                      :key="item.value"
-                      :label="item.label"
-                      :value="item.value"
-                    >
-                    </el-option>
-                  </el-select>
+              <el-col :span="24">
+                <el-form-item label="涓婇棬鍦板潃" prop="problemDescription">
+                  <el-input
+                    type="textarea"
+                    :autosize="{ minRows: 2, maxRows: 4 }"
+                    placeholder="璇疯緭鍏ュ唴瀹�"
+                    v-model="editConfig.infomation.problemDescription"
+                  ></el-input>
                 </el-form-item>
-              </el-col> -->
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="浼樺厛绾у埆" prop="reportSourceId">
+                  <div class="common-select">
+                    <el-select
+                      v-model="editConfig.infomation.reportSourceId"
+                      placeholder="璇烽�夋嫨"
+                      class="common-select-sel"
+                      size="mini"
+                    >
+                      <el-option v-for="item in reportSourceOptions" :key="item.id" :label="item.name" :value="item.id">
+                      </el-option>
+                    </el-select>
+                    <div class="common-select-btn"><i class="el-icon-setting"></i></div>
+                  </div>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="棰勭害涓婇棬鏃堕棿" prop="startTime">
+                  <el-date-picker v-model="editConfig.infomation.startTime" type="datetime" placeholder="閫夋嫨鏃ユ湡">
+                  </el-date-picker>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="閿�鍞満浼�" prop="client_name">
+                  <div class="custom-name">
+                    <el-autocomplete
+                      v-model="editConfig.infomation.client_name"
+                      :fetch-suggestions="querySearchAsync"
+                      value-key="name"
+                      @select="handleSelectClient"
+                    ></el-autocomplete>
+                    <div class="common-select-btn" @click="selClientClick">
+                      <i class="el-icon-circle-plus-outline" title="閫夋嫨"></i>
+                    </div>
+                    <div class="common-select-btn" @click="clearupClient">
+                      <i class="el-icon-edit-outline" title="娓呴櫎"></i>
+                    </div>
+                  </div>
+                </el-form-item>
+              </el-col>
+            </el-row>
+          </div>
+          <!-- 鍔ㄦ�佷俊鎭� -->
+          <div class="basic-info-title">鍔ㄦ�佷俊鎭�</div>
+          <div class="basic-info-view">
+            <el-row>
+              <el-col :span="12">
+                <el-form-item label="甯屾湜澶勭悊鏃堕棿" prop="startTime">
+                  <el-date-picker v-model="editConfig.infomation.startTime" type="datetime" placeholder="閫夋嫨鏃ユ湡">
+                  </el-date-picker>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="瀹為檯澶勭悊鏃堕棿" prop="startTime">
+                  <el-date-picker v-model="editConfig.infomation.startTime" type="datetime" placeholder="閫夋嫨鏃ユ湡">
+                  </el-date-picker>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="浜ら�氳垂" prop="reportSourceId">
+                  <el-input v-model="editConfig.infomation.problemDescription"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="鏀惰垂閲戦" prop="reportSourceId">
+                  <el-input v-model="editConfig.infomation.problemDescription"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="鑺辫垂鏃堕棿" prop="reportSourceId">
+                  <div class="common-select">
+                    <el-select
+                      v-model="editConfig.infomation.reportSourceId"
+                      placeholder="璇烽�夋嫨"
+                      class="common-select-sel"
+                      size="mini"
+                    >
+                      <el-option v-for="item in reportSourceOptions" :key="item.id" :label="item.name" :value="item.id">
+                      </el-option>
+                    </el-select>
+                    <div class="common-select-btn"><i class="el-icon-setting"></i></div>
+                  </div>
+                </el-form-item>
+              </el-col>
+            </el-row>
+          </div>
+          <!-- 鏃堕棿/閲戦 -->
+          <div class="basic-info-title">鏃堕棿/閲戦</div>
+          <div class="basic-info-view">
+            <el-row>
+              <el-col :span="12">
+                <el-form-item label="甯歌闂" prop="problemDescription">
+                  <el-input v-model="editConfig.infomation.problemDescription"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="24">
+                <el-form-item label="闂鎻忚堪" prop="problemDescription">
+                  <el-input
+                    type="textarea"
+                    :autosize="{ minRows: 2, maxRows: 4 }"
+                    placeholder="璇疯緭鍏ュ唴瀹�"
+                    v-model="editConfig.infomation.problemDescription"
+                  ></el-input>
+                </el-form-item>
+              </el-col>
+            </el-row>
+          </div>
+          <!-- 瀹氫綅鍦板潃 -->
+          <div class="basic-info-title">瀹氫綅鍦板潃</div>
+          <div class="basic-info-view">
+            <el-row>
+              <el-col :span="24">
+                <el-form-item label="瀹氫綅" prop="position">
+                  <el-input v-model="editConfig.infomation.position"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="24">
+                <el-form-item label="鍦板浘" prop="map">
+                  <div style="height: 100px"></div>
+                </el-form-item>
+              </el-col>
             </el-row>
           </div>
           <!-- 闂鎻忚堪 -->
           <div class="basic-info-title">闂鎻忚堪</div>
           <div class="basic-info-view">
             <el-row>
+              <el-col :span="12">
+                <el-form-item label="甯歌闂" prop="problemDescription">
+                  <el-input v-model="editConfig.infomation.problemDescription"></el-input>
+                </el-form-item>
+              </el-col>
               <el-col :span="24">
                 <el-form-item label="闂鎻忚堪" prop="problemDescription">
+                  <el-input
+                    type="textarea"
+                    :autosize="{ minRows: 2, maxRows: 4 }"
+                    placeholder="璇疯緭鍏ュ唴瀹�"
+                    v-model="editConfig.infomation.problemDescription"
+                  ></el-input>
+                </el-form-item>
+              </el-col>
+            </el-row>
+          </div>
+          <!-- 瑙e喅鏂规硶 -->
+          <div class="basic-info-title">瑙e喅鏂规硶</div>
+          <div class="basic-info-view">
+            <el-row>
+              <el-col :span="24">
+                <el-form-item label="瑙e喅鏂规硶" prop="problemDescription">
+                  <el-input
+                    type="textarea"
+                    :autosize="{ minRows: 2, maxRows: 4 }"
+                    placeholder="璇疯緭鍏ュ唴瀹�"
+                    v-model="editConfig.infomation.problemDescription"
+                  ></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="24">
+                <el-form-item label="鍐呴儴澶囨敞" prop="problemDescription">
+                  <el-input
+                    type="textarea"
+                    :autosize="{ minRows: 2, maxRows: 4 }"
+                    placeholder="璇疯緭鍏ュ唴瀹�"
+                    v-model="editConfig.infomation.problemDescription"
+                  ></el-input>
+                </el-form-item>
+              </el-col>
+            </el-row>
+          </div>
+          <!-- 澶囨敞 -->
+          <div class="basic-info-title">澶囨敞</div>
+          <div class="basic-info-view">
+            <el-row>
+              <el-col :span="24">
+                <el-form-item label="澶囨敞" prop="problemDescription">
                   <el-input
                     type="textarea"
                     :autosize="{ minRows: 2, maxRows: 4 }"
@@ -148,46 +423,40 @@
               </el-col>
             </el-row>
           </div>
-          <!-- 閫夋嫨瀹℃壒娴佺▼ -->
-          <!-- <div class="basic-info-title">閫夋嫨瀹℃壒娴佺▼</div>
-          <div class="basic-info-view">
-            <el-row>
-              <el-col :span="20">
-                <el-form-item label="瀹℃壒娴佺▼" prop="approvalWorkflow">
-                  <el-select
-                    v-model="editConfig.infomation.approvalWorkflow"
-                    placeholder="璇烽�夋嫨"
-                    size="mini"
-                    style="width: 100%"
-                  >
-                    <el-option
-                      v-for="item in approvalWorkflowOptions"
-                      :key="item.value"
-                      :label="item.label"
-                      :value="item.value"
-                    >
-                    </el-option>
-                  </el-select>
-                </el-form-item>
-              </el-col>
-              <el-col :span="20">
-                <el-form-item label="瀹℃壒姝ラ" prop="approvalSteps">
-                  <el-input v-model="editConfig.infomation.approvalSteps"></el-input>
-                </el-form-item>
-              </el-col>
-              \
-              <el-col :span="20">
-                <el-form-item label="瀹℃壒浜�" prop="approvalPerson">
-                  <el-input v-model="editConfig.infomation.approvalPerson"></el-input>
-                </el-form-item>
-              </el-col>
-              <el-col :span="20">
-                <el-form-item label="瀹℃壒鎰忚" prop="approvalOpinion">
-                  <el-input v-model="editConfig.infomation.approvalOpinion" type="textarea" :rows="2"></el-input>
-                </el-form-item>
-              </el-col>
-            </el-row>
-          </div> -->
+          <!-- 瀹㈡埛鏈嶅姟鍗曞巻鍙茶褰� -->
+          <div v-if="editConfig.title === '缂栬緫'" class="basic-info">
+            <div class="basic-info-label" @click="expandClick('record')">
+              <i v-if="isRecordExpand" class="el-icon-arrow-down"></i>
+              <i v-else class="el-icon-arrow-up"></i>
+              <span style="margin-left: 10px">瀹㈡埛鏈嶅姟鍗曞巻鍙茶褰�</span>
+            </div>
+            <div v-show="isRecordExpand" class="basic-info-content">
+              <div class="list" v-if="recordTableList.length > 0">
+                <PagerView class="page" :pager-options="pagerOptions" v-on="pagerEvents" />
+                <TableCommonView
+                  ref="recordTableListRef"
+                  :select-box="false"
+                  :table-list="recordTableList"
+                ></TableCommonView>
+              </div>
+              <div class="no-data" v-else>娌℃湁鎵惧埌浠讳綍璁板綍</div>
+            </div>
+          </div>
+          <!-- 鏈嶅姟鍚堝悓淇℃伅 -->
+          <div v-if="editConfig.title === '缂栬緫'" class="basic-info">
+            <div class="basic-info-label" @click="expandClick('contract')">
+              <i v-if="isConttractExpand" class="el-icon-arrow-down"></i>
+              <i v-else class="el-icon-arrow-up"></i>
+              <span style="margin-left: 10px">鏈嶅姟鍚堝悓淇℃伅</span>
+            </div>
+            <div v-show="isConttractExpand" class="basic-info-content">
+              <div class="list" v-if="recordTableList.length > 0">
+                <PagerView class="page" :pager-options="pagerOptions1" v-on="pagerEvents" />
+                <TableCommonView ref="tableListRef" :select-box="false" :table-list="tableList"></TableCommonView>
+              </div>
+              <div class="no-data" v-else>娌℃湁鎵惧埌浠讳綍璁板綍</div>
+            </div>
+          </div>
         </div>
       </el-form>
       <div slot="footer" class="dialog-footer">
@@ -209,8 +478,10 @@
 import { getAllData } from "@/api/client/client"
 import { getAddOrderManage, getUpdateOrderManage } from "@/api/serviceManage/orderManage"
 import SelectClientDialog from "@/views/other/commonDialog/SelectClientDialog"
+import pageMixin from "@/components/makepager/pager/mixin/pageMixin"
 export default {
   name: "AddOrderManageDialog",
+  mixins: [pageMixin],
   props: {
     editCommonConfig: {
       type: Object,
@@ -253,14 +524,43 @@
         editVisible: false,
         title: "",
         infomation: {}
+      },
+      isRecordExpand: true,
+      recordTableList: {},
+      pagerOptions: {
+        currPage: 1,
+        pageSize: 5,
+        totalCount: 0
+      },
+      isConttractExpand: true,
+      tableList: {},
+      pagerOptions1: {
+        currPage: 1,
+        pageSize: 5,
+        totalCount: 0
       }
     }
   },
   created() {
     this.$store.dispatch("geClient")
     this.getCommonData()
+    this.setTable()
   },
   methods: {
+    setTable() {
+      this.recordTableList = {
+        tableInfomation: [],
+        tableColumn: [
+          { label: "鏈嶅姟鍗曠紪鍙�", prop: "number", min: 100 },
+          { label: "涓婚", prop: "name" },
+          { label: "鏈嶅姟浜哄憳", prop: "clientId", min: 130 },
+          { label: "鏈嶅姟鏂瑰紡", prop: "contactName" },
+          { label: "浜у搧绫诲埆", prop: "name" },
+          { label: "浜у搧鍚嶇О", prop: "orderType" },
+          { label: "淇敼鏃堕棿", prop: "reportSourceId" }
+        ]
+      }
+    },
     getCommonData() {
       getAllData()
         .then((res) => {
@@ -367,7 +667,16 @@
     // 娣诲姞闄勪欢
     addAnnexClick() {},
     // 璁剧疆鍏佽涓婁紶鏂囦欢鏍煎紡
-    setFormatClick() {}
+    setFormatClick() {},
+    // 灞曞紑鏀惰捣鐐瑰嚮浜嬩欢
+    expandClick(value) {
+      console.log(value)
+      if (value === "record") {
+        this.isRecordExpand = !this.isRecordExpand
+      } else if (value === "contract") {
+        this.isConttractExpand = !this.isConttractExpand
+      }
+    }
   }
 }
 </script>
@@ -408,6 +717,29 @@
         margin-left: 10px;
       }
     }
+    .basic-info {
+      .basic-info-label {
+        padding-left: 10px;
+        height: 42px;
+        line-height: 42px;
+        background: #f4f8fe;
+        color: #333;
+        font-size: 14px;
+      }
+      .basic-info-content {
+        .list {
+          .page {
+            text-align: right;
+            margin-bottom: 5px;
+          }
+        }
+        .no-data {
+          height: 40px;
+          line-height: 40px;
+          margin-left: 10px;
+        }
+      }
+    }
   }
   .dialog-footer {
     background-color: #f5f5f5;
diff --git a/src/views/service/orderManage/index.vue b/src/views/service/orderManage/index.vue
index e76d7f3..c1f2eac 100644
--- a/src/views/service/orderManage/index.vue
+++ b/src/views/service/orderManage/index.vue
@@ -1,18 +1,17 @@
 <template>
   <div class="sales-lead">
-    <div class="tab-view">
-      <el-tabs v-model="activeName" @tab-click="tabsClick">
-        <el-tab-pane label="鍏ㄩ儴" name="first"></el-tab-pane>
-        <el-tab-pane label="寰呭垎閰�" name="second"></el-tab-pane>
-        <el-tab-pane label="宸插偓鍗�" name="third"></el-tab-pane>
-        <el-tab-pane label="澶勭悊涓�" name="fourth"></el-tab-pane>
-        <el-tab-pane label="宸茬粨鍗�" name="aaa"></el-tab-pane>
-      </el-tabs>
-    </div>
-    <SearchCommonView ref="searchCommonView" :query-class-options="queryClassOptions" :search-options="searchOptions" />
-    <div class="btn-pager">
-      <PublicFunctionBtnView :receive="true" :submit-approval="true" :operates-list="operatesList" />
-      <PagerView class="page" :pager-options="pagerOptions" v-on="pagerEvents" />
+    <!-- <div class="detail-top">
+    </div> -->
+    <div class="top">
+      <SearchCommonView
+        ref="searchCommonView"
+        :query-class-options="queryClassOptions"
+        :search-options="searchOptions"
+      />
+      <div class="btn-pager">
+        <PublicFunctionBtnView :receive="true" :submit-approval="true" :operates-list="operatesList" />
+        <PagerView class="page" :pager-options="pagerOptions" v-on="pagerEvents" />
+      </div>
     </div>
     <TableCommonView ref="tableListRef" :table-list="tableList">
       <template slot="tableButton">
@@ -50,13 +49,7 @@
     return {
       activeName: "first",
       tableList: {},
-      queryClassOptions: [
-        { value: "1", label: "鍏ㄩ儴" },
-        { value: "2", label: "灏忕▼搴忔姤淇�" },
-        { value: "3", label: "闈㈣鎶ヤ慨" },
-        { value: "4", label: "浠婃棩鍐呭垱寤�" },
-        { value: "5", label: "涓夊ぉ鍐呭垱寤�" }
-      ],
+      queryClassOptions: [{ value: "1", label: "鏈湀涓婇棬" }],
       searchOptions: [],
       operatesList: [
         { id: "1", name: "鍏变韩" },
@@ -84,13 +77,14 @@
       this.tableList = {
         tableInfomation: [],
         tableColumn: [
-          { label: "宸ュ崟缂栧彿", prop: "number", min: 100 }, // 宸ュ崟缂栧彿
+          { label: "鏈嶅姟鍗曠紪鍙�", prop: "number", min: 100 }, // 鏈嶅姟鍗曠紪鍙�
+          { label: "涓婚", prop: "name" }, // 涓婚
           { label: "瀹㈡埛鍚嶇О", prop: "clientId", min: 130 }, // 瀹㈡埛鍚嶇О
-          { label: "鑱旂郴浜哄鍚�", prop: "contactName" }, // 鑱旂郴浜哄鍚�
+          { label: "瀹為檯澶勭悊鏃堕棿", prop: "contactName" }, // 瀹為檯澶勭悊鏃堕棿
           { label: "鏈嶅姟浜哄憳", prop: "name" }, // 鏈嶅姟浜哄憳
-          { label: "宸ュ崟鐘舵��", prop: "orderType" }, // 宸ュ崟鐘舵��
-          { label: "鎶ヤ慨鏉ユ簮", prop: "reportSourceId" }, // 鎶ヤ慨鏉ユ簮
-          { label: "宸ュ崟绫诲瀷", prop: "orderType" } // 宸ュ崟绫诲瀷
+          { label: "鏈嶅姟鏂瑰紡", prop: "orderType" }, // 鏈嶅姟鏂瑰紡
+          { label: "浜у搧绫诲埆", prop: "reportSourceId" }, // 浜у搧绫诲埆
+          { label: "鏁呴殰绫诲埆", prop: "orderType" } // 鏁呴殰绫诲埆
         ]
       }
       this.searchOptions = []
@@ -179,10 +173,13 @@
 <!-- Add "scoped" attribute to limit CSS to this component only -->
 <style lang="scss" scoped>
 .sales-lead {
-  .btn-pager {
-    display: flex;
-    .page {
-      margin-left: auto;
+  .top {
+    margin-bottom: 20px;
+    .btn-pager {
+      display: flex;
+      .page {
+        margin-left: auto;
+      }
     }
   }
 }
diff --git a/src/views/service/serviceContract/index.vue b/src/views/service/serviceContract/index.vue
index 0655c35..bd59092 100644
--- a/src/views/service/serviceContract/index.vue
+++ b/src/views/service/serviceContract/index.vue
@@ -1,11 +1,21 @@
 <template>
   <div class="service-contract">
-    <SearchCommonView ref="searchCommonView" :query-class-options="queryClassOptions" :search-options="searchOptions" />
-    <div class="btn-pager">
-      <PublicFunctionBtnView :submit-approval="true" :operates-list="operatesList" />
+    <div v-if="isDetail" class="detail-top">
+      <DetailListCommonBtn :query-class-options="queryClassOptions" />
       <PagerView class="page" :pager-options="pagerOptions" v-on="pagerEvents" />
     </div>
-    <TableCommonView ref="tableListRef" :table-list="tableList">
+    <div v-else class="top">
+      <SearchCommonView
+        ref="searchCommonView"
+        :query-class-options="queryClassOptions"
+        :search-options="searchOptions"
+      />
+      <div class="btn-pager">
+        <PublicFunctionBtnView :submit-approval="true" :operates-list="operatesList" />
+        <PagerView class="page" :pager-options="pagerOptions" v-on="pagerEvents" />
+      </div>
+    </div>
+    <TableCommonView ref="tableListRef" :table-list="tableList" :select-box="!isDetail">
       <template slot="tableButton">
         <el-table-column label="鎿嶄綔" width="90">
           <template slot-scope="scope">
@@ -27,7 +37,12 @@
 
 export default {
   name: "ServiceContract",
-  props: {},
+  props: {
+    isDetail: {
+      type: Boolean,
+      default: false
+    }
+  },
   mixins: [pageMixin],
   components: {
     AddServiceContractDialog
@@ -169,7 +184,16 @@
 <!-- Add "scoped" attribute to limit CSS to this component only -->
 <style lang="scss" scoped>
 .service-contract {
-  .btn-pager {
+  .top {
+    margin-bottom: 20px;
+    .btn-pager {
+      display: flex;
+      .page {
+        margin-left: auto;
+      }
+    }
+  }
+  .detail-top {
     display: flex;
     .page {
       margin-left: auto;
diff --git a/src/views/service/serviceFollowup/index.vue b/src/views/service/serviceFollowup/index.vue
index 767f241..b406a5d 100644
--- a/src/views/service/serviceFollowup/index.vue
+++ b/src/views/service/serviceFollowup/index.vue
@@ -1,9 +1,15 @@
 <template>
   <div class="sales-lead">
-    <SearchCommonView ref="searchCommonView" :query-class-options="queryClassOptions" :search-options="searchOptions" />
-    <div class="btn-pager">
-      <PublicFunctionBtnView :import-button="false" :operates-list="operatesList" />
-      <PagerView class="page" :pager-options="pagerOptions" v-on="pagerEvents" />
+    <div class="top">
+      <SearchCommonView
+        ref="searchCommonView"
+        :query-class-options="queryClassOptions"
+        :search-options="searchOptions"
+      />
+      <div class="btn-pager">
+        <PublicFunctionBtnView :import-button="false" :operates-list="operatesList" />
+        <PagerView class="page" :pager-options="pagerOptions" v-on="pagerEvents" />
+      </div>
     </div>
     <TableCommonView ref="tableListRef" :table-list="tableList">
       <template slot="tableButton">
@@ -159,10 +165,13 @@
 <!-- Add "scoped" attribute to limit CSS to this component only -->
 <style lang="scss" scoped>
 .sales-lead {
-  .btn-pager {
-    display: flex;
-    .page {
-      margin-left: auto;
+  .top {
+    margin-bottom: 20px;
+    .btn-pager {
+      display: flex;
+      .page {
+        margin-left: auto;
+      }
     }
   }
 }

--
Gitblit v1.8.0