Merge branch 'master' into prod
This commit is contained in:
@@ -37,7 +37,7 @@ public class NotifyController {
|
|||||||
JSONObject czg = CzgPayUtils.getCzg(respParams);
|
JSONObject czg = CzgPayUtils.getCzg(respParams);
|
||||||
AssertUtil.isNull(czg, "支付回调数据为空");
|
AssertUtil.isNull(czg, "支付回调数据为空");
|
||||||
log.info("支付回调数据为:{}", czg);
|
log.info("支付回调数据为:{}", czg);
|
||||||
orderInfoService.payCallBackOrder(czg.getString("mchOrderNo"), czg);
|
orderInfoService.payCallBackOrder(czg.getString("mchOrderNo"), czg, 0);
|
||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ public class OrderPayment implements Serializable {
|
|||||||
*/
|
*/
|
||||||
private String tradeNumber;
|
private String tradeNumber;
|
||||||
|
|
||||||
@Column(onInsertValue = "now()")
|
@Column(onUpdateValue = "now()")
|
||||||
private LocalDateTime payTime;
|
private LocalDateTime payTime;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ public interface OrderInfoService extends IService<OrderInfo> {
|
|||||||
|
|
||||||
CzgResult<Object> mergeOrder(MergeOrderDTO param);
|
CzgResult<Object> mergeOrder(MergeOrderDTO param);
|
||||||
|
|
||||||
void payCallBackOrder(@NotBlank String orderNo, @NotNull JSONObject resultJson);
|
void payCallBackOrder(@NotBlank String orderNo, @NotNull JSONObject resultJson,int retryCount);
|
||||||
|
|
||||||
void refundCallBackOrder(@NotBlank String orderNo, @NotNull JSONObject resultJson);
|
void refundCallBackOrder(@NotBlank String orderNo, @NotNull JSONObject resultJson);
|
||||||
|
|
||||||
|
|||||||
@@ -58,6 +58,11 @@ import java.math.BigDecimal;
|
|||||||
import java.math.RoundingMode;
|
import java.math.RoundingMode;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
import java.util.concurrent.Executors;
|
||||||
|
import java.util.concurrent.ScheduledExecutorService;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
import static org.apache.dubbo.registry.zookeeper.util.CuratorFrameworkParams.MAX_RETRIES;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 订单表 服务层实现。
|
* 订单表 服务层实现。
|
||||||
@@ -106,6 +111,11 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
|
|||||||
private ShopCouponService couponService;
|
private ShopCouponService couponService;
|
||||||
@DubboReference
|
@DubboReference
|
||||||
private ShopActivateCouponRecordService couponRecordService;
|
private ShopActivateCouponRecordService couponRecordService;
|
||||||
|
// 延迟 5 秒
|
||||||
|
private static final long DELAY = 5;
|
||||||
|
//重试次数
|
||||||
|
private static final int MAX_RETRIES = 3;
|
||||||
|
private final ScheduledExecutorService executorService = Executors.newScheduledThreadPool(2);
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Page<OrderInfoVo> getOrderByPage(OrderInfoQueryDTO param) {
|
public Page<OrderInfoVo> getOrderByPage(OrderInfoQueryDTO param) {
|
||||||
@@ -265,6 +275,7 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public OrderInfo checkOrderPay(CheckOrderPay param) {
|
public OrderInfo checkOrderPay(CheckOrderPay param) {
|
||||||
|
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())) {
|
||||||
throw new OrderCancelException("生成支付订单失败,订单不可支付");
|
throw new OrderCancelException("生成支付订单失败,订单不可支付");
|
||||||
@@ -603,11 +614,16 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional
|
@Transactional
|
||||||
public void payCallBackOrder(@NotBlank String orderNo, @NotNull JSONObject resultJson) {
|
public void payCallBackOrder(@NotBlank String orderNo, @NotNull JSONObject resultJson, int retryCount) {
|
||||||
CzgPayNotifyDTO czgCallBackDto = JSONObject.parseObject(resultJson.toString(), CzgPayNotifyDTO.class);
|
CzgPayNotifyDTO czgCallBackDto = JSONObject.parseObject(resultJson.toString(), CzgPayNotifyDTO.class);
|
||||||
OrderPayment payment = paymentService.queryChain().eq(OrderPayment::getOrderNo, orderNo).one();
|
OrderPayment payment = paymentService.queryChain().eq(OrderPayment::getOrderNo, orderNo).one();
|
||||||
if (payment == null) {
|
if (payment == null) {
|
||||||
log.error("订单支付回调失败,支付记录不存在,payment:{}", payment);
|
if (retryCount < MAX_RETRIES) {
|
||||||
|
log.info("支付记录不存在,第 {} 次重试,将在 {} 秒后进行", retryCount + 1, DELAY);
|
||||||
|
executorService.schedule(() -> payCallBackOrder(orderNo, resultJson, retryCount + 1), DELAY, TimeUnit.SECONDS);
|
||||||
|
} else {
|
||||||
|
log.error("订单支付回调失败, 达到最大重试次数, 支付记录不存在, orderNo: {}", orderNo);
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (StrUtil.isNotBlank(payment.getTradeNumber())) {
|
if (StrUtil.isNotBlank(payment.getTradeNumber())) {
|
||||||
|
|||||||
@@ -772,14 +772,15 @@ public class PayServiceImpl implements PayService {
|
|||||||
|
|
||||||
private CzgResult<Map<String, Object>> microPay(@NonNull Long shopId, CzgMicroPayReq bizData) {
|
private CzgResult<Map<String, Object>> microPay(@NonNull Long shopId, CzgMicroPayReq bizData) {
|
||||||
AssertUtil.isBlank(bizData.getAuthCode(), "扫码失败,请重试");
|
AssertUtil.isBlank(bizData.getAuthCode(), "扫码失败,请重试");
|
||||||
|
if (bizData.getAuthCode().length() > 26) {
|
||||||
|
throw new CzgException("支付失败,不支持的条码");
|
||||||
|
}
|
||||||
ShopMerchant shopMerchant = getMerchant(shopId);
|
ShopMerchant shopMerchant = getMerchant(shopId);
|
||||||
bizData.assignMerchant(shopMerchant.getStoreId(), shopMerchant.getMerchantName(),
|
bizData.assignMerchant(shopMerchant.getStoreId(), shopMerchant.getMerchantName(),
|
||||||
sysParamsService.getSysParamValue(SysParamCodeEnum.PAY_CZG_NOTIFY_URL.getCode()));
|
sysParamsService.getSysParamValue(SysParamCodeEnum.PAY_CZG_NOTIFY_URL.getCode()));
|
||||||
String firstTwoDigitsStr = bizData.getAuthCode().substring(0, 2);
|
String firstTwoDigitsStr = bizData.getAuthCode().substring(0, 2);
|
||||||
|
|
||||||
// 将截取的字符串转换为整数
|
// 将截取的字符串转换为整数
|
||||||
int firstTwoDigits = Integer.parseInt(firstTwoDigitsStr);
|
int firstTwoDigits = Integer.parseInt(firstTwoDigitsStr);
|
||||||
|
|
||||||
// 判断范围
|
// 判断范围
|
||||||
if (firstTwoDigits >= 10 && firstTwoDigits <= 15) {
|
if (firstTwoDigits >= 10 && firstTwoDigits <= 15) {
|
||||||
//微信支付
|
//微信支付
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import cn.hutool.core.collection.CollUtil;
|
|||||||
import cn.hutool.core.convert.Convert;
|
import cn.hutool.core.convert.Convert;
|
||||||
import cn.hutool.core.thread.ThreadUtil;
|
import cn.hutool.core.thread.ThreadUtil;
|
||||||
import cn.hutool.core.util.NumberUtil;
|
import cn.hutool.core.util.NumberUtil;
|
||||||
|
import cn.hutool.core.util.ObjUtil;
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
import com.czg.config.RabbitPublisher;
|
import com.czg.config.RabbitPublisher;
|
||||||
import com.czg.enums.YesNoEnum;
|
import com.czg.enums.YesNoEnum;
|
||||||
@@ -70,7 +71,7 @@ public class ProductRpcServiceImpl implements ProductRpcService {
|
|||||||
if (CollUtil.isEmpty(list)) {
|
if (CollUtil.isEmpty(list)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
boolean isHasStockChangeToZero = false;
|
boolean isLowWarnLine = false;
|
||||||
for (ProductStockSubtractDTO dto : list) {
|
for (ProductStockSubtractDTO dto : list) {
|
||||||
Product product = productMapper.selectOneById(dto.getProductId());
|
Product product = productMapper.selectOneById(dto.getProductId());
|
||||||
if (product == null) {
|
if (product == null) {
|
||||||
@@ -97,8 +98,9 @@ public class ProductRpcServiceImpl implements ProductRpcService {
|
|||||||
productStockFlowService.saveFlow(flow);
|
productStockFlowService.saveFlow(flow);
|
||||||
cleanCategoryProduct(shopId, product.getCategoryId());
|
cleanCategoryProduct(shopId, product.getCategoryId());
|
||||||
refreshRedisProdStock(shopId, product.getId(), flow.getAfterNumber());
|
refreshRedisProdStock(shopId, product.getId(), flow.getAfterNumber());
|
||||||
if (!isHasStockChangeToZero && NumberUtil.isLessOrEqual(flow.getAfterNumber(), BigDecimal.ZERO)) {
|
Integer warnLine = ObjUtil.defaultIfNull(product.getWarnLine(), 10);
|
||||||
isHasStockChangeToZero = true;
|
if (!isLowWarnLine && NumberUtil.isLess(flow.getAfterNumber(), Convert.toBigDecimal(warnLine))) {
|
||||||
|
isLowWarnLine = true;
|
||||||
}
|
}
|
||||||
// 查询商品绑定耗材信息
|
// 查询商品绑定耗材信息
|
||||||
List<ProdConsRelation> relationList = prodConsRelationMapper.selectListByQuery(QueryWrapper.create().eq(ProdConsRelation::getProductId, dto.getProductId()));
|
List<ProdConsRelation> relationList = prodConsRelationMapper.selectListByQuery(QueryWrapper.create().eq(ProdConsRelation::getProductId, dto.getProductId()));
|
||||||
@@ -143,7 +145,7 @@ public class ProductRpcServiceImpl implements ProductRpcService {
|
|||||||
consStockFlowService.saveFlow(consStockFlow);
|
consStockFlowService.saveFlow(consStockFlow);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (isHasStockChangeToZero) {
|
if (isLowWarnLine) {
|
||||||
ThreadUtil.execAsync(() -> rabbitPublisher.sendProductInfoChangeMsg(Convert.toStr(shopId)));
|
ThreadUtil.execAsync(() -> rabbitPublisher.sendProductInfoChangeMsg(Convert.toStr(shopId)));
|
||||||
}
|
}
|
||||||
log.info("ProductService.--------------------------------------------库存更新成功");
|
log.info("ProductService.--------------------------------------------库存更新成功");
|
||||||
@@ -157,7 +159,7 @@ public class ProductRpcServiceImpl implements ProductRpcService {
|
|||||||
if (CollUtil.isEmpty(list)) {
|
if (CollUtil.isEmpty(list)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
boolean isHasStockChangeToZero = false;
|
boolean isLowWarnLine = false;
|
||||||
for (ProductStockSubtractDTO dto : list) {
|
for (ProductStockSubtractDTO dto : list) {
|
||||||
Product product = productMapper.selectOneById(dto.getProductId());
|
Product product = productMapper.selectOneById(dto.getProductId());
|
||||||
productMapper.updateProductStockNum(dto.getProductId(), dto.getShopId(), "add", dto.getNum());
|
productMapper.updateProductStockNum(dto.getProductId(), dto.getShopId(), "add", dto.getNum());
|
||||||
@@ -177,8 +179,9 @@ public class ProductRpcServiceImpl implements ProductRpcService {
|
|||||||
flow.setOrderId(orderId);
|
flow.setOrderId(orderId);
|
||||||
productStockFlowService.saveFlow(flow);
|
productStockFlowService.saveFlow(flow);
|
||||||
refreshRedisProdStock(shopId, product.getId(), flow.getAfterNumber());
|
refreshRedisProdStock(shopId, product.getId(), flow.getAfterNumber());
|
||||||
if (!isHasStockChangeToZero && (NumberUtil.isLessOrEqual(flow.getBeforeNumber(), BigDecimal.ZERO) || NumberUtil.isLessOrEqual(flow.getAfterNumber(), BigDecimal.ZERO))) {
|
Integer warnLine = ObjUtil.defaultIfNull(product.getWarnLine(), 10);
|
||||||
isHasStockChangeToZero = true;
|
if (!isLowWarnLine && (NumberUtil.isLessOrEqual(flow.getBeforeNumber(), BigDecimal.ZERO) || NumberUtil.isLess(flow.getAfterNumber(), Convert.toBigDecimal(warnLine)))) {
|
||||||
|
isLowWarnLine = true;
|
||||||
}
|
}
|
||||||
// 查询商品绑定耗材信息
|
// 查询商品绑定耗材信息
|
||||||
List<ProdConsRelation> relationList = prodConsRelationMapper.selectListByQuery(QueryWrapper.create().eq(ProdConsRelation::getProductId, dto.getProductId()));
|
List<ProdConsRelation> relationList = prodConsRelationMapper.selectListByQuery(QueryWrapper.create().eq(ProdConsRelation::getProductId, dto.getProductId()));
|
||||||
@@ -223,7 +226,7 @@ public class ProductRpcServiceImpl implements ProductRpcService {
|
|||||||
consStockFlowService.saveFlow(consStockFlow);
|
consStockFlowService.saveFlow(consStockFlow);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (isHasStockChangeToZero) {
|
if (isLowWarnLine) {
|
||||||
ThreadUtil.execAsync(() -> rabbitPublisher.sendProductInfoChangeMsg(Convert.toStr(shopId)));
|
ThreadUtil.execAsync(() -> rabbitPublisher.sendProductInfoChangeMsg(Convert.toStr(shopId)));
|
||||||
}
|
}
|
||||||
log.info("ProductService.--------------------------------------------库存更新成功");
|
log.info("ProductService.--------------------------------------------库存更新成功");
|
||||||
@@ -237,7 +240,7 @@ public class ProductRpcServiceImpl implements ProductRpcService {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
log.info(">>>>>>>>>>>>>>>>>:入参1:{}", list.size());
|
log.info(">>>>>>>>>>>>>>>>>:入参1:{}", list.size());
|
||||||
boolean isHasStockChangeToZero = false;
|
boolean isLowWarnLine = false;
|
||||||
for (ProductStockSubtractDTO dto : list) {
|
for (ProductStockSubtractDTO dto : list) {
|
||||||
Product product = productMapper.selectOneById(dto.getProductId());
|
Product product = productMapper.selectOneById(dto.getProductId());
|
||||||
log.info(">>>>>>>>>>>>>>>>>:入参2:{}", product.getName());
|
log.info(">>>>>>>>>>>>>>>>>:入参2:{}", product.getName());
|
||||||
@@ -270,8 +273,9 @@ public class ProductRpcServiceImpl implements ProductRpcService {
|
|||||||
log.info(">>>>>>>>>>>>>>>>>:入参4:{}", redisService.get(key));
|
log.info(">>>>>>>>>>>>>>>>>:入参4:{}", redisService.get(key));
|
||||||
refreshRedisProdStock(shopId, product.getId(), flow.getAfterNumber());
|
refreshRedisProdStock(shopId, product.getId(), flow.getAfterNumber());
|
||||||
log.info(">>>>>>>>>>>>>>>>>:入参5:{}", redisService.get(key));
|
log.info(">>>>>>>>>>>>>>>>>:入参5:{}", redisService.get(key));
|
||||||
if (!isHasStockChangeToZero && (NumberUtil.isLessOrEqual(flow.getBeforeNumber(), BigDecimal.ZERO) || NumberUtil.isLessOrEqual(flow.getAfterNumber(), BigDecimal.ZERO))) {
|
Integer warnLine = ObjUtil.defaultIfNull(product.getWarnLine(), 10);
|
||||||
isHasStockChangeToZero = true;
|
if (!isLowWarnLine && (NumberUtil.isLessOrEqual(flow.getBeforeNumber(), BigDecimal.ZERO) || NumberUtil.isLess(flow.getAfterNumber(), Convert.toBigDecimal(warnLine)))) {
|
||||||
|
isLowWarnLine = true;
|
||||||
}
|
}
|
||||||
// 查询商品绑定耗材信息
|
// 查询商品绑定耗材信息
|
||||||
List<ProdConsRelation> relationList = prodConsRelationMapper.selectListByQuery(QueryWrapper.create().eq(ProdConsRelation::getProductId, dto.getProductId()));
|
List<ProdConsRelation> relationList = prodConsRelationMapper.selectListByQuery(QueryWrapper.create().eq(ProdConsRelation::getProductId, dto.getProductId()));
|
||||||
@@ -316,7 +320,7 @@ public class ProductRpcServiceImpl implements ProductRpcService {
|
|||||||
consStockFlowService.saveFlow(consStockFlow);
|
consStockFlowService.saveFlow(consStockFlow);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (isHasStockChangeToZero) {
|
if (isLowWarnLine) {
|
||||||
ThreadUtil.execAsync(() -> rabbitPublisher.sendProductInfoChangeMsg(Convert.toStr(shopId)));
|
ThreadUtil.execAsync(() -> rabbitPublisher.sendProductInfoChangeMsg(Convert.toStr(shopId)));
|
||||||
}
|
}
|
||||||
log.info("ProductService.--------------------------------------------库存更新成功");
|
log.info("ProductService.--------------------------------------------库存更新成功");
|
||||||
|
|||||||
Reference in New Issue
Block a user