瀏覽代碼

Merge remote-tracking branch 'origin/mergeBranch' into mergeBranch

# Conflicts:
#	src/SDrpManagement/salerPrivatecustomer/detail/modules/detailedData.vue
#	src/SDrpManagement/salerPrivatecustomer/index.vue
qymljy 2 年之前
父節點
當前提交
4fe860f9b7
共有 26 個文件被更改,包括 568 次插入200 次删除
  1. 1 1
      src/Form/marketing2/agent/add.vue
  2. 2 2
      src/Form/marketing2/agent/edit.vue
  3. 1 1
      src/Form/salerPrivatecustomer/edit.vue
  4. 1 1
      src/HDrpManagement/projectStage/modules/stageDetail.vue
  5. 3 2
      src/HManagement/marketing2/agent/details/index.vue
  6. 1 1
      src/HManagement/marketing2/agent/details/modules/accountMoney/index.vue
  7. 1 1
      src/HManagement/marketing2/agent/details/modules/address/list.vue
  8. 1 1
      src/HManagement/marketing2/agent/details/modules/contact/list.vue
  9. 1 1
      src/HManagement/marketing2/agent/details/modules/saleclass/index.vue
  10. 1 1
      src/HManagement/marketing2/agent/details/modules/salescope/list.vue
  11. 2 4
      src/HManagement/marketing2/agent/index.vue
  12. 199 0
      src/SDrpManagement/salerPrivatecustomer/detail/index.vue
  13. 9 1
      src/SDrpManagement/salerPrivatecustomer/index.vue
  14. 60 77
      src/components/normal-basic-layout/details/index.vue
  15. 1 1
      src/components/normal-basic-layout/details/modules/followUp/addLog.vue
  16. 53 47
      src/components/normal-basic-layout/details/modules/followUp/followUp.vue
  17. 16 10
      src/components/normal-basic-layout/details/modules/group/group.vue
  18. 16 17
      src/components/normal-basic-layout/details/modules/group/select_account.vue
  19. 65 0
      src/components/normal-basic-layout/details/modules/tabs/tab.vue
  20. 60 0
      src/components/normal-basic-layout/details/modules/tags/tag.vue
  21. 38 2
      src/components/normal-basic-layout/drawerDetail/index.vue
  22. 6 5
      src/components/normal-basic-layout/index.vue
  23. 2 2
      src/components/scopeOfAuthority/modules/mar_auth.vue
  24. 13 10
      src/router/HManagement.js
  25. 14 11
      src/router/SDrpManagement.js
  26. 1 1
      src/style/style.css

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

@@ -1,7 +1,7 @@
 <template>
   <div>
     <el-button type="primary" size="mini" @click="onShow">新 建</el-button>
-    <el-dialog title="创建经销商" :visible.sync="dialogVisible">
+    <el-dialog title="创建经销商" append-to-body :visible.sync="dialogVisible">
       <el-row :gutter="20">
         <el-form :model="form" ref="form" :rules="rules" size="small" label-position="left" label-width="100px" class="demo-form-inline">
           <el-col :span="24">

+ 2 - 2
src/Form/marketing2/agent/edit.vue

@@ -1,7 +1,7 @@
 <template>
   <div>
     <el-button :type="btnType" size="mini" @click="onShow">编 辑</el-button>
-    <el-dialog title="创建经销商" :visible.sync="dialogVisible">
+    <el-dialog title="创建经销商" append-to-body :visible.sync="dialogVisible">
       <el-row :gutter="20">
         <el-form :model="form" ref="form" :rules="rules" size="small" label-position="left" label-width="100px" class="demo-form-inline">
           <el-col :span="24">
@@ -21,7 +21,7 @@
                     </li>
                   </ul>
                 </div>
-                <el-input slot="reference" v-model="form.enterprisename" @focus="queryEnterpriseArchives" @input.native="onChange"  placeholder="输入企业名称" clearable></el-input>
+                <el-input readonly slot="reference" v-model="form.enterprisename" @focus="queryEnterpriseArchives" @input.native="onChange"  placeholder="输入企业名称" clearable></el-input>
               </el-popover>
             </el-form-item>
           </el-col>

+ 1 - 1
src/Form/salerPrivatecustomer/edit.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="inline-16">
+  <div>
     <el-button size="mini" :disabled="data.datastatus === 2" :type="btnType?btnType:'text'"   @click="show" >编 辑</el-button>
     <el-dialog title="编 辑" :visible.sync="dialogFormVisible" width="600px">
       <div slot="title" style="font-size: 15px">

+ 1 - 1
src/HDrpManagement/projectStage/modules/stageDetail.vue

@@ -237,7 +237,7 @@ export default {
       this.stageData = Object.assign({},this.stageData,res.data)
       this.tool.showMessage(res,()=>{
       })
-      // this.getStageData()
+      this.getStageData()
     },
     // 删除工作内容
     async deleteWork (work) {

+ 3 - 2
src/HManagement/marketing2/agent/details/index.vue

@@ -1,5 +1,6 @@
 <template>
   <basicDetails 
+    style="min-width:80vw"
     ref="details"
     :titleText="mainData.enterprisename"
     formPath="marketing2/agent"
@@ -20,7 +21,7 @@
     </div>
     <div slot="slot0" class="container normal-panel">
       <el-button size="small" type="primary" @click="createAgentAccount" class="normal-margin">创建经销商主账号</el-button>
-      <tableLayout :layout="tablecols" :data="mainData.hrs" :custom="false" height="300px"></tableLayout>
+      <tableLayout :layout="tablecols" :data="mainData.hrs" :custom="false" height="calc(100vh - 455px)"></tableLayout>
     </div>
     <div slot="slot1" class="container normal-panel">
       <salescope :data="mainData"></salescope>
@@ -76,7 +77,7 @@ export default {
       this.changeDataStructure()
     },
     pageChange (id,rowindex) {
-      this.$router.replace({path:'/agent_detail',query:{id:id,rowindex:rowindex}})
+      this.$router.replace({path:this.$route.path,query:{id:id,rowindex:rowindex}})
       this.queryMainData(id)
     },
     changeDataStructure () {

+ 1 - 1
src/HManagement/marketing2/agent/details/modules/accountMoney/index.vue

@@ -1,7 +1,7 @@
 <template>
   <div>
     <!-- <add v-if="tool.checkAuth($route.name,'agent_update') && !detail" class="normal-margin" @onSuccess="onSuccess"></add> -->
-    <tableLayout :layout="tablecols" :data="list" :custom="true" height="calc(100vh - 495px)">
+    <tableLayout :layout="tablecols" :data="list" :custom="true" height="calc(100vh - 405px)">
       <template v-slot:customcol="scope">
         <p>{{scope.column.data[scope.column.columnname]}}</p>
       </template>

+ 1 - 1
src/HManagement/marketing2/agent/details/modules/address/list.vue

@@ -1,7 +1,7 @@
 <template>
   <div>
     <addContact @onAddSuccess="listData" :mainData="mainData"></addContact>
-    <tableLayout :layout="tablecols" :data="list" :custom="true" height="calc(100vh - 495px)" fixedName="operation">
+    <tableLayout :layout="tablecols" :data="list" :custom="true" height="calc(100vh - 455px)" fixedName="operation">
       <template v-slot:customcol="scope">
         <p v-if="scope.column.columnname === 'province'">
           {{scope.column.data['province']}}-{{scope.column.data['city']}}-{{scope.column.data['county']}}

+ 1 - 1
src/HManagement/marketing2/agent/details/modules/contact/list.vue

@@ -1,7 +1,7 @@
 <template>
   <div>
     <addContact @onAddSuccess="listData" :mainData="mainData"></addContact>
-    <tableLayout :layout="tablecols" :data="list" :custom="true" height="calc(100vh - 495px)" fixedName="operation">
+    <tableLayout :layout="tablecols" :data="list" :custom="true" height="calc(100vh - 455px)" fixedName="operation">
       <template v-slot:customcol="scope">
         <p v-if="scope.column.columnname === 'province'">
           {{scope.column.data['province']}}-{{scope.column.data['city']}}-{{scope.column.data['county']}}

+ 1 - 1
src/HManagement/marketing2/agent/details/modules/saleclass/index.vue

@@ -1,7 +1,7 @@
 <template>
   <div>
     <add-sale-class class="normal-margin" @addSuccess="getClassList" v-if="tool.checkAuth($route.name,'add_saleClass') && !detail"/>
-    <tableLayout v-if="saleClassList" :layout="tablecols" :data="saleClassList" :custom="false" height="calc(100vh - 495px)" fixedName="operation">
+    <tableLayout v-if="saleClassList" :layout="tablecols" :data="saleClassList" :custom="false" height="calc(100vh - 405px)" fixedName="operation">
       <template v-slot:opreation="scope">
         <Del v-if="tool.checkAuth($route.name,'delete')" :id="scope.data.sys_enterprise_saleclassid" @onSuccess="getClassList"/>
       </template>

+ 1 - 1
src/HManagement/marketing2/agent/details/modules/salescope/list.vue

@@ -1,7 +1,7 @@
 <template>
   <div>
     <add v-if="tool.checkAuth($route.name,'update') && !detail" class="normal-margin" @onSuccess="onSuccess"></add>
-    <tableLayout :layout="tablecols" :data="list" :custom="true" height="calc(100vh - 495px)">
+    <tableLayout :layout="tablecols" :data="list" :custom="true" height="calc(100vh - 455px)">
       <template v-slot:customcol="scope">
         <p>{{scope.column.data[scope.column.columnname]}}</p>
       </template>

+ 2 - 4
src/HManagement/marketing2/agent/index.vue

@@ -27,7 +27,8 @@
         ref="basicLayout" 
         formPath="marketing2/agent"
         tableName="agentTable" 
-        idName="sa_agentsid" 
+        idName="sa_agentsid"
+        detailPath="/agent_detail"
         :apiId="{query:20221011144903,del:20221011145003}"
         :autoQuery="false"
         :options="options">
@@ -40,9 +41,6 @@
             <p v-else>{{scope.data.column.data[[scope.data.column.columnname]]?scope.data.column.data[[scope.data.column.columnname]]:'--'}}</p>
           </div>
         </template>
-        <template v-slot:tbOpreation="scope">
-          <el-button type="text" size="small" @click="$router.push({path:'/agent_detail',query:{id:scope.data.data.sa_agentsid,rowindex:scope.data.data.rowindex}})">详 情</el-button>
-        </template>
       </basicLayout>
     </div>
   </div>

+ 199 - 0
src/SDrpManagement/salerPrivatecustomer/detail/index.vue

@@ -0,0 +1,199 @@
+<template>
+  <div>
+    <basicDetails
+        ref="details"
+        :titleText="mainData.enterprisename"
+        formPath="salerPrivatecustomer"
+        :editData="mainData"
+        :mainAreaData="mainAreaData"
+        turnPageId="20221012164402"
+        idname="sa_customersid"
+        tags=""
+        :tabs="['详细信息','联系人信息','客户地址','客户财务信息','工商信息','项目商机','报价单','合同信息']"
+        @pageChange="pageChange"
+        @onEditSuccess="queryMainData($route.query.id)">
+      <div slot="tags">
+        <tagPanl slot="tags" :data="tags" :id="mainData.sa_customersid" @onSuccess="queryMainData"></tagPanl>
+        <!-- 使用此插槽可不传[tags] -->
+        <!-- :tabs="['经销商团队','代理区域','营销类别','账户余额']" -->
+<!--        <tagPanl slot="tags" :data="tags" :id="mainData.sa_customersid" @onSuccess="queryMainData"/>-->
+      </div>
+      <div slot="customOperation" >
+        <!-- 此区域提供了自定义操作按钮 -->
+        <el-popover
+            placement="bottom"
+            width="50"
+            trigger="focus"
+            v-model="visible"
+        >
+          <div class="normal-margin">
+            <transactionUser v-if="tool.checkAuth($route.name,'responsible')" @onshow="show"></transactionUser>
+          </div>
+          <div class="normal-margin">
+            <transaction_status v-if="tool.checkAuth($route.name,'transaction')" :id="mainData.sa_customersid" @onshow="onSuccess" @shareSuccess="onSuccess"></transaction_status>
+          </div>
+          <div class="normal-margin" v-show="mainData.datastatus === 0">
+            <lock v-if="tool.checkAuth($route.name,'lock')"  :id="mainData.sa_customersid" @onshow="onSuccess"></lock>
+          </div>
+          <div class="normal-margin" v-show="mainData.datastatus === 2">
+            <unlock v-if="tool.checkAuth($route.name,'unlock')" :id="mainData.sa_customersid" @onshow="onSuccess"></unlock>
+          </div>
+          <div class="normal-margin">
+            <share v-if="tool.checkAuth($route.name,'share') && mainData.poolname === ''" :id="mainData.sa_customersid" @onshow="onSuccess" @shareSuccess="onSuccess"></share>
+          </div>
+          <div class="normal-margin">
+            <send_back v-if="tool.checkAuth($route.name,'back')" :id="mainData.sa_customersid" @onshow="onSuccess" @backSuccess="onSuccess"></send_back>
+          </div>
+          <div class="normal-margin" v-show="mainData.datastatus !== 1">
+            <to_void v-if="tool.checkAuth($route.name,'toVoid')" :id="mainData.sa_customersid" @onshow="onSuccess" @toVoidSuccess="onSuccess"></to_void>
+          </div>
+          <el-button size="mini" slot="reference" icon="el-icon-more" @click="visible = !visible"></el-button>
+        </el-popover>
+      </div>
+      <div slot="slot0" >
+        <detailed :data="this.$route.query.id"></detailed>
+      </div>
+      <div slot="slot1" class="container normal-panel">
+        <contacts :data="this.$route.query.data"></contacts>
+      </div>
+      <div slot="slot2" class="container normal-panel">
+        <address_manage :data="this.$route.query.data"></address_manage>
+      </div>
+    </basicDetails>
+  </div>
+</template>
+
+<script>
+import detailed from './modules/detailedData'
+import contacts from './modules/contacts/list'
+import address_manage from './modules/addressManage/list'
+import transactionUser from "./modules/operation/transactionUser";
+import lock from './modules/operation/lock'
+import unlock from './modules/operation/unlock'
+import share from './modules/operation/share'
+import send_back from './modules/operation/sendBack'
+import to_void from './modules/operation/toVoid'
+import transaction_status from './modules/operation/transactionStatus'
+export default {
+  name: "detail",
+  data() {
+    return {
+      mainData:{},
+      mainAreaData:[],
+      tags:{},
+      visible:false,
+      dialogFormVisible:false,
+      dialogFormLeader:false,
+      form:{
+        status:'',
+        userid:''
+      },
+      users:[],
+    }
+  },
+  components:{
+    detailed,
+    contacts,
+    address_manage
+    ,transactionUser,
+    lock,
+    unlock,
+    share,
+    send_back,
+    to_void,
+    transaction_status
+  },
+  methods:{
+    async queryMainData(id) {
+      const res = await this.$api.requested({
+        "id": 20221012164302,
+        "content": {
+          "sa_customersid": id
+        },
+      })
+      this.mainData = res.data
+      this.$refs['details'].param.content.type = this.$route.query.tabIndex
+      this.$refs['details'].param.content.isExport = false
+      this.$refs['details'].param.content.sa_customersid = [this.mainData.sa_customersid]
+      this.changeDataStructure()
+      this.queryTags(this.mainData.sa_customersid)
+    },
+    show(){
+      this.visible = false
+    },
+    changeDataStructure() {
+      this.mainAreaData = [
+        {
+          label:'客户编号',
+          value:this.mainData.sa_customersid
+        },
+        {
+          label:'客户级别',
+          value:this.mainData.grade
+        },
+        {
+          label:'客户类型',
+          value:this.mainData.type
+        },
+        {
+          label:'上级企业',
+          value:this.mainData.superiorenterprisename
+        },
+        {
+          label:'成交状态',
+          value:this.mainData.tradingstatus
+        },
+        {
+          label:'负责人',
+          value:this.mainData.leadername
+        },
+        {
+          label:'最近跟近时间',
+          value:''
+        },
+        {
+          label:'所属公海',
+          value:this.mainData.poolname
+        }
+      ]
+    },
+    // 监听切换数据,上一页,下一页
+    pageChange (id,rowindex) {
+      this.$router.replace({path:'/customerDetail',query:{id:id,rowindex:rowindex}})
+      this.queryMainData(id)
+    },
+    async queryTags(id){
+      const res = await this.$api.requested({
+        "id": 20220929085401,
+        "content": {
+          "ownertable":'sa_customers',
+          "ownerid":id
+        }
+      })
+      this.tags = res.data
+    },
+    onSuccess(){
+      this.visible = false
+      this.queryMainData(this.$route.query.id)
+      this.$emit('onSuccess')
+    }
+  },
+  mounted () {
+    this.queryMainData(this.$route.query.id)
+  },
+  created() {
+    this.tool.checkAuth(this.$route.name,'update')?'':this.$router.go(-1)
+    /*this.tool.checkAuth(this.$route.name,'toVoid')?'':this.$router.go(-1)*/
+    // this.tool.checkAuth(this.$route.name,'responsible')?'':this.$router.go(-1)
+    // this.tool.checkAuth(this.$route.name,'transaction')?'':this.$router.go(-1)
+    // this.tool.checkAuth(this.$route.name,'lock')?'':this.$router.go(-1)
+    // this.tool.checkAuth(this.$route.name,'unlock')?'':this.$router.go(-1)
+    // this.tool.checkAuth(this.$route.name,'share')?'':this.$router.go(-1)
+    // this.tool.checkAuth(this.$route.name,'back')?'':this.$router.go(-1)
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 9 - 1
src/SDrpManagement/salerPrivatecustomer/index.vue

@@ -1,6 +1,14 @@
 <template>
   <div>
-      <basicLayout  ref="list" formPath="salerPrivatecustomer" tableName="salerPrivatecustomerTable" idName="sa_customersid" :apiId="{query:20221012164402,del:''}" :options="options" :autoQuery="false">
+      <basicLayout
+      ref="list"
+      formPath="salerPrivatecustomer"
+      tableName="salerPrivatecustomerTable"
+      idName="sa_customersid"
+      :apiId="{query:20221012164402,del:''}"
+      :options="options"
+      :autoQuery="false"
+      :detailPath="{path:'/customerDetail',param:{tabIndex:tabIndex}}">
         <template v-slot:titleRight="scope">
           <el-divider direction="vertical"></el-divider>
           <el-dropdown size="medium" @command="handleCommand">

+ 60 - 77
src/components/normal-basic-layout/details/index.vue

@@ -1,76 +1,63 @@
 <template>
-  <div class="container">
-    <div class="container normal-panel normal-margin flex-align-stretch flex-between">
-      <div>
-        <div class="flex-align-center">
+  <div>
+    <div class="container normal-panel sticky">
+      <div class="flex-align-center flex-between normal-margin">
+        <div>
           <p class="appname inline-16">{{routerName}}</p>
-          <div class="flex-align-center">
-            <p class="normal-title inline-16">{{titleText}}</p>
-            <div>
-              <el-button :disabled="rowindex === 1" size="mini" icon="el-icon-arrow-left" @click="previous()"></el-button>
-              <el-button :disabled="rowindex === total" size="mini" @click="next()"><i class="el-icon-arrow-right"></i></el-button>
-            </div>
-          </div>
-        </div>
-        <div v-if="tags">
-          <el-tag style="margin-right:10px" v-for="item in tags" :key="item.index" size="mini" effect="light">{{item}}</el-tag>
+          <p class="normal-title inline-16">{{titleText}}</p>
         </div>
-        <div v-else>
-          <slot name="tags"></slot>
+        <div class="flex-align-center">
+          <cpEdit v-if="tool.checkAuth($route.name,'update')" :formPath="formPath" :data="editData" btnType="default" @onAddSuccess="onSuccess"></cpEdit>
+          <div class="inline-16">
+            <slot name="customOperation"></slot>
+          </div>
+          <div>
+            <el-button :disabled="rowindex === 1" size="mini" icon="el-icon-arrow-left" @click="previous()"></el-button>
+            <el-button :disabled="rowindex === total" size="mini" @click="next()"><i class="el-icon-arrow-right"></i></el-button>
+          </div>
         </div>
       </div>
-      <div style="display:flex">
-        <cpEdit v-if="tool.checkAuth($route.name,'update')" :formPath="formPath" :data="editData" btnType="default" @onAddSuccess="onSuccess"></cpEdit>
-        <slot name="customOperation"></slot>
-      </div>
+      <tagTemp ref="tag" :onwertable="idname.slice(0, this.idname.length - 2)" @onSuccess="onSuccess"></tagTemp>
+      <!-- <group :ownertable="idname"></group> -->
     </div>
-    <el-row :gutter="20">
-      <el-col :span="18">
-        <div class="container normal-panel normal-margin">
-          <el-descriptions title="基本信息" :column="4">
+    <div style="box-sizing: border-box;padding:20px">
+      <el-row :gutter="20">
+        <el-col :span="18">
+          <div class="container normal-panel normal-margin">
+            <el-descriptions title="基本信息" :column="4">
               <el-descriptions-item v-for="item in mainAreaData" :key="item.index" :label="item.label">{{item.value?item.value:'--'}}</el-descriptions-item>
-          </el-descriptions>
-        </div>
-        <div  class="my-tabs">
-          <el-tabs v-model="activeName" type="card">
-            <el-tab-pane v-for="(tab,index) in tabs" :key="index" :label="tab" :name="'tab' + index"></el-tab-pane>
-            <el-tab-pane label="附件" name="file"></el-tab-pane>
-            <el-tab-pane label="操作记录" name="log"></el-tab-pane>
-          </el-tabs>
-        </div>
-        <div v-show="'tab'+index === activeName" v-for="(item,index) in tabs" :key="index">
-          <slot :name="'slot' + index"></slot>
-        </div>
-        <div class="container normal-panel" v-show="activeName === 'file'">
-          <attachmentList :attinfos="attinfo_attachment" @onSuccess="queryAttments">
-            <upload slot="upload" :folderid="folderid"
-              :bindData="{ ownertable: idname.slice(0, idname.length - 2), ownerid: editData[idname], usetype: 'default' }"
-              @onSuccess="queryAttments"></upload>
-          </attachmentList>
-        </div>
-        <slot name="custom"></slot>
-      </el-col>
-      <el-col :span="6">
-        <group :ownertable="idname"></group>
-        <follow-up :ownertable="idname"></follow-up>
-      </el-col>
-    </el-row>
+            </el-descriptions>
+          </div>
+          <tabTemp :tabs="tabs" :editData="editData" :idname="idname">
+            <div :slot="'slot' + index" v-for="(tab,index) in tabs" :key="tab.index">
+              <slot :name="'slot' + index"></slot>
+            </div>
+          </tabTemp>
+          <slot name="custom"></slot>
+        </el-col>
+        <el-col :span="6">
+          <!-- <group :ownertable="idname"></group> -->
+          <follow-up :ownertable="idname"></follow-up>
+        </el-col>
+        
+      </el-row>
+    </div>
     
   </div>
 </template>
 
 <script>
 import cpEdit from '../modules/cpEdit.vue'
-import followUp from './modules/followUp/followUp'
-import group from './modules/group/group'
-import upload from '@/components/upload/hw_obs_upload.vue'
-import attachmentList from '@/components/attachment_list/index.vue'
+import followUp from './modules/followUp/followUp.vue'
+import tagTemp from './modules/tags/tag.vue'
+import tabTemp from './modules/tabs/tab.vue'
+
+import group from './modules/group/group.vue'
+
 export default {
   props:['titleText','mainAreaData','turnPageId','idname','formPath','editData','tags','tabs'],
   data () {
     return {
-      activeName:'tab0',
-      folderid:JSON.parse(sessionStorage.getItem('folderid')).appfolderid,
       routerName:'',
       rowindex:0,
       total:0,
@@ -84,16 +71,15 @@ export default {
             "condition": ""
           }
         }
-      },
-      attinfo_attachment:[]
+      }
     }
   },
   components:{
     cpEdit,
     followUp,
     group,
-    upload,
-    attachmentList
+    tagTemp,
+    tabTemp
   },
   methods:{
     async queryData (pageNumber) {
@@ -102,35 +88,21 @@ export default {
       const res = await this.$api.requested(this.param)
       this.total = res.total
       this.$emit('pageChange',res.data[0][this.idname],res.data[0].rowindex)
+      this.$refs['tag'].queryTag()
     },
     next () {
       this.rowindex += 1
       this.queryData(this.rowindex)
+      
     },
     previous () {
       this.rowindex -= 1
       this.queryData(this.rowindex)
+      
     },
     onSuccess () {
       this.$emit('onEditSuccess')
     },
-    async queryAttments () {
-      const res = await this.$api.requested({
-        "classname": "system.attachment.Attachment",
-        "method": "queryFileLink",
-        "content": {
-          "ownertable": this.idname.slice(0, this.idname.length - 2),
-          "ownerid": this.editData[this.idname],
-          "usetype":""
-        }
-      })
-      this.attinfo_attachment = res.data
-    }
-  },
-  watch: {
-    editData () {
-      this.queryAttments()
-    }
   },
   mounted () {
   },
@@ -142,6 +114,10 @@ export default {
 
 </script>
 <style>
+.detail__head__label{
+  display: inline-block;
+  width: 70px;
+}
 </style>
 <style scoped>
 .appname{
@@ -152,4 +128,11 @@ export default {
   padding: 2px 10px;
   font-size: 12px;
 }
+.my-tabs{
+  background:#eeeeee
+}
+.sticky{
+  position: sticky;
+  top:0;
+}
 </style>

+ 1 - 1
src/components/normal-basic-layout/details/modules/followUp/addLog.vue

@@ -1,7 +1,7 @@
 <template>
   <div>
     <el-button type="default" size="mini" @click="dialogFormVisible = true">新 建</el-button>
-    <el-dialog title="创建跟进日志" width="600px" :visible.sync="dialogFormVisible">
+    <el-dialog title="创建跟进日志" width="600px" append-to-body :visible.sync="dialogFormVisible">
       <el-form :model="form" label-position="top" label-width="80px">
         <el-form-item label="跟进日志">
           <el-input type="textarea" :rows="3" v-model="form.content" placeholder="请输入跟进日志" autocomplete="off"></el-input>

+ 53 - 47
src/components/normal-basic-layout/details/modules/followUp/followUp.vue

@@ -1,42 +1,46 @@
 <template>
-  <div class="normal-panel">
-    <div class="container flex-align-center flex-between normal-margin">
+  <div class="normal-panel follow__panel">
+    <div class="container flex-align-center flex-between">
       <p>跟进动态</p>
       <addLog :ownertable="ownertable" @onSuccess="queryLogs"></addLog>
     </div>
-    <div  class="scroll-panel container">
+    <div  class="container">
       <div v-if="logList.length === 0">
         <el-empty description="暂无记录"></el-empty>
       </div>
-      <div v-for="i in logList" :key="i.index">
-        <div class="flex-align-center flex-between">
-          <div class="flex-align-center">
-            <p class="avatar inline-16">{{i.changeby.substr(0,1)}}</p>
-            <div>
-              <p style="font-size:14px">{{i.changeby}}</p>
-              <small style="color:#999">{{i.createdate}}</small>
-            </div>
-          </div>
-        </div>
-        <div class="follow-progress container normal-panel">
-          <p style="margin-bottom:5px">{{i.content}}</p>
-          <div class="flex-align-center" style="margin-bottom:5px">
-            <previewImage v-show="checkFileType(img.postfix) === 'img'" style="width:80px;height:80px;margin-left:5px" v-for="img in i.attinfos" :key="img.index" :image="img" :deletebtn="true" @onSuccess="queryLogs"></previewImage>
-          </div>
-          <div v-show="checkFileType(file.postfix) === 'file'"  class="flex-align-center pionter" style="margin-bottom:10px;" v-for="file in i.attinfos" :key="file.index">
-            <a class="file__link" :href="file.url">{{file.document}}</a>
-            <i style="color:red;" class="el-icon-delete" @click="deleteFile(file)"></i>
-          </div>
-          <div style="text-align:right">
-            <upload class="inline-16" slot="upload" 
-              :folderid="folderid"
-              btntype="icon"
-              :bindData="{ ownertable: 'sys_datafollowup', ownerid: i.sys_datafollowupid,usetype: 'default' }"
-              @onSuccess="queryLogs">
-            </upload>
-            <el-button size="small" type="text" @click="deleteLogs(i)">删 除</el-button>
-          </div>
-        </div>
+      <div>
+        <el-timeline>
+          <el-timeline-item
+            v-for="i in logList" :key="i.index"
+            :timestamp="i.createdate">
+              <div slot="dot" class="dot"></div>
+              <div class="step__panel normal-margin">
+                <div class="flex-align-stretch flex-between normal-margin">
+                  <p><small>跟进人:</small>{{i.changeby}}</p>
+                  <small style="color:#999">{{i.createdate}}</small>
+                </div>
+                <div class="follow-progress">
+                  <p style="margin-bottom:5px;font-size:14px">{{i.content}}</p>
+                  <div class="flex-align-center" style="margin-bottom:5px">
+                    <previewImage v-show="checkFileType(img.postfix) === 'img'" style="width:80px;height:80px;margin-left:5px" v-for="img in i.attinfos" :key="img.index" :image="img" :deletebtn="true" @onSuccess="queryLogs"></previewImage>
+                  </div>
+                  <div v-show="checkFileType(file.postfix) === 'file'"  class="flex-align-center pionter" style="margin-bottom:10px;" v-for="file in i.attinfos" :key="file.index">
+                    <a class="file__link" :href="file.url">{{file.document}}</a>
+                    <i style="color:red;" class="el-icon-delete" @click="deleteFile(file)"></i>
+                  </div>
+                  <div style="text-align:right">
+                    <upload class="inline-16" slot="upload" 
+                      :folderid="folderid"
+                      btntype="icon"
+                      :bindData="{ ownertable: 'sys_datafollowup', ownerid: i.sys_datafollowupid,usetype: 'default' }"
+                      @onSuccess="queryLogs">
+                    </upload>
+                    <el-button size="small" type="text" @click="deleteLogs(i)">删 除</el-button>
+                  </div>
+                </div>
+              </div>
+          </el-timeline-item>
+        </el-timeline>
       </div>
     </div>
   </div>
@@ -115,25 +119,18 @@ export default {
 
 </script>
 <style>
+.el-step__description{
+  padding-right:0px !important;
+}
 </style>
 <style scoped>
-.avatar{
-  height:40px;
-  width: 40px;
-  border-radius: 100%;
-  text-align: center;
-  line-height: 40px;
-  color:#fff;
-  font-weight: 500;
-  background: #3874F6;
+.step__panel{
+  background-color: #eff4ff;
+  padding: 16px;
+  border-radius: 5px;
+  color:#666
 }
 .follow-progress{
-  border-bottom: 1px solid #f1f2f3;
-  margin-bottom:16px;
-}
-.scroll-panel{
-  max-height: 700px;
-  overflow-y:scroll ;
 }
 .file__link{
   color:#999;
@@ -148,4 +145,13 @@ export default {
 .pionter{
   cursor: pointer;
 }
+.sticky{
+  position: sticky;
+  top:0px;
+  /* background: #fff; */
+  z-index: 9999;
+}
+.dot{
+  background:#fff;height:10px;width:10px;border-radius:100%;border:2px solid #3874F6;
+}
 </style>

+ 16 - 10
src/components/normal-basic-layout/details/modules/group/group.vue

@@ -1,21 +1,26 @@
 <template>
-  <div class="container normal-panel normal-margin">
-    <div class="flex-align-center flex-between normal-margin">
-      <p>负责团队</p>
-      <accountDialog :ownertable="ownertable" @onSuccess="queryGroup"></accountDialog>
+<div class="flex-align-center">
+  <p class="detail__head__label">团队:</p>
+  <div  v-for="item in list" :key="item.index" class="normal-panel">
+    <div class="flex-align-center flex-between">
+      <p>{{item.teamname}}</p>
     </div>
     <div>
-      <p v-if="list.length === 0" class="avatar" style="background:#999;">无</p>
-      <el-tooltip v-for="item in list" :key="item.index" effect="dark" :content="item.name" placement="top-start">
-        <p class="avatar inline-16" :class="item.isleader === 1?'leader':''" >{{item.name.substr(0, 1)}}
+      <el-tag style="margin-right:10px" size="mini" :type="men.isleader === 1?'warning':'primary'" effect="dark" v-for="men in item.team" :key="men.index" >
+        {{men.name}}
+      </el-tag>
+      <!-- <el-tooltip v-for="men in item.team" :key="men.index" effect="dark" :content="men.name" placement="top-start">
+        <p class="avatar inline-16" :class="men.isleader === 1?'leader':''" >{{men.name.substr(0, 1)}}
           <span class="avatar__model">
-            <i style="margin-right:5px" class="el-icon-user" @click="setLeader(item)"></i>
-            <i class="el-icon-delete" @click="deleteGroupAccount(item)"></i>
+            <i style="margin-right:5px" class="el-icon-user" @click="setLeader(men)"></i>
+            <i class="el-icon-delete" @click="deleteGroupAccount(men)"></i>
           </span>
         </p>
-      </el-tooltip>
+      </el-tooltip> -->
     </div>
   </div>
+  <accountDialog :ownertable="ownertable" @onSuccess="queryGroup"></accountDialog>
+</div>
 </template>
 
 <script>
@@ -41,6 +46,7 @@ export default {
         }
       })
       this.list = res.data
+      console.log(res.data,'----')
     },
     async setLeader (item) {
       const res = await this.$api.requested({

+ 16 - 17
src/components/normal-basic-layout/details/modules/group/select_account.vue

@@ -1,7 +1,7 @@
 <template>
   <div>
-    <el-button type="default" size="mini" @click="onShow(dialogTableVisible = true)">添 加</el-button>
-    <el-dialog title="选择团队人员" :visible.sync="dialogTableVisible" width="600px">
+    <el-button type="text" size="mini" icon="el-icon-edit" @click="onShow(dialogTableVisible = true)">添 加</el-button>
+    <el-dialog title="选择团队人员" append-to-body :visible.sync="dialogTableVisible" width="600px">
       <el-form size="small" inline label-position="left" label-width="50px" :model="search">
         <el-form-item label="搜索">
           <el-input v-model="params.content.where.condition" prefix-icon="el-icon-search" placeholder="员工名称" @clear="listData(params.content.pageNumber = 1)" @keyup.native.enter="listData(params.content.pageNumber = 1)" clearable></el-input>
@@ -14,20 +14,20 @@
       tooltip-effect="dark"
       style="width: 100%"
       :header-cell-style="{background:'#EEEEEE',color:'#333'}"
+      border
       stripe>
-      <el-table-column
-        prop="accountno"
-        label="账号"
-        width="120">
-      </el-table-column>
       <el-table-column
         prop="name"
         label="昵称"
         width="120">
       </el-table-column>
       <el-table-column
-        prop="usertypename"
-        label="类型">
+        prop="depname"
+        label="部门">
+      </el-table-column>
+      <el-table-column
+        prop="position"
+        label="职位">
       </el-table-column>
        <el-table-column
         label="操作"
@@ -70,15 +70,14 @@ export default {
     return {
       dialogTableVisible:false,
       params:{
-        classname: "webmanage.users.users",
-        method: "query_userList",
+        id:'20221018122201',
         content: {
-          pageNumber: 1,
-          pageSize: 10,
-          where: {
-            condition: "",
-            status: "ACTIVE",
-          },
+          "ownertable":this.ownertable,
+          "ownerid":this.$route.query.id,
+          "where":{
+            "condition":"",
+            "withoutselect":1
+          }
         },
       },
       search:{},

+ 65 - 0
src/components/normal-basic-layout/details/modules/tabs/tab.vue

@@ -0,0 +1,65 @@
+<template>
+  <div>
+    <div class="my-tabs">
+      <el-tabs v-model="activeName" type="card">
+        <el-tab-pane v-for="(tab,index) in tabs" :key="index" :label="tab" :name="'tab' + index"></el-tab-pane>
+        <el-tab-pane label="附件" name="file"></el-tab-pane>
+        <el-tab-pane label="操作记录" name="log"></el-tab-pane>
+      </el-tabs>
+    </div>
+
+    <div v-show="'tab'+index === activeName" v-for="(item,index) in tabs" :key="index">
+      <slot :name="'slot' + index"></slot>
+    </div>
+
+    <div class="container normal-panel" v-show="activeName === 'file'">
+      <attachmentList :attinfos="attinfo_attachment" @onSuccess="queryAttments">
+        <upload slot="upload" :folderid="folderid"
+          :bindData="{ ownertable: idname.slice(0, idname.length - 2), ownerid: editData[idname], usetype: 'default' }"
+          @onSuccess="queryAttments"></upload>
+      </attachmentList>
+    </div>
+  </div>
+</template>
+
+<script>
+import attachmentList from '@/components/attachment_list/index.vue'
+import upload from '@/components/upload/hw_obs_upload.vue'
+
+export default {
+  props:['tabs','editData','idname'],
+  components:{
+    attachmentList,
+    upload
+  },
+  data () {
+    return {
+      activeName:'tab0',
+      attinfo_attachment:[],
+      folderid:JSON.parse(sessionStorage.getItem('folderid')).appfolderid,
+    }
+  },
+  methods:{
+    async queryAttments () {
+      const res = await this.$api.requested({
+        "classname": "system.attachment.Attachment",
+        "method": "queryFileLink",
+        "content": {
+          "ownertable": this.idname.slice(0, this.idname.length - 2),
+          "ownerid": this.editData[this.idname],
+          "usetype":""
+        }
+      })
+      this.attinfo_attachment = res.data
+    }
+  },
+  watch: {
+    editData () {
+      this.queryAttments()
+    }
+  },
+}
+
+</script>
+<style>
+</style>

+ 60 - 0
src/components/normal-basic-layout/details/modules/tags/tag.vue

@@ -0,0 +1,60 @@
+<template>
+  <div>
+    <p class="detail__head__label">标签展示:</p>
+    <el-tag style="margin-right:10px" v-for="item in option" :key="item.rowindex" size="mini" :type="hasTas(item)?'primary':'info'" :effect="hasTas(item)?'dark':'plain'" @click.native="addTag(item)">{{item.tag}}</el-tag>
+  </div>
+</template>
+
+<script>
+export default {
+  props:['onwertable'],
+  data () {
+    return {
+      datatag:[],
+      option:[]
+    }
+  },
+  methods:{
+    async queryTag () {
+      const res  = await this.$api.requested({
+        "id": 20220929085401,
+        "content": {
+          "ownertable":this.onwertable,
+          "ownerid":this.$route.query.id
+        }
+      })
+      this.option = res.data.option
+      this.datatag = res.data.datatag
+    },
+    async addTag (item) {
+      console.log(item.tag,this.datatag)
+      if (this.hasTas(item)) {
+        this.datatag = this.datatag.filter(e=>{
+          return e !== item.tag
+        })
+      } else {
+        this.datatag.push(item.tag)
+      }
+      const res  = await this.$api.requested({
+        "id": 20220929090901,
+        "content": {
+          "ownertable":this.onwertable,
+          "ownerid":this.$route.query.id,
+          "datatag":this.datatag
+        }
+      })
+      res.code === 1?this.queryTag():''
+    },
+    hasTas (item) {
+      let _isSame =  this.datatag.some(tag=>tag === item.tag)
+      return _isSame
+    }
+  },
+  mounted () {
+    this.queryTag()
+  }
+}
+
+</script>
+<style>
+</style>

+ 38 - 2
src/components/normal-basic-layout/drawerDetail/index.vue

@@ -1,12 +1,48 @@
 <template>
-  <div></div>
+  <div>
+    <el-button size="small" type="text" @click="onShow(drawer=true)">详情2</el-button>
+    <el-drawer
+      title="我是标题"
+      :visible.sync="drawer"
+      :with-header="false"
+      direction="rtl"
+      size="90%">
+      <div class="detail__panel">
+        <router-view v-if = "drawer"/>
+      </div>
+    </el-drawer>
+  </div>
 </template>
 
 <script>
 export default {
-
+  props:['data','detailPath','idName'],
+  components:{
+  },
+  computed:{
+	},
+  data () {
+    return {
+      drawer:false
+    }
+  },
+  methods:{
+    onShow () {
+      let query = {id:this.data[this.idName],rowindex:this.data.rowindex}
+      this.$router.push({path:this.detailPath.path,query:Object.assign({},query,this.detailPath.param)})
+    }
+  }
 }
 
 </script>
 <style>
+</style>
+<style scoped>
+.detail__panel{
+  background:#eeeeee;
+  overflow-y: scroll;
+  font-size: 14px;
+  color:#666;
+  height:100vh;
+}
 </style>

+ 6 - 5
src/components/normal-basic-layout/index.vue

@@ -24,10 +24,7 @@
       </div>
       <div class="flex-align-center flex-between">
         <div class="flex-align-center">
-          <el-input placeholder="请输入内容" v-model="param.content.where.condition" @keyup.native.enter="listData(param.content.pageNumber = 1)" @clear="listData(param.content.pageNumber = 1)" style="width:350px" size="mini" class="input-with-select" clearable>
-            <el-select v-if="options.length > 0" v-model="select" slot="prepend" style="width:100px" placeholder="请选择" @change="selectChange">
-              <el-option v-for="item in options" :key="item.index" :label="item.label" :value="item.value"></el-option>
-            </el-select>
+          <el-input placeholder="请输入内容" v-model="param.content.where.condition" @keyup.native.enter="listData(param.content.pageNumber = 1)" @clear="listData(param.content.pageNumber = 1)" style="width:300px" size="mini" class="input-with-select" clearable>
             <el-button slot="append" icon="el-icon-search" @click="listData(param.content.pageNumber = 1)">查 询</el-button>
           </el-input>&nbsp;
           <slot name="custom"></slot>
@@ -45,6 +42,7 @@
       </template>
       <template v-slot:opreation="scope">
         <cpEdit v-if="tool.checkAuth($route.name,'update')" :data="scope.data" btnType="text" :formPath="formPath" @onAddSuccess="listData(param.content.pageNumber = 1)"></cpEdit>
+        <drawerTemp v-if="detailPath" :data="scope.data" :detailPath="detailPath" :idName="idName"></drawerTemp>
         <slot :data="scope" name="tbOpreation"></slot>
       </template>
     </tableComponent>
@@ -66,14 +64,17 @@
 
 <script>
 import excel from '@/components/export_excel/index.vue'
+
 export default {
-  props:['tableName','idName','tableData','apiId','formPath','options','autoQuery'],
+  props:['tableName','idName','tableData','apiId','formPath','options','autoQuery','detailPath'],
   components:{
     tableComponent: () => import('./modules/table.vue'),
     setColumn: () => import('./modules/setColumn.vue'),
     cpAdd: () => import('./modules/cpAdd'),
     cpEdit: () => import('./modules/cpEdit'),
     setFixed: () => import('./modules/setFixed'),
+    drawerTemp:() =>  import('./drawerDetail/index'),
+
     excel
   },
   data () {

+ 2 - 2
src/components/scopeOfAuthority/modules/mar_auth.vue

@@ -87,8 +87,8 @@ export default {
         "classname": "webmanage.sale.salearea.salearea",
         "method": "query_area_auth",
         "content": {
-            "obiectId":  this.$route.query.id?this.$route.query.id:this.obiectId,
-            "obiectName": this.obiectName
+          "obiectId":  this.$route.query.id?this.$route.query.id:this.obiectId,
+          "obiectName": this.obiectName
         },
 
       })

+ 13 - 10
src/router/HManagement.js

@@ -111,16 +111,19 @@ const HManagement = [
       ast_nav: true,
       keeproute:true
     },
-    component: () => import(/* webpackChunkName: "about" */ '@/HManagement/marketing2/agent/index.vue')
-  },{
-    path: '/agent_detail',
-    name: 'agentManage',
-    meta: {
-      title: '经销商详情',
-      ast_nav: true,
-      keeproute: true
-    },
-    component: () => import(/* webpackChunkName: "about" */ '@/HManagement/marketing2/agent/details/index.vue')
+    component: () => import(/* webpackChunkName: "about" */ '@/HManagement/marketing2/agent/index.vue'),
+    children:[
+      {
+        path: '/agent_detail',
+        name: 'agentManage',
+        meta: {
+          title: '经销商详情',
+          ast_nav: true,
+          keeproute: true
+        },
+        component: () => import(/* webpackChunkName: "about" */ '@/HManagement/marketing2/agent/details/index.vue')
+      }
+    ]
   }, {
     path: '/salerManage',
     name: 'salerManage',

+ 14 - 11
src/router/SDrpManagement.js

@@ -56,18 +56,21 @@ const SDrpManagement = [
       ast_nav:true,
       keeproute: true
     },
-    component: () => import(/* webpackChunkName: "about" */ '@/SDrpManagement/salerPrivatecustomer/index')
-  },
-  {
-    path: '/customerDetail',
-    name: 'salerPrivatecustomer',
-    meta: {
-      title: '客户详情',
-      ast_nav:true,
-      keeproute: true
-    },
-    component: () => import(/* webpackChunkName: "about" */ '@/SDrpManagement/salerPrivatecustomer/detail/customerDetail')
+    component: () => import(/* webpackChunkName: "about" */ '@/SDrpManagement/salerPrivatecustomer/index'),
+    children:[
+      {
+        path: '/customerDetail',
+        name: 'salerPrivatecustomer',
+        meta: {
+          title: '客户详情',
+          ast_nav:true,
+          keeproute: true
+        },
+        component: () => import(/* webpackChunkName: "about" */ '@/SDrpManagement/salerPrivatecustomer/detail/customerDetail')
+      }
+    ]
   },
+
   {
     path: '/salerPublicCustomer',
     name: 'salerPublicCustomer',

+ 1 - 1
src/style/style.css

@@ -148,4 +148,4 @@ ul{
   background-color: #4F7BFD !important;
   color:#fff !important;
   border-radius:3px
-}
+}