From 5e89a1759a2d20e549587fc01cf6b57a3e82950a Mon Sep 17 00:00:00 2001
From: haoxuan <haoxuan>
Date: 星期四, 24 八月 2023 17:26:43 +0800
Subject: [PATCH] 采购管理的 前端页面开发 2023-8-24

---
 src/views/purchaseManage/quality/DetailSupplier.vue   |  338 +++++++
 src/views/purchaseManage/returned/DetailSupplier.vue  |  352 ++++++++
 src/components/makepager/SearchCommonView.vue         |   12 
 src/views/purchaseManage/purchase/index.vue           |  209 ++++
 src/components/makepager/TableCommonView.vue          |    5 
 src/views/purchaseManage/warehouse/DetailSupplier.vue |  345 ++++++++
 src/views/purchaseManage/warehouse/index.vue          |  210 ++++
 src/views/purchaseManage/returned/index.vue           |  207 ++++
 src/components/layout/components/appsidebar/index.vue |    8 
 src/views/purchaseManage/quality/index.vue            |  205 ++++
 src/router/purchase/index.js                          |   78 
 src/components/layout/components/AppMain.vue          |    2 
 src/views/purchaseManage/purchase/DetailSupplier.vue  |  569 +++++++++++++
 13 files changed, 2,494 insertions(+), 46 deletions(-)

diff --git a/src/components/layout/components/AppMain.vue b/src/components/layout/components/AppMain.vue
index 7cdbb3d..e0694e9 100644
--- a/src/components/layout/components/AppMain.vue
+++ b/src/components/layout/components/AppMain.vue
@@ -30,7 +30,7 @@
   flex: 1;
   flex-direction: column;
   // height: 100%;
-  width: 100%;
+  width: calc(100% - 210px);
   .app-main-content {
     width: 100%;
     overflow-y: auto;
diff --git a/src/components/layout/components/appsidebar/index.vue b/src/components/layout/components/appsidebar/index.vue
index 8ffc890..afdf9be 100644
--- a/src/components/layout/components/appsidebar/index.vue
+++ b/src/components/layout/components/appsidebar/index.vue
@@ -25,10 +25,10 @@
             <i class="el-icon-phone-outline icon"></i>
             <span>閲囪喘绠$悊</span>
           </template>
-          <el-menu-item index="/sales/salesOpportunity">閲囪喘璁㈠崟</el-menu-item>
-          <el-menu-item index="/sales/quotation">閲囪喘璐ㄦ鍗�</el-menu-item>
-          <el-menu-item index="/sales/masterOrder">閲囪喘鍏ュ簱鍗�</el-menu-item>
-          <el-menu-item index="/sales/subOrder">閲囪喘閫�璐у崟</el-menu-item>
+          <el-menu-item index="/purchaseManage/purchase">閲囪喘璁㈠崟</el-menu-item>
+          <el-menu-item index="/purchaseManage/quality">閲囪喘璐ㄦ鍗�</el-menu-item>
+          <el-menu-item index="/purchaseManage/warehouse">閲囪喘鍏ュ簱鍗�</el-menu-item>
+          <el-menu-item index="/purchaseManage/returned">閲囪喘閫�璐у崟</el-menu-item>
         </el-submenu>
         <el-submenu index="3">
           <template slot="title">
diff --git a/src/components/makepager/SearchCommonView.vue b/src/components/makepager/SearchCommonView.vue
index 98a11d2..277f5d8 100644
--- a/src/components/makepager/SearchCommonView.vue
+++ b/src/components/makepager/SearchCommonView.vue
@@ -2,11 +2,13 @@
   <div class="search-list">
     <div class="search-top">
       <div class="search">
-        <el-input placeholder="璇疯緭鍏ュ唴瀹�" v-model="searchInput" class="input-with-select" clearable>
+        <el-input v-if="inputSelect"  :placeholder="placeholder" v-model="searchInput" class="input-with-select" clearable>
           <el-select v-model="searchSelValue" slot="prepend" placeholder="璇烽�夋嫨" class="search-sel">
             <el-option v-for="item in searchOptions" :key="item.value" :label="item.label" :value="item"> </el-option>
           </el-select>
           <!-- <i slot="suffix" class="el-icon-search" style="cursor: pointer" @click="searchClick"></i> -->
+        </el-input>
+        <el-input v-else :placeholder="placeholder" v-model="searchInput" class="input-with-select" clearable>
         </el-input>
       </div>
       <div class="btn">
@@ -24,6 +26,14 @@
   name: "SearchCommonView",
   components: {},
   props: {
+    placeholder:{
+      type:String,
+      default:'璇疯緭鍏ュ唴瀹�',
+    },
+    inputSelect:{
+      type:Boolean,
+      default:true,
+    },
     queryClass: {
       type: String,
       default: "1"
diff --git a/src/components/makepager/TableCommonView.vue b/src/components/makepager/TableCommonView.vue
index d130723..bb3f2c3 100644
--- a/src/components/makepager/TableCommonView.vue
+++ b/src/components/makepager/TableCommonView.vue
@@ -118,7 +118,8 @@
         return {
           show: false,
           sumProp: [],
-          mergeNumber: 1
+          mergeNumber: 1,
+          totalName:'鏈〉鎬昏'
         }
       }
     }
@@ -159,7 +160,7 @@
         const sums = []
         columns.forEach((column, index) => {
           if (index === this.showSummary.mergeNumber) {
-            sums[index] = "鏈〉鎬昏"
+            sums[index] = this.showSummary.totalName
           }
           const values = data.map((item) => Number(item[column.property]))
           if (this.showSummary.sumProp.includes(column.property)) {
diff --git a/src/router/purchase/index.js b/src/router/purchase/index.js
index ed2f6fa..c8459f6 100644
--- a/src/router/purchase/index.js
+++ b/src/router/purchase/index.js
@@ -1,43 +1,45 @@
-// const type from '@/router/deployCode'
 
-// const salesOpportunity = (resolve) => require(["@/views/sales/salesOpportunity/index"], resolve) // 閿�鍞満浼�
-// const quotation = (resolve) => require(["@/views/sales/quotation/index"], resolve) // 鎶ヤ环鍗�
-// const masterOrder = (resolve) => require(["@/views/sales/masterOrder/index"], resolve) // 閿�鍞�诲崟
-// const subOrder = (resolve) => require(["@/views/sales/subOrder/index"], resolve) // 閿�鍞瓙鍗�
-
+const purchase = (resolve) => require(["@/views/purchaseManage/purchase/index"], resolve) // 閲囪喘鍗�
+const quality = (resolve) => require(["@/views/purchaseManage/quality/index"], resolve) // 閲囪喘璐ㄦ鍗�
+const warehouse = (resolve) => require(["@/views/purchaseManage/warehouse/index"], resolve) // 閲囪喘鍏ュ簱鍗�
+const returned= (resolve) => require(["@/views/purchaseManage/returned/index"], resolve) // 閲囪喘閫�璐у崟
 const appconfig = [
-  // {
-  //   path: "/sales/salesOpportunity",
-  //   name: "salesOpportunity",
-  //   component: salesOpportunity,
-  //   meta: {
-  //     title: "閿�鍞満浼�"
-  //   }
-  // },
-  // {
-  //   path: "/sales/quotation",
-  //   name: "quotation",
-  //   component: quotation,
-  //   meta: {
-  //     title: "鎶ヤ环鍗�"
-  //   }
-  // },
-  // {
-  //   path: "/sales/masterOrder",
-  //   name: "masterOrder",
-  //   component: masterOrder,
-  //   meta: {
-  //     title: "閿�鍞�诲崟"
-  //   }
-  // },
-  // {
-  //   path: "/sales/subOrder",
-  //   name: "subOrder",
-  //   component: subOrder,
-  //   meta: {
-  //     title: "閿�鍞瓙鍗�"
-  //   }
-  // }
+  {
+    path: "/purchaseManage/purchase",
+    name: "purchase",
+    component: purchase,
+    meta: {
+      title: "閲囪喘绠$悊",
+      requireAuth: true
+    }
+  },
+  {
+    path: "/purchaseManage/quality",
+    name: "quality",
+    component: quality,
+    meta: {
+      title: "閲囪喘璐ㄦ鍗�",
+      requireAuth: true
+    }
+  },
+  {
+    path: "/purchaseManage/warehouse",
+    name: "warehouse",
+    component: warehouse,
+    meta: {
+      title: "閲囪喘鍏ュ簱鍗�",
+      requireAuth: true
+    }
+  },
+  {
+    path: "/purchaseManage/returned",
+    name: "returned",
+    component: returned,
+    meta: {
+      title: "閲囪喘閫�璐у崟",
+      requireAuth: true
+    }
+  }
 ]
 
 export default appconfig
diff --git a/src/views/purchaseManage/purchase/DetailSupplier.vue b/src/views/purchaseManage/purchase/DetailSupplier.vue
new file mode 100644
index 0000000..c3f9e39
--- /dev/null
+++ b/src/views/purchaseManage/purchase/DetailSupplier.vue
@@ -0,0 +1,569 @@
+<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>
+        <div class="btn" style="float: right; margin-right: 30px">
+          <el-button type="primary" size="mini" style="margin-right: 5px"
+            >鎵撳嵃</el-button
+          >
+          <el-button type="primary" size="mini" @click="emailClick"
+            >Email閫氱煡涓嬪崟</el-button
+          >
+
+          <el-button
+            type="primary"
+            size="mini"
+            @click="deleteClick"
+            style="margin-right: 5px"
+            >鍒犻櫎</el-button
+          >
+        </div>
+      </template>
+      <div class="content">
+        <div class="info">
+          <ul>
+            <li v-for="(list, i) in formInfoList" :key="i">
+              <span class="content-title">{{ list.str + "锛�" }}</span>
+              <span class="content-data">{{
+                list.value ? list.value : "--"
+              }}</span>
+            </li>
+          </ul>
+        </div>
+        <div class="tab-view">
+          <el-tabs v-model="activeName" @tab-click="tabsClick">
+            <el-tab-pane label="璇︽儏" name="first"></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 ? item.leftValue : "--" }}
+                    </div>
+                  </div>
+                  <div
+                    v-if="item.rightStr && item.rightStr.length > 0"
+                    class="right"
+                  >
+                    <div class="content-title">{{ item.rightStr + "锛�" }}</div>
+                    <div class="content-data">
+                      {{ item.rightValue ? item.rightValue : "--" }}
+                    </div>
+                  </div>
+                </li>
+              </ul>
+              <div class="business_scope">
+                <div class="content-title">{{ "澶囨敞淇℃伅锛�" }}</div>
+                <div class="content-data">{{ record ? record : "--" }}</div>
+              </div>
+            </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 ? item.leftValue : "--" }}
+                    </div>
+                  </div>
+                  <div
+                    v-if="item.rightStr && item.rightStr.length > 0"
+                    class="right"
+                  >
+                    <div class="content-title">{{ item.rightStr + "锛�" }}</div>
+                    <div class="content-data">
+                      {{ item.rightValue ? item.rightValue : "--" }}
+                    </div>
+                  </div>
+                </li>
+              </ul>
+            </div>
+          </div>
+          <!-- 浜у搧淇℃伅 -->
+          <div class="basic-info">
+            <div class="basic-info-label" @click="expandClick('three')">
+              <i v-if="isExpandThree" 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="isExpandThree" class="basic-info-content">
+              <TableCommonView
+                style="margin-top: 2px"
+                class="content-table"
+                ref="tableListRef"
+                :showSummary="showSummary"
+                :table-list="tableList"
+              >
+              </TableCommonView>
+              <div class="table-bottom">
+                <div class="table-bottom-item">
+                  <div class="table-bottom-l">
+                    鏁村崟鎶樻墸锛氱洿鎺ラ檷浠�
+                  </div>
+                  <div class="table-bottom-r">0.00</div>
+                </div>
+                <div class="table-bottom-item">
+                  <div class="table-bottom-l">
+                    璋冩暣锛氬鍔�
+                  </div>
+                  <div class="table-bottom-r">0.00</div>
+                </div>
+                <div class="table-bottom-item">
+                  <div class="table-bottom-l">
+                    鍚堣
+                  </div>
+                  <div class="table-bottom-r">26000.00</div>
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </el-drawer>
+  </div>
+</template>
+
+<script>
+import { getDeleteSalesLeads } from "@/api/client/salesLead";
+export default {
+  name: "DetailSupplier",
+  props: {
+    commonDetail: {
+      type: Object,
+      default: () => {
+        return {
+          visible: false,
+          infomation: {},
+          tableList: [],
+        };
+      },
+    },
+  },
+  components: {},
+  data() {
+    return {
+      detailConfig: this.commonDetail,
+      activeName: "first",
+      formInfoList: [], //淇℃伅
+      isBasicExpand: true, // 鍩烘湰淇℃伅灞曞紑
+      basicInfoList: [],
+      isDynamicExpand: true, // 璐︽埛淇℃伅
+      dynamicInfoList: [],
+      addConfig: {},
+      record: "", // 鏈�鏂拌繘灞�
+      noContactDays: 0,
+      newContactDays: "",
+      isExpandThree: true, //浜у搧淇℃伅
+      tableList: {},
+      showSummary:{
+        show: true,
+        sumProp: ["number", "total"],
+        mergeNumber: 4,
+        totalName:'灏忚'
+      },
+    };
+  },
+  created() {
+    this.setData(this.detailConfig.infomation);
+    this.addConfig = {
+      id_name: "sales_leads_id",
+      id: this.detailConfig.infomation.id,
+      common_name: this.detailConfig.infomation.id,
+      sales_leads_name: this.detailConfig.infomation.name,
+      sales_leads_id: this.detailConfig.infomation.id,
+    };
+  },
+  mounted() {},
+  computed: {},
+  methods: {
+    // email 閫氱煡涓嬪崟
+    emailClick() {},
+    // 鍒犻櫎
+    deleteClick() {
+      this.$confirm("鏄惁鍒犻櫎?", "鎻愮ず", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning",
+      })
+        .then(() => {
+          getDeleteSalesLeads({ ids: this.selValueList }).then((response) => {
+            if (response.code === 200) {
+              this.$message.success("鍒犻櫎鎴愬姛");
+              this.getData();
+            } else {
+              this.$message.warning("鍒犻櫎澶辫触");
+            }
+          });
+        })
+        .catch(() => {});
+    },
+    setData(item) {
+      if (item.FollowRecord && item.FollowRecord.length > 0) {
+        this.record = item.FollowRecord[0].record;
+        console.log(item.FollowRecord[0].follow_time);
+        let follow_time = item.FollowRecord[0].follow_time;
+        this.newContactDays = follow_time.substring(0, 10);
+        this.noContactDays = this.getDiffDay(Date.now(), this.newContactDays);
+      }
+      this.formInfoList = [
+        {
+          str: "渚涘簲鍟嗗悕绉�",
+          value: "",
+        },
+        {
+          str: "鍚堣",
+          value: "",
+        },
+        {
+          str: "宸叉敹绁ㄩ噾棰�",
+          value: "",
+        },
+        {
+          str: "宸蹭粯閲戦",
+          value: "",
+        },
+        {
+          str: "绛剧害鏃ユ湡",
+          value: "",
+        },
+        {
+          str: "閲囪喘璐熻矗浜�",
+          value: "",
+        },
+        {
+          str: "鏈敹绁ㄩ噾棰�",
+          value: "",
+        },
+        {
+          str: "搴斾粯閲戦",
+          value: "",
+        },
+      ];
+      this.basicInfoList = [
+        {
+          leftStr: "閲囪喘璁㈠崟缂栧彿",
+          leftValue: item.number,
+          rightStr: "渚涘簲鍟嗗悕绉�",
+          rightValue: item.name,
+        },
+        {
+          leftStr: "閲囪喘鍗曠姸鎬�",
+          leftValue: item.contact_name,
+          rightStr: "閲囪喘璐熻矗浜�",
+          rightValue: item.contact_position,
+        },
+        {
+          leftStr: "閲囪喘鑱旂郴浜�",
+          leftValue: item.contact_phone,
+          rightStr: "鑱旂郴鐢佃瘽",
+          rightValue: "18513375588",
+        },
+        {
+          leftStr: "绛剧害鏃ユ湡",
+          leftValue: item.sales_resources,
+          rightStr: "浜や粯鏃ユ湡",
+          rightValue: item.member_name,
+        },
+        {
+          leftStr: "鍒拌揣浠撳簱",
+          leftValue: item.sales_resources,
+          rightStr: "",
+          rightValue: "",
+        },
+      ];
+      this.dynamicInfoList = [
+        {
+          leftStr: "鍚堣",
+          leftValue: this.noContactDays,
+          rightStr: "宸叉敹绁ㄩ噾棰�",
+          rightValue: this.newContactDays,
+        },
+        {
+          leftStr: "宸蹭粯鎬婚",
+          leftValue: "",
+          rightStr: "鏈敹绁ㄩ噾棰�",
+          rightValue: "",
+        },
+        {
+          leftStr: "搴斾粯閲戦",
+          leftValue: "",
+          rightStr: "",
+          rightValue: "",
+        },
+      ];
+      this.tableList = {
+        tableInfomation: [
+            {
+            number:1,
+            total:1,
+          }
+        ],
+        selectIndex: true,
+        tableColumn: [
+          { label: "浜у搧鍚嶇О", prop: "number", min: 190, isCommonClick: true },
+          { label: "浜у搧缂栫爜", prop: "total", min: 130, isCommonClick: true },
+          { label: "璁¢噺鍗曚綅", prop: "contact_name", min: 130 },
+          { label: "瑙勬牸鍨嬪彿", prop: "contact_phone", min: 130 },
+          { label: "鏁伴噺", prop: "contact_phone", min: 130 },
+          { label: "閿�鍞崟浠�", prop: "sales_resources", min: 130 },
+          { label: "浠风◣鍚堣", prop: "province", min: 130 },
+          { label: "鎻忚堪", prop: "province", min: 130 },
+        ],
+      };
+    },
+    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 {
+        this.isExpandThree = !this.isExpandThree;
+      }
+    },
+    // 璁$畻涓や釜鏃ユ湡涔嬮棿鐨勫樊鍊�
+    getDiffDay(date_1, date_2) {
+      let totalDays, diffDate;
+      let myDate_1 = date_1;
+      let myDate_2 = Date.parse(date_2);
+      // 灏嗕袱涓棩鏈熼兘杞崲涓烘绉掓牸寮忥紝鐒跺悗鍋氬樊
+      diffDate = Math.abs(myDate_1 - myDate_2); // 鍙栫浉宸绉掓暟鐨勭粷瀵瑰��
+
+      totalDays = Math.floor(diffDate / (1000 * 3600 * 24)); // 鍚戜笅鍙栨暣
+      // console.log(totalDays)
+
+      return totalDays; // 鐩稿樊鐨勫ぉ鏁�
+    },
+  },
+};
+</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 {
+    height: 100%;
+    background-color: rgb(230, 233, 240);
+    padding: 8px;
+    .tab-view {
+      background: #fff;
+      // .tab-view-pane {
+      //   position: relative;
+      .item {
+        position: absolute;
+        top: 0px;
+        right: 0px;
+      }
+      // }
+    }
+    .info {
+      width: 100%;
+      height: auto;
+      background: #fff;
+      margin-bottom:10px;
+      ul {
+        width: 100%;
+        height: auto;
+        overflow: hidden;
+        li {
+          width: 25%;
+          float: left;
+          height: 40px;
+          line-height: 40px;
+          font-size: 14px;
+          font-family: PingFangSC;
+          border-bottom: 1px solid #f9f9fb;
+          .content-title {
+            width: 180px;
+            display: inline-block;
+            text-align: right;
+            color: #555;
+          }
+          .content-data {
+            width: calc(100% - 180px - 25px);
+            display: inline-block;
+            text-align: left;
+            margin-left: 25px;
+            color: #333;
+          }
+        }
+      }
+    }
+    .detail {
+      height: calc(100% - 40px - 92px);
+      background: #fff;
+      overflow: auto;
+
+      .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;
+          overflow:hidden;
+          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: 180px;
+                text-align: right;
+                color: #555;
+              }
+              .content-data {
+                text-align: left;
+                margin-left: 25px;
+                color: #333;
+              }
+            }
+            .remark {
+              width: 100%;
+            }
+          }
+          .business_scope {
+            display: flex;
+            align-items: center;
+            font-size: 14px;
+            min-height: 40px;
+            .content-title {
+              width: 180px;
+              text-align: right;
+              color: #555;
+            }
+            .content-data {
+              flex: 1;
+              padding: 5px;
+              text-align: left;
+              margin-left: 25px;
+              color: #333;
+            }
+          }
+          .table-bottom{
+            width:300px;
+            float:right;
+            margin-right:180px;
+            margin-top:10px;
+            height:auto;
+            line-height:30px;
+            font-size:14px;
+            font-weight: 700;
+            color:#333;
+            .table-bottom-item{
+              width:100%;
+              text-align:right;
+              .table-bottom-l{
+                width:180px;
+                float:left;
+              }
+              .table-bottom-r{
+                width:calc(100% - 180px);
+                float:right;
+              }
+            }
+          }
+        }
+      }
+    }
+    .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/purchaseManage/purchase/index.vue b/src/views/purchaseManage/purchase/index.vue
new file mode 100644
index 0000000..52a58c6
--- /dev/null
+++ b/src/views/purchaseManage/purchase/index.vue
@@ -0,0 +1,209 @@
+<template>
+  <div class="rightContent">
+    <div class="content-box">
+      <div class="supplier-search">
+        <SearchCommonView
+          ref="searchCommonView"
+          :inputSelect="false"
+          placeholder="鍙緭鍏ヤ緵搴斿晢,鐗╂枡,閲囪喘鍗曠瓑鎼滅储"
+          @searchClick="searchClick"
+          @resetClick="resetClick"
+        />
+        <div class="add-view">
+          <el-button type="primary" size="mini" @click="addBtnClick">鏂板缓</el-button>
+        </div>
+      </div>
+      <template>
+        <TableCommonView
+         class="content-table"
+          ref="tableListRef"
+          :table-list="tableList"
+          @selCommonClick="selCommonClick"
+        >
+          <template slot="tableButton">
+            <el-table-column label="鎿嶄綔" width="120" fixed="right">
+              <template slot-scope="scope">
+                <el-button type="text"  size="small" @click="editClick"  style="margin-right: 5px"
+                  >缂栬緫</el-button
+                >
+                <el-button  @click="submitClick(scope.row)" type="text" size="small">鎻愪氦</el-button>
+              </template>
+            </el-table-column>
+          </template>
+        </TableCommonView>
+        <div class="btn-pager">
+          <PagerView class="page" :pager-options="pagerOptions" v-on="pagerEvents" />
+        </div>
+      </template>
+    </div>
+    
+    <!-- 鏂板缓/缂栬緫閿�鍞嚎绱� -->
+    <!-- <AddSalesLeadDialog v-if="editSalesLeadConfig.visible" :edit-rightContent-config="editSalesLeadConfig" /> -->
+    <!-- 璇︽儏 -->
+    <DetailSupplier v-if="commonDetail.visible" :common-detail="commonDetail" @submitClick="submitClick" />
+  </div>
+</template>
+
+<script>
+import pageMixin from "@/components/makepager/pager/mixin/pageMixin"
+import { getSalesLeadsList, getDeleteSalesLeads } from "@/api/client/salesLead"
+import DetailSupplier from "@/views/purchaseManage/purchase/DetailSupplier"
+
+export default {
+  name: "SupplierManage",
+  props: {},
+  components: { DetailSupplier },
+  mixins: [pageMixin],
+  computed: {},
+  data() {
+    return {
+      tableList: {}, // 鍒楄〃
+      selValueList: [],
+      commonDetail: {
+        visible: false,
+        infomation: {}
+      },
+      search_map: {}
+    }
+  },
+  created() {
+    this.setTable()
+    this.getData()
+  },
+  methods: {
+    setTable() {
+      this.tableList = {
+        tableInfomation: [],
+        selectIndex: true,
+        tableColumn: [
+          { label: "閲囪喘鍗曞彿", prop: "number", min: 150, isCommonClick: true },
+          { label: "閲囪喘鍗曞悕绉�", prop: "name", min: 130,},
+          { label: "鍗曟嵁绫诲瀷", prop: "contact_name", min: 130 },
+          { label: "渚涘簲鍟嗗悕绉�", prop: "contact_phone", min: 130 },
+          { label: "閲囪喘鏁伴噺", prop: "sales_resources", min: 130 },
+          { label: "鏀惰揣浠撳簱", prop: "province", min: 130 },
+          { label: "缁忓姙浜�", prop: "city", min: 130 },
+          { label: "鍒跺崟浜�", prop: "member_name", min: 130 },
+          { label: "鐘舵��", prop: "member_name", min: 130 },
+        ]
+      }
+    },
+    // 璇锋眰鏁版嵁
+    async getData() {
+      await getSalesLeadsList({
+        search_map: this.search_map,
+        page: this.pagerOptions.currPage,
+        pageSize: this.pagerOptions.pageSize
+      })
+        .then((res) => {
+          const list = res.data.list.map((item) => {
+            return {
+              ...item,
+              province: item.Province.name,
+              city: item.City.name,
+              sales_resources: item.sales_sources.name,
+              member_name: item.member.username
+            }
+          })
+          this.tableList.tableInfomation = list || []
+          this.pagerOptions.totalCount = res.data.count
+        })
+        .catch((err) => {
+          console.log(err)
+        })
+    },
+    // 鎼滅储
+    searchClick(val, content) {
+      console.log(val, content)
+      this.search_map = {
+        [val.value]: content
+      }
+      this.getData()
+    },
+    resetClick() {
+      this.search_map = {}
+      this.getData()
+    },
+    // 鏂板缓
+    addBtnClick() {},
+    // 缂栬緫
+    editClick(){
+
+    },
+    // 纭鍙戣揣
+    submitClick() {
+        this.$confirm("鏄惁鎻愪氦?", "鎻愮ず", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        })
+          .then(() => {
+            console.log("dddd")
+            getDeleteSalesLeads({ ids: this.selValueList }).then((response) => {
+              if (response.code === 200) {
+                this.$message.success("鎻愪氦鎴愬姛")
+                this.getData()
+              } else {
+                this.$message.warning("鎻愪氦澶辫触")
+              }
+            })
+          })
+          .catch(() => {})
+    },
+    
+    // 璇︽儏
+    selCommonClick(row) {
+      console.log(row)
+      this.commonDetail.visible = true
+      this.commonDetail.infomation = { ...row }
+    }
+  }
+}
+</script>
+
+<!-- Add "scoped" attribute to limit CSS to this component only -->
+<style lang="scss" scoped>
+.rightContent {
+  width:100%;
+  height:calc(100% - 10px);
+  .content-box {
+    height:100%;
+    .supplier-search {
+      display: flex;
+      align-items: center;
+      .add-view {
+        margin-left: auto;
+        margin-right: 20px;
+      }
+    }
+    .content-table{
+      // height:calc(100% - 60px - 42px);
+    }
+    .btn-pager {
+      display: flex;
+      .page {
+        margin-left: auto;
+      }
+    }
+  }
+  .bottom {
+    .product-search {
+      display: flex;
+      align-items: center;
+      .search {
+        margin-left: auto;
+      }
+      .add-view {
+        margin-left: 20px;
+        margin-right: 20px;
+      }
+    }
+    .btn-pager {
+      display: flex;
+      .page {
+        margin-left: auto;
+      }
+    }
+  }
+}
+</style>
diff --git a/src/views/purchaseManage/quality/DetailSupplier.vue b/src/views/purchaseManage/quality/DetailSupplier.vue
new file mode 100644
index 0000000..054e824
--- /dev/null
+++ b/src/views/purchaseManage/quality/DetailSupplier.vue
@@ -0,0 +1,338 @@
+<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>
+        <div class="btn" style="float:right;margin-right:30px;">
+            <el-button type="primary" size="mini" @click="qualityClick" icon="el-icon-search" style="margin-right: 5px"
+              >鎵撳嵃</el-button
+            >
+            <el-button type="primary" size="mini" icon="el-icon-refresh-left" @click="qualityClick">鍘昏川妫�</el-button>
+          </div>
+      </template>
+      <div class="content">
+        <div class="tab-view">
+          <el-tabs v-model="activeName">
+            <el-tab-pane label="璇︽儏" name="first"></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 ? item.leftValue : "--" }}</div>
+                  </div>
+                  <div v-if="item.rightStr && item.rightStr.length > 0" class="right">
+                    <div class="content-title">{{ item.rightStr + "锛�" }}</div>
+                    <div class="content-data">{{ item.rightValue ? item.rightValue : "--" }}</div>
+                  </div>
+                </li>
+              </ul>
+              <div class="business_scope">
+                <div class="content-title">{{ "澶囨敞淇℃伅锛�" }}</div>
+                <div class="content-data">{{ record ? record : "--" }}</div>
+              </div>
+            </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">
+              <TableCommonView
+                style='margin-top:2px;'
+                 class="content-table"
+                  ref="tableListRef"
+                  :table-list="tableList"
+                >
+                </TableCommonView>
+            </div>
+          </div>
+        </div>
+        
+      </div>
+    </el-drawer>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "DetailSupplier",
+  props: {
+    commonDetail: {
+      type: Object,
+      default: () => {
+        return {
+          visible: false,
+          infomation: {},
+          tableList:[],
+        }
+      }
+    }
+  },
+  components: {},
+  computed: {},
+  data() {
+    return {
+      detailConfig: this.commonDetail,
+      activeName: "first",
+      isBasicExpand: true, // 鍩烘湰淇℃伅灞曞紑
+      basicInfoList: [],
+      isDynamicExpand: true, // 浜у搧淇℃伅
+      tableList: [],
+      addConfig: {},
+      record: "", // 鏈�鏂拌繘灞�
+    }
+  },
+  created() {
+    this.setData(this.detailConfig.infomation)
+    this.addConfig = {
+      id_name: "sales_leads_id",
+      id: this.detailConfig.infomation.id,
+      common_name: this.detailConfig.infomation.id,
+      sales_leads_name: this.detailConfig.infomation.name,
+      sales_leads_id: this.detailConfig.infomation.id
+    }
+  },
+  mounted() {},
+  methods: {
+    // 鍘昏川妫�
+    qualityClick(){
+      this.$emit('qualityClick')
+    },
+    setData(item) {
+      if (item.FollowRecord && item.FollowRecord.length > 0) {
+        this.record = item.FollowRecord[0].record
+        console.log(item.FollowRecord[0].follow_time)
+      }
+      this.basicInfoList = [
+        {
+          leftStr: "閲囪喘璐ㄦ鍗曠紪鍙�",
+          leftValue: item.number,
+          rightStr: "璐ㄦ鐘舵��",
+          rightValue: item.name
+        },
+        {
+          leftStr: "閲囪喘鍗曠紪鍙�",
+          leftValue: item.contact_name,
+          rightStr: "璐ㄦ鍛�",
+          rightValue: item.contact_position
+        },
+        {
+          leftStr: "渚涘簲鍟嗗悕绉�",
+          leftValue: item.contact_phone,
+          rightStr: "鍒拌揣浠撳簱",
+          rightValue: "18513375588"
+        },
+        {
+          leftStr: "鐗╂祦鍏徃",
+          leftValue: item.sales_resources,
+          rightStr: "鍒涘缓鏃堕棿",
+          rightValue: item.member_name
+        },
+        {
+          leftStr: "鐗╂祦鍗曞彿",
+          leftValue: item.sales_resources,
+          rightStr: "",
+          rightValue: ""
+        }
+      ]
+      this.tableList = {
+        tableInfomation: [],
+        selectIndex: true,
+        tableColumn: [
+          { label: "浜у搧鍚嶇О", prop: "number", min: 190, isCommonClick: true },
+          { label: "浜у搧缂栫爜", prop: "name", min: 130, isCommonClick: true},
+          { label: "璁¢噺鍗曚綅", prop: "contact_name", min: 130 },
+          { label: "瑙勬牸鍨嬪彿", prop: "contact_phone", min: 130 },
+          { label: "鍒拌揣鏁伴噺", prop: "contact_phone", min: 130 },
+          { label: "鍚堟牸鏁伴噺", prop: "sales_resources", min: 130 },
+          { label: "涓嶅悎鏍兼暟閲�", prop: "province", min: 130 },
+        ]
+      }
+    },
+    handleClose() {
+      this.detailConfig.visible = false
+    },
+    
+    // 灞曞紑鏀惰捣鐐瑰嚮浜嬩欢
+    expandClick(value) {
+      console.log(value)
+      if (value === "basic") {
+        this.isBasicExpand = !this.isBasicExpand
+      } else if (value === "dynamic") {
+        this.isDynamicExpand = !this.isDynamicExpand
+      }
+    },
+    // 璁$畻涓や釜鏃ユ湡涔嬮棿鐨勫樊鍊�
+    getDiffDay(date_1, date_2) {
+      let totalDays, diffDate
+      let myDate_1 = date_1
+      let myDate_2 = Date.parse(date_2)
+      // 灏嗕袱涓棩鏈熼兘杞崲涓烘绉掓牸寮忥紝鐒跺悗鍋氬樊
+      diffDate = Math.abs(myDate_1 - myDate_2) // 鍙栫浉宸绉掓暟鐨勭粷瀵瑰��
+
+      totalDays = Math.floor(diffDate / (1000 * 3600 * 24)) // 鍚戜笅鍙栨暣
+      // console.log(totalDays)
+
+      return totalDays // 鐩稿樊鐨勫ぉ鏁�
+    }
+  }
+}
+</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 {
+    height:100%;
+    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 {
+      height:calc(100% - 40px);
+      background:#fff;
+      overflow:auto;
+      .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: 180px;
+                text-align: right;
+                color: #555;
+              }
+              .content-data {
+                text-align: left;
+                margin-left: 25px;
+                color: #333;
+              }
+            }
+            .remark {
+              width: 100%;
+            }
+          }
+          .business_scope {
+            display: flex;
+            align-items: center;
+            font-size: 14px;
+            min-height: 40px;
+            .content-title {
+              width: 180px;
+              text-align: right;
+              color: #555;
+            }
+            .content-data {
+              flex: 1;
+              padding: 5px;
+              text-align: left;
+              margin-left: 25px;
+              color: #333;
+            }
+          }
+        }
+      }
+    }
+    .second {
+      background: #fff;
+      .followup-records {
+        .table-view {
+          margin-top: 0 !important;
+          margin-bottom: 0;
+        }
+      }
+    }
+  }
+}
+::v-deep .el-drawer__body{
+    height:calc(100% - 60px)!important;
+  }
+::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/purchaseManage/quality/index.vue b/src/views/purchaseManage/quality/index.vue
new file mode 100644
index 0000000..9a987ef
--- /dev/null
+++ b/src/views/purchaseManage/quality/index.vue
@@ -0,0 +1,205 @@
+<template>
+  <div class="rightContent">
+    <div class="content-box">
+      <div class="supplier-search">
+        <SearchCommonView
+          ref="searchCommonView"
+          :inputSelect="false"
+          placeholder="鍙緭鍏ヤ緵搴斿晢,鐗╂枡,閲囪喘鍗曠瓑鎼滅储"
+          @searchClick="searchClick"
+          @resetClick="resetClick"
+        />
+      </div>
+      <template>
+        <TableCommonView
+         class="content-table"
+          ref="tableListRef"
+          :table-list="tableList"
+          @selCommonClick="selCommonClick"
+          @getSelectArray="getSelectArray"
+        >
+          <template slot="tableButton">
+            <el-table-column label="鎿嶄綔" width="120" fixed="right">
+              <template slot-scope="scope">
+                <el-button  @click="qualityClick(scope.row)" type="text" size="small">鍘昏川妫�</el-button>
+              </template>
+            </el-table-column>
+          </template>
+        </TableCommonView>
+        <div class="btn-pager">
+          <PagerView class="page" :pager-options="pagerOptions" v-on="pagerEvents" />
+        </div>
+      </template>
+    </div>
+    
+    <!-- 鏂板缓/缂栬緫閿�鍞嚎绱� -->
+    <!-- <AddSalesLeadDialog v-if="editSalesLeadConfig.visible" :edit-rightContent-config="editSalesLeadConfig" /> -->
+    <!-- 璇︽儏 -->
+    <DetailSupplier v-if="commonDetail.visible" :common-detail="commonDetail" @qualityClick="qualityClick" />
+  </div>
+</template>
+
+<script>
+import pageMixin from "@/components/makepager/pager/mixin/pageMixin"
+import { getSalesLeadsList, getDeleteSalesLeads } from "@/api/client/salesLead"
+import DetailSupplier from "@/views/purchaseManage/quality/DetailSupplier"
+
+export default {
+  name: "SupplierManage",
+  props: {},
+  components: { DetailSupplier },
+  mixins: [pageMixin],
+  computed: {},
+  data() {
+    return {
+      tableList: {}, // 鍒楄〃
+      selValueList: [],
+      commonDetail: {
+        visible: false,
+        infomation: {}
+      },
+      search_map: {}
+    }
+  },
+  created() {
+    this.setTable()
+    this.getData()
+  },
+  methods: {
+    setTable() {
+      this.tableList = {
+        tableInfomation: [],
+        selectIndex: true,
+        tableColumn: [
+          { label: "璐ㄦ鍗曠紪鍙�", prop: "number", min: 190, isCommonClick: true },
+          { label: "閲囪喘鍗曠紪鍙�", prop: "name", min: 130, isCommonClick: true},
+          { label: "鍗曟嵁绫诲瀷", prop: "contact_name", min: 130 },
+          { label: "渚涘簲鍟嗗悕绉�", prop: "contact_phone", min: 130 },
+          { label: "鍒拌揣浠撳簱", prop: "sales_resources", min: 130 },
+          { label: "璐ㄦ鏁伴噺", prop: "province", min: 130 },
+          { label: "妫�楠屽憳", prop: "city", min: 130 },
+          { label: "鐘舵��", prop: "member_name", min: 110 },
+          { label: "璐ㄦ鏃堕棿", prop: "member_name", min: 150 },
+        ]
+      }
+    },
+    // 璇锋眰鏁版嵁
+    async getData() {
+      await getSalesLeadsList({
+        search_map: this.search_map,
+        page: this.pagerOptions.currPage,
+        pageSize: this.pagerOptions.pageSize
+      })
+        .then((res) => {
+          const list = res.data.list.map((item) => {
+            return {
+              ...item,
+              province: item.Province.name,
+              city: item.City.name,
+              sales_resources: item.sales_sources.name,
+              member_name: item.member.username
+            }
+          })
+          this.tableList.tableInfomation = list || []
+          this.pagerOptions.totalCount = res.data.count
+        })
+        .catch((err) => {
+          console.log(err)
+        })
+    },
+    // 鎼滅储
+    searchClick(val, content) {
+      console.log(val, content)
+      this.search_map = {
+        [val.value]: content
+      }
+      this.getData()
+    },
+    resetClick() {
+      this.search_map = {}
+      this.getData()
+    },
+   
+    // 纭鍙戣揣
+    qualityClick() {
+        this.$confirm("鏄惁璐ㄦ?", "鎻愮ず", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        })
+          .then(() => {
+            console.log("dddd")
+            getDeleteSalesLeads({ ids: this.selValueList }).then((response) => {
+              if (response.code === 200) {
+                this.$message.success("纭鍙戣揣鎴愬姛")
+                this.getData()
+              } else {
+                this.$message.warning("纭鍙戣揣澶辫触")
+              }
+            })
+          })
+          .catch(() => {})
+    },
+    getSelectArray(val) {
+      this.selValueList = []
+      const list = val.map((item) => {
+        return item.id
+      })
+      this.selValueList = list
+    },
+    // 璇︽儏
+    selCommonClick(row) {
+      console.log(row)
+      this.commonDetail.visible = true
+      this.commonDetail.infomation = { ...row }
+    }
+  }
+}
+</script>
+
+<!-- Add "scoped" attribute to limit CSS to this component only -->
+<style lang="scss" scoped>
+.rightContent {
+  width:100%;
+  height:calc(100% - 10px);
+  .content-box {
+    height:100%;
+    .supplier-search {
+      display: flex;
+      align-items: center;
+      .add-view {
+        margin-left: auto;
+        margin-right: 20px;
+      }
+    }
+    .content-table{
+      // height:calc(100% - 60px - 42px);
+    }
+    .btn-pager {
+      display: flex;
+      .page {
+        margin-left: auto;
+      }
+    }
+  }
+  .bottom {
+    .product-search {
+      display: flex;
+      align-items: center;
+      .search {
+        margin-left: auto;
+      }
+      .add-view {
+        margin-left: 20px;
+        margin-right: 20px;
+      }
+    }
+    .btn-pager {
+      display: flex;
+      .page {
+        margin-left: auto;
+      }
+    }
+  }
+}
+</style>
diff --git a/src/views/purchaseManage/returned/DetailSupplier.vue b/src/views/purchaseManage/returned/DetailSupplier.vue
new file mode 100644
index 0000000..5db62d2
--- /dev/null
+++ b/src/views/purchaseManage/returned/DetailSupplier.vue
@@ -0,0 +1,352 @@
+<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">
+            <el-tab-pane label="璇︽儏" name="first"></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 ? item.leftValue : "--" }}</div>
+                  </div>
+                  <div v-if="item.rightStr && item.rightStr.length > 0" class="right">
+                    <div class="content-title">{{ item.rightStr + "锛�" }}</div>
+                    <div class="content-data">{{ item.rightValue ? item.rightValue : "--" }}</div>
+                  </div>
+                </li>
+              </ul>
+              <div class="business_scope">
+                <div class="content-title">{{ "閫�璐у娉細" }}</div>
+                <div class="content-data">{{ record ? record : "--" }}</div>
+              </div>
+            </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">
+              <TableCommonView
+                style='margin-top:2px;'
+                 class="content-table"
+                  ref="tableListRef"
+                  :table-list="tableList"
+                  :showSummary="showSummary"
+                >
+                </TableCommonView>
+            </div>
+          </div>
+        </div>
+        
+      </div>
+    </el-drawer>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "DetailSupplier",
+  props: {
+    commonDetail: {
+      type: Object,
+      default: () => {
+        return {
+          visible: false,
+          infomation: {},
+          tableList:{},
+          showSummary:{
+            show: true,
+            sumProp: ["number", "total"],
+            mergeNumber: 4,
+            totalName:'灏忚'
+          },
+        }
+      }
+    }
+  },
+  components: {},
+  computed: {},
+  data() {
+    return {
+      detailConfig: this.commonDetail,
+      activeName: "first",
+      isBasicExpand: true, // 鍩烘湰淇℃伅灞曞紑
+      basicInfoList: [],
+      isDynamicExpand: true, // 浜у搧淇℃伅
+      tableList: [],
+      addConfig: {},
+      record: "", // 鏈�鏂拌繘灞�
+    }
+  },
+  created() {
+    this.setData(this.detailConfig.infomation)
+    this.addConfig = {
+      id_name: "sales_leads_id",
+      id: this.detailConfig.infomation.id,
+      common_name: this.detailConfig.infomation.id,
+      sales_leads_name: this.detailConfig.infomation.name,
+      sales_leads_id: this.detailConfig.infomation.id
+    }
+  },
+  mounted() {},
+  methods: {
+    setData(item) {
+      if (item.FollowRecord && item.FollowRecord.length > 0) {
+        this.record = item.FollowRecord[0].record
+        console.log(item.FollowRecord[0].follow_time)
+      }
+      this.basicInfoList = [
+        {
+          leftStr: "閲囪喘閫�璐у崟缂栧彿",
+          leftValue: item.number,
+          rightStr: "渚涘簲鍟嗗悕绉�",
+          rightValue: item.name
+        },
+        {
+          leftStr: "璐ㄦ鍗曠紪鍙�",
+          leftValue: item.contact_name,
+          rightStr: "璐ㄦ鍛�",
+          rightValue: item.contact_position
+        },
+        {
+          leftStr: "閫�璐у崟鐘舵��",
+          leftValue: item.contact_phone,
+          rightStr: "閫�璐ф棩鏈�",
+          rightValue: "18513375588"
+        },
+        {
+          leftStr: "閫�璐т粨搴�",
+          leftValue: item.sales_resources,
+          rightStr: "缁忓姙浜�",
+          rightValue: item.member_name
+        },
+        {
+          leftStr: "鍒跺崟浜�",
+          leftValue: item.sales_resources,
+          rightStr: "璐ц繍鍏徃",
+          rightValue: ""
+        },
+        {
+          leftStr: "璐ㄦ鏃ユ湡",
+          leftValue: item.sales_resources,
+          rightStr: "鐗╂祦鍗曞彿",
+          rightValue: ""
+        },
+        {
+          leftStr: "閫�璐у師鍥�",
+          leftValue: item.sales_resources,
+          rightStr: "閫�璐у湴鍧�",
+          rightValue: ""
+        },
+        {
+          leftStr: "閫�璐ц仈绯讳汉",
+          leftValue: item.sales_resources,
+          rightStr: "",
+          rightValue: ""
+        }
+      ]
+      this.tableList = {
+        tableInfomation: [],
+        selectIndex: true,
+        tableColumn: [
+          { label: "浜у搧鍚嶇О", prop: "number", min: 190, isCommonClick: true },
+          { label: "浜у搧缂栫爜", prop: "name", min: 130, isCommonClick: true},
+          { label: "璁¢噺鍗曚綅", prop: "contact_name", min: 130 },
+          { label: "瑙勬牸鍨嬪彿", prop: "contact_phone", min: 130 },
+          { label: "閲囪喘鏁伴噺", prop: "sales_resources", min: 130 },
+          { label: "閫�璐ф暟閲�", prop: "province", min: 130 },
+        ]
+      }
+    },
+    handleClose() {
+      this.detailConfig.visible = false
+    },
+    
+    // 灞曞紑鏀惰捣鐐瑰嚮浜嬩欢
+    expandClick(value) {
+      console.log(value)
+      if (value === "basic") {
+        this.isBasicExpand = !this.isBasicExpand
+      } else if (value === "dynamic") {
+        this.isDynamicExpand = !this.isDynamicExpand
+      }
+    },
+    // 璁$畻涓や釜鏃ユ湡涔嬮棿鐨勫樊鍊�
+    getDiffDay(date_1, date_2) {
+      let totalDays, diffDate
+      let myDate_1 = date_1
+      let myDate_2 = Date.parse(date_2)
+      // 灏嗕袱涓棩鏈熼兘杞崲涓烘绉掓牸寮忥紝鐒跺悗鍋氬樊
+      diffDate = Math.abs(myDate_1 - myDate_2) // 鍙栫浉宸绉掓暟鐨勭粷瀵瑰��
+
+      totalDays = Math.floor(diffDate / (1000 * 3600 * 24)) // 鍚戜笅鍙栨暣
+      // console.log(totalDays)
+
+      return totalDays // 鐩稿樊鐨勫ぉ鏁�
+    }
+  }
+}
+</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 {
+    height:100%;
+    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 {
+      height:calc(100% - 40px);
+      background:#fff;
+      overflow:auto;
+      .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: 180px;
+                text-align: right;
+                color: #555;
+              }
+              .content-data {
+                text-align: left;
+                margin-left: 25px;
+                color: #333;
+              }
+            }
+            .remark {
+              width: 100%;
+            }
+          }
+          .business_scope {
+            display: flex;
+            align-items: center;
+            font-size: 14px;
+            min-height: 40px;
+            .content-title {
+              width: 180px;
+              text-align: right;
+              color: #555;
+            }
+            .content-data {
+              flex: 1;
+              padding: 5px;
+              text-align: left;
+              margin-left: 25px;
+              color: #333;
+            }
+          }
+        }
+      }
+    }
+    .second {
+      background: #fff;
+      .followup-records {
+        .table-view {
+          margin-top: 0 !important;
+          margin-bottom: 0;
+        }
+      }
+    }
+  }
+}
+::v-deep .el-drawer__body{
+    height:calc(100% - 60px)!important;
+  }
+::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/purchaseManage/returned/index.vue b/src/views/purchaseManage/returned/index.vue
new file mode 100644
index 0000000..f5d798d
--- /dev/null
+++ b/src/views/purchaseManage/returned/index.vue
@@ -0,0 +1,207 @@
+<template>
+  <div class="rightContent">
+    <div class="content-box">
+      <div class="supplier-search">
+        <SearchCommonView
+          ref="searchCommonView"
+          :inputSelect="false"
+          placeholder="鍙緭鍏ラ噰璐崟,渚涘簲鍟嗗悕绉扮瓑鎼滅储"
+          @searchClick="searchClick"
+          @resetClick="resetClick"
+        />
+        
+      </div>
+      <template>
+        <TableCommonView
+         class="content-table"
+          ref="tableListRef"
+          :table-list="tableList"
+          @selCommonClick="selCommonClick"
+          @getSelectArray="getSelectArray"
+        >
+          <template slot="tableButton">
+            <el-table-column label="鎿嶄綔" width="120">
+              <template slot-scope="scope">
+                <el-button  @click="confirmClick(scope.row)" type="text" size="small">纭鍙戣揣</el-button>
+              </template>
+            </el-table-column>
+          </template>
+        </TableCommonView>
+        <div class="btn-pager">
+          <PagerView class="page" :pager-options="pagerOptions" v-on="pagerEvents" />
+        </div>
+      </template>
+    </div>
+  
+    <!-- 鏂板缓/缂栬緫閿�鍞嚎绱� -->
+    <!-- <AddSalesLeadDialog v-if="editSalesLeadConfig.visible" :edit-rightContent-config="editSalesLeadConfig" /> -->
+    <!-- 璇︽儏 -->
+    <DetailSupplier v-if="commonDetail.visible" :common-detail="commonDetail" />
+  </div>
+</template>
+
+<script>
+import pageMixin from "@/components/makepager/pager/mixin/pageMixin"
+import { getSalesLeadsList, getDeleteSalesLeads } from "@/api/client/salesLead"
+import DetailSupplier from "@/views/purchaseManage/returned/DetailSupplier"
+
+export default {
+  name: "SupplierManage",
+  props: {},
+  components: { DetailSupplier },
+  mixins: [pageMixin],
+  computed: {},
+  data() {
+    return {
+      tableList: {}, // 鍒楄〃
+      selValueList: [],
+      commonDetail: {
+        visible: false,
+        infomation: {}
+      },
+      search_map: {}
+    }
+  },
+  created() {
+    this.setTable()
+    this.getData()
+  },
+  methods: {
+    setTable() {
+      this.tableList = {
+        tableInfomation: [],
+        selectIndex: true,
+        tableColumn: [
+          { label: "閫�璐у崟缂栧彿", prop: "number", min: 190, isCommonClick: true },
+          { label: "閲囪喘鍗曠紪鍙�", prop: "name", min: 130, isCommonClick: true},
+          { label: "鍗曟嵁绫诲瀷", prop: "contact_name", min: 130 },
+          { label: "渚涘簲鍟嗗悕绉�", prop: "contact_phone", min: 130 },
+          { label: "閫�璐т粨搴�", prop: "sales_resources", min: 130 },
+          { label: "閫�璐х悊鐢�", prop: "province", min: 180 },
+          { label: "缁忓姙浜�", prop: "city", min: 130 },
+          { label: "鍒跺崟浜�", prop: "member_name", min: 130 },
+          { label: "閫�璐ф棩鏈�", prop: "member_name", min: 150 },
+          { label: "鐘舵��", prop: "member_name", min: 110 }
+        ]
+      }
+    },
+    // 璇锋眰鏁版嵁
+    async getData() {
+      await getSalesLeadsList({
+        search_map: this.search_map,
+        page: this.pagerOptions.currPage,
+        pageSize: this.pagerOptions.pageSize
+      })
+        .then((res) => {
+          const list = res.data.list.map((item) => {
+            return {
+              ...item,
+              province: item.Province.name,
+              city: item.City.name,
+              sales_resources: item.sales_sources.name,
+              member_name: item.member.username
+            }
+          })
+          this.tableList.tableInfomation = list || []
+          this.pagerOptions.totalCount = res.data.count
+        })
+        .catch((err) => {
+          console.log(err)
+        })
+    },
+    // 鎼滅储
+    searchClick(val, content) {
+      console.log(val, content)
+      this.search_map = {
+        [val.value]: content
+      }
+      this.getData()
+    },
+    resetClick() {
+      this.search_map = {}
+      this.getData()
+    },
+   
+    // 纭鍙戣揣
+    confirmClick() {
+        this.$confirm("鏄惁纭鍙戣揣?", "璀﹀憡", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        })
+          .then(() => {
+            console.log("dddd")
+            getDeleteSalesLeads({ ids: this.selValueList }).then((response) => {
+              if (response.code === 200) {
+                this.$message.success("纭鍙戣揣鎴愬姛")
+                this.getData()
+              } else {
+                this.$message.warning("纭鍙戣揣澶辫触")
+              }
+            })
+          })
+          .catch(() => {})
+    },
+    getSelectArray(val) {
+      this.selValueList = []
+      const list = val.map((item) => {
+        return item.id
+      })
+      this.selValueList = list
+    },
+    // 璇︽儏
+    selCommonClick(row) {
+      console.log(row)
+      this.commonDetail.visible = true
+      this.commonDetail.infomation = { ...row }
+    }
+  }
+}
+</script>
+
+<!-- Add "scoped" attribute to limit CSS to this component only -->
+<style lang="scss" scoped>
+.rightContent {
+  width:100%;
+  height:calc(100% - 10px);
+  .content-box {
+    height:100%;
+    .supplier-search {
+      display: flex;
+      align-items: center;
+      .add-view {
+        margin-left: auto;
+        margin-right: 20px;
+      }
+    }
+    .content-table{
+      // height:calc(100% - 60px - 42px);
+    }
+    .btn-pager {
+      display: flex;
+      .page {
+        margin-left: auto;
+      }
+    }
+  }
+  .bottom {
+    .product-search {
+      display: flex;
+      align-items: center;
+      .search {
+        margin-left: auto;
+      }
+      .add-view {
+        margin-left: 20px;
+        margin-right: 20px;
+      }
+    }
+    .btn-pager {
+      display: flex;
+      .page {
+        margin-left: auto;
+      }
+    }
+  }
+}
+</style>
diff --git a/src/views/purchaseManage/warehouse/DetailSupplier.vue b/src/views/purchaseManage/warehouse/DetailSupplier.vue
new file mode 100644
index 0000000..343aa87
--- /dev/null
+++ b/src/views/purchaseManage/warehouse/DetailSupplier.vue
@@ -0,0 +1,345 @@
+<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">
+            <el-tab-pane label="璇︽儏" name="first"></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 ? item.leftValue : "--" }}</div>
+                  </div>
+                  <div v-if="item.rightStr && item.rightStr.length > 0" class="right">
+                    <div class="content-title">{{ item.rightStr + "锛�" }}</div>
+                    <div class="content-data">{{ item.rightValue ? item.rightValue : "--" }}</div>
+                  </div>
+                </li>
+              </ul>
+              <div class="business_scope">
+                <div class="content-title">{{ "澶囨敞淇℃伅锛�" }}</div>
+                <div class="content-data">{{ record ? record : "--" }}</div>
+              </div>
+            </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">
+              <TableCommonView
+                style='margin-top:2px;'
+                 class="content-table"
+                  ref="tableListRef"
+                  :table-list="tableList"
+                >
+                </TableCommonView>
+            </div>
+          </div>
+        </div>
+        
+      </div>
+    </el-drawer>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "DetailSupplier",
+  props: {
+    commonDetail: {
+      type: Object,
+      default: () => {
+        return {
+          visible: false,
+          infomation: {},
+          tableList:[],
+        }
+      }
+    }
+  },
+  components: {},
+  computed: {},
+  data() {
+    return {
+      detailConfig: this.commonDetail,
+      activeName: "first",
+      isBasicExpand: true, // 鍩烘湰淇℃伅灞曞紑
+      basicInfoList: [],
+      isDynamicExpand: true, // 浜у搧淇℃伅
+      tableList: [],
+      addConfig: {},
+      record: "", // 鏈�鏂拌繘灞�
+      noContactDays: 0,
+      newContactDays: ""
+    }
+  },
+  created() {
+    this.setData(this.detailConfig.infomation)
+    this.addConfig = {
+      id_name: "sales_leads_id",
+      id: this.detailConfig.infomation.id,
+      common_name: this.detailConfig.infomation.id,
+      sales_leads_name: this.detailConfig.infomation.name,
+      sales_leads_id: this.detailConfig.infomation.id
+    }
+  },
+  mounted() {},
+  methods: {
+    setData(item) {
+      if (item.FollowRecord && item.FollowRecord.length > 0) {
+        this.record = item.FollowRecord[0].record
+        console.log(item.FollowRecord[0].follow_time)
+        let follow_time = item.FollowRecord[0].follow_time
+        this.newContactDays = follow_time.substring(0, 10)
+        this.noContactDays = this.getDiffDay(Date.now(), this.newContactDays)
+      }
+      this.basicInfoList = [
+        {
+          leftStr: "閲囪喘鍏ュ簱鍗曠紪鍙�",
+          leftValue: item.number,
+          rightStr: "鍏ュ簱鍗曠姸鎬�",
+          rightValue: item.name
+        },
+        {
+          leftStr: "璐ㄦ鍗曠紪鍙�",
+          leftValue: item.contact_name,
+          rightStr: "渚涘簲鍟嗗悕绉�",
+          rightValue: item.contact_position
+        },
+        {
+          leftStr: "鍒拌揣浠撳簱",
+          leftValue: item.contact_phone,
+          rightStr: "閲囪喘璐熻矗浜�",
+          rightValue: "18513375588"
+        },
+        {
+          leftStr: "璐ㄦ鍛�",
+          leftValue: item.sales_resources,
+          rightStr: "浠撳簱鍛�",
+          rightValue: item.member_name
+        },
+        {
+          leftStr: "璐ㄦ鏃ユ湡",
+          leftValue: item.sales_resources,
+          rightStr: "鍏ュ簱瀹屾垚鏃堕棿",
+          rightValue: ""
+        },
+        {
+          leftStr: "鐗╂祦鍏徃",
+          leftValue: item.sales_resources,
+          rightStr: "鍒涘缓鏃堕棿",
+          rightValue: ""
+        },
+        {
+          leftStr: "鐗╂枡鍗曞彿",
+          leftValue: item.sales_resources,
+          rightStr: "",
+          rightValue: ""
+        }
+      ]
+      this.tableList = {
+        tableInfomation: [],
+        selectIndex: true,
+        tableColumn: [
+          { label: "浜у搧鍚嶇О", prop: "number", min: 190, isCommonClick: true },
+          { label: "浜у搧缂栫爜", prop: "name", min: 130, isCommonClick: true},
+          { label: "璁¢噺鍗曚綅", prop: "contact_name", min: 130 },
+          { label: "瑙勬牸鍨嬪彿", prop: "contact_phone", min: 130 },
+          { label: "渚涘簲鍟嗗彂璐ф暟閲�", prop: "sales_resources", min: 160 },
+          { label: "璐ㄦ鍚堟牸鏁伴噺", prop: "province", min: 180 },
+          { label: "鍏ュ簱鏁伴噺", prop: "city", min: 130 },
+        ]
+      }
+    },
+    handleClose() {
+      this.detailConfig.visible = false
+    },
+    
+    // 灞曞紑鏀惰捣鐐瑰嚮浜嬩欢
+    expandClick(value) {
+      console.log(value)
+      if (value === "basic") {
+        this.isBasicExpand = !this.isBasicExpand
+      } else if (value === "dynamic") {
+        this.isDynamicExpand = !this.isDynamicExpand
+      }
+    },
+    // 璁$畻涓や釜鏃ユ湡涔嬮棿鐨勫樊鍊�
+    getDiffDay(date_1, date_2) {
+      let totalDays, diffDate
+      let myDate_1 = date_1
+      let myDate_2 = Date.parse(date_2)
+      // 灏嗕袱涓棩鏈熼兘杞崲涓烘绉掓牸寮忥紝鐒跺悗鍋氬樊
+      diffDate = Math.abs(myDate_1 - myDate_2) // 鍙栫浉宸绉掓暟鐨勭粷瀵瑰��
+
+      totalDays = Math.floor(diffDate / (1000 * 3600 * 24)) // 鍚戜笅鍙栨暣
+      // console.log(totalDays)
+
+      return totalDays // 鐩稿樊鐨勫ぉ鏁�
+    }
+  }
+}
+</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 {
+    height:100%;
+    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 {
+      height:calc(100% - 40px);
+      background:#fff;
+      overflow:auto;
+      .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: 180px;
+                text-align: right;
+                color: #555;
+              }
+              .content-data {
+                text-align: left;
+                margin-left: 25px;
+                color: #333;
+              }
+            }
+            .remark {
+              width: 100%;
+            }
+          }
+          .business_scope {
+            display: flex;
+            align-items: center;
+            font-size: 14px;
+            min-height: 40px;
+            .content-title {
+              width: 180px;
+              text-align: right;
+              color: #555;
+            }
+            .content-data {
+              flex: 1;
+              padding: 5px;
+              text-align: left;
+              margin-left: 25px;
+              color: #333;
+            }
+          }
+        }
+      }
+    }
+    .second {
+      background: #fff;
+      .followup-records {
+        .table-view {
+          margin-top: 0 !important;
+          margin-bottom: 0;
+        }
+      }
+    }
+  }
+}
+::v-deep .el-drawer__body{
+    height:calc(100% - 60px)!important;
+  }
+::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/purchaseManage/warehouse/index.vue b/src/views/purchaseManage/warehouse/index.vue
new file mode 100644
index 0000000..016f319
--- /dev/null
+++ b/src/views/purchaseManage/warehouse/index.vue
@@ -0,0 +1,210 @@
+<template>
+  <div class="rightContent">
+    <div class="content-box">
+      <div class="supplier-search">
+        <SearchCommonView
+          ref="searchCommonView"
+          :inputSelect="false"
+          placeholder="鍙緭鍏ュ叆搴撳崟鍙�,渚涘簲鍟嗗悕绉扮瓑鎼滅储"
+          @searchClick="searchClick"
+          @resetClick="resetClick"
+        />
+        
+      </div>
+      <template>
+        <TableCommonView
+         class="content-table"
+          ref="tableListRef"
+          :table-list="tableList"
+          @selCommonClick="selCommonClick"
+          @getSelectArray="getSelectArray"
+        >
+          <!-- <template slot="tableButton">
+            <el-table-column label="鎿嶄綔" width="120">
+              <template slot-scope="scope">
+              
+              </template>
+            </el-table-column>
+          </template> -->
+        </TableCommonView>
+        <div class="btn-pager">
+          <PagerView class="page" :pager-options="pagerOptions" v-on="pagerEvents" />
+        </div>
+      </template>
+    </div>
+  
+    <!-- 鏂板缓/缂栬緫閿�鍞嚎绱� -->
+    <!-- <AddSalesLeadDialog v-if="editSalesLeadConfig.visible" :edit-rightContent-config="editSalesLeadConfig" /> -->
+    <!-- 璇︽儏 -->
+    <DetailSupplier v-if="commonDetail.visible" :common-detail="commonDetail" />
+  </div>
+</template>
+
+<script>
+import pageMixin from "@/components/makepager/pager/mixin/pageMixin"
+import { getSalesLeadsList, getDeleteSalesLeads } from "@/api/client/salesLead"
+import DetailSupplier from "@/views/purchaseManage/warehouse/DetailSupplier"
+
+export default {
+  name: "SupplierManage",
+  props: {},
+  components: { DetailSupplier },
+  mixins: [pageMixin],
+  computed: {},
+  data() {
+    return {
+      tableList: {}, // 鍒楄〃
+      selValueList: [],
+      commonDetail: {
+        visible: false,
+        infomation: {}
+      },
+      search_map: {}
+    }
+  },
+  created() {
+    this.setTable()
+    this.getData()
+  },
+  methods: {
+    setTable() {
+      this.tableList = {
+        tableInfomation: [],
+        selectIndex: true,
+        tableColumn: [
+          { label: "鍏ュ簱鍗曞彿", prop: "number", min: 190, isCommonClick: true },
+          { label: "閲囪喘缂栧彿", prop: "name", min: 130, isCommonClick: true},
+          { label: "鍗曟嵁绫诲瀷", prop: "contact_name", min: 130 },
+          { label: "渚涘簲鍟�", prop: "contact_phone", min: 130 },
+          { label: "鏀惰揣浠撳簱", prop: "sales_resources", min: 130 },
+          { label: "鍏ュ簱鏃堕棿", prop: "province", min: 180 },
+          { label: "缁忓姙浜�", prop: "city", min: 130 },
+          { label: "鍒跺崟浜�", prop: "member_name", min: 130 },
+          { label: "鐘舵��", prop: "member_name", min: 110 }
+        ]
+      }
+    },
+    // 璇锋眰鏁版嵁
+    async getData() {
+      await getSalesLeadsList({
+        search_map: this.search_map,
+        page: this.pagerOptions.currPage,
+        pageSize: this.pagerOptions.pageSize
+      })
+        .then((res) => {
+          const list = res.data.list.map((item) => {
+            return {
+              ...item,
+              province: item.Province.name,
+              city: item.City.name,
+              sales_resources: item.sales_sources.name,
+              member_name: item.member.username
+            }
+          })
+          this.tableList.tableInfomation = list || []
+          this.pagerOptions.totalCount = res.data.count
+        })
+        .catch((err) => {
+          console.log(err)
+        })
+    },
+    // 鎼滅储
+    searchClick(val, content) {
+      console.log(val, content)
+      this.search_map = {
+        [val.value]: content
+      }
+      this.getData()
+    },
+    resetClick() {
+      this.search_map = {}
+      this.getData()
+    },
+   
+    // 鍒犻櫎
+    delClick() {
+      if (this.selValueList && this.selValueList.length > 0) {
+        this.$confirm("鏄惁纭鍒犻櫎?", "璀﹀憡", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        })
+          .then(() => {
+            console.log("dddd")
+            getDeleteSalesLeads({ ids: this.selValueList }).then((response) => {
+              if (response.code === 200) {
+                this.$message.success("鍒犻櫎鎴愬姛")
+                this.getData()
+              } else {
+                this.$message.warning("鍒犻櫎澶辫触")
+              }
+            })
+          })
+          .catch(() => {})
+      } else {
+        this.$message.warning("璇疯嚦灏戦�夋嫨涓�鏉¤褰�")
+      }
+    },
+    getSelectArray(val) {
+      this.selValueList = []
+      const list = val.map((item) => {
+        return item.id
+      })
+      this.selValueList = list
+    },
+    // 璇︽儏
+    selCommonClick(row) {
+      console.log(row)
+      this.commonDetail.visible = true
+      this.commonDetail.infomation = { ...row }
+    }
+  }
+}
+</script>
+
+<!-- Add "scoped" attribute to limit CSS to this component only -->
+<style lang="scss" scoped>
+.rightContent {
+  width:100%;
+  height:calc(100% - 10px);
+  .content-box {
+    height:100%;
+    .supplier-search {
+      display: flex;
+      align-items: center;
+      .add-view {
+        margin-left: auto;
+        margin-right: 20px;
+      }
+    }
+    .content-table{
+      // height:calc(100% - 60px - 42px);
+    }
+    .btn-pager {
+      display: flex;
+      .page {
+        margin-left: auto;
+      }
+    }
+  }
+  .bottom {
+    .product-search {
+      display: flex;
+      align-items: center;
+      .search {
+        margin-left: auto;
+      }
+      .add-view {
+        margin-left: 20px;
+        margin-right: 20px;
+      }
+    }
+    .btn-pager {
+      display: flex;
+      .page {
+        margin-left: auto;
+      }
+    }
+  }
+}
+</style>

--
Gitblit v1.8.0