外食计算器优化,营养成分以及热量比例数据计算
This commit is contained in:
parent
b4f70fa741
commit
473ccef008
@ -2,10 +2,22 @@ package com.stdiet.common.utils;
|
||||
|
||||
public class HealthyUtils {
|
||||
|
||||
public static final double maxHeatEveryDayLess = 250.0;
|
||||
public static final long maxHeatEveryDayLess = 250;
|
||||
|
||||
//每克蛋白质对应热量(千卡)
|
||||
public static final int proteinHeat = 4;
|
||||
|
||||
//每克脂肪对应热量(千卡)
|
||||
public static final int fatHeat = 9;
|
||||
|
||||
//每克碳水对应热量(千卡)
|
||||
public static final int carbonWaterHeat = 4;
|
||||
|
||||
//营养成分比例
|
||||
public static final Integer[] nutritionRate = {30, 20, 50};
|
||||
|
||||
/**
|
||||
* 计算每天最大摄入量
|
||||
* 计算减脂每天最大摄入量(千卡)
|
||||
* @param age 年龄
|
||||
* @param tall 身高
|
||||
* @param weight 体重
|
||||
@ -15,6 +27,119 @@ public class HealthyUtils {
|
||||
age = age == null ? 0 : age;
|
||||
tall = tall == null ? 0 : tall;
|
||||
weight = weight == null ? 0.0 : weight;
|
||||
return Math.round(655+(9.5*weight/2)+(1.8*tall)-(4.7*age) - maxHeatEveryDayLess);
|
||||
return calculateMetabolizeHeat(age, tall, weight) - maxHeatEveryDayLess;
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算基础代谢BMR(千卡)
|
||||
* @param age
|
||||
* @param tall
|
||||
* @param weight
|
||||
* @return
|
||||
*/
|
||||
public static Long calculateMetabolizeHeat(Integer age, Integer tall, Double weight){
|
||||
return Math.round(655+(9.5*weight/2)+(1.8*tall)-(4.7*age));
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算每公斤体重占比(千卡/公斤)
|
||||
* @param metabolizeHeat 基础代谢BMR(千卡)
|
||||
* @param weight 体重(斤)
|
||||
* @return
|
||||
*/
|
||||
public static double calculateHeatRateByWeight(long metabolizeHeat, double weight){
|
||||
return NumberUtils.getNumberByRoundHalfUp(metabolizeHeat/weight*2, 2).doubleValue();
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算每公斤体重占比目标范围
|
||||
* @param heatRateByWeight 每公斤体重占比(千卡/公斤)
|
||||
* @return
|
||||
*/
|
||||
public static double[] calculateHeatTargetRate(double heatRateByWeight){
|
||||
double[] heatArray = new double[2];
|
||||
heatArray[0] = heatRateByWeight - 10;
|
||||
heatArray[1] = heatRateByWeight - 5;
|
||||
return heatArray;
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算减脂热量控制范围(千卡)
|
||||
* @param heatTargetRateArray 每公斤体重占比目标范围
|
||||
* @param fatRateWeight 每公斤体重脂肪占比(克/公斤)
|
||||
* @return
|
||||
*/
|
||||
public static long[] calculateStandardHeatScopeRate(double[] heatTargetRateArray, double fatRateWeight){
|
||||
long[] heatArray = new long[2];
|
||||
heatArray[0] = Math.round(heatTargetRateArray[0] * fatRateWeight / 2);
|
||||
heatArray[1] = Math.round(heatTargetRateArray[1] * fatRateWeight / 2);
|
||||
return heatArray;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 根据蛋白质、脂肪、碳水质量计算热量
|
||||
* @param proteinQuality 蛋白质质量(克)
|
||||
* @param fatQuality 脂肪质量(克)
|
||||
* @param carbonWaterQuality 碳水质量(克)
|
||||
* @return
|
||||
*/
|
||||
public static int calculateTotalHeatByProteinFatCarbonWater(Integer proteinQuality, Integer fatQuality, Integer carbonWaterQuality){
|
||||
return calculateHeatByProteinQuality(proteinQuality) + calculateHeatByFatQuality(fatQuality) + calculateHeatByCarbonWaterQuality(carbonWaterQuality);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据蛋白质质量计算热量
|
||||
* @return
|
||||
*/
|
||||
public static int calculateHeatByProteinQuality(Integer proteinQuality){
|
||||
proteinQuality = proteinQuality == null ? 0 : proteinQuality;
|
||||
return proteinQuality * proteinHeat;
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据脂肪质量计算热量
|
||||
* @return
|
||||
*/
|
||||
public static int calculateHeatByFatQuality(Integer fatQuality){
|
||||
fatQuality = fatQuality == null ? 0 : fatQuality;
|
||||
return fatQuality * fatHeat;
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据碳水质量计算热量
|
||||
* @return
|
||||
*/
|
||||
public static int calculateHeatByCarbonWaterQuality(Integer carbonWaterQuality){
|
||||
carbonWaterQuality = carbonWaterQuality == null ? 0 : carbonWaterQuality;
|
||||
return carbonWaterQuality * carbonWaterHeat;
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据身高计算标准体重
|
||||
* @param tall 身高(厘米)
|
||||
* @return
|
||||
*/
|
||||
public static double calculateStandardWeight(int tall){
|
||||
return (tall-107.5)*2;
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回蛋白质、脂肪、碳水对应热量、质量
|
||||
* @param metabolizeHeat
|
||||
* @return
|
||||
*/
|
||||
public static Integer[][] calculateNutritionHeatAndQuality(int metabolizeHeat){
|
||||
Integer[] heatArray = new Integer[3];
|
||||
Integer[] qualityArray = new Integer[3];
|
||||
heatArray[0] = Math.round(nutritionRate[0] * metabolizeHeat /100);
|
||||
heatArray[1] = Math.round(nutritionRate[1] * metabolizeHeat /100);
|
||||
heatArray[2] = Math.round(nutritionRate[2] * metabolizeHeat /100);
|
||||
qualityArray[0] = (int)Math.round(Double.parseDouble(heatArray[0]+"")/proteinHeat);
|
||||
qualityArray[1] = (int)Math.round(Double.parseDouble(heatArray[1]+"")/fatHeat);
|
||||
qualityArray[2] = (int)Math.round(Double.parseDouble(heatArray[2]+"")/carbonWaterHeat);
|
||||
Integer[][] result = {heatArray, qualityArray};
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -0,0 +1,17 @@
|
||||
package com.stdiet.common.utils;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
public class NumberUtils {
|
||||
|
||||
/**
|
||||
* 对double数字进行四舍五入,返回BigDecimal
|
||||
* @param number 数字
|
||||
* @param decimalPlaces 保留的小数点位数
|
||||
* @return
|
||||
*/
|
||||
public static BigDecimal getNumberByRoundHalfUp(double number, int decimalPlaces){
|
||||
return BigDecimal.valueOf(number).setScale(decimalPlaces, BigDecimal.ROUND_HALF_UP);
|
||||
}
|
||||
|
||||
}
|
@ -52,6 +52,15 @@ public class SysCustomerHeatStatistics extends BaseEntity
|
||||
//食材热量
|
||||
private Integer[] foodHeatList;
|
||||
|
||||
//食材蛋白质质量
|
||||
private Integer[] proteinQualityList;
|
||||
|
||||
//食材脂肪质量
|
||||
private Integer[] fatQualityList;
|
||||
|
||||
//食材碳水质量
|
||||
private Integer[] carbonWaterQualityList;
|
||||
|
||||
//具体食材集合
|
||||
private List<SysFoodHeatStatistics> foodHeatStatisticsList;
|
||||
}
|
@ -44,6 +44,18 @@ public class SysFoodHeatStatistics extends BaseEntity
|
||||
@Excel(name = "类型,0早 1中 2晚")
|
||||
private Integer edibleType;
|
||||
|
||||
/** 蛋白质质量,克 */
|
||||
@Excel(name = "蛋白质质量,克")
|
||||
private Integer proteinQuality;
|
||||
|
||||
/** 脂肪质量,克 */
|
||||
@Excel(name = "脂肪质量,克")
|
||||
private Integer fatQuality;
|
||||
|
||||
/** 碳水质量,克 */
|
||||
@Excel(name = "碳水质量,克")
|
||||
private Integer carbonWaterQuality;
|
||||
|
||||
/** 热量数值 */
|
||||
@Excel(name = "热量数值")
|
||||
private Integer heatValue;
|
||||
|
@ -0,0 +1,72 @@
|
||||
package com.stdiet.custom.dto.response;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
@Data
|
||||
public class NutritionalCalories implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
//姓名
|
||||
public String name;
|
||||
|
||||
//实际体重(斤)
|
||||
public double weight;
|
||||
|
||||
//实际身高(厘米)
|
||||
public int tall;
|
||||
|
||||
//年龄
|
||||
public int age;
|
||||
|
||||
//标准体重(斤)
|
||||
public double standardWeight;
|
||||
|
||||
//超重(斤)
|
||||
public double overWeight;
|
||||
|
||||
//活动因子
|
||||
public double activityFactor;
|
||||
|
||||
//基础代谢BMR(千卡)
|
||||
public int metabolizeHeat;
|
||||
|
||||
//减脂最大摄入量(千卡)
|
||||
public int maxIntakeHeat;
|
||||
|
||||
//不运动总热量(千卡)
|
||||
public int withoutExerciseHeat;
|
||||
|
||||
//运动总热量(千卡)
|
||||
public int exerciseHeat;
|
||||
|
||||
//每公斤体重占比(千卡/公斤)
|
||||
public double everyWeightHeat;
|
||||
|
||||
//目标范围(千卡/公斤)
|
||||
public double[] targetEveryWeightHeat;
|
||||
|
||||
//减脂热量标准范围(千卡/公斤)
|
||||
public double[] standardEveryWeightHeat;
|
||||
|
||||
//蛋白质、脂肪、碳水比例
|
||||
public Integer[] nutritionalRate;
|
||||
|
||||
//蛋白质、脂肪、碳水对应热量(千卡)
|
||||
public Integer[] nutritionalHeat;
|
||||
|
||||
//蛋白质、脂肪、碳水对应质量(克)
|
||||
public Integer[] nutritionalQuality;
|
||||
|
||||
//每公斤体重对应蛋白质、脂肪、碳水占比(克/公斤)
|
||||
public double[] weightNutritionalRate;
|
||||
|
||||
//蛋白质、脂肪、碳水已摄入热量(千卡)
|
||||
public Integer[] ingestedNutritionalHeat;
|
||||
|
||||
//蛋白质、脂肪、碳水剩余可摄入热量
|
||||
public Integer[] surplusNutritionalHeat;
|
||||
|
||||
}
|
@ -1,7 +1,10 @@
|
||||
package com.stdiet.custom.mapper;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import com.stdiet.custom.domain.SysCustomer;
|
||||
import com.stdiet.custom.domain.SysCustomerHeatStatistics;
|
||||
import com.stdiet.custom.dto.response.NutritionalCalories;
|
||||
|
||||
/**
|
||||
* 外食热量统计Mapper接口
|
||||
|
@ -2,6 +2,7 @@ package com.stdiet.custom.service;
|
||||
|
||||
import java.util.List;
|
||||
import com.stdiet.custom.domain.SysCustomerHeatStatistics;
|
||||
import com.stdiet.custom.dto.response.NutritionalCalories;
|
||||
|
||||
/**
|
||||
* 外食热量统计Service接口
|
||||
@ -65,4 +66,18 @@ public interface ISysCustomerHeatStatisticsService
|
||||
* @return
|
||||
*/
|
||||
public int calculateCustomerHeat(SysCustomerHeatStatistics sysCustomerHeatStatistics);
|
||||
|
||||
/**
|
||||
* 根据日期查询是否客户热量统计
|
||||
* @param sysCustomerHeatStatistics
|
||||
* @return
|
||||
*/
|
||||
SysCustomerHeatStatistics getCustomerHeatStatisticsByDate(SysCustomerHeatStatistics sysCustomerHeatStatistics);
|
||||
|
||||
/**
|
||||
* 根据客户热量食材统计ID查询详情
|
||||
* @param id
|
||||
* @return
|
||||
*/
|
||||
public NutritionalCalories getNutritionalCaloriesByCustomer(Long id);
|
||||
}
|
@ -1,14 +1,16 @@
|
||||
package com.stdiet.custom.service.impl;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.List;
|
||||
import com.stdiet.common.utils.DateUtils;
|
||||
import com.stdiet.common.utils.HealthyUtils;
|
||||
import com.stdiet.custom.domain.SysCustomerHealthy;
|
||||
import com.stdiet.custom.domain.SysCustomerPhysicalSigns;
|
||||
import com.stdiet.custom.domain.SysFoodHeatStatistics;
|
||||
import com.stdiet.custom.mapper.SysFoodHeatStatisticsMapper;
|
||||
import com.stdiet.custom.dto.response.NutritionalCalories;
|
||||
import com.stdiet.custom.service.ISysCustomerHealthyService;
|
||||
import com.stdiet.custom.service.ISysCustomerPhysicalSignsService;
|
||||
import com.stdiet.custom.service.ISysFoodHeatStatisticsService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import com.stdiet.custom.mapper.SysCustomerHeatStatisticsMapper;
|
||||
@ -30,7 +32,7 @@ public class SysCustomerHeatStatisticsServiceImpl implements ISysCustomerHeatSta
|
||||
private SysCustomerHeatStatisticsMapper sysCustomerHeatStatisticsMapper;
|
||||
|
||||
@Autowired
|
||||
private SysFoodHeatStatisticsMapper sysFoodHeatStatisticsMapper;
|
||||
private ISysFoodHeatStatisticsService sysFoodHeatStatisticsService;
|
||||
|
||||
@Autowired
|
||||
private ISysCustomerPhysicalSignsService sysCustomerPhysicalSignsService;
|
||||
@ -112,6 +114,15 @@ public class SysCustomerHeatStatisticsServiceImpl implements ISysCustomerHeatSta
|
||||
return sysCustomerHeatStatisticsMapper.deleteSysCustomerHeatStatisticsById(id);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据日期查询是否客户热量统计
|
||||
* @param sysCustomerHeatStatistics
|
||||
* @return
|
||||
*/
|
||||
public SysCustomerHeatStatistics getCustomerHeatStatisticsByDate(SysCustomerHeatStatistics sysCustomerHeatStatistics){
|
||||
return sysCustomerHeatStatisticsMapper.getCustomerHeatStatisticsByDate(sysCustomerHeatStatistics);
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新食材热量并计算当天总热量
|
||||
* @param sysCustomerHeatStatistics
|
||||
@ -121,34 +132,81 @@ public class SysCustomerHeatStatisticsServiceImpl implements ISysCustomerHeatSta
|
||||
public int calculateCustomerHeat(SysCustomerHeatStatistics sysCustomerHeatStatistics){
|
||||
Long[] foodHeatId = sysCustomerHeatStatistics.getFoodHeatIdList();
|
||||
Integer[] foodHeat = sysCustomerHeatStatistics.getFoodHeatList();
|
||||
if(foodHeatId != null && foodHeatId.length > 0 && foodHeat != null && foodHeat.length == foodHeatId.length){
|
||||
if(foodHeatId != null && foodHeatId.length > 0){
|
||||
SysFoodHeatStatistics sysFoodHeatStatistics = new SysFoodHeatStatistics();
|
||||
int totalHeatCalue = 0;
|
||||
for (int i = 0; i < foodHeatId.length; i++) {
|
||||
sysFoodHeatStatistics.setId(foodHeatId[i]);
|
||||
sysFoodHeatStatistics.setHeatValue(foodHeat[i]);
|
||||
sysFoodHeatStatisticsMapper.updateSysFoodHeatStatistics(sysFoodHeatStatistics);
|
||||
totalHeatCalue += foodHeat[i];
|
||||
sysFoodHeatStatistics.setProteinQuality(sysCustomerHeatStatistics.getProteinQualityList()[i]);
|
||||
sysFoodHeatStatistics.setFatQuality(sysCustomerHeatStatistics.getFatQualityList()[i]);
|
||||
sysFoodHeatStatistics.setCarbonWaterQuality(sysCustomerHeatStatistics.getCarbonWaterQualityList()[i]);
|
||||
//根据蛋白质、脂肪、碳水计算热量
|
||||
sysFoodHeatStatistics.setHeatValue(HealthyUtils.calculateTotalHeatByProteinFatCarbonWater(sysCustomerHeatStatistics.getProteinQualityList()[i],
|
||||
sysCustomerHeatStatistics.getFatQualityList()[i], sysCustomerHeatStatistics.getCarbonWaterQualityList()[i]));
|
||||
sysFoodHeatStatisticsService.updateSysFoodHeatStatistics(sysFoodHeatStatistics);
|
||||
totalHeatCalue += sysFoodHeatStatistics.getHeatValue();
|
||||
}
|
||||
sysCustomerHeatStatistics.setHeatValue(totalHeatCalue);
|
||||
Long maxHeatValue = getMaxHeatValue(sysCustomerHeatStatistics.getCustomerId());
|
||||
sysCustomerHeatStatistics.setMaxHeatValue(maxHeatValue.intValue());
|
||||
sysCustomerHeatStatistics.setHeatGap(maxHeatValue.intValue() - totalHeatCalue);
|
||||
sysCustomerHeatStatistics.setHeatGap(sysCustomerHeatStatistics.getMaxHeatValue() - totalHeatCalue);
|
||||
return sysCustomerHeatStatisticsMapper.updateSysCustomerHeatStatistics(sysCustomerHeatStatistics);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
public long getMaxHeatValue(Long customerId){
|
||||
/**
|
||||
* 根据客户热量食材统计ID查询详情
|
||||
* @param id
|
||||
* @return
|
||||
*/
|
||||
public NutritionalCalories getNutritionalCaloriesByCustomer(Long id){
|
||||
NutritionalCalories nutritionalCalories = new NutritionalCalories();
|
||||
SysCustomerHeatStatistics sysCustomerHeatStatistics = sysCustomerHeatStatisticsMapper.selectSysCustomerHeatStatisticsById(id);
|
||||
if(sysCustomerHeatStatistics != null){
|
||||
SysCustomerHealthy sysCustomerHealthy = getSysCustomerHealthy(sysCustomerHeatStatistics.getCustomerId());
|
||||
if(sysCustomerHealthy != null){
|
||||
nutritionalCalories.setName(sysCustomerHealthy.getName());
|
||||
nutritionalCalories.setAge(sysCustomerHealthy.getAge().intValue());
|
||||
nutritionalCalories.setTall(sysCustomerHealthy.getTall());
|
||||
nutritionalCalories.setWeight(sysCustomerHealthy.getWeight().doubleValue());
|
||||
nutritionalCalories.setStandardWeight(HealthyUtils.calculateStandardWeight(nutritionalCalories.getTall()));
|
||||
double overHeight = nutritionalCalories.getWeight() - nutritionalCalories.getStandardWeight();
|
||||
overHeight = overHeight > 0 ? overHeight : 0;
|
||||
nutritionalCalories.setOverWeight(overHeight);
|
||||
nutritionalCalories.setMetabolizeHeat(HealthyUtils.calculateMetabolizeHeat(nutritionalCalories.getAge(), nutritionalCalories.getTall(), nutritionalCalories.getWeight()).intValue());
|
||||
nutritionalCalories.setMaxIntakeHeat(sysCustomerHeatStatistics.getMaxHeatValue());
|
||||
nutritionalCalories.setEveryWeightHeat(HealthyUtils.calculateHeatRateByWeight(nutritionalCalories.getMetabolizeHeat(), nutritionalCalories.getWeight()));
|
||||
nutritionalCalories.setTargetEveryWeightHeat(HealthyUtils.calculateHeatTargetRate(nutritionalCalories.getEveryWeightHeat()));
|
||||
//nutritionalCalories.setStandardEveryWeightHeat(HealthyUtils.calculateHeatTargetRate() );
|
||||
nutritionalCalories.setNutritionalRate(HealthyUtils.nutritionRate);
|
||||
Integer[][] nutritionalHeatAndQuality = HealthyUtils.calculateNutritionHeatAndQuality(nutritionalCalories.getMetabolizeHeat());
|
||||
nutritionalCalories.setNutritionalHeat(nutritionalHeatAndQuality[0]);
|
||||
nutritionalCalories.setNutritionalQuality(nutritionalHeatAndQuality[1]);
|
||||
}
|
||||
}
|
||||
return nutritionalCalories;
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据用户ID查询该用户每天最大摄入量
|
||||
* @param customerId
|
||||
* @return
|
||||
*/
|
||||
private SysCustomerHealthy getSysCustomerHealthy(Long customerId){
|
||||
SysCustomerHealthy sysCustomerHealthy = sysCustomerHealthyService.selectSysCustomerHealthyByCustomerId(customerId);
|
||||
if(sysCustomerHealthy != null){
|
||||
return HealthyUtils.calculateMaxHeatEveryDay(sysCustomerHealthy.getAge().intValue(),sysCustomerHealthy.getTall(),sysCustomerHealthy.getWeight().doubleValue());
|
||||
return sysCustomerHealthy;
|
||||
}
|
||||
//查询体征信息
|
||||
SysCustomerPhysicalSigns sysCustomerPhysicalSigns = sysCustomerPhysicalSignsService.selectSysCustomerPhysicalSignsByCusId(customerId);
|
||||
if(sysCustomerPhysicalSigns != null){
|
||||
return HealthyUtils.calculateMaxHeatEveryDay(sysCustomerPhysicalSigns.getAge().intValue(),sysCustomerPhysicalSigns.getTall(),sysCustomerPhysicalSigns.getWeight().doubleValue());
|
||||
sysCustomerHealthy = new SysCustomerHealthy();
|
||||
sysCustomerHealthy.setName(sysCustomerPhysicalSigns.getName());
|
||||
sysCustomerHealthy.setTall(sysCustomerPhysicalSigns.getTall());
|
||||
sysCustomerHealthy.setAge(sysCustomerPhysicalSigns.getAge().longValue());
|
||||
sysCustomerHealthy.setWeight(BigDecimal.valueOf(sysCustomerPhysicalSigns.getWeight()));
|
||||
}
|
||||
return 0;
|
||||
return sysCustomerHealthy;
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -1,17 +1,19 @@
|
||||
package com.stdiet.custom.service.impl;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.*;
|
||||
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.stdiet.common.utils.DateUtils;
|
||||
import com.stdiet.common.utils.HealthyUtils;
|
||||
import com.stdiet.common.utils.StringUtils;
|
||||
import com.stdiet.common.utils.sign.AesUtils;
|
||||
import com.stdiet.custom.domain.SysCustomerHealthy;
|
||||
import com.stdiet.custom.domain.SysCustomerHeatStatistics;
|
||||
import com.stdiet.custom.domain.SysCustomerPhysicalSigns;
|
||||
import com.stdiet.custom.dto.request.FoodHeatCalculatorRequest;
|
||||
import com.stdiet.custom.mapper.SysCustomerHeatStatisticsMapper;
|
||||
import com.stdiet.custom.service.ISysCustomerHealthyService;
|
||||
import com.stdiet.custom.service.ISysCustomerHeatStatisticsService;
|
||||
import com.stdiet.custom.service.ISysCustomerPhysicalSignsService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import com.stdiet.custom.mapper.SysFoodHeatStatisticsMapper;
|
||||
@ -19,6 +21,8 @@ import com.stdiet.custom.domain.SysFoodHeatStatistics;
|
||||
import com.stdiet.custom.service.ISysFoodHeatStatisticsService;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import javax.xml.crypto.Data;
|
||||
|
||||
/**
|
||||
* 外食热量统计Service业务层处理
|
||||
*
|
||||
@ -33,7 +37,13 @@ public class SysFoodHeatStatisticsServiceImpl implements ISysFoodHeatStatisticsS
|
||||
private SysFoodHeatStatisticsMapper sysFoodHeatStatisticsMapper;
|
||||
|
||||
@Autowired
|
||||
private SysCustomerHeatStatisticsMapper sysCustomerHeatStatisticsMapper;
|
||||
private ISysCustomerHeatStatisticsService sysCustomerHeatStatisticsService;
|
||||
|
||||
@Autowired
|
||||
private ISysCustomerPhysicalSignsService sysCustomerPhysicalSignsService;
|
||||
|
||||
@Autowired
|
||||
private ISysCustomerHealthyService sysCustomerHealthyService;
|
||||
|
||||
/**
|
||||
* 查询外食热量统计
|
||||
@ -118,29 +128,67 @@ public class SysFoodHeatStatisticsServiceImpl implements ISysFoodHeatStatisticsS
|
||||
public int addMuchFoodHeat(FoodHeatCalculatorRequest foodHeatCalculatorRequest){
|
||||
//客户ID解密
|
||||
String customerId = StringUtils.isNotEmpty(foodHeatCalculatorRequest.getCustomerEncId()) ? AesUtils.decrypt(foodHeatCalculatorRequest.getCustomerEncId(), null) : "";
|
||||
if(StringUtils.isEmpty(customerId)){
|
||||
if(StringUtils.isEmpty(customerId) || StringUtils.isEmpty(foodHeatCalculatorRequest.getIngredientArray())){
|
||||
return 0;
|
||||
}
|
||||
//先判断该日期下是否已存在
|
||||
SysCustomerHeatStatistics sysCustomerHeatStatistics = new SysCustomerHeatStatistics();
|
||||
sysCustomerHeatStatistics.setCustomerId(Long.parseLong(customerId));
|
||||
sysCustomerHeatStatistics.setEdibleDate(new Date());
|
||||
SysCustomerHeatStatistics customerHeatResult = sysCustomerHeatStatisticsMapper.getCustomerHeatStatisticsByDate(sysCustomerHeatStatistics);
|
||||
if(customerHeatResult == null){
|
||||
sysCustomerHeatStatisticsMapper.insertSysCustomerHeatStatistics(sysCustomerHeatStatistics);
|
||||
}else{
|
||||
sysCustomerHeatStatistics.setId(customerHeatResult.getId());
|
||||
List<HashMap> foodHeatList = JSON.parseArray(foodHeatCalculatorRequest.getIngredientArray(), HashMap.class);
|
||||
if(foodHeatList == null || foodHeatList.size() == 0){
|
||||
return 0;
|
||||
}
|
||||
if(sysCustomerHeatStatistics.getId() != null){
|
||||
List<SysFoodHeatStatistics> list = new ArrayList<>();
|
||||
if(StringUtils.isNotEmpty(foodHeatCalculatorRequest.getIngredientArray())){
|
||||
List<HashMap> foodHeatList = JSON.parseArray(foodHeatCalculatorRequest.getIngredientArray(), HashMap.class);
|
||||
for(HashMap map : foodHeatList){
|
||||
map.put("customerHeatId", sysCustomerHeatStatistics.getId());
|
||||
}
|
||||
return sysFoodHeatStatisticsMapper.insertFoodHeatBatch(foodHeatList);
|
||||
Map<String, List<HashMap>> dateFoodMap = new HashMap<>();
|
||||
//根据日期分类
|
||||
for(HashMap map : foodHeatList){
|
||||
String edibleDate = map.get("edibleDate").toString();
|
||||
if(dateFoodMap.containsKey(edibleDate)){
|
||||
dateFoodMap.get(edibleDate).add(map);
|
||||
}else{
|
||||
List<HashMap> list = new ArrayList<>();
|
||||
list.add(map);
|
||||
dateFoodMap.put(edibleDate, list);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
int row = 0;
|
||||
int maxHeatValue = getMaxHeatValue(Long.parseLong(customerId)).intValue();
|
||||
for (String dateKey : dateFoodMap.keySet()) {
|
||||
//先判断该日期下是否已存在
|
||||
SysCustomerHeatStatistics sysCustomerHeatStatistics = new SysCustomerHeatStatistics();
|
||||
sysCustomerHeatStatistics.setCustomerId(Long.parseLong(customerId));
|
||||
sysCustomerHeatStatistics.setEdibleDate(DateUtils.parseDate(dateKey));
|
||||
SysCustomerHeatStatistics customerHeatResult = sysCustomerHeatStatisticsService.getCustomerHeatStatisticsByDate(sysCustomerHeatStatistics);
|
||||
if(customerHeatResult == null){
|
||||
sysCustomerHeatStatistics.setMaxHeatValue(maxHeatValue);
|
||||
sysCustomerHeatStatisticsService.insertSysCustomerHeatStatistics(sysCustomerHeatStatistics);
|
||||
}else{
|
||||
sysCustomerHeatStatistics.setId(customerHeatResult.getId());
|
||||
}
|
||||
if(sysCustomerHeatStatistics.getId() != null){
|
||||
for(HashMap map : dateFoodMap.get(dateKey)){
|
||||
map.put("customerHeatId", sysCustomerHeatStatistics.getId());
|
||||
map.put("number", map.get("number") != null && "".equals(map.get("number").toString().trim()) ? null : map.get("number"));
|
||||
map.put("unit", map.get("unit") != null && "".equals(map.get("unit").toString().trim()) ? null : map.get("unit"));
|
||||
map.put("quantity", map.get("quantity") != null && "".equals(map.get("quantity").toString().trim()) ? null : map.get("quantity"));
|
||||
}
|
||||
row = sysFoodHeatStatisticsMapper.insertFoodHeatBatch(dateFoodMap.get(dateKey));
|
||||
}
|
||||
}
|
||||
return row;
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据用户ID查询该用户每天最大摄入量
|
||||
* @param customerId
|
||||
* @return
|
||||
*/
|
||||
private Long getMaxHeatValue(Long customerId){
|
||||
SysCustomerHealthy sysCustomerHealthy = sysCustomerHealthyService.selectSysCustomerHealthyByCustomerId(customerId);
|
||||
if(sysCustomerHealthy != null){
|
||||
return HealthyUtils.calculateMaxHeatEveryDay(sysCustomerHealthy.getAge().intValue(),sysCustomerHealthy.getTall(),sysCustomerHealthy.getWeight().doubleValue());
|
||||
}
|
||||
//查询体征信息
|
||||
SysCustomerPhysicalSigns sysCustomerPhysicalSigns = sysCustomerPhysicalSignsService.selectSysCustomerPhysicalSignsByCusId(customerId);
|
||||
if(sysCustomerPhysicalSigns != null){
|
||||
return HealthyUtils.calculateMaxHeatEveryDay(sysCustomerPhysicalSigns.getAge().intValue(),sysCustomerPhysicalSigns.getTall(),sysCustomerPhysicalSigns.getWeight().doubleValue());
|
||||
}
|
||||
return 0L;
|
||||
}
|
||||
}
|
@ -124,7 +124,10 @@
|
||||
<result property="number" column="number" />
|
||||
<result property="quantity" column="quantity" />
|
||||
<result property="edibleType" column="edible_type" />
|
||||
<result property="proteinQuality" column="protein_quality" />
|
||||
<result property="heatValue" column="heat_value" />
|
||||
<result property="fatQuality" column="fat_quality" />
|
||||
<result property="carbonWaterQuality" column="carbon_water_quality" />
|
||||
<result property="createTime" column="create_time" />
|
||||
<result property="createBy" column="create_by" />
|
||||
<result property="updateTime" column="update_time" />
|
||||
@ -135,7 +138,7 @@
|
||||
</resultMap>
|
||||
|
||||
<select id="selectSysFoodHeatStatisticsList" parameterType="Long" resultMap="SysFoodHeatStatisticsResult">
|
||||
select sfhs.id, sfhs.customer_heat_id, sfhs.ingredient, sfhs.unit, sfhs.number, sfhs.quantity, sfhs.edible_type, sfhs.heat_value,cusUnit.dict_label as unitName
|
||||
select sfhs.id, sfhs.customer_heat_id, sfhs.ingredient, sfhs.unit, sfhs.number, sfhs.quantity, sfhs.edible_type, sfhs.protein_quality, sfhs.fat_quality, sfhs.carbon_water_quality,sfhs.heat_value,cusUnit.dict_label as unitName
|
||||
from sys_food_heat_statistics as sfhs
|
||||
LEFT JOIN (SELECT dict_label, dict_value FROM sys_dict_data WHERE dict_type = 'cus_cus_unit') AS cusUnit ON cusUnit.dict_value = sfhs.unit
|
||||
where sfhs.del_flag = 0 and customer_heat_id = #{id}
|
||||
|
@ -12,7 +12,10 @@
|
||||
<result property="number" column="number" />
|
||||
<result property="quantity" column="quantity" />
|
||||
<result property="edibleType" column="edible_type" />
|
||||
<result property="proteinQuality" column="protein_quality" />
|
||||
<result property="heatValue" column="heat_value" />
|
||||
<result property="fatQuality" column="fat_quality" />
|
||||
<result property="carbonWaterQuality" column="carbon_water_quality" />
|
||||
<result property="createTime" column="create_time" />
|
||||
<result property="createBy" column="create_by" />
|
||||
<result property="updateTime" column="update_time" />
|
||||
@ -23,11 +26,11 @@
|
||||
</resultMap>
|
||||
|
||||
<sql id="selectSysFoodHeatStatisticsVo">
|
||||
select id, customer_heat_id, ingredient, unit, number, quantity, edible_type, heat_value, create_time, create_by, update_time, update_by, del_flag from sys_food_heat_statistics
|
||||
select id, customer_heat_id, ingredient, unit, number, quantity, edible_type, protein_quality, heat_value, fat_quality, carbon_water_quality,create_time, create_by, update_time, update_by, del_flag from sys_food_heat_statistics
|
||||
</sql>
|
||||
|
||||
<select id="selectSysFoodHeatStatisticsList" parameterType="SysFoodHeatStatistics" resultMap="SysFoodHeatStatisticsResult">
|
||||
select sfhs.id, sfhs.customer_heat_id, sfhs.ingredient, sfhs.unit, sfhs.number, sfhs.quantity, sfhs.edible_type, sfhs.heat_value,cusUnit.dict_label as unitName
|
||||
select sfhs.id, sfhs.customer_heat_id, sfhs.ingredient, sfhs.unit, sfhs.number, sfhs.quantity, sfhs.edible_type, sfhs.protein_quality, sfhs.fat_quality, sfhs.carbon_water_quality,sfhs.heat_value,cusUnit.dict_label as unitName
|
||||
from sys_food_heat_statistics as sfhs
|
||||
LEFT JOIN (SELECT dict_label, dict_value FROM sys_dict_data WHERE dict_type = 'cus_cus_unit') AS cusUnit ON cusUnit.dict_value = sfhs.unit
|
||||
where sfhs.del_flag = 0
|
||||
@ -47,7 +50,10 @@
|
||||
<if test="number != null">number,</if>
|
||||
<if test="quantity != null">quantity,</if>
|
||||
<if test="edibleType != null">edible_type,</if>
|
||||
<if test="proteinQuality != null">protein_quality,</if>
|
||||
<if test="heatValue != null">heat_value,</if>
|
||||
<if test="fatQuality != null">fat_quality,</if>
|
||||
<if test="carbonWaterQuality != null">carbon_water_quality,</if>
|
||||
<if test="createTime != null">create_time,</if>
|
||||
<if test="createBy != null">create_by,</if>
|
||||
<if test="updateTime != null">update_time,</if>
|
||||
@ -61,7 +67,10 @@
|
||||
<if test="number != null">#{number},</if>
|
||||
<if test="quantity != null">#{quantity},</if>
|
||||
<if test="edibleType != null">#{edibleType},</if>
|
||||
<if test="proteinQuality != null">#{proteinQuality},</if>
|
||||
<if test="heatValue != null">#{heatValue},</if>
|
||||
<if test="fatQuality != null">#{fatQuality},</if>
|
||||
<if test="carbonWaterQuality != null">#{carbonWaterQuality},</if>
|
||||
<if test="createTime != null">#{createTime},</if>
|
||||
<if test="createBy != null">#{createBy},</if>
|
||||
<if test="updateTime != null">#{updateTime},</if>
|
||||
@ -79,7 +88,10 @@
|
||||
<if test="number != null">number = #{number},</if>
|
||||
<if test="quantity != null">quantity = #{quantity},</if>
|
||||
<if test="edibleType != null">edible_type = #{edibleType},</if>
|
||||
<if test="proteinQuality != null">protein_quality = #{proteinQuality},</if>
|
||||
<if test="heatValue != null">heat_value = #{heatValue},</if>
|
||||
<if test="fatQuality != null">fat_quality = #{fatQuality},</if>
|
||||
<if test="carbonWaterQuality != null">carbon_water_quality = #{carbonWaterQuality},</if>
|
||||
<if test="createTime != null">create_time = #{createTime},</if>
|
||||
<if test="createBy != null">create_by = #{createBy},</if>
|
||||
<if test="updateTime != null">update_time = #{updateTime},</if>
|
||||
|
@ -1,13 +1,18 @@
|
||||
<template>
|
||||
<!-- 计算食材热量对话框 -->
|
||||
<el-dialog :title="title" :visible.sync="open" width="750px" append-to-body>
|
||||
<el-dialog :title="title" :visible.sync="open" width="1000px" append-to-body>
|
||||
<el-form ref="form" :model="form" label-position="top" :rules="rules" label-width="100px">
|
||||
|
||||
<el-form-item v-for="(item,index) in foodHeatList" label="" class="margin-left">
|
||||
<div>
|
||||
<span>食材名称:</span><el-input style="width:30%" placeholder="" :readonly="true" :value="item.ingredient"/>
|
||||
<span style="margin-left: 10px">份量:</span><el-input style="width:25%" placeholder="" :readonly="true" :value="getNumberString(item)"/>
|
||||
<span style="margin-left: 10px">热量:</span><el-input style="width:15%" type="number" placeholder="" v-model="item.heatValue"/><span>千卡</span>
|
||||
<span>食材名称:</span><el-input style="width:20%" placeholder="" :readonly="true" :value="item.ingredient"/>
|
||||
<span style="margin-left: 10px">份量:</span><el-input style="width:20%" placeholder="" :readonly="true" :value="getNumberString(item)"/>
|
||||
<!--<span style="margin-left: 10px">热量:</span><el-input style="width:15%" type="number" placeholder="" v-model="item.heatValue"/><span>千卡</span>-->
|
||||
<span style="margin-left: 10px">蛋白质/脂肪/碳水:</span>
|
||||
<el-input style="width:10%" placeholder="" v-model="item.proteinQuality"/>
|
||||
<el-input style="width:10%;margin-left: 5px" placeholder="" v-model="item.fatQuality"/>
|
||||
<el-input style="width:10%;margin-left: 5px" placeholder="" v-model="item.carbonWaterQuality"/>
|
||||
<span style="margin-left: 5px">克</span>
|
||||
</div>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
@ -29,6 +34,7 @@
|
||||
},
|
||||
props: {},
|
||||
data() {
|
||||
|
||||
return {
|
||||
// 弹出层标题
|
||||
title: "",
|
||||
@ -62,7 +68,7 @@
|
||||
getFoodHeatStatistics(id).then((response) => {
|
||||
//let contractDetail = response.data;
|
||||
this.heatData = response.data;
|
||||
this.foodHeatList = response.data.foodHeatStatisticsList != null ? response.data.foodHeatStatisticsList : [];
|
||||
this.foodHeatList = response.data.foodHeatStatisticsList != null ? response.data.foodHeatStatisticsList : [];
|
||||
});
|
||||
},
|
||||
getNumberString(foodData){
|
||||
@ -87,23 +93,34 @@
|
||||
},
|
||||
/** 提交按钮 */
|
||||
submitForm() {
|
||||
var reg = /^([1-9]\d*|[0]{1,1})$/;
|
||||
if(this.foodHeatList.length == 0){
|
||||
return;
|
||||
}
|
||||
let obj = {};
|
||||
obj.foodHeatIdList = [];
|
||||
obj.foodHeatList = [];
|
||||
obj.id = this.heatData.id;
|
||||
obj.customerId = this.heatData.customerId;
|
||||
obj.maxHeatValue = this.heatData.maxHeatValue;
|
||||
obj.foodHeatIdList = [];
|
||||
obj.proteinQualityList = [];
|
||||
obj.fatQualityList = [];
|
||||
obj.carbonWaterQualityList = [];
|
||||
let verifyFlag = true;
|
||||
this.foodHeatList.forEach((item,index) => {
|
||||
obj.foodHeatIdList.push(item.id);
|
||||
if(!/^[1-9]\d*$/.test(item.heatValue)){
|
||||
obj.foodHeatList.push(0);
|
||||
if(!reg.test(item.proteinQuality) || !reg.test(item.fatQuality) || !reg.test(item.carbonWaterQuality)){
|
||||
verifyFlag = false;
|
||||
}else{
|
||||
obj.foodHeatList.push(item.heatValue);
|
||||
obj.proteinQualityList.push(item.proteinQuality);
|
||||
obj.fatQualityList.push(item.fatQuality);
|
||||
obj.carbonWaterQualityList.push(item.carbonWaterQuality);
|
||||
}
|
||||
});
|
||||
console.log(obj.foodHeatIdList.length);
|
||||
if(!verifyFlag){
|
||||
this.$message({message: "填写的数值格式错误", type: "warning"});
|
||||
return;
|
||||
}
|
||||
//console.log(obj.foodHeatIdList.length);
|
||||
addFoodHeatData(obj).then(response => {
|
||||
if (response.code === 200) {
|
||||
this.msgSuccess("提交成功");
|
||||
|
@ -27,7 +27,7 @@
|
||||
</el-table-column>
|
||||
<el-table-column label="质量(克)" align="center" prop="quantity" />-->
|
||||
|
||||
<el-table-column label="最大摄入量" align="center" prop="maxHeatValue" />
|
||||
<el-table-column label="可摄入量" align="center" prop="maxHeatValue" />
|
||||
<el-table-column label="食材热量" align="center" prop="heatValue" />
|
||||
<el-table-column label="热量缺口" align="center" prop="heatGap" />
|
||||
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
|
||||
|
@ -35,6 +35,16 @@
|
||||
</el-tag>
|
||||
</el-form-item>
|
||||
<div>
|
||||
<el-form-item label="日期" prop="edibleDate">
|
||||
<el-date-picker
|
||||
v-model="form.edibleDate"
|
||||
type="date"
|
||||
format="yyyy-MM-dd"
|
||||
value-format="yyyy-MM-dd"
|
||||
:picker-options="pickerOptions"
|
||||
placeholder="选择日期">
|
||||
</el-date-picker>
|
||||
</el-form-item>
|
||||
<el-form-item label="食材名称" prop="ingredient">
|
||||
<el-input v-model="form.ingredient" placeholder="请输入食材名称" maxlength="20"/>
|
||||
</el-form-item>
|
||||
@ -64,6 +74,8 @@
|
||||
</template>
|
||||
<script>
|
||||
import { getDictData,getCustomerBaseMessage,addFoodHeatStatistics } from "@/api/custom/customerInvestigation";
|
||||
import dayjs from "dayjs";
|
||||
const nowDate = dayjs().format("YYYY-MM-DD");
|
||||
const logo = require("@/assets/logo/st_logo.png");
|
||||
export default {
|
||||
name: "index",
|
||||
@ -93,6 +105,7 @@
|
||||
phone: null
|
||||
},
|
||||
form: {
|
||||
edibleDate: nowDate,
|
||||
ingredient: null,
|
||||
number: null,
|
||||
unit: null,
|
||||
@ -100,9 +113,7 @@
|
||||
},
|
||||
rules: {
|
||||
ingredient: [{ required: true, trigger: "blur", message: "请输入食材名称" }],
|
||||
/*numberUnit: [
|
||||
{ required: false, trigger: "blur", validator: checkNumberUnit }
|
||||
],*/
|
||||
edibleDate: [{ required: true, trigger: "blur", message: "请选择日期" }]
|
||||
},
|
||||
ingredientTagArray:[
|
||||
|
||||
@ -111,7 +122,12 @@
|
||||
|
||||
],
|
||||
//通俗计量单位
|
||||
cusUnitOptions:[]
|
||||
cusUnitOptions:[],
|
||||
pickerOptions: {
|
||||
disabledDate(time) {
|
||||
return time.getTime() > Date.now();
|
||||
},
|
||||
},
|
||||
};
|
||||
},
|
||||
components: {
|
||||
@ -158,8 +174,9 @@
|
||||
});
|
||||
},
|
||||
verify(){
|
||||
var reg = /^([1-9]\d*|[0]{1,1})$/;
|
||||
if(this.form.number != null && this.form.number != ""){
|
||||
if(!/^[1-9]\d*$/.test(this.form.number+"")){
|
||||
if(!reg.test(this.form.number+"")){
|
||||
this.$message({message: "通俗计量的数量格式错误", type: "warning"});
|
||||
return false;
|
||||
}
|
||||
@ -168,7 +185,7 @@
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if(this.form.quantity != null && this.form.quantity != "" && !/^[1-9]\d*$/.test(this.form.quantity)){
|
||||
if(this.form.quantity != null && this.form.quantity != "" && !reg.test(this.form.quantity)){
|
||||
this.$message({message: "重量格式错误", type: "warning"});
|
||||
return false;
|
||||
}
|
||||
@ -180,6 +197,7 @@
|
||||
},
|
||||
reset(){
|
||||
this.form = {
|
||||
edibleDate: nowDate,
|
||||
ingredient: null,
|
||||
number: null,
|
||||
unit: null,
|
||||
@ -192,13 +210,15 @@
|
||||
submit(){
|
||||
if (this.submitFlag) {
|
||||
this.$message({
|
||||
message: "请勿频繁提交,1分钟后重试",
|
||||
message: "请勿频繁提交,一分钟后重试",
|
||||
type: "warning",
|
||||
});
|
||||
return;
|
||||
}
|
||||
this.timer = setTimeout(this.againSumbit,1000*60);
|
||||
if(this.form.ingredient && this.verify() && this.ingredientTagArray.indexOf(this.form.ingredient.trim()) == -1){
|
||||
if(this.form.ingredient && this.ingredientTagArray.indexOf(this.form.ingredient.trim()) == -1){
|
||||
if(!this.verify()){
|
||||
return;
|
||||
}
|
||||
this.ingredientArray.push(this.form);
|
||||
this.ingredientTagArray.push(this.form.ingredient);
|
||||
this.reset();
|
||||
@ -207,6 +227,7 @@
|
||||
this.$message({message: "还未添加食材数据,无法提交", type: "warning"});
|
||||
return;
|
||||
}
|
||||
this.timer = setTimeout(this.againSumbit,1000*60);
|
||||
let submitObject = {};
|
||||
submitObject.ingredientArray = JSON.stringify(this.ingredientArray);
|
||||
submitObject.customerEncId = this.customer.customerEncId;
|
||||
|
Loading…
x
Reference in New Issue
Block a user