Browse Source

有效项目未跟进天数分析

xiaohaizhao 6 months ago
parent
commit
7a59ded172

+ 243 - 0
salesPanel/dataOverview/Project/YXXMWGJTSFX.js

@@ -0,0 +1,243 @@
+const _Http = getApp().globalData.http,
+  currency = require("../../../utils/currency"),
+  CNY = (value, symbol = "¥", precision = 2) => currency(value, {
+    symbol,
+    precision
+  }).format();
+import * as echarts from '../../ec-canvas/echarts';
+Component({
+  options: {
+    addGlobalClass: true
+  },
+  lifetimes: {
+    attached: function () {
+      getApp().globalData.Language.getLanguagePackage(this)
+      this.setData({
+        "content.dataid": wx.getStorageSync('userMsg').userid,
+        "content.username": wx.getStorageSync('userMsg').name,
+      })
+    }
+  },
+  data: {
+    year: new Date().getFullYear().toString(),
+    "content": {
+      enddate: new Date().toISOString().split('T')[0],
+      where: {
+        dateType: "15-30天",
+        projecttype: ""
+      },
+      pageNumber: 1,
+      pageSize: 20,
+      pageTotal: 1
+    },
+    types: [],
+    filterShow: false,
+    filtratelist: [{
+      label: "项目状态",
+      index: null,
+      showName: "value", //显示字段
+      valueKey: "status", //返回Key
+      selectKey: "value", //传参 代表选着字段 不传参返回整个选择对象
+      value: "", //选中值
+      type: "checkbox",
+      list: [{
+        value: "跟进中"
+      }, {
+        value: "已成交"
+      }, {
+        value: "已失败"
+      }, {
+        value: "已结案"
+      }]
+    }]
+  },
+  methods: {
+    async getList(init = false) {
+      if (init.detail != undefined) init = init.detail;
+      let content = this.data.content
+      const {
+        dataid,
+        type,
+        username,
+        isleave
+      } = getCurrentPages()[getCurrentPages().length - 1].data;
+      if (content.dataid != dataid || content.type != type || isleave != isleave) init = true
+      content.dataid = dataid;
+      content.type = type;
+      content.username = username;
+      content.where.isleave = isleave;
+      if (init) {
+        content.pageNumber = 1;
+        content.pageSize = 20;
+      }
+      if (content.pageNumber > content.pageTotal) return;
+      _Http.basic({
+        "id": 20231019095904,
+        content
+      }).then(res => {
+        console.log("有效项目未跟进天数分析", res)
+        this.selectComponent('#ListBox').RefreshToComplete();
+        if (res.code != '1') return wx.showToast({
+          title: res.data,
+          icon: "none"
+        })
+        res.data = res.data.map(v => {
+          v.signamount_due = CNY(v.signamount_due)
+          return v
+        })
+        this.setData({
+          list: res.pageNumber == 1 ? res.data : this.data.list.concat(res.data),
+          "content.pageNumber": res.pageNumber + 1,
+          "content.pageSize": res.pageSize,
+          "content.pageTotal": res.pageTotal,
+          "total": res.total,
+        })
+        try {
+          this.selectAllComponents("#Filtrate").forEach(v => v.onCancel())
+        } catch (error) {}
+        if (init) _Http.basic({
+          "id": 20231019095804,
+          content
+        }).then(res1 => {
+          console.log("图标", res1)
+          this.initChart(res1.data)
+        })
+      })
+    },
+    initChart(data) {
+      let projecttype = [...new Set(data.map(v => getApp().globalData.Language.getMapText(v.projecttype)))]
+      let source = [
+        ['product'].concat(projecttype),
+      ];
+      data.forEach(v => {
+        if (!source.find(item => item[0] === getApp().globalData.Language.getMapText(v.datetype))) {
+          source.push([getApp().globalData.Language.getMapText(v.datetype)])
+        }
+        let index = source.findIndex(item => item[0] === getApp().globalData.Language.getMapText(v.datetype));
+        source[index].push(v.value);
+      })
+      if (this.data.types.length == 0) {
+        let types = projecttype.map(v => {
+          return {
+            remarks: v,
+            value: v.split("-")[0],
+          }
+        })
+        types.unshift({
+          remarks: '全部',
+          value: ''
+        })
+        console.log("types", types)
+        this.setData({
+          types
+        })
+      }
+      let that = this,
+        countDown = null,
+        datetypes = [...new Set(data.map(v => v.datetype))];
+
+      function changeDateType(params) {
+        clearTimeout(countDown)
+        countDown = setTimeout(() => {
+          if (datetypes[params.dataIndex] === that.data.content.where.dateType) return;
+          that.setData({
+            "content.where.dateType": datetypes[params.dataIndex],
+            "content.pageNumber": 1,
+          })
+          that.getList();
+        }, 200)
+      }
+      let option = {
+        legend: {
+          type: 'scroll',
+          orient: 'horizontal',
+          top: 10
+        },
+        tooltip: {
+          trigger: 'axis',
+          axisPointer: {
+            type: 'shadow'
+          },
+          formatter: function (params) {
+            changeDateType(params[0]);
+            let filteredParams = params.filter(item => item.value !== 0);
+            if (filteredParams.length === 0) return '';
+            let tooltipText = `${params[0].axisValue}\n`;
+            filteredParams.forEach((item, index) => {
+              if (item.value[index + 1] != 0) {
+                tooltipText += `${item.marker} ${item.dimensionNames[index + 1]}: ${item.value[index + 1]}\n`;
+              }
+            });
+            return tooltipText;
+          }
+        },
+        dataset: {
+          source
+        },
+        xAxis: {
+          type: 'category',
+          axisLabel: {
+            interval: 0,
+            rotate: 30
+          }
+        },
+        yAxis: {
+          type: 'value'
+        },
+        series: projecttype.map(() => ({
+          type: 'bar',
+          barMaxWidth: 30
+        }))
+      };
+      this.chartComponent = this.selectComponent('#mychart');
+      this.chartComponent.init((canvas, width, height, dpr) => {
+        const chart = echarts.init(canvas, null, {
+          width,
+          height,
+          devicePixelRatio: dpr
+        });
+        chart.setOption(option);
+        return chart;
+      });
+    },
+    changeDate({
+      detail
+    }) {
+      this.setData({
+        "content.enddate": detail
+      })
+      this.getList(true)
+    },
+    clickOpen() {
+      this.setData({
+        filterShow: true
+      })
+    },
+    /* 处理筛选 */
+    handleFilter({
+      detail
+    }) {
+      if (detail.name == "confirm") {
+        this.setData({
+          "content.where.status": detail.status
+        })
+        this.selectComponent('#Filtrate1').setShowArrText(detail.status)
+        this.getList(true)
+      } else if (detail.name == 'reset') {
+        this.setData({
+          "content.where.status": []
+        })
+        this.selectComponent('#Filtrate1').setShowArrText([])
+        this.getList(true)
+      }
+    },
+    changeType2({
+      detail
+    }) {
+      this.setData({
+        "content.where.projecttype": detail,
+      })
+      this.getList(true)
+    },
+  }
+})

+ 6 - 0
salesPanel/dataOverview/Project/YXXMWGJTSFX.json

@@ -0,0 +1,6 @@
+{
+  "component": true,
+  "usingComponents": {
+    "ec-canvas": "../../ec-canvas/ec-canvas"
+  }
+}

+ 6 - 0
salesPanel/dataOverview/Project/YXXMWGJTSFX.scss

@@ -0,0 +1,6 @@
+@import "../Clue/NewAnalysisAdded.scss";
+@import "../OverviewAndDetails/Clue.scss";
+
+.chart {
+    width: 100%;
+}

+ 42 - 0
salesPanel/dataOverview/Project/YXXMWGJTSFX.wxml

@@ -0,0 +1,42 @@
+<viewDate title='分析日期' bind:onChange='changeDate' />
+    <filtrate id='Filtrate' wx:if='{{types.length}}' list='{{types}}' type="{{content.where.projecttype}}" title='订单类型'
+        bind:onChange='changeType2' />
+<filtrate id='Filtrate1' iconName='icon-xiangmuzhuangtai' list='{{[]}}' title='项目状态' bind:clickOpen='clickOpen' />
+<Yl_ListBox id='ListBox' bind:getlist='getList'>
+    <view class="global-card">
+        <view class="chart">
+            <ec-canvas id="mychart" canvas-id="chart" ec="{{ ec }}"></ec-canvas>
+        </view>
+    </view>
+    <navigator url="/packageA/project/detail?id={{item.sa_projectid}}" class="global-card item" wx:for="{{list}}"
+        wx:key="sa_projectid">
+        <view class="title">
+            <text class="line-1">{{item.projectname || " --"}}</text>
+            <view class="status" style="background-color: {{sColors[item.status]}};">
+                {{language[item.status]||item.status}}</view>
+        </view>
+        <view class="tag-box">
+            <van-tag custom-class='tag' wx:for="{{item.sys_tag}}" wx:key="index" wx:for-item='tag' color='#3874f6'
+                text-color='#fff' round>{{language[tag]||tag}}</van-tag>
+        </view>
+        <view class="row">
+            <view class="col">{{language['负责人']||'负责人'}}:{{item.leader.length?item.leader[0].name :' --'}}</view>
+            <view class="col">{{language['部门']||'部门'}}:{{item.leader.length?item.leader[0].depname :' --'}}</view>
+        </view>
+        <view class="row">
+            <view class="col">{{language['项目阶段']||'项目阶段'}}:{{language[item.stagename] || item.stagename ||' --'}}</view>
+            <view class="col">{{language['报备进度']||'报备进度'}}:<text style="color: {{sColors[item.status]}};">{{language[item.reportstatus] || item.reportstatus ||'--'}}</text></view>
+        </view>
+        <view class="row">{{language['预计签约金额']||'预计签约金额'}}:{{item.signamount_due ||' --'}}</view>
+        <view class="row">{{language['项目成交金额']||'项目成交金额'}}:{{item.dealamount ||' --'}}</view>
+        <view class="row">{{language['项目地址']||'项目地址'}}:{{item.province + item.city +item.county +item.address}}</view>
+        <view class="row">{{language['项目编号']||'项目编号'}}:{{item.projectnum ||' --' }}</view>
+        <view class="row">{{language['项目规模']||'项目规模'}}:{{item.scale + (language[item.unitname] || item.unitname||'')}}
+        </view>
+        <view class="row">{{language['领域']||'领域'}}:{{language[item.tradefield] || item.tradefield||' --'}}</view>
+        <view class="row">{{language['创建时间']||'创建时间'}}:{{item.createdate ||' --'}}</view>
+    </navigator>
+    <My_empty wx:if="{{list.length==0}}" />
+    <view style="height: 100rpx;" />
+</Yl_ListBox>
+<Yl_Filtrate1 show='{{filterShow}}' list="{{filtratelist}}" bindhandle="handleFilter" />

+ 3 - 0
salesPanel/dataOverview/list/Project.js

@@ -49,6 +49,9 @@ Component({
         }, {
             label: "项目评估情况统计",
             model: "#ProjecEvaluation"
+        }, {
+            label: "有效项目未跟进天数分析",
+            model: "#YXXMWGJTSFX"
         }],
     },
     methods: {

+ 2 - 1
salesPanel/dataOverview/list/Project.json

@@ -6,6 +6,7 @@
         "ReportAnalysis": "../Project/ReportAnalysis",
         "NewAnalysisAdded": "../Clue/NewAnalysisAdded",
         "followUpAnalysis": "../Clue/followUpAnalysis",
-        "SituationAnalysis": "../Project/situationAnalysis"
+        "SituationAnalysis": "../Project/situationAnalysis",
+        "YXXMWGJTSFX": "../Project/YXXMWGJTSFX"
     }
 }

+ 3 - 1
salesPanel/dataOverview/list/Project.wxml

@@ -1,4 +1,5 @@
-<Yl_FunTabs id='Yl_FunTabs' safety='{{false}}' list='{{tabsList}}' mode='buts' active='{{tabsActive}}' bind:onChenge="tabsChange">
+<Yl_FunTabs id='Yl_FunTabs' safety='{{false}}' list='{{tabsList}}' mode='buts' active='{{tabsActive}}'
+    bind:onChenge="tabsChange">
     <DataOverview slot='数据概况' id='DataOverview' />
     <ProjectQuotationQuantity slot='近12月项目报价分析' id='ProjectQuotationQuantity' />
     <followUpAnalysis slot='近12月项目跟进分析' idname='20231018163004' id='followUpAnalysis' />
@@ -10,4 +11,5 @@
     <SituationAnalysis slot='项目联系人情况统计' idname='20231019085404' id='ProjectContact' />
     <SituationAnalysis slot='项目关联客户情况统计' idname='20231019085504' id='RelatedCustomer' />
     <SituationAnalysis slot='项目评估情况统计' idname='20231019085604' id='ProjecEvaluation' />
+    <YXXMWGJTSFX slot='有效项目未跟进天数分析' id='YXXMWGJTSFX' />
 </Yl_FunTabs>