|
@@ -1,31 +1,50 @@
|
|
|
package com.kxs.product.biz.service.impl;
|
|
package com.kxs.product.biz.service.impl;
|
|
|
|
|
|
|
|
-import cn.hutool.core.lang.Snowflake;
|
|
|
|
|
|
|
+import cn.hutool.core.bean.BeanUtil;
|
|
|
import cn.hutool.core.util.IdUtil;
|
|
import cn.hutool.core.util.IdUtil;
|
|
|
|
|
+import com.alipay.api.AlipayApiException;
|
|
|
|
|
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
|
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
|
|
+import com.kxs.common.core.constant.CommonConstants;
|
|
|
|
|
+import com.kxs.common.core.exception.GlobalCustomerException;
|
|
|
import com.kxs.common.core.util.R;
|
|
import com.kxs.common.core.util.R;
|
|
|
|
|
+import com.kxs.common.pay.enums.PayConstants;
|
|
|
|
|
+import com.kxs.common.pay.enums.PayPlatformEnum;
|
|
|
|
|
+import com.kxs.common.pay.enums.PayStatusCommEnum;
|
|
|
|
|
+import com.kxs.common.pay.factory.PaymentFactory;
|
|
|
|
|
+import com.kxs.common.pay.model.PayRequest;
|
|
|
|
|
+import com.kxs.common.pay.model.PayResponse;
|
|
|
|
|
+import com.kxs.common.pay.model.YuePayMessage;
|
|
|
import com.kxs.common.security.util.SecurityUtils;
|
|
import com.kxs.common.security.util.SecurityUtils;
|
|
|
|
|
+import com.kxs.product.api.dto.kxsapp.shop.GoodsSubmitDTO;
|
|
|
|
|
+import com.kxs.product.api.dto.kxsapp.shop.PayOrderDTO;
|
|
|
import com.kxs.product.api.model.KxsShopGoods;
|
|
import com.kxs.product.api.model.KxsShopGoods;
|
|
|
|
|
+import com.kxs.product.api.model.KxsShopOrder;
|
|
|
import com.kxs.product.api.model.KxsShopOrderInfo;
|
|
import com.kxs.product.api.model.KxsShopOrderInfo;
|
|
|
-import com.kxs.product.api.dto.kxsapp.shop.GoodsSubmitDTO;
|
|
|
|
|
import com.kxs.product.api.vo.kxsapp.shop.*;
|
|
import com.kxs.product.api.vo.kxsapp.shop.*;
|
|
|
import com.kxs.product.biz.constant.enums.KxsShopEnum;
|
|
import com.kxs.product.biz.constant.enums.KxsShopEnum;
|
|
|
import com.kxs.product.biz.constant.enums.ProductErrorTypeEnum;
|
|
import com.kxs.product.biz.constant.enums.ProductErrorTypeEnum;
|
|
|
import com.kxs.product.biz.mapper.KxsShopGoodsMapper;
|
|
import com.kxs.product.biz.mapper.KxsShopGoodsMapper;
|
|
|
import com.kxs.product.biz.mapper.KxsShopOrderInfoMapper;
|
|
import com.kxs.product.biz.mapper.KxsShopOrderInfoMapper;
|
|
|
import com.kxs.product.biz.mapper.KxsShopOrderMapper;
|
|
import com.kxs.product.biz.mapper.KxsShopOrderMapper;
|
|
|
-import com.kxs.product.api.model.KxsShopOrder;
|
|
|
|
|
import com.kxs.product.biz.service.KxsShopOrderService;
|
|
import com.kxs.product.biz.service.KxsShopOrderService;
|
|
|
import com.kxs.user.api.feign.RemoteKxsUserService;
|
|
import com.kxs.user.api.feign.RemoteKxsUserService;
|
|
|
|
|
+import com.lly835.bestpay.enums.OrderStatusEnum;
|
|
|
|
|
+import io.seata.spring.annotation.GlobalTransactional;
|
|
|
import lombok.RequiredArgsConstructor;
|
|
import lombok.RequiredArgsConstructor;
|
|
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
import org.springframework.beans.BeanUtils;
|
|
import org.springframework.beans.BeanUtils;
|
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
|
|
|
|
+import java.time.LocalDateTime;
|
|
|
import java.util.List;
|
|
import java.util.List;
|
|
|
|
|
+import java.util.Objects;
|
|
|
|
|
+import java.util.Optional;
|
|
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* 商城订单表(KxsShopOrder)表服务实现类
|
|
* 商城订单表(KxsShopOrder)表服务实现类
|
|
@@ -35,6 +54,7 @@ import java.util.List;
|
|
|
*/
|
|
*/
|
|
|
@Service("kxsShopOrderService")
|
|
@Service("kxsShopOrderService")
|
|
|
@RequiredArgsConstructor
|
|
@RequiredArgsConstructor
|
|
|
|
|
+@Slf4j
|
|
|
public class KxsShopOrderServiceImpl extends ServiceImpl<KxsShopOrderMapper, KxsShopOrder> implements KxsShopOrderService {
|
|
public class KxsShopOrderServiceImpl extends ServiceImpl<KxsShopOrderMapper, KxsShopOrder> implements KxsShopOrderService {
|
|
|
|
|
|
|
|
private final KxsShopGoodsMapper goodsMapper;
|
|
private final KxsShopGoodsMapper goodsMapper;
|
|
@@ -43,6 +63,8 @@ public class KxsShopOrderServiceImpl extends ServiceImpl<KxsShopOrderMapper, Kxs
|
|
|
|
|
|
|
|
private final RemoteKxsUserService remoteKxsUserService;
|
|
private final RemoteKxsUserService remoteKxsUserService;
|
|
|
|
|
|
|
|
|
|
+ private final PaymentFactory paymentFactory;
|
|
|
|
|
+
|
|
|
@Override
|
|
@Override
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
public R submitOrder(GoodsSubmitDTO param) {
|
|
public R submitOrder(GoodsSubmitDTO param) {
|
|
@@ -50,20 +72,20 @@ public class KxsShopOrderServiceImpl extends ServiceImpl<KxsShopOrderMapper, Kxs
|
|
|
Long userId = SecurityUtils.getUser().getId();
|
|
Long userId = SecurityUtils.getUser().getId();
|
|
|
|
|
|
|
|
//订单号
|
|
//订单号
|
|
|
- Snowflake snowflake = IdUtil.getSnowflake(1, userId);
|
|
|
|
|
- long orderSn = snowflake.nextId();
|
|
|
|
|
|
|
+ String orderSn = CommonConstants.KXS_SHOP_PREFIX + IdUtil.getSnowflakeNextIdStr();
|
|
|
|
|
|
|
|
KxsShopOrder order = new KxsShopOrder();
|
|
KxsShopOrder order = new KxsShopOrder();
|
|
|
//参数赋值
|
|
//参数赋值
|
|
|
BeanUtils.copyProperties(param, order);
|
|
BeanUtils.copyProperties(param, order);
|
|
|
order.setUserId(userId);
|
|
order.setUserId(userId);
|
|
|
- order.setOrderSn(String.valueOf(orderSn));
|
|
|
|
|
|
|
+ order.setOrderSn(orderSn);
|
|
|
//支付金额
|
|
//支付金额
|
|
|
order.setPayPrice(order.getTotalPrice());
|
|
order.setPayPrice(order.getTotalPrice());
|
|
|
baseMapper.insert(order);
|
|
baseMapper.insert(order);
|
|
|
|
|
|
|
|
//查询商品
|
|
//查询商品
|
|
|
KxsShopGoods goods = goodsMapper.selectById(param.getGoodsId());
|
|
KxsShopGoods goods = goodsMapper.selectById(param.getGoodsId());
|
|
|
|
|
+ Optional.ofNullable(goods).orElseThrow(() -> new GlobalCustomerException("商品不存在"));
|
|
|
//订单详情
|
|
//订单详情
|
|
|
KxsShopOrderInfo orderInfo = new KxsShopOrderInfo();
|
|
KxsShopOrderInfo orderInfo = new KxsShopOrderInfo();
|
|
|
orderInfo.setNumber(param.getNumber());
|
|
orderInfo.setNumber(param.getNumber());
|
|
@@ -76,7 +98,7 @@ public class KxsShopOrderServiceImpl extends ServiceImpl<KxsShopOrderMapper, Kxs
|
|
|
orderInfo.setOrderId(order.getId());
|
|
orderInfo.setOrderId(order.getId());
|
|
|
orderInfoMapper.insert(orderInfo);
|
|
orderInfoMapper.insert(orderInfo);
|
|
|
|
|
|
|
|
- return R.ok(Boolean.TRUE);
|
|
|
|
|
|
|
+ return R.ok(order.getId());
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -103,26 +125,74 @@ public class KxsShopOrderServiceImpl extends ServiceImpl<KxsShopOrderMapper, Kxs
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
- public R payOrder(KxsShopOrder param) {
|
|
|
|
|
|
|
+ @GlobalTransactional(rollbackFor = Exception.class)
|
|
|
|
|
+ public R payOrder(PayOrderDTO param) {
|
|
|
|
|
|
|
|
|
|
+ if(param.getId() == null){
|
|
|
|
|
+ return R.failed(ProductErrorTypeEnum.ORDER_EMPTY.getDescription());
|
|
|
|
|
+ }
|
|
|
|
|
+ if(param.getPayType() == null){
|
|
|
|
|
+ return R.failed("请选择支付方式");
|
|
|
|
|
+ }
|
|
|
KxsShopOrder order = baseMapper.selectById(param.getId());
|
|
KxsShopOrder order = baseMapper.selectById(param.getId());
|
|
|
if(order == null){
|
|
if(order == null){
|
|
|
return R.failed(ProductErrorTypeEnum.ORDER_EMPTY.getDescription());
|
|
return R.failed(ProductErrorTypeEnum.ORDER_EMPTY.getDescription());
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
- //余额支付
|
|
|
|
|
- if(param.getPayType().equals(KxsShopEnum.YUE_PAY.getType())){
|
|
|
|
|
- return this.yuePay(param);
|
|
|
|
|
|
|
+ if(!Objects.equals(order.getStatus(), KxsShopEnum.ORDER_NO_PAY.getType())){
|
|
|
|
|
+ return R.failed(ProductErrorTypeEnum.ORDER_STATUS_ERROR.getDescription());
|
|
|
}
|
|
}
|
|
|
|
|
+ List<KxsShopOrderInfo> kxsShopOrderInfos = orderInfoMapper.selectList(Wrappers.<KxsShopOrderInfo>lambdaQuery().eq(KxsShopOrderInfo::getOrderId, order.getId()));
|
|
|
|
|
+ String subject = kxsShopOrderInfos.stream().map(KxsShopOrderInfo::getGoodsName).collect(Collectors.joining(","));
|
|
|
|
|
|
|
|
//支付宝支付
|
|
//支付宝支付
|
|
|
if(param.getPayType().equals(KxsShopEnum.ALI_PAY.getType())){
|
|
if(param.getPayType().equals(KxsShopEnum.ALI_PAY.getType())){
|
|
|
- return this.aliPay(param);
|
|
|
|
|
|
|
+ return this.aliPay(order, subject);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- return R.failed();
|
|
|
|
|
|
|
+ //余额支付
|
|
|
|
|
+ if(param.getPayType().equals(KxsShopEnum.YUE_PAY.getType())){
|
|
|
|
|
+ Optional.ofNullable(param.getPayPwd()).orElseThrow(() -> new GlobalCustomerException("请输入支付密码"));
|
|
|
|
|
+ //校验支付密码
|
|
|
|
|
+ R<Boolean> booleanR = remoteKxsUserService.checkPayPwd(param.getPayPwd());
|
|
|
|
|
+ if(booleanR.getStatus() != 1 || !booleanR.getData()){
|
|
|
|
|
+ return R.failed("支付密码错误");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ LambdaUpdateWrapper<KxsShopOrder> lambdaUpdateWrapper = Wrappers.<KxsShopOrder>lambdaUpdate().eq(KxsShopOrder::getId, param.getId());
|
|
|
|
|
+ lambdaUpdateWrapper.set(KxsShopOrder::getPayType, param.getPayType())
|
|
|
|
|
+ .set(KxsShopOrder::getGetMode, param.getGetMode())
|
|
|
|
|
+ .set(KxsShopOrder::getRemark, param.getRemark());
|
|
|
|
|
+
|
|
|
|
|
+ PayRequest payReq = new PayRequest();
|
|
|
|
|
+ payReq.setPayTypeEnum(PayPlatformEnum.ALIPAY);
|
|
|
|
|
+ payReq.setOutTradeNo(order.getOrderSn());
|
|
|
|
|
+ payReq.setSubject(subject);
|
|
|
|
|
+ payReq.setTotalAmount(order.getPayPrice().doubleValue());
|
|
|
|
|
+ try {
|
|
|
|
|
+ PayResponse payResponse = paymentFactory.getPayService(PayPlatformEnum.YUEPAY.getType()).appPay(payReq);
|
|
|
|
|
+
|
|
|
|
|
+ YuePayMessage payMessage = BeanUtil.toBean(payResponse, YuePayMessage.class);
|
|
|
|
|
+ if (payMessage != null) {
|
|
|
|
|
+ //支付成功
|
|
|
|
|
+ lambdaUpdateWrapper.set(KxsShopOrder::getStatus, KxsShopEnum.ORDER_NO_SEND.getType());
|
|
|
|
|
+ lambdaUpdateWrapper.set(KxsShopOrder::getPayTime, LocalDateTime.now());
|
|
|
|
|
+ }else{
|
|
|
|
|
+ return R.failed(payResponse.getResult());
|
|
|
|
|
+ }
|
|
|
|
|
+ } catch (AlipayApiException e) {
|
|
|
|
|
+ throw new GlobalCustomerException("余额支付异常");
|
|
|
|
|
+ }
|
|
|
|
|
+ //修改订单信息
|
|
|
|
|
+ this.update(lambdaUpdateWrapper);
|
|
|
|
|
+ //TODO 余额走支付接下来的逻辑
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ return R.ok();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
@Override
|
|
@Override
|
|
|
public R cancelOrder(KxsShopOrder param) {
|
|
public R cancelOrder(KxsShopOrder param) {
|
|
|
|
|
|
|
@@ -194,24 +264,32 @@ public class KxsShopOrderServiceImpl extends ServiceImpl<KxsShopOrderMapper, Kxs
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- /**
|
|
|
|
|
- * 余额支付
|
|
|
|
|
- *
|
|
|
|
|
- * @param param 参数
|
|
|
|
|
- * @return {@link R}
|
|
|
|
|
- */
|
|
|
|
|
- private R yuePay(KxsShopOrder param){
|
|
|
|
|
- return R.ok();
|
|
|
|
|
- }
|
|
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* 支付宝支付
|
|
* 支付宝支付
|
|
|
*
|
|
*
|
|
|
- * @param param 参数
|
|
|
|
|
|
|
+ * @param param 参数
|
|
|
|
|
+ * @param subject 订单标题。
|
|
|
* @return {@link R}
|
|
* @return {@link R}
|
|
|
*/
|
|
*/
|
|
|
- private R aliPay(KxsShopOrder param){
|
|
|
|
|
- return R.ok();
|
|
|
|
|
|
|
+ private R aliPay(KxsShopOrder param, String subject){
|
|
|
|
|
+
|
|
|
|
|
+ try {
|
|
|
|
|
+ PayRequest payReq = new PayRequest();
|
|
|
|
|
+ payReq.setPayTypeEnum(PayPlatformEnum.ALIPAY);
|
|
|
|
|
+ payReq.setOutTradeNo(param.getOrderSn());
|
|
|
|
|
+ payReq.setSubject(subject);
|
|
|
|
|
+ payReq.setTotalAmount(param.getPayPrice().doubleValue());
|
|
|
|
|
+ //扩展参数
|
|
|
|
|
+ payReq.setPassbackParams("shop_order");
|
|
|
|
|
+
|
|
|
|
|
+ PayResponse payResponse = paymentFactory.getPayService(PayPlatformEnum.ALIPAY.getType()).appPay(payReq);
|
|
|
|
|
+
|
|
|
|
|
+ return R.ok(payResponse);
|
|
|
|
|
+ } catch (AlipayApiException e) {
|
|
|
|
|
+ log.error("支付宝支付异常:{}", param.getOrderSn(), e);
|
|
|
|
|
+ throw new GlobalCustomerException("支付宝参数异常");
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|