Prechádzať zdrojové kódy

Merge branch 'greenUrgent' into testToMerge

qymljy 1 rok pred
rodič
commit
c78144b8a8
29 zmenil súbory, kde vykonal 3447 pridanie a 155 odobranie
  1. 1 0
      package.json
  2. 111 0
      src/HManagement/serviceDataScreen/components/BarCharts.vue
  3. 149 0
      src/HManagement/serviceDataScreen/components/DualAxesCharts.vue
  4. 155 0
      src/HManagement/serviceDataScreen/components/DualAxesLineCharts.vue
  5. 149 0
      src/HManagement/serviceDataScreen/components/PieCharts.vue
  6. 98 7
      src/HManagement/serviceDataScreen/components/borderTemplate.vue
  7. 65 0
      src/HManagement/serviceDataScreen/components/boxTemplate.vue
  8. 65 0
      src/HManagement/serviceDataScreen/components/datePicker.vue
  9. 141 0
      src/HManagement/serviceDataScreen/components/funnelBox.vue
  10. 153 0
      src/HManagement/serviceDataScreen/components/lineCharts.vue
  11. 158 0
      src/HManagement/serviceDataScreen/components/profileTemplate.vue
  12. 300 121
      src/HManagement/serviceDataScreen/index.vue
  13. 105 0
      src/HManagement/serviceDataScreen/modules/accountsReceivable.vue
  14. 468 0
      src/HManagement/serviceDataScreen/modules/dataProfile.vue
  15. 148 0
      src/HManagement/serviceDataScreen/modules/jobData.vue
  16. 294 0
      src/HManagement/serviceDataScreen/modules/marketingExpenseStatistics.vue
  17. 93 0
      src/HManagement/serviceDataScreen/modules/marketingExpenses.vue
  18. 170 0
      src/HManagement/serviceDataScreen/modules/salesFunnel.vue
  19. 485 0
      src/HManagement/serviceDataScreen/modules/salesPanel.vue
  20. 92 0
      src/HManagement/serviceDataScreen/modules/salesmanAccount.vue
  21. 9 0
      src/assets/icons/Tips.svg
  22. BIN
      src/assets/icons/down.png
  23. 3 0
      src/assets/icons/home.svg
  24. 6 0
      src/assets/icons/toNext.svg
  25. BIN
      src/assets/icons/up.png
  26. 7 5
      src/components/newLayout/index.vue
  27. 3 3
      src/components/newLayout/modules/header.vue
  28. 12 12
      src/views/clueData/modules/digitalSigns.vue
  29. 7 7
      src/views/login/login.vue

+ 1 - 0
package.json

@@ -30,6 +30,7 @@
     "moment": "^2.29.4",
     "nprogress": "^0.2.0",
     "print-js": "^1.6.0",
+    "sass-loader": "^16.0.2",
     "script-loader": "^0.7.2",
     "sortablejs": "^1.15.2",
     "viewerjs": "^1.11.6",

+ 111 - 0
src/HManagement/serviceDataScreen/components/BarCharts.vue

@@ -0,0 +1,111 @@
+<template>
+  <div :ref="refCharts" :style="{'height':heightChart}"></div>
+</template>
+
+<script>
+import {Bar} from "@antv/g2plot";
+
+export default {
+  name: "BarCharts",//双轴图
+  props:{
+    refCharts:String,
+    heightChart:String,
+    param:Object
+  },
+  data(){
+    return {
+      chartMap:[],
+      chartMapData:[],
+    }
+  },
+  methods:{
+    async chartData(init){
+      const res = await this.$api.requested(this.param)
+      this.chartMapData = res.data.map(item=>{
+        let value = this.tool.unitConversion(item.value,10000)
+        return {
+          key: item.key + '(万元)',
+          type: item.type,
+          value: value
+        }
+      })
+      if (init){
+        this.chartMap = new Bar(this.$refs[this.refCharts],{
+          data: this.chartMapData,
+          isStack: true,
+          xField: 'value',
+          yField: 'type',
+          seriesField: 'key',
+          xAxis:{
+            label:{
+              style:{
+                fill:'#CFDCE5'
+              }
+            }
+          },
+          yAxis:{
+            value:{
+              label:{
+                style:{
+                  fill:'#CFDCE5'
+                }
+              }
+            },
+            label:{
+              style:{
+                fill:'#CFDCE5'
+              }
+            }
+          },
+          tooltip: {
+            formatter: (datum) => {
+              return {
+                name:datum.key,
+                value:'¥'+this.tool.formatAmount(datum.value,2)
+              }
+            }
+          },
+          legend:{
+            itemName:{
+              style:{
+                fill:'#CFDCE5'
+              }
+            },
+            pageNavigator:{
+              marker: {
+                style: {
+                  // 非激活,不可点击态时的填充色设置
+                  inactiveFill: '#fff',
+                  inactiveOpacity: 1,
+                  // 默认填充色设置
+                  fill: '#fff',
+                  opacity: 1,
+                  size: 10,
+                },
+              },
+              text: {
+                style: {
+                  // 非激活,不可点击态时的填充色设置
+                  inactiveFill: '#fff',
+                  inactiveOpacity: 1,
+                  // 默认填充色设置
+                  fill: '#fff',
+                  opacity: 1,
+                  size: 10,
+                },
+              },
+            }
+          }
+        });
+        this.chartMap.render()
+      }else {
+        this.chartMap.changeData(this.chartMapData)
+      }
+    }
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 149 - 0
src/HManagement/serviceDataScreen/components/DualAxesCharts.vue

@@ -0,0 +1,149 @@
+<template>
+  <div :ref="refCharts" :style="{'height':heightChart}"></div>
+</template>
+
+<script>
+import {DualAxes} from "@antv/g2plot";
+
+export default {
+  name: "DualAxesCharts",//双轴图
+  props:{
+    refCharts:String,
+    heightChart:String,
+    param:Object
+  },
+  data(){
+    return {
+      chartMap:[],
+      chartMapData:[],
+      tbzzl:[]
+    }
+  },
+  methods:{
+    async chartData(init){
+      const res = await this.$api.requested(this.param)
+      this.chartMapData = res.data.map(item=>{
+        let value = this.tool.unitConversion(item.oldamount,10000)
+        return {
+          "date":item.date,
+          "value":value,
+          "type":'去年同期金额(万元)'
+        }
+      })
+      let list = res.data.map(item=>{
+        let value = this.tool.unitConversion(item.amount,10000)
+        return {
+          "value":value,
+          "date":item.date,
+          "type":'本期金额(万元)',
+        }
+      })
+      this.chartMapData = this.chartMapData.concat(list)
+      this.tbzzl =  res.data.map(item=>{
+        return {
+          "date":item.date,
+          "type":'同比增长率',
+          "value":Math.round(((item.tbzzl * 100)*100)/100)
+        }
+      })
+      if (init){
+        this.chartMap = new DualAxes(this.$refs[this.refCharts],{
+          data: [this.chartMapData,this.tbzzl],
+          xField: 'date',
+          yField: ['value','value'],
+          xAxis:{
+            label:{
+              style:{
+                fill:'#CFDCE5'
+              }
+            }
+          },
+          yAxis:{
+            value:{
+              label:{
+                style:{
+                  fill:'#CFDCE5'
+                }
+              }
+            }
+          },
+          geometryOptions: [
+            {
+              geometry: 'column',
+              isGroup: true,
+              seriesField: 'type',
+              color:['#62daab','#6395fa'],
+              // label:{
+              //   position:top,
+              //   formatter: (datum) =>{
+              //     return '¥' + this.tool.formatAmount(datum.value,2)
+              //   }
+              // }
+            },
+            {
+              geometry: 'line',
+              lineStyle: {
+                lineWidth: 2,
+              },
+              seriesField: 'type',
+              color: '#F6903D',
+              smooth: true,
+              // label:{
+              //   formatter: (datum) =>{
+              //     return  datum.value + '%'
+              //   }
+              // }
+            },
+          ],
+          tooltip: {
+            formatter: (datum) => {
+              return {
+                name:datum.type ,
+                value:datum.type != '同比增长率'?'¥'+this.tool.formatAmount(datum.value,2):datum.value + '%'
+              }
+            }
+          },
+          legend:{
+            itemName:{
+              style:{
+                fill:'#CFDCE5'
+              }
+            },
+            pageNavigator:{
+              marker: {
+                style: {
+                  // 非激活,不可点击态时的填充色设置
+                  inactiveFill: '#fff',
+                  inactiveOpacity: 1,
+                  // 默认填充色设置
+                  fill: '#fff',
+                  opacity: 1,
+                  size: 10,
+                },
+              },
+              text: {
+                style: {
+                  // 非激活,不可点击态时的填充色设置
+                  inactiveFill: '#fff',
+                  inactiveOpacity: 1,
+                  // 默认填充色设置
+                  fill: '#fff',
+                  opacity: 1,
+                  size: 10,
+                },
+              },
+            }
+          }
+        });
+        this.chartMap.render()
+      }else {
+        this.chartMap.changeData([this.chartMapData,this.tbzzl])
+      }
+    }
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 155 - 0
src/HManagement/serviceDataScreen/components/DualAxesLineCharts.vue

@@ -0,0 +1,155 @@
+<template>
+  <div :ref="refCharts" :style="{'height':heightChart}"></div>
+</template>
+
+<script>
+import {DualAxes} from "@antv/g2plot";
+
+export default {
+  name: "DualAxesCharts",//双轴图
+  props:{
+    refCharts:String,
+    heightChart:String,
+    param:Object
+  },
+  data(){
+    return {
+      chartMap:[],
+      chartMapData:[],
+      tbzzl:[]
+    }
+  },
+  methods:{
+    async chartData(init){
+      const res = await this.$api.requested(this.param)
+      const amount = res.data.map(item=>{
+        let value = this.tool.unitConversion(item.amount,10000)
+        return {
+          "value":value,
+          "date":item.date,
+          "type":'本期金额(万元)'
+        }
+      })
+      const oldamount = res.data.map(item=>{
+        let value = this.tool.unitConversion(item.oldamount,10000)
+        return {
+          "value":value,
+          "date":item.date,
+          "type":'去年同期金额(万元)'
+        }
+      })
+      this.chartMapData = oldamount.concat(amount)
+      const tbzzl = res.data.map(item=>{
+        return {
+          "value":Math.round(((item.tbzzl * 100)*100)/100),
+          "date":item.date,
+          "type":'同比增长率'
+        }
+      })
+      const zjl = res.data.map(item=>{
+        return {
+          "value":Math.round(((item.zjl * 100)*100)/100),
+          "date":item.date,
+          "type":'准交率'
+        }
+      })
+      this.tbzzl = tbzzl.concat(zjl)
+      if (init){
+        this.chartMap = new DualAxes(this.$refs[this.refCharts],{
+          data: [this.chartMapData,this.tbzzl],
+          xField: 'date',
+          yField: ['value','value'],
+          xAxis:{
+            label:{
+              style:{
+                fill:'#CFDCE5'
+              }
+            }
+          },
+          yAxis:{
+            value:{
+              label:{
+                style:{
+                  fill:'#CFDCE5'
+                }
+              }
+            }
+          },
+          geometryOptions: [
+            {
+              geometry: 'column',
+              isGroup: true,
+              seriesField: 'type',
+              color:['#62daab','#6395fa'],
+              // label:{
+              //   position:top,
+              //   formatter: (datum) =>{
+              //     return '¥' + this.tool.formatAmount(datum.value,2)
+              //   }
+              // }
+            },
+            {
+              geometry: 'line',
+              isGroup: true,
+              seriesField: 'type',
+              color: ['#F6903D','#f7c122'],
+              smooth: true,
+              // label:{
+              //   formatter: (datum) =>{
+              //     return  datum.value + '%'
+              //   }
+              // }
+            },
+          ],
+          tooltip: {
+            formatter: (datum) => {
+              return {
+                name:datum.type,
+                value:datum.type == '去年同期金额(万元)' || datum.type == '本期金额(万元)'  ?'¥' + this.tool.formatAmount(datum.value,2):datum.value + '%'
+              }
+            }
+          },
+          legend:{
+            itemName:{
+              style:{
+                fill:'#CFDCE5'
+              }
+            },
+            pageNavigator:{
+              marker: {
+                style: {
+                  // 非激活,不可点击态时的填充色设置
+                  inactiveFill: '#fff',
+                  inactiveOpacity: 1,
+                  // 默认填充色设置
+                  fill: '#fff',
+                  opacity: 1,
+                  size: 10,
+                },
+              },
+              text: {
+                style: {
+                  // 非激活,不可点击态时的填充色设置
+                  inactiveFill: '#fff',
+                  inactiveOpacity: 1,
+                  // 默认填充色设置
+                  fill: '#fff',
+                  opacity: 1,
+                  size: 10,
+                },
+              },
+            }
+          }
+        });
+        this.chartMap.render()
+      }else {
+        this.chartMap.changeData([this.chartMapData,this.tbzzl])
+      }
+    }
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 149 - 0
src/HManagement/serviceDataScreen/components/PieCharts.vue

@@ -0,0 +1,149 @@
+<template>
+  <div :style="{'width':width,'height':height }">
+    <div ref="typeEl" :style="{'width':wChart,'height':hChart }"></div>
+    <div class="title-font-style">{{title}}</div>
+  </div>
+</template>
+
+<script>
+import {Pie} from "@antv/g2plot";
+
+export default {
+  name: "PieCharts",
+  props:["width",'height','wChart','hChart','title'],
+  data(){
+    return {
+      param:{
+        id:20231018140404,
+        content:{
+          dataid:'',
+          dateType:'本年',
+          type:'',
+          where:{
+            begdate: "",
+            enddate: "",
+            isleave:'1',
+            unfinish:'0'
+          }
+        }
+      },
+      mapData:{},
+      typeMap:''
+    }
+  },
+  methods:{
+    async typeInit(init,title){
+      if (this.title == '项目跟进情况' || title == '项目跟进情况'){
+        this.param.id = 20231019085304
+      }else if (this.title == '项目类型分析' || title == '项目类型分析'){
+        this.param.id = 20231018140404
+      }else if (this.title == '客户跟进情况' || title == '客户跟进情况'){
+        this.param.id = 20231017151304
+      }
+      let res = await this.$api.requested(this.param)
+      this.mapData = res.data
+      console.log('项目类型数据',this.mapData)
+      if (init) {
+        this.typeMap = new Pie(this.$refs.typeEl, {
+          appendPadding: 10,
+          data:this.mapData,
+          angleField: 'ratio',
+          colorField: 'key',
+          radius: 1,
+          innerRadius: 0.79,
+          label:{
+            style:{
+              fill:'#CFDCE5'
+            },
+            /*type: 'inner',
+            offset: '-50%',
+            style: {
+              textAlign: 'center',
+            },
+            autoRotate: false,*/
+            formatter: (datum) => `${datum.ratio}%`
+          },
+          tooltip:{
+            formatter: (datum) => {
+              return { name: datum.key, value: datum.ratio + '%' };
+            },
+          },
+          statistic: {
+            title: {
+              offsetY: -4,
+              style: {
+                fontSize:'0.833vw',
+                color:'#E6F4FF'
+              },
+              content:this.title == '客户跟进情况' || title == '客户跟进情况'?'客户总数':'项目总数'
+            },
+            content: {
+              offsetY: 4,
+              style: {
+                whiteSpace: 'pre-wrap',
+                overflow: 'hidden',
+                textOverflow: 'ellipsis',
+                fontSize:'0.833vw',
+                color:'#FFFFFF'
+              },
+              customHtml: (container, view, datum, data) => {
+                const text = data[0].totalqty
+                return text
+              },
+            },
+          },
+          legend: {
+            position:'top',
+            itemName:{
+              style:{
+                fill:'#CFDCE5'
+              }
+            },
+            pageNavigator:{
+              marker: {
+                style: {
+                  // 非激活,不可点击态时的填充色设置
+                  inactiveFill: '#fff',
+                  inactiveOpacity: 1,
+                  // 默认填充色设置
+                  fill: '#fff',
+                  opacity: 1,
+                  size: 10,
+                },
+              },
+              text: {
+                style: {
+                  // 非激活,不可点击态时的填充色设置
+                  inactiveFill: '#fff',
+                  inactiveOpacity: 1,
+                  // 默认填充色设置
+                  fill: '#fff',
+                  opacity: 1,
+                  size: 10,
+                },
+              },
+            }
+          },
+          // 添加 中心统计文本 交互
+          interactions: [{ type: 'element-single-selected' },{ type: 'element-active' }],
+        });
+        this.typeMap.render();
+      } else {
+        this.typeMap.changeData(this.mapData)
+      }
+    }
+  }
+}
+</script>
+
+<style scoped>
+.title-font-style{
+  font-family: Microsoft YaHei, Microsoft YaHei;
+  font-weight: 400;
+  font-size: 0.833vw;
+  color: #E6F4FF;
+  text-align: center;
+  font-style: normal;
+  text-transform: none;
+}
+</style>

+ 98 - 7
src/HManagement/serviceDataScreen/components/borderTemplate.vue

@@ -1,23 +1,114 @@
 <template>
-  <div class="border-box-style">
+  <div class="border-box-style box-content-style" :style="borderBox">
+    <div class="justify-style">
+      <div class="justify-style-left">
+        <div class="icon"></div>
+        <div class="title inline-left">{{$t(title)}}</div>
+        <slot name="operation"></slot>
+      </div>
+      <div class="justify-style-right">
+        <el-button type="text" class="detail-title" @click="detailClick">{{$t(detailTitle)}}
+          <i class="el-icon-arrow-right el-icon--right"></i>
+        </el-button>
+      </div>
+<!--        <div style="margin-left: 0.260vw"> > </div>-->
 
+    </div>
+    <slot name="content"></slot>
   </div>
 </template>
 
 <script>
+import {Message} from "element-ui";
+
 export default {
-  name: "borderTemplate"
+  name: "borderTemplate",
+  props:["borderBox","title","detailTitle","systemappid","push_path"],
+  data(){
+    return {
+      /*是否拥有跳转权限*/
+      param:{
+        "id": 20241029155004,
+        "content": {
+          "systemappid":"",
+          "userid":JSON.parse(sessionStorage.getItem('active_account')).userid
+        }
+      },
+      dialogVisible:false
+    }
+  },
+  methods:{
+    async detailClick(){
+      this.param.content.systemappid = this.systemappid
+      const res = await this.$api.requested(this.param)
+      console.log(res.data,'权限结果')
+      if (res.data){
+        this.$router.push(this.push_path)
+      }else {
+        this.$emit('dialog')
+      }
+    }
+  },
+  mounted() {
+  }
 }
 </script>
 
 <style scoped>
   .border-box-style{
-    width: 290px;
-    height: 240px;
     background: linear-gradient( 180deg, #00244D 0%, #001E41 100%);
-    box-shadow: 0px 2px 4px 1px rgba(0,0,0,0.15);
-    border-radius: 4px 4px 4px 4px;
-    border: 2px solid #3D73BA;
+    box-shadow: 0.000vw 0.104vw 0.208vw 0.052vw rgba(0,0,0,0.15);
+    border-radius: 0.208vw 0.208vw 0.208vw 0.208vw;
+    border: 0.104vw solid #3D73BA;
     opacity: 0.8;
+    box-sizing: border-box;
+  }
+  .justify-style-left{
+    display: flex;
+    justify-content: left;
+  }
+  .justify-style-right{
+    display: flex;
+    justify-content: right;
+    margin-top: -0.421vw;
+  }
+  .justify-style{
+    display: flex;
+    justify-content: space-between;
+  }
+  .inline-left{
+    margin-left: 1.042vw;
+  }
+  .box-content-style{
+    padding: 1.042vw;
+  }
+  .box-content-style .icon {
+    width: 0.313vw;
+    height: 0.938vw;
+    background: #E6F4FF;
+    border-radius: 0.104vw 0.104vw 0.104vw 0.104vw;
+  }
+  .box-content-style .title{
+    /*width: 7.350vw;*/
+    height: 1.615vw;
+    font-family: Microsoft YaHei, Microsoft YaHei;
+    font-weight: bold;
+    font-size: 1.250vw;
+    color: #E6F4FF;
+    text-align: left;
+    line-height: 0.9vw;
+    vertical-align: middle;
+  }
+  .box-content-style .detail-title{
+    /*width: 8.333vw;*/
+    height: 1.094vw;
+    font-family: Microsoft YaHei, Microsoft YaHei;
+    font-weight: 400;
+    font-size: 0.833vw;
+    color: #CFDCE5;
+    line-height: 0.9vw;
+    text-align: left;
+    font-style: normal;
+    text-transform: none;
   }
 </style>

+ 65 - 0
src/HManagement/serviceDataScreen/components/boxTemplate.vue

@@ -0,0 +1,65 @@
+<template>
+  <div class="box-style-border">
+    <div class="content_style">
+      <div class="amount">{{tool.formatAmount(data,2)}}</div>
+      <div class="justify-style">
+        <div class="title">{{$t(title)}}</div>
+        <div class="icon">¥</div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "boxTemplate",
+  props:['data','title']
+}
+</script>
+
+<style scoped>
+.box-style-border{
+  width: 13.958vw;
+  height: 4.688vw;
+  background: #001E41;
+  box-shadow: 0.000vw 0.156vw 0.313vw 0.052vw rgba(0,0,0,0.16);
+  border-radius: 0.313vw 0.313vw 0.313vw 0.313vw;
+  border: 0.052vw solid #CFDCE5;
+  box-sizing: border-box;
+}
+.box-style-border .content_style {
+  margin: 0.521vw 1.042vw 0.521vw 1.042vw;
+}
+.box-style-border .content_style .amount {
+  font-family: Microsoft YaHei, Microsoft YaHei;
+  font-weight: bold;
+  font-size: 1.250vw;
+  color: #6CD2A1;
+  text-align: left;
+  font-style: normal;
+  text-transform: none;
+}
+.justify-style{
+  display: flex;
+  justify-content: space-between;
+  margin-top: 0.221vw;
+}
+.justify-style .title {
+  font-family: Microsoft YaHei, Microsoft YaHei;
+  font-weight: 400;
+  font-size: 0.938vw;
+  color: #CFDCE5;
+  text-align: left;
+  font-style: normal;
+  text-transform: none;
+}
+.justify-style .icon {
+  font-family: Microsoft YaHei, Microsoft YaHei;
+  font-weight: bold;
+  font-size: 1.042vw;
+  color: #6CD2A1;
+  text-align: left;
+  font-style: normal;
+  text-transform: none;
+}
+</style>

+ 65 - 0
src/HManagement/serviceDataScreen/components/datePicker.vue

@@ -0,0 +1,65 @@
+<template>
+  <div>
+    <el-date-picker
+        v-model="value"
+        :type="type"
+        @change="$emit('selectTime',value)"
+        :value-format="value_format"
+        :format="format"
+        :append-to-body="false"
+        :picker-options="type == 'year'?pickerOptions:''"
+        :clearable="false"
+        placeholder="选择日期">
+    </el-date-picker>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "datePicker",
+  props:['type','format','value_format'],
+  data(){
+    return {
+      value:"",
+      pickerOptions: {
+        disabledDate(time){
+          // 获取当前时间
+          const today = new Date();
+          //  比较日期,将未来的年份禁用
+            return time.getFullYear() > today.getFullYear();
+
+        }
+      },
+    }
+  }
+}
+</script>
+
+<style scoped>
+/deep/ .el-input__inner {
+  -webkit-appearance: none;
+  background-color: #061a31;
+  background-image: none;
+  box-sizing: border-box;
+  color: #c6d6e4;
+  display: inline-block;
+  font-size: inherit;
+  height: 2.083vw;
+  line-height: 2.083vw;
+  outline: 0;
+  /*padding: 0 1.563vw !important;*/
+  padding: 0 0 0 1.381vw !important;
+  transition: border-color .2s cubic-bezier(.645, .045, .355, 1);
+  width: 100%;
+  box-shadow: 0.000vw 0.156vw 0.313vw 0.052vw rgba(0, 0, 0, 0.16);
+  border-radius: 0.313vw 0.313vw 0.313vw 0.313vw;
+  border: 0.052vw solid #CFDCE5;
+}
+/deep/ .el-input__icon {
+  height: 100%;
+  width: 1.302vw;
+  text-align: center;
+  transition: all .3s;
+  line-height: 1.563vw;
+}
+</style>

+ 141 - 0
src/HManagement/serviceDataScreen/components/funnelBox.vue

@@ -0,0 +1,141 @@
+<template>
+  <div>
+    <div style="display:flex;justify-content: space-between">
+      <div style="width: 7vw">
+        <div style="display:flex;">
+          <div class="box-funnel-title" style="position: relative">{{data.stagename}}
+            <div class="div-style" :style="{'left':data.stagename.length >2?((data.stagename.length -1) + 0.633) +'vw':(2.333) +'vw'}">
+              <div class="box-circle-style" :style="{'color':data.color}"></div>
+              <div class="box-line-style" :style="{'color':data.color}"></div>
+            </div>
+          </div>
+        </div>
+        <div class="box-margin-top">
+          <span class="box-funnel-title-span1">预计签约:</span>
+          <span class="box-funnel-title-span2">{{data.signamount_due}}万元</span>
+        </div>
+        <div class="box-margin-top">
+          <span class="box-funnel-title-span1">项目成交:</span>
+          <span class="box-funnel-title-span3">{{data.dealamount}}万元</span>
+        </div>
+      </div>
+      <div class="box-funnel-style" :style="{'width': width + 'vw','background':data.color}">
+        <div style="display: flex;justify-content: space-between;">
+          <div class="box-title-height-style">
+            <div class="box-funnel-title-span5">{{data.sequence1}}</div>
+            <div class="box-funnel-title-span4">项目总数</div>
+          </div>
+          <div class="box-title-height-style">
+            <div class="box-funnel-title-span5">{{data.projectqty}}</div>
+            <div class="box-funnel-title-span4">当前项目数</div>
+          </div>
+          <div class="box-title-height-style">
+            <div class="box-funnel-title-span5">{{data.zhl}}</div>
+            <div class="box-funnel-title-span4">转化率</div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "funnelBox",
+  props:['width','background','data']
+}
+</script>
+
+<style scoped>
+.box-funnel-style{
+  height: 3.975vw;
+  box-shadow: 0.000vw 0.156vw 0.313vw 0.052vw rgba(0,0,0,0.16);
+  border-radius: 0.313vw 0.313vw 0.313vw 0.313vw;
+  margin: auto;
+}
+.box-funnel-title{
+  font-family: Microsoft YaHei, Microsoft YaHei;
+  font-weight: bold;
+  font-size: 0.833vw;
+  color: #E6F4FF;
+  text-align: left;
+  font-style: normal;
+  text-transform: none;
+}
+.box-funnel-title .div-style{
+  display: flex;
+  position: absolute;
+  top: 0.521vw;
+}
+.box-funnel-title-span1{
+  font-family: Microsoft YaHei, Microsoft YaHei;
+  font-weight: 400;
+  font-size: 0.625vw;
+  color: #CFDCE5;
+  text-align: left;
+  font-style: normal;
+  text-transform: none;
+}
+.box-funnel-title-span2{
+  font-family: Microsoft YaHei, Microsoft YaHei;
+  font-weight: 400;
+  font-size: 0.625vw;
+  color: #6CD2A1;
+  text-align: left;
+  font-style: normal;
+  text-transform: none;
+}
+.box-funnel-title-span3{
+  font-family: Microsoft YaHei, Microsoft YaHei;
+  font-weight: 400;
+  font-size: 0.625vw;
+  color: #5FB3E3;
+  text-align: left;
+  font-style: normal;
+  text-transform: none;
+}
+.box-funnel-title-span4{
+  font-family: Microsoft YaHei, Microsoft YaHei;
+  font-weight: 400;
+  font-size: 0.625vw;
+  color: #FFFFFF;
+  text-align: center;
+  font-style: normal;
+  text-transform: none;
+  margin: auto;
+}
+.box-funnel-title-span5{
+  font-family: Microsoft YaHei, Microsoft YaHei;
+  font-weight: bold;
+  font-size: 0.625vw;
+  color: #FFFFFF;
+  text-align: center;
+  font-style: normal;
+  text-transform: none;
+  margin: auto;
+}
+.box-margin-top{
+  /*margin-top: 0.171vw;*/
+}
+.box-circle-style{
+  width: 0.521vw;
+  height: 0.521vw;
+  border: 0.104vw solid ;
+  border-radius: 0.504vw;
+  z-index: 100;
+  margin-top: -0.321vw;
+
+}
+.box-line-style{
+  width: 5.375vw;
+  height: 0vw;
+  border: 0.104vw solid;
+  z-index: 100;
+}
+.box-title-height-style{
+  width: 6.813vw;
+  line-height: 1.675vw;
+  vertical-align: middle;
+  margin-top: 0.521vw;
+}
+</style>

+ 153 - 0
src/HManagement/serviceDataScreen/components/lineCharts.vue

@@ -0,0 +1,153 @@
+<template>
+  <div :style="{'width':width,'height':height }">
+    <div ref="lineRef" :style="{'width':wChart,'height':hChart }"></div>
+  </div>
+</template>
+
+<script>
+import {G2, Column, Line} from "@antv/g2plot";
+
+const G = G2.getEngine('canvas');
+const seriesKey = 'series';
+const valueKey = 'value';
+const meta = {
+  date: {
+    alias: '日期',
+  },
+  oldtotalqty: {
+    alias: '去年同期报价总数量',
+  },
+  oldproqty: {
+    alias: '去年同期项目报价数量',
+  },
+  newproqty:{
+    alias: '项目报价数量'
+  },
+  newtotalqty:{
+    alias: '报价总数量'
+  },
+  oldcusqty:{
+    alias: '去年同期客户报价数量'
+  },
+  newcusqty:{
+    alias: '客户报价数量'
+  }
+};
+export default {
+  name: "columnCharts",
+  props:["width",'height','wChart','hChart'],
+  data(){
+    return {
+      param:{
+        "id": 20231011154704,
+        "content": {
+          "type": 0,//0人员 1部门
+          "dataid": '',
+          "enddate": new Date().getFullYear() + '-' +  (new Date().getMonth() + 1) + '-' + new Date().getDate(), //分析日期
+          "where":{
+            "isleave":'1'
+          }
+        }
+      },
+      typeMap:null,
+      proqty: '',//项目报价总数
+      proamount: '',//项目报价金额
+      cusqty: '',//客户报价总数
+      totalamount: '',//报价总金额
+      totalqty: '',//报价总数量
+      cusamount: '',//客户报价金额,
+      mapData:[]
+    }
+  },
+  methods:{
+    async lineInit(init){
+      let res = await this.$api.requested(this.param)
+      this.mapData = res.data
+      if (init) {
+        this.typeMap = new Line(this.$refs.lineRef,{
+          data:this.processData(this.mapData, ['newtotalqty', 'newcusqty','newproqty','oldtotalqty','oldcusqty','oldproqty']),
+          xField: 'date',
+          yField: valueKey,
+          seriesField: seriesKey,
+          smooth: true,
+          xAxis:{
+            label:{
+              style:{
+                fill:'#CFDCE5'
+              }
+            }
+          },
+          yAxis:{
+            label:{
+              style:{
+                fill:'#CFDCE5'
+              }
+            }
+          },
+          legend:{
+            itemName:{
+              style:{
+                fill:'#CFDCE5'
+              }
+            },
+            pageNavigator:{
+              marker: {
+                style: {
+                  // 非激活,不可点击态时的填充色设置
+                  inactiveFill: '#fff',
+                  inactiveOpacity: 1,
+                  // 默认填充色设置
+                  fill: '#fff',
+                  opacity: 1,
+                  size: 10,
+                },
+              },
+              text: {
+                style: {
+                  // 非激活,不可点击态时的填充色设置
+                  inactiveFill: '#fff',
+                  inactiveOpacity: 1,
+                  // 默认填充色设置
+                  fill: '#fff',
+                  opacity: 1,
+                  size: 10,
+                },
+              },
+            }
+          }
+          // label:{
+          //   // 可手动配置 label 数据标签位置
+          //   position: 'top', // 'top', 'bottom', 'middle',
+          //   // 配置样式
+          //   layout: [],
+          // }
+          /*label: {
+            // 可手动配置 label 数据标签位置
+            position: 'top', // 'top', 'bottom', 'middle',
+            // 配置样式
+            layout: [{ type: 'hide-overlap' }],
+           /!* formatter: (item) => item.value + '%',*!/
+          },*/
+        });
+        this.typeMap.render()
+      }else {
+        this.typeMap.changeData(this.processData(this.mapData, ['newtotalqty', 'newcusqty','newproqty','oldtotalqty','oldcusqty','oldproqty']))
+      }
+    },
+    processData(data, yFields) {
+      const result = [];
+      data.forEach((d) => {
+        yFields.forEach((yField) => {
+          const name = meta?.[yField]?.alias || yField;
+          result.push({ ...d, date: d.date, [seriesKey]: name, [valueKey]: d[yField] });
+        });
+      });
+      return result;
+    },
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 158 - 0
src/HManagement/serviceDataScreen/components/profileTemplate.vue

@@ -0,0 +1,158 @@
+<template>
+  <div class="box-border-box">
+    <div class="box-border">
+      <div class="box-margin">
+        <div class="box-content" style="float: left" v-for="item in dataProfile" :key="item.index">
+          <div class="justify">
+            <el-popover
+                v-if="item.tips"
+                :append-to-body="false"
+                placement="top-start"
+                width="200"
+                trigger="hover"
+            >
+              <template slot="default">
+              <span v-if="item.title == '已转化线索数'">
+                {{$t('①已转化线索数:销售线索应用中,已分配给业务员,已转化状态的线索数量。')}}<br/>
+                {{$t('②一条线索可进行两次转化:转化客户、转化项目,因此,已转化线索数≠转化客户线索数+转化项目线索数。')}}
+              </span>
+                <span v-else>
+                {{item.tips}}
+              </span>
+              </template>
+              <div slot="reference">
+                <div class="value-style">
+              <span v-if="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>
+                <span v-else>
+                  {{tool.formatAmount(item.value,2)}}<span style="font-size: 0.729vw">{{$t(' 元')}}</span>
+                </span>
+              </span>
+                  <span v-else>{{item.value}}</span>
+                </div>
+                <div class="title-style">{{item.title}}</div>
+              </div>
+            </el-popover>
+            <div v-else>
+              <div class="value-style">
+              <span v-if="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>
+                <span v-else>
+                  {{tool.formatAmount(item.value,2)}}<span style="font-size: 0.729vw">{{$t(' 元')}}</span>
+                </span>
+              </span>
+                <span v-else>{{item.value}}</span>
+              </div>
+              <div class="title-style">{{item.title}}</div>
+            </div>
+          </div>
+        </div>
+      </div>
+      <div style="float: left" class="box-margin" v-if="profileType && profileType.length > 0">
+        <div class="box-content" style="float: left" v-for="k in profileType" :key="k.index">
+          <div class="justify">
+            <el-popover
+                v-if="k.value == '无分类客户'"
+                :append-to-body="false"
+                placement="top-start"
+                width="200"
+                trigger="hover"
+            >
+              <template slot="default">
+              <span v-if="k.value == '无分类客户'">
+               {{$t('无分类客户数:统计没有客户分类信息的客户数量')}}<br/>
+              </span>
+              </template>
+              <div slot="reference">
+                <div class="value-style">{{k.qty}}</div>
+                <div class="title-style">{{k.value}}</div>
+              </div>
+            </el-popover>
+            <div v-else>
+              <div class="value-style">{{k.qty}}</div>
+              <div class="title-style">{{k.value}}</div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "profileTemplate",
+  props:['dataProfile','profileType']
+}
+</script>
+
+<style scoped>
+.box-border-box{
+  width: 29.167vw;
+  height: 11.146vw;
+  background: #001E41;
+  box-shadow: 0.000vw 0.156vw 0.313vw 0.052vw rgba(0,0,0,0.16);
+  border-radius: 0.313vw 0.313vw 0.313vw 0.313vw;
+  border: 0.052vw solid #CFDCE5;
+  margin-top: 1.042vw;
+}
+.box-border{
+  margin: 0.705vw 0 1.042vw 1.042vw;
+  max-width: 28.167vw;
+  max-height: 9.646vw;
+  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-border .box-margin{
+  box-sizing: border-box;
+}
+.box-margin .box-content{
+  width: 6.609vw;
+  height: 2.675vw;
+  margin-right: 0.245vw;
+  margin-bottom: 0.705vw;
+}
+.box-margin .justify {
+  display: flex;justify-content: space-between;
+}
+.justify .value-style {
+  font-family: Microsoft YaHei, Microsoft YaHei;
+  font-weight: bold;
+  font-size: 1.250vw;
+  color: #3685FC;
+  text-align: left;
+  font-style: normal;
+  text-transform: none;
+  box-sizing: border-box;
+  padding: 0 !important;
+  margin: 0 !important;
+}
+.justify .title-style{
+  font-family: Microsoft YaHei, Microsoft YaHei;
+  font-weight: 400;
+  font-size: 0.625vw;
+  color: #CFDCE5;
+  text-align: left;
+  font-style: normal;
+  text-transform: none;
+  box-sizing: border-box;
+  padding: 0 !important;
+  margin: 0 !important;
+}
+</style>

+ 300 - 121
src/HManagement/serviceDataScreen/index.vue

@@ -1,6 +1,6 @@
 <template>
-  <div class="bg-img" id="fullScreen">
-    <div style="padding: 0 20px 0 20px">
+  <div class="bg-img" id="fullScreen" style="box-sizing: border-box">
+    <div>
       <div class="justify-style">
         <div class="select-style">
           <el-cascader :placeholder="$t('部门')"  class="inline-16" ref="selectdep" size="small" v-model="depment" :options="deplist" :append-to-body="false"  placement="bottom"
@@ -31,21 +31,79 @@
         </div>
       </div>
     </div>
-    <div class="content-style justify-style">
-      <div>
-        <borderTemplate></borderTemplate>
+    <div>
+      <div class="content-style justify-style">
+        <div>
+          <div class="justify-style">
+            <!-- 业务员账户 -->
+            <salesmanAccount ref="accountRef" @dialog="detailClick"></salesmanAccount>
+            <!-- 作业数据 -->
+            <jobData ref="jobRef" @dialog="detailClick"></jobData>
+          </div>
+          <div class="inline-top-20">
+            <!-- 销售面板 -->
+            <salesPanel  ref="panelRef" style="position: relative;z-index: 800"></salesPanel>
+          </div>
+        </div>
+        <div>
+          <!-- 销售漏斗 -->
+          <salesFunnel ref="funnelRef" style="position: relative;z-index: 700"></salesFunnel>
+          <div class="justify-style inline-top-20">
+            <!-- 营销费用 -->
+            <marketingExpenses ref="expensesRef"></marketingExpenses>
+            <!-- 营销费用统计 -->
+            <marketingExpenseStatistics ref="exStatisticsRef"></marketingExpenseStatistics>
+          </div>
+        </div>
+        <div>
+          <!-- 应收账款 -->
+          <accountsReceivable ref="receivableRef"></accountsReceivable>
+          <!-- 数据概况 -->
+          <dataProfile ref="profileRef" class="inline-top-20"></dataProfile>
+        </div>
       </div>
     </div>
     <fullScreen ref="fullRef" class="inline-16" domId="fullScreen" style="visibility: hidden" @backFull="backFull"></fullScreen>
+    <el-dialog
+        :title="$t(`提示`)"
+        :visible.sync="dialogVisible"
+        :showClose="false"
+        width="500px"
+    >
+      <span>{{$t(`暂无权限,请开通权限`)}}</span>
+      <span slot="footer" class="dialog-footer">
+          <el-button type="primary" @click="dialogVisible = false">{{$t(`确 定`)}}</el-button>
+        </span>
+    </el-dialog>
+    <el-dialog
+        :title="$t('提示')"
+        style="margin-top: calc(28vh)"
+        :visible.sync="dialogVisible"
+        width="500px"
+        :before-close="handleClose"
+    >
+      <span>{{$t('当前密码为初始密码,请前往修改密码')}}</span>
+      <span slot="footer" class="dialog-footer">
+    <el-button size="small" @click="onClose">{{$t('取 消')}}</el-button>
+    <el-button size="small" type="primary" @click="goPassword">{{$t('确 定')}}</el-button>
+  </span>
+    </el-dialog>
   </div>
 </template>
 
 <script>
 import fullScreen from "@/views/salesData/components/fullScreen";
-import borderTemplate from './components/borderTemplate'
+import salesmanAccount from './modules/salesmanAccount';
+import jobData from './modules/jobData'
+import salesPanel from './modules/salesPanel'
+import salesFunnel from './modules/salesFunnel'
+import marketingExpenses from './modules/marketingExpenses'
+import marketingExpenseStatistics from './modules/marketingExpenseStatistics'
+import accountsReceivable from './modules/accountsReceivable'
+import dataProfile from './modules/dataProfile'
 export default {
   name: "index",
-  components:{fullScreen,borderTemplate},
+  components:{fullScreen,salesmanAccount,jobData,salesPanel,salesFunnel,marketingExpenses,marketingExpenseStatistics,accountsReceivable,dataProfile},
   data(){
     return {
       timer: "", // 定义一个定时器
@@ -65,7 +123,9 @@ export default {
         }
       },
       windowWidth: document.documentElement.clientWidth,  //实时屏幕宽度
-      windowHeight: document.documentElement.clientHeight
+      windowHeight: document.documentElement.clientHeight,
+      dialogVisible:false,
+      dialogPaw:false
     }
   },
   mounted() {
@@ -87,6 +147,7 @@ export default {
   watch: {
     windowWidth (val) {
       console.log("实时屏幕宽度:",val );
+      this.$refs.panelRef.progressWidth = (9.65 * document.documentElement.clientWidth) / 100
     },
     windowHeight (val) {
       console.log("实时屏幕高度:",val );
@@ -130,13 +191,32 @@ export default {
     },
     backFull(){
       this.$router.push('/message')
+      if (JSON.parse(sessionStorage.getItem('active_password')) == '1' && JSON.parse(sessionStorage.getItem('password')) != '1' && JSON.parse(sessionStorage.getItem('active_account')).usertype != 0 && JSON.parse(sessionStorage.getItem('active_account')).usertype != 1){
+        this.dialogPaw = true
+      }
+    },
+    onClose() {
+      this.dialogVisible = false;
+      sessionStorage.setItem("password", "1");
+      sessionStorage.setItem("isPassword", "0");
+    },
+    handleClose() {
+      this.dialogVisible = false;
+      sessionStorage.setItem("password", "1");
+      sessionStorage.setItem("isPassword", "0");
+    },
+    goPassword(){
+      this.dialogPaw = false
+      this.$router.push('/user_center')
+      sessionStorage.setItem('password','1')
+      sessionStorage.setItem('isPassword','1')
     },
     leaveChange(){
       const type = this.depment?'1':'0'
       this.person = ''
       const dataid = type == '0'?-1:this.departmentid
-      this.otherModel(dataid,type,this.isleave,'状态')
       this.personData()
+      this.queryAllAgainData(dataid)
     },
     /*获取新的业务员列表*/
     async personData(){
@@ -157,6 +237,7 @@ export default {
       this.depment = ''
       this.departmentid = ''
       const userid = JSON.parse(sessionStorage.getItem('active_account')).userid
+      this.queryAllData(userid)
     },
     createMenu (array) {
       var that = this
@@ -214,20 +295,201 @@ export default {
     selectDep(val) {
       if (val.length === 0){
         const userid = JSON.parse(sessionStorage.getItem('active_account')).userid
-        this.otherModel(userid,'0')
+        this.queryAllAgainData(userid)
       }else {
         this.person = ''
         this.dataid = ''
         this.departmentid = val[val.length -1]
-        this.otherModel(this.departmentid,'1',this.isleave)
+        this.queryAllAgainData(this.departmentid)
       }
     },
     selectPerson(val){
       this.depment = ''
       this.departmentid = ''
       this.dataid = val
-      this.otherModel(val,'0',this.isleave)
+      this.queryAllAgainData(val)
+    },
+    queryAllData(id){
+      /*业务员账户*/
+      this.$refs.accountRef.param.content.dataid = id
+      this.$refs.accountRef.param.content.type = this.departmentid !== ''?1:0
+      this.$refs.accountRef.param.content.where.isleave = this.isleave
+      this.$refs.accountRef.listData()
+
+      /*作业数据*/
+      this.$refs.jobRef.param.content.dataid = id
+      this.$refs.jobRef.param.content.type = this.departmentid !== ''?1:0
+      this.$refs.jobRef.param.content.where.isleave = this.isleave
+      this.$refs.jobRef.listData()
+
+      /*销售面板*/
+      this.$refs.panelRef.param.content.dataid = id
+      this.$refs.panelRef.param.content.type = this.departmentid !== ''?1:0
+      this.$refs.panelRef.param.content.where.isleave = this.isleave
+      let year = new Date().getFullYear()
+      this.$refs.panelRef.paramChart.content.dataid = id
+      this.$refs.panelRef.paramChart.content.type = this.departmentid !== ''?1:0
+      this.$refs.panelRef.paramChart.content.where.isleave = this.isleave
+      this.$refs.panelRef.paramChart.content.year = year
+      this.$refs.panelRef.paramShipmentChart.content.dataid = id
+      this.$refs.panelRef.paramShipmentChart.content.type = this.departmentid !== ''?1:0
+      this.$refs.panelRef.paramShipmentChart.content.where.isleave = this.isleave
+      this.$refs.panelRef.paramShipmentChart.content.year = year
+      this.$refs.panelRef.paramInvoiceChart.content.dataid = id
+      this.$refs.panelRef.paramInvoiceChart.content.type = this.departmentid !== ''?1:0
+      this.$refs.panelRef.paramInvoiceChart.content.where.isleave = this.isleave
+      this.$refs.panelRef.paramInvoiceChart.content.year = year
+      this.$refs.panelRef.paramRefundChart.content.dataid = id
+      this.$refs.panelRef.paramRefundChart.content.type = this.departmentid !== ''?1:0
+      this.$refs.panelRef.paramRefundChart.content.where.isleave = this.isleave
+      this.$refs.panelRef.$refs.pickerRef.value = String(year)
+      this.$refs.panelRef.listData(true)
+
+      /*销售漏斗*/
+      this.$refs.funnelRef.param.content.dataid = id
+      this.$refs.funnelRef.param.content.type = this.departmentid !== ''?1:0
+      this.$refs.funnelRef.param.content.where.isleave = this.isleave
+      this.$refs.funnelRef.listData()
+
+      /*营销费用*/
+      this.$refs.expensesRef.param.content.dataid = id
+      this.$refs.expensesRef.param.content.type = this.departmentid !== ''?1:0
+      this.$refs.expensesRef.param.content.where.isleave = this.isleave
+      this.$refs.expensesRef.listData()
+
+      /*营销费用统计*/
+      this.$refs.exStatisticsRef.param.content.dataid = id
+      this.$refs.exStatisticsRef.param.content.type = this.departmentid !== ''?1:0
+      this.$refs.exStatisticsRef.param.content.where.isleave = this.isleave
+      this.$refs.exStatisticsRef.cusInit(true)
+      this.$refs.exStatisticsRef.proInit(true)
+
+      /*应收账款*/
+      this.$refs.receivableRef.param.content.dataid = id
+      this.$refs.receivableRef.param.content.type = this.departmentid !== ''?1:0
+      this.$refs.receivableRef.param.content.where.isleave = this.isleave
+      this.$refs.receivableRef.listData()
+
+      /*数据概况*/
+      this.$refs.profileRef.param.content.dataid = id
+      this.$refs.profileRef.param.content.type = this.departmentid !== ''?1:0
+      this.$refs.profileRef.param.content.where.isleave = this.isleave
+      this.$refs.profileRef.listData()
+      this.$refs.profileRef.$refs.proTypRef.param.content.dataid = id
+      this.$refs.profileRef.$refs.proTypRef.param.content.type = this.departmentid !== ''?1:0
+      this.$refs.profileRef.$refs.proTypRef.param.content.where.isleave = this.isleave
+      this.$refs.profileRef.$refs.proFowRef.param.content.dataid = id
+      this.$refs.profileRef.$refs.proFowRef.param.content.type = this.departmentid !== ''?1:0
+      this.$refs.profileRef.$refs.proFowRef.param.content.where.isleave = this.isleave
+      this.$refs.profileRef.$refs.cusFowRef.param.content.dataid = id
+      this.$refs.profileRef.$refs.cusFowRef.param.content.type = this.departmentid !== ''?1:0
+      this.$refs.profileRef.$refs.cusFowRef.param.content.where.isleave = this.isleave
+      let currentDate = new Date(); // 获取当前日期
+      let startDate = new Date(currentDate.getFullYear(), currentDate.getMonth() ) // 计算起始日期
+      let endDate = currentDate.getFullYear() +'-' + 12 // 计算起始日期
+      this.$refs.profileRef.$refs.startRef.value = startDate
+      this.$refs.profileRef.$refs.endRef.value = endDate
+      this.$refs.profileRef.$refs.proTypRef.typeInit(true,'项目类型分析')
+      this.$refs.profileRef.$refs.proFowRef.typeInit(true,'项目跟进情况')
+      this.$refs.profileRef.$refs.cusFowRef.typeInit(true,'客户跟进情况')
+      this.$refs.profileRef.$refs.analyzeRef.param.content.dataid = id
+      this.$refs.profileRef.$refs.analyzeRef.param.content.type = this.departmentid !== ''?1:0
+      this.$refs.profileRef.$refs.analyzeRef.param.content.where.isleave = this.isleave
+      this.$refs.profileRef.$refs.analyzeDateRef.value = new Date().getFullYear() + '-' +  (new Date().getMonth() + 1) + '-' + new Date().getDate()
+      this.$refs.profileRef.$refs.analyzeRef.lineInit(true)
+    },
+    queryAllAgainData(id){
+      /*业务员账户*/
+      this.$refs.accountRef.param.content.dataid = id
+      this.$refs.accountRef.param.content.type = this.departmentid !== ''?1:0
+      this.$refs.accountRef.param.content.where.isleave = this.isleave
+      this.$refs.accountRef.listData()
+
+      /*作业数据*/
+      this.$refs.jobRef.param.content.dataid = id
+      this.$refs.jobRef.param.content.type = this.departmentid !== ''?1:0
+      this.$refs.jobRef.param.content.where.isleave = this.isleave
+      this.$refs.jobRef.listData()
+
+      /*销售面板*/
+      this.$refs.panelRef.param.content.dataid = id
+      this.$refs.panelRef.param.content.type = this.departmentid !== ''?1:0
+      this.$refs.panelRef.param.content.where.isleave = this.isleave
+      let year = new Date().getFullYear()
+      this.$refs.panelRef.paramChart.content.dataid = id
+      this.$refs.panelRef.paramChart.content.type = this.departmentid !== ''?1:0
+      this.$refs.panelRef.paramChart.content.where.isleave = this.isleave
+      this.$refs.panelRef.paramChart.content.year = year
+      this.$refs.panelRef.paramShipmentChart.content.dataid = id
+      this.$refs.panelRef.paramShipmentChart.content.type = this.departmentid !== ''?1:0
+      this.$refs.panelRef.paramShipmentChart.content.where.isleave = this.isleave
+      this.$refs.panelRef.paramShipmentChart.content.year = year
+      this.$refs.panelRef.paramInvoiceChart.content.dataid = id
+      this.$refs.panelRef.paramInvoiceChart.content.type = this.departmentid !== ''?1:0
+      this.$refs.panelRef.paramInvoiceChart.content.where.isleave = this.isleave
+      this.$refs.panelRef.paramInvoiceChart.content.year = year
+      this.$refs.panelRef.paramRefundChart.content.dataid = id
+      this.$refs.panelRef.paramRefundChart.content.type = this.departmentid !== ''?1:0
+      this.$refs.panelRef.paramRefundChart.content.where.isleave = this.isleave
+      this.$refs.panelRef.$refs.pickerRef.value = String(year)
+      this.$refs.panelRef.listData(false)
+
+      /*销售漏斗*/
+      this.$refs.funnelRef.param.content.dataid = id
+      this.$refs.funnelRef.param.content.type = this.departmentid !== ''?1:0
+      this.$refs.funnelRef.param.content.where.isleave = this.isleave
+      this.$refs.funnelRef.listData()
+
+      /*营销费用*/
+      this.$refs.expensesRef.param.content.dataid = id
+      this.$refs.expensesRef.param.content.type = this.departmentid !== ''?1:0
+      this.$refs.expensesRef.param.content.where.isleave = this.isleave
+      this.$refs.expensesRef.listData()
+
+      /*营销费用统计*/
+      this.$refs.exStatisticsRef.param.content.dataid = id
+      this.$refs.exStatisticsRef.param.content.type = this.departmentid !== ''?1:0
+      this.$refs.exStatisticsRef.param.content.where.isleave = this.isleave
+      this.$refs.exStatisticsRef.cusInit(false)
+      this.$refs.exStatisticsRef.proInit(false)
+
+      /*应收账款*/
+      this.$refs.receivableRef.param.content.dataid = id
+      this.$refs.receivableRef.param.content.type = this.departmentid !== ''?1:0
+      this.$refs.receivableRef.param.content.where.isleave = this.isleave
+      this.$refs.receivableRef.listData()
+
+      /*数据概况*/
+      this.$refs.profileRef.param.content.dataid = id
+      this.$refs.profileRef.param.content.type = this.departmentid !== ''?1:0
+      this.$refs.profileRef.param.content.where.isleave = this.isleave
+      this.$refs.profileRef.listData()
+      this.$refs.profileRef.$refs.proTypRef.param.content.dataid = id
+      this.$refs.profileRef.$refs.proTypRef.param.content.type = this.departmentid !== ''?1:0
+      this.$refs.profileRef.$refs.proTypRef.param.content.where.isleave = this.isleave
+      this.$refs.profileRef.$refs.proFowRef.param.content.dataid = id
+      this.$refs.profileRef.$refs.proFowRef.param.content.type = this.departmentid !== ''?1:0
+      this.$refs.profileRef.$refs.proFowRef.param.content.where.isleave = this.isleave
+      this.$refs.profileRef.$refs.cusFowRef.param.content.dataid = id
+      this.$refs.profileRef.$refs.cusFowRef.param.content.type = this.departmentid !== ''?1:0
+      this.$refs.profileRef.$refs.cusFowRef.param.content.where.isleave = this.isleave
+      let currentDate = new Date(); // 获取当前日期
+      let startDate = new Date(currentDate.getFullYear(), currentDate.getMonth() ) // 计算起始日期
+      let endDate = currentDate.getFullYear() +'-' + 12 // 计算起始日期
+      this.$refs.profileRef.$refs.startRef.value = startDate
+      this.$refs.profileRef.$refs.endRef.value = endDate
+      this.$refs.profileRef.$refs.proTypRef.typeInit(false,'项目类型分析')
+      this.$refs.profileRef.$refs.proFowRef.typeInit(false,'项目跟进情况')
+      this.$refs.profileRef.$refs.cusFowRef.typeInit(false,'客户跟进情况')
+      this.$refs.profileRef.$refs.analyzeRef.param.content.dataid = id
+      this.$refs.profileRef.$refs.analyzeRef.param.content.type = this.departmentid !== ''?1:0
+      this.$refs.profileRef.$refs.analyzeRef.param.content.where.isleave = this.isleave
+      this.$refs.profileRef.$refs.analyzeDateRef.value = new Date().getFullYear() + '-' +  (new Date().getMonth() + 1) + '-' + new Date().getDate()
+      this.$refs.profileRef.$refs.analyzeRef.lineInit(false)
     },
+    detailClick(){
+      this.dialogVisible = true
+    }
   },
   created() {
     this.getTime()
@@ -243,128 +505,39 @@ export default {
 <style scoped>
 .bg-img {
   background: url("../../assets/icons/bgScreen.jpg") no-repeat;
-  /*height:810px ;*/
-  /*width: 1440px;*/
   background-size: 100% 100%;
-  width: 100vh;
+  width: 100vw;
   height: 100vh;
   margin: 0;
   padding: 0;
 }
 .select-style{
   width: 30%;
-  padding-top: 12px;
+  padding-top: 0.625vw;
+  margin-left: 1.042vw;
 }
-/*@media (min-height: 866px) {*/
-/*  .title-style {*/
-/*    font-family: Microsoft YaHei, Microsoft YaHei;*/
-/*    font-weight: bold;*/
-/*    font-size: 44px;*/
-/*    color: #E6F4FF;*/
-/*    text-shadow: 0px 2px 4px #A9D7F9;*/
-/*    text-align: left;*/
-/*    font-style: normal;*/
-/*    text-transform: none;*/
-/*    padding-top: 15px;*/
-/*  }*/
-/*}*/
-/*@media (min-height: 1092px) {*/
-/*  .title-style {*/
-/*    font-family: Microsoft YaHei, Microsoft YaHei;*/
-/*    font-weight: bold;*/
-/*    font-size: 44px;*/
-/*    color: #E6F4FF;*/
-/*    text-shadow: 0px 2px 4px #A9D7F9;*/
-/*    text-align: left;*/
-/*    font-style: normal;*/
-/*    text-transform: none;*/
-/*    padding-top: 20px;*/
-/*  }*/
-/*}*/
-/*@media (min-height: 1206px) {*/
-/*  .title-style {*/
-/*    font-family: Microsoft YaHei, Microsoft YaHei;*/
-/*    font-weight: bold;*/
-/*    font-size: 44px;*/
-/*    color: #E6F4FF;*/
-/*    text-shadow: 0px 2px 4px #A9D7F9;*/
-/*    text-align: left;*/
-/*    font-style: normal;*/
-/*    text-transform: none;*/
-/*    padding-top: 20px;*/
-/*  }*/
-/*}*/
-/*@media (min-height: 1134px) {*/
-/*  .title-style {*/
-/*    font-family: Microsoft YaHei, Microsoft YaHei;*/
-/*    font-weight: bold;*/
-/*    font-size: 44px;*/
-/*    color: #E6F4FF;*/
-/*    text-shadow: 0px 2px 4px #A9D7F9;*/
-/*    text-align: left;*/
-/*    font-style: normal;*/
-/*    text-transform: none;*/
-/*    padding-top: 25px;*/
-/*  }*/
-/*}*/
-/*@media (min-height: 1391px) {*/
-/*  .title-style {*/
-/*    font-family: Microsoft YaHei, Microsoft YaHei;*/
-/*    font-weight: bold;*/
-/*    font-size: 44px;*/
-/*    color: #E6F4FF;*/
-/*    text-shadow: 0px 2px 4px #A9D7F9;*/
-/*    text-align: left;*/
-/*    font-style: normal;*/
-/*    text-transform: none;*/
-/*    padding-top: 30px;*/
-/*  }*/
-/*}*/
-/*@media (min-height: 1506px) {*/
-/*  .title-style {*/
-/*    font-family: Microsoft YaHei, Microsoft YaHei;*/
-/*    font-weight: bold;*/
-/*    font-size: 44px;*/
-/*    color: #E6F4FF;*/
-/*    text-shadow: 0px 2px 4px #A9D7F9;*/
-/*    text-align: left;*/
-/*    font-style: normal;*/
-/*    text-transform: none;*/
-/*    padding-top: 40px;*/
-/*  }*/
-/*}*/
 .title-style {
+  width: 30%;
   font-family: Microsoft YaHei, Microsoft YaHei;
   font-weight: bold;
   font-size: 2.292vw;
   color: #E6F4FF;
   text-shadow: 0.000vw 0.104vw 0.208vw #A9D7F9;
-  text-align: left;
+  margin: auto;
   font-style: normal;
   text-transform: none;
-  padding-top: 1.042vw;
+  padding-top: 1.042vh
 }
-/*.title-style {*/
-/*  font-family: Microsoft YaHei, Microsoft YaHei;*/
-/*  font-weight: bold;*/
-/*  font-size: 1.733vw ;*/
-/*  color: #E6F4FF;*/
-/*  text-shadow: 0.000vw 0.533vw 0.967vw #A9D7F9;*/
-/*  text-align: left;*/
-/*  font-style: normal;*/
-/*  text-transform: none;*/
-/*  padding-top: 0.833vw;*/
-/*}*/
 .time-style{
   font-family: Microsoft YaHei, Microsoft YaHei;
-  width: 30vw;
   font-weight: 400;
   font-size: 0.938vw;
   color: #E6F4FF;
   text-align: right;
   font-style: normal;
   text-transform: none;
-  padding-top: 0.938vw;
+  padding-top: 0.538vw;
+  padding-right: 1.042vw;
 }
 .time-style .span {
   margin-right: 1.042vw;
@@ -377,7 +550,7 @@ export default {
   text-align: left;
   font-style: normal;
   text-transform: none;
-  margin-top: 1.042vw;
+  margin-top: 0.438vw;
   border-radius: 0.313vw 0.313vw 0.313vw 0.313vw;
   border: none;
 }
@@ -386,15 +559,21 @@ export default {
   justify-content: space-between
 }
 .content-style{
-  margin: 1.042vw 1.042vw 1.042vw 1.042vw;
-  border: 0.052vw solid #5daf34;
-  height: calc(100vh - 11.458vw);
+  margin: 1.804vw 1.042vw 1.042vw 1.042vw;
+  /*border: 0.052vw solid #5daf34;*/
+  height: calc(100vh - 7.458vw);
+}
+.inline-left-20{
+  margin-left: 1.042vw;
+}
+.inline-top-20{
+  margin-top: 1.042vw;
 }
 /deep/ .el-input {
   position: relative;
-  font-size: 14px;
+  font-size: 0.729vw;
   display: inline-block;
-  width: 140px;
+  width: 5.892vw;
 }
 /deep/ .el-input__inner {
   -webkit-appearance: none;
@@ -404,14 +583,14 @@ export default {
   color: #c6d6e4;
   display: inline-block;
   font-size: inherit;
-  height: 40px;
-  line-height: 40px;
+  height: 1.583vw;
+  line-height: 1.583vw;
   outline: 0;
-  padding: 0 15px;
+  padding: 0 0 0 0.381vw;
   transition: border-color .2s cubic-bezier(.645, .045, .355, 1);
   width: 100%;
-  box-shadow: 0px 3px 6px 1px rgba(0,0,0,0.16);
-  border-radius: 6px 6px 6px 6px;
-  border: 1px solid #CFDCE5;
+  box-shadow: 0.000vw 0.156vw 0.313vw 0.052vw rgba(0,0,0,0.16);
+  border-radius: 0.313vw 0.313vw 0.313vw 0.313vw;
+  border: 0.052vw solid #CFDCE5;
 }
 </style>

+ 105 - 0
src/HManagement/serviceDataScreen/modules/accountsReceivable.vue

@@ -0,0 +1,105 @@
+<template>
+  <div>
+    <borderTemplate borderBox="width: 31.250vw;height: 15.104vw;" title="应收账款" detailTitle="查看详情" @dialog="$emit('dialog')"  systemappid="286" push_path="/accountsReceivable">
+      <template slot="operation">
+        <div style="padding-left: 0.521vw">
+          <el-radio v-model="param.content.querytype" label="2" @input="listData">{{$t(`按业务员`)}}</el-radio>
+          <el-radio v-model="param.content.querytype" label="1" @input="listData">{{$t(`按客户`)}}</el-radio>
+        </div>
+      </template>
+      <template slot="content">
+        <div class="justify-style">
+          <boxTemplate title="总应收" :data="list.sumallaoverduemount"></boxTemplate>
+          <boxTemplate title="逾期1月以内" :data="list.sumonemonthamount"></boxTemplate>
+        </div>
+        <div class="justify-style">
+          <boxTemplate title="逾期1~3月" :data="list.sumthreemonthamount"></boxTemplate>
+          <boxTemplate title="逾期3月以上" :data="list.sumupthreemonthamount"></boxTemplate>
+        </div>
+      </template>
+    </borderTemplate>
+  </div>
+</template>
+
+<script>
+import borderTemplate from '../components/borderTemplate'
+import boxTemplate from "../components/boxTemplate";
+export default {
+  name: "accountsReceivable",
+  components:{borderTemplate,boxTemplate},
+  data(){
+    return {
+      param:{
+        "id": 20241009101204,
+        "content": {
+          "type": '',
+          "dataid": '',
+          "querytype": '2',
+          "where": {
+            "isleave": ""
+          }
+        }
+      },
+      list:''
+    }
+  },
+  methods:{
+    async listData(){
+      const res = await this.$api.requested(this.param)
+      this.list = res.data
+      console.log(this.list,'应收账款')
+    }
+  }
+}
+</script>
+
+<style scoped>
+.justify-style{
+  display: flex;
+  justify-content: space-between;
+  margin-top: 1.042vw;
+}
+/deep/ .el-radio__inner {
+  width: 1.250vw;
+  height: 1.250vw;
+  position: relative;
+  cursor: pointer;
+  display: inline-block;
+  box-sizing: border-box;
+  background: linear-gradient(356deg, #00244D 0%, #001E41 100%);
+  box-shadow: 0.000vw 0.104vw 0.208vw 0.052vw rgba(0,0,0,0.15);
+  border-radius: 0.833vw;
+  border: 0.104vw solid #3D73BA;
+  opacity: 0.8;
+}
+/deep/ .el-radio__label {
+  font-family: Microsoft YaHei, Microsoft YaHei;
+  font-weight: 400;
+  font-size: 0.729vw;
+  color: #E6F4FF;
+  line-height: 0.000vw;
+  text-align: left;
+  font-style: normal;
+  text-transform: none;
+  padding-left: 0.521vw;
+}
+/deep/ .el-radio__input.is-checked+.el-radio__label {
+  color: #E6F4FF;
+}
+/deep/ .el-radio__inner::after {
+  width: 0.625vw;
+  height: 0.625vw;
+  border-radius: 100%;
+  background-color: #3685FC;
+  content: "";
+  position: absolute;
+  left: 50%;
+  top: 50%;
+  transform: translate(-50%, -50%) scale(0);
+  transition: transform .15s ease-in;
+}
+/deep/ .el-radio__input.is-checked .el-radio__inner {
+  border-color: #3685FC;
+  background: none;
+}
+</style>

+ 468 - 0
src/HManagement/serviceDataScreen/modules/dataProfile.vue

@@ -0,0 +1,468 @@
+<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'">
+      <template slot="content">
+        <div class="justify-content">
+          <div class="justify-content-left">
+            <div class="box-border">
+              <el-button v-if="typeSelect == '线索'" type="primary" class="btn-select" @click="typeChange('线索')">{{$t(`线索`)}}</el-button>
+              <el-button type="text" v-else class="btn-unSelect" @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>
+            </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>
+            </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>
+            </div>
+          </div>
+          <div style="display: flex;justify-content: left">
+            <el-select v-model="param.content.dateType"  class="inline-16" size="small" @change="listData" :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-option :label="$t('去年')" value="去年"></el-option>
+            </el-select>
+          </div>
+        </div>
+        <profileTemplate :dataProfile="dataProfile" :profileType="profileType"></profileTemplate>
+        <div class="bottom_justify">
+          <div class="title_font">
+            {{$t(`数据图例`)}}
+          </div>
+          <div class="title_right" v-show="typeSelect !== '报价'">
+            <el-select v-model="dateType"  class="inline-16" size="small" @change="dateTypeChange"  :popper-append-to-body="false">
+              <el-option :label="$t('全部')" value="全部"></el-option>
+              <el-option :label="$t('本年')" value="本年"></el-option>
+            </el-select>
+            <div class="line-style inline-16"></div>
+            <div class="inline-16">
+              <datePicker ref="startRef" type="date" @selectTime="begDateChange" format="yyyy-MM" value_format="yyyy-MM"></datePicker>
+            </div>
+            <div class="title_right_font inline-16">至</div>
+            <div>
+              <datePicker ref="endRef" type="date" @selectTime="endDateChange" format="yyyy-MM" value_format="yyyy-MM"></datePicker>
+            </div>
+          </div>
+          <div class="title_right" v-show="typeSelect == '报价'">
+            <datePicker ref="analyzeDateRef" type="date" @selectTime="analyzeChange" format="yyyy-MM-dd" value_format="yyyy-MM-dd"></datePicker>
+          </div>
+        </div>
+        <div v-show="typeSelect === '报价'">
+          <div style="margin-top: 1.042vw">
+            <LineCharts ref="analyzeRef" height="10.844vw" width="29.125vw" h-chart="9.933vw" w-chart="29.125vw"></LineCharts>
+          </div>
+        </div>
+       <div v-show="typeSelect !== '报价'">
+         <div  style="display:flex;justify-content: left;margin-top: 1.042vw">
+           <PieCharts ref="proTypRef" height="11.844vw" width="12.125vw" h-chart="9.633vw" w-chart="10.125vw" title="项目类型分析"></PieCharts>
+           <PieCharts ref="proFowRef" height="11.844vw" width="11.125vw" h-chart="9.633vw" w-chart="10.125vw" title="项目跟进情况"></PieCharts>
+           <PieCharts ref="cusFowRef" height="11.844vw" width="11.125vw" h-chart="9.633vw" w-chart="10.125vw" title="客户跟进情况"></PieCharts>
+         </div>
+       </div>
+      </template>
+    </borderTemplate>
+  </div>
+</template>
+
+<script>
+import borderTemplate from '../components/borderTemplate'
+import profileTemplate from "../components/profileTemplate";
+import datePicker from "../components/datePicker";
+import PieCharts from "../components/PieCharts";
+import LineCharts from '../components/lineCharts'
+export default {
+  name: "dataProfile",
+  components:{borderTemplate,profileTemplate,datePicker,PieCharts,LineCharts},
+  data(){
+    return {
+      typeSelect:'线索',
+      dateType:'本年',
+      param:{
+        id:20231014114204,
+        content:{
+          dataid:'',
+          dateType:'本年',
+          type:'',
+          where:{
+            isleave:''
+          }
+        }
+      },
+      list:'',
+      dataProfile:[],
+      profileType:[],
+    }
+  },
+  methods:{
+    async listData(){
+      if (this.typeSelect == '线索'){
+        this.param.id = 20231014114204
+      }else if (this.typeSelect == '客户'){
+        this.param.id = 20231015170504
+      }else if (this.typeSelect == '项目'){
+        this.param.id = 20231018110404
+      }else if (this.typeSelect == '报价'){
+        this.param.id = 20231011201004
+      }
+      const res = await this.$api.requested(this.param)
+      this.list = res.data
+      this.profileType = []
+      if (this.typeSelect == '客户'){
+        this.profileType = res.data.data
+      }else if (this.typeSelect == '项目'){
+        this.profileType = res.data.projecttype
+      }
+      console.log(this.list,this.typeSelect,'数据')
+      console.log(this.profileType,this.typeSelect,'this.profileType')
+      this.profileSet(this.typeSelect)
+    },
+    profileSet(val){
+      if (val == '线索'){
+        this.dataProfile = [
+          {
+            title:'线索总数',
+            value:this.list.total,
+            tips:'线索总数:包含待分配、已分配线索数。'
+          },
+          {
+            title:'待分配未过期线索数',
+            value:this.list.dfp,
+            tips:'待分配未过期线索数:所有线索中,待分配未过期的线索数量。'
+          },
+          {
+            title:'待跟进线索数',
+            value:this.list.dgj,
+            tips:'待跟进线索数:销售线索应用中,已分配给业务员,待跟进状态的线索数量。'
+          },
+          {
+            title:'跟进中线索数',
+            value:this.list.gjz,
+            tips:'跟进中线索数:销售线索应用中,已分配给业务员,跟进中状态的线索数量。'
+          },
+          {
+            title:'已转化线索数',
+            value:this.list.yzh,
+            tips:"①已转化线索数:销售线索应用中,已分配给业务员,已转化状态的线索数量。" + '\n\n' + '②一条线索可进行两次转化:转化客户、转化项目,因此,已转化线索数≠转化客户线索数+转化项目线索数。'
+          },
+          {
+            title:'已无效线索数',
+            value:this.list.ywx,
+            tips:"已无效线索数:销售线索应用中,已分配给业务员,已无效状态的线索数量。"
+          },
+          {
+            title:'待分配已过期线索数',
+            value:this.list.ygq,
+            tips:'待分配已过期线索数:所有线索中,待分配已过期的线索数量。'
+          },
+          {
+            title:'过期比例',
+            value:Math.round(((this.list.gqbl * 100)*100)/100) + '%',
+            tips:'过期比例=已过期线索数÷待分配线索数×100%'
+          },
+          {
+            title:'转化客户线索数',
+            value:this.list.covercusomers,
+            tips:'转化客户线索数:统计有转化客户操作的线索数'
+          },
+          {
+            title:'转化项目线索数',
+            value:this.list.coverproject,
+            tips:'转化客户线索数:统计有转化项目操作的线索数'
+          },
+          {
+            title:'线索转化率',
+            value:Math.round(((this.list.zhl * 100)*100)/100) + '%',
+            tips:'线索转化率=已转化线索数÷线索总数×100%'
+          },
+          {
+            title:'线索成交数',
+            value:this.list.dealqty,
+            tips:'线索成交数:转化后有下订单的线索数量'
+          },
+          {
+            title:'线索成交率',
+            value:Math.round(((this.list.cjl * 100)*100)/100) + '%',
+            tips:'线索成交率=转化后有下订单的线索数÷线索总数×100%'
+          },
+          {
+            title:'参与线索数',
+            value:this.list.joinordercluesize,
+            tips:'参与线索数:参与的并且至少有一次跟进的线索数量'
+          },
+          {
+            title:'参与线索转化数',
+            value:this.list.joincoverorderclue,
+            tips:'参与线索转化数:参与的并且至少有一次跟进的有发生转化的线索数量'
+          },
+          {
+            title:'参与线索转化率',
+            value:Math.round(((this.list.joinordercluezhl * 100)*100)/100) + '%',
+            tips:'参与线索转化率=参与线索转化数 ÷ 参与线索数 ×100%'
+          },
+          {
+            title:'参与线索成交数',
+            value:this.list.joindealorderclue,
+            tips:'参与线索成交数:参与的并且至少有一次跟进的转化后有下订单的线索数量'
+          },
+          {
+            title:'参与线索成交率',
+            value:Math.round(((this.list.joinordercluecjl * 100)*100)/100) + '%',
+            tips:'参与线索成交率=参与线索成交率 ÷ 参与线索数 ×100%'
+          },
+        ]
+      }else if (val == '客户'){
+        this.dataProfile = [
+          {
+            title:'客户总数',
+            value:this.list.total,
+            tips:'客户总数:包含我的客户、公海客户数量'
+          },
+          {
+            title:'公海客户数',
+            value:this.list.customerpoolqty,
+            tips:''
+          },
+          {
+            title:'成交客户数',
+            value:this.list.tradedCustomers,
+            tips:'成交客户:已成交、多次成交状态的客户数量'
+          },
+          {
+            title:'参与项目客户数',
+            value:this.list.participateProject,
+            tips:'参与项目客户数:参与有下订单的项目的关联客户数'
+          },
+        ]
+      }else if (val == '项目'){
+        this.dataProfile = [
+          {
+            title:'项目总数',
+            value:this.list.totalqty,
+            tips:''
+          },
+          {
+            title:'报备项目数',
+            value:this.list.reportProject,
+            tips:'报备项目数:统计已报备的项目数量'
+          },
+          {
+            title:'进行中项目数',
+            value:this.list.dealProject,
+            tips:'进行中项目数:进行中状态的项目数量'
+          },
+          {
+            title:'项目成交数',
+            value:this.list.dealProject,
+            tips:'项目成交数:统计有关联审核过的订单的项目数量'
+          },
+          {
+            title:'项目成交率',
+            value:this.list.cjl + '%',
+            tips:'项目成交率=有关联审核订单的项目数÷项目总数×100%'
+          },
+          {
+            title:'项目失败数',
+            value:this.list.failedproject,
+            tips:'项目失败数:已失败状态的项目数量'
+          },
+          {
+            title:'项目失败率',
+            value:Math.round(((this.list.sbl * 100)*100)/100) + '%',
+            tips:'项目失败率=已失败项目数÷项目总数×100%'
+          },
+          {
+            title:'参与项目数',
+            value:this.list.joinProject,
+            tips:'参与项目数:参与的并且至少有一次跟进的项目数量'
+          },
+          {
+            title:'参与项目成交数',
+            value:this.list.joinDealProject,
+            tips:'参与项目成交数:参与的并且至少有一次跟进的项目的成交数量'
+          },
+          {
+            title:'参与项目成交率',
+            value:Math.round(((this.list.joinDealProjectcjl * 100)*100)/100) + '%',
+            tips:'参与项目成交率=参与项目成交数 ÷ 参与项目数 ×100%'
+          },
+        ]
+      }else if (val == '报价'){
+        this.dataProfile = [
+          {
+            title:'报价总次数',
+            value:this.list.totalqty,
+            tips:'统计到当前查询时间为止的报价总次数(审核状态)'
+          },
+          {
+            title:'客户报价次数',
+            value:this.list.cusqty,
+            tips:'统计到当前查询时间为止的客户报价总次数(审核状态)'
+          },
+          {
+            title:'项目报价次数',
+            value:this.list.proqty,
+            tips:'统计到当前查询时间为止的项目报价总次数(审核状态)'
+          },
+          {
+            title:'报价总金额',
+            value:this.list.totalamount,
+            tips:'统计到当前查询时间为止的报价总金额(审核状态)'
+          },
+          {
+            title:'客户报价金额',
+            value:this.list.cusamount,
+            tips:'统计到当前查询时间为止的客户报价金额(审核状态)'
+          },
+          {
+            title:'项目报价金额',
+            value:this.list.proamount,
+            tips:'统计到当前查询时间为止的项目报价金额(审核状态)'
+          },
+        ]
+      }
+    },
+    typeChange(val){
+      if (val == '线索'){
+        this.typeSelect = '线索'
+      }else if (val == '客户'){
+        this.typeSelect = '客户'
+      }else if (val == '项目'){
+        this.typeSelect = '项目'
+      }else if (val == '报价'){
+        this.typeSelect = '报价'
+      }
+      this.listData()
+    },
+    dateTypeChange(){
+      if (this.dateType == '本年'){
+        let currentDate = new Date(); // 获取当前日期
+        let startDate = new Date(currentDate.getFullYear(), currentDate.getMonth()) // 计算起始日期
+        let endDate = currentDate.getFullYear() +'-' + 12 // 计算起始日期
+        this.$refs.startRef.value = startDate
+        this.$refs.endRef.value = endDate
+      }else {
+        this.$refs.startRef.value = ''
+        this.$refs.endRef.value = ''
+      }
+      this.$refs.proTypRef.param.content.dateType = this.dateType
+      this.$refs.proTypRef.typeInit(null,'项目类型分析')
+      this.$refs.proFowRef.param.content.dateType = this.dateType
+      this.$refs.proFowRef.typeInit(null,'项目跟进情况')
+      this.$refs.cusFowRef.param.content.dateType = this.dateType
+      this.$refs.cusFowRef.typeInit(null,'客户跟进情况')
+    },
+    begDateChange(val){
+      this.$refs.proTypRef.param.content.where.begdate = val
+      this.$refs.proTypRef.typeInit(null,'项目类型分析')
+      this.$refs.proFowRef.param.content.where.begdate = val
+      this.$refs.proFowRef.typeInit(null,'项目跟进情况')
+      this.$refs.cusFowRef.param.content.where.begdate = val
+      this.$refs.cusFowRef.typeInit(null,'客户跟进情况')
+    },
+    endDateChange(val){
+      this.$refs.proTypRef.param.content.where.begdate = val
+      this.$refs.proTypRef.typeInit(null,'项目类型分析')
+      this.$refs.proFowRef.param.content.where.begdate = val
+      this.$refs.proFowRef.typeInit(null,'项目跟进情况')
+      this.$refs.cusFowRef.param.content.where.begdate = val
+      this.$refs.cusFowRef.typeInit(null,'客户跟进情况')
+    },
+    analyzeChange(val){
+      this.$refs.analyzeRef.param.content.enddate = val
+      this.$refs.analyzeRef.lineInit(false)
+    }
+  }
+}
+</script>
+<style>
+.justify-content{
+  display: flex;
+  justify-content: space-between;
+  margin-top: 1.042vw;
+}
+.justify-content-left{
+  display: flex;
+  justify-content: left;
+}
+.justify-content-left .box-border{
+  width: 3.125vw;
+  height: 1.563vw;
+  border-radius: 0.104vw 0.104vw 0.104vw 0.104vw;
+  margin-right: 0.521vw;
+  text-align: center;
+}
+.justify-content-left .box-border .btn-select{
+  font-family: Microsoft YaHei, Microsoft YaHei;
+  font-weight: 400;
+  font-size: 0.833vw;
+  color: #E6F4FF;
+  font-style: normal;
+  text-transform: none;
+}
+.justify-content-left .box-border .btn-unSelect{
+  font-family: Microsoft YaHei, Microsoft YaHei;
+  font-weight: 400;
+  font-size: 0.729vw;
+  color: #CFDCE5;
+  font-style: normal;
+  text-transform: none;
+  text-align: center;
+}
+.line-style{
+  width: 0.000vw;
+  height: 0.625vw;
+  border: 0.052vw solid #CFDCE5;
+  margin: auto;
+}
+.bottom_justify{
+  display: flex;
+  justify-content: space-between;
+  margin-top: 1.042vw;
+}
+.bottom_justify .title_font{
+  font-family: Microsoft YaHei, Microsoft YaHei;
+  font-weight: bold;
+  font-size: 0.833vw;
+  color: #E6F4FF;
+  text-align: left;
+  font-style: normal;
+  text-transform: none;
+}
+.bottom_justify .title_right{
+  display: flex;
+  justify-content: left;
+}
+.title_right .title_right_font{
+  font-family: Microsoft YaHei, Microsoft YaHei;
+  font-weight: 400;
+  font-size: 0.625vw;
+  color: #E6F4FF;
+  text-align: left;
+  font-style: normal;
+  text-transform: none;
+  margin: auto;
+}
+</style>
+<style  scoped>
+ /deep/ .el-button--primary:focus, .el-button--primary:hover {
+  background: #6090f8;
+  border-color: #6090f8;
+  /*color: #6090f8;*/
+}
+ /deep/ .element.style {
+   font-size: 0.830vw;
+}
+ /deep/ .el-button {
+   line-height: 0.5;
+   padding: 0.521vw 0.521vw;
+ }
+</style>

+ 148 - 0
src/HManagement/serviceDataScreen/modules/jobData.vue

@@ -0,0 +1,148 @@
+<template>
+  <div>
+    <borderTemplate borderBox="width: 15.208vw;height: 12.500vw;" title="作业数据" detailTitle="查看详情" @dialog="detailClick" systemappid="42" push_path="/dataanalysis">
+      <template slot="content">
+        <div style="display: flex;justify-content: right;margin-top: 0.242vw;">
+          <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-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>
+            <div>
+              <div class="data-font">{{list.xmxz}}</div>
+              <div class="title">{{$t(`新增项目`)}}</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>
+          </div>
+        </div>
+      </template>
+    </borderTemplate>
+  </div>
+</template>
+
+<script>
+import borderTemplate from '../components/borderTemplate'
+export default {
+  name: "jobData",
+  components:{borderTemplate},
+  data(){
+    return {
+      dateType:'本月',
+      param:{
+        id:20230616131404,
+        content:{
+          dataType:'1',
+          dataid:'',
+          type:'',
+          where:{
+            isleave:''
+          }
+        }
+      },
+      list:{
+        khgj:'',
+        khxz:'',
+        xmgj:'',
+        xmxz:'',
+        xsgj:'',
+        xsxz:'5'
+      },
+      listNew:""
+    }
+  },
+  methods:{
+    async listData(){
+      const res = await this.$api.requested(this.param)
+      this.listNew = res.data
+      this.dateTypeChange()
+    },
+    dateTypeChange(){
+      if (this.dateType == '本月'){
+        this.list.khgj = this.listNew.bykhgj
+        this.list.khxz = this.listNew.bykhxz
+        this.list.xmxz = this.listNew.byxmxz
+        this.list.xmgj = this.listNew.byxmgj
+        this.list.xsgj = this.listNew.byxsgj
+        this.list.xsxz = this.listNew.byxsxz
+      }else if (this.dateType == '本周') {
+        this.list.khgj = this.listNew.bzkhgj
+        this.list.khxz = this.listNew.bzkhxz
+        this.list.xmxz = this.listNew.bzxmxz
+        this.list.xmgj = this.listNew.bzxmgj
+        this.list.xsgj = this.listNew.bzxsgj
+        this.list.xsxz = this.listNew.bzxsxz
+      }else if (this.dateType == '本年') {
+        this.list.khgj = this.listNew.bnkhgj
+        this.list.khxz = this.listNew.bnkhxz
+        this.list.xmxz = this.listNew.bnxmxz
+        this.list.xmgj = this.listNew.bnxmgj
+        this.list.xsgj = this.listNew.bnxsgj
+        this.list.xsxz = this.listNew.bnxsxz
+      }
+    },
+    detailClick(){
+      this.$emit('dialog')
+    },
+  }
+}
+</script>
+
+<style scoped>
+.box-style{
+  width: 13.021vw;
+  height: 6.458vw;
+  background: #001E41;
+  box-shadow: 0.000vw 0.156vw 0.313vw 0.052vw rgba(0,0,0,0.16);
+  border-radius: 0.313vw 0.313vw 0.313vw 0.313vw;
+  border: 0.052vw solid #CFDCE5;
+  margin-top: 0.642vw;
+}
+.box-style .data-font{
+  font-family: Microsoft YaHei, Microsoft YaHei;
+  font-weight: bold;
+  font-size: 1.250vw;
+  color: #3685FC;
+  text-align: left;
+  font-style: normal;
+  text-transform: none;
+}
+.box-style .title{
+  height: 0.833vw;
+  font-family: Microsoft YaHei, Microsoft YaHei;
+  font-weight: 400;
+  font-size: 0.625vw;
+  color: #CFDCE5;
+  text-align: left;
+  font-style: normal;
+  text-transform: none;
+}
+.justify-content-style-set{
+  display: flex;
+  justify-content: space-between;
+  padding: 0.225vw 1.042vw 0 1.042vw;
+}
+</style>

+ 294 - 0
src/HManagement/serviceDataScreen/modules/marketingExpenseStatistics.vue

@@ -0,0 +1,294 @@
+<template>
+  <div>
+    <borderTemplate borderBox="width: 17.083vw;height: 12.500vw;" title="营销费用统计" detailTitle="查看详情" @dialog="$emit('dialog')" systemappid="290" push_path="/salerpriceData">
+      <template slot="content">
+        <div>
+          <div style="display: flex;justify-content: space-between;margin-bottom: 0.364vw">
+            <el-button type="text" class="inline-16 btn-title-style" @click="onChange(true)" >{{$t(`切换`)}}{{$t(btnTitle)}}</el-button>
+            <el-select v-model="param.content.dateType"  class="inline-16" size="small" @change="onChange(false)" :popper-append-to-body="false" >
+              <el-option :label="$t('全部')" value="全部"></el-option>
+              <el-option :label="$t('本年')" value="本年"></el-option>
+            </el-select>
+          </div>
+          <div v-show="btnTitle == '项目'" style="width: 16.025vw;height: 6.633vw;margin-top: 0.264vw;" ref="customerRefChar">
+          </div>
+          <div v-show="btnTitle == '客户'" style="width: 16.025vw;height: 6.633vw;margin-top: 0.264vw;" ref="projectRefChar">
+          </div>
+        </div>
+      </template>
+    </borderTemplate>
+  </div>
+</template>
+
+<script>
+import borderTemplate from '../components/borderTemplate'
+import {Pie} from "@antv/g2plot";
+export default {
+  name: "marketingExpenseStatistics",
+  components:{borderTemplate},
+  data(){
+    return {
+      dateType:'本年',
+      btnTitle:'项目',
+      param:{
+        id:2024062615133802,
+        content:{
+          dataid:'',
+          dateType:'本年',
+          ownertable:'sa_customers',
+          type:'',
+          where:{
+            isleave:'1',
+          }
+        }
+      },
+      cusData:'',
+      proData:'',
+      cusMap:'',
+      proMap:''
+    }
+  },
+  methods:{
+    async cusInit(init){
+      this.param.id = 2024062615133802
+      this.param.content.ownertable = 'sa_customers'
+      let res = await this.$api.requested(this.param)
+      // this.mapData = res.data[0].ratio
+      this.cusData = res.data[0].ratio.map(item=>{
+        return {
+          "totalamount": res.data[0].ratio[0].total,//值
+          "type": item.type,
+          "rowindex": item.rowindex,
+          "ratio": Math.round(((item.ratio * 100)*100)/100), //比例
+          "value":item.value
+        }
+      })
+      console.log('客户类型数据',this.cusData)
+      if (init) {
+        this.cusMap = new Pie(this.$refs.customerRefChar, {
+          appendPadding: 2,
+          data:this.cusData,
+          angleField: 'ratio',
+          colorField: 'type',
+          radius: 1,
+          innerRadius: 0.79,
+          label:{
+            style:{
+              fill:'#CFDCE5'
+            },
+            /*type: 'inner',
+            offset: '-50%',
+            style: {
+              textAlign: 'center',
+            },
+            autoRotate: false,*/
+            formatter: (datum) => `${datum.ratio}%`
+          },
+          tooltip:{
+            formatter: (datum) => {
+              return { name: datum.type, value: datum.ratio + '%' };
+            },
+            style: {
+              fontSize:'0.733vw',
+              color:'#f60b44'
+            },
+          },
+          statistic: {
+            title: {
+              offsetY: -4,
+              style: {
+                fontSize:'0.733vw',
+                color:'#E6F4FF'
+              },
+              content:'客户营销费用'
+            },
+            content: {
+              offsetY: 4,
+              style: {
+                whiteSpace: 'pre-wrap',
+                overflow: 'hidden',
+                textOverflow: 'ellipsis',
+                fontSize:'0.833vw',
+                color:'#FFFFFF'
+              },
+              customHtml: (container, view, datum, data) => {
+                const text = '¥'+this.tool.formatAmount(this.tool.unitConversion(data[0].totalamount,10000),2)+this.$t('万')
+                return text
+              },
+            },
+          },
+          legend: {
+            position:'right',
+            offsetY:2,
+            itemName:{
+              style:{
+                fill:'#CFDCE5'
+              }
+            },
+            pageNavigator:{
+              marker: {
+                style: {
+                  // 非激活,不可点击态时的填充色设置
+                  inactiveFill: '#fff',
+                  inactiveOpacity: 1,
+                  // 默认填充色设置
+                  fill: '#fff',
+                  opacity: 1,
+                  size: 10,
+                },
+              },
+              text: {
+                style: {
+                  // 非激活,不可点击态时的填充色设置
+                  inactiveFill: '#fff',
+                  inactiveOpacity: 1,
+                  // 默认填充色设置
+                  fill: '#fff',
+                  opacity: 1,
+                  size: 10,
+                },
+              },
+            }
+          },
+          // 添加 中心统计文本 交互
+          // interactions: [{ type: 'element-single-selected' },{ type: 'element-active' }],
+        });
+        this.cusMap.render();
+      } else {
+        this.cusMap.changeData(this.cusData)
+      }
+    },
+    async proInit(init){
+      this.param.id = 2024062915152702
+      this.param.content.ownertable = 'sa_project'
+      let res = await this.$api.requested(this.param)
+      // this.mapData = res.data[0].ratio
+      this.proData = res.data[0].ratio.map(item=>{
+        return {
+          "totalamount": res.data[0].ratio[0].total,//值
+          "type": item.type,
+          "rowindex": item.rowindex,
+          "ratio": Math.round(((item.ratio * 100)*100)/100), //比例
+          "value":item.value
+        }
+      })
+      console.log('项目类型数据',this.proData)
+      if (init) {
+        this.proMap = new Pie(this.$refs.projectRefChar, {
+          appendPadding: 2,
+          data:this.proData,
+          angleField: 'ratio',
+          colorField: 'type',
+          radius: 1,
+          innerRadius: 0.79,
+          label:{
+            style:{
+              fill:'#CFDCE5'
+            },
+            /*type: 'inner',
+            offset: '-50%',
+            style: {
+              textAlign: 'center',
+            },
+            autoRotate: false,*/
+            formatter: (datum) => `${datum.ratio}%`
+          },
+          tooltip:{
+            formatter: (datum) => {
+              return { name: datum.type, value: datum.ratio + '%' };
+            },
+          },
+          statistic: {
+            title: {
+              offsetY: -4,
+              style: {
+                fontSize:'0.733vw',
+                color:'#E6F4FF'
+              },
+              content:'项目营销费用'
+            },
+            content: {
+              offsetY: 4,
+              style: {
+                whiteSpace: 'pre-wrap',
+                overflow: 'hidden',
+                textOverflow: 'ellipsis',
+                fontSize:'0.833vw',
+                color:'#FFFFFF'
+              },
+              customHtml: (container, view, datum, data) => {
+                const text = '¥'+this.tool.formatAmount(this.tool.unitConversion(data[0].totalamount,10000),2)+this.$t('万')
+                return text
+              },
+            },
+          },
+          legend: {
+            position:'right',
+            offsetY:2,
+            itemName:{
+              style:{
+                fill:'#CFDCE5'
+              }
+            },
+            pageNavigator:{
+              marker: {
+                style: {
+                  // 非激活,不可点击态时的填充色设置
+                  inactiveFill: '#fff',
+                  inactiveOpacity: 1,
+                  // 默认填充色设置
+                  fill: '#fff',
+                  opacity: 1,
+                  size: 10,
+                },
+                text: {
+                  style: {
+                    // 非激活,不可点击态时的填充色设置
+                    inactiveFill: '#fff',
+                    inactiveOpacity: 1,
+                    // 默认填充色设置
+                    fill: '#fff',
+                    opacity: 1,
+                    size: 10,
+                  },
+                },
+              },
+            }
+          },
+          // 添加 中心统计文本 交互
+          // interactions: [{ type: 'element-single-selected' },{ type: 'element-active' }],
+        });
+        this.proMap.render();
+      } else {
+        this.proMap.changeData(this.proData)
+      }
+    },
+    onChange(init){
+      if (this.btnTitle == '客户'){
+        if (init){
+          this.btnTitle = '项目'
+          this.cusInit(false)
+        }else {
+          this.proInit(false)
+        }
+      }else {
+        if (init){
+          this.btnTitle = '客户'
+          this.proInit(false)
+        }else {
+          this.cusInit(false)
+        }
+      }
+    }
+  }
+}
+</script>
+
+<style scoped>
+.btn-title-style{
+  font-weight: 400;
+  font-size: 0.729vw;
+  color: #6CD2A1;
+  text-decoration:underline
+}
+</style>

+ 93 - 0
src/HManagement/serviceDataScreen/modules/marketingExpenses.vue

@@ -0,0 +1,93 @@
+<template>
+  <div>
+    <borderTemplate borderBox="width: 15.104vw;height: 12.500vw;" title="营销费用" detailTitle="金额明细" @dialog="$emit('dialog')" systemappid="290" push_path="/salerpriceData">
+      <template slot="content">
+        <div class="money-style">{{tool.formatAmount(amount,2)}}</div>
+        <div class="title-style">{{$t(`营销费用总金额(元)`)}}</div>
+        <div class="div-line"></div>
+        <div>
+          <div class="title-style" style="float: left">{{$t(`营销费用总数量`)}}</div>
+          <div class="money2-style" style="float: right">{{count}}</div>
+        </div>
+      </template>
+    </borderTemplate>
+  </div>
+</template>
+
+<script>
+import borderTemplate from '../components/borderTemplate'
+export default {
+  name: "marketingExpenses",
+  components:{borderTemplate},
+  data() {
+    return {
+      param:{
+        "id": 2024062609373902,
+        "content": {
+          "type": '',
+          "dataid": '',
+          "dateType":'',
+          "where": {
+            "isleave": ""
+          }
+        }
+      },
+      amount:'',
+      count:'',
+    }
+  },
+  methods:{
+    async listData(){
+      const res = await this.$api.requested(this.param)
+      this.amount = res.data.amount
+      this.count = res.data.count
+    },
+    detailClick(){
+      // this.drawerShow = true
+    },
+    onClose(){
+      this.drawerShow = false
+    },
+  },
+}
+</script>
+
+<style scoped>
+.money-style{
+  font-family: Microsoft YaHei, Microsoft YaHei;
+  font-weight: bold;
+  font-size: 2.083vw;
+  color: #40DCF2;
+  text-align: left;
+  font-style: normal;
+  text-transform: none;
+  margin-top: 0.542vw;
+}
+.title-style {
+  font-family: Microsoft YaHei, Microsoft YaHei;
+  font-weight: 400;
+  font-size: 0.938vw;
+  color: #CFDCE5;
+  text-align: left;
+  font-style: normal;
+  text-transform: none;
+}
+.div-line{
+  width: 12.917vw;
+  height: 0.000vw;
+  border: 0.052vw solid #CFDCE5;
+  margin: 1.042vw 0 1.042vw 0;
+}
+.money2-style{
+  font-family: Microsoft YaHei, Microsoft YaHei;
+  font-weight: bold;
+  font-size: 1.042vw;
+  color: #6CD2A1;
+  text-align: left;
+  font-style: normal;
+  text-transform: none;
+}
+/deep/ .el-drawer__wrapper {
+  right: 0 !important;
+}
+</style>

+ 170 - 0
src/HManagement/serviceDataScreen/modules/salesFunnel.vue

@@ -0,0 +1,170 @@
+<template>
+  <div>
+    <borderTemplate borderBox="width: 33.333vw;height: 35.417vw;" title="销售漏斗"  detailTitle="查看详情" @dialog="$emit('dialog')" systemappid="260" push_path="/salesfunnel">
+      <template slot="content">
+        <div style="display: flex;justify-content: space-between">
+          <div>
+            <el-checkbox v-model="param.content.where.unfinish" true-label="0" false-label="1"  @change="listData(null)">{{$t(`包含失败、结案项目`)}}</el-checkbox>
+          </div>
+          <div style="display: flex;justify-content: left">
+            <el-select v-model="param.content.dateType"  class="inline-16" size="small" @change="listData(param.content.dateType)" :popper-append-to-body="false">
+              <el-option :label="$t('全部')" value="99"></el-option>
+              <el-option :label="$t('近一年')" value="1"></el-option>
+              <el-option :label="$t('近九个月')" value="2"></el-option>
+              <el-option :label="$t('近六个月')" value="3"></el-option>
+              <el-option :label="$t('近三个月')" value="4"></el-option>
+            </el-select>
+            <div class="line-style inline-16"></div>
+            <div class="inline-16">
+              <datePicker ref="startRef" type="date" @selectTime="begDateChange" format="yyyy-MM-dd" value_format="yyyy-MM-dd"></datePicker>
+            </div>
+            <div class="title-span-font inline-16">{{$t(`至`)}}</div>
+            <div>
+              <datePicker ref="endRef" type="date" @selectTime="endDateChange" format="yyyy-MM-dd" value_format="yyyy-MM-dd"></datePicker>
+            </div>
+          </div>
+        </div>
+        <div>
+          <funnelBox style="margin-top: 0.625vw;" v-for="(item,index) in list"  :key="item.index" :width="width - (index * 1.042)"  :data="item"></funnelBox>
+        </div>
+      </template>
+    </borderTemplate>
+  </div>
+</template>
+
+<script>
+import borderTemplate from '../components/borderTemplate'
+import funnelBox from "../components/funnelBox";
+import datePicker from "../components/datePicker";
+export default {
+  name: "salesFunnel",
+  components:{borderTemplate,funnelBox,datePicker},
+  data(){
+    return {
+      param:{
+        id:20230630151504,
+        content:{
+          dataid:'',
+          dateType:'99',
+          type:"",
+          where:{
+            isleave:'1',
+            unfinish:'1',
+            begdate:"",
+            enddate:"",
+          }
+        }
+      },
+      list:[],
+      width:'23.958',
+      colorSet:['#40DCF2','#3685FC','#7367F2','#6CD2A1','#ECB937','#EC6D37']
+    }
+  },
+  methods:{
+    async listData(val){
+      const res = await this.$api.requested(this.param)
+      this.list = []
+      this.list = res.data.map((item,index)=>{
+        return{
+          "stagename":item.stagename,
+          "color":this.colorSet[index],
+          "dealamount":item.dealamount,
+          "signamount_due":item.signamount_due,
+          "projectqty":item.projectqty,
+          "sequence1":item.sequence1,
+          "zhl":item.zhl? Math.round((item.zhl * 100)*100)/100 + '%':'--'
+        }
+      })
+      this.list.pop()
+      if (val) {
+        this.dataChange(val)
+      }
+    },
+    dataChange(val){
+      if (val == '1'){
+        let currentDate = new Date(); // 获取当前日期
+        let startDate = new Date(currentDate.getFullYear() - 1, currentDate.getMonth(), currentDate.getDate() + 1); // 计算起始日期
+        let endDate = currentDate; // 结束日期为当前日期
+        // this.dateSelect = [startDate.toISOString().split('T')[0],endDate.toISOString().split('T')[0]]
+        this.$refs.startRef.value = startDate.toISOString().split('T')[0]
+        this.$refs.endRef.value = endDate.toISOString().split('T')[0]
+      }else if (val == '2'){
+        let currentDate = new Date(); // 获取当前日期
+        let startDate = new Date(currentDate.getFullYear(), currentDate.getMonth() - 9, currentDate.getDate() + 1); // 计算起始日期
+        let endDate = currentDate; // 结束日期为当前日期
+        // this.dateSelect = [startDate.toISOString().split('T')[0],endDate.toISOString().split('T')[0]]
+        this.$refs.startRef.value = startDate.toISOString().split('T')[0]
+        this.$refs.endRef.value = endDate.toISOString().split('T')[0]
+      }else if (val == '3'){
+        let currentDate = new Date(); // 获取当前日期
+        let startDate = new Date(currentDate.getFullYear(), currentDate.getMonth() - 6, currentDate.getDate() + 1); // 计算起始日期
+        let endDate = currentDate; // 结束日期为当前日期
+        // this.dateSelect = [startDate.toISOString().split('T')[0],endDate.toISOString().split('T')[0]]
+        this.$refs.startRef.value = startDate.toISOString().split('T')[0]
+        this.$refs.endRef.value = endDate.toISOString().split('T')[0]
+      }else if (val == '4'){
+        let currentDate = new Date(); // 获取当前日期
+        let startDate = new Date(currentDate.getFullYear(), currentDate.getMonth() - 3, currentDate.getDate() + 1); // 计算起始日期
+        let endDate = currentDate; // 结束日期为当前日期
+        // this.dateSelect = [startDate.toISOString().split('T')[0],endDate.toISOString().split('T')[0]]
+        this.$refs.startRef.value = startDate.toISOString().split('T')[0]
+        this.$refs.endRef.value = endDate.toISOString().split('T')[0]
+      }else if (val == '99'){
+        // this.dateSelect = []
+        this.$refs.startRef.value = ''
+        this.$refs.endRef.value = ''
+      }
+    },
+    begDateChange(val){
+      this.param.content.dateType = ''
+      this.param.content.where.begdate = val
+      this.listData()
+    },
+    endDateChange(val){
+      this.param.content.dateType = ''
+      this.param.content.where.enddate = val
+      this.listData()
+    }
+  }
+}
+</script>
+
+<style scoped>
+.line-style{
+  width: 0.000vw;
+  height: 0.625vw;
+  border: 0.052vw solid #CFDCE5;
+  line-height: 0.625vw;
+  vertical-align: middle;
+  margin: auto;
+}
+.title-span-font{
+  font-family: Microsoft YaHei, Microsoft YaHei;
+  font-weight: 400;
+  font-size: 0.625vw;
+  color: #E6F4FF;
+  text-align: left;
+  font-style: normal;
+  text-transform: none;
+  margin: auto;
+}
+/deep/ .el-checkbox__label {
+  display: inline-block;
+  padding-left: 0.521vw;
+  line-height: 0.990vw;
+  font-family: Microsoft YaHei, Microsoft YaHei;
+  font-weight: 400;
+  font-size: 0.729vw;
+  color: #E6F4FF !important;
+  text-align: left;
+  font-style: normal;
+  text-transform: none;
+}
+/deep/ .el-checkbox__input.is-checked+.el-checkbox__label {
+  color: #E6F4FF !important;
+}
+/deep/ .panel .el-checkbox__input.is-checked+.el-checkbox__label{
+  color: #E6F4FF !important;
+}
+
+</style>

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

@@ -0,0 +1,485 @@
+<template>
+  <div>
+    <borderTemplate borderBox="width: 31.250vw;height: 35.417vw;" title="销售面板" detailTitle="查看详情" @dialog="$emit('dialog')" systemappid="277" push_path="/salesData">
+      <template slot="content">
+        <div class="justify-content">
+          <div class="justify-content-left">
+            <div class="box-border">
+              <el-button v-if="typeSelect == '订单'" type="primary" class="btn-select" @click="typeChange('订单')">{{$t(`订单`)}}</el-button>
+              <el-button type="text" v-else class="btn-unSelect" @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>
+            </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>
+            </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>
+            </div>
+          </div>
+          <div>
+            <el-select v-model="param.content.dateType" class="inline-16" 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>
+        <div class="content-style-pie">
+          <div style="width: 7.292vw;height: 7.292vw;margin: 0.781vw 0 0 1.042vw;">
+            <el-progress
+                color="#6395fa"
+                type="circle"
+                :percentage="percentage"
+                :stroke-width="15"
+                :width="progressWidth"
+                :format="format"
+            ></el-progress>
+          </div>
+          <div class="content-style-content">
+            <div class="font1">
+              {{$t(`实际金额(元)`)}}
+            </div>
+            <div>
+              <span class="font2">
+                <span v-if="list.amount > 10000">
+                  {{tool.formatAmount(tool.unitConversion(list.amount, 10000), 2)}}
+                  <span class="font3">{{$t(`万`)}}</span>
+                </span>
+                <span v-else>
+                  {{tool.formatAmount(tool.unitConversion(list.amount, 10000), 2)}}
+                </span>
+              </span>
+            </div>
+            <div>
+              <span class="font4">{{$t(`年同比`)}}:</span>
+              <span class="font5" style="margin-right: 0.417vw">{{ Math.round(list.tbxsje * 100 * 100) / 100 }}%</span>
+              <img style="vertical-align: middle" v-if="list.tbxsje > 0" width="8" height="7" src="../../../assets/icons/up.png" alt="">
+              <img style="vertical-align: middle" v-if="list.tbxsje < 0" width="8" height="7" src="../../../assets/icons/down.png" alt="">
+              <span class="font4" style="margin-left:1.042vw ">{{$t(`年环比`)}}:</span>
+              <span class="font5" style="margin-right: 0.417vw">{{ Math.round(list.hbxsje * 100 * 100) / 100 }}%</span>
+              <img style="vertical-align: middle" v-if="list.hbxsje > 0" width="8" height="7" src="../../../assets/icons/up.png" alt="">
+              <img style="vertical-align: middle" v-if="list.hbxsje < 0" width="8" height="7" src="../../../assets/icons/down.png" alt="">
+            </div>
+            <div class="font1" style="margin-top:1.042vw ">
+              {{$t(`目标金额(元)`)}}
+            </div>
+            <div>
+              <span class="font6">
+                <span v-if="list.target_l > 10000">
+                  {{tool.formatAmount(tool.unitConversion(list.target_l, 10000), 2)}}
+                  <span class="font7">{{$t(`万`)}}</span>
+                </span>
+                <span v-else>
+                  {{tool.formatAmount(tool.unitConversion(list.target_l, 10000), 2)}}
+                </span>
+              </span>
+            </div>
+            <div>
+              <span class="font4">{{$t(`目标达成率`)}}:</span>
+              <span class="font5">{{ Math.round((list.wcamount * 100)* 100) / 100 }}%</span>
+              <span class="font4" style="margin-left:0.842vw">{{$t(`实际与目标差额`)}}:</span>
+              <span class="font5" >
+                <span v-if="list.unamount > 10000">
+                  {{tool.formatAmount(tool.unitConversion(list.unamount, 10000), 2)}}
+                  <span class="font5">{{$t(`万元`)}}</span>
+                </span>
+                <span v-else>
+                  {{tool.formatAmount(tool.unitConversion(list.unamount, 10000), 2)}}
+                   <span class="font5">{{$t(`元`)}}</span>
+                </span>
+              </span>
+            </div>
+          </div>
+        </div>
+        <div style="margin-top: 1.042vw">
+          <div style="display:flex;justify-content: right">
+            <datePicker v-show="typeSelect !== '回款'" ref="pickerRef" type="year" @selectTime="pickerChange" format="yyyy" value_format="yyyy"></datePicker>
+          </div>
+          <DualAxesCharts v-show="typeSelect == '订单'" :param="paramChart" heightChart="14.0vw" ref-charts="orderPanelChart" ref="orderPanelRef"></DualAxesCharts>
+          <DualAxesLineCharts v-show="typeSelect == '出货'" :param="paramShipmentChart" heightChart="14.0vw" ref-charts="shipmentPanelChart" ref="shipmentPanelRef"></DualAxesLineCharts>
+          <DualAxesCharts v-show="typeSelect == '开票'" :param="paramInvoiceChart" heightChart="14.0vw" ref-charts="invoicePanelChart" ref="invoicePanelRef"></DualAxesCharts>
+          <BarCharts v-show="typeSelect == '回款'" :param="paramRefundChart" heightChart="14.0vw" ref-charts="refundPanelChart" ref="refundPanelRef"></BarCharts>
+        </div>
+      </template>
+    </borderTemplate>
+  </div>
+</template>
+
+<script>
+import borderTemplate from '../components/borderTemplate'
+import {DualAxes} from "@antv/g2plot";
+import datePicker from "../components/datePicker";
+import DualAxesCharts from "@/HManagement/serviceDataScreen/components/DualAxesCharts";
+import DualAxesLineCharts from "@/HManagement/serviceDataScreen/components/DualAxesLineCharts";
+import BarCharts from "@/HManagement/serviceDataScreen/components/BarCharts";
+export default {
+  name: "salesPanel",
+  components:{borderTemplate,datePicker,DualAxesCharts,DualAxesLineCharts,BarCharts},
+  data(){
+    return {
+      typeSelect:'订单',
+      chartCustomerLine:null,
+      param:{
+        id:20231009125304,
+        content:{
+          dataid:'',
+          datatype:'1',
+          dateType:'本年',
+          type:'',
+          where:{
+            isleave:''
+          }
+        }
+      },
+      list:'',
+      windowWidth: document.documentElement.clientWidth, //实时屏幕宽度
+      progressWidth: (9.65 * document.documentElement.clientWidth) / 100,
+      percentage:0,
+      paramChart:{
+        "id": 20231012094804,
+        "content": {
+          "type": '',
+          "dataid": '',
+          "year": 2024,
+          "where": {
+            "isleave": "1"
+          }
+        }
+      },
+      paramShipmentChart:{
+        "id": 20231012152004,
+        "content": {
+          "type": 0,
+          "dataid": '',
+          "year": "2023",
+          "where":{
+            "isleave":"1"
+          }
+        }
+      },
+      paramInvoiceChart:{
+        "id": 20231016095304,
+        "content": {
+          "type": 0,
+          "dataid": 54,
+          "year": "2023",
+          "where":{
+            "isleave":"1"
+          }
+        }
+      },
+      paramRefundChart:{
+        "id": 20231016211904,
+        "content": {
+          "type": 0,
+          "dataid": 54,
+          "where":{
+            "isleave":"1"
+          }
+        }
+      },
+      saledateRows:[],
+      tbzzl:[],
+    }
+  },
+  methods:{
+    async listData(init,time){
+      const res = await this.$api.requested(this.param)
+      this.list = res.data
+      this.percentage = Math.round(this.list.wcamount * 100 * 100) / 100;
+      if (init){
+        this.$refs.orderPanelRef.chartData(true)
+        this.$refs.shipmentPanelRef.chartData(true)
+        this.$refs.invoicePanelRef.chartData(true)
+        this.$refs.refundPanelRef.chartData(true)
+      }else {
+        this.$refs.orderPanelRef.chartData(false)
+        this.$refs.shipmentPanelRef.chartData(false)
+        this.$refs.invoicePanelRef.chartData(false)
+        this.$refs.refundPanelRef.chartData(false)
+      }
+    },
+    dateTypeChange(){
+      this.listData(false,false)
+    },
+    pickerChange(val){
+      this.paramChart.content.year = val
+      this.paramInvoiceChart.content.year = val
+      this.paramShipmentChart.content.year = val
+      this.listData(false,true)
+    },
+    typeChange(val){
+      if (val == '订单'){
+        this.typeSelect = '订单'
+        this.param.content.datatype = 1
+      }else if (val == '出货'){
+        this.typeSelect = '出货'
+        this.param.content.datatype = 2
+      }else if (val == '开票'){
+        this.typeSelect = '开票'
+        this.param.content.datatype = 3
+      }else if (val == '回款'){
+        this.typeSelect = '回款'
+        this.param.content.datatype = 4
+      }
+      this.listData()
+    },
+    format(percentage) {
+      return this.$t("目标达成率") + '\n\n' + percentage + "%";
+    },
+    /*渲染图表*/
+    async queryModel(){
+      const res = await this.$api.requested(this.paramChart)
+      this.saledateRows = res.data.saledateRows
+      let lastYear = []
+      let nowYear = []
+      let k=0
+      for (var i=0;i<res.data.saledateRows.length;i++){
+        if (res.data.saledateRows[i].name === '去年同期金额'){
+          lastYear[k]=res.data.saledateRows[i]
+          k++
+        }
+      }
+      let x=0
+      for (var i=0;i<res.data.saledateRows.length;i++){
+        if (res.data.saledateRows[i].name === '本年金额'){
+          nowYear[x]=res.data.saledateRows[i]
+          x++
+        }
+      }
+      let saledateRows = nowYear.concat(lastYear)
+      this.saledateRows = saledateRows.map((item)=>{
+        let value = item.value/10000
+        return {
+          "date":item.date,
+          "name":item.name + '(万元)',
+          "value":value
+          /*"value":item.value*/
+        }
+      })
+      this.tbzzl = res.data.tbzzlRows.map((item)=>{
+        return {
+          "date":item.date,
+          "name":item.name,
+          "value":Math.round(((item.value *100)*100)/100)
+        }
+      })
+      this.chartCustomerLine.changeData([this.saledateRows,this.tbzzl])
+    },
+    renderPie(){
+      this.chartCustomerLine = new DualAxes('salesPanelChart', {
+        data: [this.saledateRows,this.tbzzl],
+        xField: 'date',
+        yField: ['value','value'],
+        xAxis:{
+          label:{
+            style:{
+              fill:'#CFDCE5'
+            }
+          }
+        },
+        yAxis:{
+          value:{
+            label:{
+              style:{
+                fill:'#CFDCE5'
+              }
+            }
+          }
+        },
+        geometryOptions: [
+          {
+            geometry: 'column',
+            isGroup: true,
+            seriesField: 'name',
+            color:['#3685FC','#6CD2A1'],
+            // label:{
+            //   position:top,
+            //   formatter: (datum) =>{
+            //     return '¥' + this.tool.formatAmount(datum.value,2)
+            //   }
+            // }
+          },
+          {
+            geometry: 'line',
+            seriesField: 'name',
+            color: '#ECB937',
+            smooth: true,
+            // label:{
+            //   formatter: (datum) =>{
+            //     return  datum.value + '%'
+            //   }
+            // }
+          },
+        ],
+        tooltip: {
+          formatter: (datum) => {
+            return {
+              name:datum.name,
+              value:datum.name != '同比增长率'?'¥'+this.tool.formatAmount(datum.value,2):datum.value + '%'
+            }
+          },
+        },
+        legend:{
+          itemName:{
+            style:{
+              fill:'#CFDCE5'
+            }
+          },
+        }
+      });
+      this.chartCustomerLine.render();
+      this.queryModel()
+    },
+  },
+}
+</script>
+<style>
+.justify-content{
+  display: flex;
+  justify-content: space-between;
+  margin-top: 1.042vw;
+}
+.justify-content-left{
+  display: flex;
+  justify-content: left;
+}
+.justify-content-left .box-border{
+  width: 3.125vw;
+  height: 1.563vw;
+  border-radius: 0.104vw 0.104vw 0.104vw 0.104vw;
+  margin-right: 0.521vw;
+  text-align: center;
+}
+.justify-content-left .box-border .btn-select{
+  font-family: Microsoft YaHei, Microsoft YaHei;
+  font-weight: 400;
+  font-size: 0.833vw;
+  color: #E6F4FF;
+  font-style: normal;
+  text-transform: none;
+}
+.justify-content-left .box-border .btn-unSelect{
+  font-family: Microsoft YaHei, Microsoft YaHei;
+  font-weight: 400;
+  font-size: 0.729vw;
+  color: #CFDCE5;
+  font-style: normal;
+  text-transform: none;
+  text-align: center;
+}
+.content-style-pie{
+  width: 29.167vw;
+  height: 11.458vw;
+  background: #001E41;
+  box-shadow: 0.000vw 0.156vw 0.313vw 0.052vw rgba(0,0,0,0.16);
+  border-radius: 5.729vw 5.729vw 0.313vw 5.729vw;
+  border: 0.052vw solid #CFDCE5;
+  margin-top: 1.042vw;
+  box-sizing: border-box;
+  display: flex;
+  justify-content: left;
+}
+.content-style-content{
+  margin-top: 0.717vw;
+  margin-left: 4.250vw;
+}
+.content-style-content .font1{
+  font-family: Microsoft YaHei, Microsoft YaHei;
+  font-weight: 400;
+  font-size: 0.938vw;
+  color: #CFDCE5;
+  text-align: left;
+  font-style: normal;
+  text-transform: none;
+}
+.content-style-content .font2{
+  font-family: Microsoft YaHei, Microsoft YaHei;
+  font-weight: bold;
+  font-size: 1.250vw;
+  color: #6CD2A1;
+  text-align: left;
+  font-style: normal;
+  text-transform: none;
+}
+.content-style-content .font3{
+  font-family: Microsoft YaHei, Microsoft YaHei;
+  font-weight: bold;
+  font-size: 0.625vw;
+  color: #6CD2A1;
+  text-align: left;
+  font-style: normal;
+  text-transform: none;
+}
+.content-style-content .font4{
+  font-family: Microsoft YaHei, Microsoft YaHei;
+  font-weight: 400;
+  font-size: 0.625vw;
+  color: #CFDCE5;
+  text-align: left;
+  font-style: normal;
+  text-transform: none;
+}
+.content-style-content .font5{
+  font-family: Microsoft YaHei, Microsoft YaHei;
+  font-weight: 400;
+  font-size: 0.625vw;
+  color: #E6F4FF;
+  text-align: left;
+  font-style: normal;
+  text-transform: none;
+}
+.content-style-content .font6{
+  font-family: Microsoft YaHei, Microsoft YaHei;
+  font-weight: bold;
+  font-size: 1.250vw;
+  color: #FFFFFF;
+  text-align: left;
+  font-style: normal;
+  text-transform: none;
+}
+.content-style-content .font7{
+  font-family: Microsoft YaHei, Microsoft YaHei;
+  font-weight: bold;
+  font-size: 0.625vw;
+  color: #FFFFFF;
+  text-align: left;
+  font-style: normal;
+  text-transform: none;
+}
+</style>
+<style  scoped>
+/deep/ .el-progress__text {
+  position: absolute;
+  top: 50%; /* 设置垂直居中 */
+  left: 50%;
+  transform: translateX(-50%) translateY(-50%); /* 移动到圆环中心 */
+  font-family: Microsoft YaHei, Microsoft YaHei;
+  font-weight: bold;
+  font-size: 0.833vw !important;
+  color: #E6F4FF !important;
+  font-style: normal;
+  text-transform: none;
+}
+  /deep/ .el-button--primary:focus, .el-button--primary:hover {
+    background: #6090f8;
+    border-color: #6090f8;
+    color: #6090f8;
+  }
+  /deep/ .element.style {
+    font-size: 0.830vw;
+  }
+::v-deep .el-progress__text {
+  white-space: pre;
+}
+/deep/ .el-button {
+  line-height: 0.5;
+  padding: 0.521vw 0.521vw;
+}
+</style>

+ 92 - 0
src/HManagement/serviceDataScreen/modules/salesmanAccount.vue

@@ -0,0 +1,92 @@
+<template>
+  <div>
+    <borderTemplate borderBox="width: 15.104vw;height: 12.500vw;" title="业务员账户" detailTitle="金额明细" @dialog="detailClick" systemappid="280" push_path="/salerAccount">
+      <template slot="content">
+        <div class="money-style">{{tool.formatAmount(balance,2)}}</div>
+        <div class="title-style">{{$t(`提成账户(元)`)}}</div>
+        <div class="div-line"></div>
+        <div>
+          <div class="title-style" style="float: left">{{$t(`预计提成(元)`)}}</div>
+          <div class="money2-style" style="float: right">{{tool.formatAmount(expectedreward,2)}}</div>
+        </div>
+      </template>
+    </borderTemplate>
+  </div>
+</template>
+
+<script>
+import borderTemplate from '../components/borderTemplate'
+export default {
+  name: "salesmanAccount",
+  components:{borderTemplate},
+  data() {
+    return {
+      param:{
+        "id": 20241009091704,
+        "content": {
+          "type": '',
+          "dataid": '',
+          "where": {
+            "isleave": ""
+          }
+        }
+      },
+      balance:'',
+      expectedreward:'',
+    }
+  },
+  methods:{
+    async listData(){
+      const res = await this.$api.requested(this.param)
+      this.balance = res.data.balance
+      this.expectedreward = res.data.expectedreward
+    },
+    detailClick(){
+      this.$emit('dialog')
+    },
+    onClose(){
+      this.drawerShow = false
+    },
+  },
+}
+</script>
+
+<style scoped>
+.money-style{
+  font-family: Microsoft YaHei, Microsoft YaHei;
+  font-weight: bold;
+  font-size: 2.083vw;
+  color: #40DCF2;
+  text-align: left;
+  font-style: normal;
+  text-transform: none;
+  margin-top: 0.542vw;
+}
+.title-style {
+  font-family: Microsoft YaHei, Microsoft YaHei;
+  font-weight: 400;
+  font-size: 0.938vw;
+  color: #CFDCE5;
+  text-align: left;
+  font-style: normal;
+  text-transform: none;
+}
+.div-line{
+  width: 12.917vw;
+  height: 0.000vw;
+  border: 0.052vw solid #CFDCE5;
+  margin: 1.042vw 0 1.042vw 0;
+}
+.money2-style{
+  font-family: Microsoft YaHei, Microsoft YaHei;
+  font-weight: bold;
+  font-size: 1.042vw;
+  color: #6CD2A1;
+  text-align: left;
+  font-style: normal;
+  text-transform: none;
+}
+/deep/ .el-drawer__wrapper {
+  right: 0 !important;
+}
+</style>

+ 9 - 0
src/assets/icons/Tips.svg

@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
+  <g id="组_78" data-name="组 78" transform="translate(-1435 -625)">
+    <g id="椭圆_8" data-name="椭圆 8" transform="translate(1435 625)" fill="none" stroke="#e6f4ff" stroke-width="1">
+      <circle cx="6" cy="6" r="6" stroke="none"/>
+      <circle cx="6" cy="6" r="5.5" fill="none"/>
+    </g>
+    <text id="_" data-name="?" transform="translate(1439 634)" fill="#e6f4ff" font-size="8" font-family="MicrosoftYaHei-Bold, Microsoft YaHei" font-weight="700"><tspan x="0" y="0">?</tspan></text>
+  </g>
+</svg>

BIN
src/assets/icons/down.png


+ 3 - 0
src/assets/icons/home.svg

@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16.053" viewBox="0 0 16 16.053">
+  <path id="首页" d="M115.526,104.261l6.175,4.432a2.316,2.316,0,0,1,.965,1.881v7.147a2.316,2.316,0,0,1-2.316,2.316h-3.158V116.67a2.526,2.526,0,0,0-5.053,0v3.368h-3.158a2.316,2.316,0,0,1-2.316-2.316v-7.147a2.316,2.316,0,0,1,.965-1.881l6.175-4.432a1.474,1.474,0,0,1,1.719,0Z" transform="translate(-106.667 -103.985)" fill="#e6f4ff"/>
+</svg>

+ 6 - 0
src/assets/icons/toNext.svg

@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="7.071" height="11.314" viewBox="0 0 7.071 11.314">
+  <g id="组_25" data-name="组 25" transform="translate(-576.586 -189.343)">
+    <rect id="矩形_18" data-name="矩形 18" width="8" height="2" rx="1" transform="translate(576.586 199.243) rotate(-45)" fill="#cfdce5"/>
+    <rect id="矩形_19" data-name="矩形 19" width="8" height="2" rx="1" transform="translate(578 189.343) rotate(45)" fill="#cfdce5"/>
+  </g>
+</svg>

BIN
src/assets/icons/up.png


+ 7 - 5
src/components/newLayout/index.vue

@@ -142,11 +142,13 @@ export default {
     },
   },
   mounted() {
-    if (
-      JSON.parse(sessionStorage.getItem("active_password")) == "1" &&
-      JSON.parse(sessionStorage.getItem("password")) != "1"
-    ) {
-      this.dialogVisible = true;
+
+    if (JSON.parse(sessionStorage.getItem('active_password')) == '1' && JSON.parse(sessionStorage.getItem('password')) != '1'){
+      if (JSON.parse(sessionStorage.getItem('active_account')).usertype == 0 && JSON.parse(sessionStorage.getItem('active_account')).usertype == 1 && (JSON.parse(sessionStorage.getItem('active_account')).siteid == 'HY' || JSON.parse(sessionStorage.getItem('active_account')).siteid == 'YOSTEST1')){
+        this.dialogVisible = false
+      }else {
+        this.dialogVisible = true
+      }
     }
     /*this.debouned()*/
     /* console.log('长度')

+ 3 - 3
src/components/newLayout/modules/header.vue

@@ -39,7 +39,7 @@
       </el-dropdown-menu>
     </el-dropdown>-->
       <!--    <el-divider direction="vertical"></el-divider>-->
-      <!--      <el-button size="mint" type="primary"  style="background-color:rgb(52 106 145);margin-right: 20px;color: #FFFFFF" v-if="usertype == 1 || usertype == 0" @click="$router.push('/serviceDataScreen')">{{$t(`业务数据大屏`)}}</el-button>-->
+      <el-button size="mint" type="primary"  style="background-color:rgb(52 106 145);margin-right: 20px;color: #FFFFFF" v-if="(usertype == 1 || usertype == 0) && (siteid == 'HY' || siteid == 'YOSTEST1')" @click="$router.push('/serviceDataScreen')">{{$t(`业务数据大屏`)}}</el-button>
       <svg
         t="1725853431060"
         class="icon"
@@ -144,6 +144,7 @@ export default {
       nowType: "ZH",
       languagename: "",
       usertype: JSON.parse(sessionStorage.getItem("active_account")).usertype,
+      siteid: JSON.parse(sessionStorage.getItem('active_account')).siteid
     };
   },
   props: ["onRender"],
@@ -192,7 +193,6 @@ export default {
       sessionStorage.setItem("active_account", JSON.stringify(item));
       await this.basicData.query_userauth(() => {
         setTimeout(() => {
-          console.log("33333");
           this.$router.go(0);
         }, 1000);
       });
@@ -352,7 +352,7 @@ export default {
     } catch (error) {
       this.languagename = "简体中文";
     }
-    
+
     this.accountInfo = JSON.parse(sessionStorage.getItem("active_account"));
     this.accountList = JSON.parse(
       sessionStorage.getItem("account_list")

+ 12 - 12
src/views/clueData/modules/digitalSigns.vue

@@ -94,9 +94,9 @@
         </div>
         <div class="item div-click" @click="onClick('线索成交数')">
           <p class="title">{{ list.dealqty }}</p>
-          <span class="content-font-new">线索成交数</span>
+          <span class="content-font-new">{{$t(`线索成交数`)}}</span>
           <el-tooltip placement="top">
-            <div slot="content">线索成交数:转化后有下订单的线索数量</div>
+            <div slot="content">{{$t(`线索成交数:转化后有下订单的线索数量`)}}</div>
             <img style="vertical-align: middle" width="14px" height="14px" src="../../../assets/icons/prompt_icon.svg" >
           </el-tooltip>
         </div>
@@ -110,41 +110,41 @@
         </div>
         <div class="item div-click" @click="onClick('参与线索数')">
           <p class="title">{{ list.joinordercluesize }}</p>
-          <span class="content-font-new">参与线索数</span>
+          <span class="content-font-new">{{$t(`参与线索数`)}}</span>
           <el-tooltip placement="top">
-            <div slot="content">参与线索数:参与的并且至少有一次跟进的线索数量</div>
+            <div slot="content">{{$t(`参与线索数:参与的并且至少有一次跟进的线索数量`)}}</div>
             <img style="vertical-align: middle" width="14px" height="14px" src="../../../assets/icons/prompt_icon.svg" >
           </el-tooltip>
         </div>
         <div class="item div-click" @click="onClick('参与线索转化数')">
           <p class="title">{{ list.joincoverorderclue }}</p>
-          <span class="content-font-new">参与线索转化数</span>
+          <span class="content-font-new">{{$t(`参与线索转化数`)}}</span>
           <el-tooltip placement="top">
-            <div slot="content">参与线索转化数:参与的并且至少有一次跟进的有发生转化的线索数量</div>
+            <div slot="content">{{$t(`参与线索转化数:参与的并且至少有一次跟进的有发生转化的线索数量`)}}</div>
             <img style="vertical-align: middle" width="14px" height="14px" src="../../../assets/icons/prompt_icon.svg" >
           </el-tooltip>
         </div>
         <div class="item">
           <p class="title">{{ Math.round(((list.joinordercluezhl*100)*100)/100) }}%</p>
-          <span class="content-font-new">参与线索转化率</span>
+          <span class="content-font-new">{{$t(`参与线索转化率`)}}</span>
           <el-tooltip placement="top">
-            <div slot="content">参与线索转化率=参与线索转化数 ÷ 参与线索数 ×100%</div>
+            <div slot="content">{{$t(`参与线索转化率=参与线索转化数 ÷ 参与线索数 ×100%`)}}</div>
             <img style="vertical-align: middle" width="14px" height="14px" src="../../../assets/icons/prompt_icon.svg" >
           </el-tooltip>
         </div>
         <div class="item div-click" @click="onClick('参与线索成交数')">
           <p class="title">{{ list.joindealorderclue }}</p>
-          <span class="content-font-new">参与线索成交数</span>
+          <span class="content-font-new">{{$t(`参与线索成交数`)}}</span>
           <el-tooltip placement="top">
-            <div slot="content">参与线索成交数:参与的并且至少有一次跟进的转化后有下订单的线索数量</div>
+            <div slot="content">{{$t(`参与线索成交数:参与的并且至少有一次跟进的转化后有下订单的线索数量`)}}</div>
             <img style="vertical-align: middle" width="14px" height="14px" src="../../../assets/icons/prompt_icon.svg" >
           </el-tooltip>
         </div>
         <div class="item">
           <p class="title">{{ Math.round(((list.joinordercluecjl*100)*100)/100) }}%</p>
-          <span class="content-font-new">参与线索成交率</span>
+          <span class="content-font-new">{{$t(`参与线索成交率`)}}</span>
           <el-tooltip placement="top">
-            <div slot="content">参与线索成交率=参与线索成交率 ÷ 参与线索数 ×100%</div>
+            <div slot="content">{{$t(`参与线索成交率=参与线索成交率 ÷ 参与线索数 ×100%`)}}</div>
             <img style="vertical-align: middle" width="14px" height="14px" src="../../../assets/icons/prompt_icon.svg" >
           </el-tooltip>
         </div>

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

@@ -322,13 +322,13 @@ export default {
           sessionStorage.setItem("active_password", res.remindchangepassword);
           this.basicData.query_userauth().then(() => {
             this.basicData.querySite_Parameter();
-            // let usertype = JSON.parse(sessionStorage.getItem('active_account')).usertype
-            // if (usertype == 1 || usertype == 0){
-            //   this.$router.push('/serviceDataScreen')
-            // }else {
-            //   this.$router.push({ path: "/main" });
-            // }
-            this.$router.push({ path: "/main" });
+            let usertype = JSON.parse(sessionStorage.getItem('active_account')).usertype
+            let siteid = JSON.parse(sessionStorage.getItem('active_account')).siteid
+            if ((usertype == 1 || usertype == 0) && (siteid == 'HY' || siteid == 'YOSTEST1') ){
+              this.$router.push('/serviceDataScreen')
+            }else {
+              this.$router.push({ path: "/main" });
+            }
             this.getAccountInfo();
           });
         } else {