|
@@ -2,10 +2,14 @@ package com.yonge.cooleshow.portal.service.impl;
|
|
|
|
|
|
import cn.hutool.core.bean.BeanUtil;
|
|
|
import cn.hutool.core.collection.CollUtil;
|
|
|
+import com.alibaba.fastjson.JSON;
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
import com.github.pagehelper.PageHelper;
|
|
|
+import com.yonge.cooleshow.portal.dao.PortalProductDao;
|
|
|
+import com.yonge.cooleshow.portal.dto.OrderPayReq;
|
|
|
+import com.yonge.cooleshow.portal.dto.OrderPayRes;
|
|
|
import com.yonge.toolset.base.exception.BizException;
|
|
|
-import com.yonge.cooleshow.enums.PayStatusEnum;
|
|
|
+
|
|
|
import com.yonge.cooleshow.mall.common.api.CommonPage;
|
|
|
import com.yonge.cooleshow.mall.common.exception.Asserts;
|
|
|
import com.yonge.cooleshow.mall.common.service.RedisService;
|
|
@@ -17,11 +21,21 @@ import com.yonge.cooleshow.portal.dao.PortalOrderItemDao;
|
|
|
import com.yonge.cooleshow.portal.dao.SmsCouponHistoryDao;
|
|
|
import com.yonge.cooleshow.portal.domain.*;
|
|
|
import com.yonge.cooleshow.portal.service.*;
|
|
|
-import com.yonge.cooleshow.sdk.adapay.PaymentSdk;
|
|
|
-import com.yonge.cooleshow.sdk.req.OrderPayReq;
|
|
|
-import com.yonge.cooleshow.sdk.res.OrderPayRes;
|
|
|
-import com.yonge.cooleshow.service.PaymentService;
|
|
|
+import com.yonge.toolset.payment.base.enums.PaymentClientEnum;
|
|
|
import com.yonge.toolset.utils.string.StringUtil;
|
|
|
+
|
|
|
+import com.yonge.toolset.base.result.BaseResult;
|
|
|
+import com.yonge.toolset.payment.base.enums.OpenEnum;
|
|
|
+import com.yonge.toolset.payment.base.enums.PayChannelEnum;
|
|
|
+import com.yonge.toolset.payment.base.enums.TradeStatusEnum;
|
|
|
+import com.yonge.toolset.payment.base.model.DeviceInfo;
|
|
|
+import com.yonge.toolset.payment.base.model.DivMember;
|
|
|
+import com.yonge.toolset.payment.base.model.OrderDetil;
|
|
|
+import com.yonge.toolset.payment.base.model.Payment;
|
|
|
+import com.yonge.toolset.payment.base.model.callback.PaymentCallBack;
|
|
|
+import com.yonge.toolset.payment.core.props.PaymentProperties;
|
|
|
+import com.yonge.toolset.payment.core.service.PaymentClient;
|
|
|
+
|
|
|
import org.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
@@ -65,7 +79,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
|
|
|
private SmsCouponHistoryMapper couponHistoryMapper;
|
|
|
@Autowired
|
|
|
private RedisService redisService;
|
|
|
- private String REDIS_KEY_ORDER_ID= "redis.key.orderId";
|
|
|
+ private String REDIS_KEY_ORDER_ID = "redis.key.orderId";
|
|
|
private String REDIS_DATABASE = "redis.database";
|
|
|
@Autowired
|
|
|
private PortalOrderDao portalOrderDao;
|
|
@@ -79,18 +93,25 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
|
|
|
@Autowired
|
|
|
private UserOrderPaymentService userOrderPaymentService;
|
|
|
|
|
|
+ @Autowired(required = true)
|
|
|
+ private PaymentClient paymentClient;
|
|
|
+
|
|
|
@Autowired
|
|
|
- private PaymentService adapayPaymentService;
|
|
|
+ private PaymentProperties paymentProperties;
|
|
|
|
|
|
@Autowired
|
|
|
- private PaymentSdk paymentSdk;
|
|
|
+ private PmsProductMapper pmsProductMapper;
|
|
|
+
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private PortalProductDao productDao;
|
|
|
|
|
|
@Override
|
|
|
public ConfirmOrderResult generateConfirmOrder(List<Long> cartIds) {
|
|
|
ConfirmOrderResult result = new ConfirmOrderResult();
|
|
|
//获取购物车信息
|
|
|
UmsMember currentMember = memberService.getCurrentMember();
|
|
|
- List<CartPromotionItem> cartPromotionItemList = cartItemService.listPromotion(currentMember.getId(), cartIds,true);
|
|
|
+ List<CartPromotionItem> cartPromotionItemList = cartItemService.listPromotion(currentMember.getId(), cartIds, true);
|
|
|
result.setCartPromotionItemList(cartPromotionItemList);
|
|
|
//获取用户收货地址列表
|
|
|
List<UmsMemberReceiveAddress> memberReceiveAddressList = memberReceiveAddressService.list();
|
|
@@ -115,7 +136,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
|
|
|
//获取购物车及优惠信息
|
|
|
UmsMember currentMember = memberService.getCurrentMember();
|
|
|
List<CartPromotionItem> cartPromotionItemList = cartItemService.listPromotion(currentMember.getId(), orderParam.getCartIds(),
|
|
|
- true);
|
|
|
+ true);
|
|
|
for (CartPromotionItem cartPromotionItem : cartPromotionItemList) {
|
|
|
//生成下单商品信息
|
|
|
OmsOrderItem orderItem = new OmsOrderItem();
|
|
@@ -156,7 +177,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
|
|
|
handleCouponAmount(orderItemList, couponHistoryDetail);
|
|
|
}
|
|
|
//判断是否使用积分
|
|
|
- if (orderParam.getUseIntegration() == null||orderParam.getUseIntegration().equals(0)) {
|
|
|
+ if (orderParam.getUseIntegration() == null || orderParam.getUseIntegration().equals(0)) {
|
|
|
//不使用积分
|
|
|
for (OmsOrderItem orderItem : orderItemList) {
|
|
|
orderItem.setIntegrationAmount(new BigDecimal(0));
|
|
@@ -177,8 +198,12 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
|
|
|
}
|
|
|
//计算order_item的实付金额
|
|
|
handleRealAmount(orderItemList);
|
|
|
- //进行库存锁定
|
|
|
- lockStock(cartPromotionItemList);
|
|
|
+ //进行sku库存锁定
|
|
|
+ lockSkuStock(cartPromotionItemList);
|
|
|
+
|
|
|
+ // 进行商品库存锁定
|
|
|
+ lockProductStock(cartPromotionItemList);
|
|
|
+
|
|
|
//根据商品合计、运费、活动优惠、优惠券、积分计算应付金额
|
|
|
OmsOrder order = new OmsOrder();
|
|
|
StringBuilder cartIds = new StringBuilder();
|
|
@@ -237,10 +262,9 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
|
|
|
order.setOrderSn(generateOrderSn(order));
|
|
|
//设置自动收货天数
|
|
|
List<OmsOrderSetting> orderSettings = orderSettingMapper.selectByExample(new OmsOrderSettingExample());
|
|
|
- if(CollUtil.isNotEmpty(orderSettings)){
|
|
|
+ if (CollUtil.isNotEmpty(orderSettings)) {
|
|
|
order.setAutoConfirmDay(orderSettings.get(0).getConfirmOvertime());
|
|
|
}
|
|
|
- // TODO: 2018/9/3 bill_*,delivery_*
|
|
|
//插入order表和order_item表
|
|
|
orderMapper.insert(order);
|
|
|
for (OmsOrderItem orderItem : orderItemList) {
|
|
@@ -278,17 +302,44 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
|
|
|
orderMapper.updateByPrimaryKeySelective(order);
|
|
|
//恢复所有下单商品的锁定库存,扣减真实库存
|
|
|
OmsOrderDetail orderDetail = portalOrderDao.getDetail(orderId);
|
|
|
+ // 减sku库存
|
|
|
int count = portalOrderDao.updateSkuStock(orderDetail.getOrderItemList());
|
|
|
+
|
|
|
+ // 减商品库存
|
|
|
+ updateProductStock(orderDetail);
|
|
|
+
|
|
|
return count;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 减商品库存
|
|
|
+ */
|
|
|
+ private void updateProductStock(OmsOrderDetail orderDetail) {
|
|
|
+ Map<Long, List<OmsOrderItem>> collect = orderDetail.getOrderItemList()
|
|
|
+ .stream().collect(Collectors.groupingBy(OmsOrderItem::getProductId));
|
|
|
+
|
|
|
+ List<ProductStock> productStockList = new ArrayList<>();
|
|
|
+ for (Map.Entry<Long, List<OmsOrderItem>> entry : collect.entrySet()) {
|
|
|
+ ProductStock stock = new ProductStock();
|
|
|
+ stock.setProductId(entry.getKey());
|
|
|
+ List<OmsOrderItem> value = entry.getValue();
|
|
|
+ if(CollectionUtils.isEmpty(value)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ int sum = value.stream().mapToInt(OmsOrderItem::getProductQuantity).sum();
|
|
|
+ stock.setStock(sum);
|
|
|
+ productStockList.add(stock);
|
|
|
+ }
|
|
|
+ productDao.updateProductStock(productStockList);
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
public Integer cancelTimeOutOrder() {
|
|
|
- Integer count=0;
|
|
|
+ Integer count = 0;
|
|
|
OmsOrderSetting orderSetting = orderSettingMapper.selectByPrimaryKey(1L);
|
|
|
//查询超时、未支付的订单及订单详情
|
|
|
List<OmsOrderDetail> timeOutOrders = portalOrderDao.getTimeOutOrders(orderSetting.getNormalOrderOvertime()
|
|
|
- ,orderSetting.getPayOrderOvertime());
|
|
|
+ , orderSetting.getPayOrderOvertime());
|
|
|
if (CollectionUtils.isEmpty(timeOutOrders)) {
|
|
|
return count;
|
|
|
}
|
|
@@ -297,14 +348,14 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
|
|
|
if (timeOutOrder.getStatus() == 0) {
|
|
|
payingOrderHandle(timeOutOrder);
|
|
|
} else if (timeOutOrder.getStatus() == 6) {
|
|
|
- cancelOrder(timeOutOrder.getId(), "超时取消");
|
|
|
+ cancelOrder(timeOutOrder.getId(), "超时取消", null);
|
|
|
}
|
|
|
}
|
|
|
return timeOutOrders.size();
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public void cancelOrder(Long orderId, String message) {
|
|
|
+ public void cancelOrder(Long orderId, String message, PaymentCallBack data) {
|
|
|
//查询未付款的取消订单
|
|
|
OmsOrderExample example = new OmsOrderExample();
|
|
|
example.createCriteria().andIdEqualTo(orderId).andDeleteStatusEqualTo(0);
|
|
@@ -313,7 +364,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
|
|
|
return;
|
|
|
}
|
|
|
OmsOrder cancelOrder = cancelOrderList.get(0);
|
|
|
- if (cancelOrder != null && (cancelOrder.getStatus() == 0 || cancelOrder.getStatus() == 6) ) {
|
|
|
+ if (cancelOrder != null && (cancelOrder.getStatus() == 0 || cancelOrder.getStatus() == 6)) {
|
|
|
//修改订单状态为取消
|
|
|
cancelOrder.setStatus(4);
|
|
|
orderMapper.updateByPrimaryKeySelective(cancelOrder);
|
|
@@ -332,7 +383,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
|
|
|
memberService.updateIntegration(cancelOrder.getMemberId(), member.getIntegration() + cancelOrder.getUseIntegration());
|
|
|
}
|
|
|
// 发起关单
|
|
|
- userOrderPaymentService.closePayment(cancelOrder.getOrderSn(),message);
|
|
|
+ userOrderPaymentService.closePayment(cancelOrder.getOrderSn(),message,data);
|
|
|
|
|
|
}
|
|
|
}
|
|
@@ -350,10 +401,10 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
|
|
|
public void confirmReceiveOrder(Long orderId) {
|
|
|
UmsMember member = memberService.getCurrentMember();
|
|
|
OmsOrder order = orderMapper.selectByPrimaryKey(orderId);
|
|
|
- if(!member.getId().equals(order.getMemberId())){
|
|
|
+ if (!member.getId().equals(order.getMemberId())) {
|
|
|
Asserts.fail("不能确认他人订单!");
|
|
|
}
|
|
|
- if(order.getStatus()!=2){
|
|
|
+ if (order.getStatus() != 2) {
|
|
|
Asserts.fail("该订单还未发货!");
|
|
|
}
|
|
|
order.setStatus(3);
|
|
@@ -364,16 +415,16 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
|
|
|
|
|
|
@Override
|
|
|
public CommonPage<OmsOrderDetail> list(String status, Integer pageNum, Integer pageSize) {
|
|
|
- if(status.equals("-1")){
|
|
|
+ if (status.equals("-1")) {
|
|
|
status = null;
|
|
|
}
|
|
|
UmsMember member = memberService.getCurrentMember();
|
|
|
- PageHelper.startPage(pageNum,pageSize);
|
|
|
+ PageHelper.startPage(pageNum, pageSize);
|
|
|
OmsOrderExample orderExample = new OmsOrderExample();
|
|
|
OmsOrderExample.Criteria criteria = orderExample.createCriteria();
|
|
|
criteria.andDeleteStatusEqualTo(0)
|
|
|
.andMemberIdEqualTo(member.getId());
|
|
|
- if(status != null && !StringUtil.isEmpty(status)) {
|
|
|
+ if (status != null && !StringUtil.isEmpty(status)) {
|
|
|
List<Long> list = StringUtil.toLongList(status);
|
|
|
List<Integer> collect = list.stream().map(Long::intValue).collect(Collectors.toList());
|
|
|
criteria.andStatusIn(collect);
|
|
@@ -387,7 +438,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
|
|
|
resultPage.setPageSize(orderPage.getPageSize());
|
|
|
resultPage.setTotal(orderPage.getTotal());
|
|
|
resultPage.setTotalPage(orderPage.getTotalPage());
|
|
|
- if(CollUtil.isEmpty(orderList)){
|
|
|
+ if (CollUtil.isEmpty(orderList)) {
|
|
|
return resultPage;
|
|
|
}
|
|
|
//设置数据信息
|
|
@@ -398,7 +449,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
|
|
|
List<OmsOrderDetail> orderDetailList = new ArrayList<>();
|
|
|
for (OmsOrder omsOrder : orderList) {
|
|
|
OmsOrderDetail orderDetail = new OmsOrderDetail();
|
|
|
- BeanUtil.copyProperties(omsOrder,orderDetail);
|
|
|
+ BeanUtil.copyProperties(omsOrder, orderDetail);
|
|
|
List<OmsOrderItem> relatedItemList = orderItemList.stream().filter(item -> item.getOrderId().equals(orderDetail.getId())).collect(Collectors.toList());
|
|
|
orderDetail.setOrderItemList(relatedItemList);
|
|
|
orderDetailList.add(orderDetail);
|
|
@@ -414,7 +465,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
|
|
|
example.createCriteria().andOrderIdEqualTo(orderId);
|
|
|
List<OmsOrderItem> orderItemList = orderItemMapper.selectByExample(example);
|
|
|
OmsOrderDetail orderDetail = new OmsOrderDetail();
|
|
|
- BeanUtil.copyProperties(omsOrder,orderDetail);
|
|
|
+ BeanUtil.copyProperties(omsOrder, orderDetail);
|
|
|
orderDetail.setOrderItemList(orderItemList);
|
|
|
return orderDetail;
|
|
|
}
|
|
@@ -433,7 +484,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
|
|
|
example.createCriteria().andOrderIdEqualTo(omsOrder.getId());
|
|
|
List<OmsOrderItem> orderItemList = orderItemMapper.selectByExample(example);
|
|
|
OmsOrderDetail orderDetail = new OmsOrderDetail();
|
|
|
- BeanUtil.copyProperties(omsOrder,orderDetail);
|
|
|
+ BeanUtil.copyProperties(omsOrder, orderDetail);
|
|
|
orderDetail.setOrderItemList(orderItemList);
|
|
|
return orderDetail;
|
|
|
}
|
|
@@ -442,13 +493,13 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
|
|
|
public void deleteOrder(Long orderId) {
|
|
|
UmsMember member = memberService.getCurrentMember();
|
|
|
OmsOrder order = orderMapper.selectByPrimaryKey(orderId);
|
|
|
- if(!member.getId().equals(order.getMemberId())){
|
|
|
+ if (!member.getId().equals(order.getMemberId())) {
|
|
|
Asserts.fail("不能删除他人订单!");
|
|
|
}
|
|
|
- if(order.getStatus()==3||order.getStatus()==4){
|
|
|
+ if (order.getStatus() == 3 || order.getStatus() == 4) {
|
|
|
order.setDeleteStatus(1);
|
|
|
orderMapper.updateByPrimaryKey(order);
|
|
|
- }else{
|
|
|
+ } else {
|
|
|
Asserts.fail("只能删除已完成或已关闭的订单!");
|
|
|
}
|
|
|
}
|
|
@@ -468,56 +519,98 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
|
|
|
orderPayRes.setMessage("订单已付款或已关闭");
|
|
|
return orderPayRes;
|
|
|
}
|
|
|
- payReq.setOrderPrice(detail.getPayAmount());
|
|
|
UserOrderPayment userOrderPayment = userOrderPaymentService
|
|
|
- .getByOrderNo(detail.getOrderSn(), payReq.getPayChannel(), PayStatusEnum.pending);
|
|
|
+ .getByOrderNo(detail.getOrderSn(), payReq.getPayChannel(), TradeStatusEnum.pending);
|
|
|
|
|
|
- if (userOrderPayment == null) {
|
|
|
- // 支付订单号
|
|
|
- payReq.setOrderNo(generateOrderSn(detail));
|
|
|
- }else {
|
|
|
+ if (userOrderPayment != null) {
|
|
|
// 拉起原有的支付
|
|
|
- payReq.setPayInfo(userOrderPayment.getPayInfo());
|
|
|
- return adapayPaymentService.orderContinue(payReq);
|
|
|
+ orderPayRes = new OrderPayRes();
|
|
|
+ orderPayRes.setPay_info(userOrderPayment.getPayInfo());
|
|
|
+ orderPayRes.setPayChannel(userOrderPayment.getPayChannel());
|
|
|
+ orderPayRes.setPay_amt(userOrderPayment.getPayAmt().setScale(2, RoundingMode.HALF_UP).toString());
|
|
|
+ return orderPayRes;
|
|
|
+ }
|
|
|
+
|
|
|
+ //构建汇付统一下单请求
|
|
|
+ OpenEnum openType = OpenEnum.valueOf(paymentProperties.getOpenType());
|
|
|
+ Payment payment = new Payment(openType,
|
|
|
+ PaymentClientEnum.valueOf(payReq.getPaymentClient()), payReq.getPayChannel());
|
|
|
+ payment.setPaymentNo(generateOrderSn(detail));
|
|
|
+ payment.setOrderNo(payReq.getOrderNo());
|
|
|
+ payment.setOrderTitle("酷乐秀商城订单编号-" + detail.getOrderSn());
|
|
|
+ payment.setOrderDesc("酷乐秀商城订单编号-" + detail.getOrderSn());
|
|
|
+
|
|
|
+ //封装订单详情
|
|
|
+ List<OrderDetil> orderDetils = new ArrayList<>();
|
|
|
+ for (OmsOrderItem orderDetailVo : detail.getOrderItemList()) {
|
|
|
+ orderDetils.add(new OrderDetil(orderDetailVo.getId().toString(), orderDetailVo.getProductName(),
|
|
|
+ orderDetailVo.getProductQuantity(), orderDetailVo.getRealAmount().toString()));
|
|
|
+ }
|
|
|
+ payment.setOrderDetils(orderDetils);
|
|
|
+ payment.setPayAmt(detail.getPayAmount().setScale(2, RoundingMode.HALF_UP).toString());
|
|
|
+ payment.setDescription(payReq.getReason());
|
|
|
+
|
|
|
+ if (OpenEnum.ADAPAY.equals(openType)) {
|
|
|
+ //创建分账对象
|
|
|
+ DivMember div_member = new DivMember();
|
|
|
+ div_member.setMember_id("0");
|
|
|
+ div_member.setAmount(detail.getPayAmount().setScale(2, RoundingMode.HALF_UP).toString());
|
|
|
+ div_member.setFee_flag("Y");
|
|
|
+ List<DivMember> div_members = Arrays.asList(div_member);
|
|
|
+ payment.setDivMembers(div_members);
|
|
|
+
|
|
|
+ //前端设备信息
|
|
|
+ DeviceInfo deviceInfo = new DeviceInfo();
|
|
|
+ deviceInfo.setDevice_ip(payReq.getIpAddress());
|
|
|
+ payment.setDeviceInfo(deviceInfo);
|
|
|
+
|
|
|
+ if (PayChannelEnum.wx_lite.equals(payReq.getPayChannel())) {
|
|
|
+ Map<String, Object> expend = new HashMap<>();
|
|
|
+ expend.put("open_id", payReq.getOpenId());
|
|
|
+ payment.setExpend(expend);
|
|
|
+ }
|
|
|
}
|
|
|
- payReq.setGoodTitle("酷乐秀商城订单编号-" + detail.getOrderSn());
|
|
|
- payReq.setGoodDesc("酷乐秀商城订单编号-" + detail.getOrderSn());
|
|
|
// 支付中的返回拉起信息
|
|
|
- orderPayRes = adapayPaymentService.orderPay(payReq);
|
|
|
- if (!orderPayRes.isStatus()) {
|
|
|
+ BaseResult<Payment> executePayment = paymentClient.executePayment(payment);
|
|
|
+ if (!executePayment.getStatus()) {
|
|
|
// 异常将取消订单
|
|
|
- cancelOrder(detail.getId(),orderPayRes.getMessage());
|
|
|
- throw new BizException(orderPayRes.getMessage());
|
|
|
+ cancelOrder(detail.getId(), executePayment.getMsg(), null);
|
|
|
+ throw new BizException(executePayment.getMsg());
|
|
|
}
|
|
|
- if (!orderPayRes.getPay_amt().equals(detail.getPayAmount().setScale(2, RoundingMode.HALF_UP).toString())) {
|
|
|
- cancelOrder(detail.getId(),"订单金额和实际支付金额不符");
|
|
|
+ if (!executePayment.getData().getPayAmt().equals(detail.getPayAmount().setScale(2, RoundingMode.HALF_UP).toString())) {
|
|
|
+ cancelOrder(detail.getId(), "订单金额和实际支付金额不符", null);
|
|
|
throw new BizException("订单金额和实际支付金额不符");
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+ saveOrderPayment(executePayment.getData(), detail,payReq.getPaymentClient());
|
|
|
+
|
|
|
+ return orderPayRes;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ private void saveOrderPayment(Payment payment, OmsOrderDetail detail,String paymentClient) {
|
|
|
+ UserOrderPayment userOrderPayment;
|
|
|
OmsOrder omsOrder = new OmsOrder();
|
|
|
omsOrder.setId(detail.getId());
|
|
|
- if (orderPayRes.getPayStatus().getCode().equals(PayStatusEnum.pending.getCode())) {
|
|
|
- omsOrder.setStatus(0);
|
|
|
- orderMapper.updateByPrimaryKeySelective(omsOrder);
|
|
|
- // 保存订单支付表
|
|
|
- userOrderPayment = new UserOrderPayment();
|
|
|
- userOrderPayment.setOrderNo(detail.getOrderSn());
|
|
|
- userOrderPayment.setAdapayNo(orderPayRes.getOrderNo());
|
|
|
- userOrderPayment.setPayChannel(orderPayRes.getPayChannel());
|
|
|
- userOrderPayment.setTransNo(orderPayRes.getTransNo());
|
|
|
- userOrderPayment.setPayAmt(new BigDecimal(orderPayRes.getPay_amt()));
|
|
|
- userOrderPayment.setPayInfo(orderPayRes.getPay_info());
|
|
|
- userOrderPayment.setStatus(PayStatusEnum.pending.getCode());
|
|
|
- userOrderPayment.setPayFailMsg(orderPayRes.getMessage());
|
|
|
- userOrderPayment.setCreateTime(new Date());
|
|
|
- userOrderPayment.setUpdateTime(new Date());
|
|
|
- userOrderPaymentService.saveOrUpdate(userOrderPayment);
|
|
|
- }else {
|
|
|
- // 异常将取消订单
|
|
|
- cancelOrder(detail.getId(), orderPayRes.getMessage());
|
|
|
- }
|
|
|
|
|
|
- return orderPayRes;
|
|
|
+ omsOrder.setStatus(0);
|
|
|
+ orderMapper.updateByPrimaryKeySelective(omsOrder);
|
|
|
+ // 保存订单支付表
|
|
|
+ userOrderPayment = new UserOrderPayment();
|
|
|
+ userOrderPayment.setPaymentClient(paymentClient);
|
|
|
+ userOrderPayment.setOpenType(paymentProperties.getOpenType());
|
|
|
+ userOrderPayment.setOrderNo(detail.getOrderSn());
|
|
|
+ userOrderPayment.setAdapayNo(payment.getPaymentNo());
|
|
|
+ userOrderPayment.setPayChannel(payment.getPayChannel().getCode());
|
|
|
+ userOrderPayment.setTransNo(payment.getId());
|
|
|
+ userOrderPayment.setPayAmt(new BigDecimal(payment.getPayAmt()));
|
|
|
+ userOrderPayment.setPayInfo(payment.getPayInfo());
|
|
|
+ userOrderPayment.setStatus(TradeStatusEnum.pending.getCode());
|
|
|
+ userOrderPayment.setPayFailMsg("");
|
|
|
+ userOrderPayment.setCreateTime(new Date());
|
|
|
+ userOrderPayment.setUpdateTime(new Date());
|
|
|
+ userOrderPaymentService.saveOrUpdate(userOrderPayment);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -526,20 +619,22 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public void orderCallback(String data, String type) {
|
|
|
- JSONObject hfRes = JSONObject.parseObject(data);
|
|
|
-
|
|
|
- if (type.equals("payment.succeeded")) {//支付成功
|
|
|
- paymentSucceededHandle(hfRes);
|
|
|
- } else if (type.equals("payment.failed")) {//支付失败
|
|
|
- paymentFailedHandle(hfRes);
|
|
|
- } else if (type.equals("payment.close.succeeded")) {//支付关单成功
|
|
|
- paymentCloseSucceededHandle(hfRes);
|
|
|
- } else if (type.equals("payment.close.failed")) {//支付关单失败
|
|
|
- paymentCloseFailedHandle(hfRes);
|
|
|
+ public void executePaymentCallBack(PaymentCallBack data) {
|
|
|
+ if (TradeStatusEnum.succeeded.equals(data.getStatus())) {//支付成功
|
|
|
+ paymentSucceededHandle(data);
|
|
|
+ } else if (TradeStatusEnum.failed.equals(data.getStatus())) {//支付失败
|
|
|
+ paymentFailedHandle(data);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public void closePaymentCallBack(PaymentCallBack data) {
|
|
|
+ if (TradeStatusEnum.succeeded.equals(data.getStatus())) {//关单成功
|
|
|
+ paymentCloseSucceededHandle(data);
|
|
|
+ } else if (TradeStatusEnum.failed.equals(data.getStatus())) {//关单失败
|
|
|
+ paymentCloseFailedHandle(data);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
|
|
|
/***
|
|
@@ -548,17 +643,18 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
|
|
|
* @param: hfRes
|
|
|
* @updateTime 2022/4/27 15:09
|
|
|
*/
|
|
|
- private void paymentSucceededHandle(JSONObject hfRes) {
|
|
|
+ private void paymentSucceededHandle(PaymentCallBack data) {
|
|
|
//订单完成
|
|
|
- OmsOrder detail = detail(hfRes.getString("order_no"));
|
|
|
- if (null == detail) {
|
|
|
- log.error("汇付支付回调,订单未找到。 req is {}", hfRes.toJSONString());
|
|
|
+ UserOrderPayment userOrderPayment = userOrderPaymentService.getByAdapayNo(data.getPaymentNo());
|
|
|
+ if (null == userOrderPayment) {
|
|
|
+ log.error("汇付支付回调,订单未找到。 req is {}", JSON.toJSONString(data));
|
|
|
return;
|
|
|
}
|
|
|
+ OmsOrderDetail detail = detail(userOrderPayment.getOrderNo());
|
|
|
if (detail.getStatus() == 0) {
|
|
|
- orderSuccess(detail, hfRes);
|
|
|
+ orderSuccess(detail, data,data.getId());
|
|
|
} else {
|
|
|
- log.error("汇付支付回调,订单状态异常。 req is {}", hfRes.toJSONString());
|
|
|
+ log.error("汇付支付回调,订单状态异常。 req is {}", detail.getOrderSn());
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -568,19 +664,24 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
|
|
|
* @param: hfRes
|
|
|
* @updateTime 2022/4/27 15:09
|
|
|
*/
|
|
|
- private void paymentFailedHandle(JSONObject hfRes) {
|
|
|
+ private void paymentFailedHandle(PaymentCallBack data) {
|
|
|
//订单完成
|
|
|
- OmsOrder detail = detail(hfRes.getString("order_no"));
|
|
|
+ UserOrderPayment userOrderPayment = userOrderPaymentService.getByAdapayNo(data.getPaymentNo());
|
|
|
+ if (null == userOrderPayment) {
|
|
|
+ log.error("汇付支付回调,订单未找到。 req is {}", JSON.toJSONString(data));
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
+ OmsOrderDetail detail = detail(userOrderPayment.getOrderNo());
|
|
|
if (null == detail) {
|
|
|
- log.error("汇付支付回调,订单未找到。 req is {}", hfRes.toJSONString());
|
|
|
+ log.error("汇付支付回调,订单未找到。 req is {}", JSON.toJSONString(data));
|
|
|
return;
|
|
|
}
|
|
|
if (detail.getStatus() == 0) {
|
|
|
|
|
|
- cancelOrder(detail.getId(), "支付回调失败");
|
|
|
+ cancelOrder(detail.getId(), data.getErrMsg(),data);
|
|
|
} else {
|
|
|
- log.error("汇付支付回调,订单状态异常。 req is {}", hfRes.toJSONString());
|
|
|
+ log.error("汇付支付回调,订单状态异常。 req is {}", JSON.toJSONString(data));
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -590,13 +691,15 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
|
|
|
* @param: hfRes
|
|
|
* @updateTime 2022/4/27 15:33
|
|
|
*/
|
|
|
- private void paymentCloseSucceededHandle(JSONObject hfRes) {
|
|
|
- UserOrderPayment orderPayment = userOrderPaymentService.getByTranNo(hfRes.getString("payment_id"));
|
|
|
+ private void paymentCloseSucceededHandle(PaymentCallBack data) {
|
|
|
+ UserOrderPayment orderPayment = userOrderPaymentService.getByAdapayNo(data.getPaymentNo());
|
|
|
if (null == orderPayment) {
|
|
|
return;
|
|
|
}
|
|
|
- orderPayment.setStatus(PayStatusEnum.succeeded.getCode());
|
|
|
- orderPayment.setUpdateTime(new Date());
|
|
|
+ orderPayment.setStatus(TradeStatusEnum.failed.getCode());
|
|
|
+ orderPayment.setTransNo(data.getId());
|
|
|
+ orderPayment.setCloseStatus(TradeStatusEnum.succeeded.getCode());
|
|
|
+ orderPayment.setCloseTime(data.getClosePaymentCallBack().getTradeTime());
|
|
|
userOrderPaymentService.saveOrUpdate(orderPayment);
|
|
|
}
|
|
|
|
|
@@ -606,47 +709,60 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
|
|
|
* @param: hfRes
|
|
|
* @updateTime 2022/4/27 15:33
|
|
|
*/
|
|
|
- private void paymentCloseFailedHandle(JSONObject hfRes) {
|
|
|
- UserOrderPayment orderPayment = userOrderPaymentService.getByTranNo(hfRes.getString("payment_id"));
|
|
|
+ private void paymentCloseFailedHandle(PaymentCallBack data) {
|
|
|
+ UserOrderPayment orderPayment = userOrderPaymentService.getByAdapayNo(data.getPaymentNo());
|
|
|
if (null == orderPayment) {
|
|
|
return;
|
|
|
}
|
|
|
- orderPayment.setStatus(PayStatusEnum.failed.getCode());
|
|
|
- orderPayment.setPayFailMsg("支付关单回调失败-" + hfRes.getString("error_msg"));
|
|
|
+ orderPayment.setStatus(TradeStatusEnum.failed.getCode());
|
|
|
+ orderPayment.setCloseStatus(TradeStatusEnum.failed.getCode());
|
|
|
+ orderPayment.setCloseTime(data.getClosePaymentCallBack().getTradeTime());
|
|
|
+ orderPayment.setPayFailMsg("支付关单回调失败-" + data.getErrMsg());
|
|
|
orderPayment.setUpdateTime(new Date());
|
|
|
userOrderPaymentService.saveOrUpdate(orderPayment);
|
|
|
}
|
|
|
|
|
|
/***
|
|
|
* 处理支付中订单
|
|
|
- * @author liweifan
|
|
|
- * @param: userOrder
|
|
|
- * @updateTime 2022/4/13 16:51
|
|
|
*/
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
void payingOrderHandle(OmsOrder userOrder) {
|
|
|
//判断汇付订单状态
|
|
|
UserOrderPayment orderPayment = userOrderPaymentService.getByOrderNoAndStatusPaying(userOrder.getOrderSn());
|
|
|
if (null == orderPayment) {
|
|
|
- cancelOrder(userOrder.getId(), "支付超时");
|
|
|
+ cancelOrder(userOrder.getId(), "支付超时", null);
|
|
|
}
|
|
|
+ OmsOrderDetail detail = detail(orderPayment.getOrderNo());
|
|
|
try {
|
|
|
- Map<String, Object> resMap = paymentSdk.queryPayment(orderPayment.getTransNo());
|
|
|
+ Payment param = new Payment(OpenEnum.valueOf(orderPayment.getOpenType()),
|
|
|
+ PaymentClientEnum.valueOf(orderPayment.getPaymentClient()), PayChannelEnum.valueOf(orderPayment.getPayChannel()));
|
|
|
+ param.setId(orderPayment.getTransNo());
|
|
|
+ param.setPaymentNo(orderPayment.getAdapayNo());
|
|
|
+ BaseResult<Payment> res = paymentClient.queryPayment(param);
|
|
|
+ //支付成功
|
|
|
+ if (res.getStatus() && TradeStatusEnum.succeeded.getCode().equals(res.getData().getStatus())
|
|
|
+ && (detail.getStatus() == 0 || detail.getStatus() == 1)
|
|
|
+ ) {
|
|
|
+ orderSuccess(detail,res.getData().getId());
|
|
|
+ return;
|
|
|
+ }
|
|
|
//支付失败
|
|
|
- if (PayStatusEnum.failed.getCode().equals(resMap.get("status").toString())) {
|
|
|
- cancelOrder(userOrder.getId(), "支付失败");
|
|
|
- }else if (PayStatusEnum.succeeded.getCode().equals(resMap.get("status").toString())) {
|
|
|
- // 支付成功
|
|
|
- orderSuccess(userOrder,null);
|
|
|
- } else {
|
|
|
- cancelOrder(userOrder.getId(), "支付超时");
|
|
|
+ if (!res.getStatus()) {
|
|
|
+ cancelOrder(userOrder.getId(), res.getMsg(), null);
|
|
|
+ return;
|
|
|
}
|
|
|
+ cancelOrder(userOrder.getId(), "支付超时", null);
|
|
|
} catch (Exception e) {
|
|
|
e.printStackTrace();
|
|
|
log.error("轮询处理支付中订单异常,异常参数: {}", JSONObject.toJSONString(userOrder));
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+ void orderSuccess(OmsOrder detail, String tranId) {
|
|
|
+ orderSuccess(detail,null,tranId);
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 订单完成
|
|
|
*
|
|
@@ -654,27 +770,38 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
|
|
|
* @updateTime 2022/4/13 17:17
|
|
|
*/
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
- void orderSuccess(OmsOrder detail, JSONObject hfRes) {
|
|
|
+ void orderSuccess(OmsOrder detail, PaymentCallBack data, String tranId) {
|
|
|
//更新订单
|
|
|
UserOrderPayment orderPayment = userOrderPaymentService.getByOrderNoAndStatusPaying(detail.getOrderSn());
|
|
|
- if (orderPayment.getPayChannel().equals("alipay")) {
|
|
|
+
|
|
|
+ if (orderPayment == null) {
|
|
|
+ log.error("支付回调,支付中订单未找到。 orderNo is {}",detail.getOrderSn());
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (data != null) {
|
|
|
+ String pay_amt = data.getExecutePaymentCallBack().getPayAmt();
|
|
|
+ if (!pay_amt.equals(detail.getPayAmount().setScale(2, RoundingMode.HALF_UP).toString())) {
|
|
|
+ orderPayment.setPayFailMsg("订单金额和实际支付金额不符");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (orderPayment.getPayChannel().equals("alipay") || orderPayment.getPayChannel().equals("ali_app")) {
|
|
|
paySuccess(detail.getId(),1);
|
|
|
- } else if (orderPayment.getPayChannel().equals("wx_lite")) {
|
|
|
+ } else if (orderPayment.getPayChannel().equals("wx_lite") || orderPayment.getPayChannel().equals("wx_app")) {
|
|
|
paySuccess(detail.getId(),2);
|
|
|
}
|
|
|
- String pay_amt = hfRes.getString("pay_amt");
|
|
|
- if (!pay_amt.equals(detail.getPayAmount().setScale(2, RoundingMode.HALF_UP).toString())) {
|
|
|
- orderPayment.setPayFailMsg("订单金额和实际支付金额不符");
|
|
|
- }
|
|
|
- orderPayment.setStatus(PayStatusEnum.succeeded.getCode());
|
|
|
+
|
|
|
+ orderPayment.setStatus(TradeStatusEnum.succeeded.getCode());
|
|
|
orderPayment.setArrivalTime(new Date());
|
|
|
- if (null != hfRes) {
|
|
|
+ orderPayment.setTransNo(tranId);
|
|
|
+ if (null != data) {
|
|
|
try {
|
|
|
- orderPayment.setPayAmt(new BigDecimal(pay_amt));
|
|
|
- orderPayment.setFeeAmt(new BigDecimal(hfRes.getString("fee_amt")));
|
|
|
+ orderPayment.setArrivalTime(data.getExecutePaymentCallBack().getTradeTime());
|
|
|
+ orderPayment.setTransNo(data.getId());
|
|
|
+ orderPayment.setPayAmt(new BigDecimal(data.getExecutePaymentCallBack().getPayAmt()));
|
|
|
+ orderPayment.setFeeAmt(new BigDecimal(data.getExecutePaymentCallBack().getFeeAmt()));
|
|
|
} catch (Exception e) {
|
|
|
e.printStackTrace();
|
|
|
- log.error("完成订单,付款单金额格式化失败,参数{}", hfRes.toJSONString());
|
|
|
+ log.error("完成订单,付款单金额格式化失败,参数{}", JSON.toJSONString(data));
|
|
|
}
|
|
|
}
|
|
|
userOrderPaymentService.saveOrUpdate(orderPayment);
|
|
@@ -687,7 +814,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
|
|
|
private String generateOrderSn(OmsOrder order) {
|
|
|
StringBuilder sb = new StringBuilder();
|
|
|
String date = new SimpleDateFormat("yyyyMMdd").format(new Date());
|
|
|
- String key = REDIS_DATABASE+":"+ REDIS_KEY_ORDER_ID + date;
|
|
|
+ String key = REDIS_DATABASE + ":" + REDIS_KEY_ORDER_ID + date;
|
|
|
Long increment = redisService.incr(key, 1);
|
|
|
sb.append(date);
|
|
|
sb.append(String.format("%02d", order.getSourceType()));
|
|
@@ -972,11 +1099,35 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
|
|
|
/**
|
|
|
* 锁定下单商品的所有库存
|
|
|
*/
|
|
|
- private void lockStock(List<CartPromotionItem> cartPromotionItemList) {
|
|
|
+ private void lockSkuStock(List<CartPromotionItem> cartPromotionItemList) {
|
|
|
for (CartPromotionItem cartPromotionItem : cartPromotionItemList) {
|
|
|
+ if (cartPromotionItem.getProductSkuId() == null) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
int i = skuStockMapper.lockStock(cartPromotionItem.getProductSkuId(),cartPromotionItem.getQuantity());
|
|
|
if (i == 0) {
|
|
|
- Asserts.fail("库存不足,无法下单");
|
|
|
+ Asserts.fail("库存不足");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 锁定下单商品的所有库存
|
|
|
+ */
|
|
|
+ private void lockProductStock(List<CartPromotionItem> cartPromotionItemList) {
|
|
|
+ Map<Long, List<CartPromotionItem>> collect = cartPromotionItemList.stream()
|
|
|
+ .collect(Collectors.groupingBy(CartPromotionItem::getProductId));
|
|
|
+ for (Map.Entry<Long, List<CartPromotionItem>> entry : collect.entrySet()) {
|
|
|
+ List<CartPromotionItem> value = entry.getValue();
|
|
|
+ if(CollectionUtils.isEmpty(value)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ int sum = value.stream().mapToInt(CartPromotionItem::getQuantity).sum();
|
|
|
+ if (sum >0 ) {
|
|
|
+ int i = pmsProductMapper.lockStock(entry.getKey(),sum);
|
|
|
+ if (i == 0) {
|
|
|
+ Asserts.fail("库存不足");
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -986,7 +1137,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
|
|
|
*/
|
|
|
private boolean hasStock(List<CartPromotionItem> cartPromotionItemList) {
|
|
|
for (CartPromotionItem cartPromotionItem : cartPromotionItemList) {
|
|
|
- if (cartPromotionItem.getRealStock()==null||cartPromotionItem.getRealStock() <= 0) {
|
|
|
+ if (cartPromotionItem.getRealStock() == null || cartPromotionItem.getRealStock() <= 0) {
|
|
|
return false;
|
|
|
}
|
|
|
}
|