Merge remote-tracking branch 'origin/master'

This commit is contained in:
2025-03-11 18:00:55 +08:00
16 changed files with 156 additions and 30 deletions

View File

@@ -36,7 +36,7 @@ dubbo:
threads: 20 threads: 20
name: dubbo name: dubbo
serialization: hessian2 serialization: hessian2
port: -1 port: 10101
seata: seata:

View File

@@ -35,7 +35,7 @@ dubbo:
group: server-test group: server-test
protocol: protocol:
threads: 20 threads: 20
port: -1 port: 10102
name: dubbo name: dubbo
serialization: hessian2 serialization: hessian2

View File

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

View File

@@ -29,13 +29,13 @@ spring:
dubbo: dubbo:
application: application:
name: order-server name: order-server
# qos-port: 22231 qos-port: 22231
qos-enable: false qos-enable: true
registry: registry:
address: nacos://121.40.109.122:8848 # Nacos 服务地址 address: nacos://121.40.109.122:8848 # Nacos 服务地址
group: server-dev group: server-dev
protocol: protocol:
port: -1 port: 10201
threads: 20 threads: 20
name: dubbo name: dubbo
serialization: hessian2 serialization: hessian2

View File

@@ -30,15 +30,15 @@ spring:
dubbo: dubbo:
application: application:
name: order-server name: order-server
# qos-port: 22232 qos-port: 22232
qos-enable: false qos-enable: true
logger: log4j2 logger: log4j2
environment: test environment: test
registry: registry:
address: nacos://121.40.109.122:8848 # Nacos 服务地址 address: nacos://121.40.109.122:8848 # Nacos 服务地址
group: server-test group: server-test
protocol: protocol:
port: -1 port: 10202
threads: 20 threads: 20
name: dubbo name: dubbo
serialization: hessian2 serialization: hessian2

View File

@@ -40,7 +40,7 @@ dubbo:
address: nacos://121.40.109.122:8848 # Nacos 服务地址 address: nacos://121.40.109.122:8848 # Nacos 服务地址
group: server-dev group: server-dev
protocol: protocol:
port: -1 port: 10301
threads: 20 threads: 20
name: dubbo name: dubbo
serialization: hessian2 serialization: hessian2

View File

@@ -34,7 +34,7 @@ dubbo:
address: nacos://121.40.109.122:8848 # Nacos 服务地址 address: nacos://121.40.109.122:8848 # Nacos 服务地址
group: server-test group: server-test
protocol: protocol:
port: -1 port: 10302
threads: 20 threads: 20
name: dubbo name: dubbo
serialization: hessian2 serialization: hessian2

View File

@@ -35,7 +35,7 @@ dubbo:
address: nacos://121.40.109.122:8848 # Nacos 服务地址 address: nacos://121.40.109.122:8848 # Nacos 服务地址
group: server-dev group: server-dev
protocol: protocol:
port: -1 port: 10401
threads: 20 threads: 20
name: dubbo name: dubbo
serialization: hessian2 serialization: hessian2

View File

@@ -35,7 +35,7 @@ dubbo:
address: nacos://121.40.109.122:8848 # Nacos 服务地址 address: nacos://121.40.109.122:8848 # Nacos 服务地址
group: server-test group: server-test
protocol: protocol:
port: -1 port: 10402
threads: 20 threads: 20
name: dubbo name: dubbo
serialization: hessian2 serialization: hessian2

View File

@@ -141,11 +141,11 @@ public class ShopOrderStatistic implements Serializable {
* 创建时间 * 创建时间
*/ */
@JSONField(format = "yyyy-MM-dd") @JSONField(format = "yyyy-MM-dd")
private LocalDate createDay = LocalDate.now(); private LocalDate createDay;
/** /**
* 最近一次统计时间 * 最近一次统计时间
*/ */
@JSONField(format = "yyyy-MM-dd HH:mm:ss") @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; package com.czg.order.enums;
import lombok.Getter; import lombok.Getter;
import lombok.RequiredArgsConstructor;
import java.util.Arrays;
import java.util.List;
/** /**
* @author ww * @author ww
*/ */
@Getter @Getter
@RequiredArgsConstructor
public enum PayEnums { public enum PayEnums {
/**
* 主扫
*/
MAIN_SCAN("main_scan", "主扫"), MAIN_SCAN("main_scan", "主扫"),
/**
* 被扫
*/
BACK_SCAN("back_scan", "被扫"), BACK_SCAN("back_scan", "被扫"),
/**
* 微信小程序
*/
WECHAT_MINI("wechat_mini", "微信小程序"), WECHAT_MINI("wechat_mini", "微信小程序"),
/**
* 支付宝小程序
*/
ALIPAY_MINI("alipay_mini", "支付宝小程序"), ALIPAY_MINI("alipay_mini", "支付宝小程序"),
/**
* 会员支付
*/
VIP_PAY("vip_pay", "会员支付"), VIP_PAY("vip_pay", "会员支付"),
/**
* 现金支付
*/
CASH_PAY("cash_pay", "现金支付"), CASH_PAY("cash_pay", "现金支付"),
/**
* 挂账支付
*/
CREDIT_PAY("credit_pay", "挂账支付"), CREDIT_PAY("credit_pay", "挂账支付"),
H5_PAY("h5_pay", "h5支付"); /**
* h5支付
*/
H5_PAY("h5_pay", "H5支付");
private final String value; private final String value;
private final String msg; private final String msg;
PayEnums(String value, String msg) {
this.value = value; public static List<String> getValues() {
this.msg = msg; 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; package com.czg.order.param;
import com.alibaba.fastjson2.annotation.JSONField; import com.alibaba.fastjson2.annotation.JSONField;
import com.czg.validator.group.DefaultGroup;
import jakarta.validation.constraints.NotBlank;
import lombok.Data; import lombok.Data;
import java.io.Serial; import java.io.Serial;
@@ -21,10 +23,12 @@ public class DataSummaryTradeParam implements Serializable {
/** /**
* 开始时间 格式yyyy-MM-dd * 开始时间 格式yyyy-MM-dd
*/ */
@NotBlank(message = "开始日期不能为空", groups = DefaultGroup.class)
private String beginTime; private String beginTime;
/** /**
* 结束时间 格式yyyy-MM-dd * 结束时间 格式yyyy-MM-dd
*/ */
@NotBlank(message = "结束日期不能为空", groups = DefaultGroup.class)
private String endTime; private String endTime;
/** /**
* 店铺id * 店铺id

View File

@@ -5,6 +5,7 @@ import lombok.NoArgsConstructor;
import java.io.Serial; import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; 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

@@ -252,17 +252,19 @@ public class ShopUserServiceImpl extends ServiceImpl<ShopUserMapper, ShopUser> i
userInfoService.updateById(userInfo); userInfoService.updateById(userInfo);
ShopUser shopUser = getOne(new QueryWrapper().eq(ShopUser::getShopId, shopId).eq(ShopUser::getUserId, userId)); ShopUser shopUser = getOne(new QueryWrapper().eq(ShopUser::getShopId, shopId).eq(ShopUser::getUserId, userId));
if (shopUser != null) { if (shopUser == null) {
shopUser = new ShopUser();
shopUser.setShopId(shopId);
shopUser.setUserId(userId);
} else if (shopUser.getIsVip() == 1) {
throw new ApiNotPrintException("您已加入店铺会员"); throw new ApiNotPrintException("您已加入店铺会员");
} }
shopUser = BeanUtil.copyProperties(shopUserAddDTO, ShopUser.class); shopUser = BeanUtil.copyProperties(shopUserAddDTO, ShopUser.class);
shopUser.setIsVip(1); shopUser.setIsVip(1);
shopUser.setCode(generateCode(shopId)); shopUser.setCode(generateCode(shopId));
shopUser.setJoinTime(DateUtil.date().toLocalDateTime()); shopUser.setJoinTime(DateUtil.date().toLocalDateTime());
shopUser.setShopId(shopId);
shopUser.setUserId(userId); return saveOrUpdate(shopUser);
return save(shopUser);
} }
@Override @Override

View File

@@ -1,16 +1,26 @@
package com.czg.service.order.service.impl; 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.entity.ShopOrderStatistic;
import com.czg.order.enums.PayEnums;
import com.czg.order.param.DataSummaryProductSaleParam; import com.czg.order.param.DataSummaryProductSaleParam;
import com.czg.order.param.DataSummaryTradeParam; import com.czg.order.param.DataSummaryTradeParam;
import com.czg.order.service.DataSummaryService; import com.czg.order.service.DataSummaryService;
import com.czg.order.vo.DataSummaryDateAmountVo; import com.czg.order.vo.DataSummaryDateAmountVo;
import com.czg.order.vo.DataSummaryPayTypeVo; import com.czg.order.vo.DataSummaryPayTypeVo;
import com.czg.order.vo.DataSummaryProductSaleVo; import com.czg.order.vo.DataSummaryProductSaleVo;
import com.czg.service.order.mapper.OrderInfoMapper;
import com.czg.service.order.mapper.ShopOrderStatisticMapper; import com.czg.service.order.mapper.ShopOrderStatisticMapper;
import com.mybatisflex.core.query.QueryWrapper;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
/** /**
* 数据统计Service实现类 * 数据统计Service实现类
* *
@@ -22,6 +32,8 @@ public class DataSummaryServiceImpl implements DataSummaryService {
@Resource @Resource
private ShopOrderStatisticMapper shopOrderStatisticMapper; private ShopOrderStatisticMapper shopOrderStatisticMapper;
@Resource
private OrderInfoMapper orderInfoMapper;
@Override @Override
public ShopOrderStatistic getTradeData(DataSummaryTradeParam param) { public ShopOrderStatistic getTradeData(DataSummaryTradeParam param) {
@@ -41,11 +53,73 @@ public class DataSummaryServiceImpl implements DataSummaryService {
@Override @Override
public DataSummaryDateAmountVo getSummaryAmountData(Long shopId, Integer day) { 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 @Override
public DataSummaryPayTypeVo getSummaryPayTypeData(Long shopId, Integer day) { 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(cash_pay_amount) as cash_pay_amount,
sum(recharge_amount) as recharge_amount, sum(recharge_amount) as recharge_amount,
avg(customer_unit_price) as customer_unit_price, 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 from tb_shop_order_statistic
where shop_id = #{shopId} where shop_id = #{shopId}
<if test="beginTime != null"> <if test="beginTime != null">