|
|
@@ -3,6 +3,7 @@ package com.kxs.product.biz.service.impl;
|
|
|
import cn.hutool.core.bean.BeanUtil;
|
|
|
import cn.hutool.core.util.IdUtil;
|
|
|
import com.alipay.api.AlipayApiException;
|
|
|
+import com.baomidou.dynamic.datasource.annotation.DSTransactional;
|
|
|
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
|
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
@@ -25,8 +26,10 @@ import com.kxs.product.api.model.*;
|
|
|
import com.kxs.product.api.vo.kxsapp.shop.*;
|
|
|
import com.kxs.product.biz.constant.enums.KxsShopEnum;
|
|
|
import com.kxs.product.biz.constant.enums.ProductErrorTypeEnum;
|
|
|
+import com.kxs.product.biz.constant.enums.TicketTypeEnum;
|
|
|
import com.kxs.product.biz.mapper.*;
|
|
|
import com.kxs.product.biz.service.KxsShopOrderService;
|
|
|
+import com.kxs.product.biz.service.KxsTicketService;
|
|
|
import com.kxs.user.api.feign.RemoteKxsUserService;
|
|
|
import io.seata.spring.annotation.GlobalTransactional;
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
@@ -35,6 +38,7 @@ import org.springframework.beans.BeanUtils;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
+import java.math.BigDecimal;
|
|
|
import java.time.LocalDateTime;
|
|
|
import java.util.List;
|
|
|
import java.util.Objects;
|
|
|
@@ -60,7 +64,7 @@ public class KxsShopOrderServiceImpl extends ServiceImpl<KxsShopOrderMapper, Kxs
|
|
|
|
|
|
private final PaymentFactory paymentFactory;
|
|
|
private final KxsShopGoodsSkuMapper kxsShopGoodsSkuMapper;
|
|
|
- private final KxsTicketMapper kxsTicketMapper;
|
|
|
+ private final KxsTicketService kxsTicketService;
|
|
|
private final IMQSender mqSender;
|
|
|
private final KxsShopGoodsMapper kxsShopGoodsMapper;
|
|
|
@Override
|
|
|
@@ -72,6 +76,17 @@ public class KxsShopOrderServiceImpl extends ServiceImpl<KxsShopOrderMapper, Kxs
|
|
|
//订单号
|
|
|
String orderSn = CommonConstants.KXS_SHOP_PREFIX + IdUtil.getSnowflakeNextIdStr();
|
|
|
|
|
|
+ //查询商品
|
|
|
+ KxsShopGoods goods = goodsMapper.selectById(param.getGoodsId());
|
|
|
+ Optional.ofNullable(goods).orElseThrow(() -> new GlobalCustomerException("商品不存在"));
|
|
|
+ //查询商品sku
|
|
|
+ KxsShopGoodsSku kxsShopGoodsSku = kxsShopGoodsSkuMapper.selectOne(Wrappers.<KxsShopGoodsSku>query().lambda().eq(KxsShopGoodsSku::getGoodId, goods.getId()));
|
|
|
+ Optional.ofNullable(kxsShopGoodsSku).orElseThrow(() -> new GlobalCustomerException("商品sku不存在"));
|
|
|
+ BigDecimal totalPrice = kxsShopGoodsSku.getPrice().multiply(new BigDecimal(param.getNumber()));
|
|
|
+ if(totalPrice.compareTo(param.getTotalPrice()) != 0){
|
|
|
+ return R.failed("订单金额不一致");
|
|
|
+ }
|
|
|
+
|
|
|
KxsShopOrder order = new KxsShopOrder();
|
|
|
//参数赋值
|
|
|
BeanUtils.copyProperties(param, order);
|
|
|
@@ -81,41 +96,35 @@ public class KxsShopOrderServiceImpl extends ServiceImpl<KxsShopOrderMapper, Kxs
|
|
|
order.setPayPrice(order.getTotalPrice());
|
|
|
baseMapper.insert(order);
|
|
|
|
|
|
- //查询商品
|
|
|
- KxsShopGoods goods = goodsMapper.selectById(param.getGoodsId());
|
|
|
- Optional.ofNullable(goods).orElseThrow(() -> new GlobalCustomerException("商品不存在"));
|
|
|
- //查询商品sku
|
|
|
- KxsShopGoodsSku kxsShopGoodsSku = kxsShopGoodsSkuMapper.selectOne(Wrappers.<KxsShopGoodsSku>query().lambda().eq(KxsShopGoodsSku::getGoodId, goods.getId()));
|
|
|
- if (kxsShopGoodsSku != null){
|
|
|
- //当sku库存不为null时需做存量校验
|
|
|
- if (kxsShopGoodsSku.getStockNum() != null && kxsShopGoodsSku.getStockNum() != -1){
|
|
|
- int i = kxsShopGoodsSku.getStockNum() - param.getNumber();
|
|
|
- if(i < 0){
|
|
|
- return R.failed("当前库存不足");
|
|
|
- }
|
|
|
- kxsShopGoodsSku.setStockNum(i);
|
|
|
- //修改库存
|
|
|
- kxsShopGoodsSkuMapper.updateById(kxsShopGoodsSku);
|
|
|
+
|
|
|
+ //当sku库存不为null时需做存量校验
|
|
|
+ if (kxsShopGoodsSku.getStockNum() != null && kxsShopGoodsSku.getStockNum() != -1){
|
|
|
+ int i = kxsShopGoodsSku.getStockNum() - param.getNumber();
|
|
|
+ if(i < 0){
|
|
|
+ throw new GlobalCustomerException("当前库存不足");
|
|
|
}
|
|
|
- //校验是否存在起购以及限购数量校验
|
|
|
- if (kxsShopGoodsSku.getStartByCount() != null && kxsShopGoodsSku.getStartByCount() != 0){
|
|
|
- boolean b = kxsShopGoodsSku.getStartByCount() > param.getNumber();
|
|
|
- if (b){
|
|
|
- return R.failed("该商品最低" + kxsShopGoodsSku.getStartByCount() + "件起购");
|
|
|
- }
|
|
|
- }else if (kxsShopGoodsSku.getLimitCount() != null && kxsShopGoodsSku.getLimitCount() != 0){
|
|
|
- boolean b = kxsShopGoodsSku.getLimitCount() < param.getNumber();
|
|
|
- if (b){
|
|
|
- return R.failed("该商品每人最多购买" + kxsShopGoodsSku.getLimitCount() + "件");
|
|
|
- }
|
|
|
+ kxsShopGoodsSku.setStockNum(i);
|
|
|
+ //修改库存
|
|
|
+ kxsShopGoodsSkuMapper.updateById(kxsShopGoodsSku);
|
|
|
+ }
|
|
|
+ //校验是否存在起购以及限购数量校验
|
|
|
+ if (kxsShopGoodsSku.getStartByCount() != null && kxsShopGoodsSku.getStartByCount() != 0){
|
|
|
+ boolean b = kxsShopGoodsSku.getStartByCount() > param.getNumber();
|
|
|
+ if (b){
|
|
|
+ throw new GlobalCustomerException("该商品最低" + kxsShopGoodsSku.getStartByCount() + "件起购");
|
|
|
+ }
|
|
|
+ }else if (kxsShopGoodsSku.getLimitCount() != null && kxsShopGoodsSku.getLimitCount() != 0){
|
|
|
+ boolean b = kxsShopGoodsSku.getLimitCount() < param.getNumber();
|
|
|
+ if (b){
|
|
|
+ throw new GlobalCustomerException("该商品每人最多购买" + kxsShopGoodsSku.getLimitCount() + "件");
|
|
|
}
|
|
|
}
|
|
|
//订单详情
|
|
|
KxsShopOrderInfo orderInfo = new KxsShopOrderInfo();
|
|
|
orderInfo.setNumber(param.getNumber());
|
|
|
orderInfo.setGoodsId(param.getGoodsId());
|
|
|
- orderInfo.setSkuId(param.getSkuId());
|
|
|
- orderInfo.setSpecifications(param.getSpecifications());
|
|
|
+ orderInfo.setSkuId(kxsShopGoodsSku.getId());
|
|
|
+ orderInfo.setSpecifications(kxsShopGoodsSku.getSpecifications());
|
|
|
orderInfo.setGoodsName(goods.getGoodsName());
|
|
|
orderInfo.setGoodsPrice(goods.getPrice());
|
|
|
orderInfo.setPicUrl(goods.getPicUrl());
|
|
|
@@ -152,7 +161,7 @@ public class KxsShopOrderServiceImpl extends ServiceImpl<KxsShopOrderMapper, Kxs
|
|
|
shopOrderDetailVO.getGoodsList().add(infoListVO);
|
|
|
});
|
|
|
//机具券集合
|
|
|
- List<KxsTicket> kxsTickets = kxsTicketMapper.selectList(Wrappers.<KxsTicket>lambdaQuery().eq(KxsTicket::getOrderId, orderId));
|
|
|
+ List<KxsTicket> kxsTickets = kxsTicketService.list(Wrappers.<KxsTicket>lambdaQuery().eq(KxsTicket::getOrderId, orderId));
|
|
|
shopOrderDetailVO.setTicketCodes(kxsTickets.stream().map(KxsTicket::getTicketCode).collect(Collectors.toList()));
|
|
|
|
|
|
return shopOrderDetailVO;
|
|
|
@@ -177,7 +186,7 @@ public class KxsShopOrderServiceImpl extends ServiceImpl<KxsShopOrderMapper, Kxs
|
|
|
}
|
|
|
|
|
|
//校验支付方式,邮寄需要
|
|
|
- if (param.getGetMode().equals(1)){
|
|
|
+ if (Objects.equals(param.getGetMode(), KxsShopEnum.ORDER_ERP.getType())){
|
|
|
order.setGetMode(param.getGetMode());
|
|
|
order.setPhone(param.getPhone());
|
|
|
order.setConsignee(param.getConsignee());
|
|
|
@@ -186,7 +195,7 @@ public class KxsShopOrderServiceImpl extends ServiceImpl<KxsShopOrderMapper, Kxs
|
|
|
order.setRemark(param.getRemark());
|
|
|
//修改订单地址
|
|
|
updateById(order);
|
|
|
- }else if (param.getGetMode().equals(0)){
|
|
|
+ }else {
|
|
|
order.setGetMode(param.getGetMode());
|
|
|
order.setPayType(param.getPayType());
|
|
|
order.setRemark(param.getRemark());
|
|
|
@@ -202,71 +211,92 @@ public class KxsShopOrderServiceImpl extends ServiceImpl<KxsShopOrderMapper, Kxs
|
|
|
|
|
|
//余额支付
|
|
|
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("支付密码错误");
|
|
|
+ throw new GlobalCustomerException("支付密码错误");
|
|
|
}
|
|
|
|
|
|
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.setPayTypeEnum(PayPlatformEnum.YUEPAY);
|
|
|
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);
|
|
|
+ YuePayMessage payMessage = BeanUtil.toBean(payResponse.getResult(), 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());
|
|
|
+ throw new GlobalCustomerException("余额支付异常");
|
|
|
}
|
|
|
} catch (AlipayApiException e) {
|
|
|
throw new GlobalCustomerException("余额支付异常");
|
|
|
}
|
|
|
- //修改订单信息
|
|
|
- this.update(lambdaUpdateWrapper);
|
|
|
- //TODO 余额走支付接下来的逻辑
|
|
|
- //根据订单详情依次处理
|
|
|
- for (KxsShopOrderInfo kxsShopOrderInfo : kxsShopOrderInfos) {
|
|
|
- switch(kxsShopOrderInfo.getGoodsId()){
|
|
|
- case 10:
|
|
|
- //电签兑换券流程
|
|
|
- List<KxsTicket> kxsTickets = kxsTicketMapper.selectList(new Page<>(1, 3), Wrappers.<KxsTicket>query().lambda()
|
|
|
- .eq(KxsTicket::getUserId, 0)
|
|
|
- .eq(KxsTicket::getTicketType, 0)
|
|
|
- .eq(KxsTicket::getStatus, 0));
|
|
|
- if (kxsTickets.size() < 3){
|
|
|
- throw new GlobalCustomerException("劵码库存不足");
|
|
|
- }
|
|
|
- for (KxsTicket kxsTicket : kxsTickets) {
|
|
|
- kxsTicket.setUpdateTime(LocalDateTime.now());
|
|
|
- kxsTicket.setStatus(0);
|
|
|
- kxsTicket.setUserId(Math.toIntExact(order.getUserId()));
|
|
|
- kxsTicket.setTicketAllotPath(kxsTicket.getTicketAllotPath() + order.getUserId() + "," );
|
|
|
- kxsTicket.setOrderId(order.getId());
|
|
|
- //todo 盟主 合伙人标记
|
|
|
-// kxsTicket.setLeaderId();
|
|
|
-// kxsTicket.setPartnerId();
|
|
|
- kxsTicketMapper.updateById(kxsTicket);
|
|
|
- }
|
|
|
- }
|
|
|
+
|
|
|
+ //目前只能下单一个商品,故直接取之
|
|
|
+ KxsShopOrderInfo kxsShopOrderInfo = kxsShopOrderInfos.get(0);
|
|
|
+ switch(kxsShopOrderInfo.getGoodsId()){
|
|
|
+ case 10:
|
|
|
+ if(!kxsTicketService.userBuyTicket(order.getUserId(), TicketTypeEnum.CODE_DQ.getType(), order.getId(), kxsShopOrderInfo.getNumber() * 3)){
|
|
|
+ throw new GlobalCustomerException("兑换电签机具券失败" + order.getOrderSn());
|
|
|
+ }
|
|
|
+ case 11:
|
|
|
+ if(!kxsTicketService.userBuyTicket(order.getUserId(), TicketTypeEnum.CODE_DJ.getType(), order.getId(), kxsShopOrderInfo.getNumber() * 2)){
|
|
|
+ throw new GlobalCustomerException("兑换大机机具券失败" + order.getOrderSn());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ KxsShopGoods goods = kxsShopGoodsMapper.selectById(kxsShopOrderInfo.getGoodsId());
|
|
|
+ //虚拟商品改为已完成
|
|
|
+ if(Objects.equals(goods.getGoodsType(), KxsShopEnum.GOODS_VIRTUAL.getType())){
|
|
|
+ lambdaUpdateWrapper.set(KxsShopOrder::getStatus, KxsShopEnum.ORDER_CONFIRM.getType());
|
|
|
}
|
|
|
|
|
|
+ this.update(lambdaUpdateWrapper);
|
|
|
+ }
|
|
|
|
|
|
+ return R.ok();
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public void payBack(String outTradeNo) {
|
|
|
+ KxsShopOrder order = baseMapper.selectOne(Wrappers.<KxsShopOrder>lambdaQuery().eq(KxsShopOrder::getOrderSn, outTradeNo).last("FOR UPDATE"));
|
|
|
+ if(order == null){
|
|
|
+ throw new GlobalCustomerException("订单支付回调未找到订单号:" + outTradeNo);
|
|
|
+ }
|
|
|
+ if(!Objects.equals(order.getStatus(), KxsShopEnum.ORDER_NO_PAY.getType())){
|
|
|
+ throw new GlobalCustomerException("订单支付回调状态错误订单号:" + outTradeNo);
|
|
|
+ }
|
|
|
+ order.setStatus(KxsShopEnum.ORDER_NO_SEND.getType());
|
|
|
+ order.setPayTime(LocalDateTime.now());
|
|
|
+ List<KxsShopOrderInfo> kxsShopOrderInfos = orderInfoMapper.selectList(Wrappers.<KxsShopOrderInfo>lambdaQuery().eq(KxsShopOrderInfo::getOrderId, order.getId()));
|
|
|
+ KxsShopOrderInfo kxsShopOrderInfo = kxsShopOrderInfos.get(0);
|
|
|
+ switch(kxsShopOrderInfo.getGoodsId()){
|
|
|
+ case 10:
|
|
|
+ if(!kxsTicketService.userBuyTicket(order.getUserId(), TicketTypeEnum.CODE_DQ.getType(), order.getId(), kxsShopOrderInfo.getNumber() * 3)){
|
|
|
+ throw new GlobalCustomerException("兑换电签机具券失败订单号:" + outTradeNo);
|
|
|
+ }
|
|
|
+ case 11:
|
|
|
+ if(!kxsTicketService.userBuyTicket(order.getUserId(), TicketTypeEnum.CODE_DJ.getType(), order.getId(), kxsShopOrderInfo.getNumber() * 2)){
|
|
|
+ throw new GlobalCustomerException("兑换大机机具券失败订单号:" + outTradeNo);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ KxsShopGoods goods = kxsShopGoodsMapper.selectById(kxsShopOrderInfo.getGoodsId());
|
|
|
+ //虚拟商品改为已完成
|
|
|
+ if(Objects.equals(goods.getGoodsType(), KxsShopEnum.GOODS_VIRTUAL.getType())){
|
|
|
+ order.setStatus(KxsShopEnum.ORDER_CONFIRM.getType());
|
|
|
}
|
|
|
|
|
|
+ this.updateById(order);
|
|
|
|
|
|
- return R.ok();
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -343,6 +373,7 @@ public class KxsShopOrderServiceImpl extends ServiceImpl<KxsShopOrderMapper, Kxs
|
|
|
}
|
|
|
|
|
|
|
|
|
+
|
|
|
/**
|
|
|
* 支付宝支付
|
|
|
*
|
|
|
@@ -359,7 +390,7 @@ public class KxsShopOrderServiceImpl extends ServiceImpl<KxsShopOrderMapper, Kxs
|
|
|
payReq.setSubject(subject);
|
|
|
payReq.setTotalAmount(param.getPayPrice().doubleValue());
|
|
|
//扩展参数
|
|
|
- payReq.setPassbackParams("shop_order");
|
|
|
+ payReq.setPassbackParams(CommonConstants.SHOP_ORDER_FLAG);
|
|
|
|
|
|
PayResponse payResponse = paymentFactory.getPayService(PayPlatformEnum.ALIPAY.getType()).appPay(payReq);
|
|
|
|