Merge remote-tracking branch 'origin/master'

This commit is contained in:
张松
2025-03-11 17:48:32 +08:00
7 changed files with 137 additions and 13 deletions

View File

@@ -10,6 +10,9 @@ import com.czg.order.vo.DataSummaryPayTypeVo;
import com.czg.order.vo.DataSummaryProductSaleVo;
import com.czg.resp.CzgResult;
import com.czg.sa.StpKit;
import com.czg.utils.AssertUtil;
import com.czg.validator.ValidatorUtil;
import com.czg.validator.group.DefaultGroup;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@@ -36,6 +39,7 @@ public class DataSummaryController {
@OperationLog("营业板块-上半部分")
//@SaAdminCheckPermission("dataSummary:trade")
public CzgResult<ShopOrderStatistic> getTradeData(DataSummaryTradeParam param) {
ValidatorUtil.validateEntity(param, DefaultGroup.class);
Long shopId = StpKit.USER.getShopId(0L);
param.setShopId(shopId);
ShopOrderStatistic data = dataSummaryService.getTradeData(param);
@@ -64,8 +68,10 @@ public class DataSummaryController {
@OperationLog("销售趋势柱状图 左下")
//@SaAdminCheckPermission("dataSummary:dateAmount")
public CzgResult<DataSummaryDateAmountVo> getDateAmount(@RequestParam Integer day) {
AssertUtil.isNull(day, "天数不能为空");
Long shopId = StpKit.USER.getShopId(0L);
DataSummaryDateAmountVo data = dataSummaryService.getSummaryAmountData(shopId, day);
return CzgResult.success(data);
}

View File

@@ -141,11 +141,11 @@ public class ShopOrderStatistic implements Serializable {
* 创建时间
*/
@JSONField(format = "yyyy-MM-dd")
private LocalDate createDay = LocalDate.now();
private LocalDate createDay;
/**
* 最近一次统计时间
*/
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime = LocalDateTime.now();
private LocalDateTime updateTime;
}

View File

@@ -1,29 +1,67 @@
package com.czg.order.enums;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import java.util.Arrays;
import java.util.List;
/**
* @author ww
*/
@Getter
@RequiredArgsConstructor
public enum PayEnums {
/**
* 主扫
*/
MAIN_SCAN("main_scan", "主扫"),
/**
* 被扫
*/
BACK_SCAN("back_scan", "被扫"),
/**
* 微信小程序
*/
WECHAT_MINI("wechat_mini", "微信小程序"),
/**
* 支付宝小程序
*/
ALIPAY_MINI("alipay_mini", "支付宝小程序"),
/**
* 会员支付
*/
VIP_PAY("vip_pay", "会员支付"),
/**
* 现金支付
*/
CASH_PAY("cash_pay", "现金支付"),
/**
* 挂账支付
*/
CREDIT_PAY("credit_pay", "挂账支付"),
H5_PAY("h5_pay", "h5支付");
/**
* h5支付
*/
H5_PAY("h5_pay", "H5支付");
private final String value;
private final String msg;
PayEnums(String value, String msg) {
this.value = value;
this.msg = msg;
public static List<String> getValues() {
return Arrays.stream(values()).map(PayEnums::getValue).toList();
}
public static String getText(String value) {
PayEnums item = Arrays.stream(values()).filter(obj -> value.equals(obj.getValue())).findFirst().orElse(null);
if (item != null) {
return item.getMsg();
}
return "未知支付方式";
}
}

View File

@@ -1,6 +1,8 @@
package com.czg.order.param;
import com.alibaba.fastjson2.annotation.JSONField;
import com.czg.validator.group.DefaultGroup;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
import java.io.Serial;
@@ -21,10 +23,12 @@ public class DataSummaryTradeParam implements Serializable {
/**
* 开始时间 格式yyyy-MM-dd
*/
@NotBlank(message = "开始日期不能为空", groups = DefaultGroup.class)
private String beginTime;
/**
* 结束时间 格式yyyy-MM-dd
*/
@NotBlank(message = "结束日期不能为空", groups = DefaultGroup.class)
private String endTime;
/**
* 店铺id

View File

@@ -5,6 +5,7 @@ import lombok.NoArgsConstructor;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
@@ -34,15 +35,15 @@ public class DataSummaryDateAmountVo implements Serializable {
/**
* 实收金额
*/
private Integer actualAmount;
private BigDecimal actualAmount = BigDecimal.ZERO;
/**
* 优惠金额
*/
private Integer discountAmount;
private BigDecimal discountAmount = BigDecimal.ZERO;
/**
* 订单金额
*/
private Integer orderAmount;
private BigDecimal orderAmount = BigDecimal.ZERO;
/**
* 日期
*/

View File

@@ -1,16 +1,26 @@
package com.czg.service.order.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DatePattern;
import com.czg.order.entity.OrderInfo;
import com.czg.order.entity.ShopOrderStatistic;
import com.czg.order.enums.PayEnums;
import com.czg.order.param.DataSummaryProductSaleParam;
import com.czg.order.param.DataSummaryTradeParam;
import com.czg.order.service.DataSummaryService;
import com.czg.order.vo.DataSummaryDateAmountVo;
import com.czg.order.vo.DataSummaryPayTypeVo;
import com.czg.order.vo.DataSummaryProductSaleVo;
import com.czg.service.order.mapper.OrderInfoMapper;
import com.czg.service.order.mapper.ShopOrderStatisticMapper;
import com.mybatisflex.core.query.QueryWrapper;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
/**
* 数据统计Service实现类
*
@@ -22,6 +32,8 @@ public class DataSummaryServiceImpl implements DataSummaryService {
@Resource
private ShopOrderStatisticMapper shopOrderStatisticMapper;
@Resource
private OrderInfoMapper orderInfoMapper;
@Override
public ShopOrderStatistic getTradeData(DataSummaryTradeParam param) {
@@ -41,11 +53,73 @@ public class DataSummaryServiceImpl implements DataSummaryService {
@Override
public DataSummaryDateAmountVo getSummaryAmountData(Long shopId, Integer day) {
return new DataSummaryDateAmountVo();
LocalDate now = LocalDate.now();
LocalDate beginDate = now.plusDays(-day);
DataSummaryDateAmountVo data = new DataSummaryDateAmountVo();
List<DataSummaryDateAmountVo.TotalVo> total = new ArrayList<>();
for (int i = 1; i <= day; i++) {
String thisDay = beginDate.plusDays(i).format(DatePattern.NORM_DATE_FORMATTER);
OrderInfo orderInfo = orderInfoMapper.selectOneByQuery(QueryWrapper.create()
.select("ifnull(sum(order_amount),0) as order_amount,ifnull(sum(pay_amount),0) as pay_amount,ifnull(sum(order_amount-pay_amount),0) as discount_amount")
.eq(OrderInfo::getShopId, shopId)
.eq(OrderInfo::getTradeDay, thisDay)
.isNotNull(OrderInfo::getPaidTime)
);
DataSummaryDateAmountVo.TotalVo totalVo = new DataSummaryDateAmountVo.TotalVo();
if (orderInfo != null) {
totalVo.setOrderAmount(orderInfo.getOrderAmount());
totalVo.setActualAmount(orderInfo.getPayAmount());
totalVo.setDiscountAmount(orderInfo.getDiscountAmount());
}
totalVo.setTradeDay(thisDay);
total.add(totalVo);
}
data.setTotal(total);
return data;
}
@Override
public DataSummaryPayTypeVo getSummaryPayTypeData(Long shopId, Integer day) {
return new DataSummaryPayTypeVo();
LocalDate now = LocalDate.now();
LocalDate beginDate = now.plusDays(-day);
DataSummaryPayTypeVo data = new DataSummaryPayTypeVo();
List<DataSummaryPayTypeVo.CountPayTypeVo> total = new ArrayList<>();
List<String> days = new ArrayList<>();
for (int i = 1; i <= day; i++) {
String thisDay = beginDate.plusDays(i).format(DatePattern.NORM_DATE_FORMATTER);
days.add(thisDay);
}
List<OrderInfo> orderList = orderInfoMapper.selectListByQuery(QueryWrapper.create()
.select("pay_type,count(1) as place_num")
.eq(OrderInfo::getShopId, shopId)
.in(OrderInfo::getTradeDay, days)
.isNotNull(OrderInfo::getPaidTime)
.groupBy(OrderInfo::getPayType)
);
PayEnums[] pays = PayEnums.values();
if (CollUtil.isEmpty(orderList)) {
for (PayEnums pay : pays) {
DataSummaryPayTypeVo.CountPayTypeVo payTypeVo = new DataSummaryPayTypeVo.CountPayTypeVo();
payTypeVo.setPayType(pay.getMsg());
payTypeVo.setCount(0);
total.add(payTypeVo);
}
data.setCountPayType(total);
return data;
}
for (PayEnums pay : pays) {
OrderInfo orderInfo = orderList.stream().filter(order -> pay.getValue().equals(order.getPayType())).findFirst().orElse(null);
DataSummaryPayTypeVo.CountPayTypeVo payTypeVo = new DataSummaryPayTypeVo.CountPayTypeVo();
payTypeVo.setPayType(pay.getMsg());
payTypeVo.setCount(0);
if (orderInfo != null) {
payTypeVo.setPayType(PayEnums.getText(orderInfo.getPayType()));
payTypeVo.setCount(orderInfo.getPlaceNum());
}
total.add(payTypeVo);
}
data.setCountPayType(total);
return data;
}
}

View File

@@ -26,7 +26,8 @@
sum(cash_pay_amount) as cash_pay_amount,
sum(recharge_amount) as recharge_amount,
avg(customer_unit_price) as customer_unit_price,
avg(table_turnover_rate) as table_turnover_rate
avg(table_turnover_rate) as table_turnover_rate,
max(update_time) as update_time
from tb_shop_order_statistic
where shop_id = #{shopId}
<if test="beginTime != null">