Merge branch 'dev' into prod

This commit is contained in:
2025-11-12 13:32:06 +08:00
7 changed files with 41 additions and 43 deletions

View File

@@ -2,28 +2,21 @@ package com.czg.task;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ArrayUtil;
import com.czg.account.entity.ShopInfo;
import com.czg.account.entity.ShopUser; import com.czg.account.entity.ShopUser;
import com.czg.account.service.ShopInfoService; import com.czg.account.service.ShopInfoService;
import com.czg.account.service.ShopUserService; import com.czg.account.service.ShopUserService;
import com.czg.constant.TableValueConstant; import com.czg.constant.TableValueConstant;
import com.czg.market.entity.MkDistributionDeliver;
import com.czg.market.entity.MkDistributionFlow; import com.czg.market.entity.MkDistributionFlow;
import com.czg.market.service.MkBirthdayGiftService;
import com.czg.market.service.MkDistributionDeliverService;
import com.czg.market.service.MkDistributionFlowService; import com.czg.market.service.MkDistributionFlowService;
import com.czg.market.service.MkDistributionUserService; import com.czg.market.service.MkDistributionUserService;
import com.czg.order.entity.OrderInfo; import com.czg.order.entity.OrderInfo;
import com.czg.order.service.OrderInfoService; import com.czg.order.service.OrderInfoService;
import com.czg.service.market.enums.OrderStatusEnums; import com.czg.service.market.enums.OrderStatusEnums;
import com.czg.utils.FunUtils; import com.czg.utils.FunUtils;
import com.itextpdf.styledxmlparser.jsoup.helper.DataUtil;
import com.mybatisflex.core.query.QueryWrapper; import com.mybatisflex.core.query.QueryWrapper;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference; import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.math.BigDecimal; import java.math.BigDecimal;
@@ -33,13 +26,10 @@ import java.time.LocalDateTime;
* 分销定时任务 * 分销定时任务
* *
* @author ww * @author ww
* @description
*/ */
@Slf4j @Slf4j
@Component @Component
public class DistributionTask { public class DistributionTask {
@Resource
private MkDistributionDeliverService distributionDeliverService;
@Resource @Resource
private MkDistributionUserService distributionUserService; private MkDistributionUserService distributionUserService;
@Resource @Resource
@@ -53,12 +43,19 @@ public class DistributionTask {
private ShopUserService shopUserService; private ShopUserService shopUserService;
/** /**
* 生日有礼奖励发放 * 分销流水入账
* AAMarketTasks 统一调用位置 * AAMarketTasks 统一调用位置
*/ */
// @Scheduled(cron = "0 0 0 * * ?") // @Scheduled(cron = "0 0 0 * * ?")
@Scheduled(fixedRate = 30000) // @Scheduled(fixedRate = 30000)
public void deliver() { public void deliver() {
// TODO 逻辑修改
// 1. 订单完成支付时(判断是否分销)产生流水记录。
// 2. 判断入账时间。
// 3. 如果是 0 天,再去判断商户余额是否足够。够则入账,不足则不管。
// 4. 流水增加应该入账的时间(订单产生时带入)
// 5. 定时任务 应该是一天执行一次。查询待入账状态和应入账时间小于当前时间的记录,循环处理:并且判断商户余额是否足够,余额不足忽略处理;余额足够变为已入账并扣除商户余额。
// 6. 订单产生退款时,去流水表查询该订单的流水记录,如果未入账改为已入账,并插入一条退款扣钱的流水。
LocalDateTime localDateTime = DateUtil.date().toLocalDateTime(); LocalDateTime localDateTime = DateUtil.date().toLocalDateTime();
distributionFlowService.list(new QueryWrapper() distributionFlowService.list(new QueryWrapper()
.eq(MkDistributionFlow::getStatus, TableValueConstant.DistributionFlow.Status.PENDING.getCode())).forEach(item -> { .eq(MkDistributionFlow::getStatus, TableValueConstant.DistributionFlow.Status.PENDING.getCode())).forEach(item -> {

View File

@@ -4,10 +4,8 @@ import cn.dev33.satoken.exception.NotLoginException;
import cn.dev33.satoken.exception.NotPermissionException; import cn.dev33.satoken.exception.NotPermissionException;
import cn.dev33.satoken.exception.NotRoleException; import cn.dev33.satoken.exception.NotRoleException;
import cn.hutool.core.exceptions.ValidateException; import cn.hutool.core.exceptions.ValidateException;
import cn.hutool.core.io.resource.NoResourceException;
import com.czg.resp.CzgRespCode; import com.czg.resp.CzgRespCode;
import com.czg.resp.CzgResult; import com.czg.resp.CzgResult;
import com.fasterxml.jackson.databind.exc.InvalidFormatException;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.context.support.DefaultMessageSourceResolvable; import org.springframework.context.support.DefaultMessageSourceResolvable;
import org.springframework.dao.DuplicateKeyException; import org.springframework.dao.DuplicateKeyException;
@@ -30,25 +28,6 @@ import java.util.stream.Collectors;
@RestControllerAdvice @RestControllerAdvice
@Slf4j @Slf4j
public class CzgControllerAdvice { public class CzgControllerAdvice {
@ResponseBody
@ExceptionHandler(value = Exception.class)
@ResponseStatus(HttpStatus.OK)
public CzgResult<Object> errorHandler(Exception ex) {
Throwable rootCause = ex;
while (rootCause.getCause() != null) {
rootCause = rootCause.getCause();
if (rootCause instanceof CzgException) {
break;
}
}
// 处理自定义异常
if (rootCause instanceof CzgException czgException) {
return CzgResult.failure(czgException.getCode(), czgException.getMessage());
}
setErrorLog(ex);
return CzgResult.failure(CzgRespCode.SYSTEM_ERROR.getCode(), ex.getMessage());
}
@ResponseBody @ResponseBody
@ExceptionHandler(value = NoResourceFoundException.class) @ExceptionHandler(value = NoResourceFoundException.class)
@ResponseStatus(HttpStatus.OK) @ResponseStatus(HttpStatus.OK)
@@ -113,9 +92,9 @@ public class CzgControllerAdvice {
return CzgResult.failure(ex.getCode(), ex.getMsg()); return CzgResult.failure(ex.getCode(), ex.getMsg());
} }
@ResponseBody // @ResponseBody
@ExceptionHandler(OrderValidateException.class) @ExceptionHandler(OrderValidateException.class)
@ResponseStatus(HttpStatus.OK) // @ResponseStatus(HttpStatus.OK)
public CzgResult<Object> handleOrderValidateException(OrderValidateException ex) { public CzgResult<Object> handleOrderValidateException(OrderValidateException ex) {
log.error("订单校验异常:{}", ex.getMessage()); log.error("订单校验异常:{}", ex.getMessage());
return CzgResult.failure(ex.getCode(), ex.getMsg()); return CzgResult.failure(ex.getCode(), ex.getMsg());
@@ -161,6 +140,16 @@ public class CzgControllerAdvice {
return CzgResult.failure(CzgRespCode.RECORD_EXISTED); return CzgResult.failure(CzgRespCode.RECORD_EXISTED);
} }
@ResponseBody
@ExceptionHandler(value = Exception.class)
@ResponseStatus(HttpStatus.OK)
public CzgResult<Object> errorHandler(Exception ex) {
// setErrorLog(ex);
// 3. 处理未捕获的异常(系统异常,隐藏敏感信息)
log.error("系统未处理异常", ex); // 替换原有 setErrorLog使用日志框架
return CzgResult.failure(CzgRespCode.SYSTEM_ERROR.getCode(), "系统繁忙,请稍后再试");
}
private void setErrorLog(Exception ex) { private void setErrorLog(Exception ex) {
log.error(ex.getMessage()); log.error(ex.getMessage());
log.error("错误", ex); log.error("错误", ex);

View File

@@ -1,6 +1,8 @@
package com.czg.order.service; package com.czg.order.service;
import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.JSONObject;
import com.czg.exception.OrderCancelException;
import com.czg.exception.OrderValidateException;
import com.czg.order.dto.*; import com.czg.order.dto.*;
import com.czg.order.entity.OrderDetail; import com.czg.order.entity.OrderDetail;
import com.czg.order.entity.OrderInfo; import com.czg.order.entity.OrderInfo;
@@ -36,7 +38,7 @@ public interface OrderInfoService extends IService<OrderInfo> {
OrderInfo createOrder(OrderInfoAddDTO param); OrderInfo createOrder(OrderInfoAddDTO param);
OrderInfo checkOrderPay(CheckOrderPay param); OrderInfo checkOrderPay(CheckOrderPay param) throws OrderValidateException, OrderCancelException;
CzgResult<Object> mergeOrder(MergeOrderDTO param); CzgResult<Object> mergeOrder(MergeOrderDTO param);
@@ -56,7 +58,7 @@ public interface OrderInfoService extends IService<OrderInfo> {
Boolean removeOrderDetail(Long shopId, Long orderId, Long detailId); Boolean removeOrderDetail(Long shopId, Long orderId, Long detailId);
Boolean cancelledOrder(Long shopId, Long orderId); Boolean cancelledOrder(Long shopId, Long orderId) throws OrderCancelException ;
Boolean cancelledPlaceOrder(Long shopId, Long orderId, Integer placeNum); Boolean cancelledPlaceOrder(Long shopId, Long orderId, Integer placeNum);

View File

@@ -2,6 +2,8 @@ package com.czg.exception;
import com.czg.resp.CzgRespCode; import com.czg.resp.CzgRespCode;
import java.io.Serial;
/** /**
* 自定义异常 * 自定义异常
* *
@@ -9,6 +11,7 @@ import com.czg.resp.CzgRespCode;
* @since 1.0.0 * @since 1.0.0
*/ */
public class CzgException extends RuntimeException { public class CzgException extends RuntimeException {
@Serial
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private int code; private int code;

View File

@@ -21,6 +21,12 @@ public class OrderValidateException extends RuntimeException{
this.msg = msg; this.msg = msg;
} }
public OrderValidateException(String msg, Throwable e) {
super(msg, e);
this.code = CzgRespCode.FAILURE.getCode();
this.msg = msg;
}
public String getMsg() { public String getMsg() {
return msg; return msg;
} }

View File

@@ -572,7 +572,8 @@ public class MkDistributionUserServiceImpl extends ServiceImpl<MkDistributionUse
@GlobalTransactional @GlobalTransactional
protected void deepReward(ShopUser orderSourceShopUser, MkDistributionLevelConfig parentLevel, MkDistributionConfigVO config, MkDistributionUser currentDistributionUser, BigDecimal amount, Long sourceId, String type, String orderNo, Integer currentLevel) { protected void deepReward(ShopUser orderSourceShopUser, MkDistributionLevelConfig parentLevel, MkDistributionConfigVO config,
MkDistributionUser currentDistributionUser, BigDecimal amount, Long sourceId, String type, String orderNo, Integer currentLevel) {
if (currentLevel > 2) { if (currentLevel > 2) {
return; return;
} }

View File

@@ -264,7 +264,7 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
@Override @Override
@Transactional @Transactional
public OrderInfo createOrder(OrderInfoAddDTO param) { public OrderInfo createOrder(OrderInfoAddDTO param) throws ValidateException{
ShopInfo shopInfo = shopInfoService.getById(param.getShopId()); ShopInfo shopInfo = shopInfoService.getById(param.getShopId());
AssertUtil.isNull(shopInfo, "生成订单失败,店铺信息不存在"); AssertUtil.isNull(shopInfo, "生成订单失败,店铺信息不存在");
if (!shopInfo.getEatModel().contains(param.getDineMode())) { if (!shopInfo.getEatModel().contains(param.getDineMode())) {
@@ -317,7 +317,7 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
} }
@Override @Override
public OrderInfo checkOrderPay(CheckOrderPay param) { public OrderInfo checkOrderPay(CheckOrderPay param) throws OrderValidateException, OrderCancelException {
AssertUtil.isNull(param.getOrderId(), "支付失败订单id不能为空"); AssertUtil.isNull(param.getOrderId(), "支付失败订单id不能为空");
OrderInfo orderInfo = getById(param.getOrderId()); OrderInfo orderInfo = getById(param.getOrderId());
if (!orderInfo.getStatus().equals(OrderStatusEnums.UNPAID.getCode())) { if (!orderInfo.getStatus().equals(OrderStatusEnums.UNPAID.getCode())) {
@@ -1596,13 +1596,13 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public Boolean cancelledOrder(Long shopId, Long orderId) { public Boolean cancelledOrder(Long shopId, Long orderId) throws OrderCancelException {
OrderInfo orderInfo = getById(orderId); OrderInfo orderInfo = getById(orderId);
if (orderInfo == null) { if (orderInfo == null) {
throw new ApiNotPrintException("订单不存在"); throw new OrderCancelException("订单不存在");
} }
if (!OrderStatusEnums.UNPAID.getCode().equals(orderInfo.getStatus())) { if (!OrderStatusEnums.UNPAID.getCode().equals(orderInfo.getStatus())) {
throw new ApiNotPrintException("订单不可取消"); throw new OrderCancelException("订单不可取消");
} }
updateChain() updateChain()
.set(OrderInfo::getStatus, OrderStatusEnums.CANCELLED.getCode()) .set(OrderInfo::getStatus, OrderStatusEnums.CANCELLED.getCode())