基于RuoYi实现多条件分组排序列表

简介: 基于RuoYi实现多条件分组排序列表


基于RuoYi实现多条件分组排序列表

页面效果

image.png

image.png

可通过复选框不同条件实现不同列数据加载


页面代码

telemarketingdata.html

<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
<head>
  <th:block th:include="include :: header('数据报告')" />
  <th:block th:include="include :: ztree-css" />
  <th:block th:include="include :: select2-css" />
  <th:block th:include="include :: bootstrap-select-css"/>
  <style>
    .center{text-align: center;}
  </style>
</head>
<body class="gray-bg">
     <div class="wrapper animated fadeInRight">
    <!-- 搜索条件-->
    <div class="row">
      <div class="col-sm-12 search-collapse">
        <form id="formId">
          <div class="select-list">
            <ul>
              <li>
                部门:<input type="text" name="createUserName" id="createUserName" readonly="readonly" onclick="ztreeShow();"/>
                <input type="text"  name="createByIds" id="createByIds" style="display: none" onclick="ztreeShow();"/>
              </li>
              <li style="height: 30px;">
                <div style="float: left; padding-top: 8px;">
                  线索类型:
                </div>
                <div style="float: left;">
                  <select name="actionClueType" id="actionClueType" class="form-control">
                    <option value="">请选择</option>
                    <option th:each="regular:${regulars}"
                        th:value="${regular.id}" th:text="${regular.clueTypeName}"></option>
                  </select>
                </div>
              </li>
              <li>
                <label>查询时间:</label>
                <input type="text" readonly="readonly" placeholder="时间范围" name="recordDate" id="recordDate"/>
                <input type="hidden" name="startTime" id="startTime"/>
                <input type="hidden" name="endTime" id="endTime"/>
              </li>
              <li>
                <a class="btn btn-primary btn-rounded btn-sm" onclick="$.table.search()"><i class="fa fa-search"></i>&nbsp;搜索</a>
                <a class="btn btn-warning btn-rounded btn-sm" onclick="resetSearch();"><i class="fa fa-refresh"></i>&nbsp;重置</a>
              </li>
            </ul>
          </div>
          <div id="treeDiv" class="box1" style="display: none;width: 200px;box-sizing: border-box;box-shadow: 0 2px 4px rgba(0, 0, 0, .12); position: absolute;z-index: 999;background-color: #fff;border: 1px solid #d2d2d2;">
            <ul class="tree_ul ztree" id="tree" ></ul>
          </div>
        </form>
      </div>
    </div>
    <!-- title-->
    <div class="row">
      <div class="ibox-content" style="padding: 15px 0px;">
        <div class="alert alert-info" style="margin-bottom: 0px;">
          综合指标
        </div>
      </div>
    </div>
    <!-- 8个div-->
    <div class="row ibox-content">
      <div class="col-sm-3">
        <div class="ibox">
          <div class="ibox-title">
            <h4 class="center">跟进线索数量</h4>
          </div>
          <div class="ibox-content">
            <p class="center beginToEnd">2021/07/01-2021/07/07</p>
            <h2 class="center" id="followClueNum">0</h2>
          </div>
        </div>
      </div>
      <div class="col-sm-3">
        <div class="ibox">
          <div class="ibox-title">
            <h4 class="center">有效线索数量</h4>
          </div>
          <div class="ibox-content">
            <p class="center beginToEnd">2021/07/01-2021/07/07</p>
            <h2 class="center" id="validClueNum">0</h2>
          </div>
        </div>
      </div>
      <div class="col-sm-3">
        <div class="ibox">
          <div class="ibox-title">
            <h4 class="center">商机数</h4>
          </div>
          <div class="ibox-content">
            <p class="center beginToEnd">2021/07/01-2021/07/07</p>
            <h2 class="center" id="intendNum">0</h2>
          </div>
        </div>
      </div>
      <div class="col-sm-3">
        <div class="ibox">
          <div class="ibox-title">
            <h4 class="center">更新商机数</h4>
          </div>
          <div class="ibox-content">
            <p class="center beginToEnd">2021/07/01-2021/07/07</p>
            <h2 class="center" id="updateIntentNum">0</h2>
          </div>
        </div>
      </div>
    </div>
    <div class="row ibox-content">
       <div class="col-sm-3">
         <div class="ibox">
           <div class="ibox-title">
             <h4 class="center">已报价线索数量</h4>
           </div>
           <div class="ibox-content">
             <p class="center beginToEnd">2021/07/01-2021/07/07</p>
             <h2 class="center" id="quotationNum">0</h2>
           </div>
         </div>
       </div>
       <div class="col-sm-3">
         <div class="ibox">
           <div class="ibox-title">
             <h4 class="center">有疑义线索数量</h4>
           </div>
           <div class="ibox-content">
             <p class="center beginToEnd">2021/07/01-2021/07/07</p>
             <h2 class="center" id="doubtNum">0</h2>
           </div>
         </div>
       </div>
       <div class="col-sm-3">
         <div class="ibox">
           <div class="ibox-title">
             <h4 class="center">成单数量</h4>
           </div>
           <div class="ibox-content">
             <p class="center beginToEnd">2021/07/01-2021/07/07</p>
             <h2 class="center" id="orderPayNum">0</h2>
           </div>
         </div>
       </div>
       <div class="col-sm-3">
         <div class="ibox">
           <div class="ibox-title">
             <h4 class="center">成单金额</h4>
           </div>
           <div class="ibox-content">
             <p class="center beginToEnd">2021/07/01-2021/07/07</p>
             <h2 class="center" id="orderPayAmount">0</h2>
           </div>
         </div>
       </div>
     </div>
    <!-- 曲线+漏斗-->
    <div class="row ibox-content">
      <div class="col-sm-6">
        <div class="ibox float-e-margins">
          <div class="ibox-title">
            <h5>线索变化趋势</h5>
            <p style="float: right;" class="beginToEnd">2020/07/01-2020/07/07</p>
          </div>
          <div class="ibox-content">
            <div class="echarts" id="changeOne"></div>
          </div>
        </div>
      </div>
      <div class="col-sm-6">
        <div class="ibox float-e-margins">
          <div class="ibox-title">
            <h5>线索转化漏斗</h5>
            <p style="float: right;" class="beginToEnd">2020/07/01-2020/07/07</p>
          </div>
          <div class="ibox-content">
            <div class="echarts" id="changeTwo"></div>
          </div>
        </div>
      </div>
    </div>
    <!-- 列表-->
    <div class="row">
      <div class="col-sm-12 search-collapse">
        <form id="form2">
          <div class="select-list">
            <ul>
              <li>
                维度:
                <input type="checkbox" name="selectParam" value="1" style="width: 50px;height: 20px;"/>团队
                <input type="checkbox" name="selectParam" value="2" style="width: 50px;height: 20px;"/>电销
                <input type="checkbox" name="selectParam" value="3" style="width: 50px;height: 20px;"/>线索类型
              </li>
              <li>
                <a class="btn btn-primary btn-rounded btn-sm" onclick="query();"><i class="fa fa-search"></i>&nbsp;加载</a>
                <a class="btn btn-warning btn-rounded btn-sm" onclick="reset();"><i class="fa fa-refresh"></i>&nbsp;重置</a>
              </li>
            </ul>
          </div>
        </form>
      </div>
    </div>
    <div class="row">
       <div class="col-sm-12 select-table table-striped">
         <table id="bootstrap-table" data-mobile-responsive="true"></table>
       </div>
    </div>
  </div>
    <th:block th:include="include :: footer"/>
  <th:block th:include="include :: ztree-js" />
  <th:block th:include="include :: echarts-js" />
  <th:block th:include="include :: select2-js" />
  <th:block th:include="include :: bootstrap-select-js"/>
    <script th:inline="javascript">
        var prefix = ctx + "project/telemarketingData";
        var columus = [
            {
                field : 'followClueNum',
                title : '跟进线索数量'
            },
            {
                field : 'validClueNum',
                title : '有效线索数量'
            },
            {
                field : 'intendNum',
                title : '商机数量'
            },
            {
                field : 'updateIntentNum',
                title : '更新商机数量'
            },
            {
                field : 'quotationNum',
                title : '已报价数量'
            },
            {
                field : 'doubtNum',
                title : '有疑义线索数量'
            },
            {
                field : 'orderPayNum',
                title : '成单量'
            },
            {
                field : 'orderPayAmount',
                title : '成单金额'
            },
            {
                field : 'addWechatNum',
                title : '已加微信数量'
            }];
        function query() {
            $("#bootstrap-table").bootstrapTable('destroy');
            //增加展示列
      var columns2 = [];
            var selectParam = "";
            $("input[name='selectParam']:checked").each(function () {
                selectParam = selectParam + $(this).val() + ",";
            });
            if (selectParam != "") {
        var one = selectParam.indexOf("1");
        var two = selectParam.indexOf("2");
        var three = selectParam.indexOf("3");
        if (one >= 0 && two < 0 && three < 0) {
            // 1
                    columns2.push({
                            field : 'deptName',
                            title : '部门'
                        });
                    columns2 = columns2.concat(columus);
        }else if (one >= 0 && two >= 0 && three < 0) {
            // 1,2
                    columns2.push({
                            field : 'deptName',
                            title : '部门'
                        },
                        {
                            field : 'userName',
                            title : '电销'
                        });
                    columns2 = columns2.concat(columus);
        }else if (one >= 0 && two < 0 && three >= 0) {
            //1,3
                    columns2.push({
                            field : 'deptName',
                            title : '部门'
                        },
                        {
                            field : 'clueTypeName',
                            title : '线索类型'
                        });
                    columns2 = columns2.concat(columus);
        }else if (one >= 0 && two >= 0 && three >= 0) {
            //1,2,3
                    columns2.push({
                            field : 'deptName',
                            title : '部门'
                        },
                        {
                            field : 'userName',
                            title : '电销'
                        },
                        {
                            field : 'clueTypeName',
                            title : '线索类型'
                        });
                    columns2 = columns2.concat(columus);
        }else if (one < 0 && two >= 0 && three < 0) {
            //2
                    columns2.push(
                        {
                            field : 'userName',
                            title : '电销'
                        });
                    columns2 = columns2.concat(columus);
        }else if (one < 0 && two >= 0 && three >= 0) {
            //2,3
                    columns2.push(
                        {
                            field : 'userName',
                            title : '电销'
                        },
                        {
                            field : 'clueTypeName',
                            title : '线索类型'
                        });
                    columns2 = columns2.concat(columus);
        }else {
            //3
                    columns2.push(
                        {
                            field : 'clueTypeName',
                            title : '线索类型'
                        });
                    columns2 = columns2.concat(columus);
        }
            }else {
                columns2 = columus;
      }
            var options = {
                url: prefix + "/getTelemarketingDataGroup",
                modalName: "统计报表",
                showExport: false,
                showSearch: false,
                showRefresh: false,
                showToggle: false,
                showColumns: false,
                pagination:false,
                queryParams: queryParams,
                columns: columns2
            };
            $.table.init(options);
    }
        function queryParams(params) {
            //获取复选框选中的值
      var selectParam = "";
      $("input[name='selectParam']:checked").each(function () {
        selectParam = selectParam + $(this).val() + ",";
            });
            var search = $.table.queryParams(params);
            search.selectParam = selectParam.toString();
            return search;
        }
        function reset() {
            $("[name='selectParam']").removeAttrs("checked");
        }
        $(function() {
            // 初始化时间范围插件,传入三个id的名称
            initDaterangepickerWithoutInitTime("recordDate","startTime","endTime");
            getZtree();
            var options = {
                url: prefix + "/list",
                modalName: "统计报表",
            showExport: false,
                showSearch: false,
                showRefresh: false,
                showToggle: false,
                showColumns: false,
                pagination:false,
                onLoadSuccess:onLoadSuccess,
                columns: columus
            };
            $.table.init(options);
        });
        function onLoadSuccess(data) {
            var rows = data.rows;
            var beginToEnd = "";
            var followClueNum = 0;
            var validClueNum = 0;
            var intendNum = 0;
            var updateIntentNum = 0;
            var quotationNum = 0;
            var doubtNum = 0;
            var orderPayNum = 0;
            var orderPayAmount = 0;
            var addWechatNum = 0;
            var arrx = new Array();
            var followClueNumArr = new Array();
            var validClueNumArr = new Array();
            var intendNumArr = new Array();
            var updateIntentNumArr = new Array();
            var quotationNumArr = new Array();
            var doubtNumArr = new Array();
            var orderPayNumArr = new Array();
            var orderPayAmountArr = new Array();
            rows.forEach(function (e,index) {
        arrx[index] = e.recordDate;
        //获取时间组合串
        if (index == 0) {
                    beginToEnd += e.recordDate +"-";
        }
        if (index == rows.length-1) {
                    beginToEnd += e.recordDate;
        }
                followClueNumArr[index] = e.followClueNum;
                followClueNum = parseInt(followClueNum) + parseInt(e.followClueNum);
                validClueNumArr[index] = e.validClueNum;
                validClueNum = parseInt(validClueNum) + parseInt(e.validClueNum);
                intendNumArr[index] = e.intendNum;
                intendNum = parseInt(intendNum) + parseInt(e.intendNum);
                updateIntentNumArr[index] = e.updateIntentNum;
                updateIntentNum = parseInt(updateIntentNum) + parseInt(e.updateIntentNum);
                quotationNumArr[index] = e.quotationNum;
                quotationNum = parseInt(quotationNum) + parseInt(e.quotationNum);
                doubtNumArr[index] = e.doubtNum;
                doubtNum = parseInt(doubtNum) + parseInt(e.doubtNum);
                orderPayNumArr[index] = e.orderPayNum;
                orderPayNum = parseInt(orderPayNum) + parseInt(e.orderPayNum);
                orderPayAmountArr[index] = e.orderPayAmount;
                orderPayAmount = parseInt(orderPayAmount) + parseInt(e.orderPayAmount);
                addWechatNum = parseInt(addWechatNum) + parseInt(e.addWechatNum);
            });
            $(".beginToEnd").html(beginToEnd);
            $("#followClueNum").html(followClueNum);
            $("#validClueNum").html(validClueNum);
            $("#intendNum").html(intendNum);
            $("#updateIntentNum").html(updateIntentNum);
            $("#quotationNum").html(quotationNum);
            $("#doubtNum").html(doubtNum);
            $("#orderPayNum").html(orderPayNum);
            $("#orderPayAmount").html(orderPayAmount);
            loadLine(arrx,followClueNumArr,validClueNumArr,intendNumArr,updateIntentNumArr,quotationNumArr,doubtNumArr,orderPayNumArr,orderPayAmountArr);
            loadFunnel(validClueNum,intendNum,orderPayNum);
            //重新加载合计后的数据 组合数据data
      var newdata = [];
            newdata.push({followClueNum:followClueNum,validClueNum:validClueNum,intendNum:intendNum,
        updateIntentNum:updateIntentNum,quotationNum:quotationNum,doubtNum:doubtNum,
        orderPayNum:orderPayNum,orderPayAmount:orderPayAmount,addWechatNum:addWechatNum});
            //获取原始 columns
            var params = $("#bootstrap-table").bootstrapTable('getOptions');
            //销毁初始加载表格
            $("#bootstrap-table").bootstrapTable('destroy');
            //重新加载
            $("#bootstrap-table").bootstrapTable({
                modalName: "统计报表",
                data:newdata,
                showExport: false,
                showSearch: false,
                showRefresh: false,
                showToggle: false,
                showColumns: false,
                pagination:false,
                columns: params.columns
      });
        }
        //加载折线
    function loadLine(arrx,followClueNumArr,validClueNumArr,intendNumArr,updateIntentNumArr,quotationNumArr,doubtNumArr,orderPayNumArr,orderPayAmountArr) {
            //加载曲线
            var chartDom = document.getElementById('changeOne');
            var myChart = echarts.init(chartDom);
            var option;
            option = {
                title: {
                    text: ''
                },
                tooltip: {
                    trigger: 'axis'
                },
                legend: {
                    data: ['跟进线索数量','有效线索数量', '商机数','更新商机数', '已报价线索数量', '有疑义线索数量', '成单数量','成单金额']
                },
                grid: {
                    left: '3%',
                    right: '4%',
                    bottom: '3%',
                    containLabel: true
                },
                xAxis: {
                    type: 'category',
                    boundaryGap: false,
                    data: arrx
                },
                yAxis: {
                    type: 'value'
                },
                series: [
                    {
                        name: '跟进线索数量',
                        type: 'line',
                        stack: '总量',
                        data: followClueNumArr
                    },
                    {
                        name: '有效线索数量',
                        type: 'line',
                        stack: '总量',
                        data: validClueNumArr
                    },
                    {
                        name: '商机数',
                        type: 'line',
                        stack: '总量',
                        data: intendNumArr
                    },
                    {
                        name: '更新商机数',
                        type: 'line',
                        stack: '总量',
                        data: updateIntentNumArr
                    },
                    {
                        name: '已报价线索数量',
                        type: 'line',
                        stack: '总量',
                        data: quotationNumArr
                    },
                    {
                        name: '有疑义线索数量',
                        type: 'line',
                        stack: '总量',
                        data: doubtNumArr
                    },
                    {
                        name: '成单数量',
                        type: 'line',
                        stack: '总量',
                        data: orderPayNumArr
                    },
                    {
                        name: '成单金额',
                        type: 'line',
                        stack: '总量',
                        data: orderPayAmountArr
                    }
                ]
            };
            option && myChart.setOption(option);
        }
        //加载漏斗图
    function loadFunnel(validClueNum,intendNum,orderPayNum) {
            //新建数组存放数量
      var dataNum = new Array();
      var json0 = {name:"有效用户"};
      var json1 = {name:"商机"};
      var json2 = {name:"成单"};
      json0["value"]=validClueNum;
      json1["value"]=intendNum;
      json2["value"]=orderPayNum;
      dataNum[0] = json0;
      dataNum[1] = json1;
      dataNum[2] = json2;
      //新建数组存放转化率
            var dataPercent = new Array();
            var json00 = {name:"有效用户"};
            var json11 = {name:"商机"};
            var json22 = {name:"成单"};
            if (validClueNum != 0) {
                //商机转化率
                var validPercent = parseFloat(validClueNum*100/validClueNum).toFixed(2);
                var intendPercent = parseFloat(intendNum*100/validClueNum).toFixed(2);
                json00["value"]=validPercent;
                json11["value"]=intendPercent;
      }else {
                json00["value"]=0;
                json11["value"]=0;
      }
      if (intendNum != 0) {
                var orderPercent = parseFloat(orderPayNum*100/intendNum).toFixed(2);
                json22["value"]=orderPercent;
      }else {
                json22["value"]=0;
      }
            dataPercent[0] = json00;
            dataPercent[1] = json11;
            dataPercent[2] = json22;
            var chartDom = document.getElementById('changeTwo');
            var myChart = echarts.init(chartDom);
            var option;
            option = {
                tooltip: {
                    trigger: 'item',
                    formatter: "{b} : {c}"
                },
                legend: {
                    data: ['有效用户','商机','成单']
                },
                series: [
                    {
                        name: '数量',
                        type: 'funnel',
                        left: '10%',
                        width: '80%',
                        label: {
                            formatter: '{b}数'
                        },
                        labelLine: {
                            show: false
                        },
                        itemStyle: {
                            opacity: 0.7
                        },
                        emphasis: {
                            label: {
                                position: 'inside',
                                formatter: '{b}数: {c}'
                            }
                        },
                        data: dataNum
                    },
                    {
                        name: '转化率',
                        type: 'funnel',
                        left: '10%',
                        width: '80%',
                        label: {
                            position: 'inside',
                            formatter: '{c}%',
                            color: '#fff'
                        },
                        itemStyle: {
                            opacity: 0.5,
                            borderColor: '#fff',
                            borderWidth: 2
                        },
                        emphasis: {
                            label: {
                                position: 'inside',
                                formatter: '{b}转化率: {c}%'
                            }
                        },
                        data: dataPercent,
                        z: 100
                    }
                ]
            };
            option && myChart.setOption(option);
        }
        // 重置
        function resetSearch(){
            $("#actionClueType option:first").prop("selected",'selected');
            $('#actionClueType').trigger('change.select2');
            $.form.reset();
            $("#recordDate").val('');
            $("#startTime").val('');
            $("#endTime").val('');
        }
        function getZtree() {
            var url = ctx + "sys/userTreeData?status=0";
            var options = {
                url: url,
                expandLevel: 2,
                onCheck: callback,//点击事件
                check: {
                    enable: true//是否开启复选框
                }
            };
            $.tree.init(options);
            //树节点点击事件
            function callback() {
                var treeObj = $.fn.zTree.getZTreeObj("tree"),
                    nodes = treeObj.getCheckedNodes(true),
                    v = "";
                var userNames="";
                var userIds="";
                for (var i = 0; i < nodes.length; i++) {
                    //获取以u结尾的用户信息
                    if (nodes[i].id.toString().indexOf("u")!=-1) {
                        userNames+=nodes[i].name+";";
                        userIds+=nodes[i].id.toString().split("u")[0]+",";
                    }
                }
                $("#createUserName").val(userNames);
                $("#createByIds").val(userIds);
            }
        }
        //部门
        function ztreeShow() {
            var nameObj = $("#createUserName");
            var nameOffset = nameObj.offset();
            $("#treeDiv").css({left:nameOffset.left-20 + "px", top:nameOffset.top-21 + nameObj.outerHeight() + "px"}).slideDown("fast");
            $("body").bind("mousedown", onBodyDown);
        }
        //树折叠
        function onBodyDown(event) {
            if (!(event.target.id == "treeDiv" || $(event.target).parents("#treeDiv").length > 0)) {
                hideMenu();
            }
        }
        function hideMenu() {
            $("#treeDiv").fadeOut("fast");
            $("body").unbind("mousedown", onBodyDown);
        }
    </script>
</body>
</html>


java代码

TelemarketingDataController.java

package com.dongao.project.telemarketingdata.controller;
import com.dongao.project.clueregular.domain.ClueRegular;
import com.dongao.project.clueregular.service.IClueRegularService;
import com.dongao.project.common.constants.Constants;
import com.dongao.project.sys.domain.MaxDataScope;
import com.dongao.project.sys.service.SysService;
import com.dongao.project.telemarketingdata.domain.TelemarketingData;
import com.dongao.project.telemarketingdata.service.ITelemarketingDataService;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.utils.security.ShiroUtils;
import com.ruoyi.common.utils.text.Convert;
import com.ruoyi.framework.aspectj.DataScopeAspect;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.framework.web.page.TableDataInfo;
import com.ruoyi.project.system.role.domain.Role;
import com.ruoyi.project.system.user.domain.User;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.*;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
/**
 * 电销数据信息操作处理
 * 
 * @author dongao
 * @date 2021-08-16
 */
@Controller
@RequestMapping("/project/telemarketingData")
public class TelemarketingDataController extends BaseController
{
    private String prefix = "project/telemarketingdata";
  @Autowired
  private ITelemarketingDataService telemarketingDataService;
  @Autowired
  private IClueRegularService clueRegularService;
  @Autowired
  private SysService sysService;
  @RequiresPermissions("project:telemarketingData:view")
  @GetMapping()
  public String telemarketingData(ModelMap mmap)
  {
    //获取有效线索类型
    ClueRegular cr = new ClueRegular();
    cr.setDelFlag(Constants.DEL_FLAG.YES.getValue());
    List<ClueRegular> clueRegulars = clueRegularService.selectClueRegularList(cr);
    mmap.put("regulars",clueRegulars);
      return prefix + "/telemarketingdata";
  }
  /**
   * 查询电销数据列表
   */
  @RequiresPermissions("project:telemarketingData:list")
  @PostMapping("/list")
  @ResponseBody
  public TableDataInfo list(@RequestParam Map<String,Object> paramMap)
  {
    //电销数据列表 所属部门
    String createByIds = (String) paramMap.get("createByIds");
    if (StringUtils.isNotEmpty(createByIds)) {
      paramMap.put("userList", Arrays.asList(Convert.toLongArray(createByIds)));
    }else {
      //部門數據權限
      User currentUser = ShiroUtils.getSysUser();
      List<Role> roles = currentUser.getRoles();
      MaxDataScope maxDataScope = sysService.getMaxDataScope(roles, currentUser);
      if (DataScopeAspect.DATA_SCOPE_ALL.equals(maxDataScope.getDataScope())) {
        //当前用户角色是全数据权限
      }else {
        List<Long> userList = maxDataScope.getUserList();
        paramMap.put("userList",userList);
      }
    }
        List<Map> list = telemarketingDataService.getTelemarketingDataGroup(paramMap);
    return getDataTable(list);
  }
  /**
   * 获取有分组维度的统计数据
   */
  @RequestMapping("/getTelemarketingDataGroup")
  @ResponseBody
  public TableDataInfo getTelemarketingDataGroup(@RequestParam Map<String,Object> paramMap)
  {
    String createByIds = (String) paramMap.get("createByIds");
    //电销数据列表 所属部门
    if (StringUtils.isNotEmpty(createByIds)) {
      paramMap.put("userList", Arrays.asList(Convert.toLongArray(createByIds)));
    }else {
      //部門數據權限
      User currentUser = ShiroUtils.getSysUser();
      List<Role> roles = currentUser.getRoles();
      MaxDataScope maxDataScope = sysService.getMaxDataScope(roles, currentUser);
      if (DataScopeAspect.DATA_SCOPE_ALL.equals(maxDataScope.getDataScope())) {
        //当前用户角色是全数据权限
      }else {
        List<Long> userList = maxDataScope.getUserList();
        paramMap.put("userList",userList);
      }
    }
    List<Map> list = telemarketingDataService.getTelemarketingDataGroup(paramMap);
    return getDataTable(list);
  }
}


TelemarketingDataServiceImpl.java

package com.dongao.project.telemarketingdata.service;
import com.dongao.project.clueregular.domain.ClueRegular;
import com.dongao.project.clueregular.mapper.ClueRegularMapper;
import com.dongao.project.telemarketingdata.domain.TelemarketingData;
import com.dongao.project.telemarketingdata.mapper.TelemarketingDataMapper;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.security.ShiroUtils;
import com.ruoyi.common.utils.text.Convert;
import com.ruoyi.project.system.dept.domain.Dept;
import com.ruoyi.project.system.dept.mapper.DeptMapper;
import com.ruoyi.project.system.user.domain.User;
import com.ruoyi.project.system.user.mapper.UserMapper;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
/**
 * 电销数据 服务层实现
 * 
 * @author dongao
 * @date 2021-08-16
 */
@Service
public class TelemarketingDataServiceImpl implements ITelemarketingDataService 
{
  @Autowired
  private TelemarketingDataMapper telemarketingDataMapper;
  @Autowired
  private DeptMapper deptMapper;
  @Autowired
  private UserMapper userMapper;
  @Autowired
  private ClueRegularMapper clueRegularMapper;
  /**
   * 查询电销数据列表
   * @param paramMap
   * @return
   */
  @Override
  public List<Map> selectTelemarketingDataListOther(Map<String, Object> paramMap) {
    List<TelemarketingData> dataList = telemarketingDataMapper.selectTelemarketingDataListOther(paramMap);
    List<Map> list = new ArrayList<>();
    if (CollectionUtils.isNotEmpty(dataList)) {
      //获取返回参数值
      TreeMap<Date, List<TelemarketingData>> collect = dataList.stream().collect(Collectors.groupingBy(TelemarketingData::getRecordDate, TreeMap::new, Collectors.toList()));
      for (Date date : collect.keySet()) {
        Map map = new HashMap(16);
        //key 为分组日期参数
        map.put("recordDate",DateUtils.parseDateToStr("yyyy/MM/dd",date));
        List<TelemarketingData> teleData = collect.get(date);
        getResultList(list, map, teleData);
      }
    }
    return list;
  }
  /**
   * 获取有分组维度的统计数据
   * @param paramMap
   * @return
   */
  @Override
  public List<Map> getTelemarketingDataGroup(Map paramMap) {
    List<TelemarketingData> dataList = telemarketingDataMapper.selectTelemarketingDataListOther(paramMap);
    List<Map> list = new ArrayList<>();
    if (CollectionUtils.isNotEmpty(dataList)) {
      //判断按那种维度分组
      String selectParam = (String) paramMap.get("selectParam");
      if (StringUtils.isNotEmpty(selectParam)) {
        //1 团队 2 电销 3 线索类型
        boolean one = selectParam.contains("1");
        boolean two = selectParam.contains("2");
        boolean three = selectParam.contains("3");
        if (one && !two && !three) {
          //1 团队分组
          TreeMap<Long, List<TelemarketingData>> collect = dataList.stream().collect(Collectors.groupingBy(TelemarketingData::getDeptId, TreeMap::new, Collectors.toList()));
          for (Long deptId : collect.keySet()) {
            Map map = new HashMap(16);
            // key is deptId
            Dept dept = deptMapper.selectDeptById(deptId);
            if (dept != null) {
              map.put("deptName",dept.getDeptName());
            }
            List<TelemarketingData> teleData = collect.get(deptId);
            getResultList(list, map, teleData);
          }
        }else if (one && two && !three) {
          //1,2 团队+电销分组
          TreeMap<Long, TreeMap<Long, List<TelemarketingData>>> collect = dataList.stream().collect(Collectors.groupingBy(TelemarketingData::getDeptId, TreeMap::new, Collectors.groupingBy(TelemarketingData::getRecordBy, TreeMap::new, Collectors.toList())));
          for (Long deptId : collect.keySet()) {
            // key is deptId
            Dept dept = deptMapper.selectDeptById(deptId);
            TreeMap<Long, List<TelemarketingData>> collect2 = collect.get(deptId);
            for (Long recordBy : collect2.keySet()) {
              Map map = new HashMap(16);
              if (dept != null) {
                map.put("deptName",dept.getDeptName());
              }
              //key is recordBy
              User user = userMapper.selectUserById(recordBy);
              if (user != null) {
                map.put("userName",user.getUserName());
              }
              List<TelemarketingData> teleData = collect2.get(recordBy);
              getResultList(list, map, teleData);
            }
          }
        }else if (one && !two && three) {
          //1,3 团队+线索类型分组
          TreeMap<Long, TreeMap<Long, List<TelemarketingData>>> collect = dataList.stream().collect(Collectors.groupingBy(TelemarketingData::getDeptId, TreeMap::new, Collectors.groupingBy(TelemarketingData::getActionClueType, TreeMap::new, Collectors.toList())));
          for (Long deptId : collect.keySet()) {
            // key is deptId
            Dept dept = deptMapper.selectDeptById(deptId);
            TreeMap<Long, List<TelemarketingData>> collect2 = collect.get(deptId);
            for (Long actionClueType : collect2.keySet()) {
              Map map = new HashMap(16);
              if (dept != null) {
                map.put("deptName",dept.getDeptName());
              }
              //key is actionClueType
              ClueRegular clueRegular = clueRegularMapper.selectClueRegularById(actionClueType);
              if (clueRegular != null) {
                map.put("clueTypeName",clueRegular.getClueTypeName());
              }
              List<TelemarketingData> teleData = collect2.get(actionClueType);
              getResultList(list, map, teleData);
            }
          }
        }else if (one && two && three) {
          //1,2,3 团队+电销+线索类型 分组
          TreeMap<Long, TreeMap<Long, TreeMap<Long, List<TelemarketingData>>>> collect = dataList.stream().collect(Collectors.groupingBy(TelemarketingData::getDeptId, TreeMap::new, Collectors.groupingBy(TelemarketingData::getRecordBy, TreeMap::new, Collectors.groupingBy(TelemarketingData::getActionClueType, TreeMap::new, Collectors.toList()))));
          for (Long deptId : collect.keySet()) {
            // key is deptId
            Dept dept = deptMapper.selectDeptById(deptId);
            TreeMap<Long, TreeMap<Long, List<TelemarketingData>>> collect2 = collect.get(deptId);
            for (Long recordBy : collect2.keySet()) {
              // key is recordBy
              User user = userMapper.selectUserById(recordBy);
              TreeMap<Long, List<TelemarketingData>> collect3 = collect2.get(recordBy);
              for (Long actionClueType : collect3.keySet()) {
                Map map = new HashMap(16);
                if (dept != null) {
                  map.put("deptName",dept.getDeptName());
                }
                if (user != null) {
                  map.put("userName",user.getUserName());
                }
                //key is actionClueType
                ClueRegular clueRegular = clueRegularMapper.selectClueRegularById(actionClueType);
                if (clueRegular != null) {
                  map.put("clueTypeName",clueRegular.getClueTypeName());
                }
                List<TelemarketingData> teleData = collect3.get(actionClueType);
                getResultList(list, map, teleData);
              }
            }
          }
        }else if (!one && two && !three) {
          //2 电销分组
          TreeMap<Long, List<TelemarketingData>> collect = dataList.stream().collect(Collectors.groupingBy(TelemarketingData::getRecordBy, TreeMap::new, Collectors.toList()));
          for (Long recordBy : collect.keySet()) {
            Map map = new HashMap(16);
            // key is recordBy
            User user = userMapper.selectUserById(recordBy);
            if (user != null) {
              map.put("userName",user.getUserName());
            }
            List<TelemarketingData> teleData = collect.get(recordBy);
            getResultList(list, map, teleData);
          }
        }else if (!one && two && three) {
          //2,3 电销+线索类型 分组
          TreeMap<Long, TreeMap<Long, List<TelemarketingData>>> collect = dataList.stream().collect(Collectors.groupingBy(TelemarketingData::getRecordBy, TreeMap::new, Collectors.groupingBy(TelemarketingData::getActionClueType, TreeMap::new, Collectors.toList())));
          for (Long recordBy : collect.keySet()) {
            // key is recordBy
            User user = userMapper.selectUserById(recordBy);
            TreeMap<Long, List<TelemarketingData>> collect2 = collect.get(recordBy);
            for (Long actionClueType : collect2.keySet()) {
              Map map = new HashMap(16);
              if (user != null) {
                map.put("userName",user.getUserName());
              }
              //key is actionClueType
              ClueRegular clueRegular = clueRegularMapper.selectClueRegularById(actionClueType);
              if (clueRegular != null) {
                map.put("clueTypeName",clueRegular.getClueTypeName());
              }
              List<TelemarketingData> teleData = collect2.get(actionClueType);
              getResultList(list, map, teleData);
            }
          }
        }else {
          // 最后一种分组方式 3 线索类型分组
          TreeMap<Long, List<TelemarketingData>> collect = dataList.stream().collect(Collectors.groupingBy(TelemarketingData::getActionClueType, TreeMap::new, Collectors.toList()));
          for (Long actionClueType : collect.keySet()) {
            Map map = new HashMap(16);
            // key is actionClueType
            ClueRegular clueRegular = clueRegularMapper.selectClueRegularById(actionClueType);
            if (clueRegular != null) {
              map.put("clueTypeName",clueRegular.getClueTypeName());
            }
            List<TelemarketingData> teleData = collect.get(actionClueType);
            getResultList(list, map, teleData);
          }
        }
      }else {
        //无维度参数 则默认 统计日期分组
        TreeMap<Date, List<TelemarketingData>> collect = dataList.stream().collect(Collectors.groupingBy(TelemarketingData::getRecordDate, TreeMap::new, Collectors.toList()));
        for (Date date : collect.keySet()) {
          Map map = new HashMap(16);
          map.put("recordDate",DateUtils.parseDateToStr("yyyy/MM/dd",date));
          List<TelemarketingData> teleData = collect.get(date);
          getResultList(list, map, teleData);
        }
      }
    }
    return list;
  }
  /**
   * 组装返回参数值
   * @param list
   * @param map
   * @param teleData
   */
  private void getResultList(List<Map> list, Map map, List<TelemarketingData> teleData) {
    /** 跟进线索数量 */
    long followClueNum = 0;
    /** 有效线索数量 */
    long validClueNum = 0;
    /** 商机数量 */
    long intendNum = 0;
    /** 更新商机数量 */
    long updateIntentNum = 0;
    /** 已报价数量 */
    long quotationNum = 0;
    /** 有疑义线索数量 */
    long doubtNum = 0;
    /** 成单量 */
    long orderPayNum = 0;
    /** 成单金额 */
    BigDecimal orderPayAmount = new BigDecimal(0);
    /** 已加微信数量 */
    long addWechatNum = 0;
    for (TelemarketingData td : teleData) {
            followClueNum += td.getFollowClueNum();
            validClueNum += td.getValidClueNum();
            intendNum += td.getIntendNum();
            updateIntentNum += td.getUpdateIntentNum();
            quotationNum += td.getQuotationNum();
            doubtNum += td.getDoubtNum();
            orderPayNum += td.getOrderPayNum();
            orderPayAmount = orderPayAmount.add(td.getOrderPayAmount());
            addWechatNum += td.getAddWechatNum();
        }
    map.put("followClueNum",followClueNum);
    map.put("validClueNum",validClueNum);
    map.put("intendNum",intendNum);
    map.put("updateIntentNum",updateIntentNum);
    map.put("quotationNum",quotationNum);
    map.put("doubtNum",doubtNum);
    map.put("orderPayNum",orderPayNum);
    map.put("orderPayAmount",orderPayAmount);
    map.put("addWechatNum",addWechatNum);
    list.add(map);
  }
}


TelemarketingDataMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dongao.project.telemarketingdata.mapper.TelemarketingDataMapper">
    <resultMap type="TelemarketingData" id="TelemarketingDataResult">
        <result property="id"    column="id"    />
        <result property="recordDate"    column="record_date"    />
        <result property="recordBy"    column="record_by"    />
        <result property="actionClueType"    column="action_clue_type"    />
        <result property="followClueNum"    column="follow_clue_num"    />
        <result property="validClueNum"    column="valid_clue_num"    />
        <result property="intendNum"    column="intend_num"    />
        <result property="updateIntentNum"    column="update_intent_num"    />
        <result property="quotationNum"    column="quotation_num"    />
        <result property="doubtNum"    column="doubt_num"    />
        <result property="orderPayNum"    column="order_pay_num"    />
        <result property="orderPayAmount"    column="order_pay_amount"    />
        <result property="addWechatNum"    column="add_wechat_num"    />
        <result property="delFlag"    column="del_flag"    />
        <result property="createTime"    column="create_time"    />
        <result property="createBy"    column="create_by"    />
        <result property="updateTime"    column="update_time"    />
        <result property="updateBy"    column="update_by"    />
        <result property="remark"    column="remark"    />
    </resultMap>
    <sql id="selectTelemarketingDataVo">
        select id, record_date, record_by, action_clue_type, follow_clue_num, valid_clue_num, intend_num,update_intent_num, quotation_num, doubt_num, order_pay_num, order_pay_amount, add_wechat_num, del_flag, create_time, create_by, update_time, update_by, remark from crm_account_telemarketing_data
    </sql>
    <select id="selectTelemarketingDataList" parameterType="TelemarketingData" resultMap="TelemarketingDataResult">
        <include refid="selectTelemarketingDataVo"/>
        <where>
            and del_flag = 0
            <if test="id != null "> and id = #{id}</if>
            <if test="recordDate != null "> and record_date = #{recordDate}</if>
            <if test="recordBy != null "> and record_by = #{recordBy}</if>
            <if test="actionClueType != null "> and action_clue_type = #{actionClueType}</if>
            <if test="followClueNum != null "> and follow_clue_num = #{followClueNum}</if>
            <if test="validClueNum != null "> and valid_clue_num = #{validClueNum}</if>
            <if test="intendNum != null "> and intend_num = #{intendNum}</if>
            <if test="updateIntentNum != null "> and update_intent_num = #{updateIntentNum}</if>
            <if test="quotationNum != null "> and quotation_num = #{quotationNum}</if>
            <if test="doubtNum != null "> and doubt_num = #{doubtNum}</if>
            <if test="orderPayNum != null "> and order_pay_num = #{orderPayNum}</if>
            <if test="orderPayAmount != null "> and order_pay_amount = #{orderPayAmount}</if>
            <if test="addWechatNum != null "> and add_wechat_num = #{addWechatNum}</if>
            <if test="delFlag != null "> and del_flag = #{delFlag}</if>
            <if test="createTime != null "> and create_time = #{createTime}</if>
            <if test="createBy != null  and createBy != '' "> and create_by = #{createBy}</if>
            <if test="updateTime != null "> and update_time = #{updateTime}</if>
            <if test="updateBy != null  and updateBy != '' "> and update_by = #{updateBy}</if>
            <if test="remark != null  and remark != '' "> and remark = #{remark}</if>
        </where>
    </select>
    <select id="selectTelemarketingData" parameterType="TelemarketingData" resultMap="TelemarketingDataResult">
        <include refid="selectTelemarketingDataVo"/>
        <where>
            and del_flag = 0
            <if test="id != null "> and id = #{id}</if>
            <if test="recordDate != null "> and record_date = #{recordDate}</if>
            <if test="recordBy != null "> and record_by = #{recordBy}</if>
            <if test="actionClueType != null "> and action_clue_type = #{actionClueType}</if>
            <if test="followClueNum != null "> and follow_clue_num = #{followClueNum}</if>
            <if test="validClueNum != null "> and valid_clue_num = #{validClueNum}</if>
            <if test="intendNum != null "> and intend_num = #{intendNum}</if>
            <if test="updateIntentNum != null "> and update_intent_num = #{updateIntentNum}</if>
            <if test="quotationNum != null "> and quotation_num = #{quotationNum}</if>
            <if test="doubtNum != null "> and doubt_num = #{doubtNum}</if>
            <if test="orderPayNum != null "> and order_pay_num = #{orderPayNum}</if>
            <if test="orderPayAmount != null "> and order_pay_amount = #{orderPayAmount}</if>
            <if test="addWechatNum != null "> and add_wechat_num = #{addWechatNum}</if>
            <if test="delFlag != null "> and del_flag = #{delFlag}</if>
            <if test="createTime != null "> and create_time = #{createTime}</if>
            <if test="createBy != null  and createBy != '' "> and create_by = #{createBy}</if>
            <if test="updateTime != null "> and update_time = #{updateTime}</if>
            <if test="updateBy != null  and updateBy != '' "> and update_by = #{updateBy}</if>
            <if test="remark != null  and remark != '' "> and remark = #{remark}</if>
        </where>
    </select>
    <select id="selectTelemarketingDataListOther" parameterType="Map" resultMap="TelemarketingDataResult">
        SELECT t1.record_date, t1.record_by, t1.action_clue_type, t1.follow_clue_num, t1.valid_clue_num, t1.intend_num,t1.update_intent_num,
        t1.quotation_num, t1.doubt_num, t1.order_pay_num, t1.order_pay_amount, t1.add_wechat_num,t2.dept_id deptId
        FROM crm_account_telemarketing_data t1
        LEFT JOIN sys_user t2 ON t1.record_by=t2.user_id
        WHERE t1.del_flag=0 AND t2.del_flag=0
        <if test="paramMap != null">
            <if test="paramMap.userList != null">
                AND record_by IN
                <foreach collection="paramMap.userList" item="recordBy" open="(" close=")" separator=",">
                    #{recordBy}
                </foreach>
            </if>
            <if test="paramMap.actionClueType != null and paramMap.actionClueType != ''">
                AND action_clue_type = #{paramMap.actionClueType}
            </if>
            <choose>
                <when test="paramMap.startTime != null or paramMap.startTime != ''">
                    <if test="paramMap.startTime != null and paramMap.startTime != ''" >
                        AND record_date &gt;= #{paramMap.startTime}
                    </if>
                    <if test="paramMap.endTime != null and paramMap.endTime != '' " >
                        AND record_date &lt;= #{paramMap.endTime}
                    </if>
                </when>
                <otherwise>
                    AND record_date &lt;= now()
                </otherwise>
            </choose>
        </if>
        ORDER BY record_date
    </select>
</mapper>

【注】本文仅用于工作中日常记录,方便后续查阅,仅可用于学习用途,不可用于商业用途。


相关文章
|
JavaScript 前端开发 Java
51jqGrid 分组 - 远程数据(排序过)
51jqGrid 分组 - 远程数据(排序过)
44 0
51jqGrid 分组 - 远程数据(排序过)
|
JavaScript 前端开发 Java
52jqGrid 分组 - 远程数据(grandtotals排序)
52jqGrid 分组 - 远程数据(grandtotals排序)
51 0
|
JavaScript 前端开发 Java
57jqGrid 分组 - 多分组在头部显示求和(新)
57jqGrid 分组 - 多分组在头部显示求和(新)
37 0
|
2月前
排序列表
排序列表。
17 3
|
3月前
不排序列表
不排序列表。
32 5
|
存储 SQL 关系型数据库
mysql数据分组 group by 多条件分组但条件不并列的分析
mysql数据分组 group by 多条件分组但条件不并列的分析
629 0
|
JavaScript 前端开发
45jqGrid 分组 - 数组数据的简单分组
45jqGrid 分组 - 数组数据的简单分组
46 0
|
Python
将列表按照指定的规则排序并添加平均值
将列表按照指定的规则排序并添加平均值
75 1
|
JavaScript
Vue列表过滤+列表排序
Vue列表过滤+列表排序
|
JSON 数据格式 Python
一日一技:包含非hashable元素的列表如何去重并保持顺序?
一日一技:包含非hashable元素的列表如何去重并保持顺序?
113 0