每道菜的价格

This commit is contained in:
qjq
2024-04-16 15:00:00 +08:00
parent a57a7d6e93
commit 23bb203d36
50 changed files with 2022 additions and 77 deletions

View File

@ -1,33 +1,35 @@
package cn.iocoder.yudao.module.member.controller.admin.carteenmoney;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
import cn.iocoder.yudao.module.member.controller.admin.carteenmoney.vo.CarteenMoneyPageReqVO;
import cn.iocoder.yudao.module.member.controller.admin.carteenmoney.vo.CarteenMoneyRespVO;
import cn.iocoder.yudao.module.member.controller.admin.carteenmoney.vo.CarteenMoneySaveReqVO;
import cn.iocoder.yudao.module.member.controller.admin.carteenmoney.vo.DeviceMoneyPageReqVO;
import cn.iocoder.yudao.module.member.controller.admin.carteenmoney.vo.DeviceMoneyRespVO;
import cn.iocoder.yudao.module.member.dal.dataobject.carteenmoney.CarteenMoneyDO;
import cn.iocoder.yudao.module.member.service.carteenmoney.CarteenMoneyService;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.*;
import javax.servlet.http.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.IOException;
import java.util.List;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.*;
import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
@Tag(name = "管理后台 - 门店流水")
@ -93,4 +95,13 @@ public class CarteenMoneyController {
BeanUtils.toBean(list, CarteenMoneyRespVO.class));
}
@GetMapping("/device/money")
@Operation(summary = "获得门店设备流水")
@PreAuthorize("@ss.hasPermission('t:carteen-money:query')")
public CommonResult<DeviceMoneyRespVO> getCarteenMoneyDevicePage(@Valid DeviceMoneyPageReqVO pageReqVO) {
return success(carteenMoneyService.getCarteenMoneyDevice(pageReqVO));
}
}

View File

@ -0,0 +1,23 @@
package cn.iocoder.yudao.module.member.controller.admin.carteenmoney.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 门店设备流水 Request VO")
@Data
@ToString(callSuper = true)
public class DeviceMoneyPageReqVO {
@Schema(description = "门店id", example = "927")
private Long carteenId;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}

View File

@ -0,0 +1,24 @@
package cn.iocoder.yudao.module.member.controller.admin.carteenmoney.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.ToString;
import java.util.ArrayList;
import java.util.List;
@Schema(description = "管理后台 - 门店设备流水 Request VO")
@Data
@ToString(callSuper = true)
public class DeviceMoneyRespVO {
@Schema(description = "门店id", example = "927")
private Long id;
@Schema(description = "门店名称", example = "真好吃")
private String storesName;
@Schema(description = "门店电话", example = "真好吃")
private String storeAddress;
@Schema(description = "联系电话")
private String phone;
@Schema(description = "门店设备流水详细")
private List<DeviceRespVO> deviceRespVOList =new ArrayList<>();
}

View File

@ -0,0 +1,26 @@
package cn.iocoder.yudao.module.member.controller.admin.carteenmoney.vo;
import cn.iocoder.yudao.module.system.api.dish.dto.DishesRespDto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.ToString;
import java.math.BigDecimal;
import java.util.List;
@Schema(description = "管理后台 - 设备流水 Request VO")
@Data
@ToString(callSuper = true)
public class DeviceRespVO {
@Schema(description = "设备ip", example = "172.0.0.1")
private String deviceIp;
@Schema(description = "设备流水", example = "13264")
private BigDecimal money;
@Schema(description = "时间段", example = "早上")
private String time;
/**
* 预留,设备热门菜品
*/
@Schema(description = "设备热门菜品")
private List<DishesRespDto> dishesRespDtoList;
}

View File

@ -62,4 +62,8 @@ public class OrderDetailDO extends BaseDO {
* 设备ip
*/
private String sn;
/**
* 菜品价格
*/
private BigDecimal price;
}

View File

@ -0,0 +1,104 @@
package cn.iocoder.yudao.module.member.job;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler;
import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
import cn.iocoder.yudao.module.member.dal.dataobject.orderdetail.OrderDetailDO;
import cn.iocoder.yudao.module.member.dal.mysql.orderdetail.OrderDetailMapper;
import cn.iocoder.yudao.module.member.enums.TimePeriodEnum;
import cn.iocoder.yudao.module.system.api.DeviceMoney.DeviceMoneyApi;
import cn.iocoder.yudao.module.system.api.DeviceMoney.dto.DeviceMoneyDto;
import cn.iocoder.yudao.module.system.api.carteen.CarteenApi;
import cn.iocoder.yudao.module.system.api.carteen.dto.CarteenRespDto;
import cn.iocoder.yudao.module.system.api.deviceInfo.DeviceInfoApi;
import cn.iocoder.yudao.module.system.api.deviceInfo.dto.DeviceInfoDto;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
/**
* @Author:qjq 每日统计设备流水金额
* @Date:2024/4/15 上午9:59
*/
@Slf4j
@Component
public class DeviceMoneyJob implements JobHandler {
@Resource
private CarteenApi carteenApi;
@Resource
private OrderDetailMapper orderDetailMapper;
@Resource
private DeviceInfoApi deviceInfoApi;
@Resource
private DeviceMoneyApi deviceMoneyApi;
/**
* 执行任务
*
* @param param 参数
* @return 结果
* @throws Exception 异常
*/
@Override
@TenantIgnore
public String execute(String param) throws Exception {
//获取昨天时间
LocalDateTime offset = LocalDateTimeUtil.offset(LocalDateTime.now(), -1, ChronoUnit.DAYS);
//获取昨天开始时间
LocalDateTime startTime = LocalDateTimeUtil.beginOfDay(offset);
LocalDateTime endTime = LocalDateTimeUtil.endOfDay(offset);
//获取门店信息
List<CarteenRespDto> car = carteenApi.getCarteenList();
for (CarteenRespDto dto : car) {
int i=0;
//获取门店下的设备
List<String> ips = deviceInfoApi.getDeviceInfoList(dto.getId()).stream()
.map(DeviceInfoDto::getDeviceIp)
.filter(Objects::nonNull)
.collect(Collectors.toList());
if(ObjectUtil.isNotEmpty(ips)){
//获取设备营业数据
List<OrderDetailDO> dos = orderDetailMapper.selectList(new LambdaQueryWrapperX<OrderDetailDO>()
.in(OrderDetailDO::getSn, ips)
.betweenIfPresent(OrderDetailDO::getCreateTime, startTime, endTime));
if(ObjectUtil.isNotEmpty(dos)){
//根据设备分组
Map<String, List<OrderDetailDO>> collect = dos.stream().collect(Collectors.groupingBy(OrderDetailDO::getSn));
for (Map.Entry<String, List<OrderDetailDO>> map : collect.entrySet()) {
DeviceMoneyDto bean = BeanUtil.toBean(dto, DeviceMoneyDto.class);
bean.setCarteenId(dto.getId());
List<OrderDetailDO> value = map.getValue();
//设置设备ip
bean.setDeviceIp(map.getKey());
//根据时间进行时间段赋值
value.forEach(v -> v.setCreator(TimePeriodEnum.getTimePeriod(v.getCreateTime())));
//根据时间段分组
value.stream().collect(Collectors.groupingBy(OrderDetailDO::getCreator))
.forEach((k, v) -> {
//根据时间段进行金额统计
BigDecimal sum = v.stream()
.map(OrderDetailDO::getPrice)
.filter(ObjectUtil::isNotEmpty)
.reduce(BigDecimal.ZERO, BigDecimal::add);
bean.setTimePeriod(k);
bean.setMoney(sum);
});
i+= deviceMoneyApi.insertDeviceMoney(bean);
}
}
}
log.info("[execute][定时插入门店设备流水数据成功 {} 条数据]",i);
}
return String.format("定时插入统计营业数据是否成功 %s ", true);
}
}

View File

@ -3,9 +3,11 @@ package cn.iocoder.yudao.module.member.service.carteenmoney;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.member.controller.admin.carteenmoney.vo.CarteenMoneyPageReqVO;
import cn.iocoder.yudao.module.member.controller.admin.carteenmoney.vo.CarteenMoneySaveReqVO;
import cn.iocoder.yudao.module.member.controller.admin.carteenmoney.vo.DeviceMoneyPageReqVO;
import cn.iocoder.yudao.module.member.controller.admin.carteenmoney.vo.DeviceMoneyRespVO;
import cn.iocoder.yudao.module.member.dal.dataobject.carteenmoney.CarteenMoneyDO;
import javax.validation.*;
import javax.validation.Valid;
/**
* 门店流水 Service 接口
@ -47,9 +49,19 @@ public interface CarteenMoneyService {
/**
* 获得门店流水分页
*
*
*
*
*
* @param pageReqVO 分页查询
* @return 门店流水分页
*/
PageResult<CarteenMoneyDO> getCarteenMoneyPage(CarteenMoneyPageReqVO pageReqVO);
/**
* @Description: 获取门店下面的设备流水
* @Author: qjq
* @Date: 2024/4/12 下午3:15
* @return
*/
DeviceMoneyRespVO getCarteenMoneyDevice(DeviceMoneyPageReqVO reqVO);
}

View File

@ -1,31 +1,33 @@
package cn.iocoder.yudao.module.member.service.carteenmoney;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.member.controller.admin.carteenmoney.vo.CarteenMoneyPageReqVO;
import cn.iocoder.yudao.module.member.controller.admin.carteenmoney.vo.CarteenMoneySaveReqVO;
import cn.iocoder.yudao.module.member.controller.admin.carteenmoney.vo.*;
import cn.iocoder.yudao.module.member.dal.dataobject.carteenmoney.CarteenMoneyDO;
import cn.iocoder.yudao.module.member.dal.dataobject.order.DishOrderDO;
import cn.iocoder.yudao.module.member.dal.dataobject.orderdetail.OrderDetailDO;
import cn.iocoder.yudao.module.member.dal.mysql.carteenmoney.CarteenMoneyMapper;
import cn.iocoder.yudao.module.member.dal.mysql.order.DishOrderMapper;
import cn.iocoder.yudao.module.member.dal.mysql.orderdetail.OrderDetailMapper;
import cn.iocoder.yudao.module.member.enums.TimePeriodEnum;
import cn.iocoder.yudao.module.system.api.carteen.CarteenApi;
import cn.iocoder.yudao.module.system.api.carteen.dto.CarteenRespDto;
import cn.iocoder.yudao.module.system.api.deviceInfo.DeviceInfoApi;
import cn.iocoder.yudao.module.system.api.deviceInfo.dto.DeviceInfoDto;
import cn.iocoder.yudao.module.system.enums.ErrorCodeConstants;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.stream.Collectors;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
@ -43,8 +45,12 @@ public class CarteenMoneyServiceImpl implements CarteenMoneyService {
private CarteenMoneyMapper carteenMoneyMapper;
@Resource
private DishOrderMapper dishOrderMapper;
@Resource
private CarteenApi carteenApi;
@Resource
private OrderDetailMapper orderDetailMapper;
@Resource
private DeviceInfoApi deviceInfoApi;
@Override
public Long createCarteenMoney(CarteenMoneySaveReqVO createReqVO) {
@ -167,4 +173,57 @@ public class CarteenMoneyServiceImpl implements CarteenMoneyService {
}
return list;
}
/**
* @param reqVO
* @return
* @Description: 获取门店下面的设备流水
* @Author: qjq
* @Date: 2024/4/12 下午3:13
*/
@Override
public DeviceMoneyRespVO getCarteenMoneyDevice(DeviceMoneyPageReqVO reqVO) {
//时间为空默认为今天
if(ObjUtil.isEmpty(reqVO.getCreateTime())){
reqVO.setCreateTime(new LocalDateTime[]{LocalDateTimeUtil.beginOfDay(LocalDateTime.now()),LocalDateTimeUtil.endOfDay(LocalDateTime.now())});
}
//门店id
Long carteenId = reqVO.getCarteenId();
//获取门店信息
CarteenRespDto car = carteenApi.getCarteenById(carteenId);
DeviceMoneyRespVO bean = BeanUtil.toBean(car, DeviceMoneyRespVO.class);
//获取门店下的设备
List<String> ips = deviceInfoApi.getDeviceInfoList(bean.getId()).stream()
.map(DeviceInfoDto::getDeviceIp)
.filter(Objects::nonNull)
.collect(Collectors.toList());
//获取设备营业数据
List<OrderDetailDO> dos = orderDetailMapper.selectList(new LambdaQueryWrapperX<OrderDetailDO>()
.in(OrderDetailDO::getSn, ips)
.betweenIfPresent(OrderDetailDO::getCreateTime, reqVO.getCreateTime()));
//根据设备分组
Map<String, List<OrderDetailDO>> collect = dos.stream().collect(Collectors.groupingBy(OrderDetailDO::getSn));
for (Map.Entry<String, List<OrderDetailDO>> map : collect.entrySet()) {
//设备流水
DeviceRespVO deviceRespVO = new DeviceRespVO();
List<OrderDetailDO> value = map.getValue();
//设置设备ip
deviceRespVO.setDeviceIp(map.getKey());
//根据时间进行时间段赋值
value.forEach(v -> v.setCreator(TimePeriodEnum.getTimePeriod(v.getCreateTime())));
//根据时间段分组
value.stream().collect(Collectors.groupingBy(OrderDetailDO::getCreator))
.forEach((k, v) -> {
//根据时间段进行金额统计
BigDecimal sum = v.stream()
.map(OrderDetailDO::getPrice)
.filter(ObjectUtil::isNotEmpty)
.reduce(BigDecimal.ZERO, BigDecimal::add);
deviceRespVO.setTime(k);
deviceRespVO.setMoney(sum);
});
bean.getDeviceRespVOList().add(deviceRespVO);
}
return bean;
}
}

View File

@ -99,9 +99,10 @@ public class OrderDetailServiceImpl implements OrderDetailService {
//计算新总价
String old = stringRedisTemplate.opsForValue().get(createReqVO.getDiningPlatesNum());
BigDecimal oldBigDecimal = new BigDecimal(old);
//计算每个菜品的价格
BigDecimal bigDecimal1 = dish.getDishesBasePrice().multiply(createReqVO.getWeight()).setScale(2, RoundingMode.HALF_UP);
//
BigDecimal newPrice = dish.getDishesBasePrice().multiply(createReqVO.getWeight())
.add(oldBigDecimal).setScale(2, RoundingMode.HALF_UP);
BigDecimal newPrice =bigDecimal1.add(oldBigDecimal).setScale(2, RoundingMode.HALF_UP);
stringRedisTemplate.opsForValue().set(createReqVO.getDiningPlatesNum(),newPrice.toString());
//计算热量
@ -116,6 +117,7 @@ public class OrderDetailServiceImpl implements OrderDetailService {
orderDetail.setOrderId(dishOrderDO.getId()).setDishesName(dish.getDishesName()).setDishUrl(dish.getDishesImageUrl());
orderDetail.setSn(this.getHearder());
orderDetail.setPrice(bigDecimal1);
orderDetailMapper.insert(orderDetail);
// 返回
return orderDetail.getId();