大屏接口

This commit is contained in:
qjq
2024-04-22 09:11:47 +08:00
parent 20c0b039f5
commit 59463d439c
34 changed files with 570 additions and 110 deletions

View File

@ -4,18 +4,21 @@ import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.member.controller.admin.order.vo.OrderDetailsReqVO;
import cn.iocoder.yudao.module.member.controller.admin.order.vo.OrderDetailsRespVO;
import cn.iocoder.yudao.module.member.controller.app.orderdetail.vo.AppOrderDetailRespVO;
import cn.iocoder.yudao.module.member.service.order.OrderService;
import cn.iocoder.yudao.module.member.service.orderdetail.OrderDetailService;
import io.swagger.v3.oas.annotations.Operation;
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.annotation.Resource;
import javax.validation.Valid;
import java.util.Map;
import java.util.List;
@Tag(name = "管理后台 - 会员订单")
@RestController
@ -25,6 +28,8 @@ public class OrderController {
@Resource
private OrderService orderService;
@Resource
private OrderDetailService detailService;
//
//@PostMapping("/create")
//@Operation(summary = "创建会员订单")
@ -92,5 +97,18 @@ public class OrderController {
public CommonResult<PageResult<OrderDetailsRespVO>> getPageResult(@Valid OrderDetailsReqVO reqVO){
return CommonResult.success(orderService.getPageOrderDetails(reqVO));
}
/*================后台管理-订单管理-订单详情========================*/
@GetMapping("/get")
@Operation(summary = "获得会员订单明细")
@PreAuthorize("@ss.hasPermission('member:order:query')")
public CommonResult<List<AppOrderDetailRespVO>> getOrderDetails(@RequestParam("orderId")Long orderId){
return CommonResult.success(detailService.selectListByOrderId(orderId));
}
/*================后台管理-订单管理-订单明细与用户信息========================*/
@GetMapping("/get-details")
@Operation(summary = "获得会员订单明细与用户信息")
@PreAuthorize("@ss.hasPermission('member:order:query')")
public CommonResult<OrderDetailsRespVO> getOrderDetailsAndUser(@RequestParam("orderId")Long orderId){
return CommonResult.success(orderService.getOrderDetailsAndUser(orderId));
}
}

View File

@ -5,6 +5,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@ -21,8 +22,10 @@ public class OrderDetailsReqVO extends PageParam {
@Schema(description = "门店Id", example = "24217")
private String storeId;
@Schema(description = "开始时间", example = "2024-4-12 9:00:00")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime startDate;
@Schema(description = "结束时间", example = "2024-4-12 18:00:00")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime endDate;
@Schema(description = "订单号", example = "20240401085810236196705")
private String orderId;

View File

@ -40,6 +40,8 @@ public class OrderDetailsRespVO {
@Schema(description = "工号", example = "15111956918")
@ExcelProperty("工号")
private String userJob;
@Schema(description = "用户头像", example = "15111956918")
private String avatar;
@Schema(description = "订单交易时间", example = "2024-04-01 09:06:19")
@ExcelProperty("订单交易时间")

View File

@ -1,18 +1,23 @@
package cn.iocoder.yudao.module.member.controller.admin.screen;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateTime;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.member.controller.admin.customertraffic.vo.CustomerTrafficRespVO;
import cn.iocoder.yudao.module.member.controller.admin.screen.vo.DishVo;
import cn.iocoder.yudao.module.member.dal.dataobject.customertraffic.CustomerTrafficDO;
import cn.iocoder.yudao.module.member.dal.dataobject.customertraffic.CustomerTrafficDetailDO;
import cn.iocoder.yudao.module.member.service.customertraffic.CustomerTrafficService;
import cn.iocoder.yudao.module.member.service.order.OrderService;
import cn.iocoder.yudao.module.member.service.orderdetail.OrderDetailService;
import cn.iocoder.yudao.module.member.service.storeevaluate.StoreEvaluateService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.format.annotation.DateTimeFormat;
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.annotation.Resource;
@ -56,6 +61,20 @@ public class ScreenController {
return success(BeanUtils.toBean(data, CustomerTrafficRespVO.class));
}
@GetMapping("/half-hour")
@Operation(summary = "食堂今日半小时刻度顾客流量")
@PermitAll
public CommonResult<List<CustomerTrafficDetailDO>> getHalfHour(@RequestParam(value = "storeId",required = false) Long storeId,
@DateTimeFormat(pattern = DatePattern.NORM_DATETIME_PATTERN)
@RequestParam(value = "start")DateTime start,
@DateTimeFormat(pattern = DatePattern.NORM_DATETIME_PATTERN)
@RequestParam(value = "end") DateTime end){
return success(customerTrafficService.getHalfHour(storeId, start,end));
}
@GetMapping("/getUserCount")
@Operation(summary = "获取总顾客流量")
@PermitAll

View File

@ -18,6 +18,7 @@ import cn.iocoder.yudao.module.member.service.user.MemberUserService;
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.format.annotation.DateTimeFormat;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@ -115,6 +116,13 @@ public class MemberUserController {
convertSet(pageResult.getList(), MemberUserDO::getGroupId));
return success(MemberUserConvert.INSTANCE.convertPage(pageResult, tags, levels, groups));
}
@GetMapping("/heat")
@Operation(summary = "获得会员热量分析")
public CommonResult<List<Map>> getUserHeat(@RequestParam(value = "userId",required = false) Long userId,
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @RequestParam(value = "startDate",required = false) LocalDateTime startDate,
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @RequestParam(value = "endDate",required = false) LocalDateTime endDate,
@RequestParam(value = "orderId",required = false)Long orderId){
return success(memberUserService.getUserHeat(userId,startDate,endDate,orderId));
}
}

View File

@ -16,7 +16,8 @@ public class AppOrderDetailRespVO {
@Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "20679")
@ExcelProperty("编号")
private Long id;
@Schema(description = "门店id", example = "20679")
private Long storeId;
@Schema(description = "订单ID", example = "31077")
@ExcelProperty("订单ID")
private Long orderId;
@ -36,7 +37,9 @@ public class AppOrderDetailRespVO {
@Schema(description = "热量")
@ExcelProperty("热量")
private Double heat;
@Schema(description = "价格")
@ExcelProperty("价格")
private BigDecimal price;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;

View File

@ -0,0 +1,13 @@
package cn.iocoder.yudao.module.member.dal.dataobject.customertraffic;
import lombok.Data;
/**
* @Author:qjq
* @Date:2024/4/19 下午3:30
*/
@Data
public class CustomerTrafficDetailDO extends CustomerTrafficDO{
private String storesName;
}

View File

@ -1,13 +1,17 @@
package cn.iocoder.yudao.module.member.dal.mysql.customertraffic;
import java.util.*;
import cn.hutool.core.date.DateTime;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.member.controller.admin.customertraffic.vo.CustomerTrafficPageReqVO;
import cn.iocoder.yudao.module.member.dal.dataobject.customertraffic.CustomerTrafficDO;
import cn.iocoder.yudao.module.member.dal.dataobject.customertraffic.CustomerTrafficDetailDO;
import org.apache.ibatis.annotations.Mapper;
import cn.iocoder.yudao.module.member.controller.admin.customertraffic.vo.*;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.List;
/**
* 顾客流量 Mapper
@ -25,5 +29,17 @@ public interface CustomerTrafficMapper extends BaseMapperX<CustomerTrafficDO> {
.betweenIfPresent(CustomerTrafficDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(CustomerTrafficDO::getId));
}
@Select("<script>"+"SELECT\n" +
"\ta.customer_num,\n" +
"\ta.id,\n" +
"\ta.time_point,\n" +
"\ta.store_id,a.create_time,\n" +
"\tb.stores_name \n" +
"FROM\n" +
"\tmember_customer_traffic AS a\n" +
"\tINNER JOIN t_carteen AS b ON a.store_id = b.id \n" +
"\tAND a.create_time BETWEEN #{start} AND #{end} "+
"<if test=' storeId != null'> and a.store_id= #{storeId} </if>"
+"</script>")
List<CustomerTrafficDetailDO> getAllCustomerNum(@Param("storeId")Long storeId,@Param("start")DateTime start,@Param("end")DateTime end);
}

View File

@ -204,17 +204,17 @@ public class CarteenMoneyServiceImpl implements CarteenMoneyService {
//根据设备分组
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());
deviceRespVO.setDeviceName(deviceInfoApi.getDeviceInfoName(map.getKey()));
//根据时间进行时间段赋值
value.forEach(v -> v.setCreator(TimePeriodEnum.getTimeName(v.getCreateTime())));
//根据时间段分组
value.stream().collect(Collectors.groupingBy(OrderDetailDO::getCreator))
.forEach((k, v) -> {
//设备流水
DeviceRespVO deviceRespVO = new DeviceRespVO();
//设置设备ip
deviceRespVO.setDeviceIp(map.getKey());
deviceRespVO.setDeviceName(deviceInfoApi.getDeviceInfoName(map.getKey()));
//根据时间段进行金额统计
BigDecimal sum = v.stream()
.map(OrderDetailDO::getPrice)
@ -222,8 +222,9 @@ public class CarteenMoneyServiceImpl implements CarteenMoneyService {
.reduce(BigDecimal.ZERO, BigDecimal::add);
deviceRespVO.setTime(k);
deviceRespVO.setMoney(sum);
bean.getDeviceRespVOList().add(deviceRespVO);
});
bean.getDeviceRespVOList().add(deviceRespVO);
}
return bean;
}

View File

@ -1,9 +1,11 @@
package cn.iocoder.yudao.module.member.service.customertraffic;
import cn.hutool.core.date.DateTime;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.member.controller.admin.customertraffic.vo.CustomerTrafficPageReqVO;
import cn.iocoder.yudao.module.member.controller.admin.customertraffic.vo.CustomerTrafficSaveReqVO;
import cn.iocoder.yudao.module.member.dal.dataobject.customertraffic.CustomerTrafficDO;
import cn.iocoder.yudao.module.member.dal.dataobject.customertraffic.CustomerTrafficDetailDO;
import javax.validation.Valid;
import java.util.List;
@ -60,5 +62,11 @@ public interface CustomerTrafficService {
* 获取最新7个时间节点的数据
*/
List<CustomerTrafficDO> getData(Long storeId);
/**
* @Description: 半小时刻度查询最新7个时间点的数据
* @Author: qjq
* @Date: 2024/4/19 下午2:39
* @return
*/
List<CustomerTrafficDetailDO> getHalfHour(Long storeId, DateTime start, DateTime end);
}

View File

@ -1,18 +1,26 @@
package cn.iocoder.yudao.module.member.service.customertraffic;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.member.controller.admin.customertraffic.vo.CustomerTrafficPageReqVO;
import cn.iocoder.yudao.module.member.controller.admin.customertraffic.vo.CustomerTrafficSaveReqVO;
import cn.iocoder.yudao.module.member.dal.dataobject.customertraffic.CustomerTrafficDO;
import cn.iocoder.yudao.module.member.dal.dataobject.customertraffic.CustomerTrafficDetailDO;
import cn.iocoder.yudao.module.member.dal.mysql.customertraffic.CustomerTrafficMapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.*;
import java.util.stream.Collectors;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.CUSTOMER_TRAFFIC_NOT_EXISTS;
@ -28,7 +36,9 @@ public class CustomerTrafficServiceImpl implements CustomerTrafficService {
@Resource
private CustomerTrafficMapper customerTrafficMapper;
private static final String ZC="ZC"; //早餐
private static final String WC="WC"; //午餐
private static final String W="W"; //晚餐
@Override
public Long createCustomerTraffic(CustomerTrafficSaveReqVO createReqVO) {
// 插入
@ -86,4 +96,45 @@ public class CustomerTrafficServiceImpl implements CustomerTrafficService {
.last("limit 7"));
return customerTrafficDOS;
}
/**
* @param storeId
* @return
* @Description: 半小时刻度查询最新7个时间点的数据
* @Author: qjq
* @Date: 2024/4/19 下午2:39
*/
@Override
public List<CustomerTrafficDetailDO> getHalfHour(Long storeId, DateTime startDate,DateTime endDate) {
if(ObjUtil.isEmpty(storeId)){
DateTime end = DateUtil.endOfDay(DateUtil.date());
DateTime begin = DateUtil.beginOfDay(end);
List<CustomerTrafficDetailDO> list=new ArrayList<>();
customerTrafficMapper.getAllCustomerNum(null,begin, end)
.stream()
.collect(Collectors.groupingBy(CustomerTrafficDetailDO::getStoreId))
.forEach((k,v)->{
BigDecimal reduce = v.stream()
.map(f -> BigDecimal.valueOf(f.getCustomerNum()))
.filter(ObjUtil::isNotNull)
.reduce(BigDecimal.ZERO, BigDecimal::add);
CustomerTrafficDetailDO aDo = BeanUtil.toBean(v.get(0), CustomerTrafficDetailDO.class);
aDo.setCustomerNum(reduce.intValue());
list.add(aDo);
});
return list;
}else{
List<CustomerTrafficDetailDO> all = customerTrafficMapper.getAllCustomerNum(storeId, startDate, endDate);
all.sort(Comparator.comparing(CustomerTrafficDetailDO::getCustomerNum));
List<CustomerTrafficDetailDO> list=new ArrayList<>();
//拆分
List<List<CustomerTrafficDetailDO>> split = ListUtil.split(list, 3);
for (List<CustomerTrafficDetailDO> dos : split) {
CustomerTrafficDetailDO aDo = BeanUtil.toBean(dos.get(0), CustomerTrafficDetailDO.class);
aDo.setCustomerNum(dos.stream().mapToInt(CustomerTrafficDetailDO::getCustomerNum).sum());
list.add(aDo);
}
return list;
}
}
}

View File

@ -84,6 +84,7 @@ public interface OrderService {
List<DishOrderDO> getDishOrderByTime(LocalDateTime startTime ,LocalDateTime endTime );
PageResult<OrderDetailsRespVO> getPageOrderDetails(OrderDetailsReqVO reqVO);
OrderDetailsRespVO getOrderDetailsAndUser(Long orderId);
/**
* 获取今日顾客总量

View File

@ -31,7 +31,6 @@ import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Collections;
@ -168,15 +167,29 @@ public class OrderServiceImpl implements OrderService {
List<OrderDetailsRespVO> list=new ArrayList<>();
for (DishOrderDO dishOrderDO : pageResult.getList()) {
OrderDetailsRespVO bean = BeanUtils.toBean(dishOrderDO, OrderDetailsRespVO.class);
MemberUserDO userDO = memberUserMapper.selectById(bean.getUserId());
bean.setUserName(userDO.getName());
bean.setUserJob(userDO.getMobile());
bean.setUserAccount(userDO.getMobile());
bean.setTimePeriod(TimePeriodEnum.MIDDAY.getTimePeriod(bean.getCreateTime()));
userDetails(bean);
list.add(bean);
}
return new PageResult<>(list,pageResult.getTotal());
}
@Override
public OrderDetailsRespVO getOrderDetailsAndUser(Long orderId) {
OrderDetailsRespVO bean = BeanUtils.toBean(dishOrderMapper.selectById(orderId), OrderDetailsRespVO.class);
userDetails(bean);
return bean;
}
private void userDetails(OrderDetailsRespVO bean) {
MemberUserDO userDO = memberUserMapper.selectById(bean.getUserId());
bean.setUserName(userDO.getNickname());
bean.setUserJob(userDO.getMobile());
bean.setAvatar(userDO.getAvatar());
bean.setPayMethods("钱包");
bean.setUserAccount(userDO.getMobile());
bean.setTimePeriod(TimePeriodEnum.getTimeName(bean.getCreateTime()));
}
/**
* @Description: 数据类型对标 {@link CostTypeEnum}
* @Author: qjq

View File

@ -161,8 +161,11 @@ public class OrderDetailServiceImpl implements OrderDetailService {
@Override
public List<AppOrderDetailRespVO> selectListByOrderId(Long orderId) {
Long storeId = dishOrderMapper.selectById(orderId).getStoreId();
List<OrderDetailDO> orderDetailDOS = orderDetailMapper.selectList(Wrappers.<OrderDetailDO>lambdaQuery().eq(OrderDetailDO::getOrderId, orderId));
return BeanUtils.toBean(orderDetailDOS, AppOrderDetailRespVO.class);
List<AppOrderDetailRespVO> bean = BeanUtils.toBean(orderDetailDOS, AppOrderDetailRespVO.class);
bean.forEach(f->f.setStoreId(storeId));
return bean;
}
@Override