eggjs 怎么实现月度账单统计接口?

简介: eggjs 怎么实现月度账单统计接口?

原型分析


我们可以先看一下,这个统计页面原型分成了3个部分,第一个部分有月份,月总支出,月总收入,第二三部分,都是统计了支出跟收入两大类型下的不同消费类型的占比,只是展示形式不一样。

03f16be0385649e9b708944c50d49802.png


需要返回的数据结构

totalExpense, // 当月总支出
totalIncome, // 当月总收入
dataList: [{
  number: 11.99, // 支出或收入数量
    pay_type: 1, // 支出或消费类型值
    type_id: 1, // 消费类型id
    type_name: "餐饮" // 消费类型名称
},...], // 列表数据


月度账单统计接口实现


我们需要在控制层新增 analysis.js 文件


1、控制层编写 monthBill 方法

'use strict';
const Controller = require('egg').Controller;
class AnalysisController extends Controller {
  async monthBill() {
    const { ctx, app } = this;
    try {
      // 1、获取查询参数
      const { billDate } = ctx.query;
      console.log('1、获取查询参数',billDate);
      // 2、参数判空
      if (!billDate) {
        ctx.body = {
          status: 400,
          desc: '参数错误',
          data: null
        }
        return;
      }
      // 3、拿到 token 获取用户信息 user_id
      const token = ctx.request.header.authorization;
      const decode = await app.jwt.verify(token, app.config.jwt.secret);
      if (!decode) return;
      let user_id = decode.id;
      console.log('2、拿到 token 获取用户信息 user_id',user_id);
      // 4、获取月度账单统计数据
      const monthBillResult = await ctx.service.analysis.monthBill(user_id, billDate);
      const monthBillList = JSON.parse(JSON.stringify(monthBillResult));
      console.log('3、获取月度账单统计数据',monthBillResult,monthBillList);
      // 累加相同的消费类型 type_id 生成新的数组返回
      let dataList = monthBillList.reduce((curr, next) => {
        const index = curr.findIndex(item => item.type_id == next.type_id)
        if (index == -1) {
          curr.push({
            type_id: next.type_id,
            type_name: next.type_name,
            pay_type: next.pay_type,
            number: Number(next.amount)
          })
        }
        if (index > -1) {
          curr[index].number += Number(next.amount);
        }
        return curr;
      }, []);
      // 当月总支出:支付类型:1:支出,2:收入
      let totalExpense = monthBillList.reduce((curr, next) => {
        if (next.pay_type === 1) {
          curr += Number(next.amount);
          return curr;
        }
        return curr;
      }, 0).toFixed(2); 
      // 当月总收入:支付类型:1:支出,2:收入
      let totalIncome = monthBillList.reduce((curr, next) => {
        if (next.pay_type === 2) {
          curr += Number(next.amount);
          return curr;
        }
        return curr;
      }, 0).toFixed(2);
      console.log('当月总支出:',totalExpense, '当月总收入:',totalIncome);
      ctx.body = {
        status: 200,
        desc: '请求成功',
        data: {
          totalExpense, // 当月总支出
          totalIncome, // 当月总收入
          dataList: dataList, // 列表数据
        }
      }
    } catch (error) {
      console.log(error);
      ctx.body = {
        status: 500,
        desc: '系统错误',
        data: null
      }
    }
  }
}
module.exports = AnalysisController;



2、服务层编写 monthBill 方法

我们需要在服务层新增 analysis.js 文件

'use strict';
const Service = require('egg').Service;
class AnalysisService extends Service {
  // 获取月份所有账单数据
  async monthBill(user_id, month) {
    const { app } = this;
    try {
      let sql = "select * from `kaimo-cost`.bill b where user_id = "+ user_id + " and DATE_FORMAT(b.date,'%Y-%m') = '" + month + "'";
      console.log('获取月份所有账单数据', sql);
      const result = await app.mysql.query(sql);
      return result;
    } catch (error) {
      console.log(error);
      return null;
    }
  }
}
module.exports = AnalysisService;


3、路由配置

// 获取月度统计账单
router.get('/api/analysis/monthBill', verify_token, controller.analysis.monthBill);



测试


我们输入参数,不要忘记头部 token。

76a56a2dc3a04fd0bb44c1c52088bec6.png


没有数据:

6610397960b943afaaea8f956242cb73.png


不传参数:

99fde860c5ef44388bc966c7e6c23714.png





目录
相关文章
|
1月前
|
监控 前端开发 JavaScript
实战篇:商品API接口在跨平台销售中的有效运用与案例解析
随着电子商务的蓬勃发展,企业为了扩大市场覆盖面,经常需要在多个在线平台上展示和销售产品。然而,手工管理多个平台的库存、价格、商品描述等信息既耗时又容易出错。商品API接口在这一背景下显得尤为重要,它能够帮助企业在不同的销售平台之间实现商品信息的高效同步和管理。本文将通过具体的淘宝API接口使用案例,展示如何在跨平台销售中有效利用商品API接口,以及如何通过代码实现数据的统一管理。
|
3月前
|
小程序 开发者
【社区每周】小程序商品能力两项接口变动(11月第三期)
【社区每周】小程序商品能力两项接口变动(11月第三期)
39 0
|
8月前
|
存储 区块链
秒合约交易系统自定义行情周期技术开发原理及源码分析
秒合约交易系统自定义行情周期技术开发原理及源码分析
|
8月前
|
存储 安全 前端开发
预约上门按摩项目系统开发详细流程/案例介绍/功能逻辑/需求方案/源码模式
确定系统的目标用户,例如个人用户或企业用户。 - 确定系统的核心功能,如用户注册和登录、服务列表和预约管理、支付和评价反馈等。 - 确定技术平台和开发语言,如Web应用还是移动应用,以及开发语言和框架的选择。 - 制定项目计划,并确定开发阶段和时间安排。
|
9月前
|
Java Spring
统计业务方法耗时【项目 商城】
统计业务方法耗时【项目 商城】
70 0
统计业务方法耗时【项目 商城】
|
9月前
|
消息中间件 API 数据库
细谈商品详情API接口设计
随着互联网技术的发展,商品详情信息的展示和交互变得越来越重要。为了提供更好的用户体验,我们需要设计一套高效、稳定且易于扩展的商品详情API接口。本文将详细探讨商品详情API接口的设计,包括接口的通用性、安全性和扩展性等方面,并附有相应的代码实现。
|
9月前
|
XML JSON 缓存
Java实现天眼查API根据企业纳税识别号查询企业详情数据方法
Java实现天眼查API根据企业纳税识别号查询企业详情数据方法
396 0
|
数据库
eggjs 怎么实现新增账单接口?
eggjs 怎么实现新增账单接口?
76 0
eggjs 怎么实现新增账单接口?
|
数据库 数据安全/隐私保护
eggjs 怎么实现账单详情页的删除接口?
eggjs 怎么实现账单详情页的删除接口?
54 0
eggjs 怎么实现账单详情页的删除接口?
|
数据安全/隐私保护
eggjs 怎么实现账单详情页的获取详情接口?
eggjs 怎么实现账单详情页的获取详情接口?
43 0
eggjs 怎么实现账单详情页的获取详情接口?