Просмотр исходного кода

Merge branch 'orangeUrgent' into allTestUrgent

qymljy 9 месяцев назад
Родитель
Сommit
327e278236

+ 2 - 0
src/HDrpManagement/contactData/components/btnSelectInfo.vue

@@ -49,6 +49,8 @@ export default {
         const now = new Date();
         const monthStartDate = new Date(now.getFullYear(), now.getMonth());
         this.dateData = [monthStartDate,monthStartDate]
+      }else if (data == '全部'){
+        this.dateData = []
       }
       this.$emit('btnClick',data)
     },

+ 1 - 1
src/HDrpManagement/contactData/components/contactsAddAnalysis.vue

@@ -18,7 +18,7 @@
               :end-placeholder="$t('结束月份')">
           </el-date-picker>
         </div>
-        <fullScreen class="inline-16"  domId="contactsAddAnalysisFull" @onFull="onFull" @backFull="backFull"  ></fullScreen>
+<!--        <fullScreen class="inline-16"  domId="contactsAddAnalysisFull" @onFull="onFull" @backFull="backFull"  ></fullScreen>-->
       </template>
       <template slot="content">
         <div :style="{height:heightDiv}">

+ 1 - 1
src/HDrpManagement/contactData/components/contactsFollowAnalysis.vue

@@ -18,7 +18,7 @@
               :end-placeholder="$t('结束月份')">
           </el-date-picker>
         </div>
-        <fullScreen class="inline-16"  domId="contactsFollowAnalysisFull" @onFull="onFull" @backFull="backFull"  ></fullScreen>
+<!--        <fullScreen class="inline-16"  domId="contactsFollowAnalysisFull" @onFull="onFull" @backFull="backFull"  ></fullScreen>-->
       </template>
       <template slot="content">
         <div :style="{height:heightDiv}">

+ 247 - 0
src/HDrpManagement/contactData/components/statisticsOfClues.vue

@@ -0,0 +1,247 @@
+<template>
+  <div>
+    <dataTemPlate ref="dataTemPlateRef" :isTitle="true" title="联系人关联线索情况统计" @list="listData" id="statisticsOfCluesFull">
+      <template slot="operation">
+        <btnSelect ref="btnSelectRef" @btnClick="btnClick" class="inline-16"  :btnTitle="['全部','本年']" dateType="本年"></btnSelect>
+<!--        <fullScreen class="inline-16"  domId="statisticsOfCustomerFull" @onFull="onFull" @backFull="backFull"  ></fullScreen>-->
+      </template>
+      <template slot="content">
+        <div style="display: flex;justify-content: space-between" :style="{height:heightDiv}">
+          <div ref="statisticsOfCluesChart" :style="{height: heightChart}"></div>
+          <div style="width: 70%"  :style="{height: heightDiv}">
+            <tableDetail :layout="tablecols" :data="tableList" :opwidth="200" :custom="true" fixed-name="operation" :height="heightTable">
+              <template v-slot:customcol="scope">
+                <div v-if="scope.column.columnname === 'tag'">
+                  <div v-if="scope.column.data.tag">
+                    <div v-if="scope.column.data.tag.length > 0">
+                      <el-tag v-for="item in scope.column.data.tag" :key="item.index" :type="item === '支持者'?'warning':item === '反对者'?'danger':''" size="mini" style="margin:0 5px 0 0">
+                        {{$t(item)}}
+                      </el-tag>
+                    </div>
+                    <div v-else>--</div>
+                  </div>
+                  <div v-else>--</div>
+                </div>
+                <div v-else>{{scope.column.data[scope.column.columnname]||scope.column.columnname === 'operation' ? scope.column.data[scope.column.columnname] : '--'}}</div>
+              </template>
+              <template v-slot:opreation="scope">
+                <drawerTemp class="inline-16" v-if="detailPath" :data="scope.data" :detailPath="detailPath" :idName="idName"  :disabled="isFull"
+                            :listqueryid="listqueryid" :total="total" :overview="true"></drawerTemp>
+              </template>
+            </tableDetail>
+            <div style="margin-top:10px;text-align:right">
+              <el-pagination
+                  background
+                  small
+                  @size-change="handleSizeChange"
+                  @current-change="handleCurrentChange"
+                  :current-page="currentPage"
+                  :page-size="paramTable.content.pageSize"
+                  layout="total, prev, pager, next, jumper"
+                  :total="total">
+              </el-pagination>
+            </div>
+          </div>
+        </div>
+      </template>
+    </dataTemPlate>
+  </div>
+</template>
+
+<script>
+import dataTemPlate from '@/components/dataTemplate/index'
+import btnSelect from "./btnSelectInfo"
+import {Pie} from "@antv/g2plot";
+import fullScreen from "@/views/salesData/components/fullScreen";
+export default {
+  name: "statisticsOfClues",
+  components:{dataTemPlate,btnSelect,fullScreen,
+    drawerTemp:() =>  import('@/components/normal-basic-layout/drawerDetail/index')},
+  data() {
+    return {
+      detailPath:{
+        path:'/contactDataDetail'
+      },
+      idName:'sys_phonebookid',
+      isFull:false,
+      listqueryid:'',
+      paramChart:{
+        "id": 2025073115102102,
+        "content": {
+          "type": 1,
+          "dataid": 58,
+          "dateType": "本年",
+          "where": {
+            "begdate": "",
+            "enddate": "",
+            "isleave": "1"
+          }
+        },
+      },
+      paramTable:{
+        "id": 2025073115102902,
+        "content": {
+          "type": 1,
+          "dataid": 58,
+          "pageSize": 20,
+          "pageNumber": 1,
+          "dateType": "本年",
+          "where": {
+            "begdate": "",
+            "enddate": "",
+            "isleave": "1",
+            "isorderclue": ""
+          }
+        },
+      },
+      tablecols:[],
+      tableList:[],
+      total:0,
+      currentPage:0,
+      chartList:[],
+      chartCluesMap:null,
+      typesData:[],
+      heightChart:'100%',
+      heightDiv:'400px',
+      heightTable:'360px'
+    }
+  },
+  methods:{
+    listData(dataid,type,isleave,state,init){
+      this.paramChart.content.dataid = dataid
+      this.paramTable.content.dataid = dataid
+      this.paramChart.content.type = type
+      this.paramTable.content.type = type
+      this.paramChart.content.where.isleave = isleave
+      this.paramTable.content.where.isleave = isleave
+      this.chartData(init,state)
+      this.tableData()
+    },
+    async chartData(init,state){
+      const res = await this.$api.requested(this.paramChart)
+      this.chartList = res.data
+      if (init) {
+        this.chartCluesMap = new Pie(this.$refs.statisticsOfCluesChart, {
+          appendPadding: 10,
+          data:this.chartList,
+          angleField: 'ratio',
+          colorField: 'key',
+          radius: 1,
+          innerRadius: 0.64,
+          label:{
+            formatter: (datum) => `${datum.ratio}%`
+          },
+          tooltip:{
+            formatter: (datum) => {
+              return { name: datum.key, value: datum.ratio + '%' };
+            },
+          },
+          statistic: {
+            title: {
+              offsetY: -4,
+              style: {
+                fontSize:'16px'
+              },
+              content:this.$t('线索总数')
+            },
+            content: {
+              offsetY: 4,
+              style: {
+                whiteSpace: 'pre-wrap',
+                overflow: 'hidden',
+                textOverflow: 'ellipsis',
+                fontSize:'16px'
+              },
+              customHtml: (container, view, datum, data) => {
+                const text = data[0].totalqty
+                return text
+              },
+            },
+          },
+          legend: {
+            position:'bottom'
+          },
+          // 添加 中心统计文本 交互
+          interactions: [{ type: 'element-single-selected' },{ type: 'element-active' }],
+        });
+        this.chartCluesMap.on('element:click',(v) => {
+          if (v.data.data.key != this.paramTable.content.where.isorderclue) {
+            this.paramTable.content.pageNumber = 1
+            this.paramTable.content.where.isorderclue = v.data.data.key
+            this.tableData()
+          } else {
+            this.paramTable.content.pageNumber = 1
+            this.paramTable.content.where.isorderclue = ''
+            this.tableData()
+          }
+        })
+        this.chartCluesMap.render();
+      } else {
+        this.chartCluesMap.changeData(this.chartList)
+      }
+    },
+    async tableData(){
+      const res = await this.$api.requested(this.paramTable)
+      this.tableList = res.data
+      this.total = res.total
+      this.currentPage = res.pageNumber
+      this.listqueryid = res.listqueryid
+    },
+    btnClick(dateType,dateData){
+      this.paramTable.content.pageNumber = 1
+      if (dateType){
+        this.paramChart.content.dateType = dateType
+        this.paramTable.content.dateType = dateType
+      }else {
+        this.paramTable.content.where.begdate = dateData[0]
+        this.paramTable.content.where.enddate = dateData[1]
+        this.paramChart.content.where.begdate = dateData[0]
+        this.paramChart.content.where.enddate = dateData[1]
+      }
+      this.listData(this.paramChart.content.dataid,this.paramChart.content.type,this.paramChart.content.where.isleave)
+    },
+    handleSizeChange(val) {
+      // console.log(`每页 ${val} 条`);
+      this.paramTable.content.pageSize = val
+      this.listData(this.paramChart.content.dataid,this.paramChart.content.type,this.paramChart.content.where.isleave)
+    },
+    handleCurrentChange(val) {
+      // console.log(`当前页: ${val}`);
+      this.paramTable.content.pageNumber = val
+      this.listData(this.paramChart.content.dataid,this.paramChart.content.type,this.paramChart.content.where.isleave)
+    },
+    selectChange(){
+      this.paramChart.content.where.type = this.paramTable.content.where.type
+      this.listData(this.paramChart.content.dataid,this.paramChart.content.type,this.paramChart.content.where.isleave)
+    },
+    async queryType(){
+      if (this.typesData.length == 0){
+        const res = await this.$store.dispatch("optiontypeselect", "customertypemx")
+        this.typesData = res.data
+      }
+    },
+    /*全屏*/
+    onFull(){
+      this.heightChart = this.windowWidth > 1136 ? 'calc(100vh - 70px)':'calc(100vh - 123px)'
+      this.heightDiv = this.windowWidth > 1136 ? 'calc(100vh - 70px)':'calc(100vh - 123px)'
+      this.heightTable = this.windowWidth > 1136 ? 'calc(100vh - 100px)':'calc(100vh - 153px)'
+      this.isFull = true
+    },
+    /*退出全屏*/
+    backFull(val){
+      this.heightChart = '100%'
+      this.heightDiv = '400px'
+      this.heightTable = '360px'
+      this.isFull = false
+      this.$emit('backFull',val)
+    }
+  },
+  created() {
+    this.tablecols = this.tool.tabelCol(this.$route.name).contactsTable.tablecols
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 271 - 0
src/HDrpManagement/contactData/components/statisticsOfCustomer.vue

@@ -0,0 +1,271 @@
+<template>
+  <div>
+    <dataTemPlate ref="dataTemPlateRef" :isTitle="true" title="联系人关联客户情况统计" @list="listData" id="statisticsOfCustomerFull">
+      <template slot="operation">
+        <div class="mt-10 inline-16">
+          <label class="search__label">{{ $t("客户类型") }}:</label>
+          <el-select
+              class="inline-16"
+              v-model="paramTable.content.where.type"
+              size="small"
+              :placeholder="$t('请选择')"
+              @focus="queryType"
+              @change="selectChange"
+              clearable
+          >
+            <el-option
+                v-for="item in typesData"
+                :key="item.value"
+                :label="$t(item.value)"
+                :value="item.value"
+            >
+            </el-option>
+          </el-select>
+        </div>
+        <btnSelect ref="btnSelectRef" @btnClick="btnClick" class="inline-16"  :btnTitle="['全部','本年']" dateType="本年"></btnSelect>
+<!--        <fullScreen class="inline-16"  domId="statisticsOfCustomerFull" @onFull="onFull" @backFull="backFull"  ></fullScreen>-->
+      </template>
+      <template slot="content">
+        <div style="display: flex;justify-content: space-between" :style="{height:heightDiv}">
+          <div ref="statisticsOfCustomerChart" :style="{height: heightChart}"></div>
+          <div style="width: 70%"  :style="{height: heightDiv}">
+            <tableDetail :layout="tablecols" :data="tableList" :opwidth="200" :custom="true" fixed-name="operation" :height="heightTable">
+              <template v-slot:customcol="scope">
+                <div v-if="scope.column.columnname === 'tag'">
+                  <div v-if="scope.column.data.tag">
+                    <div v-if="scope.column.data.tag.length > 0">
+                      <el-tag v-for="item in scope.column.data.tag" :key="item.index" :type="item === '支持者'?'warning':item === '反对者'?'danger':''" size="mini" style="margin:0 5px 0 0">
+                        {{$t(item)}}
+                      </el-tag>
+                    </div>
+                    <div v-else>--</div>
+                  </div>
+                  <div v-else>--</div>
+                </div>
+                <div v-else>{{scope.column.data[scope.column.columnname]||scope.column.columnname === 'operation' ? scope.column.data[scope.column.columnname] : '--'}}</div>
+              </template>
+              <template v-slot:opreation="scope">
+                <drawerTemp class="inline-16" v-if="detailPath" :data="scope.data" :detailPath="detailPath" :idName="idName"  :disabled="isFull"
+                            :listqueryid="listqueryid" :total="total" :overview="true"></drawerTemp>
+              </template>
+            </tableDetail>
+            <div style="margin-top:10px;text-align:right">
+              <el-pagination
+                  background
+                  small
+                  @size-change="handleSizeChange"
+                  @current-change="handleCurrentChange"
+                  :current-page="currentPage"
+                  :page-size="paramTable.content.pageSize"
+                  layout="total, prev, pager, next, jumper"
+                  :total="total">
+              </el-pagination>
+            </div>
+          </div>
+        </div>
+      </template>
+    </dataTemPlate>
+  </div>
+</template>
+
+<script>
+import dataTemPlate from '@/components/dataTemplate/index'
+import btnSelect from "./btnSelectInfo"
+import {Pie} from "@antv/g2plot";
+import fullScreen from "@/views/salesData/components/fullScreen";
+export default {
+  name: "statisticsOfCustomer",
+  components:{dataTemPlate,btnSelect,fullScreen,
+    drawerTemp:() =>  import('@/components/normal-basic-layout/drawerDetail/index')},
+  data() {
+    return {
+      detailPath:{
+        path:'/contactDataDetail'
+      },
+      idName:'sys_phonebookid',
+      isFull:false,
+      listqueryid:'',
+      paramChart:{
+        "id": 2025080114334802,
+        "content": {
+          "type": 1,
+          "dataid": 58,
+          "dateType": "本年",
+          "where": {
+            "begdate": "",
+            "enddate": "",
+            "isleave": "1",
+            "type": ""
+          }
+        },
+      },
+      paramTable:{
+        "id": 2025080114335402,
+        "content": {
+          "type": 1,
+          "dataid": 58,
+          "pageSize": 20,
+          "pageNumber": 1,
+          "dateType": "本年",
+          "where": {
+            "begdate": "",
+            "enddate": "",
+            "isleave": "1",
+            "iscustomers": "",
+            "type": ""
+          }
+        },
+      },
+      tablecols:[],
+      tableList:[],
+      total:0,
+      currentPage:0,
+      chartList:[],
+      chartMap:null,
+      typesData:[],
+      heightChart:'100%',
+      heightDiv:'400px',
+      heightTable:'360px'
+    }
+  },
+  methods:{
+    listData(dataid,type,isleave,state,init){
+      console.log(dataid,'dataid')
+      console.log(type,'type')
+      this.paramChart.content.dataid = dataid
+      this.paramTable.content.dataid = dataid
+      this.paramChart.content.type = type
+      this.paramTable.content.type = type
+      this.paramChart.content.where.isleave = isleave
+      this.paramTable.content.where.isleave = isleave
+      this.chartData(init,state)
+      this.tableData()
+    },
+    async chartData(init,state){
+      const res = await this.$api.requested(this.paramChart)
+      this.chartList = res.data
+      if (init) {
+        this.chartMap = new Pie(this.$refs.statisticsOfCustomerChart, {
+          appendPadding: 10,
+          data:this.chartList,
+          angleField: 'ratio',
+          colorField: 'key',
+          radius: 1,
+          innerRadius: 0.64,
+          label:{
+            formatter: (datum) => `${datum.ratio}%`
+          },
+          tooltip:{
+            formatter: (datum) => {
+              return { name: datum.key, value: datum.ratio + '%' };
+            },
+          },
+          statistic: {
+            title: {
+              offsetY: -4,
+              style: {
+                fontSize:'16px'
+              },
+              content:this.$t('客户总数')
+            },
+            content: {
+              offsetY: 4,
+              style: {
+                whiteSpace: 'pre-wrap',
+                overflow: 'hidden',
+                textOverflow: 'ellipsis',
+                fontSize:'16px'
+              },
+              customHtml: (container, view, datum, data) => {
+                const text = data[0].totalqty
+                return text
+              },
+            },
+          },
+          legend: {
+            position:'bottom'
+          },
+          // 添加 中心统计文本 交互
+          interactions: [{ type: 'element-single-selected' },{ type: 'element-active' }],
+        });
+        this.chartMap.on('element:click',(v) => {
+          if (v.data.data.key != this.paramTable.content.where.iscustomers) {
+            this.paramTable.content.pageNumber = 1
+            this.paramTable.content.where.iscustomers = v.data.data.key
+            this.tableData()
+          } else {
+            this.paramTable.content.pageNumber = 1
+            this.paramTable.content.where.iscustomers = ''
+            this.tableData()
+          }
+        })
+        this.chartMap.render();
+      } else {
+        this.chartMap.changeData(this.chartList)
+      }
+    },
+    async tableData(){
+      const res = await this.$api.requested(this.paramTable)
+      this.tableList = res.data
+      this.total = res.total
+      this.currentPage = res.pageNumber
+      this.listqueryid = res.listqueryid
+    },
+    btnClick(dateType,dateData){
+      this.paramTable.content.pageNumber = 1
+      if (dateType){
+        this.paramChart.content.dateType = dateType
+        this.paramTable.content.dateType = dateType
+      }else {
+        this.paramTable.content.where.begdate = dateData[0]
+        this.paramTable.content.where.enddate = dateData[1]
+        this.paramChart.content.where.begdate = dateData[0]
+        this.paramChart.content.where.enddate = dateData[1]
+      }
+      this.listData(this.paramChart.content.dataid,this.paramChart.content.type,this.paramChart.content.where.isleave)
+    },
+    handleSizeChange(val) {
+      // console.log(`每页 ${val} 条`);
+      this.paramTable.content.pageSize = val
+      this.listData(this.paramChart.content.dataid,this.paramChart.content.type,this.paramChart.content.where.isleave)
+    },
+    handleCurrentChange(val) {
+      // console.log(`当前页: ${val}`);
+      this.paramTable.content.pageNumber = val
+      this.listData(this.paramChart.content.dataid,this.paramChart.content.type,this.paramChart.content.where.isleave)
+    },
+    selectChange(){
+      this.paramChart.content.where.type = this.paramTable.content.where.type
+      this.listData(this.paramChart.content.dataid,this.paramChart.content.type,this.paramChart.content.where.isleave)
+    },
+    async queryType(){
+      if (this.typesData.length == 0){
+        const res = await this.$store.dispatch("optiontypeselect", "customertypemx")
+        this.typesData = res.data
+      }
+    },
+    /*全屏*/
+    onFull(){
+      this.heightChart = this.windowWidth > 1136 ? 'calc(100vh - 70px)':'calc(100vh - 123px)'
+      this.heightDiv = this.windowWidth > 1136 ? 'calc(100vh - 70px)':'calc(100vh - 123px)'
+      this.heightTable = this.windowWidth > 1136 ? 'calc(100vh - 100px)':'calc(100vh - 153px)'
+      this.isFull = true
+    },
+    /*退出全屏*/
+    backFull(val){
+      this.heightChart = '100%'
+      this.heightDiv = '400px'
+      this.heightTable = '360px'
+      this.isFull = false
+      this.$emit('backFull',val)
+    }
+  },
+  created() {
+    this.tablecols = this.tool.tabelCol(this.$route.name).contactsTable.tablecols
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 243 - 0
src/HDrpManagement/contactData/components/statisticsOfFollow.vue

@@ -0,0 +1,243 @@
+<template>
+  <div>
+    <dataTemPlate ref="dataTemPlateRef" :isTitle="true" title="联系人跟进线索情况统计" @list="listData" id="statisticsOfFollowFull">
+      <template slot="operation">
+        <btnSelect ref="btnSelectRef" @btnClick="btnClick" class="inline-16"  :btnTitle="['全部','本年']" dateType="本年"></btnSelect>
+        <!--        <fullScreen class="inline-16"  domId="statisticsOfCustomerFull" @onFull="onFull" @backFull="backFull"  ></fullScreen>-->
+      </template>
+      <template slot="content">
+        <div style="display: flex;justify-content: space-between" :style="{height:heightDiv}">
+          <div ref="statisticsOfFollowChart" :style="{height: heightChart}"></div>
+          <div style="width: 70%"  :style="{height: heightDiv}">
+            <tableDetail :layout="tablecols" :data="tableList" :opwidth="200" :custom="true" fixed-name="operation" :height="heightTable">
+              <template v-slot:customcol="scope">
+                <div v-if="scope.column.columnname === 'tag'">
+                  <div v-if="scope.column.data.tag">
+                    <div v-if="scope.column.data.tag.length > 0">
+                      <el-tag v-for="item in scope.column.data.tag" :key="item.index" :type="item === '支持者'?'warning':item === '反对者'?'danger':''" size="mini" style="margin:0 5px 0 0">
+                        {{$t(item)}}
+                      </el-tag>
+                    </div>
+                    <div v-else>--</div>
+                  </div>
+                  <div v-else>--</div>
+                </div>
+                <div v-else>{{scope.column.data[scope.column.columnname]||scope.column.columnname === 'operation' ? scope.column.data[scope.column.columnname] : '--'}}</div>
+              </template>
+              <template v-slot:opreation="scope">
+                <drawerTemp class="inline-16" v-if="detailPath" :data="scope.data" :detailPath="detailPath" :idName="idName"  :disabled="isFull"
+                            :listqueryid="listqueryid" :total="total" :overview="true"></drawerTemp>
+              </template>
+            </tableDetail>
+            <div style="margin-top:10px;text-align:right">
+              <el-pagination
+                  background
+                  small
+                  @size-change="handleSizeChange"
+                  @current-change="handleCurrentChange"
+                  :current-page="currentPage"
+                  :page-size="paramTable.content.pageSize"
+                  layout="total, prev, pager, next, jumper"
+                  :total="total">
+              </el-pagination>
+            </div>
+          </div>
+        </div>
+      </template>
+    </dataTemPlate>
+  </div>
+</template>
+
+<script>
+import dataTemPlate from '@/components/dataTemplate/index'
+import btnSelect from "./btnSelectInfo"
+import {Pie} from "@antv/g2plot";
+import fullScreen from "@/views/salesData/components/fullScreen";
+export default {
+  name: "statisticsOfFollow",
+  components:{dataTemPlate,btnSelect,fullScreen,
+    drawerTemp:() =>  import('@/components/normal-basic-layout/drawerDetail/index')},
+  data() {
+    return {
+      detailPath:{
+        path:'/contactDataDetail'
+      },
+      idName:'sys_phonebookid',
+      isFull:false,
+      listqueryid:'',
+      paramChart:{
+        "id": 2025072814054402,
+        "content": {
+          "type": 1,
+          "dataid": 58,
+          "username": JSON.parse(sessionStorage.getItem('active_account')).name,
+          "dateType": "本年",
+          "where": {
+            "begdate": "",
+            "enddate": "",
+            "isleave": "1",
+          }
+        },
+      },
+      paramTable:{
+        "id": 2025072814055602,
+        "content": {
+          "type": 1,
+          "dataid": 58,
+          "pageSize": 20,
+          "pageNumber": 1,
+          "dateType": "本年",
+          "username": JSON.parse(sessionStorage.getItem('active_account')).name,
+          "where": {
+            "begdate": "",
+            "enddate": "",
+            "isleave": "1",
+            "isfollowup": "",
+          }
+        },
+      },
+      tablecols:[],
+      tableList:[],
+      total:0,
+      currentPage:0,
+      chartList:[],
+      chartMap:null,
+      typesData:[],
+      heightChart:'100%',
+      heightDiv:'400px',
+      heightTable:'360px'
+    }
+  },
+  methods:{
+    listData(dataid,type,isleave,state,init){
+      this.paramChart.content.dataid = dataid
+      this.paramTable.content.dataid = dataid
+      this.paramChart.content.type = type
+      this.paramTable.content.type = type
+      this.paramChart.content.where.isleave = isleave
+      this.paramTable.content.where.isleave = isleave
+      this.chartData(init,state)
+      this.tableData()
+    },
+    async chartData(init,state){
+      const res = await this.$api.requested(this.paramChart)
+      this.chartList = res.data
+      if (init) {
+        this.chartMap = new Pie(this.$refs.statisticsOfFollowChart, {
+          appendPadding: 10,
+          data:this.chartList,
+          angleField: 'ratio',
+          colorField: 'key',
+          radius: 1,
+          innerRadius: 0.64,
+          label:{
+            formatter: (datum) => `${datum.ratio}%`
+          },
+          tooltip:{
+            formatter: (datum) => {
+              return { name: datum.key, value: datum.ratio + '%' };
+            },
+          },
+          statistic: {
+            title: {
+              offsetY: -4,
+              style: {
+                fontSize:'16px'
+              },
+              content:this.$t('跟进总数')
+            },
+            content: {
+              offsetY: 4,
+              style: {
+                whiteSpace: 'pre-wrap',
+                overflow: 'hidden',
+                textOverflow: 'ellipsis',
+                fontSize:'16px'
+              },
+              customHtml: (container, view, datum, data) => {
+                const text = data[0].totalqty
+                return text
+              },
+            },
+          },
+          legend: {
+            position:'bottom'
+          },
+          // 添加 中心统计文本 交互
+          interactions: [{ type: 'element-single-selected' },{ type: 'element-active' }],
+        });
+        this.chartMap.on('element:click',(v) => {
+          if (v.data.data.key != this.paramTable.content.where.isfollowup) {
+            this.paramTable.content.pageNumber = 1
+            this.paramTable.content.where.isfollowup = v.data.data.key
+            this.tableData()
+          } else {
+            this.paramTable.content.pageNumber = 1
+            this.paramTable.content.where.isfollowup = ''
+            this.tableData()
+          }
+        })
+        this.chartMap.render();
+      } else {
+        this.chartMap.changeData(this.chartList)
+      }
+    },
+    async tableData(){
+      const res = await this.$api.requested(this.paramTable)
+      this.tableList = res.data
+      this.total = res.total
+      this.currentPage = res.pageNumber
+      this.listqueryid = res.listqueryid
+    },
+    btnClick(dateType,dateData){
+      this.paramTable.content.pageNumber = 1
+      if (dateType){
+        this.paramChart.content.dateType = dateType
+        this.paramTable.content.dateType = dateType
+      }else {
+        this.paramTable.content.where.begdate = dateData[0]
+        this.paramTable.content.where.enddate = dateData[1]
+        this.paramChart.content.where.begdate = dateData[0]
+        this.paramChart.content.where.enddate = dateData[1]
+      }
+      this.listData(this.paramChart.content.dataid,this.paramChart.content.type,this.paramChart.content.where.isleave)
+    },
+    handleSizeChange(val) {
+      // console.log(`每页 ${val} 条`);
+      this.paramTable.content.pageSize = val
+      this.listData(this.paramChart.content.dataid,this.paramChart.content.type,this.paramChart.content.where.isleave)
+    },
+    handleCurrentChange(val) {
+      // console.log(`当前页: ${val}`);
+      this.paramTable.content.pageNumber = val
+      this.listData(this.paramChart.content.dataid,this.paramChart.content.type,this.paramChart.content.where.isleave)
+    },
+    selectChange(){
+      this.paramChart.content.where.type = this.paramTable.content.where.type
+      this.listData(this.paramChart.content.dataid,this.paramChart.content.type,this.paramChart.content.where.isleave)
+    },
+    /*全屏*/
+    onFull(){
+      this.heightChart = this.windowWidth > 1136 ? 'calc(100vh - 70px)':'calc(100vh - 123px)'
+      this.heightDiv = this.windowWidth > 1136 ? 'calc(100vh - 70px)':'calc(100vh - 123px)'
+      this.heightTable = this.windowWidth > 1136 ? 'calc(100vh - 100px)':'calc(100vh - 153px)'
+      this.isFull = true
+    },
+    /*退出全屏*/
+    backFull(val){
+      this.heightChart = '100%'
+      this.heightDiv = '400px'
+      this.heightTable = '360px'
+      this.isFull = false
+      this.$emit('backFull',val)
+    }
+  },
+  created() {
+    this.tablecols = this.tool.tabelCol(this.$route.name).contactsTable.tablecols
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 302 - 0
src/HDrpManagement/contactData/components/statisticsOfProject.vue

@@ -0,0 +1,302 @@
+<template>
+  <div>
+    <dataTemPlate ref="dataTemPlateRef" :isTitle="true" title="联系人关联项目情况统计" @list="listData" id="statisticsOfProjectFull">
+      <template slot="operation">
+        <div class="mt-10 inline-16">
+          <label class="search__label">{{ $t("项目类型") }}:</label>
+          <el-select
+              class="inline-16"
+              v-model="paramTable.content.where.projecttype"
+              size="small"
+              :placeholder="$t('请选择')"
+              @focus="queryType"
+              @change="selectChange"
+              clearable
+          >
+            <el-option
+                v-for="item in typesData"
+                :key="item.value"
+                :label="$t(item.value)"
+                :value="item.value"
+            >
+            </el-option>
+          </el-select>
+        </div>
+        <div class="mt-10 inline-16">
+          <label  class="search__label">{{$t(`项目状态`)}}:</label>
+          <el-select class="inline-24" v-model="paramTable.content.where.status" :placeholder="$t(`请选择项目状态`)" @change="selectChange" size="small" multiple  clearable>
+            <el-option
+                v-for="item in statusTab"
+                :key="item.value"
+                :label="$t(item.label)"
+                :value="item.value">
+            </el-option>
+          </el-select>
+        </div>
+        <btnSelect ref="btnSelectRef" @btnClick="btnClick" class="inline-16"  :btnTitle="['全部','本年']" dateType="本年"></btnSelect>
+<!--        <fullScreen class="inline-16"  domId="statisticsOfCustomerFull" @onFull="onFull" @backFull="backFull"  ></fullScreen>-->
+      </template>
+      <template slot="content">
+        <div style="display: flex;justify-content: space-between" :style="{height:heightDiv}">
+          <div ref="statisticsOfProjectChart" :style="{height: heightChart}"></div>
+          <div style="width: 70%"  :style="{height: heightDiv}">
+            <tableDetail :layout="tablecols" :data="tableList" :opwidth="200" :custom="true" fixed-name="operation" :height="heightTable">
+              <template v-slot:customcol="scope">
+                <div v-if="scope.column.columnname === 'tag'">
+                  <div v-if="scope.column.data.tag">
+                    <div v-if="scope.column.data.tag.length > 0">
+                      <el-tag v-for="item in scope.column.data.tag" :key="item.index" :type="item === '支持者'?'warning':item === '反对者'?'danger':''" size="mini" style="margin:0 5px 0 0">
+                        {{$t(item)}}
+                      </el-tag>
+                    </div>
+                    <div v-else>--</div>
+                  </div>
+                  <div v-else>--</div>
+                </div>
+                <div v-else>{{scope.column.data[scope.column.columnname]||scope.column.columnname === 'operation' ? scope.column.data[scope.column.columnname] : '--'}}</div>
+              </template>
+              <template v-slot:opreation="scope">
+                <drawerTemp class="inline-16" v-if="detailPath" :data="scope.data" :detailPath="detailPath" :idName="idName"  :disabled="isFull"
+                            :listqueryid="listqueryid" :total="total" :overview="true"></drawerTemp>
+              </template>
+            </tableDetail>
+            <div style="margin-top:10px;text-align:right">
+              <el-pagination
+                  background
+                  small
+                  @size-change="handleSizeChange"
+                  @current-change="handleCurrentChange"
+                  :current-page="currentPage"
+                  :page-size="paramTable.content.pageSize"
+                  layout="total, prev, pager, next, jumper"
+                  :total="total">
+              </el-pagination>
+            </div>
+          </div>
+        </div>
+      </template>
+    </dataTemPlate>
+  </div>
+</template>
+
+<script>
+import dataTemPlate from '@/components/dataTemplate/index'
+import btnSelect from "./btnSelectInfo"
+import {Pie} from "@antv/g2plot";
+import fullScreen from "@/views/salesData/components/fullScreen";
+export default {
+  name: "statisticsOfProject",
+  components:{dataTemPlate,btnSelect,fullScreen,
+    drawerTemp:() =>  import('@/components/normal-basic-layout/drawerDetail/index')},
+  data() {
+    return {
+      detailPath:{
+        path:'/contactDataDetail'
+      },
+      idName:'sys_phonebookid',
+      isFull:false,
+      listqueryid:'',
+      paramChart:{
+        "id": 2025080114335902,
+        "content": {
+          "type": 1,
+          "dataid": 58,
+          "dateType": "本年",
+          "where": {
+            "begdate": "",
+            "enddate": "",
+            "isleave": "1",
+            "projecttype":"",
+            "status": []
+          }
+        },
+      },
+      paramTable:{
+        "id": 2025080114340402,
+        "content": {
+          "type": 1,
+          "dataid": 58,
+          "pageSize": 10,
+          "pageNumber": 1,
+          "dateType": "本年",
+          "where": {
+            "begdate": "",
+            "enddate": "",
+            "isleave": "1",
+            "isprojects": "",
+            "projecttype":"",
+            "status": []
+          }
+        },
+      },
+      tablecols:[],
+      tableList:[],
+      total:0,
+      currentPage:0,
+      chartList:[],
+      chartMap:null,
+      typesData:[],
+      heightChart:'100%',
+      heightDiv:'400px',
+      heightTable:'360px',
+      statusTab:[
+        {
+          value:"跟进中",
+          label:"跟进中"
+        },
+        {
+          value:"已成交",
+          label:"已成交"
+        },
+        {
+          value:"已失败",
+          label:"已失败"
+        },
+        {
+          value:"已结案",
+          label:"已结案"
+        }
+      ],
+    }
+  },
+  methods:{
+    listData(dataid,type,isleave,state,init){
+      this.paramChart.content.dataid = dataid
+      this.paramTable.content.dataid = dataid
+      this.paramChart.content.type = type
+      this.paramTable.content.type = type
+      this.paramChart.content.where.isleave = isleave
+      this.paramTable.content.where.isleave = isleave
+      // this.paramTable.content.where.status = this.paramTable.content.where.status?this.paramTable.content.where.status:[]
+      // this.paramChart.content.where.status = this.paramChart.content.where.status?this.paramChart.content.where.status:[]
+      this.chartData(init,state)
+      this.tableData()
+    },
+    async chartData(init,state){
+      const res = await this.$api.requested(this.paramChart)
+      this.chartList = res.data
+      if (init) {
+        this.chartMap = new Pie(this.$refs.statisticsOfProjectChart, {
+          appendPadding: 10,
+          data:this.chartList,
+          angleField: 'ratio',
+          colorField: 'key',
+          radius: 1,
+          innerRadius: 0.64,
+          label:{
+            formatter: (datum) => `${datum.ratio}%`
+          },
+          tooltip:{
+            formatter: (datum) => {
+              return { name: datum.key, value: datum.ratio + '%' };
+            },
+          },
+          statistic: {
+            title: {
+              offsetY: -4,
+              style: {
+                fontSize:'16px'
+              },
+              content:this.$t('项目总数')
+            },
+            content: {
+              offsetY: 4,
+              style: {
+                whiteSpace: 'pre-wrap',
+                overflow: 'hidden',
+                textOverflow: 'ellipsis',
+                fontSize:'16px'
+              },
+              customHtml: (container, view, datum, data) => {
+                const text = data[0].totalqty
+                return text
+              },
+            },
+          },
+          legend: {
+            position:'bottom'
+          },
+          // 添加 中心统计文本 交互
+          interactions: [{ type: 'element-single-selected' },{ type: 'element-active' }],
+        });
+        this.chartMap.on('element:click',(v) => {
+          if (v.data.data.key != this.paramTable.content.where.isprojects) {
+            this.paramTable.content.pageNumber = 1
+            this.paramTable.content.where.isprojects = v.data.data.key
+            this.tableData()
+          } else {
+            this.paramTable.content.pageNumber = 1
+            this.paramTable.content.where.isprojects = ''
+            this.tableData()
+          }
+        })
+        this.chartMap.render();
+      } else {
+        this.chartMap.changeData(this.chartList)
+      }
+    },
+    async tableData(){
+      const res = await this.$api.requested(this.paramTable)
+      this.tableList = res.data
+      this.total = res.total
+      this.currentPage = res.pageNumber
+      this.listqueryid = res.listqueryid
+    },
+    btnClick(dateType,dateData){
+      this.paramTable.content.pageNumber = 1
+      if (dateType){
+        this.paramChart.content.dateType = dateType
+        this.paramTable.content.dateType = dateType
+      }else {
+        this.paramTable.content.where.begdate = dateData[0]
+        this.paramTable.content.where.enddate = dateData[1]
+        this.paramChart.content.where.begdate = dateData[0]
+        this.paramChart.content.where.enddate = dateData[1]
+      }
+      this.listData(this.paramChart.content.dataid,this.paramChart.content.type,this.paramChart.content.where.isleave)
+    },
+    handleSizeChange(val) {
+      // console.log(`每页 ${val} 条`);
+      this.paramTable.content.pageSize = val
+      this.listData(this.paramChart.content.dataid,this.paramChart.content.type,this.paramChart.content.where.isleave)
+    },
+    handleCurrentChange(val) {
+      // console.log(`当前页: ${val}`);
+      this.paramTable.content.pageNumber = val
+      this.listData(this.paramChart.content.dataid,this.paramChart.content.type,this.paramChart.content.where.isleave)
+    },
+    selectChange(){
+      this.paramChart.content.dateType = this.paramTable.content.where.type
+      this.listData(this.paramChart.content.dataid,this.paramChart.content.type,this.paramChart.content.where.isleave)
+    },
+    async queryType(){
+      if (this.typesData.length == 0){
+        const res = await this.$store.dispatch("optiontypeselect", "projecttype")
+        this.typesData = res.data
+      }
+    },
+    /*全屏*/
+    onFull(){
+      this.heightChart = this.windowWidth > 1136 ? 'calc(100vh - 70px)':'calc(100vh - 123px)'
+      this.heightDiv = this.windowWidth > 1136 ? 'calc(100vh - 70px)':'calc(100vh - 123px)'
+      this.heightTable = this.windowWidth > 1136 ? 'calc(100vh - 100px)':'calc(100vh - 153px)'
+      this.isFull = true
+    },
+    /*退出全屏*/
+    backFull(val){
+      this.heightChart = '100%'
+      this.heightDiv = '400px'
+      this.heightTable = '360px'
+      this.isFull = false
+      this.$emit('backFull',val)
+    }
+  },
+  created() {
+    this.tablecols = this.tool.tabelCol(this.$route.name).contactsTable.tablecols
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 45 - 1
src/HDrpManagement/contactData/index.vue

@@ -12,6 +12,7 @@
               <btnSelect :btn-title="['全部','本年','本季','本月','上月','去年']" :date-type="dateType" @btnClick="btnClick"></btnSelect>
             </div>
           </div>
+          <!--  数据概况        -->
           <dataBoard title="联系人数据概况" :mainData="maninInfo" heightNew="145px" @goDetail="goDetail"></dataBoard>
           <dataDetail ref="detailRef" :param="paramDetail" :person="person" :departmentid="depment" :layout="tablecols" :title="detailTitle" :titleHeader="titleHeader" height="calc(100vh - 225px)" tableType="联系人数据概况">
             <template slot="custom">
@@ -160,9 +161,21 @@
               </div>
             </template>
           </dataDetail>
+          <!--  联系人销售贡献度排行        -->
           <salesContribution class="mt-10" ref="salesContributionRef"></salesContribution>
+          <!--  近12月联系人新增分析        -->
           <contactsAddAnalysis class="mt-10" ref="contactsAddAnalysisRef"></contactsAddAnalysis>
+          <!--  联系人关联线索情况统计       -->
+          <statisticsOfClues class="mt-10" ref="statisticsOfCluesRef"></statisticsOfClues>
+          <!--  联系人关联客户情况统计       -->
+          <statisticsOfCustomer class="mt-10" ref="statisticsOfCustomerRef"></statisticsOfCustomer>
+          <!--  联系人关联项目情况统计       -->
+          <statisticsOfProject class="mt-10" ref="statisticsOfProjectRef"></statisticsOfProject>
+          <!--  联系人跟进情况统计       -->
+          <statisticsOfFollow class="mt-10" ref="statisticsOfFollowRef"></statisticsOfFollow>
+          <!--  近12月联系人跟进分析        -->
           <contactsFollowAnalysis class="mt-10" ref="contactsFollowAnalysisRef"></contactsFollowAnalysis>
+          <!--          -->
         </div>
       </template>
     </normal-layout>
@@ -178,9 +191,14 @@ import salesContribution from './components/salesContribution'
 import depStatus from './components/depStatus'
 import contactsAddAnalysis from './components/contactsAddAnalysis'
 import contactsFollowAnalysis from './components/contactsFollowAnalysis'
+import statisticsOfClues from './components/statisticsOfClues'
+import statisticsOfCustomer from './components/statisticsOfCustomer'
+import statisticsOfProject from './components/statisticsOfProject'
+import statisticsOfFollow from './components/statisticsOfFollow'
 export default {
   name: "index",
-  components:{normalLayout,btnSelect,dataBoard,dataDetail,salesContribution,depStatus,contactsAddAnalysis,contactsFollowAnalysis},
+  components:{normalLayout,btnSelect,dataBoard,dataDetail,salesContribution,depStatus,contactsAddAnalysis,contactsFollowAnalysis,statisticsOfClues,statisticsOfCustomer,statisticsOfProject,
+    statisticsOfFollow},
   data(){
     return {
       scrollData:'',
@@ -333,6 +351,10 @@ export default {
       this.$refs.salesContributionRef.$refs.depStatusProRef.deplist = this.deplist
       this.$refs.contactsAddAnalysisRef.$refs.dataTemPlateRef.$refs.depStatusRef.deplist = this.deplist
       this.$refs.contactsFollowAnalysisRef.$refs.dataTemPlateRef.$refs.depStatusRef.deplist = this.deplist
+      this.$refs.statisticsOfCluesRef.$refs.dataTemPlateRef.$refs.depStatusRef.deplist = this.deplist
+      this.$refs.statisticsOfCustomerRef.$refs.dataTemPlateRef.$refs.depStatusRef.deplist = this.deplist
+      this.$refs.statisticsOfProjectRef.$refs.dataTemPlateRef.$refs.depStatusRef.deplist = this.deplist
+      this.$refs.statisticsOfFollowRef.$refs.dataTemPlateRef.$refs.depStatusRef.deplist = this.deplist
 
       this.personnelList = res.data.hr
       this.$refs.allDepRef.personnelList = this.personnelList
@@ -340,6 +362,10 @@ export default {
       this.$refs.salesContributionRef.$refs.depStatusProRef.personnelList = this.personnelList
       this.$refs.contactsAddAnalysisRef.$refs.dataTemPlateRef.$refs.depStatusRef.personnelList = this.personnelList
       this.$refs.contactsFollowAnalysisRef.$refs.dataTemPlateRef.$refs.depStatusRef.personnelList = this.personnelList
+      this.$refs.statisticsOfCluesRef.$refs.dataTemPlateRef.$refs.depStatusRef.personnelList = this.personnelList
+      this.$refs.statisticsOfCustomerRef.$refs.dataTemPlateRef.$refs.depStatusRef.personnelList = this.personnelList
+      this.$refs.statisticsOfProjectRef.$refs.dataTemPlateRef.$refs.depStatusRef.personnelList = this.personnelList
+      this.$refs.statisticsOfFollowRef.$refs.dataTemPlateRef.$refs.depStatusRef.personnelList = this.personnelList
 
       this.depment = ''
       this.$refs.allDepRef.depment = this.depment
@@ -347,6 +373,10 @@ export default {
       this.$refs.salesContributionRef.$refs.depStatusProRef.depment = this.depment
       this.$refs.contactsAddAnalysisRef.$refs.dataTemPlateRef.$refs.depStatusRef.depment = this.depment
       this.$refs.contactsFollowAnalysisRef.$refs.dataTemPlateRef.$refs.depStatusRef.depment = this.depment
+      this.$refs.statisticsOfCluesRef.$refs.dataTemPlateRef.$refs.depStatusRef.depment = this.depment
+      this.$refs.statisticsOfCustomerRef.$refs.dataTemPlateRef.$refs.depStatusRef.depment = this.depment
+      this.$refs.statisticsOfProjectRef.$refs.dataTemPlateRef.$refs.depStatusRef.depment = this.depment
+      this.$refs.statisticsOfFollowRef.$refs.dataTemPlateRef.$refs.depStatusRef.depment = this.depment
 
       this.person = JSON.parse(window.sessionStorage.getItem('active_account')).name
       this.$refs.allDepRef.person = this.person
@@ -354,6 +384,10 @@ export default {
       this.$refs.salesContributionRef.$refs.depStatusProRef.person = this.person
       this.$refs.contactsAddAnalysisRef.$refs.dataTemPlateRef.$refs.depStatusRef.person = this.person
       this.$refs.contactsFollowAnalysisRef.$refs.dataTemPlateRef.$refs.depStatusRef.person = this.person
+      this.$refs.statisticsOfCluesRef.$refs.dataTemPlateRef.$refs.depStatusRef.person = this.person
+      this.$refs.statisticsOfCustomerRef.$refs.dataTemPlateRef.$refs.depStatusRef.person = this.person
+      this.$refs.statisticsOfProjectRef.$refs.dataTemPlateRef.$refs.depStatusRef.person = this.person
+      this.$refs.statisticsOfFollowRef.$refs.dataTemPlateRef.$refs.depStatusRef.person = this.person
 
       const userid = JSON.parse(sessionStorage.getItem('active_account')).userid
       this.otherMethod(userid)
@@ -469,6 +503,11 @@ export default {
       this.$refs.salesContributionRef.listData(dataid,0,1)
       this.$refs.contactsAddAnalysisRef.listData(0,dataid,1,null,true)
       this.$refs.contactsFollowAnalysisRef.listData(0,dataid,1,null,true)
+      this.$refs.statisticsOfCluesRef.paramTable.content.pageNumber = 1
+      this.$refs.statisticsOfCluesRef.listData(dataid,0,1,null,true)
+      this.$refs.statisticsOfCustomerRef.listData(dataid,0,1,null,true)
+      this.$refs.statisticsOfProjectRef.listData(dataid,0,1,null,true)
+      this.$refs.statisticsOfFollowRef.listData(dataid,0,1,null,true)
     },
     /*其他页面再次调用*/
     otherModel(dataid,type,isleave,state){
@@ -485,6 +524,11 @@ export default {
       this.$refs.salesContributionRef.listData(dataid,type,isleave,state)
       this.$refs.contactsAddAnalysisRef.listData(0,dataid,1,state,null)
       this.$refs.contactsFollowAnalysisRef.listData(0,dataid,1,state,null)
+      this.$refs.statisticsOfCluesRef.paramTable.content.pageNumber = 1
+      this.$refs.statisticsOfCluesRef.listData(dataid,0,1,state,null)
+      this.$refs.statisticsOfCustomerRef.listData(dataid,0,1,state,null)
+      this.$refs.statisticsOfProjectRef.listData(dataid,0,1,state,null)
+      this.$refs.statisticsOfFollowRef.listData(dataid,0,1,state,null)
     },
     /*联系人数据概况*/
     async queryMainData(dataid,dateType){

+ 1 - 1
src/HManagement/serviceDataScreen/components/profileTemplate.vue

@@ -22,7 +22,7 @@
               </template>
               <div slot="reference">
                 <div class="value-style">
-              <span v-if="item.title == '报价总金额' || item.title == '客户报价金额' || item.title == '项目报价金额'">
+              <span v-if="item.title == '报价总金额' || item.title == '客户报价金额' || item.title == '项目报价金额' || item.title == '关联客户成交金额' || item.title == '关联项目成交金额'">
                 <span v-if="item.value > 10000" >
                   {{tool.formatAmount(tool.unitConversion(item.value,10000),2)}}<span style="font-size: 0.729vw">{{$t('万元')}}</span>
                 </span>

+ 45 - 2
src/HManagement/serviceDataScreen/modules/dataProfile.vue

@@ -1,8 +1,8 @@
 <template>
   <div>
     <borderTemplate borderBox="width: 31.250vw;height: 32.813vw;" title="数据概况" detailTitle="查看详情" @dialog="$emit('dialog')"
-                    :systemappid="typeSelect == '线索'?'278':typeSelect == '客户'?'276':typeSelect == '项目'?'275':'277'"
-                    :push_path="typeSelect == '线索'?'/clueData':typeSelect == '客户'?'/customerData':typeSelect == '项目'?'/projectData':'/salesData'">
+                    :systemappid="typeSelect == '线索'?'278':typeSelect == '客户'?'276':typeSelect == '项目'?'275':typeSelect == '联系人'?'313':'277'"
+                    :push_path="typeSelect == '线索'?'/clueData':typeSelect == '客户'?'/customerData':typeSelect == '项目'?'/projectData':typeSelect == '联系人'?'/contactData':'/salesData'">
       <template slot="content">
         <div class="justify-content">
           <div class="justify-content-left">
@@ -14,6 +14,10 @@
               <el-button type="primary" v-if="typeSelect == '客户'" class="btn-select" @click="typeChange('客户')">{{$t(`客户`)}}</el-button>
               <el-button type="text" class="btn-unSelect" v-else @click="typeChange('客户')">{{$t(`客户`)}}</el-button>
             </div>
+            <div class="box-border" v-if="siteid == 'HY'">
+              <el-button type="primary" v-if="typeSelect == '联系人'" class="btn-select" @click="typeChange('联系人')">{{$t(`联系人`)}}</el-button>
+              <el-button type="text" class="btn-unSelect" v-else @click="typeChange('联系人')">{{$t(`联系人`)}}</el-button>
+            </div>
             <div class="box-border">
               <el-button type="primary" v-if="typeSelect == '项目'" class="btn-select" @click="typeChange('项目')">{{$t(`项目`)}}</el-button>
               <el-button type="text" class="btn-unSelect" v-else @click="typeChange('项目')">{{$t(`项目`)}}</el-button>
@@ -29,6 +33,7 @@
               <el-option :label="$t('本年')" value="本年"></el-option>
               <el-option :label="$t('本季')" value="本季"></el-option>
               <el-option :label="$t('本月')" value="本月"></el-option>
+              <el-option :label="$t('上月')" value="上月"></el-option>
               <el-option :label="$t('去年')" value="去年"></el-option>
             </el-select>
           </div>
@@ -100,6 +105,7 @@ export default {
       list:'',
       dataProfile:[],
       profileType:[],
+      siteid:JSON.parse(sessionStorage.getItem('active_account')).siteid
     }
   },
   methods:{
@@ -112,6 +118,8 @@ export default {
         this.param.id = 20231018110404
       }else if (this.typeSelect == '报价'){
         this.param.id = 20231011201004
+      }else if (this.typeSelect == '联系人'){
+        this.param.id = 2025072114302202
       }
       const res = await this.$api.requested(this.param)
       this.list = res.data
@@ -328,6 +336,39 @@ export default {
             tips:'统计到当前查询时间为止的项目报价金额(审核状态)'
           },
         ]
+      }else if (val == '联系人') {
+        this.dataProfile = [
+          {
+            title:'联系人总数',
+            value:this.list.count_phonebook,
+            tips:'统计跟进联系人总数量'
+          },
+          {
+            title:'联系人跟进次数',
+            value:this.list.count_follow,
+            tips:'统计在【联系人】应用,跟进联系人次数。'
+          },
+          {
+            title:'关联客户数',
+            value:this.list.count_customer,
+            tips:'统计联系人关联的客户数量。'
+          },
+          {
+            title:'关联项目数',
+            value:this.list.count_project,
+            tips:'统计联系人关联的项目数量。'
+          },
+          {
+            title:'关联客户成交金额',
+            value:this.list.amount_customer,
+            tips:'统计联系人关联的客户标准、特殊订单下单金额。'
+          },
+          {
+            title:'关联项目成交金额',
+            value:this.list.amount_project,
+            tips:'统计联系人关联的项目订单下单金额。'
+          },
+        ]
       }
     },
     typeChange(val){
@@ -339,6 +380,8 @@ export default {
         this.typeSelect = '项目'
       }else if (val == '报价'){
         this.typeSelect = '报价'
+      }else if (val == '联系人'){
+        this.typeSelect = '联系人'
       }
       this.listData()
     },

+ 79 - 26
src/HManagement/serviceDataScreen/modules/jobData.vue

@@ -6,36 +6,49 @@
           <el-select v-model="dateType"   size="small"  @change="dateTypeChange" :popper-append-to-body="false">
             <el-option :label="$t('本周')" value="本周"></el-option>
             <el-option :label="$t('本月')" value="本月"></el-option>
+            <el-option :label="$t('上月')" value="上月"></el-option>
             <el-option :label="$t('本年')" value="本年"></el-option>
           </el-select>
         </div>
         <div class="box-style">
-          <div class="justify-content-style-set">
-            <div>
-              <div class="data-font">{{list.xsxz}}</div>
-              <div class="title">{{$t(`新增线索`)}}</div>
+          <div class="box-border">
+            <div class="justify-content-style-set">
+              <div>
+                <div class="data-font">{{list.xsxz}}</div>
+                <div class="title">{{$t(`新增线索`)}}</div>
+              </div>
+              <div class="magin-10">
+                <div class="data-font">{{list.xmxz}}</div>
+                <div class="title">{{$t(`新增项目`)}}</div>
+              </div>
+              <div class="magin-10">
+                <div class="data-font">{{list.lxxz}}</div>
+                <div class="title">{{$t(`新增联系人`)}}</div>
+              </div>
             </div>
-            <div>
-              <div class="data-font">{{list.xmxz}}</div>
-              <div class="title">{{$t(`新增项目`)}}</div>
+            <div class="justify-content-style-set">
+              <div>
+                <div class="data-font">{{list.khxz}}</div>
+                <div class="title">{{$t(`新增客户`)}}</div>
+              </div>
+              <div class="magin-10">
+                <div class="data-font">{{list.khgj}}</div>
+                <div class="title">{{$t(`客户跟进`)}}</div>
+              </div>
+              <div class="magin-10">
+                <div class="data-font">{{list.xsgj}}</div>
+                <div class="title">{{$t(`跟进线索`)}}</div>
+              </div>
             </div>
-            <div>
-              <div class="data-font">{{list.khxz}}</div>
-              <div class="title">{{$t(`新增客户`)}}</div>
-            </div>
-          </div>
-          <div class="justify-content-style-set">
-            <div>
-              <div class="data-font">{{list.khgj}}</div>
-              <div class="title">{{$t(`客户跟进`)}}</div>
-            </div>
-            <div>
-              <div class="data-font">{{list.xsgj}}</div>
-              <div class="title">{{$t(`跟进线索`)}}</div>
-            </div>
-            <div>
-              <div class="data-font">{{list.xmgj}}</div>
-              <div class="title">{{$t(`项目跟进`)}}</div>
+            <div class="justify-content-style-set">
+              <div>
+                <div class="data-font">{{list.lxgj}}</div>
+                <div class="title">{{$t(`联系人跟进`)}}</div>
+              </div>
+              <div style="margin-left: 0.52vw">
+                <div class="data-font">{{list.xmgj}}</div>
+                <div class="title">{{$t(`项目跟进`)}}</div>
+              </div>
             </div>
           </div>
         </div>
@@ -69,7 +82,9 @@ export default {
         xmgj:'',
         xmxz:'',
         xsgj:'',
-        xsxz:'5'
+        xsxz:'',
+        lxgj:'',
+        lxxz:'',
       },
       listNew:""
     }
@@ -78,6 +93,7 @@ export default {
     async listData(){
       const res = await this.$api.requested(this.param)
       this.listNew = res.data
+      console.log(this.listNew,'数据1111222')
       this.dateTypeChange()
     },
     dateTypeChange(){
@@ -88,6 +104,8 @@ export default {
         this.list.xmgj = this.listNew.byxmgj
         this.list.xsgj = this.listNew.byxsgj
         this.list.xsxz = this.listNew.byxsxz
+        this.list.lxgj = this.listNew.bylxgj
+        this.list.lxxz = this.listNew.bylxxz
       }else if (this.dateType == '本周') {
         this.list.khgj = this.listNew.bzkhgj
         this.list.khxz = this.listNew.bzkhxz
@@ -95,6 +113,8 @@ export default {
         this.list.xmgj = this.listNew.bzxmgj
         this.list.xsgj = this.listNew.bzxsgj
         this.list.xsxz = this.listNew.bzxsxz
+        this.list.lxgj = this.listNew.bzlxgj
+        this.list.lxxz = this.listNew.bzlxxz
       }else if (this.dateType == '本年') {
         this.list.khgj = this.listNew.bnkhgj
         this.list.khxz = this.listNew.bnkhxz
@@ -102,6 +122,17 @@ export default {
         this.list.xmgj = this.listNew.bnxmgj
         this.list.xsgj = this.listNew.bnxsgj
         this.list.xsxz = this.listNew.bnxsxz
+        this.list.lxgj = this.listNew.bnlxgj
+        this.list.lxxz = this.listNew.bnlxxz
+      }else if (this.dateType == '上月'){
+        this.list.khgj = this.listNew.sykhgj
+        this.list.khxz = this.listNew.sykhxz
+        this.list.xmxz = this.listNew.syxmxz
+        this.list.xmgj = this.listNew.syxmgj
+        this.list.xsgj = this.listNew.syxsgj
+        this.list.xsxz = this.listNew.syxsxz
+        this.list.lxgj = this.listNew.sylxgj
+        this.list.lxxz = this.listNew.sylxxz
       }
     },
     detailClick(){
@@ -121,6 +152,25 @@ export default {
   border: 0.052vw solid #CFDCE5;
   margin-top: 0.642vw;
 }
+.box-border{
+  margin: 0vw 0 0.605vw 0vw;
+  max-width: 13.021vw;
+  max-height: 6.058vw;
+  overflow: auto;
+}
+.box-border::-webkit-scrollbar {
+  width: 0.313vw;
+  height: 0.313vw;
+  background-color: transparent;
+}
+.box-border::-webkit-scrollbar-track {
+  background-color: transparent;
+  background-color: rgb(15, 43, 87);
+}
+.box-border::-webkit-scrollbar-thumb {
+  border-radius: 0.156vw;
+  background-image: linear-gradient(135deg, #c0c7cc, #c0c7cc);
+}
 .box-style .data-font{
   font-family: Microsoft YaHei, Microsoft YaHei;
   font-weight: bold;
@@ -142,7 +192,10 @@ export default {
 }
 .justify-content-style-set{
   display: flex;
-  justify-content: space-between;
+  justify-content:left;
   padding: 0.225vw 1.042vw 0 1.042vw;
 }
+.magin-10{
+  margin-left: 1.182vw;
+}
 </style>

+ 1 - 0
src/HManagement/serviceDataScreen/modules/salesPanel.vue

@@ -27,6 +27,7 @@
               <el-option :label="$t('本年')" value="本年"></el-option>
               <el-option :label="$t('本季')" value="本季"></el-option>
               <el-option :label="$t('本月')" value="本月"></el-option>
+              <el-option :label="$t('上月')" value="上月"></el-option>
             </el-select>
           </div>
         </div>

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

@@ -28,7 +28,7 @@ export default {
   components:{depStatus},
   methods:{
     listData(dataid,type,isleave,state){
-      this.$emit('list',type,dataid,isleave,state)
+      this.$emit('list',dataid,type,isleave,state)
     }
   }
 }

+ 1 - 0
src/components/normal-basic-layout/drawerDetail/index.vue

@@ -17,6 +17,7 @@ export default {
   },
   methods:{
     onShow () {
+      console.log(this.data,'data')
       let key = ''
       if (this.idName instanceof Array) {
         key = this.idName[1]

+ 11 - 0
src/router/HDrpManagement.js

@@ -1203,6 +1203,17 @@ const HDrpManagement = [
       keeproute: true,
     },
     component: () => import(/* webpackChunkName: "about" */ '@/HDrpManagement/contactData/index'),
+    children:[
+      {
+        path: '/contactDataDetail',
+        name: 'contactData',
+        meta: {
+          title: '联系人数据详情',
+          ast_nav:false
+        },
+        component: () => import(/* webpackChunkName: "about" */ '@/HManagement/addressList/addressBook/detail/index')
+      },
+    ]
   },
   {
     path: '/salerpriceData',