瀏覽代碼

2023-7-19

codeMan 2 年之前
父節點
當前提交
b542a96acb

+ 1 - 0
src/App.vue

@@ -40,6 +40,7 @@
   }
 </script>
 <style>
+
 body{
   font:16px/1.5 Helvetica Neue,Helvetica,Arial,Microsoft Yahei,Hiragino Sans GB,Heiti SC,WenQuanYi Micro Hei,sans-serif;
   font-family: "微软雅黑";

+ 17 - 3
src/HDrpManagement/collectionRule/index.vue

@@ -3,7 +3,8 @@
   <div>
     <normalLayout  @onRefresh="inputChange">
       <div slot="titleRight">
-        <Add v-if="tool.checkAuth($route.name,'insert')" @onSuccess="listData()"/>
+        <Add class="inline-16" v-if="tool.checkAuth($route.name,'insert')" @onSuccess="listData()"/>
+        <excel class="inline-16" :tablecols="layout" :param="params" :total="total" :excelTitle="$route.meta.title"></excel>
       </div>
       <div slot="content">
         <div class="normal-card">
@@ -44,6 +45,7 @@
 <script>
 import Table from './modules/table'
 import Add from './components/add'
+import excel from './modules/excel'
 import {mapGetters} from "vuex";
 export default {
   data () {
@@ -60,10 +62,22 @@ export default {
         }
       },
       total:0,
-      list:[]
+      list:[],
+      layout:[
+        {title:'收款条件编码',columnname:'ruleno'},
+        {title:'描述',columnname:'remarks'},
+        {title:'订单审核',columnname:'oder'},
+        {title:'订单立账额度',columnname:'amountrate'},
+        {title:'订单后置天数',columnname:'oderdays'},
+        {title:'发货销售出库审核',columnname:'fahuo'},
+        {title:'发货后置天数',columnname:'fahuodays'},
+        {title:'发票发票审核',columnname:'fapiao'},
+        {title:'发票后置天数',columnname:'fapiaodays'},
+        {title:'是否默认条件',columnname:'isdefault'},
+      ]
     }
   },
-  components:{Table,Add},
+  components:{Table,Add,excel},
   created () {
     this.listData()
   },

+ 91 - 0
src/HDrpManagement/collectionRule/modules/excel.vue

@@ -0,0 +1,91 @@
+<template>
+  <div>
+    <el-button type="primary" size="small" @click="submit()" plain>导 出</el-button>
+  </div>
+</template>
+
+<script>
+export default {
+  props:['tablecols','param','excelTitle','total','specialKey'],
+  data () {
+    return {}
+  },
+  methods:{
+    async submit () {
+      let data = {}
+      // 如果传入了total,需要赋值保证数量准确性
+      // data = Object.assign({},data,this.param)
+      data = JSON.parse(JSON.stringify(this.param))
+      if (this.total) {
+        data.content.pageSize = this.total
+      }
+      data.content.isAll = false
+      const res = await this.$api.requested(data)
+
+      res.data.forEach(item => {
+        if (item.point == '订单审核') {
+          item.oder = '是'
+          item.oderdays = item.days
+        } else if (item.point == '销售出库审核') {
+          item.fahuo = '是'
+          item.fahuodays = item.days
+        } else if (item.point == '发票审核') {
+          item.fapiao = '是'
+          item.fapiaodays = item.days
+        }
+        item.isdefault = item.isdefault ? '是' : '否'
+      })
+
+      if (this.specialKey) {
+        res.data.forEach(e=>{
+          this.specialKey.forEach(s=>{
+            e[s.key] = e[s.key]? e[s.key]:[]
+            e[s.key] = e[s.key].map(k=>{return s.value?k[s.value]:k}).toString()
+          })
+        })
+      }
+      let table = JSON.parse(JSON.stringify(this.tablecols))
+      console.log(table);
+      table.forEach((e,index) => {
+        // 由于表格数据结构问题这里需要判断一下
+        if (e.title === '省市县') {
+          table[index].title = '省'
+          table.splice(index + 1,0,{title:'市',columnname:'city'},{title:'县',columnname:'county'})
+        }else if(e.title === '标签'){
+          res.data.forEach(e => {
+            if (e.tag.length !== 0){
+              e.tag = e.tag_sys + ',' + e.tag
+            }else {
+              e.tag = e.tag_sys
+            }
+          })
+        }else if(e.title === '项目类型'){
+          res.data.forEach(e => {
+            e.projecttype = e.projecttype + '-' + e.projecttype_remarks
+          })
+        } else if (e.title === '授权角色') {
+          res.data.forEach(e => {
+            e.roleName = e.userrole.map(item => item.remarks).join(',')
+          })
+        } else if (e.title === '业务员') {
+          res.data.forEach(e => {
+            e.salesman = e.leader?e.leader.length !== 0?e.leader[0].name:'':''
+            console.log(e.salesman = '111')
+          })
+
+        }
+      });
+      let hd = table.map(e=>{
+        return e.title
+      })
+      let ft = table.map(e=>{
+        return e.columnname
+      })
+      this.tool.exportExcel(hd,ft,res.data,this.excelTitle)
+    }
+  }
+}
+
+</script>
+<style>
+</style>

+ 1 - 0
src/HDrpManagement/collectionRule/modules/table.vue

@@ -12,6 +12,7 @@
       <el-table-column
           prop="remarks"
           label="描述"
+          width="250px"
           >
       </el-table-column>
       <el-table-column label="应收款期计算依据">

+ 137 - 15
src/HDrpManagement/customerPortrait/index.vue

@@ -3,16 +3,17 @@
     <basicLayout 
     ref="list" 
     tableName="publicCustomerTable" 
-    idName="sa_accountclassid" 
+    idName="sa_customersid" 
     :apiId="{query:20230713132804}" 
     :options="options"
     :isExport="false"
     @listCreate="listCreate"
+    :hideSearch="true"
     >
-      <div slot="custom" style="display:flex">
+      <div slot="custom" style="display:flex;flex-wrap:wrap">
         <div class="mt-10">
-          <label  class="search__label" >部门:</label>
-          <el-select class="inline-16" v-model="dep" size="small" placeholder="请选择部门" clearable @change="depChange">
+          <label  class="search__label">部门:</label>
+          <el-select class="inline-24" v-model="form.dep" size="small" placeholder="请选择部门" clearable @change="depChange">
             <el-option
                 v-for="item in selectList.dep"
                 :key="item.departmentid"
@@ -24,7 +25,7 @@
 
         <div class="mt-10">
           <label  class="search__label" >人员:</label>
-          <el-select class="inline-16" v-model="people" size="small" placeholder="请选择部门" clearable @change="peopleChange">
+          <el-select class="inline-24" v-model="form.people" size="small" placeholder="请选择部门" clearable @change="peopleChange">
             <el-option
                 v-for="item in selectList.hr"
                 :key="item.userid"
@@ -34,8 +35,57 @@
           </el-select>
         </div>
 
+        <div class="mt-10">
+          <label  class="search__label" >客户类型:</label>
+          <el-select v-model="form.type" class="inline-24" placeholder="请选择客户类型" size="small" clearable @change="selectChange">
+            <el-option
+              v-for="item in customerType"
+              :key="item.value"
+              :label="item.value"
+              :value="item.value">
+            </el-option>
+          </el-select>
+        </div>
+
+        <div class="mt-10">
+          <label  class="search__label" >标签类型:</label>
+          <el-select v-model="form.tag" class="inline-24" placeholder="请选择标签" @change="selectChange" size="small" >
+            <el-option
+              v-for="item in tagType"
+              :key="item.value"
+              :label="item.value"
+              :value="item.value">
+            </el-option>
+          </el-select>
+        </div>
+
+        <div  class="mt-10">
+          <label class="search__label">合作状态:</label>
+          <el-select class="inline-24" v-model="form.status" size="small" placeholder="请选择" @change="selectChange" clearable>
+            <el-option
+                v-for="item in hezuoStatus"
+                :key="item.value"
+                :label="item.value"
+                :value="item.value">
+            </el-option>
+          </el-select>
+        </div>
+          <div  class="mt-10">
+            <label class="search__label">成交状态:</label>
+            <el-select  class="inline-24" v-model="form.tradingstatus" size="small" placeholder="请选择" @change="selectChange" clearable>
+              <el-option
+                  v-for="item in overStatus"
+                  :key="item.value"
+                  :label="item.value"
+                  :value="item.value">
+              </el-option>
+            </el-select>
+          </div>
+
+        
+
         <div class="mt-10" style="margin-right:10px">
-          <label  class="search__label" >范围:</label>
+          <label  class="search__label" >时间范围:</label>
           <el-date-picker
               size="small"
               @change="timeChange"
@@ -49,7 +99,10 @@
           </el-date-picker>
         </div>
 
-        
+        <div class="mt-10" style="margin-right:10px">
+          <el-input style="width:200px;" placeholder="搜索" suffix-icon="el-icon-search" v-model="form.condition" @keyup.native.enter="selectChange" @clear="selectChange" size="small" class="input-with-select inline-16 layout_search__panel" clearable>
+          </el-input>
+        </div>
       </div>
       <template v-slot:tbList="scope">
         <div v-if="scope.data.column.columnname === 'sys_tag'">
@@ -121,14 +174,47 @@ export default {
           "isExport": false,
           "isend": 0,
           where:{
-            a:''
+            condition:''
           }
         }
       },
-      dep:'',
-      people:'',
+      form: {
+        "dep":'',
+        "people":'',
+        "condition": "",
+        "tag": "",
+        "status": "",
+        "type": "",
+        "tradingstatus": "",
+        "begindate":"",
+        "enddate":""
+      },
       selectList:[],
-      dateSelect:[]
+      dateSelect:[],
+      customerType:[],
+      tagType:[],
+      hezuoStatus:[
+        {
+          value:'潜在'
+        },
+        {
+          value:'合作中'
+        },
+        {
+          value:'已终止'
+        }
+      ],
+      overStatus:[
+        {
+          value:'未成交'
+        },
+        {
+          value:'已成交'
+        },
+        {
+          value:'多次成交'
+        }
+      ]
     }
   },
   computed: {
@@ -189,19 +275,25 @@ export default {
       this.selectList = res.data
       console.log(this.selectList,'范围选择数据');
     },
+    selectChange () {
+      this.$refs.list.param.content.where = this.form
+      this.$refs.list.listData()
+    },
     timeChange () {
       this.$refs.list.param.content.where.begindate = this.dateSelect[0]
       this.$refs.list.param.content.where.enddate = this.dateSelect[1]
       this.$refs.list.listData()
     },
     depChange(){
+      this.form.people = ''
       this.$refs.list.param.content.type = 1
-      this.$refs.list.param.content.dataid = this.dep
+      this.$refs.list.param.content.dataid = this.form.dep
       this.$refs.list.listData()
     },
     peopleChange(){
+      this.form.dep = ''
       this.$refs.list.param.content.type = 0
-      this.$refs.list.param.content.dataid = this.people
+      this.$refs.list.param.content.dataid = this.form.people
       this.$refs.list.listData()
     },
     handleSizeChange(val) {
@@ -215,12 +307,42 @@ export default {
       this.listData()
     },
   },
-  created () {
+  async created () {
     this.getDepAndpeople()
+    /* 获取客户类型 */
+    let res = await this.$store.dispatch('optiontypeselect','customertypemx')
+    this.customerType = res.data
+
+    let res2 = await this.$api.requested({
+      id:20221013104401,
+      content: {
+        pageNumber:1,
+        pageSize:1000,
+        isExport:0,
+        sys_systemtagid:2
+      }
+    })
+    this.tagType = res2.data
+    console.log(this.tagType);
+
+    this.form.people = JSON.parse(sessionStorage.getItem('active_account')).name
   }
+
 }
 </script>
 
 <style scoped>
-
+*{
+  box-sizing: border-box;
+}
+.search__label{
+  white-space: nowrap;
+}
+.mt-10{
+  display: flex;
+  align-items: center;
+}
+.el-select {
+  width: 160px;
+}
 </style>

+ 0 - 13
src/HDrpManagement/customerPortrait/modules/avatarInfo.vue

@@ -1,13 +0,0 @@
-<template>
-    
-</template>
-
-<script>
-export default {
-  
-}
-</script>
-
-<style scoped>
-
-</style>

+ 144 - 103
src/HDrpManagement/customerPortrait/modules/detail.vue

@@ -1,30 +1,33 @@
 <template>
-  <el-drawer append-to-body :visible.sync="dialogFormVisible" size="90%">
+  <el-drawer append-to-body :visible.sync="dialogFormVisible" size="97%">
     <div class="Mcontainer">
       <div style="background:#ffffff;padding:10px" v-if="Object.keys(baseInfo).length">
         <div class="Mcontainer-header">
           <div class="Mcontainer-header__left">
-            <div style="width:60px;height: 60px;background: blue;"></div>
+            <div style="width:60px;height: 60px;background:#F3F9FC;border-radius:10px;padding:10px">
+              <img src="@/assets/customer.svg" style="width:100%;height:100%" alt="">
+            </div>
             <div class="account">
-              <p class="normal-title">
+              <p class="normal-title" style="font-size:18px">
                 <el-tooltip class="item" effect="dark" :content="baseInfo.enterprisename" placement="top">
-                  <p class="nowrap">{{ baseInfo.enterprisename }}</p>
+                  <p>{{ baseInfo.enterprisename }}</p>
                 </el-tooltip>
               </p>
               <div class="Mtag">
-                <el-tag size="small" v-for="(item,index) in baseInfo.sys_tag" :key="index">{{ item }}</el-tag>
+                <el-tag size="small" v-for="(item,index) in baseInfo.sys_tag" :key="index + 'a'">{{ item }}</el-tag>
               </div>
             </div>
           </div>
           <div class="Mcontainer-header__right">
             <el-descriptions class="margin-top">
               <el-descriptions-item label="客户类型">{{ baseInfo.type }}</el-descriptions-item>
-              <el-descriptions-item label="客户等级">{{ baseInfo.grade }}</el-descriptions-item>
-              <el-descriptions-item label=" 合作状态">{{ baseInfo.status }}</el-descriptions-item>
-              <el-descriptions-item label="客户行业"> {{ baseInfo.industry }}</el-descriptions-item>
-              <el-descriptions-item label="客户分类"> {{ baseInfo.customergrade }}</el-descriptions-item>
-              <el-descriptions-item label="成交状态"> {{ baseInfo.tradingstatus }}</el-descriptions-item>
-              <el-descriptions-item label="负责人"> {{ baseInfo.team.length && baseInfo.team.filter(item =>item.isleader = 1)[0].name }}</el-descriptions-item>
+              <el-descriptions-item label="客户等级"><span style="color:#E85B5B;font-size:16px;font-weight:bold">{{ baseInfo.grade }}</span></el-descriptions-item>
+              <el-descriptions-item label=" 合作状态"><span style="color:#3874f6">{{ baseInfo.status }}</span></el-descriptions-item>
+              <el-descriptions-item label="客户行业">{{ baseInfo.industry.join(',') }}</el-descriptions-item>
+              <el-descriptions-item label="客户分类"><span style="color:#E85B5B;font-size:16px;font-weight:bold">{{ baseInfo.customergrade }}</span></el-descriptions-item>
+              <el-descriptions-item label="成交状态"><span style="color:#E85B5B;font-size:16px;font-weight:bold">{{ baseInfo.tradingstatus }}</span></el-descriptions-item>
+              <el-descriptions-item label="距上次跟进天数"> {{ baseInfo.subdate }}</el-descriptions-item>
+              <el-descriptions-item label="负责人"><span style="color:#E85B5B;font-size:16px;font-weight:bold">{{ baseInfo.team.length && baseInfo.team.filter(item =>item.isleader = 1)[0].name }}</span></el-descriptions-item>
               <el-descriptions-item label="注册地址">{{ `${baseInfo.province}${baseInfo.city}${baseInfo.county}${baseInfo.address}` }} </el-descriptions-item>
             </el-descriptions>
           </div>
@@ -41,17 +44,13 @@
               <el-descriptions-item label="人员规模">{{ baseInfo2.staffSize }}</el-descriptions-item>
               <el-descriptions-item label="经营期限至">{{ baseInfo2.registerDate }}</el-descriptions-item>
               <el-descriptions-item label="注册地址">
-                <div class="nowrap" style="width: 300px;">
-                  <el-tooltip class="item" effect="dark" :content="baseInfo2.address" placement="top">
-                    <p class="nowrap">{{ baseInfo2.address }}</p>
-                  </el-tooltip>
+                <div style="max-width:500px">
+                    <p>{{ baseInfo2.address }}</p>
                 </div>
               </el-descriptions-item>
               <el-descriptions-item label="经营范围">
-                <div class="nowrap" style="width: 300px;">
-                  <el-tooltip class="item" effect="dark" :content="baseInfo2.opScope" placement="top">
-                    <p class="nowrap">{{ baseInfo2.opScope }}</p>
-                  </el-tooltip>
+                <div style="max-width:500px">
+                    <p>{{ baseInfo2.opScope }}</p>
                 </div>
               </el-descriptions-item>
             </el-descriptions>
@@ -63,26 +62,44 @@
         <div class="Mfollow">
           <el-card class="box-card">
             <div slot="header">
-              <span style="margin-right: 10px;font-size: 14px;font-weight: bold;">跟进记录</span>
-              <el-radio-group v-model="param1.content.isAll" @input="refreshTable('param1','fllow')">
-                <el-radio :label="1">全部</el-radio>
-                <el-radio :label="0">本年</el-radio>
-              </el-radio-group>
+              <span class="myTitle">跟进记录</span>
+              <myRadio :value1="param1.content" key1="isAll" @clickBtn="refreshTable('param1','fllow')" :btnOptions="[{label:'全部',value:1},{label:'本年',value:0}]">
+              </myRadio>
             </div>
             <myCard 
               :list="
               [
-                {title:'跟进次数',value:$refs.fllow && $refs.fllow.list.length,bg:'#F3F9FC',color:'#8DCFFC'},
+                {title:'跟进次数',value:$refs.fllow && $refs.fllow.total,bg:'#F3F9FC',color:'#3874F6'},
                 {title:'最近跟进人',value:$refs.fllow && $refs.fllow.list[0] && $refs.fllow.list[0].name,bg:'#E8F7EC',color:'#78B32B'},
-                {title:'最近跟进时间',value:$refs.fllow && $refs.fllow.list[0] && $refs.fllow.list[0].createdate,bg:'#F9F2E5',color:'#FF9795'},
+                {title:'最近跟进时间',value:$refs.fllow && $refs.fllow.list[0] && $refs.fllow.list[0].createdate,bg:'#F9F2E5',color:'#FF7603'},
+                {title:'跟进频率',value:$refs.fllow && $refs.fllow.list[0] && $refs.fllow.list[0].followfrequency,descript:'平均一次跟进天数,跟进频率=(总跟进天数-节假日)÷总跟进次数',bg:'#FDF3F3',color:'#E85B5B'},
               ]"
-            ></myCard>
+            >
+            </myCard>
+
+            <p style="font-size:14px;font-weight:bold;margin-bottom:10px" v-if="$refs.fllow && $refs.fllow.list[0] && $refs.fllow.list[0].followDetail.length">跟进人及次数</p>
+            <div style="display:flex">
+              <myTag
+                v-for="(item,index) in $refs.fllow && $refs.fllow.list[0] && $refs.fllow.list[0].followDetail"
+                :key="index + 'b'"
+                :data="{title:item.name,descript:'跟进次数',value:item.qty}"
+              >
+              </myTag>
+            </div>
+            
             <showIsNone title="客户跟进记录明细">
             <pageTable 
               ref="fllow"
               :tablecols="tool.tabelCol($route.name).clueFollow.tablecols"
               :param="param1"
-            ></pageTable>
+              :custom="true"
+            >
+              <template v-slot:custom="scope">
+                <div style="text-wrap:wrap">
+                  {{ scope.data.data[scope.data.columnname] }}
+                </div>
+              </template>
+            </pageTable>
             </showIsNone>
           </el-card>
         </div>
@@ -91,31 +108,22 @@
         <div class="Mproject" style="margin-top:10px">
           <el-card class="box-card">
             <div slot="header">
-              <span style="margin-right: 10px;font-size: 14px;font-weight: bold;">项目</span>
-              <el-radio-group v-model="param2.content.isAll" @input="refreshTable('param2','project')">
-                <el-radio :label="1">全部</el-radio>
-                <el-radio :label="0">本年</el-radio>
-              </el-radio-group>
-
-              <el-select style="margin-left:10px" v-model="param2.content.where.stagename" clearable size="mini" placeholder="请选择项目阶段" @change="typeChange('param2','project')">
-                <el-option label="全部" value=""></el-option>
-                <el-option
-                  v-for="item in stageList"
-                  :key="item.stagename"
-                  :label="item.stagename"
-                  :value="item.stagename">
-                </el-option>
-              </el-select>
+              <span class="myTitle">项目</span>
+              <myRadio :value1="param2.content" key1="isAll" @clickBtn="refreshTable('param2','project')" :btnOptions="[{label:'全部',value:1},{label:'本年',value:0}]">
+              </myRadio>
             </div>
             <myCard 
               :list="
               [
-                {title:'项目数',value:$refs.project && $refs.project.list && $refs.project.list.length,bg:'#F3F9FC',color:'#8DCFFC'},
+                {title:'项目数',value:$refs.project && $refs.project.total,bg:'#F3F9FC',color:'#3874F6'},
                 {title:'项目成交率',value:$refs.project && $refs.project.list && $refs.project.list[0] && $refs.project.list[0].cjl,bg:'#E8F7EC',color:'#78B32B'},
-                {title:'总预计签约金额',value:$refs.project && $refs.project.list && $refs.project.list[0] && $refs.project.list[0].allSignamount_due,bg:'#F9F2E5',color:'#FF9795'},
-                {title:'参与项目数',value:$refs.project && $refs.project.list && $refs.project.list[0] && $refs.project.list[0].joinProjectQty,bg:'#FDF3F3',color:'#E899CC'},
+                {title:'总预计签约金额',value:tool.formatAmount($refs.project && $refs.project.list && $refs.project.list[0] && $refs.project.list[0].allSignamount_due || '0'),bg:'#F9F2E5',color:'#FF7603'},
+                // {title:'参与项目数',descript:'参与项目数:客户参与的项目数',value:$refs.project && $refs.project.list && $refs.project.list[0] && $refs.project.list[0].joinProjectQty,bg:'#FDF3F3',color:'#E899CC'},
               ]"
             ></myCard>
+            <div id="Bar"></div>
+
+
             <showIsNone title="项目明细">
             <pageTable 
               ref="project"
@@ -123,6 +131,7 @@
               :param="param2"
             ></pageTable>
             </showIsNone>
+
           </el-card>
         </div>
 
@@ -130,18 +139,16 @@
         <div class="Mproject" style="margin-top:10px">
           <el-card class="box-card">
             <div slot="header">
-              <span style="margin-right: 10px;font-size: 14px;font-weight: bold;">报价单</span>
-              <el-radio-group v-model="param3.content.isAll" @input="refreshTable('param3','baojiadan')">
-                <el-radio :label="1">全部</el-radio>
-                <el-radio :label="0">本年</el-radio>
-              </el-radio-group>
+              <span class="myTitle">报价单</span>
+              <myRadio :value1="param3.content" key1="isAll" @clickBtn="refreshTable('param3','baojiadan')" :btnOptions="[{label:'全部',value:1},{label:'本年',value:0}]">
+              </myRadio>
             </div>
             <myCard 
               :list="
               [
-                {title:'报价次数',value:$refs.baojiadan && $refs.baojiadan.list && $refs.baojiadan.list.length,bg:'#F3F9FC',color:'#8DCFFC'},
-                {title:'最近报价金额',value:$refs.baojiadan && $refs.baojiadan.list && $refs.baojiadan.list[0] && $refs.baojiadan.list[0].sumamount,bg:'#E8F7EC',color:'#78B32B'},
-                {title:'最近报价时间',value:$refs.baojiadan && $refs.baojiadan.list && $refs.baojiadan.list[0] && $refs.baojiadan.list[0].submitdate,bg:'#F9F2E5',color:'#FF9795'},
+                {title:'报价次数',value:$refs.baojiadan && $refs.baojiadan.total,bg:'#F3F9FC',color:'#3874F6'},
+                {title:'最近报价金额',value:tool.formatAmount($refs.baojiadan && $refs.baojiadan.list && $refs.baojiadan.list[0] && $refs.baojiadan.list[0].sumamount || '0'),bg:'#E8F7EC',color:'#78B32B'},
+                {title:'最近报价时间',value:$refs.baojiadan && $refs.baojiadan.list && $refs.baojiadan.list[0] && $refs.baojiadan.list[0].submitdate,bg:'#F9F2E5',color:'#FF7603'},
               ]"
             ></myCard>
             <showIsNone title="报价单明细">
@@ -158,25 +165,23 @@
         <div class="Mproject" style="margin-top:10px">
           <el-card class="box-card">
             <div slot="header">
-              <span style="margin-right: 10px;font-size: 14px;font-weight: bold;">合同</span>
-              <el-radio-group v-model="param4.content.isAll" @input="refreshTable('param4','hetong')">
-                <el-radio :label="1">全部</el-radio>
-                <el-radio :label="0">本年</el-radio>
-              </el-radio-group>
-              <el-select style="margin-left:10px" v-model="param4.content.where.type" clearable size="mini" placeholder="请选择订单类型" @change="typeChange('param4','hetong')">
+              <span class="myTitle">合同</span>
+              <myRadio :value1="param4.content" key1="isAll" @clickBtn="refreshTable('param4','hetong')" :btnOptions="[{label:'全部',value:1},{label:'本年',value:0}]">
+              </myRadio>
+              <el-select style="margin-left:24px" v-model="param4.content.where.type" clearable size="mini" placeholder="请选择合同类型" @change="typeChange('param4','hetong')">
                 <el-option label="全部" value=""></el-option>
-                <el-option :label="item.value" :value="item.value" v-for="(item,index) in contractTypeList" :key="index"></el-option>
+                <el-option :label="item.remarks" :value="item.value" v-for="(item,index) in contractTypeList" :key="index + 'c'"></el-option>
               </el-select>
             </div>
             <myCard 
               :list="
               [
-                {title:'项目合同总数',value:$refs.hetong && $refs.hetong.list && $refs.hetong.list[0] && $refs.hetong.list[0].allQty,bg:'#F3F9FC',color:'#8DCFFC'},
-                {title:'项目合同总金额',value:$refs.hetong && $refs.hetong.list && $refs.hetong.list[0] && $refs.hetong.list[0].sumSignAmount,bg:'#E8F7EC',color:'#78B32B'},
-                {title:'进行中项目总数',value:$refs.hetong && $refs.hetong.list && $refs.hetong.list[0] && $refs.hetong.list[0].inProgressQty,bg:'#F9F2E5',color:'#FF9795'},
-                {title:'进行中项目金额',value:$refs.hetong && $refs.hetong.list && $refs.hetong.list[0] && $refs.hetong.list[0].inProgressAmount,bg:'#F9F2E5',color:'#FF9795'},
-                {title:'到期项目合同数',value:$refs.hetong && $refs.hetong.list && $refs.hetong.list[0] && $refs.hetong.list[0].expireQty,bg:'#F9F2E5',color:'#FF9795'},
-                {title:'到期项目合同金额',value:$refs.hetong && $refs.hetong.list && $refs.hetong.list[0] && $refs.hetong.list[0].expireAmount,bg:'#F9F2E5',color:'#FF9795'},
+                {title:'项目合同总数',value:$refs.hetong && $refs.hetong.list && $refs.hetong.list[0] && $refs.hetong.list[0].allQty,bg:'#F3F9FC',color:'#3874F6'},
+                {title:'项目合同总金额',value:tool.formatAmount($refs.hetong && $refs.hetong.list && $refs.hetong.list[0] && $refs.hetong.list[0].sumSignAmount || '0'),bg:'#E8F7EC',color:'#78B32B'},
+                {title:'进行中项目总数',value:tool.formatAmount($refs.hetong && $refs.hetong.list && $refs.hetong.list[0] && $refs.hetong.list[0].inProgressQty || '0'),bg:'#FDF3F3',color:'#E85B5B'},
+                {title:'进行中项目金额',value:tool.formatAmount($refs.hetong && $refs.hetong.list && $refs.hetong.list[0] && $refs.hetong.list[0].inProgressAmount || '0'),bg:'#F9F2E5',color:'#FF7603'},
+                {title:'到期项目合同数',value:$refs.hetong && $refs.hetong.list && $refs.hetong.list[0] && $refs.hetong.list[0].expireQty,bg:'#F3F9FC',color:'#3874F6'},
+                {title:'到期项目合同金额',value:tool.formatAmount($refs.hetong && $refs.hetong.list && $refs.hetong.list[0] && $refs.hetong.list[0].expireAmount || '0'),bg:'#E8F7EC',color:'#78B32B'},
               ]"
             ></myCard>
             <showIsNone title="合同明细">
@@ -193,24 +198,24 @@
         <div class="Mproject" style="margin-top:10px">
           <el-card class="box-card">
             <div slot="header">
-              <span style="margin-right: 10px;font-size: 14px;font-weight: bold;">订单</span>
-              <el-radio-group v-model="param5.content.isAll" @input="refreshTable('param5','dingdan')">
-                <el-radio :label="1">全部</el-radio>
-                <el-radio :label="0">本年</el-radio>
-              </el-radio-group>
-              <el-select style="margin-left:10px" v-model="param5.content.where.type" clearable size="mini" placeholder="请选择订单类型" @change="typeChange($event,'param5','type','dingdan')">
+              <span class="myTitle">订单</span>
+              <myRadio :value1="param5.content" key1="isAll" @clickBtn="refreshTable('param5','dingdan')" :btnOptions="[{label:'全部',value:1},{label:'本年',value:0}]">
+              </myRadio>
+              <el-select style="margin-left:24px" v-model="param5.content.where.type" clearable size="mini" placeholder="请选择订单类型" @change="typeChange('param5','dingdan')">
                 <el-option label="全部" value=""></el-option>
-                <el-option :label="item.value" :value="item.value" v-for="(item,index) in orderTypeList" :key="index"></el-option>
+                <el-option :label="item.value" :value="item.value" v-for="(item,index) in orderTypeList" :key="index + 'd'"></el-option>
               </el-select>
             </div>
             <myCard 
               :list="
               [
-                {title:'订单数量',value:$refs.dingdan && $refs.dingdan.list && $refs.dingdan.list[0] && $refs.dingdan.list[0].allOrderQty,bg:'#F3F9FC',color:'#8DCFFC'},
-                {title:'订单总金额',value:$refs.dingdan && $refs.dingdan.list && $refs.dingdan.list[0] && $refs.dingdan.list[0].allAmount,bg:'#E8F7EC',color:'#78B32B'},
-                {title:'回款金额',value:$refs.dingdan && $refs.dingdan.list && $refs.dingdan.list[0] && $refs.dingdan.list[0].cashbillAmount,bg:'#F9F2E5',color:'#FF9795'},
-                {title:'未出货金额',value:$refs.dingdan && $refs.dingdan.list && $refs.dingdan.list[0] && $refs.dingdan.list[0].allunAmount,bg:'#F9F2E5',color:'#FF9795'},
-                {title:'参与项目订单金额',value:$refs.dingdan && $refs.dingdan.list && $refs.dingdan.list[0] && $refs.dingdan.list[0].joinOrderAmount,bg:'#F9F2E5',color:'#FF9795'},
+                {title:'订单数量',value:$refs.dingdan && $refs.dingdan.list && $refs.dingdan.list[0] && $refs.dingdan.list[0].allOrderQty,bg:'#F3F9FC',color:'#3874F6'},
+                {title:'订单总金额',value:tool.formatAmount($refs.dingdan && $refs.dingdan.list && $refs.dingdan.list[0] && $refs.dingdan.list[0].allAmount || '0'),bg:'#E8F7EC',color:'#78B32B'},
+                {title:'回款金额',value:tool.formatAmount($refs.dingdan && $refs.dingdan.list && $refs.dingdan.list[0] && $refs.dingdan.list[0].cashbillAmount || '0'),bg:'#F9F2E5',color:'#FF7603'},
+                {title:'未出货金额',value:tool.formatAmount($refs.dingdan && $refs.dingdan.list && $refs.dingdan.list[0] && $refs.dingdan.list[0].allunAmount || '0'),bg:'#FDF3F3',color:'#E85B5B'},
+                {title:'未开票金额',value:tool.formatAmount($refs.dingdan && $refs.dingdan.list && $refs.dingdan.list[0] && $refs.dingdan.list[0].uninvoicamount || '0'),bg:'#F9F2E5',color:'#FF7603'},
+                {title:'未回款金额',value:tool.formatAmount($refs.dingdan && $refs.dingdan.list && $refs.dingdan.list[0] && $refs.dingdan.list[0].unwriteoffamount || '0'),bg:'#FDF3F3',color:'#E85B5B'},
+                {title:'参与项目订单金额',descript:'参与项目订单金额:客户参与的项目的订单金额',value:tool.formatAmount($refs.dingdan && $refs.dingdan.list && $refs.dingdan.list[0] && $refs.dingdan.list[0].joinOrderAmount || '0'),bg:'#F3F9FC',color:'#3874F6'},
               ]"
             ></myCard>
             <showIsNone title="订单明细">
@@ -227,19 +232,17 @@
         <div class="Mproject" style="margin-top:10px">
           <el-card class="box-card">
             <div slot="header">
-              <span style="margin-right: 10px;font-size: 14px;font-weight: bold;">服务</span>
-              <el-radio-group v-model="param6.content.isAll" @input="refreshTable('param6','fuwu')">
-                <el-radio :label="1">全部</el-radio>
-                <el-radio :label="0">本年</el-radio>
-              </el-radio-group>
+              <span class="myTitle">服务</span>
+              <myRadio :value1="param6.content" key1="isAll" @clickBtn="refreshTable('param6','fuwu')" :btnOptions="[{label:'全部',value:1},{label:'本年',value:0}]">
+              </myRadio>
             </div>
             <myCard 
               :list="
               [
-                {title:'服务申请次数',value:$refs.fuwu && $refs.fuwu.list && $refs.fuwu.list[0] && $refs.fuwu.list[0].serviceOrderQty,bg:'#F3F9FC',color:'#8DCFFC'},
+                {title:'服务申请次数',value:$refs.fuwu && $refs.fuwu.list && $refs.fuwu.list[0] && $refs.fuwu.list[0].serviceOrderQty,bg:'#F3F9FC',color:'#3874F6'},
                 {title:'服务工单次数',value:$refs.fuwu && $refs.fuwu.list && $refs.fuwu.list[0] && $refs.fuwu.list[0].workOrderQty,bg:'#E8F7EC',color:'#78B32B'},
-                {title:'完工工单次数',value:$refs.fuwu && $refs.fuwu.list && $refs.fuwu.list[0] && $refs.fuwu.list[0].okWorkOrderQty,bg:'#F9F2E5',color:'#FF9795'},
-                {title:'最近服务时间',value:$refs.fuwu && $refs.fuwu.list && $refs.fuwu.list[0] && $refs.fuwu.list[0].createdate,bg:'#F9F2E5',color:'#FF9795'},
+                {title:'完工工单次数',value:$refs.fuwu && $refs.fuwu.list && $refs.fuwu.list[0] && $refs.fuwu.list[0].okWorkOrderQty,bg:'#FDF3F3',color:'#E85B5B'},
+                {title:'最近服务时间',value:$refs.fuwu && $refs.fuwu.list && $refs.fuwu.list[0] && $refs.fuwu.list[0].createdate,bg:'#F9F2E5',color:'#FF7603'},
               ]"
             ></myCard>
             <showIsNone title="服务工单明细">
@@ -257,13 +260,13 @@
             <el-col :span="12">
               <el-card class="box-card" style="margin-right:10px">
                 <div slot="header">
-                  <span style="margin-right: 10px;font-size: 14px;font-weight: bold;">团队</span>
+                  <span class="myTitle">团队</span>
                 </div>
                 <div class="peopleInfo-content">
                   <div class="leader">
                     <p class="title" style="margin-bottom:10px">负责人</p>
                     <div class="content">
-                      <div class="item" v-for="(item,index) in baseInfo.team.filter(item => item.isleader == 1)" :key="index">
+                      <div class="item" v-for="(item,index) in baseInfo.team.filter(item => item.isleader == 1)" :key="index + 'e'">
                         <div class="avatar">{{ item.name.substr(0,1) }}</div>
                         <div class="Info">
                           <div>
@@ -300,12 +303,12 @@
             <el-col :span="12">
               <el-card class="box-card">
                 <div slot="header">
-                  <span style="margin-right: 10px;font-size: 14px;font-weight: bold;">联系人</span>
+                  <span style="margin-right:10px;font-size: 14px;font-weight: bold;">联系人</span>
                 </div>
                 <div class="peopleInfo-content">
                   <div class="leader">
                     <div class="content" v-if="baseInfo.contacts.length">
-                      <div class="item" v-for="(item,index) in baseInfo.contacts" :key="index">
+                      <div class="item" v-for="(item,index) in baseInfo.contacts" :key="index + 'f'">
                         <div class="avatar">{{ item.name.substr(0,1) }}</div>
                         <div class="Info">
                           <div>
@@ -334,11 +337,14 @@
 
 <script>
 import pageTable from './pageTable'
+import myTag from './myTag'
 import showIsNone from './showIsNone'
 import myCard from './myCrad.vue'
+import myRadio from './myRadio'
+import { Bar } from '@antv/g2plot'
 export default {
   name: "index",
-  components:{showIsNone,pageTable,myCard},
+  components:{showIsNone,pageTable,myCard,myTag,myRadio},
   props:['data'],
   data() {
     return {
@@ -350,8 +356,8 @@ export default {
         "id": 20230713103904,
         "content": {
             "pageNumber": 1,
-            "pageSize": 20,
-            "isAll":1,
+            "pageSize": 1,
+            "isAll":1, 
             "sa_customersid":this.$route.query.id
         }
       },
@@ -416,7 +422,7 @@ export default {
       },
       contractTypeList:[],
       orderTypeList:[],
-      stageList:[]
+      stageList:[],
     }
   },
   methods:{
@@ -424,7 +430,7 @@ export default {
       let res = await this.$api.requested({
         "id": 20230713103804,
         "content": {
-            "sa_customersid":this.data.sa_customersid
+            "sa_customersid":this.$route.query.id
         }
       })
       this.baseInfo = res.data
@@ -438,13 +444,13 @@ export default {
             "pageSize":1
         }
       })
-      this.baseInfo2 = res2.data[0]
+      this.baseInfo2 = res2.data[0] || {}
       console.log(this.baseInfo2,'工商信息');
     },
     async getSelectList () {
       const res = await this.$store.dispatch('optiontypeselect','contracttype')
       this.contractTypeList = res.data
-      console.log(this.orderTypeList,'合同类型');
+      console.log(this.contractTypeList,'合同类型');
 
       const res2 = await this.$store.dispatch('optiontypeselect','ordertype')
       this.orderTypeList = res2.data
@@ -472,11 +478,36 @@ export default {
     typeChange(param,el) {
       this[param].content.pageNumber = 1
       this.$refs[el] && this.$refs[el].listData()
-    }
+    },
+    /* 渲染表格 */
+    renderer(data) {
+      const piePlot = new Bar('Bar', {
+        data,
+        xField: 'qty',
+        yField: 'stagename',
+        seriesField: 'stagename',
+        legend: {
+          position: 'top',
+        },
+        label: {
+          // 可手动配置 label 数据标签位置
+          position: 'right', // 'left', 'middle', 'right'
+          offset: 4,
+        },
+      });
+      piePlot.render();
+    },
   },
   mounted() {
     this.getbaseInfo()
     this.getSelectList()
+    setTimeout(() => {
+      if (this.$refs.project && this.$refs.project.list[0] && this.$refs.project.list[0].stagecount.length) {
+        let Bar = document.querySelector('#Bar')
+        Bar.style.height = '150px'
+        this.renderer(this.$refs.project.list[0].stagecount)
+      }
+    },2000)
   }
 }
 </script>
@@ -503,7 +534,7 @@ export default {
 }
 
 /deep/.el-descriptions-item__cell {
-  padding: 8px !important;
+  padding: 8px 8px 0px 8px !important;
 }
 
 /deep/.el-card__header,/deep/.el-card__body {
@@ -515,8 +546,9 @@ export default {
 }
 .Mcontainer .Mcontainer-header .Mcontainer-header__left {
   display: flex;
-  width: 300px;
+  max-width: 350px;
   align-items: center;
+  padding-right: 10px;
 }
 .Mcontainer .Mcontainer-header .Mcontainer-header__right {
   flex: 100;
@@ -528,7 +560,6 @@ export default {
   flex-direction: column;
   justify-content: space-between;
   margin-left: 10px;
-  overflow: hidden;
 }
 .Mcontainer .Mcontainer-header .Mcontainer-header__left .account .Mtag{
   margin-top: 5px;
@@ -545,6 +576,11 @@ export default {
 .peopleInfo-content {
   display: flex;
   flex-direction: column;
+  height: 300px;
+  overflow-y: scroll;
+}
+.peopleInfo-content::-webkit-scrollbar {
+  display: none;
 }
 .peopleInfo-content .leader {
   margin-bottom: 10px;
@@ -569,7 +605,7 @@ export default {
   border-radius: 50%;
   text-align: center;
   line-height: 50px;
-  background: blue;
+  background: #3874F6;
   margin-right: 10px;
   color: #ffffff;
 }
@@ -634,4 +670,9 @@ export default {
   color: #000000;
   margin-right: 10px;
 }
+.myTitle {
+  margin-right:24px;
+  font-size: 16px;
+  font-weight: bold;
+}
 </style>

+ 24 - 4
src/HDrpManagement/customerPortrait/modules/myCrad.vue

@@ -1,9 +1,19 @@
 <template>
-  <div class="dataInfo" style="display: flex;">
-    <div :style="[{'background': item.bg},{'width': '260px'},{'padding': '10px 10px'},{'margin-right': '10px'}]" v-for="(item,index) in list">
-      <p :style="[{'font-size': '14px'}]">{{ item.title }}</p>
-      <p :style="[{'font-weight': 'bold'},{'color':item.color}]">{{ item.value || '--' }}</p>
+  <div class="dataInfo">
+    <div :style="[{'background': item.bg}]" class="item" v-for="(item,index) in list">
+        <div>
+          <p :style="[{'font-size': '14px'}]">{{ item.title }}</p>
+          <div style="display:flex;justify-content:space-between">
+            <p :style="[{'font-weight': 'bold'},{'font-size':'18px'},{'color':item.color}]">{{ item.value || '--' }}</p>
+            <p :style="[{'font-size':'12px'},{'color':+item.value2 > 0 ? '#000000' : 'red'}]">{{ item.value2 }}</p>
+          </div>
+          <slot v-if="item.custom" :name="item.custom" :data="item"></slot>
+        </div>
+        <el-tooltip effect="dark" :content="item.descript" placement="top">
+          <i v-if="item.descript" style="cursor: pointer;position:absolute;right:10px;top:10px" class="el-icon-warning-outline"></i>
+        </el-tooltip>
     </div>
+    
   </div>
 </template>
 <script>
@@ -24,6 +34,16 @@
 </script>
 
 <style scoped>
+.dataInfo {
+  display: flex;
+  flex-wrap:wrap;
+}
+.item {
+  width:260px;
+  padding:10px 10px;
+  margin:0 10px 10px 0;
+  position:relative;
+}
 </style>
 
 

+ 76 - 0
src/HDrpManagement/customerPortrait/modules/myRadio.vue

@@ -0,0 +1,76 @@
+<template>
+  <div class="btn-wrapper">
+    <div class="btn-box">
+      <div :class="['btn-item',active == item.label ? 'active' : '']" v-for="item in btnOptions" @click="itemClick($event,item)" :key="item.value + 'a'">{{ item.label }}</div>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name:'myRadio',
+  data () {
+    return {
+      active:this.activeNormal ? this.btnOptions[0].label : '',
+      value:1
+    }
+  },
+  props: {
+    btnOptions: Array,
+    activeNormal: {
+      type:Boolean,
+      default: () => true
+    },
+    value1: {
+      type:[Number,String,Object]
+    },
+    key1: {
+      type:String
+    }
+  },
+  methods: {
+    itemClick (e,data) {
+      this.value = data.value
+      this.active = data.label
+      this.value1[this.key1] = data.value
+      this.$emit('clickBtn',data)
+    }
+  }
+}
+</script>
+
+<style scoped>
+*{
+  user-select: none;
+}
+.btn-wrapper {
+  display: inline-block;
+  position: relative;
+}
+.btn-box {
+  font-size: 10px;
+  display: flex;
+  color: #000000;
+}
+.btn-item {
+  padding: 5px 8px;
+  background: #eeeeee;
+  cursor: pointer;
+  transition: all .3s ease-in-out;
+  white-space: nowrap;
+  border-right: 1px solid #cccccc;
+}
+.btn-item:first-child {
+  border-top-left-radius: 5px;
+  border-bottom-left-radius: 5px;
+}
+.btn-item:last-child {
+  border-top-right-radius: 5px;
+  border-bottom-right-radius: 5px;
+  border-right: none;
+}
+.active {
+  background: #3874F6;
+  color: #ffffff;
+}
+</style>

+ 28 - 0
src/HDrpManagement/customerPortrait/modules/myTag.vue

@@ -0,0 +1,28 @@
+<template>
+  <el-tag style="margin-right:10px">
+    <span style="margin-right:10px">{{ data.title }}</span>
+    <span>{{ data.descript }}:{{ data.value }}</span>
+  </el-tag>
+
+</template>
+<script>
+ export default {
+  name:'myInput',
+  props:{
+    data: {
+      type:Object,
+      default:() => {}
+    }
+  },
+  data () {
+    return {
+
+    }
+  }
+ }
+</script>
+
+<style scoped>
+</style>
+
+

+ 12 - 8
src/HDrpManagement/customerPortrait/modules/pageTable.vue

@@ -4,12 +4,16 @@
     <div>
       <tableLayout :layout="tablecols" :data="list" :opwidth="200"  :custom="true" :width="false" fixedName="operation">
         <template v-slot:customcol="scope">
-          <div v-if="scope.column.columnname == 'stagecount'">
-            <el-tag size="small" v-for="(item,index) in scope.column.data.stagecount" :key="index">{{ item.stagename }}</el-tag>
-          </div>
+          <slot v-if="custom" name="custom" :data="scope.column"></slot>
           <div v-else>
-            {{ scope.column.data[scope.column.columnname] }}
+            <div v-if="scope.column.columnname == 'stagecount'">
+              <el-tag size="small" v-for="(item,index) in scope.column.data.stagecount" :key="index">{{ item.stagename }}</el-tag>
+            </div>
+            <div v-else>
+              {{ scope.column.data[scope.column.columnname] }}
+            </div>
           </div>
+          
         </template>
       </tableLayout>
     </div>
@@ -20,8 +24,8 @@
           @size-change="handleSizeChange"
           @current-change="handleCurrentChange"
           :current-page="param.content.pageNumber"
-          :page-size="param.content.pageSize"
-          layout="total, prev, pager, next, jumper"
+          :page-sizes="[20, 50, 100, 200]"
+          layout="total,sizes, prev, pager, next, jumper"
           :total="total">
       </el-pagination>
     </div>
@@ -30,7 +34,7 @@
 
 <script>
 export default {
-  props:["tablecols",'param'],
+  props:["tablecols",'param','custom'],
   data () {
     return {
       list:[],
@@ -43,7 +47,7 @@ export default {
     async listData(){
       const res = await this.$api.requested(this.param)
       this.list = res.data[0].isEmpty ? [] : res.data
-      this.total = res.total
+      this.total = res.data[0].isEmpty ? 0 : res.total
       console.log(this.list)
     },
     handleSizeChange(val) {

+ 4 - 4
src/HDrpManagement/customerPortrait/modules/showIsNone.vue

@@ -9,11 +9,11 @@
         style="display: flex;align-items: center;margin-left: 30px;color: #3874f6;cursor: pointer;"
         @click="isTop = !isTop"
       >
-        <span style="margin-right: 10px;">收起</span>
-        <i :class="isTop ? 'el-icon-arrow-up' : 'el-icon-arrow-down'"></i>
+        <span style="margin-right: 10px;">{{ isTop ? '展开' : '收起' }}</span>
+        <i :class="isTop ? 'el-icon-arrow-down' : 'el-icon-arrow-up'"></i>
       </div>
     </div>
-    <slot v-if="!isTop"></slot>
+    <div v-show="!isTop"><slot></slot></div>
   </div>
 </template>
 
@@ -23,7 +23,7 @@ export default {
   props:['title'],
   data () {
     return {
-      isTop:false
+      isTop:true
     }
   }
 }

+ 299 - 86
src/HDrpManagement/projectPortrait/index.vue

@@ -1,81 +1,165 @@
 <template>
-  <normalLayout>
-    <template #content>
-      <div style="padding: 20px 20px 5px 20px;">
+  <div>
+    <basicLayout 
+    ref="list" 
+    tableName="projectChangeTable" 
+    idName="sys_datateamid" 
+    :apiId="{query:20230715111604}" 
+    :options="options"
+    :isExport="false"
+    @listCreate="listCreate"
+    :hideSearch="true"
+    >
+      <div slot="custom" style="display:flex;flex-wrap:wrap">
         <div class="mt-10">
-          <label  class="search__label" >范围:</label>
-          <el-select class="inline-16" v-model="value" size="small" placeholder="请选择范围" clearable @change="selectChange">
+          <label  class="search__label">部门:</label>
+          <el-select class="inline-24" v-model="form.dep" size="small" placeholder="请选择部门" clearable @change="depChange">
             <el-option
-                v-for="item in editableTabs"
-                :key="item.index"
-                :label="item.templetname"
-                :value="item.templetid"
+                v-for="item in selectList.dep"
+                :key="item.departmentid"
+                :label="item.depname"
+                :value="item.departmentid"
             ></el-option>
           </el-select>
         </div>
-      </div>
-      <el-scrollbar >
-      <div style="min-width: 1500px;padding: 10px 20px 5px 20px;height:calc(100vh - 300px)">
-        <div style="width: 20%;float: left" >
-          <el-table border :data="list" ref="table" highlight-current-row  @row-click="rowClick">
-            <el-table-column
-                prop="projectname"
-                label="项目名称"
-                width="180">
-            </el-table-column>
-            <el-table-column
-                prop="projecttype"
-                label="项目类型"
-                width="180">
-            </el-table-column>
-            <el-table-column
-                prop="tradefield"
-                label="领域"
-                width="180">
-            </el-table-column>
-            <el-table-column
-                label="负责人">
-              <template slot-scope="scope">
-                {{scope.row.leader[0].name}}
-              </template>
-            </el-table-column>
-          </el-table>
-          <div style="width: 100%">
-            <el-pagination
-                background
-                @size-change="handleSizeChange"
-                @current-change="handleCurrentChange"
-                :current-page="param.content.pageNumber"
-                :page-sizes="[20, 50, 100, 200]"
-                :page-size="20"
-                layout="total, prev, pager, next, jumper"
-                :total="total">
-            </el-pagination>
-          </div>
 
+        <div class="mt-10">
+          <label  class="search__label" >人员:</label>
+          <el-select class="inline-24" v-model="form.people" size="small" placeholder="请选择部门" clearable @change="peopleChange">
+            <el-option
+                v-for="item in selectList.hr"
+                :key="item.userid"
+                :label="item.name"
+                :value="item.userid"
+            ></el-option>
+          </el-select>
+        </div>
+
+        <div class="mt-10">
+          <label  class="search__label" >项目类型:</label>
+          <el-select class="inline-24" v-model="form.projecttype" placeholder="请选择项目类型" size="mini">
+            <el-option
+                v-for="(item,index) in projectType"
+                :key="index"
+                :label="item.value"
+                :value="item.value">
+              <span style="float: left">{{ item.value }}</span>
+              <span style="float: right; color: #8492a6; font-size: 12px">{{ item.remarks?item.remarks:'暂无描述' }}</span>
+            </el-option>
+          </el-select>
+        </div>
+
+        <div  class="mt-10">
+          <label class="search__label">项目阶段:</label>
+          <el-select class="inline-24" v-model="form.stagename" size="small" placeholder="请选择" @change="selectChange" clearable>
+            <el-option
+                v-for="item in projectStage"
+                :key="item.sa_projstagemagid"
+                :label="item.stagename"
+                :value="item.stagename">
+            </el-option>
+          </el-select>
         </div>
-        <div style="width: 79%;height:100%;float: right;" v-if="flag">
-          <mindmap :contentStyle="{height:'75vh',width:'66vw'}" :divStyle="{height:'76.5vh',width:'70.5vw'}" ref="project" class="inline-16" :id="sa_projectid" :show="show"></mindmap>
+
+        <div  class="mt-10">
+          <label class="search__label">领域:</label>
+          <el-select class="inline-24" v-model="form.tradefield" placeholder="请选择领域" @change="selectChange" size="small" clearable>
+            <el-option
+                v-for="item in tradefieldList"
+                :key="item.value"
+                :label="item.value"
+                :value="item.value">
+              <span style="float: left">{{ item.value }}</span>
+              <span style="float: right; color: #8492a6; font-size: 12px">{{ item.remarks?item.remarks:'暂无描述' }}</span>
+            </el-option>
+          </el-select>
+        </div>
+
+        <div class="mt-10">
+          <label class="search__label" >标签类型:</label>
+          <el-select v-model="form.tag" class="inline-24" placeholder="请选择标签" @change="selectChange" size="small" clearable>
+            <el-option
+              v-for="item in tagType"
+              :key="item.sys_systemtagdetailid"
+              :label="item.tag"
+              :value="item.tag">
+            </el-option>
+          </el-select>
+        </div>
+
+        
+        <div class="mt-10">
+          <label  class="search__label">项目状态:</label>
+          <el-select class="inline-24" v-model="form.status" placeholder="请选择项目状态" @change="selectChange" size="small" clearable>
+            <el-option
+                v-for="item in statusList"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value">
+            </el-option>
+          </el-select>
+        </div>
+
+        
+
+        <div class="mt-10" style="margin-right:10px">
+          <label  class="search__label" >时间范围:</label>
+          <el-date-picker
+              size="small"
+              @change="timeChange"
+              value-format="yyyy-MM-dd"
+              v-model="dateSelect"
+              type="daterange"
+              range-separator="至"
+              start-placeholder="开始日期"
+              end-placeholder="结束日期"
+              clearable>
+          </el-date-picker>
+        </div>
+
+        <div class="mt-10" style="margin-right:10px">
+          <el-input style="width:200px;" placeholder="搜索" suffix-icon="el-icon-search" v-model="form.condition" @keyup.native.enter="selectChange" @clear="selectChange" size="small" class="input-with-select inline-16 layout_search__panel" clearable>
+          </el-input>
         </div>
       </div>
-      </el-scrollbar>
-    </template>
-  </normalLayout>
+      <template v-slot:tbList="scope">
+        <div v-if="scope.data.column.columnname === 'sys_tag'">
+          <el-tag v-for="(item,index) in scope.data.column.data.sys_tag" size="mini" style="margin-right:10px" :key="index">{{ item }}</el-tag>
+        </div>
+        <div v-else-if="scope.data.column.columnname === 'industry'">
+          <el-tag v-for="(item,index) in scope.data.column.data.industry" size="mini" style="margin-right:10px" :key="index">{{ item }}</el-tag>
+        </div>
+        <div v-else-if="scope.data.column.columnname === 'grade'">
+          {{ grade(scope.data.column.data.grade) }}
+        </div>
+        <div v-else-if="scope.data.column.columnname === 'leader'">
+          {{ scope.data.column.data.leader[0] && scope.data.column.data.leader[0].name }}
+        </div>
+        <div v-else>
+          {{scope.data.column.data[[scope.data.column.columnname]]}}
+        </div>
+      </template>
+      <template v-slot:tbOpreation="scope">
+        <el-button type="text" size="small" @click="goDetail(scope.data.data)">详 情</el-button>
+      </template>
+    </basicLayout>
+
+    <Detail ref="Detail" v-if="Object.keys(detail).length" :data="detail"></Detail>
+
+  </div>
 </template>
 
 <script>
-import mindmap from "@/components/mindmap/project.vue";
+import Detail from './modules/detail'
 export default {
   name: "index",
-  components:{mindmap},
+  components:{Detail},
   data() {
     return {
-      value:1,
+      options:[],
       list:[],
+      detail:{},
       total:0,
-      flag:false,
-      show:'1',
-      sa_projectid:'',
       editableTabs:[
         {
           templetname:'我负责的',
@@ -99,44 +183,132 @@ export default {
         }
       ],
       param:{
-        "id":20221020143502,
+        "id":20221012164402,
         "content":{
           "pageNumber": 1,
           "pageSize": 20,
           "type":'',
           "deleted": 0,
           "isExport": false,
-          "isend": 0
+          "isend": 0,
+          where:{
+            condtion:''
+          }
+        }
+      },
+      form: {
+        "dep":'',
+        "people":'',
+        "condition": "",
+        "tag": "",
+        "status": "",
+        "projecttype": "",
+        "stagename": "",
+        "tradefield":"",
+        "begindate": "",
+        "enddate": ""
+      },
+      selectList:[],
+      dateSelect:[],
+      projectType:[],
+      projectStage:[],
+      tradefieldList:[],
+      tagType:[],
+      statusList:[
+        {
+          value:"跟进中",
+          label:"跟进中"
+        },
+        {
+          value:"已成交",
+          label:"已成交"
+        },
+        {
+          value:"已失败",
+          label:"已失败"
         }
+      ]
+    }
+  },
+  computed: {
+    grade () {
+      return (n) => {
+        let result
+        switch (n) {
+          case 0:
+            result = '无'
+            break;
+          case 1:
+            result = '等级一'
+            break;
+          case 2:
+            result = '等级二'
+            break;
+          case 3:
+            result = '等级三'
+            break;
+          case 4:
+            result = '等级四'
+            break;
+          case 5:
+            result = '等级一五'
+            break;
+        }
+        return result
       }
     }
   },
   methods:{
-    selectChange(){
-      this.listData()
+    listCreate (param) {
+      console.log(param);
+      param.content.type = ''
+      param.content.dataid = ''
     },
-    async listData(){
-      this.$store.dispatch('changeDetailDrawer',false)
-      this.param.content.type = this.value
-      const res = await this.$api.requested(this.param)
-      this.list = res.data
-      this.total = res.total
-      this.sa_projectid = res.data[0].sa_projectid
-      this.flag = true
-      this.$refs.table.setCurrentRow(this.list[0])
-      /*this.$nextTick(()=>{
-        this.$refs.project.getData()
-        this.$refs.table.setCurrentRow(this.list[0])
-      })*/
+    goDetail (data) {
+      this.detail= {}
+      this.$router.push({
+        path:'projectportrait',
+        query: {
+          id:data.sa_projectid
+        }
+      })
+      setTimeout(() => {
+        this.detail = data
+        console.log(this.detail);
+        this.$nextTick(() => {
+          this.$refs.Detail.dialogFormVisible=true
+        })
+      })
     },
-    rowClick(val){
-      this.flag = false
-      this.sa_projectid = val.sa_projectid
-      this.$nextTick(()=>{
-        this.flag = true
-
+    async getDepAndpeople () {
+      let res = await this.$api.requested({
+        "id": 20230620102004,
+        "content": {
+        }
       })
-
+      this.selectList = res.data
+      console.log(this.selectList,'范围选择数据');
+    },
+    timeChange () {
+      this.$refs.list.param.content.where.begindate = this.dateSelect[0]
+      this.$refs.list.param.content.where.enddate = this.dateSelect[1]
+      this.$refs.list.listData()
+    },
+    selectChange () {
+      this.$refs.list.param.content.where = this.form
+      this.$refs.list.listData()
+    },
+    depChange(){
+      this.form.people = ''
+      this.$refs.list.param.content.type = 1
+      this.$refs.list.param.content.dataid = this.form.dep
+      this.$refs.list.listData()
+    },
+    peopleChange(){
+      this.form.dep = ''
+      this.$refs.list.param.content.type = 0
+      this.$refs.list.param.content.dataid = this.form.people
+      this.$refs.list.listData()
     },
     handleSizeChange(val) {
       // console.log(`每页 ${val} 条`);
@@ -149,12 +321,53 @@ export default {
       this.listData()
     },
   },
-  mounted() {
-    this.listData()
+  async created () {
+    this.getDepAndpeople()
+    /* 获取项目类型 */
+    let res = await this.$store.dispatch('optiontypeselect','projecttype')
+    this.projectType = res.data
+
+    let res2 = await this.$api.requested({
+      id:20221128143604,
+      content: {
+        pageNumber:1,
+        pageSize:1000,
+      }
+    })
+
+    this.projectStage = res2.data
+    console.log(this.projectStage);
+
+    this.$store.dispatch('optiontypeselect','tradefield').then(res=>{
+      this.tradefieldList = res.data
+    })
+
+    let res3 = await this.$api.requested({
+      id:20221013104401,
+      content: {
+        pageNumber:1,
+        pageSize:1000,
+        isExport:0,
+        sys_systemtagid:1
+      }
+    })
+    this.tagType = res3.data
+    console.log(this.tagType);
+
+    this.form.people = JSON.parse(sessionStorage.getItem('active_account')).name
   }
 }
 </script>
 
 <style scoped>
-
+.search__label{
+  white-space: nowrap;
+}
+.mt-10{
+  display: flex;
+  align-items: center;
+}
+.el-select {
+  width: 160px;
+}
 </style>

+ 160 - 0
src/HDrpManagement/projectPortrait/index2.vue

@@ -0,0 +1,160 @@
+<template>
+  <normalLayout>
+    <template #content>
+      <div style="padding: 20px 20px 5px 20px;">
+        <div class="mt-10">
+          <label  class="search__label" >范围:</label>
+          <el-select class="inline-16" v-model="value" size="small" placeholder="请选择范围" clearable @change="selectChange">
+            <el-option
+                v-for="item in editableTabs"
+                :key="item.index"
+                :label="item.templetname"
+                :value="item.templetid"
+            ></el-option>
+          </el-select>
+        </div>
+      </div>
+      <el-scrollbar >
+      <div style="min-width: 1500px;padding: 10px 20px 5px 20px;height:calc(100vh - 300px)">
+        <div style="width: 20%;float: left" >
+          <el-table border :data="list" ref="table" highlight-current-row  @row-click="rowClick">
+            <el-table-column
+                prop="projectname"
+                label="项目名称"
+                width="180">
+            </el-table-column>
+            <el-table-column
+                prop="projecttype"
+                label="项目类型"
+                width="180">
+            </el-table-column>
+            <el-table-column
+                prop="tradefield"
+                label="领域"
+                width="180">
+            </el-table-column>
+            <el-table-column
+                label="负责人">
+              <template slot-scope="scope">
+                {{scope.row.leader[0].name}}
+              </template>
+            </el-table-column>
+          </el-table>
+          <div style="width: 100%">
+            <el-pagination
+                background
+                @size-change="handleSizeChange"
+                @current-change="handleCurrentChange"
+                :current-page="param.content.pageNumber"
+                :page-sizes="[20, 50, 100, 200]"
+                :page-size="20"
+                layout="total, prev, pager, next, jumper"
+                :total="total">
+            </el-pagination>
+          </div>
+
+        </div>
+        <div style="width: 79%;height:100%;float: right;" v-if="flag">
+          <mindmap :contentStyle="{height:'75vh',width:'66vw'}" :divStyle="{height:'76.5vh',width:'70.5vw'}" ref="project" class="inline-16" :id="sa_projectid" :show="show"></mindmap>
+        </div>
+      </div>
+      </el-scrollbar>
+    </template>
+  </normalLayout>
+</template>
+
+<script>
+import mindmap from "@/components/mindmap/project.vue";
+export default {
+  name: "index",
+  components:{mindmap},
+  data() {
+    return {
+      value:1,
+      list:[],
+      total:0,
+      flag:false,
+      show:'1',
+      sa_projectid:'',
+      editableTabs:[
+        {
+          templetname:'我负责的',
+          templetid:1
+        },
+        {
+          templetname:'我参与的',
+          templetid:2
+        },
+        {
+          templetname:'我下属负责的',
+          templetid:3
+        },
+        {
+          templetname:'我下属参与的',
+          templetid:4
+        },
+        {
+          templetname:'我创建的',
+          templetid:5
+        }
+      ],
+      param:{
+        "id":20221020143502,
+        "content":{
+          "pageNumber": 1,
+          "pageSize": 20,
+          "type":'',
+          "deleted": 0,
+          "isExport": false,
+          "isend": 0
+        }
+      }
+    }
+  },
+  methods:{
+    selectChange(){
+      this.listData()
+    },
+    async listData(){
+      this.$store.dispatch('changeDetailDrawer',false)
+      this.param.content.type = this.value
+      const res = await this.$api.requested(this.param)
+      this.list = res.data
+      this.total = res.total
+      this.sa_projectid = res.data[0].sa_projectid
+      this.flag = true
+      this.$refs.table.setCurrentRow(this.list[0])
+      /*this.$nextTick(()=>{
+        this.$refs.project.getData()
+        this.$refs.table.setCurrentRow(this.list[0])
+      })*/
+    },
+    rowClick(val){
+      this.flag = false
+      this.sa_projectid = val.sa_projectid
+      this.$nextTick(()=>{
+        this.flag = true
+
+      })
+
+    },
+    handleSizeChange(val) {
+      // console.log(`每页 ${val} 条`);
+      this.param.content.pageSize = val
+      this.listData()
+    },
+    handleCurrentChange(val) {
+      // console.log(`当前页: ${val}`);
+      this.param.content.pageNumber = val
+      this.listData()
+    },
+  },
+  mounted() {
+    this.listData()
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 758 - 0
src/HDrpManagement/projectPortrait/modules/detail.vue

@@ -0,0 +1,758 @@
+<template>
+  <el-drawer append-to-body :visible.sync="dialogFormVisible" size="97%">
+    <div class="Mcontainer">
+      <div style="background:#ffffff;padding:10px" v-if="Object.keys(baseInfo).length">
+        <div class="Mcontainer-header">
+          <div class="Mcontainer-header__left">
+            <div style="width:60px;height: 60px;background:#F3F9FC;border-radius:10px;padding:10px">
+              <img src="@/assets/project.svg" style="width:100%;height:100%" alt="">
+            </div>
+            <div class="account">
+              <p class="normal-title" style="font-size:18px">
+                <el-tooltip class="item" effect="dark" :content="baseInfo.projectname" placement="top">
+                  <p class="nowrap">{{ baseInfo.projectname }}</p>
+                </el-tooltip>
+              </p>
+              <div class="Mtag">
+                <el-tag size="small" v-for="(item,index) in baseInfo.sys_tag" :key="index" style="margin-right:10px">{{ item }}</el-tag>
+              </div>
+            </div>
+          </div>
+          <div class="Mcontainer-header__right">
+            <el-descriptions class="margin-top">
+              <el-descriptions-item label="项目编号">{{ baseInfo.projectnum }}</el-descriptions-item>
+              <el-descriptions-item label="项目类型">{{ baseInfo.projecttype }}</el-descriptions-item>
+              <el-descriptions-item label="领域"><span style="color:#E85B5B;font-size:16px;font-weight:bold">{{ baseInfo.tradefield }}</span></el-descriptions-item>
+              <el-descriptions-item label="预计签约金额(元)"> {{ tool.formatAmount(baseInfo.signamount_due || 0) }}</el-descriptions-item>
+              <el-descriptions-item label="项目状态"><span style="color:#3874f6">{{ baseInfo.status }}</span></el-descriptions-item>
+              <el-descriptions-item label="未跟进天数"><span style="color:#E85B5B;font-size:16px;font-weight:bold">{{ baseInfo.subdate }}</span></el-descriptions-item>
+              <el-descriptions-item label="项目等级"><span style="color:#E85B5B;font-size:16px;font-weight:bold"> {{ baseInfo.grade }}</span></el-descriptions-item>
+              <el-descriptions-item label="品牌"> {{ baseInfo.brandname }}</el-descriptions-item>
+              <el-descriptions-item label="项目规模"> {{ baseInfo.scale }}</el-descriptions-item>
+              <el-descriptions-item label="预计签约时间"> {{ baseInfo.signdate_due }}</el-descriptions-item>
+              <el-descriptions-item label="负责人"> {{ baseInfo.team.length && baseInfo.team.filter(item =>item.isleader = 1)[0].name }}</el-descriptions-item>
+              <el-descriptions-item label="项目阶段"><span style="color:#E85B5B;font-size:16px;font-weight:bold">{{ baseInfo.stagecount }}</span></el-descriptions-item>
+              <el-descriptions-item label="项目评估总分"><span style="color:#E85B5B;font-size:16px;font-weight:bold">{{ baseInfo.costofconstruction }}</span> </el-descriptions-item>
+              <el-descriptions-item label="项目地址">
+                <div style="max-width:500px">
+                  {{ `${baseInfo.province}${baseInfo.city}${baseInfo.county}${baseInfo.address}` }}
+                </div>
+              </el-descriptions-item>
+            </el-descriptions>
+          </div>
+        </div>
+      </div>
+      <div v-if="data" style="padding: 0 10px;">
+        <!--项目评估-->
+        <div class="Mproject" style="margin-top:10px">
+          <el-card class="box-card">
+            <div slot="header">
+              <span class="myTitle">项目评估</span>
+              <myRadio :value1="param1.content" key1="isAll" @clickBtn="refreshTable('param1','pinggu')" :btnOptions="[{label:'全部',value:1},{label:'本年',value:0}]">
+              </myRadio>
+            </div>
+            <myCard 
+              :list="
+              [
+                {title:'评估总分值',value:$refs.pinggu && $refs.pinggu.list && $refs.pinggu.list[0] && $refs.pinggu.list[0].allsumscore,bg:'#F3F9FC',color:'#3874F6'},
+                {title:'评估次数',value:$refs.pinggu && $refs.pinggu.total,bg:'#E8F7EC',color:'#78B32B'},
+                {title:'最近评估时间',value:$refs.pinggu && $refs.pinggu.list && $refs.pinggu.list[0] && $refs.pinggu.list[0].createdate,bg:'#F9F2E5',color:'#FF7603'},
+              ]"
+            ></myCard>
+            <showIsNone title="项目明细">
+            <pageTable 
+              ref="pinggu"
+              :tablecols="tool.tabelCol($route.name).scoreTable.tablecols"
+              :param="param1"
+              :custom="true"
+            >
+              <template v-slot:custom="scope">
+                <div v-if="scope.data.columnname == 'partieobj'">
+                  <div v-for="item in scope.data.data.parties" :key="item.sa_project_partiesid">
+                    <el-tag size="mini">{{ item.type }}</el-tag>{{ item.enterprisename }}
+                  </div>
+                </div>
+                <div v-else-if="scope.data.columnname == 'optionname'">
+                  <div v-for="item in scope.data.data.parties" :key="item.sa_project_partiesid + 'a'">
+                    <el-tag size="mini">{{ item.optionname }}</el-tag>
+                  </div>
+                </div>
+                <div v-else>
+                  {{ scope.data.data[scope.data.columnname] }}  
+                </div>
+              </template>
+            </pageTable>
+            </showIsNone>
+          </el-card>
+        </div>
+
+        <!--跟进记录-->
+        <div class="Mfollow">
+          <el-card class="box-card">
+            <div slot="header">
+              <span class="myTitle">跟进记录</span>
+              <myRadio :value1="param2.content" key1="isAll" @clickBtn="refreshTable('param2','fllow')" :btnOptions="[{label:'全部',value:1},{label:'本年',value:0}]">
+              </myRadio>
+            </div>
+            <myCard 
+              :list="
+              [
+                {title:'跟进次数',value:$refs.fllow && $refs.fllow.total,bg:'#F3F9FC',color:'#3874F6'},
+                {title:'最近跟进人',value:$refs.fllow && $refs.fllow.list[0] && $refs.fllow.list[0].name,bg:'#E8F7EC',color:'#78B32B'},
+                {title:'最近跟进时间',value:$refs.fllow && $refs.fllow.list[0] && $refs.fllow.list[0].createdate,bg:'#F9F2E5',color:'#FF7603'},
+                {title:'跟进频率',value:$refs.fllow && $refs.fllow.list[0] && $refs.fllow.list[0].followfrequency,descript:'平均一次跟进天数,跟进频率=(总跟进天数-节假日)÷总跟进次数',bg:'#FDF3F3',color:'#E85B5B'},
+              ]"
+            >
+            </myCard>
+            
+            <p style="font-size:14px;font-weight:bold;margin-bottom:10px" v-if="$refs.fllow && $refs.fllow.list[0] && $refs.fllow.list[0].followDetail.length">跟进人及次数</p>
+            <div style="display:flex">
+              <myTag
+                style="margin-right:10px"
+                v-for="(item,index) in $refs.fllow && $refs.fllow.list[0] && $refs.fllow.list[0].followDetail"
+                :key="index + 'b'"
+                :data="{title:item.name,descript:'跟进次数',value:item.qty}"
+              >
+              </myTag>
+            </div>
+            
+
+            <showIsNone title="项目跟进记录明细">
+            <pageTable 
+              ref="fllow"
+              :tablecols="tool.tabelCol($route.name).clueFollow.tablecols"
+              :param="param2"
+              :custom="true"
+            >
+              <template v-slot:custom="scope">
+                <div style="text-wrap:wrap">
+                  {{ scope.data.data[scope.data.columnname] }}
+                </div>
+              </template>
+            </pageTable>
+            </showIsNone>
+          </el-card>
+        </div>
+
+        <!--关联客户-->
+        <div class="Mproject" style="margin-top:10px">
+          <el-card class="box-card">
+            <div slot="header">
+              <span class="myTitle">关联客户</span>
+            </div>
+            <myCard 
+              :list="
+              [
+                {title:'客户数',value:$refs.kehu && $refs.kehu.total,bg:'#F3F9FC',color:'#3874F6'},
+              ]"
+            ></myCard>
+            <showIsNone title="客户明细">
+            <pageTable 
+              ref="kehu"
+              :tablecols="tool.tabelCol($route.name).customerTable.tablecols"
+              :param="param3"
+            ></pageTable>
+            </showIsNone>
+          </el-card>
+        </div>
+
+        <!--竞争对手-->
+        <div class="Mproject" style="margin-top:10px">
+          <el-card class="box-card">
+            <div slot="header">
+              <span class="myTitle">竞争对手</span>
+            </div>
+            <myCard 
+              :list="
+              [
+                {title:'项目竞争对手数',value:$refs.duishou && $refs.duishou.total,bg:'#F3F9FC',color:'#3874F6'},
+              ]"
+            ></myCard>
+            <showIsNone title="对手明细">
+            <pageTable 
+              ref="duishou"
+              :tablecols="tool.tabelCol($route.name).duishouTable.tablecols"
+              :param="param4"
+            ></pageTable>
+            </showIsNone>
+          </el-card>
+        </div>
+
+        <!--产品配置-->
+        <div class="Mproject" style="margin-top:10px">
+          <el-card class="box-card">
+            <div slot="header">
+              <span class="myTitle">产品配置</span>
+            </div>
+            <myCard 
+              :list="
+              [
+                {title:'产品总数',value:$refs.productset && $refs.productset.total,bg:'#F3F9FC',color:'#3874F6'},
+                {title:'产品总金额',value:tool.formatAmount($refs.productset && $refs.productset.list && $refs.productset.list[0] && $refs.productset.list[0].itemSumAmount || 0),bg:'#E8F7EC',color:'#78B32B'},
+              ]"
+            ></myCard>
+            <showIsNone title="产品类别即金额">
+              <el-table
+                :cell-style="{height:'40px',color:'#666666',fontWeight:'400'}"
+                size="mini"
+                border
+                :data="$refs.productset && $refs.productset.list && $refs.productset.list[0] && $refs.productset.list[0].itemsClassAmount"
+                style="width: 100%">
+                <el-table-column
+                  prop="itemclassfullname"
+                  label="产品类别">
+                </el-table-column>
+                <el-table-column
+                  prop="itemclassAmount"
+                  label="金额">
+                </el-table-column>
+              </el-table>
+            </showIsNone>
+
+            <showIsNone title="产品配置明细" style="margin-top:10px">
+            <pageTable 
+              ref="productset"
+              :tablecols="tool.tabelCol($route.name).projectSetTable.tablecols"
+              :param="param5"
+            ></pageTable>
+            </showIsNone>
+          </el-card>
+        </div>
+    
+        <!--报价单-->
+        <div class="Mproject" style="margin-top:10px">
+          <el-card class="box-card">
+            <div slot="header">
+              <span class="myTitle">报价单</span>
+              <myRadio :value1="param6.content" key1="isAll" @clickBtn="refreshTable('param6','baojiadan')" :btnOptions="[{label:'全部',value:1},{label:'本年',value:0}]">
+              </myRadio>
+            </div>
+            <myCard 
+              :list="
+              [
+                {title:'报价次数',value:$refs.baojiadan && $refs.baojiadan.total,bg:'#F3F9FC',color:'#3874F6'},
+                {title:'最近报价金额',value:tool.formatAmount($refs.baojiadan && $refs.baojiadan.list && $refs.baojiadan.list[0] && $refs.baojiadan.list[0].sumamount || 0),bg:'#E8F7EC',color:'#78B32B'},
+                {title:'最近报价时间',value:$refs.baojiadan && $refs.baojiadan.list && $refs.baojiadan.list[0] && $refs.baojiadan.list[0].submitdate,bg:'#F9F2E5',color:'#FF7603'},
+              ]"
+            ></myCard>
+            <showIsNone title="报价单明细">
+            <pageTable 
+              ref="baojiadan"
+              :tablecols="tool.tabelCol($route.name).quotedPriceTable.tablecols"
+              :param="param6"
+            ></pageTable>
+            </showIsNone>
+          </el-card>
+        </div>
+
+        <!--合同-->
+        <div class="Mproject" style="margin-top:10px">
+          <el-card class="box-card">
+            <div slot="header">
+              <span class="myTitle">合同</span>
+              <myRadio :value1="param7.content" key1="isAll" @clickBtn="refreshTable('param7','hetong')" :btnOptions="[{label:'全部',value:1},{label:'本年',value:0}]">
+              </myRadio>
+              <el-select style="margin-left:24px" v-model="param7.content.where.type" clearable size="mini" placeholder="请选择合同类型" @change="typeChange('param7','hetong')">
+                <el-option label="全部" value=""></el-option>
+                <el-option :label="item.remarks" :value="item.value" v-for="(item,index) in contractTypeList" :key="index"></el-option>
+              </el-select>
+            </div>
+            <myCard 
+              :list="
+              [
+                {title:'项目合同总数',value:$refs.hetong && $refs.hetong.list && $refs.hetong.list[0] && $refs.hetong.list[0].allQty,bg:'#F3F9FC',color:'#3874F6'},
+                {title:'项目合同总金额',value:tool.formatAmount($refs.hetong && $refs.hetong.list && $refs.hetong.list[0] && $refs.hetong.list[0].sumSignAmount || 0),bg:'#E8F7EC',color:'#78B32B'},
+                {title:'进行中项目总数',value:$refs.hetong && $refs.hetong.list && $refs.hetong.list[0] && $refs.hetong.list[0].inProgressQty,bg:'#FDF3F3',color:'#E85B5B'},
+                {title:'进行中项目金额',value:tool.formatAmount($refs.hetong && $refs.hetong.list && $refs.hetong.list[0] && $refs.hetong.list[0].inProgressAmount || 0),bg:'#F9F2E5',color:'#FF7603'},
+                {title:'到期项目合同数',value:$refs.hetong && $refs.hetong.list && $refs.hetong.list[0] && $refs.hetong.list[0].expireQty,bg:'#FDF3F3',color:'#E85B5B'},
+                {title:'到期项目合同金额',value:tool.formatAmount($refs.hetong && $refs.hetong.list && $refs.hetong.list[0] && $refs.hetong.list[0].expireAmount || 0),bg:'#E8F7EC',color:'#78B32B'},
+                {title:'转订单合同数',value:$refs.hetong && $refs.hetong.list && $refs.hetong.list[0] && $refs.hetong.list[0].convertOrderContractQty,bg:'#F9F2E5',color:'#FF7603'},
+                {title:'转订单金额',value:tool.formatAmount($refs.hetong && $refs.hetong.list && $refs.hetong.list[0] && $refs.hetong.list[0].convertOrderContractAmount || 0),bg:'#E8F7EC',color:'#78B32B'},
+              ]"
+            ></myCard>
+            <showIsNone title="合同明细">
+            <pageTable 
+              ref="hetong"
+              :tablecols="tool.tabelCol($route.name).contractTable.tablecols"
+              :param="param7"
+            ></pageTable>
+            </showIsNone>
+          </el-card>
+        </div>
+
+        <!--订单-->
+        <div class="Mproject" style="margin-top:10px">
+          <el-card class="box-card">
+            <div slot="header">
+              <span class="myTitle">订单</span>
+              <myRadio :value1="param8.content" key1="isAll" @clickBtn="refreshTable('param8','dingdan')" :btnOptions="[{label:'全部',value:1},{label:'本年',value:0}]">
+              </myRadio>
+              <el-select style="margin-left:24px" v-model="param8.content.type" clearable size="mini" placeholder="请选择订单类型" @change="typeChange('param8','dingdan')">
+                <el-option label="全部" value=""></el-option>
+                <el-option :label="item.value" :value="item.value" v-for="(item,index) in orderTypeList" :key="index"></el-option>
+              </el-select>
+            </div>
+            <myCard 
+              :list="
+              [
+                {title:'订单数量',value:$refs.dingdan && $refs.dingdan.list && $refs.dingdan.list[0] && $refs.dingdan.list[0].allOrderQty,bg:'#F3F9FC',color:'#3874F6'},
+                {title:'订单总金额',value:tool.formatAmount($refs.dingdan && $refs.dingdan.list && $refs.dingdan.list[0] && $refs.dingdan.list[0].allAmount || 0),bg:'#E8F7EC',color:'#78B32B'},
+                {title:'订单回款金额',value:tool.formatAmount($refs.dingdan && $refs.dingdan.list && $refs.dingdan.list[0] && $refs.dingdan.list[0].cashbillAmount || 0),bg:'#F9F2E5',color:'#FF7603'},
+                {title:'订单未出货金额',value:tool.formatAmount($refs.dingdan && $refs.dingdan.list && $refs.dingdan.list[0] && $refs.dingdan.list[0].allunAmount || 0),bg:'#FDF3F3',color:'#E85B5B'},
+                {title:'订单未开票金额',value:tool.formatAmount($refs.dingdan && $refs.dingdan.list && $refs.dingdan.list[0] && $refs.dingdan.list[0].uninvoicamount || 0),bg:'#F9F2E5',color:'#FF7603'},
+                {title:'已开票未回款金额',value:tool.formatAmount($refs.dingdan && $refs.dingdan.list && $refs.dingdan.list[0] && $refs.dingdan.list[0].unwriteoffamount || 0),bg:'#FDF3F3',color:'#E85B5B'},
+              ]"
+            ></myCard>
+            <showIsNone title="订单明细">
+            <pageTable 
+              ref="dingdan"
+              :tablecols="tool.tabelCol($route.name).orderTable.tablecols"
+              :param="param8"
+            ></pageTable>
+            </showIsNone>
+          </el-card>
+        </div>
+
+        <!--服务-->
+        <div class="Mproject" style="margin-top:10px">
+          <el-card class="box-card">
+            <div slot="header">
+              <span class="myTitle">服务</span>
+              <myRadio :value1="param9.content" key1="isAll" @clickBtn="refreshTable('param9','fuwu')" :btnOptions="[{label:'全部',value:1},{label:'本年',value:0}]">
+              </myRadio>
+            </div>
+            <myCard 
+              :list="
+              [
+                {title:'服务申请次数',value:$refs.fuwu && $refs.fuwu.list && $refs.fuwu.list[0] && $refs.fuwu.list[0].serviceOrderQty,bg:'#F3F9FC',color:'#3874F6'},
+                {title:'服务工单次数',value:$refs.fuwu && $refs.fuwu.list && $refs.fuwu.list[0] && $refs.fuwu.list[0].workOrderQty,bg:'#E8F7EC',color:'#78B32B'},
+                {title:'完工工单次数',value:$refs.fuwu && $refs.fuwu.list && $refs.fuwu.list[0] && $refs.fuwu.list[0].okWorkOrderQty,bg:'#F9F2E5',color:'#FF7603'},
+                {title:'最近服务时间',value:$refs.fuwu && $refs.fuwu.list && $refs.fuwu.list[0] && $refs.fuwu.list[0].createdate,bg:'#FDF3F3',color:'#E85B5B'},
+              ]"
+            ></myCard>
+            <showIsNone title="服务工单明细">
+            <pageTable 
+              ref="fuwu"
+              :tablecols="tool.tabelCol($route.name).serveOrderTable.tablecols"
+              :param="param9"
+            ></pageTable>
+            </showIsNone>
+          </el-card>
+        </div>
+
+        <div class="peopleInfo" v-if="Object.keys(baseInfo).length">
+          <el-row>
+            <el-col :span="12">
+              <el-card class="box-card" style="margin-right:10px">
+                <div slot="header">
+                  <span class="myTitle">团队</span>
+                </div>
+                <div class="peopleInfo-content">
+                  <div class="leader">
+                    <p class="title" style="margin-bottom:10px">负责人</p>
+                    <div class="content">
+                      <div class="item" v-for="(item,index) in baseInfo.team.filter(item => item.isleader == 1)" :key="index">
+                        <div class="avatar">{{ item.name.substr(0,1) }}</div>
+                        <div class="Info">
+                          <div>
+                            <p class="title">{{ item.name }}</p>
+                            <p class="descript">账号:<span>{{ item.accountno }}</span></p>
+                          </div>
+                          <div>
+                            <p class="descript">部门:<span>{{ item.depname }}</span></p>  
+                            <p class="descript">职位:<span>{{ item.position }}</span></p>  
+                          </div>
+                        </div>
+                      </div>
+                    </div>
+                  </div>
+                  <div class="people">
+                    <p class="title" style="margin-bottom:10px">参与人</p>
+                    <div class="content">
+                      <div class="avatar">张</div>
+                      <div class="Info">
+                        <div>
+                          <p class="title">张三</p>
+                          <p class="descript">账号:<span>xxxxxxxx</span></p>
+                        </div>
+                        <div>
+                          <p class="descript">部门:<span>销售部</span></p>  
+                          <p class="descript">职位:<span>总监</span></p>  
+                        </div>
+                      </div>
+                    </div>
+                  </div>
+                </div>
+              </el-card>
+            </el-col>
+            <el-col :span="12">
+              <el-card class="box-card">
+                <div slot="header">
+                  <span class="myTitle">联系人</span>
+                </div>
+                <div class="peopleInfo-content">
+                  <div class="leader">
+                    <div class="content" v-if="baseInfo.contacts && baseInfo.contacts.length">
+                      <div class="item" v-for="(item,index) in baseInfo.contacts" :key="index">
+                        <div class="avatar">{{ item.name.substr(0,1) }}</div>
+                        <div class="Info">
+                          <div>
+                            <p class="title">{{ item.name }}</p>
+                            <p class="descript">账号:<span>{{ item.accountno }}</span></p>
+                          </div>
+                          <div>
+                            <p class="descript">部门:<span>{{ item.depname }}</span></p>  
+                            <p class="descript">职位:<span>{{ item.position }}</span></p>  
+                          </div>
+                        </div>
+                      </div>
+                    </div>
+                    <el-empty :image-size="100" description="暂无数据" v-else></el-empty>
+                  </div>
+                </div>
+              </el-card>
+            </el-col>
+          </el-row>
+        </div>
+      </div>
+      
+    </div>
+  </el-drawer>
+</template>
+
+<script>
+import pageTable from '@/HDrpManagement/customerPortrait/modules/pageTable'
+import showIsNone from '@/HDrpManagement/customerPortrait/modules/showIsNone'
+import myCard from '@/HDrpManagement/customerPortrait/modules/myCrad'
+import myTag from '@/HDrpManagement/customerPortrait/modules/myTag'
+import myRadio from '@/HDrpManagement/customerPortrait/modules/myRadio'
+export default {
+  name: "index",
+  components:{showIsNone,pageTable,myCard,myTag,myRadio},
+  props:['data'],
+  data() {
+    return {
+      dialogFormVisible:false,
+      baseInfo:{},//基本信息
+      //项目评估
+      param1: {
+        "id": 20230715112504,
+        "content": {
+            "pageNumber": 1,
+            "pageSize": 20,
+            "isAll":1,
+            "sa_projectid":this.$route.query.id
+        }
+      },
+      //跟进记录
+      param2: {
+        "id": 20230715111804,
+        "content": {
+            "pageNumber": 1,
+            "pageSize": 20,
+            "isAll":1,
+            "sa_projectid":this.$route.query.id
+        }
+      },
+      //关联客户
+      param3: {
+        "id": 20230715111904,
+        "content": {
+          "pageNumber": 1,
+          "pageSize": 20,
+          "sa_projectid":this.$route.query.id,
+        }
+      },
+      //竞争对手
+      param4: {
+        "id": 20230715111904,
+        "content": {
+          "pageNumber": 1,
+          "pageSize": 20,
+          "sa_projectid":this.$route.query.id,
+        }
+      },
+      //产品配置
+      param5: {
+        "id": 20230715112104,
+        "content": {
+            "pageNumber": 1,
+            "pageSize": 20,
+            "sa_projectid":this.$route.query.id
+        }
+      },
+      //报价单
+      param6: {
+        "id": 20230715112204,
+        "content": {
+          "pageNumber": 1,
+          "pageSize": 20,
+          "isAll":1,
+          "sa_projectid":this.$route.query.id,
+          "where":{
+              "type":""
+          }
+        }
+      },
+      //关联合同
+      param7: {
+        "id": 20230715112304,
+        "content": {
+          "pageNumber": 1,
+          "pageSize": 20,
+          "isAll":1,
+          "sa_projectid":this.$route.query.id,
+          "where":{
+              "type":""
+          }
+        }
+      },
+      //订单
+      param8: {
+        "id": 20230715112404,
+        "content": {
+            "pageNumber": 1,
+            "pageSize": 20,
+            "isAll":1,
+            "sa_projectid":this.$route.query.id,
+            "where": {
+
+            }
+        }
+      },
+      //服务
+      param9: {
+        "id": 20230716151004,
+        "content": {
+            "pageNumber": 1,
+            "pageSize": 20,
+            "isAll":1,
+            "sa_projectid":this.$route.query.id,
+            "where": {
+              
+            }
+        }
+      },
+      contractTypeList:[],
+      orderTypeList:[],
+      stageList:[]
+    }
+  },
+  methods:{
+    async getbaseInfo () {
+      let res = await this.$api.requested({
+        "id": 20230715111704,
+        "content": {
+            "sa_projectid":this.$route.query.id
+        }
+      })
+      this.baseInfo = res.data[0]
+      console.log(this.baseInfo,'基本信息');
+
+    },
+    async getSelectList () {
+      const res = await this.$store.dispatch('optiontypeselect','contracttype')
+      this.contractTypeList = res.data
+      console.log(this.contractTypeList,'合同类型');
+
+      const res2 = await this.$store.dispatch('optiontypeselect','ordertype')
+      this.orderTypeList = res2.data
+      console.log(this.orderTypeList,'订单类型');
+
+      /*获取阶段*/
+      const res3 = await this.$api.requested({
+        "id": 20221128143604,
+        "content": {
+          "pageNumber": 1,
+          "pageSize": 9999,
+          "where": {
+            "condition": "",
+            "allprojecttype":"",
+            "projecttype":""
+          }
+        }
+      })
+      this.stageList = res3.data
+    },
+    refreshTable (param,el) {
+      this[param].content.pageNumber = 1
+      this.$refs[el] && this.$refs[el].listData()
+    },
+    typeChange(param,el) {
+      this[param].content.pageNumber = 1
+      this.$refs[el] && this.$refs[el].listData()
+    }
+  },
+  mounted() {
+    this.getbaseInfo()
+    this.getSelectList()
+  }
+}
+</script>
+
+<style scoped>
+*{
+  box-sizing: border-box;
+}
+.my-label {
+  background: rgba(235, 245, 253, 1);
+}
+.nowrap {
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  flex: 100;
+}
+
+/deep/.el-drawer {
+  background:#F5F5F5 !important; 
+}
+/deep/.el-drawer__header{
+  display: none !important;
+}
+
+/deep/.el-descriptions-item__cell {
+  padding: 8px 8px 0px 8px !important;
+}
+
+
+/deep/.el-card__header,/deep/.el-card__body {
+  padding: 10px !important;
+}
+.Mcontainer .Mcontainer-header {
+  display: flex;
+  align-items: center;
+}
+.Mcontainer .Mcontainer-header .Mcontainer-header__left {
+  display: flex;
+  max-width: 350px;
+  align-items: center;
+  padding-right: 10px;
+}
+.Mcontainer .Mcontainer-header .Mcontainer-header__right {
+  flex: 100;
+  border-left: 1px solid #cccccc;
+  padding-left: 20px;
+}
+.Mcontainer .Mcontainer-header .Mcontainer-header__left .account{
+  display: flex;
+  flex-direction: column;
+  justify-content: space-between;
+  margin-left: 10px;
+  overflow: hidden;
+}
+.Mcontainer .Mcontainer-header .Mcontainer-header__left .account .Mtag{
+  margin-top: 5px;
+}
+
+.Mcontainer .Mfollow{
+  margin-top: 10px;
+}
+
+.Mcontainer .peopleInfo {
+  margin-top: 10px;
+  padding-bottom: 10px;
+}
+.peopleInfo-content {
+  display: flex;
+  flex-direction: column;
+  height: 300px;
+  overflow-y: scroll;
+}
+.peopleInfo-content::-webkit-scrollbar {
+  display: none;
+}
+.peopleInfo-content .leader {
+  margin-bottom: 10px;
+  display: flex;
+  flex-direction: column;
+}
+.peopleInfo-content .leader .title {
+  font-size: 14px;
+}
+.peopleInfo-content .leader .content {
+  display: flex;
+  flex-wrap: wrap;
+}
+.peopleInfo-content .leader .content .item {
+  display: flex;
+  align-items: center;
+  margin: 0 20px 10px 0;
+}
+.peopleInfo-content .leader .content .avatar {
+  width: 50px;
+  height: 50px;
+  border-radius: 50%;
+  text-align: center;
+  line-height: 50px;
+  background: #3874F6;
+  margin-right: 10px;
+  color: #ffffff;
+}
+.peopleInfo-content .leader .content .Info {
+  display: flex;
+  flex-direction: column;
+}
+.peopleInfo-content .leader .content .Info div {
+  display: flex;
+  align-items: center;
+  font-size: 12px;
+  color: #cccccc;
+}
+
+
+.peopleInfo-content .people {
+  margin-bottom: 10px;
+  display: flex;
+  flex-direction: column;
+}
+.peopleInfo-content .people .title {
+  font-size: 14px;
+}
+.peopleInfo-content .people .content {
+  display: flex;
+}
+.peopleInfo-content .people .content .item {
+  display: flex;
+  align-items: center;
+  margin: 0 20px 10px 0;
+}
+.peopleInfo-content .people .content .avatar {
+  width: 50px;
+  height: 50px;
+  border-radius: 50%;
+  text-align: center;
+  line-height: 50px;
+  background: #3874F6;
+  margin-right: 10px;
+  color: #ffffff;
+}
+.peopleInfo-content .people .content .Info {
+  display: flex;
+  flex-direction: column;
+}
+.peopleInfo-content .people .content .Info div {
+  display: flex;
+  align-items: center;
+  font-size: 12px;
+  color: #cccccc;
+}
+
+.peopleInfo-content .people {}
+
+.descript {
+  font-size: 12px;
+  color: #cccccc;
+  margin-right: 20px;
+}
+.title {
+  font-size: 14px;
+  color: #000000;
+  margin-right: 10px;
+}
+.myTitle {
+  margin-right:24px;
+  font-size: 16px;
+  font-weight: bold;
+}
+</style>

+ 182 - 149
src/HDrpManagement/salerPortrait/index.vue

@@ -1,192 +1,225 @@
 <template>
-  <normalLayout>
-    <template #content>
-      <div style="padding: 20px 20px 5px 20px;">
+  <div>
+    <basicLayout 
+    ref="list" 
+    tableName="salerTable" 
+    idName="sa_accountclassid" 
+    :apiId="{query:20230717100204}" 
+    :options="options"
+    :isExport="false"
+    @listCreate="listCreate"
+    >
+      <div slot="custom" style="display:flex">
         <div class="mt-10">
-          <label  class="search__label" >范围:</label>
-            <el-cascader v-model="cvalue"  size="small" ref="selectdep" :options="deplist" :props="{emitPath:true,expandTrigger:'hover',checkStrictly:true,label:'label',value:'departmentid',children:'children'}"  @change="selectDep"  clearable></el-cascader>
+          <label  class="search__label" >部门:</label>
+          <el-select class="inline-16" v-model="dep" size="small" placeholder="请选择部门" clearable @change="depChange">
+            <el-option
+                v-for="item in selectList.dep"
+                :key="item.departmentid"
+                :label="item.depname"
+                :value="item.departmentid"
+            ></el-option>
+          </el-select>
         </div>
-      </div>
-      <el-scrollbar >
-      <div style="min-width: 1500px;padding: 10px 20px 5px 20px;height:calc(100vh - 300px)">
-        <div style="width: 20%;float: left" >
-          <el-table border :data="list" ref="table" highlight-current-row  @row-click="rowClick">
-            <el-table-column
-                prop="name"
-                label="人员"
-                width="180">
-            </el-table-column>
-            <el-table-column
-                prop="depname"
-                label="部门"
-                width="180">
-            </el-table-column>
-            <el-table-column
-                prop="area"
-                label="区域"
-                width="180">
-            </el-table-column>
-          </el-table>
-          <div style="width: 100%">
-            <el-pagination
-                background
-                @size-change="handleSizeChange"
-                @current-change="handleCurrentChange"
-                :current-page="personParam.content.pageNumber"
-                :page-sizes="[20, 50, 100, 200]"
-                :page-size="20"
-                layout="total, prev, pager, next, jumper"
-                :total="total">
-            </el-pagination>
-          </div>
 
+        <div class="mt-10">
+          <label  class="search__label" >人员:</label>
+          <el-select class="inline-16" v-model="people" size="small" placeholder="请选择部门" clearable @change="peopleChange">
+            <el-option
+                v-for="item in selectList.hr"
+                :key="item.userid"
+                :label="item.name"
+                :value="item.userid"
+            ></el-option>
+          </el-select>
         </div>
-        <div style="width: 79%;height:100%;float: right;" v-if="flag">
-          <mindmap :contentStyle="{height:'75vh',width:'66vw'}" :divStyle="{height:'76.5vh',width:'70.5vw'}" ref="saler" class="inline-16" :id="hrid" :show="show"></mindmap>
+
+        <div class="mt-10" style="margin-right:10px">
+          <label  class="search__label" >范围:</label>
+          <el-date-picker
+              size="small"
+              @change="timeChange"
+              value-format="yyyy-MM-dd"
+              v-model="dateSelect"
+              type="daterange"
+              range-separator="至"
+              start-placeholder="开始日期"
+              end-placeholder="结束日期"
+              clearable>
+          </el-date-picker>
         </div>
+
+        
       </div>
-      </el-scrollbar>
-    </template>
-  </normalLayout>
+      <template v-slot:tbList="scope">
+        <div v-if="scope.data.column.columnname === 'sys_tag'">
+          <el-tag v-for="(item,index) in scope.data.column.data.sys_tag" size="mini" style="margin-right:10px" :key="index">{{ item }}</el-tag>
+        </div>
+        <div v-else-if="scope.data.column.columnname === 'industry'">
+          <el-tag v-for="(item,index) in scope.data.column.data.industry" size="mini" style="margin-right:10px" :key="index">{{ item }}</el-tag>
+        </div>
+        <div v-else-if="scope.data.column.columnname === 'grade'">
+          {{ grade(scope.data.column.data.grade) }}
+        </div>
+        <div v-else-if="scope.data.column.columnname === 'leader'">
+          {{ scope.data.column.data.leader[0] && scope.data.column.data.leader[0].name }}
+        </div>
+        <div v-else>
+          {{scope.data.column.data[[scope.data.column.columnname]]}}
+        </div>
+      </template>
+      <template v-slot:tbOpreation="scope">
+        <el-button type="text" size="small" @click="goDetail(scope.data.data)">详 情</el-button>
+      </template>
+    </basicLayout>
+
+    <Detail ref="Detail" v-if="Object.keys(detail).length" :data="detail"></Detail>
+
+  </div>
 </template>
 
 <script>
-import mindmap from "@/components/mindmap/saler.vue";
+import Detail from './modules/detail'
 export default {
   name: "index",
-  components:{mindmap},
+  components:{Detail},
   data() {
     return {
-      cvalue:[],
+      options:[],
       list:[],
+      detail:{},
       total:0,
-      flag:false,
-      hrid:'',
-      show:'1',
-      depmentParam:{
-        "id": 20230620102004,
-        "content": {
+      editableTabs:[
+        {
+          templetname:'我负责的',
+          templetid:1
+        },
+        {
+          templetname:'我参与的',
+          templetid:2
+        },
+        {
+          templetname:'我下属负责的',
+          templetid:3
+        },
+        {
+          templetname:'我下属参与的',
+          templetid:4
+        },
+        {
+          templetname:'我创建的',
+          templetid:5
         }
-      },
-      deplist:[],
-      personParam:{
-        "id": 20221102090303,
-        "content": {
-          "containssub":1,
-          "departmentids":[],
+      ],
+      param:{
+        "id":20221012164402,
+        "content":{
           "pageNumber": 1,
           "pageSize": 20,
-          "isExport":0
+          "type":'',
+          "deleted": 0,
+          "isExport": false,
+          "isend": 0,
+          where:{
+            a:''
+          }
+        }
+      },
+      dep:'',
+      people:'',
+      selectList:[],
+      dateSelect:[]
+    }
+  },
+  computed: {
+    grade () {
+      return (n) => {
+        let result
+        switch (n) {
+          case 0:
+            result = '无'
+            break;
+          case 1:
+            result = '等级一'
+            break;
+          case 2:
+            result = '等级二'
+            break;
+          case 3:
+            result = '等级三'
+            break;
+          case 4:
+            result = '等级四'
+            break;
+          case 5:
+            result = '等级一五'
+            break;
         }
+        return result
       }
     }
   },
   methods:{
-    selectChange(){
-      this.listData()
-    },
-    async departmentrtment() {
-      const res = await this.$api.requested(this.depmentParam)
-      this.deplist = this.createMenu(res.data.dep)
-      console.log(this.deplist,'部门列表')
-      this.personParam.content.departmentids = [this.deplist[0].departmentid]
-      this.cvalue = this.deplist[0].departmentid
-      console.log(this.value,'项目选择')
-      this.listData()
-      /*this.range = JSON.parse(window.sessionStorage.getItem('active_account')).name*/
+    listCreate (param) {
+      console.log(param);
+      param.content.type = ''
+      param.content.dataid = ''
     },
-    createMenu (array) {
-      var that = this
-      let arr = []
-      function convertToElementTree(node) {
-        // 新节点
-        if (node.subdep.length === 0){
-          var elNode = {
-            label: node["depname"],
-            parentid:node['parentid'],
-            parentname:node['parentname'],
-            departmentid:node["departmentid"],
-            value:node["departmentid"],
-            remarks:node["remarks"],
-            isused:node["isused"],
-            changedate:node['changedate'],
-            changeby:node['changeby'],
-            createdate:node['createdate'],
-            createby:node['createby'],
-            depno:node['depno'],
-            disabled:that.pageOnlyRead,
-          }
-        }else {
-          var elNode = {
-            label: node["depname"],
-            parentid:node['parentid'],
-            parentname:node['parentname'],
-            departmentid:node["departmentid"],
-            value:node["departmentid"],
-            remarks:node["remarks"],
-            isused:node["isused"],
-            changedate:node['changedate'],
-            changeby:node['changeby'],
-            createdate:node['createdate'],
-            createby:node['createby'],
-            depno:node['depno'],
-            disabled:that.pageOnlyRead,
-            children: []
-          }
+    goDetail (data) {
+      this.detail= {}
+      this.$router.push({
+        path:'salerportrait',
+        query: {
+          id:data.hrid
         }
-        if (node.subdep && node.subdep.length > 0) {
-          // 如果存在子节点
-          for (var index = 0; index < node.subdep.length; index++) {
-            // 遍历子节点, 把每个子节点看做一颗独立的树, 传入递归构造子树, 并把结果放回到新node的children中
-            elNode.children.push(convertToElementTree(node.subdep[index]));
-          }
+      })
+      setTimeout(() => {
+        this.detail = data
+        this.$nextTick(() => {
+          this.$refs.Detail.dialogFormVisible=true
+        })
+      })
+    },
+    async getDepAndpeople () {
+      let res = await this.$api.requested({
+        "id": 20230620102004,
+        "content": {
         }
-        return elNode;
-      }
-      array.forEach((element) => {
-        arr.push(convertToElementTree(element))
-      });
-      return arr
+      })
+      this.selectList = res.data
+      console.log(this.selectList,'范围选择数据');
     },
-    selectDep(val) {
-      console.log(val)
-      let dataDep = this.$refs.selectdep.getCheckedNodes(true)[0].data
-      this.value = dataDep.label
-      this.personParam.content.departmentids = [val[val.length-1]]
-      this.listData()
+    timeChange () {
+      this.$refs.list.param.content.where.begindate = this.dateSelect[0]
+      this.$refs.list.param.content.where.enddate = this.dateSelect[1]
+      this.$refs.list.listData()
     },
-    async listData(){
-      this.$store.dispatch('changeDetailDrawer',false)
-      const res = await this.$api.requested(this.personParam)
-      this.list = res.data
-      this.total = res.total
-      this.hrid = res.data[0].hrid
-      this.flag = true
-      this.$refs.table.setCurrentRow(this.list[0])
+    depChange(){
+      this.people = ''
+      this.$refs.list.param.content.type = 1
+      this.$refs.list.param.content.dataid = this.dep
+      this.$refs.list.listData()
     },
-    rowClick(val){
-      console.log(val)
-      this.flag = false
-      this.hrid = val.hrid
-      this.$nextTick(()=>{
-        this.flag = true
-      })
-
+    peopleChange(){
+      this.dep = ''
+      this.$refs.list.param.content.type = 0
+      this.$refs.list.param.content.dataid = this.people
+      this.$refs.list.listData()
     },
     handleSizeChange(val) {
       // console.log(`每页 ${val} 条`);
-      this.personParam.content.pageSize = val
+      this.param.content.pageSize = val
       this.listData()
     },
     handleCurrentChange(val) {
       // console.log(`当前页: ${val}`);
-      this.personParam.content.pageNumber = val
+      this.param.content.pageNumber = val
       this.listData()
     },
   },
-  mounted() {
-   /* this.listData()*/
-    this.departmentrtment()
+  created () {
+    this.getDepAndpeople()
+    this.people = JSON.parse(sessionStorage.getItem('active_account')).name
   }
 }
 </script>

+ 196 - 0
src/HDrpManagement/salerPortrait/index2.vue

@@ -0,0 +1,196 @@
+<template>
+  <normalLayout>
+    <template #content>
+      <div style="padding: 20px 20px 5px 20px;">
+        <div class="mt-10">
+          <label  class="search__label" >范围:</label>
+            <el-cascader v-model="cvalue"  size="small" ref="selectdep" :options="deplist" :props="{emitPath:true,expandTrigger:'hover',checkStrictly:true,label:'label',value:'departmentid',children:'children'}"  @change="selectDep"  clearable></el-cascader>
+        </div>
+      </div>
+      <el-scrollbar >
+      <div style="min-width: 1500px;padding: 10px 20px 5px 20px;height:calc(100vh - 300px)">
+        <div style="width: 20%;float: left" >
+          <el-table border :data="list" ref="table" highlight-current-row  @row-click="rowClick">
+            <el-table-column
+                prop="name"
+                label="人员"
+                width="180">
+            </el-table-column>
+            <el-table-column
+                prop="depname"
+                label="部门"
+                width="180">
+            </el-table-column>
+            <el-table-column
+                prop="area"
+                label="区域"
+                width="180">
+            </el-table-column>
+          </el-table>
+          <div style="width: 100%">
+            <el-pagination
+                background
+                @size-change="handleSizeChange"
+                @current-change="handleCurrentChange"
+                :current-page="personParam.content.pageNumber"
+                :page-sizes="[20, 50, 100, 200]"
+                :page-size="20"
+                layout="total, prev, pager, next, jumper"
+                :total="total">
+            </el-pagination>
+          </div>
+
+        </div>
+        <div style="width: 79%;height:100%;float: right;" v-if="flag">
+          <mindmap :contentStyle="{height:'75vh',width:'66vw'}" :divStyle="{height:'76.5vh',width:'70.5vw'}" ref="saler" class="inline-16" :id="hrid" :show="show"></mindmap>
+        </div>
+      </div>
+      </el-scrollbar>
+    </template>
+  </normalLayout>
+</template>
+
+<script>
+import mindmap from "@/components/mindmap/saler.vue";
+export default {
+  name: "index",
+  components:{mindmap},
+  data() {
+    return {
+      cvalue:[],
+      list:[],
+      total:0,
+      flag:false,
+      hrid:'',
+      show:'1',
+      depmentParam:{
+        "id": 20230620102004,
+        "content": {
+        }
+      },
+      deplist:[],
+      personParam:{
+        "id": 20221102090303,
+        "content": {
+          "containssub":1,
+          "departmentids":[],
+          "pageNumber": 1,
+          "pageSize": 20,
+          "isExport":0
+        }
+      }
+    }
+  },
+  methods:{
+    selectChange(){
+      this.listData()
+    },
+    async departmentrtment() {
+      const res = await this.$api.requested(this.depmentParam)
+      this.deplist = this.createMenu(res.data.dep)
+      console.log(this.deplist,'部门列表')
+      this.personParam.content.departmentids = [this.deplist[0].departmentid]
+      this.cvalue = this.deplist[0].departmentid
+      console.log(this.value,'项目选择')
+      this.listData()
+      /*this.range = JSON.parse(window.sessionStorage.getItem('active_account')).name*/
+    },
+    createMenu (array) {
+      var that = this
+      let arr = []
+      function convertToElementTree(node) {
+        // 新节点
+        if (node.subdep.length === 0){
+          var elNode = {
+            label: node["depname"],
+            parentid:node['parentid'],
+            parentname:node['parentname'],
+            departmentid:node["departmentid"],
+            value:node["departmentid"],
+            remarks:node["remarks"],
+            isused:node["isused"],
+            changedate:node['changedate'],
+            changeby:node['changeby'],
+            createdate:node['createdate'],
+            createby:node['createby'],
+            depno:node['depno'],
+            disabled:that.pageOnlyRead,
+          }
+        }else {
+          var elNode = {
+            label: node["depname"],
+            parentid:node['parentid'],
+            parentname:node['parentname'],
+            departmentid:node["departmentid"],
+            value:node["departmentid"],
+            remarks:node["remarks"],
+            isused:node["isused"],
+            changedate:node['changedate'],
+            changeby:node['changeby'],
+            createdate:node['createdate'],
+            createby:node['createby'],
+            depno:node['depno'],
+            disabled:that.pageOnlyRead,
+            children: []
+          }
+        }
+        if (node.subdep && node.subdep.length > 0) {
+          // 如果存在子节点
+          for (var index = 0; index < node.subdep.length; index++) {
+            // 遍历子节点, 把每个子节点看做一颗独立的树, 传入递归构造子树, 并把结果放回到新node的children中
+            elNode.children.push(convertToElementTree(node.subdep[index]));
+          }
+        }
+        return elNode;
+      }
+      array.forEach((element) => {
+        arr.push(convertToElementTree(element))
+      });
+      return arr
+    },
+    selectDep(val) {
+      console.log(val)
+      let dataDep = this.$refs.selectdep.getCheckedNodes(true)[0].data
+      this.value = dataDep.label
+      this.personParam.content.departmentids = [val[val.length-1]]
+      this.listData()
+    },
+    async listData(){
+      this.$store.dispatch('changeDetailDrawer',false)
+      const res = await this.$api.requested(this.personParam)
+      this.list = res.data
+      this.total = res.total
+      this.hrid = res.data[0].hrid
+      this.flag = true
+      this.$refs.table.setCurrentRow(this.list[0])
+    },
+    rowClick(val){
+      console.log(val)
+      this.flag = false
+      this.hrid = val.hrid
+      this.$nextTick(()=>{
+        this.flag = true
+      })
+
+    },
+    handleSizeChange(val) {
+      // console.log(`每页 ${val} 条`);
+      this.personParam.content.pageSize = val
+      this.listData()
+    },
+    handleCurrentChange(val) {
+      // console.log(`当前页: ${val}`);
+      this.personParam.content.pageNumber = val
+      this.listData()
+    },
+  },
+  mounted() {
+   /* this.listData()*/
+    this.departmentrtment()
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 658 - 0
src/HDrpManagement/salerPortrait/modules/detail.vue

@@ -0,0 +1,658 @@
+<template>
+  <el-drawer append-to-body :visible.sync="dialogFormVisible" size="97%">
+    <div class="Mcontainer">
+      <div style="background:#ffffff;padding:10px" v-if="Object.keys(baseInfo).length">
+        <div class="Mcontainer-header">
+          <div class="Mcontainer-header__left">
+            <div style="width:60px;height: 60px;background:#F3F9FC;border-radius:10px;padding:10px">
+              <img src="@/assets/saler.svg" style="width:100%;height:100%" alt="">
+            </div>
+            <div class="account">
+              <p class="normal-title" style="font-size:18px">
+                <el-tooltip class="item" effect="dark" :content="baseInfo.projectname" placement="top">
+                  <p class="nowrap">{{ baseInfo.name }}</p>
+                </el-tooltip>
+              </p>
+              <div class="Mtag">
+                <el-tag size="small" v-for="(item,index) in baseInfo.sys_tag" :key="index" style="margin-right:10px">{{ item }}</el-tag>
+              </div>
+            </div>
+          </div>
+          <div class="Mcontainer-header__right">
+            <el-descriptions class="margin-top">
+              <el-descriptions-item label="编号">{{ baseInfo.hrcode }}</el-descriptions-item>
+              <el-descriptions-item label="部门">{{ baseInfo.depname }}</el-descriptions-item>
+              <el-descriptions-item label="手机号">{{ baseInfo.phonenumber }}</el-descriptions-item>
+              <el-descriptions-item label="营销区域"> {{ baseInfo.areaname }}</el-descriptions-item>
+              <el-descriptions-item label="登录账号">{{ baseInfo.accountno }}</el-descriptions-item>
+              <el-descriptions-item label="职位">{{ baseInfo.position }}</el-descriptions-item>
+              <el-descriptions-item label="邮箱"> {{ baseInfo.email }}</el-descriptions-item>
+              <el-descriptions-item label="最低授权折扣"><span style="color:#E85B5B;font-size:16px;font-weight:bold">{{ baseInfo.discountrate * 100 + '%' }}</span></el-descriptions-item>
+            </el-descriptions>
+          </div>
+        </div>
+      </div>
+      <div v-if="data" style="padding: 0 10px;">
+        <!--业绩-->
+        <div class="Mproject" style="margin-top:10px">
+          <el-card class="box-card">
+            <div slot="header">
+              <span class="myTitle">项目评估</span>
+              <myRadio :value1="param1.content" key1="type" @clickBtn="getPerformance" :btnOptions="[{label:'本年',value:3},{label:'本季',value:2},{label:'本月',value:1}]">
+              </myRadio>
+            </div>
+            <myCard 
+              :list="
+              [
+                {custom:'dingdan',data:performance,title:'订单目标',value:performance.orderCR,value2:tool.formatAmount(performance.amount - performance.target_l,2),bg:'#F3F9FC',color:'#3874F6'},
+                {custom:'chuhuo',data:performance,title:'出货目标',value:performance.outOrderCR,value2:tool.formatAmount(performance.outamount - performance.target_l,2),bg:'#E8F7EC',color:'#00B32B'},
+                {custom:'kaipiao',data:performance,title:'开票目标',value:performance.invCR,value2:tool.formatAmount(performance.invoiceamount - performance.target_l,2),bg:'#F9F2E5',color:'#FF7603'},
+                {title:'回款金额',value:performance.writeoffamount,bg:'#FDF3F3',color:'#E85B5B'},
+              ]"
+            >
+              <template v-slot:dingdan="scope">
+                  <div>
+                    <p style="font-size:14px">实际/目标</p>
+                    <p :style="[{'font-size':'18px'},{color:scope.data.color},{'font-weight':'bold'}]">{{ tool.formatAmount(scope.data.data.amount || 0,2) }}万/{{ tool.formatAmount(scope.data.data.target_l || 0,2) }}万</p>
+                  </div>
+              </template>
+              <template v-slot:chuhuo="scope">
+                  <div>
+                    <p style="font-size:14px">实际/目标</p>
+                    <p :style="[{'font-size':'18px'},{color:scope.data.color},{'font-weight':'bold'}]">{{ tool.formatAmount(scope.data.data.outamount || 0,2) }}万/{{ tool.formatAmount(scope.data.data.target_l || 0,2) }}万</p>
+                  </div>
+              </template>
+              <template v-slot:kaipiao="scope">
+                  <div>
+                    <p style="font-size:14px">实际/目标</p>
+                    <p :style="[{'font-size':'18px'},{color:scope.data.color},{'font-weight':'bold'}]">{{ tool.formatAmount(scope.data.data.invoiceamount || 0,2) }}万/{{ tool.formatAmount(scope.data.data.target_l || 0,2) }}万</p>
+                  </div>
+              </template>
+            </myCard>
+          </el-card>
+        </div>
+
+        <!--订单-->
+        <div class="Mproject" style="margin-top:10px">
+          <el-card class="box-card">
+            <div slot="header">
+              <span class="myTitle">订单</span>
+              <myRadio :value1="param2.content" key1="isAll" @clickBtn="refreshTable('param2','dingdan')" :btnOptions="[{label:'全部',value:1},{label:'本年',value:0}]">
+              </myRadio>
+              <el-select style="margin-left:24px" v-model="param2.content.type" clearable size="mini" placeholder="请选择订单类型" @change="typeChange('param2','dingdan')">
+                <el-option label="全部" value=""></el-option>
+                <el-option :label="item.value" :value="item.value" v-for="(item,index) in orderTypeList" :key="index"></el-option>
+              </el-select>
+            </div>
+            <myCard 
+              :list="
+              [
+                {title:'订单数量',value:$refs.dingdan && $refs.dingdan.list && $refs.dingdan.list[0] && $refs.dingdan.list[0].allOrderQty,bg:'#F3F9FC',color:'#8DCFFC'},
+                {title:'订单总金额',value:tool.formatAmount($refs.dingdan && $refs.dingdan.list && $refs.dingdan.list[0] && $refs.dingdan.list[0].allAmount || 0),bg:'#E8F7EC',color:'#78B32B'},
+                {title:'订单回款金额',value:tool.formatAmount($refs.dingdan && $refs.dingdan.list && $refs.dingdan.list[0] && $refs.dingdan.list[0].cashbillAmount || 0),bg:'#F9F2E5',color:'#FF7603'},
+                {title:'订单未出货金额',value:tool.formatAmount($refs.dingdan && $refs.dingdan.list && $refs.dingdan.list[0] && $refs.dingdan.list[0].allunAmount || 0),bg:'#FDF3F3',color:'#E85B5B'},
+                {title:'订单未开票金额',value:tool.formatAmount($refs.dingdan && $refs.dingdan.list && $refs.dingdan.list[0] && $refs.dingdan.list[0].uninvoicamount || 0),bg:'#F9F2E5',color:'#FF7603'},
+                {title:'已开票未回款金额',value:tool.formatAmount($refs.dingdan && $refs.dingdan.list && $refs.dingdan.list[0] && $refs.dingdan.list[0].unwriteoffamount || 0),bg:'#FDF3F3',color:'#E85B5B'},
+              ]"
+            ></myCard>
+            <showIsNone title="订单明细">
+            <pageTable 
+              ref="dingdan"
+              :tablecols="tool.tabelCol($route.name).orderTable.tablecols"
+              :param="param2"
+            ></pageTable>
+            </showIsNone>
+          </el-card>
+        </div>
+
+        <!--销售线索-->
+        <div class="Mfollow">
+          <el-card class="box-card">
+            <div slot="header">
+              <span class="myTitle">销售线索</span>
+              <myRadio :value1="param3.content" key1="type" @clickBtn="refreshTable('param3','xiansuo');param8.content.type=param3.content.type;refreshTable('param8','fllow')" :btnOptions="[{label:'本年',value:3},{label:'本季',value:2},{label:'本月',value:1}]">
+              </myRadio>
+            </div>
+            <myCard 
+              :list="
+              [
+                {title:'线索数',value:$refs.xiansuo && $refs.xiansuo.list[0] && $refs.xiansuo.list[0].orderclueSize,bg:'#F3F9FC',color:'#8DCFFC'},
+                {title:'新增线索数',value:$refs.xiansuo && $refs.xiansuo.list[0] && $refs.xiansuo.list[0].insertOrderclue,bg:'#E8F7EC',color:'#78B32B'},
+                {title:'线索转化率',value:$refs.fllow && $refs.fllow.list[0] && $refs.fllow.list[0].orderclueConver,bg:'#F9F2E5',color:'#FF7603'},
+                {title:'跟进次数',value:$refs.fllow && $refs.fllow.list[0] && $refs.fllow.list[0].createdate,bg:'#F3F9FC',color:'#8DCFFC'},
+                {title:'跟进频率',value:$refs.fllow && $refs.fllow.list[0] && $refs.fllow.list[0].followfrequency,descript:'平均一次跟进天数,跟进频率=(总跟进天数-节假日)÷总跟进次数',bg:'#FDF3F3',color:'#E85B5B'},
+              ]"
+            >
+            </myCard>
+            <showIsNone title="销售线索明细">
+            <pageTable 
+              ref="xiansuo"
+              :tablecols="tool.tabelCol($route.name).orderclueList.tablecols"
+              :param="param3"
+            ></pageTable>
+            </showIsNone>
+
+            <showIsNone title="线索跟进记录明细">
+            <pageTable 
+              ref="fllow"
+              :tablecols="tool.tabelCol($route.name).clueFollow.tablecols"
+              :param="param8"
+              :custom="true"
+            >
+              <template v-slot:custom="scope">
+                <div style="text-wrap:wrap">
+                  {{ scope.data.data[scope.data.columnname] }}
+                </div>
+              </template>
+            </pageTable>
+            </showIsNone>
+          </el-card>
+        </div>
+
+        <!--关联客户-->
+        <div class="Mfollow">
+          <el-card class="box-card">
+            <div slot="header">
+              <span class="myTitle">客户</span>
+              <myRadio :value1="param4.content" key1="type" @clickBtn="refreshTable('param4','kehu');param9.content.type=param4.content.type;refreshTable('param9','fllowkehu')" :btnOptions="[{label:'本年',value:3},{label:'本季',value:2},{label:'本月',value:1}]">
+              </myRadio>
+            </div>
+            <myCard 
+              :list="
+              [
+                {title:'客户数',value:$refs.kehu && $refs.kehu.list.length,bg:'#F3F9FC',color:'#8DCFFC'},
+                {title:'新增客户数',value:$refs.kehu && $refs.kehu.list[0] && $refs.kehu.list[0].customersSize,bg:'#E8F7EC',color:'#78B32B'},
+                {title:'跟进次数',value:$refs.fllowkehu && $refs.fllowkehu.list[0] && $refs.fllowkehu.list[0].followSize,bg:'#F9F2E5',color:'#FF7603'},
+                {title:'跟进频率',value:$refs.fllowkehu && $refs.fllowkehu.list[0] && $refs.fllowkehu.list[0].followfrequency + '天/次',descript:'平均一次跟进天数,跟进频率=(总跟进天数-节假日)÷总跟进次数',bg:'#FDF3F3',color:'#E85B5B'},
+              ]"
+            >
+            </myCard>
+            <showIsNone title="客户明细">
+            <pageTable 
+              ref="kehu"
+              :tablecols="tool.tabelCol($route.name).publicCustomerTable.tablecols"
+              :param="param4"
+            ></pageTable>
+            </showIsNone>
+
+            <showIsNone title="客户跟进记录明细">
+            <pageTable 
+              ref="fllowkehu"
+              :tablecols="tool.tabelCol($route.name).customerFollow.tablecols"
+              :param="param9"
+              :custom="true"
+            >
+              <template v-slot:custom="scope">
+                <div style="text-wrap:wrap">
+                  {{ scope.data.data[scope.data.columnname] }}
+                </div>
+              </template>
+            </pageTable>
+            </showIsNone>
+          </el-card>
+        </div>
+
+        <!--项目-->
+        <div class="Mproject" style="margin-top:10px">
+          <el-card class="box-card">
+            <div slot="header">
+              <span class="myTitle">项目</span>
+              <myRadio :value1="param5.content" key1="type" @clickBtn="refreshTable('param5','project');param10.content.type=param5.content.type;refreshTable('param10','projectfllow')" :btnOptions="[{label:'本年',value:3},{label:'本季',value:2},{label:'本月',value:1}]">
+              </myRadio>
+            </div>
+            <myCard 
+              :list="
+              [
+                {title:'项目数',value:$refs.project && $refs.project.list && $refs.project.list[0] && $refs.project.list[0].projectSize,bg:'#F3F9FC',color:'#8DCFFC'},
+                {title:'新增项目数',value:$refs.project && $refs.project.list && $refs.project.list[0] && $refs.project.list[0].insertProject,bg:'#E8F7EC',color:'#78B32B'},
+                {title:'项目成交率',value:tool.formatAmount($refs.project && $refs.project.list && $refs.project.list[0] && $refs.project.list[0].projectcjl || '0'),bg:'#F9F2E5',color:'#FF7603'},
+                {title:'跟进次数',value:tool.formatAmount($refs.projectfllow && $refs.projectfllow.list && $refs.projectfllow.list[0] && $refs.projectfllow.list[0].followSize || '0'),bg:'#F3F9FC',color:'#8DCFFC'},
+                {title:'跟进频率',value:$refs.projectfllow && $refs.projectfllow.list[0] && $refs.projectfllow.list[0].followfrequency + '天/次',descript:'平均一次跟进天数,跟进频率=(总跟进天数-节假日)÷总跟进次数',bg:'#FDF3F3',color:'#E85B5B'},
+              ]"
+            ></myCard>
+
+            <showIsNone title="项目明细">
+            <pageTable 
+              ref="project"
+              :tablecols="tool.tabelCol($route.name).competeProjectsTable.tablecols"
+              :param="param5"
+            ></pageTable>
+            </showIsNone>
+
+            <showIsNone title="项目跟进记录明细">
+            <pageTable 
+              ref="projectfllow"
+              :tablecols="tool.tabelCol($route.name).customerFollow.tablecols"
+              :param="param5"
+              :custom="true"
+            >
+              <template v-slot:custom="scope">
+                <div style="text-wrap:wrap">
+                  {{ scope.data.data[scope.data.columnname] }}
+                </div>
+              </template>
+            </pageTable>
+            </showIsNone>
+
+          </el-card>
+        </div>
+
+        <!--报价单-->
+        <div class="Mproject" style="margin-top:10px">
+          <el-card class="box-card">
+            <div slot="header">
+              <span class="myTitle">报价单</span>
+              <myRadio :value1="param6.content" key1="isAll" @clickBtn="refreshTable('param6','baojiadan')" :btnOptions="[{label:'全部',value:1},{label:'本年',value:0}]">
+              </myRadio>
+            </div>
+            <myCard 
+              :list="
+              [
+                {title:'报价次数',value:$refs.baojiadan && $refs.baojiadan.total,bg:'#F3F9FC',color:'#8DCFFC'},
+                {title:'最近报价金额',value:tool.formatAmount($refs.baojiadan && $refs.baojiadan.list && $refs.baojiadan.list[0] && $refs.baojiadan.list[0].sumamount || '0'),bg:'#E8F7EC',color:'#78B32B'},
+                {title:'最近报价时间',value:$refs.baojiadan && $refs.baojiadan.list && $refs.baojiadan.list[0] && $refs.baojiadan.list[0].submitdate,bg:'#F9F2E5',color:'#FF7603'},
+              ]"
+            ></myCard>
+            <showIsNone title="报价单明细">
+            <pageTable 
+              ref="baojiadan"
+              :tablecols="tool.tabelCol($route.name).quotedPriceTable.tablecols"
+              :param="param6"
+            ></pageTable>
+            </showIsNone>
+          </el-card>
+        </div>
+
+
+        <!--合同-->
+        <div class="Mproject" style="margin-top:10px">
+          <el-card class="box-card">
+            <div slot="header">
+              <span class="myTitle">合同</span>
+              <myRadio :value1="param7.content" key1="isAll" @clickBtn="refreshTable('param7','hetong')" :btnOptions="[{label:'全部',value:1},{label:'本年',value:0}]">
+              </myRadio>
+              <el-select style="margin-left:24px" v-model="param7.content.where.type" clearable size="mini" placeholder="请选择合同类型" @change="typeChange('param7','hetong')">
+                <el-option label="全部" value=""></el-option>
+                <el-option :label="item.remarks" :value="item.value" v-for="(item,index) in contractTypeList" :key="index"></el-option>
+              </el-select>
+            </div>
+            <myCard 
+              :list="
+              [
+                {title:'项目合同总数',value:$refs.hetong && $refs.hetong.list && $refs.hetong.list[0] && $refs.hetong.list[0].allQty,bg:'#F3F9FC',color:'#8DCFFC'},
+                {title:'项目合同总金额',value:tool.formatAmount($refs.hetong && $refs.hetong.list && $refs.hetong.list[0] && $refs.hetong.list[0].sumSignAmount || 0),bg:'#E8F7EC',color:'#78B32B'},
+                {title:'进行中项目总数',value:$refs.hetong && $refs.hetong.list && $refs.hetong.list[0] && $refs.hetong.list[0].inProgressQty,bg:'#FDF3F3',color:'#E85B5B'},
+                {title:'进行中项目金额',value:tool.formatAmount($refs.hetong && $refs.hetong.list && $refs.hetong.list[0] && $refs.hetong.list[0].inProgressAmount || 0),bg:'#F9F2E5',color:'#FF7603'},
+                {title:'到期项目合同数',value:$refs.hetong && $refs.hetong.list && $refs.hetong.list[0] && $refs.hetong.list[0].expireQty,bg:'#F3F9FC',color:'#8DCFFC'},
+                {title:'到期项目合同金额',value:tool.formatAmount($refs.hetong && $refs.hetong.list && $refs.hetong.list[0] && $refs.hetong.list[0].expireAmount || 0),bg:'#F9F2E5',color:'#FF7603'},
+                {title:'转订单合同数',value:$refs.hetong && $refs.hetong.list && $refs.hetong.list[0] && $refs.hetong.list[0].convertOrderContractQty,bg:'#F3F9FC',color:'#8DCFFC'},
+                {title:'转订单金额',value:tool.formatAmount($refs.hetong && $refs.hetong.list && $refs.hetong.list[0] && $refs.hetong.list[0].convertOrderContractAmount || 0),bg:'#E8F7EC',color:'#78B32B'},
+              ]"
+            ></myCard>
+            <showIsNone title="合同明细">
+            <pageTable 
+              ref="hetong"
+              :tablecols="tool.tabelCol($route.name).contractTable.tablecols"
+              :param="param7"
+            ></pageTable>
+            </showIsNone>
+          </el-card>
+        </div>
+
+  
+      </div>
+      
+    </div>
+  </el-drawer>
+</template>
+
+<script>
+import pageTable from '@/HDrpManagement/customerPortrait/modules/pageTable'
+import showIsNone from '@/HDrpManagement/customerPortrait/modules/showIsNone'
+import myCard from '@/HDrpManagement/customerPortrait/modules/myCrad'
+import myTag from '@/HDrpManagement/customerPortrait/modules/myTag'
+import myRadio from '@/HDrpManagement/customerPortrait/modules/myRadio'
+export default {
+  name: "index",
+  components:{showIsNone,pageTable,myCard,myTag,myRadio},
+  props:['data'],
+  data() {
+    return {
+      dialogFormVisible:false,
+      baseInfo:{},//基本信息
+      //业绩
+      param1: {
+        "id": 20230717100404,
+        "content": {
+            "type":3,
+            "hrid":this.$route.query.id
+        }
+      },
+      //订单
+      param2: {
+        "id": 20230717100504,
+        "content": {
+            "pageNumber": 1,
+            "pageSize": 20,
+            "isAll":1,
+            "hrid":this.$route.query.id,
+            "where": {
+              type:''
+            }
+        }
+      },
+      //销售线索
+      param3: {
+        "id": 20230717100604,
+        "content": {
+          "pageNumber": 1,
+          "pageSize": 20,
+          "type":3,
+          "hrid":this.$route.query.id,
+        }
+      },
+      //线索跟进
+      param8: {
+        "id": 20230717100704,
+        "content": {
+          "pageNumber": 1,
+          "pageSize": 20,
+          "type":3,
+          "hrid":this.$route.query.id,
+        }
+      },
+      //客户
+      param4: {
+        "id": 20230717100804,
+        "content": {
+          "pageNumber": 1,
+          "pageSize": 20,
+          "type":3,
+          "hrid":this.$route.query.id,
+        }
+      },
+      //客户跟进
+      param9: {
+        "id": 20230717100904,
+        "content": {
+          "pageNumber": 1,
+          "pageSize": 20,
+          "type":3,
+          "hrid":this.$route.query.id,
+        }
+      },
+      //项目
+      param5: {
+        "id": 20230717101004,
+        "content": {
+            "pageNumber": 1,
+            "pageSize": 20,
+            "type":3,
+            "hrid":this.$route.query.id
+        }
+      },
+      //项目跟进
+      param10: {
+        "id": 20230717101104,
+        "content": {
+            "pageNumber": 1,
+            "pageSize": 20,
+            "type":3,
+            "hrid":this.$route.query.id
+        }
+      },
+      //报价单
+      param6: {
+        "id": 20230717101204,
+        "content": {
+          "pageNumber": 1,
+          "pageSize": 20,
+          "isAll":1,
+          "hrid":this.$route.query.id,
+          "where":{
+              "type":""
+          }
+        }
+      },
+      //合同
+      param7: {
+        "id": 20230717101304,
+        "content": {
+          "pageNumber": 1,
+          "pageSize": 20,
+          "isAll":1,
+          "hrid":this.$route.query.id,
+          "where":{
+              "type":""
+          }
+        }
+      },
+      performance:{},
+      contractTypeList:[],
+      orderTypeList:[],
+      stageList:[]
+    }
+  },
+  methods:{
+    async getbaseInfo () {
+      let res = await this.$api.requested({
+        "id": 20230717100304,
+        "content": {
+            "hrid":this.$route.query.id
+        }
+      })
+      this.baseInfo = res.data[0]
+      console.log(this.baseInfo,'基本信息');
+    },
+    async getPerformance () {
+      let res = await this.$api.requested(this.param1)
+      this.performance = res.data[0]
+      console.log(this.performance,'业绩');
+    },
+    async getSelectList () {
+      const res = await this.$store.dispatch('optiontypeselect','contracttype')
+      this.contractTypeList = res.data
+      console.log(this.contractTypeList,'合同类型');
+
+      const res2 = await this.$store.dispatch('optiontypeselect','ordertype')
+      this.orderTypeList = res2.data
+      console.log(this.orderTypeList,'订单类型');
+
+      /*获取阶段*/
+      const res3 = await this.$api.requested({
+        "id": 20221128143604,
+        "content": {
+          "pageNumber": 1,
+          "pageSize": 9999,
+          "where": {
+            "condition": "",
+            "allprojecttype":"",
+            "projecttype":""
+          }
+        }
+      })
+      this.stageList = res3.data
+    },
+    refreshTable (param,el) {
+      this[param].content.pageNumber = 1
+      this.$refs[el] && this.$refs[el].listData()
+    },
+    typeChange(param,el) {
+      this[param].content.pageNumber = 1
+      this.$refs[el] && this.$refs[el].listData()
+    }
+  },
+  mounted() {
+    this.getbaseInfo()
+    this.getPerformance()
+    this.getSelectList()
+  }
+}
+</script>
+
+<style scoped>
+*{
+  box-sizing: border-box;
+}
+.my-label {
+  background: rgba(235, 245, 253, 1);
+}
+.nowrap {
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  flex: 100;
+}
+
+/deep/.el-drawer {
+  background:#F5F5F5 !important; 
+}
+/deep/.el-drawer__header{
+  display: none !important;
+}
+
+/deep/.el-descriptions-item__cell {
+  padding: 8px 8px 0px 8px !important;
+}
+
+
+/deep/.el-card__header,/deep/.el-card__body {
+  padding: 10px !important;
+}
+.Mcontainer .Mcontainer-header {
+  display: flex;
+  align-items: center;
+}
+.Mcontainer .Mcontainer-header .Mcontainer-header__left {
+  display: flex;
+  max-width: 350px;
+  align-items: center;
+  padding-right: 10px;
+}
+.Mcontainer .Mcontainer-header .Mcontainer-header__right {
+  flex: 100;
+  border-left: 1px solid #cccccc;
+  padding-left: 20px;
+}
+.Mcontainer .Mcontainer-header .Mcontainer-header__left .account{
+  display: flex;
+  flex-direction: column;
+  justify-content: space-between;
+  margin-left: 10px;
+  overflow: hidden;
+}
+.Mcontainer .Mcontainer-header .Mcontainer-header__left .account .Mtag{
+  margin-top: 5px;
+}
+
+.Mcontainer .Mfollow{
+  margin-top: 10px;
+}
+
+.Mcontainer .peopleInfo {
+  margin-top: 10px;
+  padding-bottom: 10px;
+}
+.peopleInfo-content {
+  display: flex;
+  flex-direction: column;
+  height: 300px;
+  overflow-y: scroll;
+}
+.peopleInfo-content::-webkit-scrollbar {
+  display: none;
+}
+.peopleInfo-content .leader {
+  margin-bottom: 10px;
+  display: flex;
+  flex-direction: column;
+}
+.peopleInfo-content .leader .title {
+  font-size: 14px;
+}
+.peopleInfo-content .leader .content {
+  display: flex;
+  flex-wrap: wrap;
+}
+.peopleInfo-content .leader .content .item {
+  display: flex;
+  align-items: center;
+  margin: 0 20px 10px 0;
+}
+.peopleInfo-content .leader .content .avatar {
+  width: 50px;
+  height: 50px;
+  border-radius: 50%;
+  text-align: center;
+  line-height: 50px;
+  background: #3874F6;
+  margin-right:10px;
+  color: #ffffff;
+}
+.peopleInfo-content .leader .content .Info {
+  display: flex;
+  flex-direction: column;
+}
+.peopleInfo-content .leader .content .Info div {
+  display: flex;
+  align-items: center;
+  font-size: 12px;
+  color: #cccccc;
+}
+
+
+.peopleInfo-content .people {
+  margin-bottom: 10px;
+  display: flex;
+  flex-direction: column;
+}
+.peopleInfo-content .people .title {
+  font-size: 14px;
+}
+.peopleInfo-content .people .content {
+  display: flex;
+}
+.peopleInfo-content .people .content .item {
+  display: flex;
+  align-items: center;
+  margin: 0 20px 10px 0;
+}
+.peopleInfo-content .people .content .avatar {
+  width: 50px;
+  height: 50px;
+  border-radius: 50%;
+  text-align: center;
+  line-height: 50px;
+  background: #3874F6;
+  margin-right: 10px;
+  color: #ffffff;
+}
+.peopleInfo-content .people .content .Info {
+  display: flex;
+  flex-direction: column;
+}
+.peopleInfo-content .people .content .Info div {
+  display: flex;
+  align-items: center;
+  font-size: 12px;
+  color: #cccccc;
+}
+
+.peopleInfo-content .people {}
+
+.descript {
+  font-size: 12px;
+  color: #cccccc;
+  margin-right: 20px;
+}
+.title {
+  font-size: 14px;
+  color: #000000;
+  margin-right: 10px;
+}
+.myTitle {
+  margin-right:24px;
+  font-size: 16px;
+  font-weight: bold;
+}
+</style>

+ 2 - 1
src/HManagement/siteManage/systemRemind/index.vue

@@ -9,7 +9,8 @@
       tableName="systemRemindTable" 
       idName="sys_remind_configid" 
       :apiId="{query:20221220153101,del:''}"
-      :options="options">
+      :options="options"
+      :hideSearch="true">
       <div slot="custom"></div>
       <template v-slot:tbList="scope">
         <div>

+ 13 - 0
src/assets/customer.svg

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 26.4.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 32 32" style="enable-background:new 0 0 32 32;" xml:space="preserve">
+<style type="text/css">
+	.st0{fill:#3874F6;}
+</style>
+<path class="st0" d="M30.7,28.8h-1.3V15.6c0-1.7-1.3-3.2-3-3.5l-8.6-1.4V4.1c0-0.3,0-0.6-0.1-0.9l0,0c-0.5-1.9-2.4-3.1-4.3-2.6
+	L6.2,2.4C4.7,2.8,3.6,4.2,3.6,5.8v23H1.3c-0.9,0-1.3,0.4-1.3,1.3s0.4,1.3,1.3,1.3h2.2h11.6h2.7h11.6h1.3c0.9,0,1.3-0.4,1.3-1.3
+	S31.6,28.8,30.7,28.8z M19.6,19.9h5.3c0.5,0,0.9,0.4,0.9,0.9s-0.4,0.9-0.9,0.9h-5.3c-0.5,0-0.9-0.4-0.9-0.9
+	C18.7,20.3,19.1,19.9,19.6,19.9z M8,10.2h5.3c0.5,0,0.9,0.4,0.9,0.9S13.8,12,13.3,12H8c-0.5,0-0.9-0.4-0.9-0.9S7.5,10.2,8,10.2z
+	 M8,15.5h5.3c0.5,0,0.9,0.4,0.9,0.9s-0.4,0.9-0.9,0.9H8c-0.5,0-0.9-0.4-0.9-0.9S7.5,15.5,8,15.5z"/>
+</svg>

+ 20 - 0
src/assets/project.svg

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 26.4.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 32 32" style="enable-background:new 0 0 32 32;" xml:space="preserve">
+<style type="text/css">
+	.st0{fill:#3874F6;}
+</style>
+<g>
+	<path class="st0" d="M1.1,17.1L1.1,17.1L13.7,24c0.6,0.5,1.5,0.8,2.3,0.8c0.9,0,1.7-0.3,2.3-0.8l12.5-6.8l0,0l0.1-0.1
+		c1.3-1.1,1.4-3,0.4-4.3c-0.1-0.1-0.2-0.1-0.3,0l-1.2,1c-0.1,0.1-0.1,0.2,0,0.3c0.4,0.5,0.4,1.1-0.1,1.5l-12.5,6.8l0,0l-0.1,0.1
+		c-0.6,0.6-1.7,0.6-2.3,0l-0.1-0.1L2.3,15.6c-0.4-0.4-0.5-1.1-0.1-1.5c0.1-0.1,0.1-0.2,0-0.3l-1.2-1c-0.1-0.1-0.2-0.1-0.3,0
+		C-0.4,14.1-0.2,15.9,1.1,17.1z"/>
+	<path class="st0" d="M1.7,11l2,1.1l10.5,5.8c1,0.9,2.6,0.9,3.6,0l10.5-5.8l2-1.1c0.1-0.1,0.2-0.2,0.3-0.3c0.7-0.9,0.6-2.1-0.3-2.9
+		L17.8,1.1c-1-0.9-2.6-0.9-3.6,0L1.7,7.8c-0.9,0.8-1,2.1-0.3,2.9C1.5,10.8,1.6,10.9,1.7,11z"/>
+	<path class="st0" d="M31.3,19.6c-0.1-0.1-0.2-0.1-0.3,0l-1.2,1c-0.1,0.1-0.1,0.2,0,0.3c0.4,0.5,0.4,1.1-0.1,1.5l-12.5,6.8l0,0
+		l-0.1,0.1c-0.6,0.6-1.7,0.6-2.3,0l-0.1-0.1L2.3,22.3c-0.4-0.4-0.5-1.1-0.1-1.5c0.1-0.1,0.1-0.2,0-0.3l-1.2-1
+		c-0.1-0.1-0.2-0.1-0.3,0c-1.1,1.3-0.9,3.1,0.4,4.3l0.1,0.1l12.5,6.9c0.6,0.5,1.5,0.8,2.3,0.8c0.9,0,1.7-0.3,2.3-0.8L30.8,24l0,0
+		l0.1-0.1C32.2,22.7,32.4,20.9,31.3,19.6z"/>
+</g>
+</svg>

+ 11 - 0
src/assets/saler.svg

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 26.4.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 32 32" style="enable-background:new 0 0 32 32;" xml:space="preserve">
+<style type="text/css">
+	.st0{fill:#3874F6;}
+</style>
+<circle class="st0" cx="16" cy="8" r="8"/>
+<path class="st0" d="M18.5,16.2L16,18.7l-2.5-2.5C5.8,17.4,0,24,0,32h32C32,24,26.2,17.4,18.5,16.2z M16,29.7L13.3,27l2.7-8.2
+	l2.7,8.2L16,29.7z"/>
+</svg>

+ 1 - 1
src/components/export_excel/index.vue

@@ -20,7 +20,6 @@ export default {
         data.content.pageSize = this.total
       }
       data.content.isAll = false
-
       const res = await this.$api.requested(data)
       if (this.specialKey) {
         res.data.forEach(e=>{
@@ -31,6 +30,7 @@ export default {
         })
       }
       let table = JSON.parse(JSON.stringify(this.tablecols))
+      console.log(table);
       table.forEach((e,index) => {
         // 由于表格数据结构问题这里需要判断一下
         if (e.title === '省市县') {