Ver código fonte

跟进调整,消息中心调整,新增直销客户合同,合同伙伴新增编辑调整

qymljy 2 anos atrás
pai
commit
5038e1e378
27 arquivos alterados com 1739 adições e 134 exclusões
  1. 2 1
      src/Form/contractManage/add.vue
  2. 23 1
      src/Form/marketing2/agent/add.vue
  3. 23 1
      src/Form/marketing2/agent/edit.vue
  4. 127 5
      src/HDrpManagement/contractManage/components/addContract.vue
  5. 120 0
      src/HDrpManagement/contractManage/components/editContract.vue
  6. 4 0
      src/HDrpManagement/contractManage/index.vue
  7. 171 7
      src/HDrpManagement/contractManage/modules/detail.vue
  8. 6 3
      src/HDrpManagement/customerPortrait/modules/pageTable.vue
  9. 7 5
      src/HDrpManagement/dataanalysis/modules/clue.vue
  10. 6 5
      src/HDrpManagement/dataanalysis/modules/customer.vue
  11. 5 4
      src/HDrpManagement/dataanalysis/modules/documents.vue
  12. 6 6
      src/HDrpManagement/dataanalysis/modules/project.vue
  13. 14 9
      src/HDrpManagement/orderManage/details/tabs/productlist.vue
  14. 1 0
      src/SManagement/orderclue/components/edit.vue
  15. 204 0
      src/SManagement/orderclue/components/file/index3.vue
  16. 2 2
      src/SManagement/orderclue/components/follow.vue
  17. 224 0
      src/SManagement/orderclue_detail/components/editFollow.vue
  18. 143 59
      src/SManagement/orderclue_detail/components/followDetail.vue
  19. 188 0
      src/SManagement/orderclue_detail/components/followDetailCopy.vue
  20. 192 0
      src/SManagement/orderclue_detail/components/upload.vue
  21. 202 0
      src/SManagement/orderclue_detail/components/uploadNew.vue
  22. 1 1
      src/SManagement/orderclue_detail/index.vue
  23. 12 7
      src/components/normal-basic-layout/details/modules/group/group.vue
  24. 15 12
      src/components/pagination/Pagination1.vue
  25. 3 1
      src/template/menber/index.vue
  26. 3 2
      src/views/mediaStatistics/modules/salesfunnel.vue
  27. 35 3
      src/views/message/index.vue

+ 2 - 1
src/Form/contractManage/add.vue

@@ -6,6 +6,7 @@
       </span>
       <el-dropdown-menu slot="dropdown">
         <el-dropdown-item command="框架">经销商合作协议</el-dropdown-item>
+        <el-dropdown-item command="直销">直销客户合作协议</el-dropdown-item>
         <el-dropdown-item command="经销项目">经销项目协议</el-dropdown-item>
         <el-dropdown-item command="直销项目">直销项目协议</el-dropdown-item>
         <el-dropdown-item command="工具借用">工具借用协议</el-dropdown-item>
@@ -93,4 +94,4 @@ export default {
   color: #6191F8;
   cursor: pointer;
 }
-</style>
+</style>

+ 23 - 1
src/Form/marketing2/agent/add.vue

@@ -85,6 +85,7 @@
                     :key="item.value"
                     :label="item.value"
                     :value="item.value"
+                    :disabled="hasDisabledTag(item)"
                 >
                 </el-option>
               </el-select>
@@ -386,7 +387,28 @@ export default {
       }else {
         this.fill = false
       }
-    }
+    },
+    hasDisabledTag (item) {
+      let arr = []
+      let arr2 = []
+      arr = this.agent_type.filter(item=>{
+        return this.form.type.includes(item.value)
+      })
+
+      arr.forEach(e=>{
+        if (e.value === '经销商'){
+          arr2 = ['直销客户']
+        }else if (e.value === '直销客户'){
+          arr2 = ['经销商']
+        }
+
+      })
+      arr2 = this.form.type.length === 0?[]:arr2
+
+      let _isSame = arr2.some(tag =>item.value == tag)
+
+      return _isSame
+    },
   },
 
 }

+ 23 - 1
src/Form/marketing2/agent/edit.vue

@@ -96,6 +96,7 @@
                       :key="item.value"
                       :label="item.value"
                       :value="item.value"
+                      :disabled="hasDisabledTag(item)"
                   >
                     <!--                  <span style="float: left">{{ item.tag }}</span>-->
                     <!--                  <span style="float: right; color: #8492a6; font-size: 12px">{{ item.helptips?item.helptips:'暂无描述' }}</span>-->
@@ -408,7 +409,28 @@ export default {
     },
     onClear(){
       this.form.parentid = ''
-    }
+    },
+    hasDisabledTag (item) {
+      let arr = []
+      let arr2 = []
+      arr = this.agent_type.filter(item=>{
+        return this.form.type.includes(item.value)
+      })
+
+      arr.forEach(e=>{
+        if (e.value === '经销商'){
+          arr2 = ['直销客户']
+        }else if (e.value === '直销客户'){
+          arr2 = ['经销商']
+        }
+
+      })
+      arr2 = this.form.type.length === 0?[]:arr2
+
+      let _isSame = arr2.some(tag =>item.value == tag)
+
+      return _isSame
+    },
 
   },
 

+ 127 - 5
src/HDrpManagement/contractManage/components/addContract.vue

@@ -2,7 +2,7 @@
   <div>
     <!-- <p class="normal-title normal-panel" style="line-height:32px;padding-left:16px;border-bottom:1px solid #eeeeee">新建合同</p> -->
     <div>
-      <p class="normal-title normal-panel" style="border-bottom:1px solid #cccccc;padding:16px">新建{{$route.query.type == '框架' ? '经销商合作' : $route.query.type}}合同</p>
+      <p class="normal-title normal-panel" style="border-bottom:1px solid #cccccc;padding:16px">新建{{$route.query.type == '框架' ? '经销商合作' :$route.query.type == '直销'?'直销客户合作': $route.query.type}}合同</p>
       <div class="container normal-panel" style="padding-bottom:0">
         <!--合作协议-->
         <el-row v-if="$route.query.type == '框架'">
@@ -92,6 +92,112 @@
             </el-col>
           </el-form>
         </el-row>
+
+        <!--直销客户-->
+        <el-row v-if="$route.query.type == '直销'">
+          <el-form :model="form" :rules="rules" ref="form" label-position="right" label-width="140px" size="small">
+            <el-col :span="24">
+              <el-form-item label="合同标题:" prop="title">
+                <el-input type="text" size="small" v-model="form.title" placeholder="请输入合同标题"></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="24">
+              <el-form-item label="客户:" prop="enterprisename">
+                <el-popover
+                    placement="bottom"
+                    trigger="manual"
+                    v-model="agentVisible"
+                    width="500">
+                  <selectAgent type="18" ref="member" :param="agentListPrams"  :radio="true" @onSelect="agentChange" @onCancel="agentVisible = false"></selectAgent>
+                  <el-input readonly type="text" slot="reference" size="small" @focus="showChange('agentVisible')" v-model="form.enterprisename" placeholder="请选择客户"></el-input>
+                </el-popover>
+              </el-form-item>
+            </el-col>
+<!--            <el-col :span="24">
+              <el-form-item label="项目名称:" prop="projectname">
+                <el-popover
+                    placement="bottom"
+                    trigger="manual"
+                    v-model="projectVisible"
+                    width="600">
+                  <seleteProject ref="project" type="2" :sys_enterpriseid='form.sys_enterpriseid' @onSelect="projectChange" @onCanel="projectVisible=false"></seleteProject>
+                  <el-input readonly type="text" slot="reference" size="small" v-model="form.projectname" @focus="showChange('projectVisible')" placeholder="请选择项目"></el-input>
+                </el-popover>
+              </el-form-item>
+            </el-col>-->
+<!--            <el-col :span="24">
+              <el-form-item label="项目编号:" prop="">
+                <el-input disabled type="text" size="small" v-model="form.projectnum" placeholder="请选择项目"></el-input>
+              </el-form-item>
+            </el-col>-->
+            <el-col :span="24">
+              <el-form-item label="业务员:" prop="salername">
+                <el-popover
+                    placement="bottom"
+                    trigger="manual"
+                    v-model="salesmanVisible"
+                    width="500">
+                  <selectSalesman type="2" ref="selectSalesman" :sa_projectid="form.sa_projectid" :radio="true" @onSelect="salesmanChange" @onCancel="salesmanVisible = false"></selectSalesman>
+                  <el-input readonly type="text" slot="reference" size="small" @focus="showChange('salesmanVisible')" v-model="form.salername" placeholder="请选择业务员" disabled></el-input>
+                </el-popover>
+              </el-form-item>
+            </el-col>
+            <el-col :span="24">
+              <el-form-item label="折扣(%):" prop="discountrate"  >
+                <el-input type="number" size="small" v-model="form.discountrate" placeholder="请输入0-100%" @change="discountrateChange"></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="24">
+              <el-form-item label="付款条件:" prop="paytype">
+                <el-select v-model="form.paytype" placeholder="请选择">
+                  <el-option
+                      v-for="item in payTypeData"
+                      :key="item.value"
+                      :label="item.label"
+                      :value="item.value">
+                  </el-option>
+                </el-select>
+              </el-form-item>
+            </el-col>
+            <el-col :span="24">
+              <el-form-item label="发货日期提醒(天):" prop="reminddays"  >
+                <el-input type="text" size="small" v-model="form.reminddays" placeholder="请输入发货日期提醒天数"></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="24">
+              <el-form-item label="合同有效期:" prop="begdate">
+                <input type="text" style="display:none" v-model="form.begdate">
+                <time-select ref="timeSelect" class="inline-16" @clearSelect="clearTime" @timeChange="timeChange"></time-select>
+              </el-form-item>
+            </el-col>
+            <el-col :span="24">
+              <el-form-item label="签约日期:" prop="signdate">
+                <el-date-picker
+                    v-model="form.signdate"
+                    type="date"
+                    value-format="yyyy-MM-dd"
+                    placeholder="选择日期">
+                </el-date-picker>
+              </el-form-item>
+            </el-col>
+<!--            <el-col :span="24">
+              <el-form-item label="签约金额(元):" prop="signamount">
+                <el-input type="text" size="small" placeholder="系统自动计算" disabled v-model="form.signamount"></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="24">
+              <el-form-item label="合同模板:" prop="type">
+                <el-input disabled type="text" size="small" :value="$route.query.type == '框架' ? '经销合作' : $route.query.type"></el-input>
+              </el-form-item>
+            </el-col>-->
+            <el-col :span="24">
+              <el-form-item label="合同描述:" prop="hrid">
+                <el-input type="textarea" size="small" v-model="form.remarks" placeholder="请输入描述信息"></el-input>
+              </el-form-item>
+            </el-col>
+          </el-form>
+        </el-row>
+
         <!--经销项目-->
         <el-row v-if="$route.query.type == '经销项目'">
           <el-form :model="form" :rules="rules" ref="form" label-position="right" label-width="140px" size="small">
@@ -191,7 +297,7 @@
             </el-col>
             <el-col :span="24">
               <el-form-item label="合同描述:" prop="hrid">
-                <el-input type="textarea" size="small" v-model="form.remarks"></el-input>
+                <el-input type="textarea" size="small" v-model="form.remarks" placeholder="请输入描述信息"></el-input>
               </el-form-item>
             </el-col>
           </el-form>
@@ -312,7 +418,7 @@
             </el-col>
             <el-col :span="24">
               <el-form-item label="合同描述:" prop="hrid">
-                <el-input type="textarea" size="small" v-model="form.remarks"></el-input>
+                <el-input type="textarea" size="small" v-model="form.remarks" placeholder="请输入描述信息"></el-input>
               </el-form-item>
             </el-col>
           </el-form>
@@ -386,7 +492,7 @@
             </el-col>
             <el-col :span="24">
               <el-form-item label="合同描述:" prop="hrid">
-                <el-input type="textarea" size="small" v-model="form.remarks"></el-input>
+                <el-input type="textarea" size="small" v-model="form.remarks" placeholder="请输入描述信息"></el-input>
               </el-form-item>
             </el-col>
           </el-form>
@@ -489,7 +595,7 @@
             </el-col>
             <el-col :span="24">
               <el-form-item label="合同描述:" prop="hrid">
-                <el-input type="textarea" size="small" v-model="form.remarks"></el-input>
+                <el-input type="textarea" size="small" v-model="form.remarks" placeholder="请输入描述信息"></el-input>
               </el-form-item>
             </el-col>
           </el-form>
@@ -750,6 +856,7 @@ export default {
   methods: {
     async onSubmit () {
       this.$refs.form.validate(async val => {
+        console.log(this.form,'form')
         if (val) {
           this.$store.commit('setLoading',true)
           /* 居间新建 */
@@ -912,6 +1019,8 @@ export default {
         this.salsemanParam.content.type = 1
         this.salsemanParam.content.sys_enterpriseid = this.form.sys_enterpriseid
         this.querySalse()
+      }else if (this.$route.query.type == '直销'){
+        this.queryCustomerLeader(data[0].sa_customersid)
       }
 
     },
@@ -1064,6 +1173,19 @@ export default {
     },
     productdiscountChange(){
       this.form.productdiscount =  Math.round(this.form.productdiscount * 100)/100
+    },
+
+    /*获取客户负责人*/
+    async queryCustomerLeader(id){
+      let param = {
+        id:20221012164302,
+        content:{
+          sa_customersid:id
+        }
+      }
+      const res = await this.$api.requested(param)
+      this.form.salername = res.data.leader?res.data.leader[0].hr.name:''
+      this.form.saler_hrid = res.data.leader?res.data.leader[0].hr.hrid:''
     }
   },
 

+ 120 - 0
src/HDrpManagement/contractManage/components/editContract.vue

@@ -87,6 +87,112 @@
             </el-col>
           </el-form>
         </el-row>
+
+        <!--直销客户-->
+        <el-row v-if="$route.query.type == '直销'">
+          <el-form :model="form" :rules="rules" ref="form" label-position="right" label-width="140px" size="small">
+            <el-col :span="24">
+              <el-form-item label="合同标题:" prop="title">
+                <el-input type="text" size="small" v-model="form.title" placeholder="请输入合同标题"></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="24">
+              <el-form-item label="客户:" prop="enterprisename">
+                <el-popover
+                    placement="bottom"
+                    trigger="manual"
+                    v-model="agentVisible"
+                    width="500">
+                  <selectAgent type="18" ref="member" :param="agentListPrams"  :radio="true" @onSelect="agentChange" @onCancel="agentVisible = false"></selectAgent>
+                  <el-input readonly type="text" slot="reference" size="small" @focus="showChange('agentVisible')" v-model="form.enterprisename" placeholder="请选择客户"></el-input>
+                </el-popover>
+              </el-form-item>
+            </el-col>
+            <!--            <el-col :span="24">
+                          <el-form-item label="项目名称:" prop="projectname">
+                            <el-popover
+                                placement="bottom"
+                                trigger="manual"
+                                v-model="projectVisible"
+                                width="600">
+                              <seleteProject ref="project" type="2" :sys_enterpriseid='form.sys_enterpriseid' @onSelect="projectChange" @onCanel="projectVisible=false"></seleteProject>
+                              <el-input readonly type="text" slot="reference" size="small" v-model="form.projectname" @focus="showChange('projectVisible')" placeholder="请选择项目"></el-input>
+                            </el-popover>
+                          </el-form-item>
+                        </el-col>-->
+            <!--            <el-col :span="24">
+                          <el-form-item label="项目编号:" prop="">
+                            <el-input disabled type="text" size="small" v-model="form.projectnum" placeholder="请选择项目"></el-input>
+                          </el-form-item>
+                        </el-col>-->
+            <el-col :span="24">
+              <el-form-item label="业务员:" prop="salername">
+                <el-popover
+                    placement="bottom"
+                    trigger="manual"
+                    v-model="salesmanVisible"
+                    width="500">
+                  <selectSalesman type="2" ref="selectSalesman" :sa_projectid="form.sa_projectid" :radio="true" @onSelect="salesmanChange" @onCancel="salesmanVisible = false"></selectSalesman>
+                  <el-input readonly type="text" slot="reference" size="small" @focus="showChange('salesmanVisible')" v-model="form.salername" placeholder="请选择业务员" disabled></el-input>
+                </el-popover>
+              </el-form-item>
+            </el-col>
+            <el-col :span="24">
+              <el-form-item label="折扣(%):" prop="discountrate"  >
+                <el-input type="number" size="small" v-model="form.discountrate" placeholder="请输入0-100%" @change="discountrateChange"></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="24">
+              <el-form-item label="付款条件:" prop="paytype">
+                <el-select v-model="form.paytype" placeholder="请选择">
+                  <el-option
+                      v-for="item in payTypeData"
+                      :key="item.value"
+                      :label="item.label"
+                      :value="item.value">
+                  </el-option>
+                </el-select>
+              </el-form-item>
+            </el-col>
+            <el-col :span="24">
+              <el-form-item label="发货日期提醒(天):" prop="reminddays"  >
+                <el-input type="text" size="small" v-model="form.reminddays" placeholder="请输入发货日期提醒天数"></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="24">
+              <el-form-item label="合同有效期:" prop="begdate">
+                <input type="text" style="display:none" v-model="form.begdate">
+                <time-select ref="timeSelect" class="inline-16" @clearSelect="clearTime" @timeChange="timeChange"></time-select>
+              </el-form-item>
+            </el-col>
+            <el-col :span="24">
+              <el-form-item label="签约日期:" prop="signdate">
+                <el-date-picker
+                    v-model="form.signdate"
+                    type="date"
+                    value-format="yyyy-MM-dd"
+                    placeholder="选择日期">
+                </el-date-picker>
+              </el-form-item>
+            </el-col>
+            <!--            <el-col :span="24">
+                          <el-form-item label="签约金额(元):" prop="signamount">
+                            <el-input type="text" size="small" placeholder="系统自动计算" disabled v-model="form.signamount"></el-input>
+                          </el-form-item>
+                        </el-col>
+                        <el-col :span="24">
+                          <el-form-item label="合同模板:" prop="type">
+                            <el-input disabled type="text" size="small" :value="$route.query.type == '框架' ? '经销合作' : $route.query.type"></el-input>
+                          </el-form-item>
+                        </el-col>-->
+            <el-col :span="24">
+              <el-form-item label="合同描述:" prop="hrid">
+                <el-input type="textarea" size="small" v-model="form.remarks" placeholder="请输入描述信息"></el-input>
+              </el-form-item>
+            </el-col>
+          </el-form>
+        </el-row>
+
         <!--经销项目-->
         <el-row v-if="$route.query.type == '经销项目'">
           <el-form :model="form" :rules="rules" ref="form" label-position="right" label-width="140px" size="small">
@@ -880,6 +986,8 @@ export default {
         this.salsemanParam.content.type = 1
         this.salsemanParam.content.sys_enterpriseid = this.form.sys_enterpriseid
         this.querySalse()
+      }else if (this.$route.query.type == '直销'){
+        this.queryCustomerLeader(data[0].sa_customersid)
       }
     },
     async querySalse(){
@@ -1019,6 +1127,18 @@ export default {
     },
     productdiscountChange(){
       this.form.productdiscount =  Math.round(this.form.productdiscount * 100)/100
+    },
+    /*获取客户负责人*/
+    async queryCustomerLeader(id){
+      let param = {
+        id:20221012164302,
+        content:{
+          sa_customersid:id
+        }
+      }
+      const res = await this.$api.requested(param)
+      this.form.salername = res.data.leader?res.data.leader[0].hr.name:''
+      this.form.saler_hrid = res.data.leader?res.data.leader[0].hr.hrid:''
     }
 
   },

+ 4 - 0
src/HDrpManagement/contractManage/index.vue

@@ -97,6 +97,7 @@
         </div>
         <div v-else-if="scope.data.column.columnname == 'type'">
           <span v-if="scope.data.column.data[[scope.data.column.columnname]] == '框架'">经销商合作协议</span>
+          <span v-else-if="scope.data.column.data[[scope.data.column.columnname]] == '直销'">直销客户合作协议</span>
           <span v-else-if="scope.data.column.data.typemx == '经销'">经销项目协议</span>
           <span v-else-if="scope.data.column.data.typemx == '直销'">直销项目协议</span>
           <span v-else-if="scope.data.column.data[[scope.data.column.columnname]] == '工具借用'">工具使用协议</span>
@@ -111,6 +112,9 @@
           <div v-if="scope.data.column.data.type === '框架'">
             {{scope.data.column.data.discountrate<1?Math.round((scope.data.column.data.discountrate * 100)*100)/100:100}}
           </div>
+          <div v-else-if="scope.data.column.data.type === '直销'">
+            {{scope.data.column.data.discountrate<1?Math.round((scope.data.column.data.discountrate * 100)*100)/100:100}}
+          </div>
           <div v-else-if="scope.data.column.data.type === '居间'">
             <span v-if="scope.data.column.data.calculatemodel === 1">
               {{scope.data.column.data.orderratio<1?Math.round((scope.data.column.data.orderratio * 100)*100)/100:100}}

+ 171 - 7
src/HDrpManagement/contractManage/modules/detail.vue

@@ -8,7 +8,7 @@
         turnPageId="20221121201502"
         idname="sa_contractid"
         ownertable="sa_contract"
-        :tabs="mainData.type === '项目' ? ['产品明细折扣','产品类别折扣','详细信息'] : mainData.type === '框架' ? ['产品明细折扣','产品类别折扣','业绩目标','详细信息'] : mainData.type === '居间' ? ['详细信息'] : ['工具清单','详细信息']"
+        :tabs="mainData.type === '项目' ? ['产品明细折扣','产品类别折扣','详细信息'] : mainData.type === '框架' ? ['产品明细折扣','产品类别折扣','业绩目标','详细信息'] : mainData.type === '居间' ? ['详细信息'] : mainData.type === '直销' ? ['产品明细折扣','产品类别折扣','业绩目标','详细信息'] : ['工具清单','详细信息']"
 
         :statusCheck="[{key:'status',value:'已提交'},{key:'status',value:'审核'},{key:'status',value:'已终止'}]"
         @pageChange="pageChange"
@@ -48,7 +48,7 @@
           </template>
         </productBillno>
         <!--产品明细折扣表-->
-        <productDetailList :data="mainData" :isLeader="isLeader" ref="productDetailList" v-if="mainData.type == '框架'" @priceChange="queryMainData($route.query.id)">
+        <productDetailList :data="mainData" :isLeader="isLeader" ref="productDetailList" v-if="mainData.type == '框架' || mainData.type == '直销'" @priceChange="queryMainData($route.query.id)">
           <importFile
             v-if="tool.checkAuth($route.name,'exportProduct') && isLeader && mainData.status === '新建'"
             slot="export"
@@ -82,7 +82,7 @@
       </div>
       <div slot="slot1" >
         <!--产品类别折扣表-->
-        <productClassList :data="mainData" :isLeader="isLeader" ref="classList" @priceChange="queryMainData($route.query.id)" v-if="mainData.type == '框架'">
+        <productClassList :data="mainData" :isLeader="isLeader" ref="classList" @priceChange="queryMainData($route.query.id)" v-if="mainData.type == '框架' || mainData.type == '直销'">
           <addClass class="inline-16" v-if="tool.checkAuth($route.name,'productClassManage')" :disabled="mainData.status != '新建' || !isLeader" slot="addProduct" @onSuccess="$refs.classList.listData()"   ref="addProduct" @closeDrawer="closeDrawer"/>
           <template v-slot:edit="scope">
 <!--            <el-button
@@ -109,7 +109,7 @@
 <!--        <contractClause :sys_enterpriseid="mainData.sys_enterpriseid" :disabled="mainData.status != '新建' || !isLeader" ref="Claus" v-if="mainData.type == '项目' ">
         </contractClause>-->
         <!--业绩目标-->
-        <taskTarget ref="taskTarget" v-if="Object.keys(mainData).length > 0 && mainData.type == '框架'" :data="mainData">
+        <taskTarget ref="taskTarget" v-if="Object.keys(mainData).length > 0 && (mainData.type == '框架' || mainData.type == '直销')" :data="mainData">
           <template v-slot:addTarget="scope">
               <add-target :disabled="mainData.status != '新建' || !isLeader" v-if="tool.checkAuth($route.name,'taskTargetManage')" :data="mainData" @onSuccess="successYear"></add-target>
           </template>
@@ -121,7 +121,7 @@
           </template>
         </taskTarget>
 
-        <BaseInfo v-if="mainData.type !== '居间' && mainData.type !== '框架'" :detailInfo="detailInfo"/>
+        <BaseInfo v-if="mainData.type !== '居间' && mainData.type !== '框架' && mainData.type !== '直销'" :detailInfo="detailInfo"/>
       </div>
       <div slot="slot3">
         <BaseInfo v-if="mainData.type !== '居间'" :detailInfo="detailInfo"/>
@@ -540,7 +540,71 @@ export default {
             label:'合同描述',
             value:this.mainData.remarks
           },*/
-        ] : this.mainData.type == '工具借用'
+        ] : this.mainData.type == '直销'
+          ? this.mainAreaData = [
+            /* 直销客户协议 */
+            {
+              label:'合同编号',
+              value:this.mainData.billno
+            },
+            {
+              label:'合同标题',
+              value:this.mainData.title
+            },
+            {
+              label:'合同类型',
+              value:'经销商合作协议'
+            },
+            {
+              label:'客户',
+              value:this.mainData.enterprisename
+            },
+            {
+              label:'折扣(%)',
+              value:this.mainData.discountrate !== 0?Math.round((this.mainData.discountrate * 100)*100)/100:'--'
+            },
+            {
+              label:'合同有效期',
+              value:`${this.mainData.begdate}至${this.mainData.enddate}`,
+              style:function () {
+                let style = {color:'#3874f6'}
+                return style
+              }
+            },
+            {
+              label:'签约日期',
+              value:this.mainData.signdate
+            },
+            {
+              label:'业务员',
+              value:this.mainData.salername
+            },
+            {
+              label:'状态',
+              value:this.mainData.status,
+              style:function () {
+                let style = {}
+                switch (that.mainData.status) {
+                  case '新建':
+                    style = {color:'#3874f6'}
+                    break;
+                  case '已提交':
+                    style = {color:'#52c41a'}
+                    break;
+                  case '审核':
+                    style = {color:'#333333'}
+                    break;
+                  case '已过期':
+                    style = {color:'#999999'}
+                    break;
+                  default:
+                    break;
+                }
+                return style
+              }
+            },
+          ]:
+          this.mainData.type == '工具借用'
           ? this.mainAreaData = [
           /* 工具借用 */
           {
@@ -1058,7 +1122,107 @@ export default {
                   {label:'转手次数',value:this.mainData.leader?this.mainData.leader[0].leadernum:"--"}
                 ]
               }
-               : this.mainData.type == '工具借用'
+               : this.mainData.type == '直销'
+                  ? this.detailInfo ={
+                    baseInfo : [
+                      /* 直销客户协议 */
+                      {
+                        label:'合同编号',
+                        value:this.mainData.billno
+                      },
+                      {
+                        label:'合同标题',
+                        value:this.mainData.title
+                      },
+                      {
+                        label:'合同模板',
+                        value:'直销客户合作协议模板'
+                      },
+                      {
+                        label:'合同类型',
+                        value:'直销客户合作协议'
+                      },
+                      {
+                        label:'客户',
+                        value:this.mainData.enterprisename
+                      },
+                      {
+                        label:'合同有效期',
+                        value:`${this.mainData.begdate}至${this.mainData.enddate}`,
+                        style:function () {
+                          let style = {color:'#3874f6'}
+                          return style
+                        }
+                      },
+                      {
+                        label:'签约日期',
+                        value:this.mainData.signdate
+                      },
+                      {
+                        label:'签约金额(元)',
+                        value:this.mainData.signamount?this.tool.formatAmount(this.mainData.signamount,2):0
+                      },
+                      {
+                        label:'折扣(%)',
+                        value:this.mainData.discountrate !== 0?Math.round((this.mainData.discountrate * 100)*100)/100:'--'
+                      },
+                      {
+                        label:'领域',
+                        value:this.mainData.tradefield ? this.mainData.tradefield : '--'
+                      },
+                      {
+                        label:'品牌',
+                        value:this.mainData.brandname
+                      },
+                      {
+                        label:'付款条件',
+                        value:this.mainData.paytype
+                      },
+                      {
+                        label:'业务员',
+                        value:this.mainData.salername
+                      },
+                      {
+                        label:'状态',
+                        value:this.mainData.status,
+                        style:function () {
+                          let style = {}
+                          switch (that.mainData.status) {
+                            case '新建':
+                              style = {color:'#3874f6'}
+                              break;
+                            case '已提交':
+                              style = {color:'#52c41a'}
+                              break;
+                            case '审核':
+                              style = {color:'#333333'}
+                              break;
+                            case '已过期':
+                              style = {color:'#999999'}
+                              break;
+                            default:
+                              break;
+                          }
+                          return style
+                        }
+                      },
+                      {
+                        label:'合同描述',
+                        value:this.mainData.remarks
+                      },
+                    ],
+                    systemInfo: [
+                      {label:'创建人',value:this.mainData.createby},
+                      {label:'创建时间',value:this.mainData.createdate},
+                      {label:'最近编辑人',value:this.mainData.changeby},
+                      {label:'最近编辑时间',value:this.mainData.changedate},
+                      {label:'提交人',value:this.mainData.submitby},
+                      {label:'提交时间',value:this.mainData.submitdate},
+                      {label:'审核人',value:this.mainData.checkby},
+                      {label:'审核时间',value:this.mainData.checkdate},
+                      {label:'转手次数',value:this.mainData.leader?this.mainData.leader[0].leadernum:"--"}
+                    ]
+                  }:this.mainData.type == '工具借用'
                   ? this.detailInfo = {
                     baseInfo : [
                       /* 工具借用 */

+ 6 - 3
src/HDrpManagement/customerPortrait/modules/pageTable.vue

@@ -2,7 +2,7 @@
 <template>
   <div>
     <div>
-      <tableLayout :layout="tablecols" :data="list2" :opwidth="200"  :custom="true" :width="false" fixedName="operation" :customHeader="true">
+      <tableLayout :layout="tablecols" :data="list2" :opwidth="200"  :custom="true" :width="false" fixedName="operation" :customHeader="true" :height="tableHeight">
         <template v-slot:header="data">
           <div v-if="data.data.label == '综合折扣'" style="display:flex;align-items:center">
             <span>{{ data.data.label }}</span>
@@ -24,7 +24,7 @@
               {{ scope.column.data[scope.column.columnname] }}
             </div>
           </div>
-          
+
         </template>
       </tableLayout>
     </div>
@@ -44,13 +44,16 @@
 </template>
 
 <script>
+import tableLayout from '@/components/table/index6'
 export default {
   props:["tablecols",'param','custom'],
+  components:{tableLayout},
   data () {
     return {
       list:[],
       list2:[],
       total:0,
+      tableHeight:'',
       options:[
       ],
     }
@@ -82,4 +85,4 @@ export default {
 </script>
 <style scoped>
 
-</style>
+</style>

+ 7 - 5
src/HDrpManagement/dataanalysis/modules/clue.vue

@@ -10,7 +10,7 @@
             <quickDate ref="quickAdd" @selectQuick="selectQuickAdd"></quickDate>
           </el-col>
         </el-row>
-        <tableLayout style="margin-top: 10px" :layout="tablecolsAdd" :data="listAdd" :opwidth="200" :custom="true" :height="tableHieght">
+        <tableLayout style="margin-top: 10px" :layout="tablecolsAdd" :data="listAdd" :opwidth="200" :custom="true" :height="tableHeight">
           <template v-slot:customcol="scope">
             <p>{{scope.column.data[scope.column.columnname]?scope.column.data[scope.column.columnname]:'--'}}</p>
           </template>
@@ -35,7 +35,7 @@
             <quickDate ref="quickUpd" @selectQuick="selectQuickUpd"></quickDate>
           </el-col>
         </el-row>
-        <tableLayout style="margin-top: 10px" :layout="tablecolsUpdate" :data="listUpdate" :opwidth="200" :custom="true" :height="tableHieght">
+        <tableLayout style="margin-top: 10px" :layout="tablecolsUpdate" :data="listUpdate" :opwidth="200" :custom="true" :height="tableHeight">
           <template v-slot:customcol="scope">
             <p>{{scope.column.data[scope.column.columnname]?scope.column.data[scope.column.columnname]:'--'}}</p>
           </template>
@@ -60,7 +60,7 @@
             <quickDate ref="quickFow" @selectQuick="selectQuickFow"></quickDate>
           </el-col>
         </el-row>
-        <tableLayout style="margin-top: 10px" :layout="tablecolsFollow" :data="listFollow" :opwidth="200" :custom="true" :height="tableHieght">
+        <tableLayout style="margin-top: 10px" :layout="tablecolsFollow" :data="listFollow" :opwidth="200" :custom="true" :height="tableHeight">
           <template v-slot:customcol="scope">
             <p>{{scope.column.data[scope.column.columnname]?scope.column.data[scope.column.columnname]:'--'}}</p>
           </template>
@@ -85,17 +85,19 @@
 
 <script>
 import quickDate from "@/HDrpManagement/dataanalysis/components/quickDate";
+import tableLayout from '@/components/table/index6'
 export default {
   name: "clue",
   props:['param','isDep','dataid','isPerson'],
-  components:{quickDate},
+  components:{quickDate,tableLayout},
   data() {
     return {
       listAdd:[],
       tablecolsAdd:[],
       listUpdate:[],
       tablecolsUpdate:[],
-      tableHieght:'50px',
+      /*tableHieght:'50px',*/
+      tableHeight:'',
       currentPageAdd:0,
       totalAdd:0,
       currentPageUpdate:0,

+ 6 - 5
src/HDrpManagement/dataanalysis/modules/customer.vue

@@ -10,7 +10,7 @@
             <quickDate @selectQuick="selectQuickAdd"></quickDate>
           </el-col>
         </el-row>
-        <tableLayout style="margin-top: 10px" :layout="tablecolsAdd" :data="listAdd" :opwidth="200" :custom="true" :height="tableHieght">
+        <tableLayout style="margin-top: 10px" :layout="tablecolsAdd" :data="listAdd" :opwidth="200" :custom="true" :height="tableHeight">
           <template v-slot:customcol="scope">
             <p>{{scope.column.data[scope.column.columnname]?scope.column.data[scope.column.columnname]:'--'}}</p>
           </template>
@@ -35,7 +35,7 @@
             <quickDate @selectQuick="selectQuickUpd"></quickDate>
           </el-col>
         </el-row>
-        <tableLayout style="margin-top: 10px" :layout="tablecolsUpdate" :data="listUpdate" :opwidth="200" :custom="true" :height="tableHieght">
+        <tableLayout style="margin-top: 10px" :layout="tablecolsUpdate" :data="listUpdate" :opwidth="200" :custom="true" :height="tableHeight">
           <template v-slot:customcol="scope">
             <p>{{scope.column.data[scope.column.columnname]?scope.column.data[scope.column.columnname]:'--'}}</p>
           </template>
@@ -60,7 +60,7 @@
             <quickDate @selectQuick="selectQuickFow"></quickDate>
           </el-col>
         </el-row>
-        <tableLayout style="margin-top: 10px" :layout="tablecolsFollow" :data="listFollow" :opwidth="200" :custom="true" :height="tableHieght">
+        <tableLayout style="margin-top: 10px" :layout="tablecolsFollow" :data="listFollow" :opwidth="200" :custom="true" :height="tableHeight">
           <template v-slot:customcol="scope">
             <p v-if="scope.column.columnname === 'followname'">
               <span v-if="scope.column.data.followname.length > 0">
@@ -98,17 +98,18 @@
 
 <script>
 import quickDate from "@/HDrpManagement/dataanalysis/components/quickDate";
+import tableLayout from '@/components/table/index6'
 export default {
   name: "customer",
   props:['param','isDep','dataid','isPerson'],
-  components:{quickDate},
+  components:{quickDate,tableLayout},
   data() {
     return {
       listAdd:[],
       tablecolsAdd:[],
       listUpdate:[],
       tablecolsUpdate:[],
-      tableHieght:'50px',
+      tableHeight:'',
       currentPageAdd:0,
       totalAdd:0,
       currentPageUpdate:0,

+ 5 - 4
src/HDrpManagement/dataanalysis/modules/documents.vue

@@ -10,7 +10,7 @@
             <quickDate @selectQuick="selectQuickQuotation"></quickDate>
           </el-col>
         </el-row>
-        <tableLayout style="margin-top: 10px" :layout="quotationTablecols" :data="quotationList" :opwidth="200" :custom="true" :height="tableHieght">
+        <tableLayout style="margin-top: 10px" :layout="quotationTablecols" :data="quotationList" :opwidth="200" :custom="true" :height="tableHeight">
           <template v-slot:customcol="scope">
             <p>{{scope.column.data[scope.column.columnname]?scope.column.data[scope.column.columnname]:'--'}}</p>
           </template>
@@ -35,7 +35,7 @@
             <quickDate @selectQuick="selectQuickContract"></quickDate>
           </el-col>
         </el-row>
-        <tableLayout style="margin-top: 10px" :layout="contractTablecols" :data="contractList" :opwidth="200" :custom="true" :height="tableHieght">
+        <tableLayout style="margin-top: 10px" :layout="contractTablecols" :data="contractList" :opwidth="200" :custom="true" :height="tableHeight">
           <template v-slot:customcol="scope">
             <p>{{scope.column.data[scope.column.columnname]?scope.column.data[scope.column.columnname]:'--'}}</p>
           </template>
@@ -60,17 +60,18 @@
 
 <script>
 import quickDate from "@/HDrpManagement/dataanalysis/components/quickDate";
+import tableLayout from '@/components/table/index6'
 export default {
   name: "documents",
   props:['param','isDep','dataid','isPerson'],
-  components:{quickDate},
+  components:{quickDate,tableLayout},
   data() {
     return {
       quotationList:[],
       quotationTablecols:[],
       contractList:[],
       contractTablecols:[],
-      tableHieght:'50px',
+      tableHeight:'',
       quotationCurrentPage:0,
       quotationTotal:0,
       contractCurrentPage:0,

+ 6 - 6
src/HDrpManagement/dataanalysis/modules/project.vue

@@ -10,7 +10,7 @@
             <quickDate @selectQuick="selectQuickAdd"></quickDate>
           </el-col>
         </el-row>
-        <tableLayout style="margin-top: 10px" :layout="tablecolsAdd" :data="listAdd" :opwidth="200" :custom="true" :height="tableHieght">
+        <tableLayout style="margin-top: 10px" :layout="tablecolsAdd" :data="listAdd" :opwidth="200" :custom="true" :height="tableHeight">
           <template v-slot:customcol="scope">
             <p>{{scope.column.data[scope.column.columnname]?scope.column.data[scope.column.columnname]:'--'}}</p>
           </template>
@@ -35,7 +35,7 @@
             <quickDate @selectQuick="selectQuickUpd"></quickDate>
           </el-col>
         </el-row>
-        <tableLayout style="margin-top: 10px" :layout="tablecolsUpdate" :data="listUpdate" :opwidth="200" :custom="true" :height="tableHieght">
+        <tableLayout style="margin-top: 10px" :layout="tablecolsUpdate" :data="listUpdate" :opwidth="200" :custom="true" :height="tableHeight">
           <template v-slot:customcol="scope">
             <p>{{scope.column.data[scope.column.columnname]?scope.column.data[scope.column.columnname]:'--'}}</p>
           </template>
@@ -60,7 +60,7 @@
             <quickDate @selectQuick="selectQuickFow"></quickDate>
           </el-col>
         </el-row>
-        <tableLayout style="margin-top: 10px" :layout="tablecolsFollow" :data="listFollow" :opwidth="200" :custom="true" :height="tableHieght">
+        <tableLayout style="margin-top: 10px" :layout="tablecolsFollow" :data="listFollow" :opwidth="200" :custom="true" :height="tableHeight">
           <template v-slot:customcol="scope">
             <p v-if="scope.column.columnname === 'followname'">
               <span v-if="scope.column.data.followname.length > 0">
@@ -98,18 +98,18 @@
 
 <script>
 import quickDate from "@/HDrpManagement/dataanalysis/components/quickDate";
-
+import tableLayout from '@/components/table/index6'
 export default {
   name: "project",
   props:['param','isDep','dataid','isPerson'],
-  components:{quickDate},
+  components:{quickDate,tableLayout},
   data() {
     return {
       listAdd:[],
       tablecolsAdd:[],
       listUpdate:[],
       tablecolsUpdate:[],
-      tableHieght:'50px',
+      tableHeight:'',
       currentPageAdd:0,
       totalAdd:0,
       currentPageUpdate:0,

+ 14 - 9
src/HDrpManagement/orderManage/details/tabs/productlist.vue

@@ -510,6 +510,7 @@ export default {
     }
   },
   data () {
+    let that = this
     return {
       freefreightamount:null,
       drawer:false,
@@ -531,16 +532,18 @@ export default {
         },
       },
       pickerOptions1: {
-       async disabledDate(time) {
-          let newDate = new Date()
-          newDate = newDate.setDate(newDate.getDate() + 3)
+       disabledDate(time) {
+        /*  let newDate = new Date()
+         newDate = newDate.setDate(newDate.getDate() + 3)*/
+         /* newDate = newDate.setDate(newDate.getDate() + 3)
           console.log(newDate,'日期获取')
+          console.log(time.getTime(),'当前日期')
           console.log(new Date(newDate),'日期转化')
           let year = new Date(newDate).getFullYear()
           let month = new Date(newDate).getMonth() + 1
           let day = new Date(newDate).getDate()
-          console.log(year + '-' + month + '-' + day)
-          let param = {
+          console.log(year + '-' + month + '-' + day)*/
+          /*let param = {
             "id":20221215165504,
             "content":{
               "isExport":0,
@@ -553,10 +556,12 @@ export default {
               }
             },
           }
-          const res = await this.$api.requested(param)
-          console.log(res,'结果')
-
-          return time.getTime() < newDate;
+          const res = await that.$api.requested(param)
+          console.log(res,'结果')*/
+       /*  console.log(time.getTime())
+         console.log(new Date().getTime())
+         console.log(time.getTime() < new Date().getTime())*/
+          return time.getTime() < new Date().getTime();
         },
       },
       pickerOptions: {

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

@@ -260,6 +260,7 @@ export default {
       options: [],
       isHandle:'',
       tradefieldSelect:[],
+      unitnameList:[]
     }
   },
   props: {

+ 204 - 0
src/SManagement/orderclue/components/file/index3.vue

@@ -0,0 +1,204 @@
+<template>
+
+  <div class="file-box">
+    <div 
+      class="item-file" 
+      v-for="(item,index) in fileData" 
+      :key="index"
+      :style="[
+        {'width': auto ? '100%' : '300px'},
+        {'margin-right':marginRight + 'px'},
+        {'margin-bottom':marginRight + 'px'}
+      ]"
+    >
+      <div class="left">
+        <div class="image">
+          <previewImage 
+            v-if="item.fileType == 'image'"
+            style="width:38px;height:38px;margin:0px" 
+            :image="item" 
+            :deletebtn="false"
+          ></previewImage>
+          <el-image v-else :src="item.cover" fit="fit" alt  />
+        </div>
+        <div class="text">
+          <!-- <el-tooltip v-if="item.document" class="item" effect="dark" :content="item.document" placement="top-start"> -->
+            <p @click="downLoad(item)" style="font-size:14px" class="file-title">{{item.document}}</p>
+          <!-- </el-tooltip> -->
+          <p class="create-date" style="font-size:12px" v-if="item.createdate">{{item.createdate}}</p>
+        </div>
+      </div>
+      <div class="right">
+        <i class="el-icon-zoom-in" v-if="item.fileType != 'image'" @click="seeClick(item)"></i>
+        <i class="el-icon-delete" style="font-size:16px" @click="deleteFile(item,index)" v-if="isDelete"></i>
+      </div>
+    </div>
+    <see-File ref="seeFile" :fileData="seeFile"></see-File>
+  </div>
+</template>
+
+<script>
+import SeeFile from '@/components/file-block/components/SeeFile'
+import previewImage from '@/components/previewImage/index'
+
+import removeFile from '@/utils/removeFile'
+export default {
+  name: 'index',
+  data () {
+    return {
+      seeFile: '',
+      isSeeFileShow:false,
+      fileBoxEl: '',
+      itemWidth:0
+    };
+  },
+  props: {
+    auto: Boolean,
+    isDownLoad: Boolean,
+    isDelete:Boolean,
+    fileData: {
+      default() {
+        return []
+      }
+    },
+    /* 一行展示几个 */
+    rowCount: {
+      type: Number,
+      default () {
+        return 1
+      }
+    },
+    /* 块margin-right */
+    marginRight: {
+      type:Number,
+      default () {
+        return 0
+      }
+    },
+  },
+  components: {
+    SeeFile,
+    previewImage
+  },
+  computed: {
+  },
+  watch: {
+  },
+  created() {
+    
+  },
+  mounted () {
+    let el = document.querySelector('.file-box')
+    this.itemWidth = el.clientWidth / this.rowCount - this.marginRight > 200 ? el.clientWidth / this.rowCount - this.marginRight : 200
+  },
+  methods: {
+    debouned () {
+
+    },
+    deleteFile(item,index) {
+      let temp = item
+      removeFile.removeFileList([item]).then(res => {
+        this.tool.showMessage(res,() => {
+          this.$emit('deleteSuccess',temp)
+        })
+      })
+      this.$emit('deleteFile',index)
+    },
+    //预览
+    seeClick(item) {
+      if(item.fileType == 'image' || item.fileType == 'video') {
+        this.seeFile = item
+        this.$refs.seeFile.dialogVisible = true
+      } else {
+        this.$notify({
+          title:'提示',
+          message:'该文件暂不支持',
+          type:'warning'
+        })
+      }
+    },
+    downLoad(item) {
+      this.$emit('updateDownLoadRecord',item)
+      window.open(item.url,'_self')
+    }
+  },
+};
+</script>
+
+<style scoped>
+*{
+  box-sizing: border-box;
+}
+.file-box {
+  width: 100%;
+  display: flex;
+  flex-wrap: wrap;
+}
+.item-file {
+  display: flex;
+  padding: 10px;
+  display: flex;
+  align-items: center;
+  cursor: pointer;
+  transition: .2s linear;
+  cursor: pointer;
+  border-radius: 5px;
+  background: #ffffff;
+  height: 80px;
+}
+.item-file:hover {
+  box-shadow: 0 5px 10px rgb(0 0 0 / 10%);
+}
+.file-box .left {
+  width: 90%;
+  height: 100%;
+  display: flex;
+  align-items: center;
+}
+.file-box .left .image {
+  margin-right: 10px;
+}
+.file-box .left .image .el-image{
+  width: 50px;
+}
+.file-box .left .text {
+  width: calc(100% - 50px);
+  font-size: 14px;
+  display: flex;
+  flex-direction: column;
+  justify-content: space-evenly;
+  height: 100%;
+  padding-right: 10px;
+}
+.file-box .left .text .file-title {
+  color: #3874f6;
+  font-size: 16px;
+  text-decoration: underline;
+
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+}
+.file-box .left .text .create-date {
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+}
+
+.file-box .right {
+  width: 10%;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: space-evenly;
+  height: 100%;
+}
+.file-box .right .see{}
+.el-empty {
+  height: 150px;
+  transform: scale(70%);
+}
+/deep/.el-dialog__wrapper {
+  z-index: 9999;
+}
+</style>

+ 2 - 2
src/SManagement/orderclue/components/follow.vue

@@ -9,7 +9,7 @@
             <el-date-picker v-model="timer" type="datetime" format="yyyy-MM-dd HH:mm:ss"  size="small">
             </el-date-picker>
           </el-form-item>
-          <el-form-item label="本次跟进方式" prop="followupmode">
+          <el-form-item label="跟进类型" prop="followupmode">
             <el-select v-model="param.followupmode" placeholder="请选择方式" size="small">
               <el-option v-for="(item,index) in followTypeList" :key="index" :label="item.value" :value="item.value">
               </el-option>
@@ -21,7 +21,7 @@
             </el-radio-group>
           </el-form-item> -->
           <el-form-item label="跟进内容" prop="content" v-if="param.logtype == '跟进'">
-            <el-input type="textarea" v-model="param.content" size="small"></el-input>
+            <el-input type="textarea" v-model="param.content" size="small" placeholder="请填写跟进内容"></el-input>
           </el-form-item>
           <upload
             ref="upload"

+ 224 - 0
src/SManagement/orderclue_detail/components/editFollow.vue

@@ -0,0 +1,224 @@
+<template>
+  <div class="follow" style="margin-right:10px">
+    <el-button size="mini" type="text" @click="followBtn" :disabled="disabled">编辑</el-button>
+    <el-drawer title="线索跟进" append-to-body :visible.sync="dialogVisible" size="600px" :before-close="handleClose" :show-close="false">
+      <div class="drawer__panel">
+        <el-form :model="param" :rules="rules" ref="ruleForm" label-width="110px" class="demo-ruleForm"
+                 label-position="right">
+          <el-form-item label="跟进时间">
+            <el-date-picker v-model="timer" type="datetime" format="yyyy-MM-dd HH:mm:ss"  size="small">
+            </el-date-picker>
+          </el-form-item>
+          <el-form-item label="跟进类型" prop="followupmode">
+            <el-select v-model="param.followupmode" placeholder="请选择方式" size="small">
+              <el-option v-for="(item,index) in followTypeList" :key="index" :label="item.value" :value="item.value">
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <!-- <el-form-item label="本次跟进结果" prop="logtype">
+            <el-radio-group v-model="param.logtype">
+              <el-radio label="跟进">跟进</el-radio>
+            </el-radio-group>
+          </el-form-item> -->
+          <el-form-item label="跟进内容" prop="content" >
+            <el-input type="textarea" v-model="param.content" size="small" placeholder="请填写跟进内容"></el-input>
+          </el-form-item>
+<!--          <div class="flex-align-center flex-between pionter" v-for="file in data.attinfo" :key="file.index">
+            <div class="flex-align-center">
+              <img width="38" :src="checkFileType(file.postfix) === 'file'?require('@/assets/file_icons/file.svg'):file.url" class="inline-16" alt="">
+              <div class="file__link inline-16">
+                <a :href="file.url">{{file.document}}</a>
+                <p>{{(file.contentlength / 1024).toFixed(2)}}kb</p>
+              </div>
+            </div>
+            <i style="color:red;" class="el-icon-delete" @click="deleteFile(file)"></i>
+          </div>-->
+          <file-item
+              :auto="true"
+              :isDownLoad="true"
+              :isDelete='true'
+              :fileData="data.attinfo"
+              @deleteFile="handleRemove">
+          </file-item>
+          <upload
+              ref="upload"
+              :folderid="folderid"
+              @onSuccess="onSuccess"
+              :bindData=" {ownertable: 'sat_ordercluefollowuplog', ownerid: data.sat_ordercluefollowuplogid,usetype: 'default'}"
+              type="button">
+          </upload>
+        </el-form>
+
+      </div>
+      <div class="fixed__btn__panel">
+        <el-button size="small" @click="dialogVisible = false" class="normal-btn-width">取 消</el-button>
+        <el-button size="small" type="primary" @click="followAction" class="normal-btn-width" :loading="loading">确 定</el-button>
+      </div>
+    </el-drawer>
+  </div>
+</template>
+
+<script>
+import upload from './upload'
+import FileItem from '@/SManagement/orderclue/components/file/index3'
+export default {
+  name: "editFollow",
+  components:{upload,FileItem},
+  data () {
+    return {
+      loading:false,
+      bindData:{},
+      folderid:JSON.parse(sessionStorage.getItem('folderid')).appfolderid,
+      param: {
+        "sat_orderclueid": 4,
+        "content": "",
+        "createdate":'',
+        "followupmode": "", //当面拜访、电话沟通
+        "logtype": "跟进", //跟进、成交、丢单、无效
+        "competitor": "",
+        "latitude":"",//经度,可选
+        "longitude":"",//纬度,可选
+        "address":"",//解析地址,
+        "sat_ordercluefollowuplogid":0//传0新增
+      },
+      timer: '',
+      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,
+      followTypeList: []
+    }
+  },
+  props: {
+    detailInfo: {
+      default () {
+        return []
+      },
+    },
+    position: {
+      type: String
+    },
+    updataList: {
+      type: Function
+    },
+    getDetail: {
+      type: Function
+    },
+    disabled: Boolean,
+    data:{}
+  },
+  watch: {
+    dialogVisible(val) {
+      if (!val) {
+        this.$refs['ruleForm'].resetFields()
+        this.$refs.upload.fileLinkList = []
+        this.$refs.upload.fileList = []
+
+      }
+    }
+  },
+  computed: {
+  },
+  created () {
+    this.getFollowType()
+    this.timer = new Date()
+
+  },
+  methods: {
+    async getFollowType () {
+      let res = await this.$store.dispatch('optiontypeselect', 'followupmode')
+      this.followTypeList = res.data
+    },
+    followBtn () {
+      this.dialogVisible = true
+      console.log(this.data,'可编辑的数据')
+      this.param = Object.assign({},this.param,this.data)
+      console.log(this.param)
+    },
+    handleClose () {
+      this.dialogVisible = false
+    },
+    followAction () {
+      this.$refs.ruleForm.validate(async val => {
+        if (!val) return
+        this.param.sat_orderclueid = this.detailInfo.sat_orderclueid
+        this.param.createdate = this.timer
+        this.param.createdate = `${this.timer.getFullYear()}-${this.timer.getMonth() + 1}-${this.timer.getDate()} ${this.timer.getHours()}:${this.timer.getMinutes()}:${this.timer.getSeconds()}`
+        let res = await this.$api.requested({
+          "id":20221208100602,
+          "content": this.param
+        })
+        this.bindData = {
+          "ownertable": 'sat_ordercluefollowuplog',
+          "ownerid": res.data.sat_ordercluefollowuplogid,
+          "usetype": 'default',
+        }
+        this.loading = true
+        this.$refs['upload'].toUpload(() => {
+          this.loading = false
+          this.$emit('onSuccess')
+          this.dialogVisible = false
+        })
+      })
+    },
+    onSuccess () {
+
+    },
+    checkFileType (type) {
+      let arr = ['JPG','JPEG','PNG']
+      if (arr.includes(type.toUpperCase())) {
+        return 'img'
+      } else {
+        return 'file'
+      }
+    },
+    async deleteFile (row) {
+      const res = await this.$api.requested({
+        "classname": "system.attachment.Attachment",
+        "method": "deleteFileLink",
+        "content": {
+          "linksids":[row.linksid]
+        }
+      })
+      this.tool.showMessage(res,()=>{
+        /*this.queryLogs()*/
+      })
+    },
+    handleRemove (index) {
+      this.data.attinfo = this.data.attinfo.filter((e,idx)=>{
+        if (idx !== index) {
+          return e
+        }
+      })
+      console.log(this.data.attinfo);
+
+      this.fileLinkList = this.fileLinkList.filter((e,idx)=>{
+        if (idx !== index) {
+          return e
+        }
+      })
+    },
+  },
+}
+</script>
+
+<style scoped>
+.follow {
+  display: inline-block;
+}
+/deep/.el-input,.el-select {
+  width: 100%;
+}
+</style>

+ 143 - 59
src/SManagement/orderclue_detail/components/followDetail.vue

@@ -1,41 +1,79 @@
 <template>
-  <div class="normal-card" style="padding-right:0">
-    <el-descriptions>
-      <div slot="title">跟进记录 &nbsp;<i @click="sortFun" :class="param.content.sort[0].reversed == 1?'fa fa-sort-amount-asc':'fa fa-sort-amount-desc'"></i></div>
-    </el-descriptions>
+  <div>
     <div class="select">
       <span class="demonstration">日期范围:</span>
       <time-select @clearSelect="clearSelect" @timeChange="timeChange"></time-select>
     </div>
-    <div class="detail" v-if="follow.length > 0">
-      <div class="item" v-for="(item,index) in follow" :key="index">
-        <p>{{index + 1}}.{{item.createdate}},&nbsp;由<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">
-          <div style="margin-bottom:10px">
-            <p v-if="item.competitor">已购买品牌:{{item.competitor}}</p>
-            {{item.content}}
-          </div>
-          <file-item 
-            :marginRight="10"
-            :rowCount="5"
-            :isDownLoad="true" 
-            :fileData="item.attinfo"
-            @deleteSuccess="deleteFile">
-          </file-item>
-        </div>
-      </div>
+    <div style="height:calc(100vh - 300px);overflow: auto;">
+      <el-timeline v-if="follow.length > 0" style="margin: 10px" v-for="item in follow" :key="item.index">
+        <el-timeline-item :timestamp="item.createdate" placement="top"  color="#409eff">
+          <el-card class="card-border">
+            <el-row>
+              <el-col :span="16">
+                <div class="avatar">
+                  <img class="avatar__image" v-if="item.headpic" :src="item.headpic" alt="">
+                  <p v-else>{{item.createby.substr(0, 1)}}</p>
+                </div>
+                <div style="float:left;margin-left: 10px!important;">
+                  <p>{{ item.createby }}&nbsp;</p>
+                  <small style="color:#999999ad;margin-top:10px">部门:{{ item.depname?item.depname:"--" }}&emsp;职位:{{ item.position?item.position:"--" }}</small>
+                </div>
+              </el-col>
+              <el-col :span="8">
+                <div style="float: right;">
+                  <editFollow :data="item" @onSuccess="onSuccess" :disabled="disabled" v-if="!disabled "></editFollow>
+                  <upload
+                      v-if="!disabled"
+                      class="inline-16"
+                      ref="upload"
+                      :folderid="folderid"
+                      @onSuccess="onSuccess"
+                      :id="item.sat_ordercluefollowuplogid"
+                      :disabled="disabled"
+                      type="button">
+                  </upload>
+                  <el-button size="small" type="text" @click="onDel(item.sat_ordercluefollowuplogid)" :disabled="disabled" v-if="!disabled">删除</el-button>
+                </div>
+              </el-col>
+              <el-col :span="24">
+                <div style="float: left;margin-top: 10px">
+                  <p>跟进类型:{{item.followupmode}}</p>
+                </div>
+              </el-col>
+              <el-col :span="24">
+                <div class="div-border">
+                  {{item.content}}
+                </div>
+              </el-col>
+              <el-col :span="24" >
+                <div v-if="item.attinfo" style="margin-top: 20px;margin-bottom: -10px">
+                  <file-item
+                      :marginRight="10"
+                      :rowCount="5"
+                      :isDownLoad="true"
+                      :fileData="item.attinfo"
+                      :isDelete="!disabled"
+                      @deleteSuccess="deleteFile">
+                  </file-item>
+                </div>
+              </el-col>
+            </el-row>
+          </el-card>
+        </el-timeline-item>
+      </el-timeline>
+      <el-empty title="暂无数据" v-else></el-empty>
     </div>
-    <el-empty title="暂无数据" v-else></el-empty>
+
     <div style="margin-top:16px;text-align:right">
       <el-pagination
-      background
-      small
-      @size-change="handleSizeChange"
-      @current-change="handleCurrentChange"
-      :current-page="param.content.pageNumber"
-      :page-size="param.content.pageSize"
-      layout="total, prev, pager, next"
-      :total="total">
+          background
+          small
+          @size-change="handleSizeChange"
+          @current-change="handleCurrentChange"
+          :current-page="param.content.pageNumber"
+          :page-size="param.content.pageSize"
+          layout="total, prev, pager, next"
+          :total="total">
       </el-pagination>
     </div>
   </div>
@@ -43,13 +81,16 @@
 
 <script>
 import FileItem from '../../orderclue/components/file/index2'
-
+import upload from './uploadNew.vue'
+import editFollow from './editFollow'
 import TimeSelect from '@/SManagement/submitedit_one/components/TimeSelect'
-import { log } from '@antv/g2plot/lib/utils';
 export default {
   name: 'followDetail',
+  props:['disabled'],
   data() {
     return {
+      bindData:{},
+      folderid:JSON.parse(sessionStorage.getItem('folderid')).appfolderid,
       param: {
         "id": "20221101094602",
         "version":1,
@@ -80,10 +121,11 @@ export default {
       },
       follow:[],
       timeArr:[],
+      attinfo:[],
       total:0
     };
   },
-  components:{ TimeSelect , FileItem},
+  components:{ TimeSelect , FileItem,upload,editFollow},
   computed:{
   },
   watch:{
@@ -101,23 +143,23 @@ export default {
       })
       this.param.content.sort = res.sort
       console.log(this.follow);
-      
+
     },
     handleCurrentChange(n) {
       this.param.content.pageNumber = n
       this.getFollowDetail()
     },
     clearSelect() {
-      this.param.content.where.start = ''      
+      this.param.content.where.start = ''
       this.param.content.where.end = ''
       this.param.content.pageNumber = 1
-      this.getFollowDetail()  
+      this.getFollowDetail()
     },
     timeChange(result) {
-      this.param.content.where.start = result[0]      
-      this.param.content.where.end = result[1]    
+      this.param.content.where.start = result[0]
+      this.param.content.where.end = result[1]
       this.param.content.pageNumber = 1
-      this.getFollowDetail()  
+      this.getFollowDetail()
     },
     sortFun() {
       this.param.content.sort[0].reversed = this.param.content.sort[0].reversed == 0 ? 1 : 0
@@ -128,22 +170,47 @@ export default {
         item.attinfo.forEach((item2,index) => {
           if(item2.linksid == data.linksid) {
             console.log(item2,data);
-            
+
             item.attinfo.splice(index,1)
           }
         })
       })
-      
+
     },
     handleSizeChange(val) {
       // console.log(`每页 ${val} 条`);
       this.param.content.pageSize = val
       this.getFollowDetail()
     },
-    handleCurrentChange(val) {
+   /* handleCurrentChange(val) {
       // console.log(`当前页: ${val}`);
       this.param.content.pageNumber = val
       this.getFollowDetail()
+    },*/
+    onDel(id){
+      this.$confirm('确定删除该跟进记录吗?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(async () => {
+        const res = await this.$api.requested({
+          "id": 20221208112002,
+          "content": {
+            "sat_ordercluefollowuplogid":id
+          }
+        })
+        this.tool.showMessage(res,()=>{
+          this.getFollowDetail()
+        })
+      }).catch(() => {
+        this.$message({
+          type: 'info',
+          message: '已取消删除'
+        });
+      });
+    },
+    onSuccess () {
+      this.getFollowDetail()
     },
   },
 };
@@ -153,34 +220,51 @@ export default {
 *{
   box-sizing: border-box;
 }
-  .normal-card .title {
-    font-size: 16px;
-    color: #000000;
-    font-weight: bold;
-  }
-  .normal-card .select {
-    margin: 25px 10px 15px 0;
+  .select{
     display: flex;
     align-items: center;
   }
-  .normal-card .select .demonstration {
+  .demonstration {
     font-size: 14px;
     margin-right: 10px;
   }
-  .normal-card .detail {
-    font-size: 14px;
-    overflow-y: scroll;
-    height: calc(100vh - 400px);
-    padding-right: 10px;
+  .avatar__image{
+    height: 100%;
+    width: 100%;
+  }
+  .avatar:hover .avatar__model{
+    display: block;
   }
-  .normal-card .detail .content {
-    margin: 10px 0 16px 0;
+  .avatar{
+    position: relative;
+    float: left;
+    margin-left: 0px;
+    height:40px;
+    width: 40px;
+    margin-bottom: 5px;
+    border-radius: 100%;
+    text-align: center;
+    line-height: 40px;
+    color:#fff;
+    font-weight: 500;
+    background: #3874F6;
+    cursor: pointer;
+    overflow: hidden;
+  }
+  .card-border{
     background: #F2F2F2;
-    padding: 16px;
+  }
+  .card-border .div-border{
+    background: #FFFFFF;
+    margin-top: 20px;
+    width: 100%;
+    height: 90px;
     border-radius: 5px;
-    font-size: 14px;
   }
   /deep/.el-descriptions__header {
     margin-bottom: 0 !important;
   }
+  /deep/.el-card__body {
+    padding: 10px;
+  }
 </style>

+ 188 - 0
src/SManagement/orderclue_detail/components/followDetailCopy.vue

@@ -0,0 +1,188 @@
+<template>
+  <div class="normal-card" style="padding-right:0">
+    <el-descriptions>
+      <div slot="title">跟进记录 &nbsp;<i @click="sortFun" :class="param.content.sort[0].reversed == 1?'fa fa-sort-amount-asc':'fa fa-sort-amount-desc'"></i></div>
+    </el-descriptions>
+    <div class="select">
+      <span class="demonstration">日期范围:</span>
+      <time-select @clearSelect="clearSelect" @timeChange="timeChange"></time-select>
+    </div>
+    <div class="detail" v-if="follow.length > 0">
+      <div class="item" v-for="(item,index) in follow" :key="index">
+        <p>{{index + 1}}.{{item.createdate}},&nbsp;由<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">
+          <el-button type="text">删除</el-button>
+          <div style="margin-bottom:10px">
+            <p v-if="item.competitor">已购买品牌:{{item.competitor}}</p>
+            {{item.content}}
+          </div>
+          <file-item
+            :marginRight="10"
+            :rowCount="5"
+            :isDownLoad="true"
+            :fileData="item.attinfo"
+            @deleteSuccess="deleteFile">
+          </file-item>
+        </div>
+      </div>
+    </div>
+    <el-empty title="暂无数据" v-else></el-empty>
+    <div style="margin-top:16px;text-align:right">
+      <el-pagination
+      background
+      small
+      @size-change="handleSizeChange"
+      @current-change="handleCurrentChange"
+      :current-page="param.content.pageNumber"
+      :page-size="param.content.pageSize"
+      layout="total, prev, pager, next"
+      :total="total">
+      </el-pagination>
+    </div>
+  </div>
+</template>
+
+<script>
+import FileItem from '../../orderclue/components/file/index2'
+
+import TimeSelect from '@/SManagement/submitedit_one/components/TimeSelect'
+import { log } from '@antv/g2plot/lib/utils';
+export default {
+  name: 'followDetail',
+  data() {
+    return {
+      param: {
+        "id": "20221101094602",
+        "version":1,
+        "content": {
+            "sat_orderclueid": this.$route.query.id,
+            "isdesc": 1,
+            "pageNumber":1,
+            "pageSize":20,
+            "where": {
+                "start": "",
+                "end": ""
+            },
+            "sort": [
+              {
+                "reversed":0,
+                "sorted":1,
+                "sortid":0,
+                "sortname":'默认'
+              }
+            ]
+        }
+      },
+      handleTxt:{
+        '跟进中':'跟进内容',
+        '成交':'成交操作,添加备注',
+        '丢单':'丢单操作,具体原因如下',
+        '无效':'无效操作,具体原因如下',
+      },
+      follow:[],
+      timeArr:[],
+      total:0
+    };
+  },
+  components:{ TimeSelect , FileItem},
+  computed:{
+  },
+  watch:{
+  },
+  created() {
+    this.getFollowDetail()
+  },
+  methods: {
+    async getFollowDetail() {
+      let res = await this.$api.requested(this.param)
+      this.follow = res.data
+      this.total = res.total
+      this.follow.forEach(item => {
+        item.attinfo = this.fileType.fileList(item.attinfo)
+      })
+      this.param.content.sort = res.sort
+      console.log(this.follow);
+
+    },
+    handleCurrentChange(n) {
+      this.param.content.pageNumber = n
+      this.getFollowDetail()
+    },
+    clearSelect() {
+      this.param.content.where.start = ''
+      this.param.content.where.end = ''
+      this.param.content.pageNumber = 1
+      this.getFollowDetail()
+    },
+    timeChange(result) {
+      this.param.content.where.start = result[0]
+      this.param.content.where.end = result[1]
+      this.param.content.pageNumber = 1
+      this.getFollowDetail()
+    },
+    sortFun() {
+      this.param.content.sort[0].reversed = this.param.content.sort[0].reversed == 0 ? 1 : 0
+      this.getFollowDetail()
+    },
+    deleteFile (data) {
+      this.follow.forEach(item => {
+        item.attinfo.forEach((item2,index) => {
+          if(item2.linksid == data.linksid) {
+            console.log(item2,data);
+
+            item.attinfo.splice(index,1)
+          }
+        })
+      })
+
+    },
+    handleSizeChange(val) {
+      // console.log(`每页 ${val} 条`);
+      this.param.content.pageSize = val
+      this.getFollowDetail()
+    },
+    handleCurrentChange(val) {
+      // console.log(`当前页: ${val}`);
+      this.param.content.pageNumber = val
+      this.getFollowDetail()
+    },
+  },
+};
+</script>
+
+<style scoped>
+*{
+  box-sizing: border-box;
+}
+  .normal-card .title {
+    font-size: 16px;
+    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;
+    overflow-y: scroll;
+    height: calc(100vh - 400px);
+    padding-right: 10px;
+  }
+  .normal-card .detail .content {
+    margin: 10px 0 16px 0;
+    background: #F2F2F2;
+    padding: 16px;
+    border-radius: 5px;
+    font-size: 14px;
+  }
+  /deep/.el-descriptions__header {
+    margin-bottom: 0 !important;
+  }
+</style>

+ 192 - 0
src/SManagement/orderclue_detail/components/upload.vue

@@ -0,0 +1,192 @@
+<template>
+  <div class="file">
+    <!-- <div class="flex-align-center flex-between pionter" v-for="(img,index) in fileLinkList" :key="img.index">
+      <div class="flex-align-center">
+        <img width="30" :src="img.type.split('/')[0] === 'image'?img.url:require('@/assets/file_icons/file.svg')" class="inline-16" alt="">
+        <div class="file__link inline-16">
+          <p>{{img.name}}</p>
+        </div>
+      </div>
+      <i style="color:red;" class="el-icon-delete" @click="handleRemove(index)"></i>
+    </div> -->
+    <file-item
+        :auto="true"
+        :isDownLoad="true"
+        :isDelete='true'
+        :fileData="fileLinkList"
+        @deleteFile="handleRemove">
+    </file-item>
+    <el-upload
+      action="#"
+      :on-change="onChange"
+      :show-file-list="false"
+      :auto-upload="false"
+      multiple>
+      <el-button size="small" type="text" icon="el-icon-paperclip">点击上传</el-button>
+    </el-upload>
+  </div>
+</template>
+
+<script>
+import FileItem from '@/SManagement/orderclue/components/file/index3'
+export default {
+  components: {FileItem},
+  props:['folderid','bindData','type','accept'],
+  name: '',
+  data() {
+    return {
+      imageUrl:'',
+      fileList:[],
+      fileLinkList:[],
+      params: {
+        "classname": "system.attachment.huawei.OBS",
+        "method": "getFileName",
+        "content": {
+          "filename": '',
+          "filetype": '',
+          "parentid": ""//归属文件夹ID
+        }
+      },
+      fileLength:0
+    };
+  },
+  computed:{
+  },
+  watch:{
+  },
+  methods: {
+    onChange (file,filelist) {
+      this.fileList.push(file)
+      console.log(this.fileList);
+
+      this.beforeUpload(file.raw)
+    },
+    beforeUpload (file) {
+      var that = this
+
+      var fileReader = new FileReader();
+
+      fileReader.readAsDataURL(file);
+
+      fileReader.onload = function(e) {
+
+        var result = e.target.result;
+
+        let postfix = file.name.substr(file.name.lastIndexOf('.') + 1)
+
+        that.fileLinkList.push(that.fileType.fileList([{document:file.name,url:result,type:file.type,name:file.name,postfix:postfix}])[0])
+        console.log(that.fileLinkList);
+
+      }
+    },
+    handleRemove (index) {
+      this.fileList = this.fileList.filter((e,idx)=>{
+        if (idx !== index) {
+          return e
+        }
+      })
+      console.log(this.fileList);
+
+      this.fileLinkList = this.fileLinkList.filter((e,idx)=>{
+        if (idx !== index) {
+          return e
+        }
+      })
+    },
+    toUpload (callback) {
+      if (this.fileList.length == 0) callback()
+      this.fileList.forEach(file=>{
+        let index = file.name.lastIndexOf(".");
+        let ext = file.name.substr(index + 1);
+        this.params.content.filename = file.name
+        this.params.content.filetype = ext
+        this.getUploadUrl(file, ext,callback)
+      })
+
+    },
+
+    // 获取华为云上传地址
+    async getUploadUrl (file, ext,callback) {
+      this.params.content.parentid = this.folderid
+      const res = await this.$api.requested(this.params)
+      let url = res.data.uploadurl
+      let obsfilename = res.data.serialfilename
+
+      this.upoladFileToServer(url, file, ext, obsfilename,callback)
+    },
+
+    // 上传到华为云
+    async upoladFileToServer (url, file, ext, obsfilename,callback) {
+      let THIS = this
+      let config = {
+        headers: ext === 'pdf' ? { 'Content-Type': 'application/pdf' } : ext === 'svg'?{ 'Content-Type': 'image/svg+xml' } : { 'Content-Type': 'application/octet-stream' },
+      }
+      let res = await this.$upload.hw_upload(url, file.raw, config)
+      this.createFileRecord(obsfilename,callback)
+
+    },
+
+    // 上传成功以后生成附件记录
+    async createFileRecord (obsfilename,callback) {
+      let obj = {
+        "serialfilename": obsfilename
+      }
+      obj = Object.assign({},obj,this.bindData)
+      let param = {
+        "classname": "system.attachment.huawei.OBS",
+        "method": "uploadSuccess",
+        "content":obj
+      }
+      const res = await this.$api.requested(param)
+      if (res.code ===  1) {
+        callback()
+        this.$emit('onSuccess',res)
+        this.fileList = []
+        this.fileLinkList = []
+      }
+    },
+  },
+};
+</script>
+
+<style scoped>
+.upload_image__panel{
+  position: relative;
+  height:148px;
+  width: 148px;
+  border-radius: 6px;
+  margin-right: 10px;
+  margin-bottom:10px;
+  border: 1px solid #c0ccda;
+  overflow: hidden;
+}
+.upload_image__panel img{
+  width: 100%;
+  height: 100%;
+}
+.upload_image__panel_mod{
+  position: absolute;
+  top:0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  color:#fff;
+  background: rgba(0,0,0,.8);
+  opacity: 0;
+  transition: .3s linear;
+  cursor: pointer;
+}
+.upload_image__panel:hover .upload_image__panel_mod{
+  opacity: 1;
+}
+.pionter{
+  margin:6px 0;
+  padding: 20px 10px;
+  transition: .2s linear;
+  cursor: pointer;
+  border-radius: 5px;
+}
+.pionter:hover{
+  box-shadow: 0 5px 10px rgb(0 0 0 / 10%);
+}
+</style>

+ 202 - 0
src/SManagement/orderclue_detail/components/uploadNew.vue

@@ -0,0 +1,202 @@
+<template>
+  <div class="file">
+    <!-- <div class="flex-align-center flex-between pionter" v-for="(img,index) in fileLinkList" :key="img.index">
+      <div class="flex-align-center">
+        <img width="30" :src="img.type.split('/')[0] === 'image'?img.url:require('@/assets/file_icons/file.svg')" class="inline-16" alt="">
+        <div class="file__link inline-16">
+          <p>{{img.name}}</p>
+        </div>
+      </div>
+      <i style="color:red;" class="el-icon-delete" @click="handleRemove(index)"></i>
+    </div> -->
+<!--    <file-item
+        :auto="true"
+        :isDownLoad="true"
+        :isDelete='true'
+        :fileData="fileLinkList"
+        @deleteFile="handleRemove">
+    </file-item>-->
+    <el-upload
+      action="#"
+      :on-change="onChange"
+      :show-file-list="false"
+      :auto-upload="false"
+      multiple>
+      <el-button size="small" type="text" v-loading.fullscreen.lock="fullscreenLoading" :disabled="disabled">上传附件</el-button>
+    </el-upload>
+  </div>
+</template>
+
+<script>
+import FileItem from '@/SManagement/orderclue/components/file/index3'
+export default {
+  components: {FileItem},
+  props:['folderid','type','accept','id','disabled'],
+  name: '',
+  data() {
+    return {
+      imageUrl:'',
+      fullscreenLoading:false,
+      fileList:[],
+      fileLinkList:[],
+      bindData:{},
+      params: {
+        "classname": "system.attachment.huawei.OBS",
+        "method": "getFileName",
+        "content": {
+          "filename": '',
+          "filetype": '',
+          "parentid": ""//归属文件夹ID
+        }
+      },
+      fileLength:0
+    };
+  },
+  computed:{
+  },
+  watch:{
+  },
+  methods: {
+    onChange (file,filelist) {
+
+      this.fileList.push(file)
+      console.log(this.fileList);
+
+      this.beforeUpload(file.raw)
+    },
+    beforeUpload (file) {
+      var that = this
+
+      var fileReader = new FileReader();
+
+      fileReader.readAsDataURL(file);
+
+      fileReader.onload = function(e) {
+
+        var result = e.target.result;
+
+        let postfix = file.name.substr(file.name.lastIndexOf('.') + 1)
+
+        that.fileLinkList.push(that.fileType.fileList([{document:file.name,url:result,type:file.type,name:file.name,postfix:postfix}])[0])
+        console.log(that.fileLinkList);
+        that.toUpload()
+
+      }
+    },
+    handleRemove (index) {
+      this.fileList = this.fileList.filter((e,idx)=>{
+        if (idx !== index) {
+          return e
+        }
+      })
+      console.log(this.fileList);
+
+      this.fileLinkList = this.fileLinkList.filter((e,idx)=>{
+        if (idx !== index) {
+          return e
+        }
+      })
+    },
+    toUpload (callback) {
+      this.fullscreenLoading = true
+      if (this.fileList.length == 0) callback()
+      this.fileList.forEach(file=>{
+        let index = file.name.lastIndexOf(".");
+        let ext = file.name.substr(index + 1);
+        this.params.content.filename = file.name
+        this.params.content.filetype = ext
+        this.getUploadUrl(file, ext,callback)
+      })
+
+    },
+
+    // 获取华为云上传地址
+    async getUploadUrl (file, ext,callback) {
+      this.params.content.parentid = this.folderid
+      const res = await this.$api.requested(this.params)
+      let url = res.data.uploadurl
+      let obsfilename = res.data.serialfilename
+
+      this.upoladFileToServer(url, file, ext, obsfilename,callback)
+    },
+
+    // 上传到华为云
+    async upoladFileToServer (url, file, ext, obsfilename,callback) {
+      let THIS = this
+      let config = {
+        headers: ext === 'pdf' ? { 'Content-Type': 'application/pdf' } : ext === 'svg'?{ 'Content-Type': 'image/svg+xml' } : { 'Content-Type': 'application/octet-stream' },
+      }
+      let res = await this.$upload.hw_upload(url, file.raw, config)
+      this.createFileRecord(obsfilename,callback)
+
+    },
+
+    // 上传成功以后生成附件记录
+    async createFileRecord (obsfilename,callback) {
+      let obj = {
+        "serialfilename": obsfilename
+      }
+      this.bindData = {
+        "ownertable": 'sat_ordercluefollowuplog',
+        "ownerid": this.id,
+        "usetype": 'default',
+      }
+      obj = Object.assign({},obj,this.bindData)
+      let param = {
+        "classname": "system.attachment.huawei.OBS",
+        "method": "uploadSuccess",
+        "content":obj
+      }
+      const res = await this.$api.requested(param)
+      if (res.code ===  1) {
+        this.fullscreenLoading = false
+        this.$emit('onSuccess',res)
+        this.fileList = []
+        this.fileLinkList = []
+      }
+    },
+  },
+};
+</script>
+
+<style scoped>
+.upload_image__panel{
+  position: relative;
+  height:148px;
+  width: 148px;
+  border-radius: 6px;
+  margin-right: 10px;
+  margin-bottom:10px;
+  border: 1px solid #c0ccda;
+  overflow: hidden;
+}
+.upload_image__panel img{
+  width: 100%;
+  height: 100%;
+}
+.upload_image__panel_mod{
+  position: absolute;
+  top:0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  color:#fff;
+  background: rgba(0,0,0,.8);
+  opacity: 0;
+  transition: .3s linear;
+  cursor: pointer;
+}
+.upload_image__panel:hover .upload_image__panel_mod{
+  opacity: 1;
+}
+.pionter{
+  margin:6px 0;
+  padding: 20px 10px;
+  transition: .2s linear;
+  cursor: pointer;
+  border-radius: 5px;
+}
+.pionter:hover{
+  box-shadow: 0 5px 10px rgb(0 0 0 / 10%);
+}
+</style>

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

@@ -35,7 +35,7 @@
         <BaseInfo :detailInfo="detailInfo"/>
       </div>
       <div slot="slot0">
-        <followDetail ref="followDetail"/>
+        <followDetail ref="followDetail" :disabled="!isHandle || mainData.status === '已无效' || mainData.status === '已过期'"/>
       </div>
       <div slot="slot2" class="container normal-panel">
         <sourceClues></sourceClues>

+ 12 - 7
src/components/normal-basic-layout/details/modules/group/group.vue

@@ -26,8 +26,8 @@
 					<small style="color:#999999ad;margin-top:10px">部门:{{ men.depname?men.depname:"--" }}&emsp;职位:{{ men.position?men.position:"--" }}</small>
 				</div>
       </div>
-      <div v-if="item.teamleader.length === 0">
-        <el-empty description="暂无负责人" :image-size="40"></el-empty>
+      <div v-if="item.teamleader">
+        <el-empty v-if="item.teamleader.length === 0" description="暂无负责人" :image-size="40"></el-empty>
       </div>
     </div>
     <div class="flex-align-center" style="border-bottom:1px solid #f1f2f3;padding:0 10px">
@@ -56,8 +56,8 @@
         </div>
       </div>
 
-      <div v-if="!item.team.length">
-        <el-empty description="暂无成员" :image-size="40"></el-empty>
+      <div v-if="item.team">
+        <el-empty v-if="!item.team.length" description="暂无成员" :image-size="40"></el-empty>
       </div>
       <el-dialog title="设置" :visible.sync="dialogTableVisible" append-to-body width="400px">
         <el-radio v-model="isEdit" label="1"  >允许编辑</el-radio>
@@ -123,14 +123,18 @@ export default {
           "ownerid":this.$route.query.id
         }
       })
-      res.data.length > 0?this.list = res.data:this.list=[
+
+      res.data? res.data.length > 0?this.list = res.data:this.list=[
         {
           ismyteam:1,
           team:[],
           teamleader:[],
           teamname:''
         }
-      ]
+      ]:this.list=[]
+      console.log(this.list,'list')
+
+
 
     },
     async setLeader (item) {
@@ -243,7 +247,8 @@ export default {
   },
   watch: {
     $route () {
-      this.queryGroup()
+      console.log("监听")
+      /*this.queryGroup()*/
     },
   }
 }

+ 15 - 12
src/components/pagination/Pagination1.vue

@@ -1,15 +1,18 @@
 <template>
-  <el-pagination
-    background
-    small
-    @size-change="handleSizeChange"
-    @current-change="handleCurrentChange"
-    :current-page="currentPage"
-    :page-size="pageSize"
-    :pager-count="5"
-    layout="total, prev, pager, next, jumper"
-    :total="total">
-  </el-pagination>
+  <div>
+    <el-pagination
+        background
+        small
+        @size-change="handleSizeChange"
+        @current-change="handleCurrentChange"
+        :current-page="currentPage"
+        :page-size="pageSize"
+        :pager-count="5"
+        layout="total, prev, pager, next, jumper"
+        :total="total">
+    </el-pagination>
+  </div>
+
 </template>
 
 <script>
@@ -56,6 +59,6 @@ export default {
 
 <style scoped>
   .el-pagination {
-    margin-bottom: 16px;
+    margin-bottom: 6px;
   }
 </style>

+ 3 - 1
src/template/menber/index.vue

@@ -31,7 +31,9 @@
 			<i class="el-icon-check iconCheck" v-if="showSelelctIcon(item)"></i>
 		</div>
 	</div>
-  <el-empty v-if="tableData.length === 0" description="暂无数据" :image-size="40"></el-empty>
+  <div v-if="tableData">
+    <el-empty v-if="tableData.length === 0" description="暂无数据" :image-size="40"></el-empty>
+  </div>
   <el-button size="mini" style="margin-top:16px;float:right" @click="onCancel">取 消</el-button>
 	<el-button size="mini" type="primary" style="margin-top:16px;float:right;margin-right:10px" @click="onSelect">确 定</el-button>
  	<div style="margin-top:16px;text-align:left">

+ 3 - 2
src/views/mediaStatistics/modules/salesfunnel.vue

@@ -152,7 +152,7 @@
 </template>
 
 <script>
-import tableTemp from '@/components/table/index5'
+import tableTemp from '@/components/table/index6'
 import { Funnel,G2 } from '@antv/g2plot';
 const G = G2.getEngine('canvas');
 export default {
@@ -161,7 +161,8 @@ export default {
     return {
       chartPie:null,
       flagIndex:'',
-      tableHieght:'calc(10vh)',
+      /*tableHieght:'calc(100vh)',*/
+      tableHieght:'',
       tableData:[],
       person:'',
       depment:'',

+ 35 - 3
src/views/message/index.vue

@@ -14,10 +14,30 @@
               <el-button @click="allRead" size="small">全部阅读</el-button>
             </div>
           </div>
+          <el-row>
+            <el-col :span="14" >
+              <div style="margin-left: 25px">
+                总计:{{total}}
+              </div>
+            </el-col>
+            <el-col :span="10">
+              <div style="float: right;margin-right: 20px">
+                <el-switch
+                    v-model="isRead"
+                    active-text="只看未读"
+                    @change="onRead"
+                >
+                </el-switch>
+              </div>
+            </el-col>
+          </el-row>
+
           <list class="list" :list="list" @messageItemClick="messageItemClick"></list>
-          <pagination :total="total" :pageSize="param.content.pageSize"  :currentPage="param.content.pageNumber"
-                      @pageChange="pageChange">
+
+          <pagination  :total="total" :pageSize="param.content.pageSize"  :currentPage="param.content.pageNumber"
+                       @pageChange="pageChange">
           </pagination>
+
         </div>
       </el-col>
       <el-col :span="12">
@@ -52,6 +72,7 @@ export default {
   data () {
     return {
       currentItem: 1,
+      isRead:false,
       param: {
         "classname": "system.message.Message",
         "method": "queryMessage",
@@ -59,9 +80,10 @@ export default {
           "nocache": true,
           "pageNumber": 1,
           "pageSize": 15,
+          "isread":'',
           "type": '',
           "where": {
-
+            "isread":''
           }
         }
       },
@@ -183,6 +205,16 @@ export default {
 
 
     },
+    onRead(val){
+      console.log(val,'val')
+      if (val){
+        this.param.content.isread = 0
+      }else {
+        this.param.content.isread = ''
+      }
+      this.getMessageList()
+    },
+
     isCategory(data) {
       JSON.parse(sessionStorage.getItem('module_info')).forEach(item1 => {
         item1.modules.forEach(item2 => {