饮食记录——业务层开发

饮食记录——业务层开发

在这里插入图片描述

继续上次的数据模型的构建,观察上图,我们发现上半部分的Swiper组件和下半部分的饮食记录列表都是需要组合之前数据模型中数据的数据模型。例如,Swiper中饮食摄入热量是下面所有类别中所吃食品列表项的热量之和。而在下面的每一个类型分组中,该分组的总热量数,是由该组内食物记录列表的总热量累计得到的,所以我们需要建立组合的数据模型来获得这些组合数据。

1.通用的GroupInfo

我们原先就已经存在GroupInfo用来保存之前的事物或运动不同的分类即其包含的记录项,为了其也能适用于保存,如上图中下部分不同分组中的组合型数据,对GroupInfo进行改造,使其变得通用。

import ItemCategory from './ItemCategory'
import RecordItem from './RecordItem'
//通用分组类型
export default class GroupInfo<TYPE,ELEMENT>{
  /**
   *分组类型
   */
  type:TYPE
  /*
  * 组内数据集合
   */
  items:ELEMENT[]
  /*
  * 组内记录总热量
   */
  calorie:number =0

  constructor(type:TYPE,items:ELEMENT[]) {
    this.type=type;
    this.items=items;
  }
}

可以看出,我们通过使用泛型,可以让类型不同、类型内记录项不同的组合数据都可以使用该数据模型。我们新定义组内记录总热量,并初始化为0,用来适应在这里插入图片描述
中所拥有的总热量数据,初始化为0则不会影响不包含总热量数据的数据模型使用GroupInfo。

接下来需要重新调整ItemList中的使用GroupInfo部分,传递其ItemCategory类型、RecordItem记录项。

Tabs(){

    TabContent(){
    this.TabContentBuilder(ItemModel.list(this.isFood))
    }
    .tabBar('全部')

  ForEach(ItemModel.listItemGroupByCategory(this.isFood),
    (group:GroupInfo<ItemCategory,RecordItem>)=>{
    TabContent(){
      this.TabContentBuilder(group.items)
    }
    .tabBar(group.type.name)
  })

}.width(CommonConstants.THOUSANDTH_940)
.height('100%')
.barMode(BarMode.Scrollable)

2.StasInfo数据模型

该部分数据模型对应了如下图所示的部分的数据,应为该部分数据在下方并未进行饮食和运动时大部分为0,所以将对应的变量默认值设为0,而且像摄入卡路里总量、运动消耗能量都是通过下方的不同分组内的数据累加得到的,所以在后面,我们要定义业务层业务,用来获取这些值。

在这里插入图片描述

export default class StatsInfo{
  /**
   * 当日摄入卡路里总量
   */
  intake: number = 0
  /**
   * 当日运动消耗能量
   */
  expend: number = 0
  /**
   * 当日摄入碳水总量
   */
  carbon: number = 0
  /**
   * 当日摄入蛋白总量
   */
  protein: number = 0
  /**
   * 当日摄入脂肪总量
   */
  fat: number = 0

  constructor(intake: number = 0, expend: number = 0, carbon: number = 0, protein: number = 0, fat: number = 0) {
    this.intake = intake
    this.expend = expend
    this.carbon = carbon
    this.protein = protein
    this.fat = fat
  }
}

进行业务层开发,实现饮食记录页面中数据的增删查接口

1.对于新增功能,我们要注意的是,由于我们要保存不同日期的饮食记录,所以我们首先要通过AppStorage获取我们存储的记录时间,才能进行新增操作。

2.对于删除操作,我们只需要将要删除的id传递给RecordModel的deleteById方法,即可进行删除操作

3.对于查询操作,由于我们使用RecordModel.listByDate方法查询的是RecordPO类型的数据,而我们需要的是RecordVO类型的数据,因此,我们需要进行将RecordPO转为RecordVO,在这里使用map方法,完成RecordVO所需要数据与RecordPO中数据的映射,返回所得结果即可。

4.我们将查询到的RecordVO[]转化成StatsInfo,来获得Swiper中所需要的数据

5.我们将查询到的RecordVO[]转化成GroupInfo,来获得饮食记录列表中所需要的数据

//业务逻辑层
import RecordPO from '../common/bean/RecordPO'
import DateUtil from '../common/utils/DateUtil'
import ItemModel from '../model/ItemModel'
import RecordModel from '../model/RecordModel'
import { RecordTypeEnum, RecordTypes } from '../model/RecordTypeModel'
import GroupInfo from '../viewmodel/GroupInfo'
import RecordType from '../viewmodel/RecordType'
import RecordVO from '../viewmodel/RecordVO'
import StatsInfo from '../viewmodel/StatsInfo'
class RecordService{
  //1.新增功能
  insert(typeId:number,itemId:number,amount:number){
    //1.1获取记录时间
    let createTime =(AppStorage.Get('selectedDate')||DateUtil.beginTimeOfDay(new Date()) )as number
    //1.2新增
   return RecordModel.insert({typeId,itemId,amount,createTime})
  }

  //2.删除
  deleteById(id:number){
    return RecordModel.(id)
  }
  //3.查询
async queryRecordByDate(date:number):Promise<RecordVO[]>{
    //1.查询数据库的RecordPO
   let rps=await RecordModel.listByDate(date)

  //2.将RecordPO转为RecordVO
    return rps.map(rp =>{
      //2.1.获取po中基本属性
      let  rv={id:rp.id,typeId:rp.typeId,amount:rp.amount} as RecordVO;
      //2.2.查询记录项
    rv.recordItem = ItemModel.getById(rp.itemId,rp.typeId!==RecordTypeEnum.WORKOUT)
      //2.3.计算热量
    rv.calorie=rp.amount*rv.recordItem.calorie;
      return rv;
    })
  }
  //将RecordVO数组转化成StatsInfo
  calculateStatsInfo(records:RecordVO[]):StatsInfo{
    //1.准备结果
    let info =new StatsInfo()
    if (!records||records.length<=0) {
      return info;
    }
    //2.计算统计数据
    records.forEach(r =>{
      if (r.typeId===RecordTypeEnum.WORKOUT) {
        //运动,累加消耗热量
        info.expend+=r.calorie
      }else{
        //食物,累加摄入热量、碳水、蛋白质、脂肪
        info.intake+=r.calorie;
        info.carbon+=r.recordItem.carbon
        info.protein+=r.recordItem.protein
        info.fat+=r.recordItem.fat
      }
    })
    
    //3.返回
    return info

  }
  //将RecordVO数组转化成GroupInfo
  calculateGroupInfo(records:RecordVO[]):GroupInfo<RecordType,RecordVO>[]{
    //1.创建空的记录类型分组
    let groups=RecordTypes.map(recordType =>new GroupInfo(recordType,[]))
    if (!records||records.length<=0) {
      return groups;
    }
    //2.遍历所有饮食记录,
    records.forEach(record=>{
      // 2.1.把每个记录存入其对应类型的分组中
      groups[record.typeId].items.push(record)
      //2.2.计算该组的总热量
      groups[record.typeId].calorie+=record.calorie
    })


  return groups
  }
}
let recordService = new RecordService()
export default recordService as RecordService
      //2.2.计算该组的总热量
      groups[record.typeId].calorie+=record.calorie
    })


  return groups
  }
}
let recordService = new RecordService()
export default recordService as RecordService
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值