每道菜的价格
This commit is contained in:
@ -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));
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -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;
|
||||
|
||||
}
|
@ -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<>();
|
||||
}
|
@ -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;
|
||||
}
|
@ -62,4 +62,8 @@ public class OrderDetailDO extends BaseDO {
|
||||
* 设备ip
|
||||
*/
|
||||
private String sn;
|
||||
/**
|
||||
* 菜品价格
|
||||
*/
|
||||
private BigDecimal price;
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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();
|
||||
|
Reference in New Issue
Block a user