Browse Source

2022-7-13

codeMan 2 years ago
parent
commit
742f230232

+ 90 - 60
src/HManagement/archives_ad/index.vue

@@ -1,85 +1,115 @@
 <template>
-    <div>
-        <list ref="list">
-            <!-- 新增课程 -->
-            <Header slot="add" v-if="tool.checkAuth($route.name, 'insert')">
-                <save slot="save"/>
-            </Header>
-            <!-- 详情 -->
-            <template v-slot:detail="scope">
-                <detail :id="scope.data.data.sat_sharematerialid" />
-            </template>
-            <!-- 编辑 -->
-            <template v-slot:edit="scope" v-if="tool.checkAuth($route.name, 'update')">
-                <el-button slot="edit" type="text" size="small" class="inline-16"
-                    :disabled="scope.data.data.status == '审核'" @click="editData(scope.data.data)">编辑</el-button>
-            </template>
-            <!-- 发布 -->
-            <template v-slot:release="scope" v-if="tool.checkAuth($route.name, 'release')">
-                <release :data="scope.data.data" @onSuccess="onSuccess" />
-            </template>
-            <!-- 数据分析 -->
-            <template v-slot:data_statistics="scope" v-if="tool.checkAuth($route.name, 'analysis')">
-                <el-button type="text" size="small" @click="
+  <div>
+    <list ref="list">
+      <!-- 新增课程 -->
+      <Header slot="add" v-if="tool.checkAuth($route.name, 'insert')">
+        <save />
+      </Header>
+      <!-- 详情 -->
+      <template v-slot:detail="scope">
+        <div class="inline-16">
+          <el-button type="text" size="mini" @click="openDetail(scope.data.data)">详情</el-button>
+        </div>
+      </template>
+      <!-- 编辑 -->
+      <template v-slot:edit="scope" v-if="tool.checkAuth($route.name, 'update')">
+        <el-button slot="edit" type="text" size="small" class="inline-16" :disabled="scope.data.data.status == '审核'"
+          @click="editData(scope.data.data)">编辑</el-button>
+      </template>
+      <!-- 发布 -->
+      <template v-slot:release="scope" v-if="tool.checkAuth($route.name, 'release')">
+        <release :data="scope.data.data" @onSuccess="onSuccess" />
+      </template>
+      <!-- 数据分析 -->
+      <template v-slot:data_statistics="scope" v-if="tool.checkAuth($route.name, 'analysis')">
+        <el-button type="text" size="small" @click="
                     $router.push({
                         path: '/archives_ad_analysis?id=' + scope.data.data.sat_sharematerialid
                     })
                 ">数据统计</el-button>
-            </template>
-            <!-- 删除 -->
-            <template v-slot:del="scope" v-if="tool.checkAuth($route.name, 'delete')">
-                <on-del :data="scope.data.data" @onSuccess="onSuccess" />
-            </template>
-        </list>
-    </div>
+      </template>
+      <!-- 删除 -->
+      <template v-slot:del="scope" v-if="tool.checkAuth($route.name, 'delete')">
+        <on-del :data="scope.data.data" @onSuccess="onSuccess" />
+      </template>
+    </list>
+
+    <detail ref="detail" v-if="currentFile && tool.checkAuth($route.name, 'read')" :currentSelectFile="currentFile">
+    </detail>
+  </div>
 </template>
 
 <script>
 import Header from '@/SManagement/archives_upload/components/Header';//业务端上传
 import save from '@/SManagement/archives_upload/components/save';
+import {weAtob,weBtoa} from "@/utils/weapp-jwt"
+
 
 
 import list from './modules/list.vue';
-import detail from './modules/detail.vue';
+import detail from '@/SManagement/archives_ad/components/detail'
 import release from './modules/release.vue';
 import onDel from './modules/delete.vue';
 export default {
-    name: "archives_adlist",
-    components: { list, release, onDel, detail, Header, save },
-    methods: {
-        onSuccess() {
-            this.$refs.list.getList();
-        },
-        /* 编辑素材 */
-        editData(data) {
-            window.sessionStorage.setItem('newMaterial', JSON.stringify(data));
-            this.$router.push({
-                path: '/upload_archives',
-                query: {
-                    id: data.sat_sharematerialid
-                }
-            });
-        },
-        
-        async getAgentData() {
-            const res = await this.$api.requested({
-                "classname": "webmanage.saletool.courseware.statistics.agent",
-                "method": "getAgentStudyData",
-                "content": {
-                    "sat_coursewareid": this.$route.query.id
-                }
-            })
-            this.pieStudyData = [{ type: '已学习', num: res.data.studyNum }, { type: '未学习', num: res.data.unStudyNum }]
-            this.pieDownloadData = [{ type: '已下载', num: res.data.downloadNum }, { type: '未下载', num: res.data.unDownloadNum }]
-            this.$refs.studyPie.piePlot.changeData(this.pieStudyData)
-            this.$refs.downloadPie.piePlot.changeData(this.pieDownloadData)
+  name: "archives_adlist",
+  components: { list, release, onDel, detail, Header, save },
+  data () {
+    return {
+      currentFile: {}
+    }
+  },
+  methods: {
+    onSuccess () {
+      this.$refs.list.getList();
+    },
+    /* 编辑素材 */
+    editData (data) {
+      window.sessionStorage.setItem('newMaterial', JSON.stringify(data));
+      this.$router.push({
+        path: '/upload_archives',
+        query: {
+          id: data.sat_sharematerialid
+        }
+      });
+    },
+    /* 打开详情 */
+    openDetail (data) {
+      let param = {
+        "classname": "saletool.sharematerial.sharematerial",
+        "method": "selectDetail",
+        "content": {
+          "sat_sharematerialid": data.sat_sharematerialid
+        }
+      }
+      this.$api.requested(param).then(res => {
+        res.data.content = weAtob(res.data.content)
+        res.data.attinfos = this.fileType.fileList(res.data.attinfos)
+        this.currentFile = res.data
+        this.$nextTick(() => {
+          this.$refs.detail.isFileInfoPanlShow = true
+        })
+      })
+    },
+
+    async getAgentData () {
+      const res = await this.$api.requested({
+        "classname": "webmanage.saletool.courseware.statistics.agent",
+        "method": "getAgentStudyData",
+        "content": {
+          "sat_coursewareid": this.$route.query.id
         }
+      })
+      this.pieStudyData = [{ type: '已学习', num: res.data.studyNum }, { type: '未学习', num: res.data.unStudyNum }]
+      this.pieDownloadData = [{ type: '已下载', num: res.data.downloadNum }, { type: '未下载', num: res.data.unDownloadNum }]
+      this.$refs.studyPie.piePlot.changeData(this.pieStudyData)
+      this.$refs.downloadPie.piePlot.changeData(this.pieDownloadData)
     }
+  }
 }
 </script>
 
 <style scoped>
 /deep/.header .left .el-button img {
-    margin-left: -6px;
+  margin-left: -6px;
 }
 </style>

+ 0 - 128
src/HManagement/archives_ad/modules/detail.vue

@@ -1,128 +0,0 @@
-<template>
-    <span>
-        <div class="inline-16">
-            <el-button type="text" size="mini" @click="open">详情</el-button>
-        </div>
-
-
-        <el-drawer title="详情" :size="1080" :visible.sync="show" direction="rtl" :before-close="onClose">
-            <div class="drawer-box">
-                <div class="detail-head">
-                    <div class="title">{{ detail.title }}</div>
-                    <div class="data-display">
-                        <span>浏览数:{{ detail.readcount }}</span>
-                        <span>分享数:{{ detail.sharecount }}</span>
-                        <span>拉新数:{{ detail.newcount }}</span>
-                    </div>
-                </div>
-                <template v-if="detail.type == 1">
-                    <el-image class="file-style" v-for="item in detail.attinfos" :key="item.linksid" :src="item.url"
-                        :preview-src-list="srcList" lazy fit="cover" />
-                </template>
-                <template v-if="detail.type == 2">
-                    <video class="file-style" width="1020px" height="428px" v-for="item in detail.attinfos" controls
-                        :key="item.linksid" :poster="item.subfiles.length > 0 ? item.subfiles[0].url : ''" :src="item.url"></video>
-                </template>
-                <div v-if="detail.type == 3" id="richtext"></div>
-                <div style="height:30px"></div>
-            </div>
-        </el-drawer>
-
-    </span>
-</template>
-
-<script>
-//type 1图片 2视频 3图文
-import { weAtob } from "@/utils/weapp-jwt";
-import MFT from "@/utils/matchingFeilType";
-import fileBlock from "@/components/file-block/index.vue";
-export default {
-    props: ['id'],
-    components: { fileBlock },
-    data() {
-        return {
-            show: false,
-            detail: {},
-            itemStyle: {
-                img: {
-                    width: 52.75,
-                    height: 63.83
-                },
-                title: 16,
-                descript: 12
-            },
-        }
-    },
-    methods: {
-        open() {
-            this.$api.requested({
-                "classname": "webmanage.saletool.sharematerial.sharematerial",
-                "method": "selectDetail",
-                "content": {
-                    "sat_sharematerialid": this.id
-                }
-            }).then(res => {
-                if (res.msg != '成功') return this.$message.error(res.data);
-                console.log("详情", res)
-                res.data.attinfos = MFT.fileList(res.data.attinfos);
-                this.detail = res.data;
-                this.show = true;
-                if (res.data.type == 1) {
-                    let srcList = [];
-                    res.data.attinfos.forEach(v => {
-                        srcList.push(v.url);
-                    });
-                    this.srcList = srcList;
-                } else if (res.data.type == 3) {
-                    setTimeout(() => document.querySelector("#richtext").innerHTML = weAtob(res.data.content), 10);
-                }
-            })
-        },
-        onClose() {
-            this.show = false;
-        }
-    },
-
-}
-</script>
-
-<style scoped>
-.drawer-box {
-    width: 100%;
-    padding: 0 30px;
-}
-
-.detail-head {
-    width: 100%;
-    border-bottom: 1px solid #DDDDDD;
-}
-
-.detail-head .title {
-    font-size: 16px;
-    font-family: PingFang SC-Bold, PingFang SC;
-    font-weight: bold;
-    color: #333333;
-}
-
-.detail-head .data-display {
-    display: flex;
-    justify-content: space-between;
-    align-items: center;
-    width: 361px;
-    height: 20px;
-    margin-top: 10px;
-    font-size: 14px;
-    font-family: PingFang SC-Regular, PingFang SC;
-    color: #333333;
-    padding-bottom: 20px;
-}
-
-/* 图片视频样式 */
-.file-style {
-    display: block;
-    width: 1020px;
-    height: 428px;
-    margin-top: 10px;
-    border-radius: 4px;
-}
-</style>

+ 137 - 125
src/HManagement/archives_ad/modules/list.vue

@@ -1,156 +1,168 @@
 <template>
-    <div>
-        <slot name="add"></slot>
-        <!-- <div class="container normal-panel normal-margin"></div> -->
-        <div class="container normal-panel">
-            <!-- 表格筛选搜索 -->
-            <div class="flex-align-center search-panel" style="margin-bottom:16px">
-                <div class="flex-align-center">
-                    <p style="flex:1 0 auto;font-size:14px">素材分类:&nbsp;</p>
+  <div>
+    <slot name="add"></slot>
+    <!-- <div class="container normal-panel normal-margin"></div> -->
+    <div class="container normal-panel">
+      <!-- 表格筛选搜索 -->
+      <div class="flex-align-center search-panel" style="margin-bottom:16px">
+        <div class="flex-align-center">
+          <p style="flex:1 0 auto;font-size:14px">素材分类:&nbsp;</p>
 
-                    <el-cascader class="cascader" size="small" v-model="selectClassId" :options="selectList"
-                        :props="{ expandTrigger: 'hover', label: 'classname', value: 'sat_sharematerial_classid' }"
-                        @change="handleChange" clearable />
+          <el-cascader class="cascader" size="small" v-model="selectClassId" :options="selectList"
+            :props="{ expandTrigger: 'hover', label: 'classname', value: 'sat_sharematerial_classid' }"
+            @change="handleChange" clearable />
 
-                    <el-input style="width:270px" v-model="params.content.where.condition" @change="getList(true)"
-                        @clear="getList(true)" placeholder="请输入内容" class="input-with-select" size="small" clearable>
-                        <el-button style="width:82px;" slot="append" icon="el-icon-search">查 询
-                        </el-button>
-                    </el-input>
+          <el-input style="width:270px" v-model="params.content.where.condition" @change="getList(true)"
+            @clear="getList(true)" placeholder="请输入内容" class="input-with-select" size="small" clearable>
+            <el-button style="width:82px;" slot="append" icon="el-icon-search">查 询
+            </el-button>
+          </el-input>
 
-                </div>
-            </div>
+        </div>
+      </div>
 
-            <!-- 表格 -->
-            <tableLayout :layout="tablecols" :data="list" :custom="true" :height="tableHieght">
-                <template v-slot:customcol="scope">
-                    <div v-if="scope.column.columnname === 'status'">
-                        <span :style="scope.column.data.status === '审核' ? 'color:#52C41A' : ''">{{
+      <!-- 表格 -->
+      <tableLayout :layout="tablecols" :data="list" :custom="true" :height="tableHieght">
+        <template v-slot:customcol="scope">
+          <div v-if="scope.column.columnname === 'status'">
+            <span :style="scope.column.data.status === '审核' ? 'color:#52C41A' : ''">{{
                                 scope.column.data.status == '审核' ? '发布' : scope.column.data.status
                         }}</span>
-                    </div>
-                    <p v-else>{{ scope.column.data[scope.column.columnname] }}</p>
-                </template>
+          </div>
+          <p v-else-if="scope.column.columnname === 'title'">
+            【{{getType(scope.column.data.type)  }}】{{scope.column.data.title}}
+          </p>
+          <p v-else>{{ scope.column.data[scope.column.columnname] }}</p>
+        </template>
 
-                <template v-slot:opreation="scope">
-                    <slot name="detail" :data="scope"></slot>
-                    <slot name="edit" :data="scope"></slot>
-                    <slot name="release" :data="scope"></slot>
-                    <slot name="data_statistics" :data="scope"></slot>
-                    <!-- <el-button size="mini" type="text" @click="onEdit(scope)">数据统计</el-button> -->
-                    <slot name="del" :data="scope"></slot>
-                </template>
+        <template v-slot:opreation="scope">
+          <slot name="detail" :data="scope"></slot>
+          <slot name="edit" :data="scope"></slot>
+          <slot name="release" :data="scope"></slot>
+          <slot name="data_statistics" :data="scope"></slot>
+          <!-- <el-button size="mini" type="text" @click="onEdit(scope)">数据统计</el-button> -->
+          <slot name="del" :data="scope"></slot>
+        </template>
 
-            </tableLayout>
+      </tableLayout>
 
-            <div style="margin-top:16px;text-align:right">
-                <el-pagination background small @current-change="handleCurrentChange" :current-page="currentPage"
-                    :page-size="params.content.pageSize" layout="total, prev, pager, next, jumper" :total="total">
-                </el-pagination>
-            </div>
+      <div style="margin-top:16px;text-align:right">
+        <el-pagination background small @current-change="handleCurrentChange" :current-page="currentPage"
+          :page-size="params.content.pageSize" layout="total, prev, pager, next, jumper" :total="total">
+        </el-pagination>
+      </div>
 
-        </div>
     </div>
+  </div>
 </template>
 
 <script>
 export default {
-    name: "list",
-    components: {},
-    data() {
-        return {
-            list: [],
-            tablecols: [],
-            params: {
-                "classname": "webmanage.saletool.sharematerial.sharematerial",
-                "method": "select",
-                "content": {
-                    "nocache": true,
-                    "pageNumber": 1,
-                    "pageSize": 20,
-                    "where": {
-                        "condition": ""
-                    }
-                }
-            },
-            currentPage: 1,
-            total: 0,
+  name: "list",
+  components: {},
+  data () {
+    return {
+      list: [],
+      tablecols: [],
+      params: {
+        "classname": "webmanage.saletool.sharematerial.sharematerial",
+        "method": "select",
+        "content": {
+          "nocache": true,
+          "pageNumber": 1,
+          "pageSize": 20,
+          "where": {
+            "condition": ""
+          }
+        }
+      },
+      currentPage: 1,
+      total: 0,
 
-            selectList: [],//分类列表
-            selectClassId: "",
+      selectList: [],//分类列表
+      selectClassId: "",
 
+    }
+  },
+  created () {
+    //获取表结构
+    this.tablecols = this.tool.tabelCol(this.$route.name)['listTable'].tablecols;
+    this.getList();
+    this.getSelectList();
+  },
+  methods: {
+    getType (type) {
+      if (type == 1) {
+        return '图片'
+      } else if (type == 2) {
+        return '视频'
+      } else if (type == 3) {
+        return '图文'
+      }
+    },
+    /* 获取分类列表 */
+    getSelectList () {
+      this.$api.requested({
+        "classname": "webmanage.saletool.sharematerial.sharematerialClass",
+        "method": "select",
+        "content": {
+          parentid: 0
         }
+      }).then(res => {
+        if (res.msg != '成功') return this.$message.error(res.data);
+        this.selectList = res.data;
+      })
     },
-    created() {
-        //获取表结构
-        this.tablecols = this.tool.tabelCol(this.$route.name)['listTable'].tablecols;
-        this.getList();
-        this.getSelectList();
+    /* 获取列表 */
+    getList (init = false) {
+      let initID = '9999' + JSON.parse(window.sessionStorage.getItem("active_account")).userid;
+      //初始化分页
+      if (init) this.currentPage = 1;
+      //是否分类筛选
+      (this.selectClassId) ? this.params.content.where.sat_sharematerial_classid = this.selectClassId : delete (this.params.content.where.sat_sharematerial_classid);
+      //发送请求
+      this.$api.requested(this.params).then(res => {
+        console.log("素材列表", res)
+        if (res.msg != '成功') return this.$message.error(res.data);
+        let deleteList = [];
+        res.data.forEach(v => (initID == v.sat_sharematerial_classid && v.title == '') ? deleteList.push(v.sat_sharematerialid) : '');
+        if (deleteList.length != 0) this.handleDelete(deleteList);
+        this.list = res.data;
+        this.total = res.total;
+        this.params.content.pageNumber = res.pageNumber;
+      })
     },
-    methods: {
-        /* 获取分类列表 */
-        getSelectList() {
-            this.$api.requested({
-                "classname": "webmanage.saletool.sharematerial.sharematerialClass",
-                "method": "select",
-                "content": {
-                    parentid: 0
-                }
-            }).then(res => {
-                if (res.msg != '成功') return this.$message.error(res.data);
-                this.selectList = res.data;
-            })
-        },
-        /* 获取列表 */
-        getList(init = false) {
-            let initID = '9999' + JSON.parse(window.sessionStorage.getItem("active_account")).userid;
-            //初始化分页
-            if (init) this.currentPage = 1;
-            //是否分类筛选
-            (this.selectClassId) ? this.params.content.where.sat_sharematerial_classid = this.selectClassId : delete (this.params.content.where.sat_sharematerial_classid);
-            //发送请求
-            this.$api.requested(this.params).then(res => {
-                console.log("素材列表", res)
-                if (res.msg != '成功') return this.$message.error(res.data);
-                let deleteList = [];
-                res.data.forEach(v => (initID == v.sat_sharematerial_classid && v.title == '') ? deleteList.push(v.sat_sharematerialid) : '');
-                if (deleteList.length != 0) this.handleDelete(deleteList);
-                this.list = res.data;
-                this.total = res.total;
-                this.params.content.pageNumber = res.pageNumber;
-            })
-        },
-        /* 处理批量删除 */
-        handleDelete(list) {
-            this.$api.requested({
-                "classname": "webmanage.saletool.sharematerial.sharematerial",
-                "method": "delete",
-                "content": {
-                    "sat_sharematerialid": list
-                }
-            }).then(res => {
-                console.log("处理删除", res);
-                if(res.msg=='成功') this.getList();
-            })
-        },
-        /* 切换分页 */
-        handleCurrentChange(e) {
-            this.currentPage = e;
-            this.params.content.pageNumber = e;
-            this.getList();
-        },
-        handleChange(value) {
-            this.selectClassId = value[1] ? value[1] : '';
-            this.getList(true);
+    /* 处理批量删除 */
+    handleDelete (list) {
+      this.$api.requested({
+        "classname": "webmanage.saletool.sharematerial.sharematerial",
+        "method": "delete",
+        "content": {
+          "sat_sharematerialid": list
         }
+      }).then(res => {
+        console.log("处理删除", res);
+        if (res.msg == '成功') this.getList();
+      })
+    },
+    /* 切换分页 */
+    handleCurrentChange (e) {
+      this.currentPage = e;
+      this.params.content.pageNumber = e;
+      this.getList();
+    },
+    handleChange (value) {
+      this.selectClassId = value[1] ? value[1] : '';
+      this.getList(true);
     }
+  }
 }
 </script>
 
 <style scoped>
 /* 级联选择器 */
 .cascader {
-    width: 120px;
-    margin-right: 16px;
+  width: 120px;
+  margin-right: 16px;
 }
 </style>

+ 2 - 1
src/SManagement/archives_ad/components/detail.vue

@@ -112,6 +112,7 @@ export default {
     font-family: PingFang SC-Bold, PingFang SC;
     font-weight: bold;
     color: #333333;
+    margin-bottom: 0;
   }
   /deep/.el-drawer__body {
     
@@ -127,7 +128,7 @@ export default {
     border-bottom: 10px solid #FAFAFA;
   }
   .title {
-    margin-bottom: 10px;
+    margin-bottom: 15px;
   }
   .header .detail-info {
     display: flex;

+ 1 - 1
src/SManagement/archives_admag/index.vue

@@ -1,7 +1,7 @@
 <template>
   <div style="height:100%">
     <Header v-if="tool.checkAuth($route.name, 'insert')">
-      <save slot="save"></save>
+      <save></save>
     </Header>
     <div class="normal-card">
       <div class="header-panl">

+ 1 - 6
src/SManagement/archives_upload/components/Header.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="header">
     <div class="left">
-      <slot name="save"></slot>
+      <slot></slot>
     </div>
     <div class="right">
       <img src="@/assets/reset.png" alt="" style="cursor:pointer" @click="$router.go(0)">
@@ -42,11 +42,6 @@ export default {
   .header .left {
     display: flex;
   }
-  .header .left .el-button {
-    display: flex;
-    width: 84px;
-  }
-
   .header .left .el-button img {
     vertical-align: middle;
     margin-right: 8px;

+ 1 - 1
src/SManagement/archives_upload/components/upload.vue

@@ -3,7 +3,7 @@
     <div class="upload">
       <el-button @click="dialogUploadVisible = true" v-if="target == 'submit'"> <i class="iconfont icon-a-tuiguangsucaishangchuan1" style="color:#3874F6"></i> 上传</el-button>
     </div>
-    <el-button type="warning" size="small" @click="dialogUploadVisible = true" icon="el-icon-upload" v-if="target == 'archives'">上 传</el-button>
+    <el-button type="primary" size="small" @click="dialogUploadVisible = true" icon="el-icon-upload" v-if="target == 'archives'">上 传</el-button>
     <el-button round v-else-if="target == 'avatar'" @click="dialogUploadVisible = true">上传头像</el-button>
     <el-dialog title="文件上传" :visible.sync="dialogUploadVisible" width="500px" append-to-body :close-on-click-modal="false"
       :before-close="clearFiles">

+ 1 - 1
src/SManagement/archives_upload/index.vue

@@ -2,7 +2,7 @@
   <div class="upload">
     <!--头部操作-->
     <Header>
-      <save slot="save" type="save" @btnClick="save()"></save>
+      <save type="save" @click.native="save()"></save>
     </Header>
 
     <el-row>

+ 155 - 0
src/SManagement/orderclue/components/add.vue

@@ -0,0 +1,155 @@
+<template>
+  <div class="add">
+    <el-button type="primary" @click="dialogVisible=true" size="small">新建</el-button>
+    <el-dialog
+      title="新建线索"
+      :visible.sync="dialogVisible"
+      width="30%"
+      :before-close="handleClose">
+      <el-form :model="param.content" :rules="rules" ref="ruleForm" label-width="80px" class="demo-ruleForm" label-position="left">
+        <el-form-item label="客户名称" prop="name">
+          <el-input v-model="param.content.name" size="small"></el-input>
+        </el-form-item>
+        <el-form-item label="手机号" prop="phonenumber">
+          <el-input v-model="param.content.phonenumber" size="small"></el-input>
+        </el-form-item>
+        <el-form-item label="省市县" prop="province">
+          <el-cascader
+            class="width-240"
+            v-model="param.content.province"
+            :options="arealist"
+            @change="cascaderChange">
+          </el-cascader>
+        </el-form-item>
+        <el-form-item label="地址" prop="address">
+          <el-input v-model="param.content.address" size="small"></el-input>
+        </el-form-item>
+        <el-form-item label="来源" prop="cluesource">
+          <el-input v-model="param.content.cluesource" size="small"></el-input>
+        </el-form-item>
+        <el-form-item label="备注" prop="notes">
+          <el-input type="textarea" v-model="param.content.notes" size="small"></el-input>
+        </el-form-item>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="dialogVisible = false" size="small">取 消</el-button>
+        <el-button type="primary" @click="addOrdercule" size="small">确 定</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'add',
+  data() {
+    let phoneCheck = (rule,value,callback) => {
+      if(!this.tool.checkPhoneFun(value)) {
+        callback(new Error('请输入正确手机号'))
+      }else {
+        callback()
+      }
+    }
+    return {
+      param: {
+        "classname": "saletool.orderclue.web.orderclue",
+        "method": "edit",
+        "content": {
+            "sat_orderclueid": 0,
+            "name": "",
+            "phonenumber": "13812345678",
+            "province": "",
+            "city": "",
+            "county": "",
+            "address": "",
+            "notes": "",
+            "cluesource": ""
+        }
+      },
+      dialogVisible:false,
+      rules: {
+        phonenumber:[
+          {required:true,message:'请输入手机号',trigger:'blur'},
+          {validator:phoneCheck,trigger:'blur'}
+        ],
+        province:[
+          {required:true,message:'内容不能为空',trigger:'blur'},
+        ],
+        cluesource:[
+          {required:true,message:'内容不能为空',trigger:'blur'},
+        ],
+      },
+      arealist:[],
+      areaSelectResult:[]
+    };
+  },
+  props:{
+    updataList: {
+      type:Function
+    }
+  },
+  computed:{
+  },
+  watch:{
+  },
+  created() {
+    this.query_arealist()
+  },
+  methods: {
+    async query_arealist() {
+      const res = await this.$api.requested({
+        "classname": "system.tools",
+        "method": "query_arealist",
+        "content": {
+        }
+      })
+      this.arealist = this.tool.createMenu(res.data)
+    },
+    handleClose() {
+      this.dialogVisible = false
+    },
+    addOrdercule() {
+      if(this.areaSelectResult.length > 1) {
+        this.param.content.province = this.areaSelectResult[0]
+        this.param.content.city = this.areaSelectResult[1]
+        this.param.content.county = this.areaSelectResult[2]
+      } else {
+        this.param.content.province = this.areaSelectResult[0]
+      }
+      this.$refs.ruleForm.validate( val => {
+          if( !val ) return this.$notify({
+            title:'提示',
+            message:'请按照要求填写信息',
+            type:'warning'
+          })
+          this.$api.requested(this.param).then( res => {
+            if(res.code == 1) {
+              this.$refs.ruleForm.resetFields()
+              this.dialogVisible = false  
+              this.$emit('updataList')
+            }
+            this.tool.showMessage(res)
+          })
+      })
+      
+    },
+    cascaderChange(result) {
+      this.areaSelectResult = result
+    }
+  },
+};
+</script>
+
+<style scoped>
+  /deep/.el-dialog__body {
+    padding-bottom: 0;
+  }
+  /deep/.el-dialog__footer {
+    display: flex;
+    justify-content: space-around;
+    padding-top: 0;
+  }
+  .width-240 {
+    width: 100%;
+  }
+</style>

+ 193 - 0
src/SManagement/orderclue/components/edit.vue

@@ -0,0 +1,193 @@
+<template>
+  <div class="edit">
+    <el-button 
+              @click="dialogVisible=true" 
+              size="small" 
+              type="primary" 
+              v-if="position == 'detail'"
+              :disabled="data.data.status == '待跟进' || data.data.status == '跟进中' ? false : true">编辑</el-button>
+    <p  @click="dialogVisible=true" v-else>编辑</p>
+    <el-dialog
+      title="编辑线索"
+      :visible.sync="dialogVisible"
+      width="30%"
+      :before-close="handleClose">
+      <el-form :model="param.content" :rules="rules" ref="ruleForm" label-width="80px" class="demo-ruleForm" label-position="left">
+        <el-form-item label="客户名称" prop="name">
+          <el-input v-model="param.content.name" size="small"></el-input>
+        </el-form-item>
+        <el-form-item label="手机号" prop="phonenumber">
+          <el-input v-model="param.content.phonenumber" size="small"></el-input>
+        </el-form-item>
+        <el-form-item label="省市县" prop="province">
+          <el-cascader
+            class="width-240"
+            v-model="param.content.province"
+            :options="arealist"
+            @change="cascaderChange">
+          </el-cascader>
+        </el-form-item>
+        <el-form-item label="地址" prop="address">
+          <el-input v-model="param.content.address" size="small"></el-input>
+        </el-form-item>
+        <el-form-item label="来源" prop="cluesource">
+          <el-input v-model="param.content.cluesource" size="small"></el-input>
+        </el-form-item>
+        <el-form-item label="备注" prop="notes">
+          <el-input type="textarea" v-model="param.content.notes" size="small"></el-input>
+        </el-form-item>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="dialogVisible = false" size="small">取 消</el-button>
+        <el-button type="primary" @click="addOrdercule" size="small">确 定</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { log } from '@antv/g2plot/lib/utils';
+export default {
+  name: 'add',
+  data() {
+    let phoneCheck = (rule,value,callback) => {
+      if(!this.tool.checkPhoneFun(value)) {
+        callback(new Error('请输入正确手机号'))
+      }else {
+        callback()
+      }
+    }
+    return {
+      param: {
+        "classname": "saletool.orderclue.web.orderclue",
+        "method": "edit",
+        "content": {
+            "sat_orderclueid": 0,
+            "name": "",
+            "phonenumber": "13812345678",
+            "province": "",
+            "city": "",
+            "county": "",
+            "address": "",
+            "notes": "",
+            "cluesource": ""
+        }
+      },
+      dialogVisible:false,
+      rules: {
+        phonenumber:[
+          {required:true,message:'请输入手机号',trigger:'blur'},
+          {validator:phoneCheck,trigger:'blur'}
+        ],
+        province:[
+          {required:true,message:'内容不能为空',trigger:'blur'},
+        ],
+        cluesource:[
+          {required:true,message:'内容不能为空',trigger:'blur'},
+        ],
+      },
+      arealist:[],
+      areaSelectResult:[]
+    };
+  },
+  props:{
+    updataList: {
+      type:Function
+    },
+    getDetail: {
+      type:Function
+    },
+    position: {
+      type:String 
+    },
+    data: {
+      type: Object
+    }
+  },
+  computed:{
+  },
+  watch:{
+    data: {
+      handler(val) {
+        this.param = {
+          "classname": "saletool.orderclue.web.orderclue",
+          "method": "edit",
+          "content": {
+            "sat_orderclueid": val.data.sat_orderclueid,
+            "name": val.data.name,
+            "phonenumber": val.data.phonenumber,
+            "province": val.data.city ? [val.data.province,val.data.city,val.data.county] : [val.data.province],
+            "city": val.data.province,
+            "county": val.data.province,
+            "address": val.data.address,
+            "notes": val.data.notes,
+            "cluesource": val.data.cluesource
+          }
+        },
+        this.areaSelectResult = val.data.city ? [val.data.province,val.data.city,val.data.county] : [val.data.province]
+      }
+    }
+  },
+  created() {
+    this.query_arealist()
+  },
+  methods: {
+    async query_arealist() {
+      const res = await this.$api.requested({
+        "classname": "system.tools",
+        "method": "query_arealist",
+        "content": {
+        }
+      })
+      this.arealist = this.tool.createMenu(res.data)
+    },
+    handleClose() {
+      this.dialogVisible = false
+    },
+    addOrdercule() {
+      if(this.areaSelectResult.length > 1) {
+        this.param.content.province = this.areaSelectResult[0]
+        this.param.content.city = this.areaSelectResult[1]
+        this.param.content.county = this.areaSelectResult[2]
+      } else {
+        this.param.content.province = this.areaSelectResult[0]
+      }
+      this.$refs.ruleForm.validate( val => {
+        if( !val ) return this.$notify({
+          title:'提示',
+          message:'请按照要求输入信息',
+          type:'warning'
+        })
+        this.$api.requested(this.param).then( res => {
+          this.tool.showMessage(res)
+          this.$refs.ruleForm.resetFields()
+          this.dialogVisible = false  
+          this.$emit('updataList')
+          this.$emit('getDetail')
+        })
+      })
+      
+    },
+    cascaderChange(result) {
+      this.areaSelectResult = result
+    }
+  },
+};
+</script>
+
+<style scoped>
+  /deep/.el-dialog__body {
+    padding-bottom: 0;
+  }
+  /deep/.el-dialog__footer {
+    display: flex;
+    justify-content: space-around;
+    padding-top: 0;
+  }
+  .edit {
+    display: inline-block;
+  }
+  .width-240 {
+    width: 100%;
+  }
+</style>

+ 46 - 0
src/SManagement/orderclue/components/export.vue

@@ -0,0 +1,46 @@
+<template>
+  <div>
+    <el-button type="success" size="small" icon="el-icon-download" style="margin-left:10px" @click="submit()">导 出</el-button>
+  </div>
+</template>
+
+<script>
+import { log } from '@antv/g2plot/lib/utils'
+export default {
+  props:['tablecols','param','excelTitle'],
+  data () {
+    return {}
+  },
+  methods:{
+    async submit () {
+      let data = {}
+      data = JSON.parse(JSON.stringify(this.param))
+
+      data.content.isAll = true
+      console.log(data,this.param)
+      const res = await this.$api.requested(data)
+      let table = JSON.parse(JSON.stringify(this.tablecols))
+      table.forEach((e,index) => {
+        // 由于表格数据结构问题这里需要判断一下
+        if (e.title === '省市县') {
+          table[index].title = '省'
+          table.splice(index + 1,0,{title:'市',columnname:'city'},{title:'县',columnname:'county'})
+        }
+        if(e.title == '序号') {
+          table.splice(index,1)
+        }
+      });
+      let hd = table.map(e=>{
+        return e.title
+      })
+      let ft = table.map(e=>{
+        return e.columnname
+      })
+      this.tool.exportExcel(hd,ft,res.data,this.excelTitle)
+    }
+  }
+}
+
+</script>
+<style>
+</style>

+ 209 - 0
src/SManagement/orderclue/components/follow.vue

@@ -0,0 +1,209 @@
+<template>
+  <div class="follow">
+    <el-button 
+              size="small" 
+              type="warning" 
+              style="margin-left:10px" 
+              v-if="position == 'detail'" 
+              :disabled="data.data.status == '待跟进' || data.data.status == '跟进中' ? false : true"
+              @click="dialogVisible=true">跟进</el-button>
+    <p @click="dialogVisible=true" v-else>跟进</p>
+    <el-dialog title="线索跟进" :visible.sync="dialogVisible" width="900" :before-close="handleClose">
+      <el-form :model="param.content" :rules="rules" ref="ruleForm" label-width="80px" class="demo-ruleForm"
+        label-position="left">
+        <el-row :gutter="10">
+          <el-col :span="12">
+            <el-form-item label="跟进时间" label-position="left" label-width="100px">
+              <el-input :value="getNowDate()" size="small" disabled></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="本次跟进方式" label-width="130px" label-position="left" prop="followupmode">
+            <el-select v-model="param.content.followupmode" placeholder="请选择方式" size="small">
+              <el-option label="当面拜访" value="当面拜访"></el-option>
+              <el-option label="电话沟通" value="电话沟通"></el-option>
+            </el-select>
+          </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="本次跟进结果" label-width="150px" label-position="left" prop="logtype">
+              <el-radio-group v-model="param.content.logtype">
+                <el-radio label="跟进">跟进</el-radio>
+                <el-radio label="成交">成交</el-radio>
+                <el-radio label="丢单">丢单</el-radio>
+                <el-radio label="无效">无效</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24" v-if="param.content.logtype == '丢单'">
+            <el-form-item label="已购买商品" prop="competitor" label-width="200px">
+              <el-input v-model="param.content.competitor" size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="跟进内容" prop="content" v-if="param.content.logtype == '跟进'">
+              <el-input type="textarea" v-model="param.content.content" size="small"></el-input>
+            </el-form-item>
+            <el-form-item label="丢单原因" prop="content" v-if="param.content.logtype == '丢单'">
+              <el-input type="textarea" v-model="param.content.content" size="small"></el-input>
+            </el-form-item>
+            <el-form-item label="添加备注" prop="content" v-if="param.content.logtype == '成交'">
+              <el-input type="textarea" v-model="param.content.content" size="small"></el-input>
+            </el-form-item>
+            <el-form-item label="无效原因" prop="content" v-if="param.content.logtype == '无效'">
+              <el-input type="textarea" v-model="param.content.content" size="small"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="dialogVisible = false" size="small">取 消</el-button>
+        <el-button type="primary" @click="followAction" size="small">确 定</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { log } from '@antv/g2plot/lib/utils';
+export default {
+  name: '',
+  data () {
+    return {
+      param: {
+        "classname": "saletool.orderclue.web.orderclue",
+        "method": "addFollowUpLog",
+        "content": {
+            "sat_orderclueid":0,
+            "content": "",
+            "followupmode": "", //当面拜访、电话沟通
+            "logtype": "跟进", //跟进、成交、丢单、无效
+            "competitor": ""
+        }
+      },
+      rules: {
+        content:[
+          {required:true,message:'内容不能为空',trigger:'blur'},
+        ],
+        followupmode:[
+          {required:true,message:'内容不能为空',trigger:'blur'},
+        ],
+        logtype:[
+          {required:true,message:'内容不能为空',trigger:'blur'},
+        ],
+        competitor:[
+          {required:true,message:'内容不能为空',trigger:'blur'},
+        ],
+      },
+      time:'',
+      dialogVisible: false,
+    };
+  },
+  props: {
+    data: {
+      default() {
+        return []
+      }
+    },
+    position: {
+      type:String
+    },
+    updataList: {
+      type: Function
+    },
+    getDetail: {
+      type: Function
+    }
+  },
+  computed: {
+  },
+  watch: {
+
+  },
+  methods: {
+    handleClose() {
+      this.dialogVisible = false
+    },
+    followAction() {
+      this.$refs.ruleForm.validate( val => {
+        if(!val) return this.$notify({
+          title:'提示',
+          message:'请按照要求填写信息',
+          type:'warning'
+        })
+        this.param.content.sat_orderclueid = this.data.data.sat_orderclueid
+        this.$api.requested(this.param).then( res => {
+          if(res.code == 1) {
+            this.dialogVisible = false
+            this.$emit('updataList')
+            this.$emit('getDetail')
+            this.$refs.ruleForm.resetFields()
+          }
+          this.tool.showMessage(res)
+        })
+      })
+      
+    },
+    getNowDate() {
+      var date = new Date();
+      var sign2 = ":";
+      var year = date.getFullYear() // 年
+      var month = date.getMonth() + 1; // 月
+      var day = date.getDate(); // 日
+      var hour = date.getHours(); // 时
+      var minutes = date.getMinutes(); // 分
+      var seconds = date.getSeconds() //秒
+      var weekArr = ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期天'];
+      var week = weekArr[date.getDay()];
+      // 给一位数的数据前面加 “0”
+      if (month >= 1 && month <= 9) {
+        month = "0" + month;
+      }
+      if (day >= 0 && day <= 9) {
+        day = "0" + day;
+      }
+      if (hour >= 0 && hour <= 9) {
+        hour = "0" + hour;
+      }
+      if (minutes >= 0 && minutes <= 9) {
+        minutes = "0" + minutes;
+      }
+      if (seconds >= 0 && seconds <= 9) {
+        seconds = "0" + seconds;
+      }
+      return year + "-" + month + "-" + day + " " + hour + sign2 + minutes + sign2 + seconds;
+    }
+  },
+};
+</script>
+
+<style scoped>
+  /deep/.el-form-item__content{
+    margin-left: 0 !important;
+  }
+  
+  .follow {
+    display: inline-block;
+  }
+  /deep/.el-dialog__body {
+    padding-bottom: 0;
+  }
+  /deep/.el-dialog__footer {
+    display: flex;
+    justify-content: space-around;
+    padding-top: 0;
+  }
+  /deep/.el-form-item {
+    display: flex;
+    flex-direction: column;
+  }
+  /deep/.el-select {
+    width: 100%;
+  }
+  /deep/.el-form-item {
+    margin-bottom: 5px;
+  }
+ /deep/.dialog-footer span {
+   text-align: center;
+ } 
+</style>

+ 186 - 0
src/SManagement/orderclue/components/list.vue

@@ -0,0 +1,186 @@
+<template>
+  <div class="normal-card">
+    <Header>
+      <add @updataList="updataList" v-if="tool.checkAuth($route.name,'insert')"></add>
+      <export-btn :tablecols="tablecols" :param="param" excelTitle="线索池数据表" v-if="tool.checkAuth($route.name,'download')"></export-btn>
+      <move type="more" :data="checkboxArr" @updataList="getList()" v-show="checkboxArr.length >= 1"></move>
+    </Header>
+    <div class="select" v-if="tool.checkAuth($route.name,'read')">
+      <search @searchActive="searchActive" @clearData="clearData"></search>
+      <div class="status">
+        <span style="margin-right:10px">状态:</span>
+        <el-select size="small" v-model="param.content.where.status" @change="selectChange" clearable>
+          <el-option value="待跟进">待跟进</el-option>
+          <el-option value="跟进中">跟进中</el-option>
+          <el-option value="丢单">丢单</el-option>
+          <el-option value="成交">成交</el-option>
+          <el-option value="无效">无效</el-option>
+        </el-select>
+      </div>
+    </div>
+    <table1 :layout="tablecols" :custom="true" :checkbox="true" :data="list"
+        :height="tableHieght" @checkboxCallBack="checkboxCallBack" v-if="tool.checkAuth($route.name,'read')">
+        <template v-slot:customcol="scope">
+            <div v-if="scope.column.columnname == 'index'" style="display:flex;align-items: center;">
+              <p>{{ scope.column.data[scope.column.columnname] }}</p>
+              <span :class="scope.column.data.isTeam == '总部' ? 'all-team' : 'team'">{{ scope.column.data.isTeam }}</span>
+            </div>
+            <div v-else-if="scope.column.columnname == 'city'">
+              <p>{{ scope.column.data.province }}、{{ scope.column.data.city }}、{{ scope.column.data.county }}</p>
+            </div>
+            <div v-else-if="scope.column.columnname == 'status'">
+              <p :style="{'color':statusStyle[scope.column.data[scope.column.columnname]]}">{{ scope.column.data[scope.column.columnname] }}</p>
+            </div>
+            <p v-else>{{ scope.column.data[scope.column.columnname] }}</p>
+        </template>
+        <template v-slot:opreation="scope">
+          <div class="handle" v-if="tool.checkAuth($route.name,'update')">
+            <slot name="detail" :data="scope"></slot>
+            <slot name="edit" :data="scope"></slot>
+            <slot name="goUp" :data="scope"></slot>
+            <slot name="move" :data="scope"></slot>
+          </div>
+        </template>
+    </table1>
+    <div style="margin-top: 16px; text-align: right">
+      <el-pagination
+        background
+        small
+        @current-change="handleCurrentChange"
+        :current-page="param.content.pageNumber"
+        :page-size="param.content.pageSize"
+        layout="total, prev, pager, next, jumper"
+        :total="total"
+      >
+      </el-pagination>
+    </div>
+  </div>
+</template>
+
+<script>
+import search from '@/components/search/index'
+import table1 from '@/components/table/index'
+import { log } from '@antv/g2plot/lib/utils'
+import Header from '@/SManagement/archives_upload/components/Header'
+import add from '@/SManagement/orderclue/components/add'
+import move from '@/SManagement/orderclue/components/move'
+import exportBtn from '@/SManagement/orderclue/components/export'
+
+export default {
+  name: 'list',
+  data() {
+    return {
+      param: {
+          "classname": "saletool.orderclue.web.orderclue",
+          "method": "selectList",
+          "content": {
+              "pageNumber": 1,
+              "pageSize": 20,
+              "where": {
+                  "condition": "",
+                  "status": ""
+              }
+          }
+      },
+      //表格配置数据
+      tablecols:[],
+      total:0,
+      list:[],
+      //table选中数据
+      checkboxArr:[],
+      statusStyle: {
+        '待跟进':'#FA8C16',
+        '跟进中':'#52C41A',
+        '丢单':'#FF3B30',
+        '无效':'#999999',
+        '已成交':'#333333',
+        '已过期':'#999999'
+      }
+    };
+  },
+  components:{ search , Header , add , exportBtn , table1 , move },
+  computed:{
+  },
+  watch:{
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    getList() {
+     this.$api.requested(this.param).then( res => {
+       this.list = res.data
+       this.total = res.total
+       console.log(this.list);
+       
+     })
+    },
+    searchActive(data) {
+      this.param.content.where.condition = data
+      this.param.content.pageNumber = 1
+      this.getList()
+    },
+    clearData() {
+      this.param.content.where.condition = ''
+      this.param.content.pageNumber = 1
+      this.getList()
+    },
+    handleCurrentChange(n) {
+      this.param.content.pageNumber = n
+      this.getList()
+    },
+    selectChange() {
+      this.getList()      
+    },
+    updataList() {
+      this.param.content.pageNumber = 1
+      this.getList()
+    },
+    checkboxCallBack(data) {
+      this.checkboxArr = data.map(item => item.sat_orderclueid)
+    }
+  },
+  mounted() {
+    this.tablecols = this.tool.tabelCol(this.$route.name).orderclueList.tablecols;
+    console.log(this.tablecols);
+    
+  }
+};
+</script>
+
+<style scoped>
+*{
+  box-sizing: border-box;
+}
+  .select {
+    display: flex;
+    font-size: 14px;
+    margin-bottom: 16px;
+  }
+  .handle {
+    color: #4f7bfd;
+    display: flex;
+  }
+  /deep/.handle p {
+    cursor: pointer;
+    margin-right: 10px;
+  }
+  .all-team {
+    display: inline-block;
+    padding: 1px 6px;
+    border: 1px solid #3874F6;
+    color: #3874F6;
+    border-radius: 2px;
+    font-size: 12px;
+    margin-left: 5px;
+  }
+  .team {
+    display: inline-block;
+    padding: 1px 6px;
+    border: 1px solid #FA8C16;
+    color: #FA8C16;
+    border-radius: 2px;
+    font-size: 12px;
+    margin-left: 5px;
+  }
+</style>

+ 116 - 0
src/SManagement/orderclue/components/move.vue

@@ -0,0 +1,116 @@
+<template>
+  <div class="move">
+    <el-button type="warning" size="small" style="margin-left:10px" @click="dialogVisible=true" v-if="type == 'more'">批量转移</el-button>
+    <p @click="dialogVisible=true" v-else>转移</p>
+    <el-dialog title="新建线索" :visible.sync="dialogVisible" width="500px" :before-close="handleClose">
+      <div class="handle">
+        <p class="title">团队成员</p>
+        <el-select placeholder="请选择转移人" v-model="param.content.sa_agent_hrid" size="small">
+          <el-option v-for="(item,index) in teamList" :key="index" :label="item.name" :value="item.userid">{{item.name}}</el-option>
+        </el-select>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="dialogVisible = false" size="small">取 消</el-button>
+        <el-button type="primary" @click="followAction" size="small">确 定</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+export default {
+  name: '',
+  data () {
+    return {
+      dialogVisible: false,
+      param: {
+        "classname": "saletool.orderclue.web.orderclue",
+        "method": "changeClue",
+        "content": {
+          "sat_orderclueid": [],
+          "sa_agent_hrid": ''
+        }
+      },
+      teamList:[]
+    };
+  },
+  props: {
+    data: {
+      type:Array
+    },
+    type: {
+      type:String
+    },
+    updataList: {
+      type:Function
+    }
+  },
+  computed: {
+  },
+  watch: {
+
+  },
+  created() {
+    this.getTeamList()
+  },
+  methods: {
+    getTeamList () {
+      this.$api.requested({
+        "classname": "sale.team.team",
+        "method": "query_teamList",
+        "content": {
+          "pageNumber": 1,
+          "pageSize": 99999,
+          "where": {
+              "condition": ""
+          }
+        }
+      }).then(res => {
+        this.teamList = res.data
+      })
+    },
+    handleClose () {
+      this.dialogVisible = false
+    },
+    followAction () {
+      this.param.content.sat_orderclueid = this.data
+      this.$api.requested(this.param).then( res => {
+        this.tool.showMessage(res)
+        this.dialogVisible = false
+        this.$emit('updataList')
+        this.param.content.sa_agent_hrid = ''
+        console.log(2222);
+        
+      })
+    }
+  }
+};
+</script>
+
+<style scoped>
+.move {
+  display: inline-block;
+}
+/deep/.el-dialog__body {
+  padding-bottom: 0;
+  display: flex;
+  justify-content: space-around;
+}
+/deep/.el-dialog__footer {
+  display: flex;
+  justify-content: space-around;
+  padding-top: 0;
+}
+.handle {
+  display: flex;
+  align-items: center;
+}
+.handle .title {
+  font-size: 14px;
+  color: #000000;
+  margin-right: 10px;
+}
+/deep/.el-select {
+  width: 300px;
+}
+</style>

+ 63 - 0
src/SManagement/orderclue/index.vue

@@ -0,0 +1,63 @@
+<template>
+  <div class="orderclue">
+    <list ref="list">
+      <template v-slot:detail="scope">
+          <p @click="detail(scope.data)">详情</p>
+      </template>
+      <template v-slot:edit="scope">
+          <edit :data="scope.data" @updataList="updataList" v-if="scope.data.data.status == '待跟进' || scope.data.data.status == '跟进中'"></edit>
+      </template>
+      <template v-slot:goUp="scope">
+        <follow :data="scope.data" @updataList="updataList" v-if="scope.data.data.status == '待跟进' || scope.data.data.status == '跟进中'"></follow>
+      </template>
+      <template v-slot:move="scope">
+        <move :data="[scope.data.data.sat_orderclueid]" @updataList="updataList" v-if="scope.data.data.status == '待跟进' || scope.data.data.status == '跟进中'"></move>
+      </template>
+    </list>
+  </div>
+</template>
+
+<script>
+import Header from '@/SManagement/archives_upload/components/Header'
+import list from '@/SManagement/orderclue/components/list'
+import add from '@/SManagement/orderclue/components/add'
+import edit from '@/SManagement/orderclue/components/edit'
+import follow from '@/SManagement/orderclue/components/follow'
+import move from '@/SManagement/orderclue/components/move'
+import exportBtn from '@/SManagement/orderclue/components/export'
+export default {
+  name: 'index',
+  data() {
+    return {
+    };
+  },
+  components:{ Header , list , add , exportBtn , edit , follow , move },
+  computed:{
+  },
+  watch:{
+  },
+  methods: {
+    detail(data) {
+      this.$router.push({
+        path:'/orderclue_detail',
+        query: {
+          id:data.data.sat_orderclueid
+        }
+      })
+    },
+    updataList() {
+      this.$refs.list.param.content.pageNumber = 1
+      this.$refs.list.getList()
+      console.log(11111);
+      
+    },
+    exportData() {
+
+    },
+  },
+};
+</script>
+
+<style scoped>
+
+</style>

+ 123 - 0
src/SManagement/orderclue_detail/components/followDetail.vue

@@ -0,0 +1,123 @@
+<template>
+  <div class="normal-card" v-if="follow.length >= 1">
+    <p class="title">跟进记录</p>
+    <div class="select">
+      <span class="demonstration">日期范围:</span>
+      <time-select @clearSelect="clearSelect" @timeChange="timeChange"></time-select>
+    </div>
+    <div class="detail" v-if="follow">
+      <div class="item" v-for="(item,index) in follow" :key="index">
+        <p>{{index + 1}}.{{item.createdate}},由经销商端<span style="font-weight:bold;margin:0 6px;font-size:13px">{{item.createby}}</span>开始跟进,跟进方式:<span style="font-weight:bold;margin:0 5px">{{item.followupmode}}</span>,{{handleTxt[item.logtype]}}</p>
+        <div class="content">
+          <p v-if="item.competitor">已购买品牌:{{item.competitor}}</p>
+          {{item.content}}
+        </div>
+      </div>
+    </div>
+    <div style="margin-top: 16px; text-align: right">
+      <!-- <el-pagination
+        background
+        small
+        @current-change="handleCurrentChange"
+        :current-page="param.content.pageNumber"
+        :page-size="param.content.pageSize"
+        layout="total, prev, pager, next, jumper"
+        :total="total"
+      >
+      </el-pagination> -->
+    </div>
+  </div>
+</template>
+
+<script>
+import { log } from '@antv/g2plot/lib/utils';
+import TimeSelect from '@/SManagement/submitedit_one/components/TimeSelect'
+export default {
+  name: 'followDetail',
+  data() {
+    return {
+      param: {
+        "classname": "saletool.orderclue.web.orderclue",
+        "method": "getFollowList",
+        "content": {
+            "sat_orderclueid": this.$route.query.id,
+            "isdesc": 0,
+            "where": {
+                "start": "",
+                "end": ""
+            }
+        }
+      },
+      handleTxt:{
+        '跟进中':'跟进内容',
+        '成交':'成交操作,添加备注',
+        '丢单':'丢单操作,具体原因如下',
+        '无效':'无效操作,具体原因如下',
+      },
+      follow:[],
+      timeArr:[],
+      total:0
+    };
+  },
+  components:{ TimeSelect },
+  computed:{
+  },
+  watch:{
+  },
+  created() {
+    this.getFollowDetail()
+  },
+  methods: {
+    getFollowDetail() {
+      this.$api.requested(this.param).then( res => {
+        this.follow = res.data
+        this.total = res.total
+        console.log(this.follow);
+      })
+    },
+    handleCurrentChange(n) {
+      this.param.content.pageNumber = n
+      this.getFollowDetail()
+    },
+    clearSelect() {
+      this.param.content.where.start = ''      
+      this.param.content.where.end = ''
+    },
+    timeChange(result) {
+      this.param.content.where.start = result[0]      
+      this.param.content.where.end = result[1]    
+      this.getFollowDetail()  
+    }
+  },
+};
+</script>
+
+<style scoped>
+*{
+  box-sizing: border-box;
+}
+  .normal-card .title {
+    font-size: 14px;
+    color: #000000;
+    font-weight: bold;
+  }
+  .normal-card .select {
+    margin: 25px 10px 15px 0;
+    display: flex;
+    align-items: center;
+  }
+  .normal-card .select .demonstration {
+    font-size: 14px;
+    margin-right: 10px;
+  }
+  .normal-card .detail {
+    font-size: 14px;
+  }
+  .normal-card .detail .content {
+    margin: 10px 16px 16px 16px;
+    background: #F2F2F2;
+    padding: 16px;
+    border-radius: 5px;
+    font-size: 14px;
+  }
+</style>

+ 108 - 0
src/SManagement/orderclue_detail/index.vue

@@ -0,0 +1,108 @@
+<template>
+  <div class="detail">
+    <Header>
+      <edit position="detail" @getDetail="getDetail" :data="{data:detail}"></edit>
+      <follow :data="{data:detail}" @getDetail="getDetail" position="detail"></follow>
+    </Header>
+    <div class="normal-card">
+      <p class="title">线索信息</p>
+      <div class="info">
+        <p><span>序号:</span>{{detail.sat_orderclueid}}</p>
+        <p><span>手机号:</span>{{detail.phonenumber}}</p>
+        <p><span>地址:</span>{{detail.addres}}</p>
+        <p><span>来源:</span>{{detail.cluesource}}</p>
+        <p><span>状态:</span>{{detail.status}}</p>
+        <p><span>客户名称:</span>{{detail.name}}</p>
+        <p><span>省市县:</span>{{detail.province}}、{{detail.city}}、{{detail.county}}</p>
+        <p><span>备注:</span>{{detail.notes}}</p>
+        <p><span>负责人:</span>{{detail.agentname}}</p>
+      </div>
+    </div>
+    <div class="normal-card">
+      <p class="title">系统信息</p>
+      <div class="info">
+        <p><span>创建人:</span>{{detail.createBy}}</p>
+        <p><span>分配人:</span>{{detail.assignedBy}}</p>
+        <p><span>最近跟进人:</span>{{detail.followBy}}</p>
+        <p><span>转移人:</span>{{detail.changeBy}}</p>
+        <p><span>最近编辑人:</span>{{detail.editBy}}</p>
+        <p><span>创建时间:</span>{{detail.createDate}}</p>
+        <p><span>分配时间:</span>{{detail.assignedDate}}</p>
+        <p><span>最近跟进时间:</span>{{detail.followDate}}</p>
+        <p><span>最近转移时间:</span>{{detail.changeDate}}</p>
+        <p><span>最近编辑时间:</span>{{detail.editDate}}</p>
+      </div>
+    </div>
+    <follow-detail ref="followDetatil"></follow-detail>
+  </div>
+</template>
+
+<script>
+import Header from '@/SManagement/archives_upload/components/Header'
+import followDetail from '@/SManagement/orderclue_detail/components/followDetail'
+import edit from '@/SManagement/orderclue/components/edit'
+import follow from '@/SManagement/orderclue/components/follow'
+export default {
+  name: 'index',
+  data() {
+    return {
+      param: {
+        "classname": "webmanage.saletool.orderclue.publicclue.PublicClue",
+        "method": "selectDetail",
+        "content": {
+            "sat_orderclueid": 0
+        }
+      },
+      detail: ''
+    };
+  },
+  components:{ Header , followDetail , edit , follow },
+  computed:{
+  },
+  watch:{
+  },
+  created() {
+    this.getDetail()
+  },
+  methods: {
+    getDetail() {
+      this.$nextTick(() => {
+        this.$refs.followDetatil.getFollowDetail()
+      })
+      this.param.content.sat_orderclueid = this.$route.query.id
+      this.$api.requested(this.param).then( res => {
+        this.detail = res.data
+        console.log(this.detail);
+      })
+    }
+  },
+};
+</script>
+
+<style scoped>
+*{
+  box-sizing: border-box;
+}
+  .normal-card {
+    margin-bottom: 10px;
+  }
+  .normal-card .title {
+    font-size: 14px;
+    font-weight: bold;
+    color: #000000;
+    margin-bottom: 25px;
+  }
+  .normal-card .info {
+    color: #000000;
+    display: flex;
+    flex-wrap: wrap;
+  }
+  .normal-card .info p {
+    margin-right: 50px;
+    margin-bottom: 15px;
+    font-size: 13px;
+  }
+  .normal-card .info p span {
+    margin-right: 15px;
+  }
+</style>

+ 1 - 1
src/SManagement/user/role-edit/RoleEdit.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="role-edit">
     <handle-top>
-      <save slot="btn" @click.native="save()"></save>
+      <save slot="btn" type="save" @click.native="save()"></save>
     </handle-top>
     <role-info-handle ref="info"></role-info-handle>
     <role-power-select ref="power"></role-power-select>

+ 1 - 1
src/SManagement/user/team-manage/components/AddUser.vue

@@ -127,7 +127,7 @@ export default {
             if(res.code == 1) {
               this.$notify({
                 title:'提示',
-                message:'创建成功',
+                message:'操作成功',
                 type:'success'
               })
               this.$refs.formInfo.resetFields()

+ 0 - 1
src/components/search/index.vue

@@ -29,7 +29,6 @@ export default {
   },
   methods: {
     queryClick() {
-      if(!this.search) return
       this.$emit('searchActive',this.search)
     },
     clearData() {

+ 67 - 0
src/components/table/index.vue

@@ -0,0 +1,67 @@
+<template>
+  <div>
+    <el-table :row-class-name="tableClassName" v-loading="loading" highlight-current-row :data="data" :header-cell-style="{background:'#EEEEEE',color:'#333'}" size="mini" :height="height" @row-click="rowClick" style="width:100%" @selection-change="handleSelectionChange"  border>
+      <el-table-column
+        type="selection"
+        width="55" @handleSelectionChange="handleSelectionChange" v-if="checkbox" :selectable="isCheck">
+      </el-table-column>
+      <el-table-column v-for="col in layout" :key="col.tablecolid" :prop="col.columnname" :label="col.title" :width="col.width">
+        <template slot-scope="scope">
+          <!-- 自定义表格显示内容 -->
+          <slot v-if="custom" name="customcol" :column="{data:scope.row,columnname:col.columnname}"></slot>
+          <!-- 否则就是默认 -->
+          <span v-else>{{scope.row[col.columnname]}}</span>
+          <!-- 操作结构内容 -->
+          <slot v-if="col.columnname === 'operation'" name="opreation" :data="scope.row"></slot>
+        </template>
+      </el-table-column>
+    </el-table>
+  </div>
+</template>
+
+<script>
+import {mapGetters} from "vuex"
+export default {
+  /*
+    layout:表结构数据;
+    data:表渲染数据;
+    custom:是否启用自定义结构;
+    opwidth:操作列宽度
+  */
+  props:['layout','data','custom','height','checkbox'],
+  data () {
+    return {
+      list:[],
+    }
+  },
+  computed:{
+    ...mapGetters({
+      loading:'loading'
+    })
+  },
+  methods:{
+    rowClick (row) {
+      this.$emit('rowClick',row)
+    },
+    tableClassName ({row,rowIndex}) {
+      row.index = rowIndex
+    },
+    handleSelectionChange(val) {
+      this.$emit('checkboxCallBack',val)      
+    },
+    isCheck(row,rowIndex) {
+      if(row.status == '待跟进' || row.status == '待分配') {
+        return true
+      } else {
+        return false
+      }
+    }
+  },
+  mounted () {
+    // this.listData()
+  }
+}
+
+</script>
+<style>
+</style>

+ 27 - 8
src/router/SManagement.js

@@ -1,5 +1,5 @@
 const SManagement = [{
-  path: '/notice_mag_list',
+  path: '/notice_list',
   name: 'noticemag',
   meta: {
     title: '通报',
@@ -45,7 +45,7 @@ const SManagement = [{
   meta: {
     title: '上传素材',
     ast_nav: true,
-    keeproute:true
+    keeproute: true
   },
   component: () => import(/* webpackChunkName: "about" */ '@/SManagement/archives_upload/index.vue')
 }, {
@@ -58,11 +58,11 @@ const SManagement = [{
   },
   component: () => import(/* webpackChunkName: "about" */ '@/SManagement/archives_admag/index.vue')
 }, {
-  path: '/archives_scmag',
-  name: 'archives_scmag',
+  path: '/archives_sc_list',
+  name: 'archives_sc',
   meta: {
     title: '商学院',
-    ast_nav: false
+    ast_nav: true
   },
   component: () => import(/* webpackChunkName: "about" */ '@/SManagement/archives_sc/index.vue')
 }, {
@@ -87,7 +87,7 @@ const SManagement = [{
   meta: {
     title: '提报详情',
     ast_nav: true,
-    keeproute:true
+    keeproute: true
   },
   component: () => import(/* webpackChunkName: "about" */ '@/SManagement/submitedit_details/index')
 }, {
@@ -131,10 +131,10 @@ const SManagement = [{
   meta: {
     title: '角色操作',
     ast_nav: true,
-    keeproute:true
+    keeproute: true
   },
   component: () => import(/* webpackChunkName: "about" */ '@/SManagement/user/role-edit/RoleEdit')
-},{
+}, {
   path: '/message',
   name: 'message',
   meta: {
@@ -142,6 +142,25 @@ const SManagement = [{
     ast_nav: false
   },
   component: () => import(/* webpackChunkName: "about" */ '@/views/message/index')
+},
+{
+  path: '/orderclue',
+  name: 'orderclue',
+  meta: {
+    title: '线索池',
+    ast_nav: true
+  },
+  component: () => import(/* webpackChunkName: "about" */ '@/SManagement/orderclue/index')
+},
+{
+  path: '/orderclue_detail',
+  name: 'orderclueDetail',
+  meta: {
+    title: '线索详情',
+    ast_nav: true,
+    keeproute:true
+  },
+  component: () => import(/* webpackChunkName: "about" */ '@/SManagement/orderclue_detail/index')
 }
 ]
 export default SManagement

+ 4 - 0
src/utils/tool.js

@@ -92,5 +92,9 @@ export default {
       const data = formatJson(filterVal, list);
       export_json_to_excel(tHeader, data, d);  //导出Excel 文件名
     })
+  },
+  //手机正则
+  checkPhoneFun(num) {
+    return /^[1][3-9][\d]{9}/.test(num)
   }
 } 

+ 1 - 1
src/views/login/login.vue

@@ -79,7 +79,7 @@ export default {
       },
       loginForm:{
         // phonenumber:'13732579910'
-        phonenumber:'17757302857'
+        phonenumber:'17757302858'
       },
       activeName:'first',
       checked:false,

+ 2 - 1
src/views/message/components/list.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="list">
+  <div class="list" v-if="list.length >= 1">
     <div class="item-box" v-for="(item,index) in list" :key="index" @click="detailClick(item)">
       <div class="item">
         <div class="left">
@@ -27,6 +27,7 @@
       </span>
     </el-dialog>
   </div>
+  <el-empty description="暂无数据" v-else></el-empty>
 </template>
 
 <script>

+ 21 - 10
src/views/message/index.vue

@@ -6,10 +6,15 @@
       <div @click="selectFun('应用')"
         :style="currentItem==1 ? 'background:#3874F6;color:#ffffff' : 'border:1px solid #cccccc'">应用消息</div>
     </div>
-    <list :list="list"></list>
-    <pagination :total="total" :pageSize="param.content.pageSize" :currentPage="param.content.pageNumber"
-      @pageChange="pageChange">
-    </pagination>
+    <div class="content">
+      <list :list="list"></list>
+      <div class="page">
+        <pagination :total="total" :pageSize="param.content.pageSize" :currentPage="param.content.pageNumber"
+          @pageChange="pageChange">
+        </pagination>
+      </div>
+    </div>
+    
   </div>
 </template>
 
@@ -29,7 +34,7 @@ export default {
         "content": {
           "nocache": true,
           "pageNumber": 1,
-          "pageSize": 10,
+          "pageSize": 4,
           "type": ''
         }
       },
@@ -105,10 +110,16 @@ export default {
   border-top-right-radius: 4px;
   border-bottom-right-radius: 4px;
 }
-.el-pagination {
-  position: absolute;
-  right: 30px;
-  bottom: 0;
-  margin-top: 16px;
+.content {
+  display: flex;
+  flex-direction: column;
+  justify-content: space-between;
+  min-height: calc(100vh - 230px);
+}
+.page {
+  margin-top: 15px;
+  padding-right: 30px;
+  display: flex;
+  flex-direction: row-reverse;
 }
 </style>