百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

仪表盘功能代码JAVA实现(RuoYi-Vue若依CRM第五章)

bigegpt 2024-09-11 00:52 3 浏览

1、界面展示功能

销售简报,合同金额目标及完成情况,数据汇总。

前端展示界面


 briefList: [
        { label: '新增客户(人)', title: '新增客户', type: 'customer', labelValue: 2, field: 'customerCount', icon: 'wk-customer', num: '', rate: '', status: '', color: '#2362FB' },
        { label: '新增联系人(人)', title: '新增联系人', type: 'contacts', labelValue: 3, field: 'contactsCount', icon: 'wk-contacts', num: '', rate: '', status: '', color: '#27BA4A' },
        { label: '新增商机(个)', title: '新增商机', type: 'business', labelValue: 5, field: 'businessCount', icon: 'wk-business', num: '', rate: '', status: '', color: '#FB9323' },
        { label: '新增合同(个)', title: '新增合同', type: 'contract', labelValue: 6, field: 'contractCount', icon: 'wk-contract', num: '', rate: '', status: '', color: '#4A5BFD' },
        { label: '合同金额(元)', title: '合同金额', type: 'contract', labelValue: 6, field: 'contractMoney', icon: 'wk-receivables', num: '', rate: '', status: '', color: '#19B5F6' },
        { label: '商机金额(元)', title: '商机金额', type: 'business', labelValue: 5, field: 'businessMoney', icon: 'wk-icon-opportunities', num: '', rate: '', status: '', color: '#AD5CFF' },
        { label: '回款金额(元)', title: '回款金额', type: 'receivables', labelValue: 7, field: 'receivablesMoney', icon: 'wk-receivables', num: '', rate: '', status: '', color: '#FFB940' },
        { label: '新增跟进记录(条)', title: '新增跟进记录', type: 'record', labelValue: '', field: 'recordCount', icon: 'wk-record', num: '', rate: '', status: '', color: '#4A5BFD' }
      ],

上述是前端初始化数据,通过一个数组循环,展示每个指标的名称和内容,其中num变量是从后端接口获取数据

/**
     * 获取销售简报数据
     */
    getBriefData() {
      this.loading = true
      crmQueryBulletinAPI(this.getBaseParams()).then(res => {
        this.loading = false
        this.briefList.forEach(item => {
          if (item.field == 'contractMoney' ||
          item.field == 'businessMoney' ||
          item.field == 'receivablesMoney') {
            item.num = separator(Math.floor(res.data.data[item.field] || 0))
          } else {
            item.num = res.data.data[item.field] || 0 // 数量
          }
          if (Number(res.data.prev[item.field]) !== 0) {
            // status状态   top 增长  bottom 下降 '' 持平 上升调整为 红色 下降调整为绿色
            item.status = Number(res.data.prev[item.field]) > 0 ? 'top' : 'bottom'
          } else {
            item.status = ''
          }
          item.rate = this.accMul(res.data.prev[item.field], 100) // 增长比例/下降比例
        })
      }).catch(() => {
        this.loading = false
      })
    },

前端通过上述函数获取后台接口


/**
 * 销售简报
 * @param {*} data
 */
export function crmQueryBulletinAPI(data) {
  return request({
    url: 'crmInstrument/queryBulletin',
    method: 'post',
    data: data,
    headers: {
      'Content-Type': 'application/json;charset=UTF-8'
    }
  })
}

通过http请求后端java 接口,并返回数据。接口是post请求

下面是java后端接口封装

  @PostMapping("/queryBulletin")
    @ApiOperation("查询销售简报")
    public Result<JSONObject> queryBulletin(@RequestBody BiParams biParams) {
        JSONObject jsonObject = instrumentService.queryBulletin(biParams);
        return R.ok(jsonObject);
    }

该 Java 方法是一个 Spring Boot Controller 层的接口,作用是处理客户端的 HTTP POST 请求,并查询销售简报。接下来我会为你详细解析这段代码:

  • @PostMapping("/queryBulletin"):该注解用来处理 HTTP POST 请求,并映射到 "/queryBulletin" 这个 URL。当客户端向服务器发送一个 POST 请求到 "/queryBulletin" 这个 URL,Spring Boot 就会调用这个方法来处理请求。
  • @ApiOperation("查询销售简报"):这是一个 Swagger 的注解,用于描述接口的作用,这个接口的作用是“查询销售简报”。
  • public Result<JSONObject> queryBulletin(@RequestBody BiParams biParams):这是一个公共的方法,返回类型是 Result<JSONObject>。方法名是 queryBulletin,接受一个 BiParams 类型的参数 biParams。@RequestBody 是用来绑定请求体中的数据的。请求体中的 JSON 数据会自动映射成 BiParams 对象。
  • JSONObject jsonObject = instrumentService.queryBulletin(biParams);:这行代码是调用 instrumentService(这可能是一个 Service 层的 Bean)的 queryBulletin 方法,并传入之前绑定的 biParams 对象,然后返回一个 JSONObject 对象,把这个对象赋值给 jsonObject。
  • return R.ok(jsonObject);:这行代码是返回一个 Result 对象,这个对象表示请求处理成功,并且响应体中的数据是 jsonObject。


    @Override
    public JSONObject queryBulletin(BiParams biParams) {
        BiTimeUtil.BiTimeEntity biTimeEntity = BiTimeUtil.analyzeTime(biParams);
        BiAuthority biAuthority = handleDataType(biParams);
        Map<String, Object> record = new HashMap<>();
        record.put("businessUserIds", AuthUtil.filterUserIdList(CrmEnum.BUSINESS, CrmAuthEnum.LIST,biAuthority.getUserIds()));
        record.put("contactsUserIds", AuthUtil.filterUserIdList(CrmEnum.CONTACTS, CrmAuthEnum.LIST,biAuthority.getUserIds()));
        record.put("customerUserIds", AuthUtil.filterUserIdList(CrmEnum.CUSTOMER, CrmAuthEnum.LIST,biAuthority.getUserIds()));
        record.put("receivablesUserIds", AuthUtil.filterUserIdList(CrmEnum.RECEIVABLES, CrmAuthEnum.LIST,biAuthority.getUserIds()));
        record.put("contractUserIds", AuthUtil.filterUserIdList(CrmEnum.CONTRACT, CrmAuthEnum.LIST,biAuthority.getUserIds()));
        record.put("leadsUserIds", AuthUtil.filterUserIdList(CrmEnum.LEADS, CrmAuthEnum.LIST,biAuthority.getUserIds()));
        record.put("recordUserIds", AuthUtil.filterUserIdList(null, CrmAuthEnum.LIST,biAuthority.getUserIds()));
        Map<String, Object> info = crmInstrumentMapper.queryBulletin(biTimeEntity, record);
        this.handleMapValue(info);
        boolean isCustom = !StrUtil.isAllEmpty(biParams.getStartTime(), biParams.getEndTime());
        Map<String, Object> prevRecord = new HashMap<>();
        BigDecimal bigDecimal = new BigDecimal("0");
        if (!isCustom) {
            BiTimeUtil.BiTimeEntity timeEntity = BiTimeUtil.prevAnalyzeType(biParams);
            prevRecord = crmInstrumentMapper.queryBulletin(timeEntity, record);
            this.handleMapValue(prevRecord);
            for (String columnName : info.keySet()) {
                BigDecimal decimal = new BigDecimal(prevRecord.get(columnName).toString());
                BigDecimal newdecimal = new BigDecimal(info.get(columnName).toString());
                if (decimal.equals(bigDecimal) || newdecimal.equals(bigDecimal)) {
                    prevRecord.put(columnName, bigDecimal);
                } else {
                    if (decimal.compareTo(BigDecimal.ZERO) == 0 || newdecimal.compareTo(BigDecimal.ZERO) == 0) {
                        prevRecord.put(columnName, 0);
                    } else {
                        prevRecord.put(columnName, newdecimal.subtract(decimal).divide(decimal, 4, BigDecimal.ROUND_HALF_UP));
                    }
                }
            }
        } else {
            for (String columnName : info.keySet()) {
                prevRecord.put(columnName, bigDecimal);
            }
        }
        return new JSONObject().fluentPut("data", info).fluentPut("prev", prevRecord);

    }

该方法是用于查询销售简报的服务层方法。它接收一个 BiParams 类型的参数 biParams,返回一个 JSONObject 对象。具体的流程解析如下:

  1. 使用 BiTimeUtil 的 analyzeTime 方法分析 biParams 的时间属性,并将结果存入 BiTimeEntity 类型的变量 biTimeEntity。
  2. 调用 handleDataType 方法处理 biParams 中的数据类型,并将结果存入 BiAuthority 类型的变量 biAuthority。
  3. 创建一个新的 HashMap 对象 record,用于存储经过权限验证后的用户 ID 列表。
  4. 调用 AuthUtil.filterUserIdList 方法过滤 biAuthority 中的用户 ID 列表,并将过滤的结果添加到 record 中。
  5. 通过调用 crmInstrumentMapper.queryBulletin,可以查询相关的销售简报并将结果存入 info。
  6. 之后的部分代码主要用于处理比较当前记录和上一条记录的信息,并计算一些需要返回的数据。
  7. 最后,将 info 和 prevRecord 存入一个新创建的 JSONObject 中,并返回这个 JSONObject。

值得注意的是,CrmEnum 和 CrmAuthEnum 应该是预定义的一些常量或枚举,用于指定过滤用户 ID 列表需要的参数。

相关推荐

Go语言泛型-泛型约束与实践(go1.7泛型)

来源:械说在Go语言中,Go泛型-泛型约束与实践部分主要探讨如何定义和使用泛型约束(Constraints),以及如何在实际开发中利用泛型进行更灵活的编程。以下是详细内容:一、什么是泛型约束?**泛型...

golang总结(golang实战教程)

基础部分Go语言有哪些优势?1简单易学:语法简洁,减少了代码的冗余。高效并发:内置强大的goroutine和channel,使并发编程更加高效且易于管理。内存管理:拥有自动垃圾回收机制,减少内...

Go 官宣:新版 Protobuf API(go pro版本)

原文作者:JoeTsai,DamienNeil和HerbieOng原文链接:https://blog.golang.org/a-new-go-api-for-protocol-buffer...

Golang开发的一些注意事项(一)(golang入门项目)

1.channel关闭后读的问题当channel关闭之后再去读取它,虽然不会引发panic,但会直接得到零值,而且ok的值为false。packagemainimport"...

golang 托盘菜单应用及打开系统默认浏览器

之前看到一个应用,用go语言编写,说是某某程序的windows图形化客户端,体验一下发现只是一个托盘,然后托盘菜单的控制面板功能直接打开本地浏览器访问程序启动的webserver网页完成gui相关功...

golang标准库每日一库之 io/ioutil

一、核心函数概览函数作用描述替代方案(Go1.16+)ioutil.ReadFile(filename)一次性读取整个文件内容(返回[]byte)os.ReadFileioutil.WriteFi...

文件类型更改器——GoLang 中的 CLI 工具

我是如何为一项琐碎的工作任务创建一个简单的工具的,你也可以上周我开始玩GoLang,它是一种由Google制作的类C编译语言,非常轻量和快速,事实上它经常在Techempower的基准测...

Go (Golang) 中的 Channels 简介(golang channel长度和容量)

这篇文章重点介绍Channels(通道)在Go中的工作方式,以及如何在代码中使用它们。在Go中,Channels是一种编程结构,它允许我们在代码的不同部分之间移动数据,通常来自不同的goro...

Golang引入泛型:Go将Interface「」替换为“Any”

现在Go将拥有泛型:Go将Interface{}替换为“Any”,这是一个类型别名:typeany=interface{}这会引入了泛型作好准备,实际上,带有泛型的Go1.18Beta...

一文带你看懂Golang最新特性(golang2.0特性)

作者:腾讯PCG代码委员会经过十余年的迭代,Go语言逐渐成为云计算时代主流的编程语言。下到云计算基础设施,上到微服务,越来越多的流行产品使用Go语言编写。可见其影响力已经非常强大。一、Go语言发展历史...

Go 每日一库之 java 转 go 遇到 Apollo?让 agollo 来平滑迁移

以下文章来源于GoOfficialBlog,作者GoOfficialBlogIntroductionagollo是Apollo的Golang客户端Apollo(阿波罗)是携程框架部门研...

Golang使用grpc详解(golang gcc)

gRPC是Google开源的一种高性能、跨语言的远程过程调用(RPC)框架,它使用ProtocolBuffers作为序列化工具,支持多种编程语言,如C++,Java,Python,Go等。gR...

Etcd服务注册与发现封装实现--golang

服务注册register.gopackageregisterimport("fmt""time"etcd3"github.com/cor...

Golang:将日志以Json格式输出到Kafka

在上一篇文章中我实现了一个支持Debug、Info、Error等多个级别的日志库,并将日志写到了磁盘文件中,代码比较简单,适合练手。有兴趣的可以通过这个链接前往:https://github.com/...

如何从 PHP 过渡到 Golang?(php转golang)

我是PHP开发者,转Go两个月了吧,记录一下使用Golang怎么一步步开发新项目。本着有坑填坑,有错改错的宗旨,从零开始,开始学习。因为我司没有专门的Golang大牛,所以我也只能一步步自己去...