浏览代码

0元机构专辑

liujc 1 年之前
父节点
当前提交
148c4e6a94
共有 14 个文件被更改,包括 428 次插入30 次删除
  1. 6 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderService.java
  2. 2 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/RedisCacheServiceImpl.java
  3. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantActivationCodeServiceImpl.java
  4. 11 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantAlbumServiceImpl.java
  5. 5 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderServiceImpl.java
  6. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserPaymentCoreServiceImpl.java
  7. 15 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserPaymentOrderServiceImpl.java
  8. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantAlbumWrapper.java
  9. 3 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/UserPaymentOrderWrapper.java
  10. 72 0
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/UserOrderController.java
  11. 232 0
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/vo/UserPaymentOrderVo.java
  12. 29 14
      cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/UserOrderController.java
  13. 1 4
      cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/vo/UserPaymentOrderVo.java
  14. 49 0
      toolset/toolset-base/src/main/java/com/yonge/toolset/base/util/StringUtil.java

+ 6 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderService.java

@@ -209,4 +209,10 @@ public interface UserOrderService extends IService<UserOrder> {
      */
     BigDecimal getShareFreeByConfigName(String configName);
 
+    /**
+     * 获取订单数据
+     *
+     * @param orderNo 订单号
+     */
+    UserOrder getByOrderNo(String orderNo);
 }

+ 2 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/RedisCacheServiceImpl.java

@@ -3,6 +3,7 @@ package com.yonge.cooleshow.biz.dal.service.impl;
 import com.google.common.collect.Lists;
 import com.yonge.cooleshow.biz.dal.service.CacheKey;
 import com.yonge.cooleshow.biz.dal.service.RedisCacheService;
+import com.yonge.cooleshow.common.enums.CacheNameEnum;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.BooleanUtils;
@@ -72,7 +73,7 @@ public class RedisCacheServiceImpl implements RedisCacheService {
      */
     @Override
     public String getPaymentCacheKey(String orderNo) {
-        return getCacheKey(CacheKey.PAYMENT_ORDER_LOCK, orderNo);
+        return CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(orderNo);
     }
 
     /**

+ 1 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantActivationCodeServiceImpl.java

@@ -228,7 +228,7 @@ public class TenantActivationCodeServiceImpl extends ServiceImpl<TenantActivatio
         if (userOrderDetailVo != null) {
 
             TenantAlbumWrapper.TenantAlbumContent tenantAlbumContent = JSON
-                    .parseObject(JSON.toJSONString(userOrderDetailVo.getBizContent()), TenantAlbumWrapper.TenantAlbumContent.class);
+                    .parseObject(userOrderDetailVo.getBizContent(), TenantAlbumWrapper.TenantAlbumContent.class);
 
             userTenantAlbumRecord.setTenantId(tenantAlbumContent.getTenantId());
             userTenantAlbumRecord.setUserId(studentId);

+ 11 - 4
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantAlbumServiceImpl.java

@@ -1,5 +1,8 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
+import cn.hutool.core.lang.Snowflake;
+import cn.hutool.core.lang.UUID;
+import cn.hutool.core.lang.generator.SnowflakeGenerator;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
@@ -11,6 +14,7 @@ import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
 import com.yonge.cooleshow.biz.dal.wrapper.UserPaymentOrderWrapper;
 import com.yonge.cooleshow.common.enums.EActivationCode;
 import com.yonge.toolset.base.exception.BizException;
+import com.yonge.toolset.base.util.StringUtil;
 import org.apache.commons.collections.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -114,7 +118,7 @@ public class TenantAlbumServiceImpl extends ServiceImpl<TenantAlbumMapper, Tenan
 
 
         TenantAlbumWrapper.TenantAlbumContent tenantAlbumContent = JSON
-                .parseObject(JSON.toJSONString(orderGoodsInfo.getBizContent()), TenantAlbumWrapper.TenantAlbumContent.class);
+                .parseObject(orderGoodsInfo.getBizContent(), TenantAlbumWrapper.TenantAlbumContent.class);
         if (tenantAlbumContent == null) {
             log.error("订单创建前检测,订单商品信息为空");
             throw new BizException("订单商品信息为空");
@@ -127,6 +131,7 @@ public class TenantAlbumServiceImpl extends ServiceImpl<TenantAlbumMapper, Tenan
             log.error("订单创建前检测,专辑不存在,bizId={}", orderGoodsInfo.getBizId());
             throw new BizException("订单商品信息为空");
         }
+        tenantAlbumContent.setBuyCycle(tenantAlbum.getPurchaseCycle());
 
         // 查询专辑所在机构
         List<TenantAlbumRef> refList =
@@ -223,14 +228,15 @@ public class TenantAlbumServiceImpl extends ServiceImpl<TenantAlbumMapper, Tenan
                 // 机构   插入机构专辑购买记录,生成机构专辑激活码
 
                 TenantAlbumWrapper.TenantAlbumContent tenantAlbumContent = JSON
-                        .parseObject(JSON.toJSONString(userOrderDetailVo.getBizContent()), TenantAlbumWrapper.TenantAlbumContent.class);
+                        .parseObject(userOrderDetailVo.getBizContent(), TenantAlbumWrapper.TenantAlbumContent.class);
                 TenantAlbumPurchase tenantAlbumPurchase = new TenantAlbumPurchase();
-                tenantAlbumPurchase.setTenantId(userOrderDetailVo.getMerchId());
+                tenantAlbumPurchase.setTenantId(tenantAlbumContent.getTenantId());
                 tenantAlbumPurchase.setTenantAlbumId(userOrderDetailVo.getBizId());
                 tenantAlbumPurchase.setPurchaseTime(userOrderDetailVo.getCreateTime());
                 tenantAlbumPurchase.setPurchaseQuantity(userOrderDetailVo.getGoodNum());
                 tenantAlbumPurchase.setPurchaseCycle(tenantAlbumContent.getBuyCycle());
                 tenantAlbumPurchase.setActiveQuantity(0);
+                tenantAlbumPurchase.setPurchasePrice(userOrderDetailVo.getActualPrice());
                 tenantAlbumPurchase.setPurchaseStatus(OrderStatusEnum.PAID.getCode());
                 tenantAlbumPurchaseService.save(tenantAlbumPurchase);
 
@@ -240,7 +246,8 @@ public class TenantAlbumServiceImpl extends ServiceImpl<TenantAlbumMapper, Tenan
                     tenantActivationCode.setTenantId(tenantAlbumContent.getTenantId());
                     tenantActivationCode.setTenantAlbumId(tenantAlbumContent.getTenantAlbumId());
                     tenantActivationCode.setTenantAlbumPurchaseId(tenantAlbumPurchase.getId());
-                    tenantActivationCode.setActivationCode(String.valueOf(IdWorker.getId()));
+//                    tenantActivationCode.setActivationCode(StringUtil.DeciamlToThirtySix(IdWorker.get32UUID()));
+                    tenantActivationCode.setActivationCode(IdWorker.get32UUID());
                     tenantActivationCode.setSendStatus(EActivationCode.WAIT);
                     tenantActivationCodes.add(tenantActivationCode);
                 }

+ 5 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderServiceImpl.java

@@ -1097,6 +1097,11 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
                 .divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
     }
 
+    @Override
+    public UserOrder getByOrderNo(String orderNo) {
+        return this.lambdaQuery().eq(UserOrder::getOrderNo, orderNo).last("limit 1").one();
+    }
+
     /**
      * 获取平台服务费率
      *

+ 1 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserPaymentCoreServiceImpl.java

@@ -416,7 +416,7 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
     public UserPaymentOrderWrapper.PaymentConfig executeOrder(UserPaymentOrderWrapper.UserPaymentOrder orderReq) {
 
         // 填充订单基本信息
-        orderReq.id(IdWorker.getId())
+        orderReq
             .orderNo(IdWorker.getIdStr())
             .paymentVender(Optional.ofNullable(orderReq.getPaymentType()).orElse(paymentServiceContext.getPaymentService().venderName()))
             .paymentChannel("")

+ 15 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserPaymentOrderServiceImpl.java

@@ -10,6 +10,7 @@ import com.yonge.cooleshow.biz.dal.service.UserOrderService;
 import com.yonge.cooleshow.biz.dal.service.UserPaymentOrderService;
 import com.yonge.cooleshow.biz.dal.wrapper.UserPaymentOrderWrapper;
 import com.yonge.cooleshow.common.enums.EPaymentVersion;
+import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.payment.base.enums.TradeStatusEnum;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections.CollectionUtils;
@@ -62,6 +63,10 @@ public class UserPaymentOrderServiceImpl  implements UserPaymentOrderService {
             return null;
         }
 
+        if (one.getPaymentVersion().equals(EPaymentVersion.V1)) {
+            throw new BizException("支付方式不支持");
+        }
+
         // 查询订单支付信息
         UserOrderPayment newestPayment = userOrderPaymentService.getNewestPayment(transNo, merOrderNo);
 
@@ -119,6 +124,10 @@ public class UserPaymentOrderServiceImpl  implements UserPaymentOrderService {
         if (userOrder == null) {
             return null;
         }
+
+        if (userOrder.getPaymentVersion().equals(EPaymentVersion.V1)) {
+            throw new BizException("支付方式不支持");
+        }
         // 查询订单支付信息
         UserOrderPayment newestPayment = userOrderPaymentService.getNewestPayment(null, merOrderNo);
 
@@ -157,7 +166,11 @@ public class UserPaymentOrderServiceImpl  implements UserPaymentOrderService {
 
         // 更新订单支付信息
 
-        userOrder = userOrderService.getById(userOrder.getId());
+        UserOrder order1 = userOrderService.getById(userOrder.getId());
+
+        if (order1.getPaymentVersion().equals(EPaymentVersion.V1)) {
+            throw new BizException("支付方式不支持");
+        }
 
         UserOrderPayment newestPayment = userOrderPaymentService.getNewestPayment(order.getTransNo(), userOrder.getOrderNo());
         if (newestPayment == null) {
@@ -206,6 +219,7 @@ public class UserPaymentOrderServiceImpl  implements UserPaymentOrderService {
         userOrder.setPaymentVersion(EPaymentVersion.V2);
 
         userOrderService.save(userOrder);
+        orderReq.setId(userOrder.getId());
     }
 
 }

+ 1 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantAlbumWrapper.java

@@ -111,7 +111,7 @@ public class TenantAlbumWrapper {
         @ApiModelProperty(value = "采购周期",hidden = true)
         private Integer buyCycle;
 
-        @ApiModelProperty("采购机构")
+        @ApiModelProperty(value = "采购机构",hidden = true)
         private Long tenantId;
 
     }

+ 3 - 3
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/UserPaymentOrderWrapper.java

@@ -317,8 +317,8 @@ public class UserPaymentOrderWrapper {
                     .orderClient(getPaymentClient())
                     .userId(getUserId())
                     .orderNo(getOrderNo())
-                    .orderType(OrderTypeEnum.valueOf(getOrderType().name()))
-                    .status(OrderStatusEnum.parse(getStatus()))
+                    .orderType(getOrderType() !=null?OrderTypeEnum.valueOf(getOrderType().name()):null)
+                    .status(getStatus() !=null? OrderStatusEnum.parse(getStatus()):null)
                     .originalPrice(getOriginalPrice())
                     .expectPrice(getCurrentPrice())
                     .actualPrice(getPaymentCashAmount())
@@ -834,7 +834,7 @@ public class UserPaymentOrderWrapper {
         private Long userId;
 
 
-        @ApiModelProperty("用户身份")
+        @ApiModelProperty(value = "用户身份",hidden = true)
         private ClientEnum paymentClient;
 
         @ApiModelProperty(value = "生成的订单详情信息",hidden = true)

+ 72 - 0
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/UserOrderController.java

@@ -1,6 +1,9 @@
 package com.yonge.cooleshow.student.controller;
 
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.microsvc.toolkit.common.response.template.R;
+import com.microsvc.toolkit.config.jwt.utils.JwtUserInfo;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderPayReq;
@@ -8,9 +11,13 @@ import com.yonge.cooleshow.biz.dal.dto.req.OrderReq;
 import com.yonge.cooleshow.biz.dal.dto.search.OrderSearch;
 import com.yonge.cooleshow.biz.dal.entity.UserOrder;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.service.UserPaymentCoreService;
+import com.yonge.cooleshow.biz.dal.wrapper.UserPaymentOrderWrapper;
 import com.yonge.cooleshow.common.enums.CacheNameEnum;
 import com.yonge.cooleshow.biz.dal.enums.GoodTypeEnum;
 import com.yonge.cooleshow.biz.dal.service.UserOrderService;
+import com.yonge.cooleshow.common.enums.EPaymentVersion;
+import com.yonge.cooleshow.student.vo.UserPaymentOrderVo;
 import com.yonge.toolset.payment.util.DistributedLock;
 import com.yonge.toolset.mybatis.support.PageUtil;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderVo;
@@ -29,6 +36,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import springfox.documentation.annotations.ApiIgnore;
 
@@ -39,6 +47,7 @@ import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.time.temporal.TemporalAdjusters;
 import java.util.Date;
+import java.util.Objects;
 import java.util.concurrent.TimeUnit;
 
 /**
@@ -57,6 +66,9 @@ public class UserOrderController extends BaseController {
     @Autowired
     private RedissonClient redissonClient;
 
+    @Autowired
+    private UserPaymentCoreService userPaymentCoreService;
+
     @ApiOperation(value = "下单接口")
     @PostMapping("/executeOrder")
     public HttpResponseResult<UserOrder> executeOrder(@Valid @RequestBody OrderReq orderReq) {
@@ -114,6 +126,55 @@ public class UserOrderController extends BaseController {
         }
     }
 
+
+
+    @ApiOperation(value = "用户下单", notes = "用户下单")
+    @PostMapping("/executeOrder/v2")
+    public R<UserPaymentOrderWrapper.PaymentConfig> executeOrder(@Validated @RequestBody UserPaymentOrderVo.OrderReq orderReq) {
+
+        // 设置下单用户信息
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (Objects.isNull(sysUser)) {
+            throw com.microsvc.toolkit.common.webportal.exception.BizException.from("用户信息不存在");
+        }
+        orderReq.setUserId(sysUser.getId());
+        orderReq.setPaymentClient(ClientEnum.TENANT.name());
+
+
+        // 用户下单请求
+        UserPaymentOrderWrapper.UserPaymentOrder order = JSON.parseObject(orderReq.jsonString(), UserPaymentOrderWrapper.UserPaymentOrder.class);
+        // 新增数据
+        UserPaymentOrderWrapper.PaymentConfig paymentConfig = userPaymentCoreService.executeOrderCreate(order);
+        if (Objects.isNull(paymentConfig)) {
+            throw com.microsvc.toolkit.common.webportal.exception.BizException.from("下单失败");
+        }
+
+        return R.from(paymentConfig);
+    }
+
+    @ApiOperation(value = "用户付款", notes = "用户付款")
+    @PostMapping("/orderPay/v2")
+    public R<UserPaymentOrderWrapper.PaymentReq> executePayment(@Validated @RequestBody UserPaymentOrderVo.PaymentReqConfig config) {
+        // 设置下单用户信息
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (Objects.isNull(sysUser)) {
+            throw com.microsvc.toolkit.common.webportal.exception.BizException.from("用户信息不存在");
+        }
+
+
+        // 用户下单请求
+        UserPaymentOrderWrapper.PaymentOrderReqConfig reqConfig = UserPaymentOrderWrapper.PaymentOrderReqConfig.from(config.jsonString());
+
+        // 创建用户支付数据
+        UserPaymentOrderWrapper.PaymentReq paymentConfig = userPaymentCoreService.executePayment(JwtUserInfo.builder()
+                .userId(sysUser.getId().toString()).clientType(ClientEnum.TEACHER.getCode()).build(), reqConfig);
+        if (Objects.isNull(paymentConfig)) {
+            throw com.microsvc.toolkit.common.webportal.exception.BizException.from("付款失败");
+        }
+
+        return R.from(paymentConfig);
+    }
+
     @ApiOperation(value = "通过业务id查询用户正在交易中的订单")
     @PostMapping("/getPendingOrder")
     @ApiImplicitParams({
@@ -157,6 +218,17 @@ public class UserOrderController extends BaseController {
         }
         payReq.setUserId(user.getId());
 
+        UserOrder order = userOrderService.getByOrderNo(payReq.getOrderNo());
+        if (null == order) {
+            return failed("订单不存在");
+        }
+        if(order.getPaymentVersion().equals(EPaymentVersion.V2)){
+
+
+            // 用户取消支付
+            userPaymentCoreService.cancelPayment(JwtUserInfo.builder().userId(user.getId().toString()).clientType(ClientEnum.STUDENT.getCode()).build(), payReq.getOrderNo());
+        }
+
         try {
             HttpResponseResult<Boolean> res = DistributedLock.of(redissonClient)
                     .runIfLockToFunction(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(payReq.getOrderNo())

+ 232 - 0
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/vo/UserPaymentOrderVo.java

@@ -0,0 +1,232 @@
+package com.yonge.cooleshow.student.vo;
+
+import com.alibaba.fastjson.JSON;
+import com.yonge.cooleshow.biz.dal.enums.OrderTypeEnum;
+import com.yonge.cooleshow.biz.dal.wrapper.UserPaymentOrderWrapper;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 平台订单表
+ * 2022-12-20 19:09:34
+ */
+@ApiModel(value = "UserPaymentOrderVo对象", description = "平台订单表查询视图对象")
+public class UserPaymentOrderVo {
+
+    @Data
+    @ApiModel(" UserPaymentOrder-平台订单表")
+    public static class UserPaymentOrder {
+
+
+		@ApiModelProperty("主键")
+        private Long id;
+
+		@ApiModelProperty("支付厂商")
+        private String paymentVender;
+
+		@ApiModelProperty("支付渠道")
+        private String paymentChannel;
+
+		@ApiModelProperty("用户身份")
+        private String paymentClient;
+
+		@ApiModelProperty("用户编号")
+        private Long userId;
+
+		@ApiModelProperty("商户订单号")
+        private String orderNo;
+
+		@ApiModelProperty("交易流水号")
+        private String transNo;
+
+		@ApiModelProperty("业务类型Id")
+        private String bizId;
+
+		@ApiModelProperty("订单支付类型")
+        private String orderType;
+
+		@ApiModelProperty("订单状态")
+        private String status;
+
+		@ApiModelProperty("原价")
+        private BigDecimal originalPrice;
+
+		@ApiModelProperty("现价")
+        private BigDecimal currentPrice;
+
+		@ApiModelProperty("支付现金金额")
+        private BigDecimal paymentCashAmount;
+
+		@ApiModelProperty("支付优惠金额")
+        private BigDecimal paymentCouponAmount;
+
+		@ApiModelProperty("支付通道费用")
+        private BigDecimal paymentChannelFee;
+
+		@ApiModelProperty("订单名称")
+        private String orderName;
+
+		@ApiModelProperty("订单描述信息")
+        private String orderDesc;
+
+		@ApiModelProperty("用户备注")
+        private String userNote;
+
+		@ApiModelProperty("支付时间")
+        private Date payTime;
+
+		@ApiModelProperty("原因")
+        private String errorMsg;
+
+		@ApiModelProperty("收货地址")
+        private Long receiveAddress;
+
+		@ApiModelProperty("更新时间")
+        private Date updateTime;
+
+		@ApiModelProperty("下单时间")
+        private Date createTime;
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static UserPaymentOrder from(String json) {
+            return JSON.parseObject(json, UserPaymentOrder.class);
+        }
+
+
+        public UserPaymentOrder userId(String userId) {
+            this.userId = Long.parseLong(userId);
+            return this;
+        }
+
+        public UserPaymentOrder paymentClient(String paymentClient) {
+            this.paymentClient = String.valueOf(paymentClient);
+            return this;
+        }
+    }
+
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel("下单请求对象")
+    public static class OrderReq implements Serializable {
+
+        @ApiModelProperty("支付类型: adapay")
+        private String paymentType;
+
+        @ApiModelProperty("业务类型Id")
+        private String bizId;
+
+        @NotNull(message = "订单类型不能为空")
+        @ApiModelProperty(value = "订单类型: 学生端( VIP、开通会员  PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播 ACTI_REGIST、活动报名 ) 老师端(VIP、开通会员 PIANO_ROOM、琴房时长 ACTI_REGIST 活动报名)", required = true)
+        private OrderTypeEnum orderType;
+
+        @ApiModelProperty("现价")
+        private BigDecimal currentPrice;
+
+        @ApiModelProperty("支付现金金额")
+        private BigDecimal paymentCashAmount;
+
+        @ApiModelProperty("支付优惠金额")
+        private BigDecimal paymentCouponAmount;
+
+        @ApiModelProperty("订单名称")
+        private String orderName;
+
+        @ApiModelProperty("订单描述信息")
+        private String orderDesc;
+
+        @ApiModelProperty("用户备注")
+        private String userNote;
+
+        @ApiModelProperty("优惠券Id;多个使用,隔开")
+        private String couponIds;
+
+        @ApiModelProperty("订单商品信息")
+        private List<UserPaymentOrderWrapper.OrderGoodsInfo> goodsInfos;
+
+        @ApiModelProperty(value = "用户身份", hidden = true)
+        private String paymentClient;
+
+        @ApiModelProperty(value = "用户编号", hidden = true)
+        private Long userId;
+
+        @ApiModelProperty(value = "推荐用户id(有推荐人的情况)")
+        private Long recomUserId;
+
+        @ApiModelProperty(value = "活动id")
+        private Long activityId;
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public OrderReq paymentClient(String paymentClient) {
+            this.paymentClient = String.valueOf(paymentClient);
+            return this;
+        }
+
+        public OrderReq userId(String userId) {
+            this.userId = Long.parseLong(userId);
+            return this;
+        }
+    }
+
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel("订单支付参数配置")
+    public static class PaymentReqConfig implements Serializable {
+
+        @ApiModelProperty("支付渠道")
+        private String paymentChannel;
+
+        @ApiModelProperty("商户订单号")
+        private String merOrderNo;
+
+        @ApiModelProperty("商品名称")
+        private String subject;
+
+        @ApiModelProperty("商品描述")
+        private String body;
+
+        @ApiModelProperty("附加信息")
+        private String addition;
+
+        @ApiModelProperty("价格")
+        private BigDecimal price;
+
+        @ApiModelProperty("银行卡类型")
+        private String bankType;
+
+        @ApiModelProperty("微信授权code")
+        private String code;
+
+        @ApiModelProperty("订单过期时间")
+        private Date expirationTime;
+
+        @ApiModelProperty("微信支付公众号")
+        private String wxAppId;
+
+        @ApiModelProperty(value = "支付用户Id", hidden = true)
+        private String userId;
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+    }
+}

+ 29 - 14
cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/UserOrderController.java

@@ -7,21 +7,32 @@ import com.microsvc.toolkit.common.webportal.exception.BizException;
 import com.microsvc.toolkit.config.jwt.utils.JwtUserInfo;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.dto.req.OrderPayReq;
+import com.yonge.cooleshow.biz.dal.entity.UserOrder;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.service.UserPaymentCoreService;
 import com.yonge.cooleshow.biz.dal.wrapper.UserPaymentOrderWrapper;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.enums.CacheNameEnum;
+import com.yonge.cooleshow.common.enums.EPaymentVersion;
 import com.yonge.cooleshow.tenant.vo.UserPaymentOrderVo;
+import com.yonge.toolset.base.util.StringUtil;
+import com.yonge.toolset.payment.util.DistributedLock;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
+import springfox.documentation.annotations.ApiIgnore;
 
 import java.util.Objects;
 
+import static com.yonge.cooleshow.common.entity.HttpResponseResult.failed;
+
 @Validated
 @RestController
 @RequestMapping("/userOrder")
@@ -36,7 +47,7 @@ public class UserOrderController {
     private UserPaymentCoreService userPaymentCoreService;
 
     @ApiOperation(value = "用户下单", notes = "用户下单")
-    @PostMapping("/executeOrder")
+    @PostMapping("/executeOrder/v2")
     public R<UserPaymentOrderWrapper.PaymentConfig> executeOrder(@Validated @RequestBody UserPaymentOrderVo.OrderReq orderReq) {
 
         // 设置下单用户信息
@@ -60,7 +71,7 @@ public class UserOrderController {
     }
 
     @ApiOperation(value = "用户付款", notes = "用户付款")
-    @PostMapping("/executePayment")
+    @PostMapping("/orderPay/v2")
     public R<UserPaymentOrderWrapper.PaymentReq> executePayment(@Validated @RequestBody UserPaymentOrderVo.PaymentReqConfig config) {
         // 设置下单用户信息
         SysUser sysUser = sysUserFeignService.queryUserInfo();
@@ -74,7 +85,7 @@ public class UserOrderController {
 
         // 创建用户支付数据
         UserPaymentOrderWrapper.PaymentReq paymentConfig = userPaymentCoreService.executePayment(JwtUserInfo.builder()
-                .userId(sysUser.getId().toString()).clientType(ClientEnum.TEACHER.getCode()).build(), reqConfig);
+                .userId(sysUser.getId().toString()).clientType(ClientEnum.TENANT.getCode()).build(), reqConfig);
         if (Objects.isNull(paymentConfig)) {
             throw BizException.from("付款失败");
         }
@@ -82,22 +93,26 @@ public class UserOrderController {
         return R.from(paymentConfig);
     }
 
-    @ApiOperation(value = "取消支付", notes = "取消支付")
+    @ApiOperation(value = "取消订单")
+    @PostMapping("/orderCancel")
     @ApiImplicitParams({
-            @ApiImplicitParam(name = "orderNo", value = "订单号", dataType = "String")
+            @ApiImplicitParam(name = "orderNo", value = "订单号", paramType = "query", dataType = "String", required = true),
+            @ApiImplicitParam(name = "reason", value = "取消说明", paramType = "query", dataType = "String")
     })
-    @PostMapping("/cancelPayment/{orderNo}")
-    public R<JSONObject> cancelPayment(@PathVariable("orderNo") String orderNo) {
-
-
-        // 订单编号判断
-        if (StringUtils.isBlank(orderNo)) {
-            throw BizException.from("订单编号不能为空");
+    public HttpResponseResult<Boolean> orderCancel(@ApiIgnore @RequestBody OrderPayReq payReq) {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
         }
+        if (StringUtil.isEmpty(payReq.getOrderNo())) {
+            return failed("订单号不能为空");
+        }
+        payReq.setUserId(user.getId());
 
         // 用户取消支付
-        userPaymentCoreService.cancelPayment(new JwtUserInfo<>(), orderNo);
+        userPaymentCoreService.cancelPayment(JwtUserInfo.builder().userId(user.getId().toString()).clientType(ClientEnum.TENANT.getCode()).build(), payReq.getOrderNo());
 
-        return R.defaultR();
+        return HttpResponseResult.status(true);
     }
+
 }

+ 1 - 4
cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/vo/UserPaymentOrderVo.java

@@ -129,7 +129,7 @@ public class UserPaymentOrderVo {
     @ApiModel("下单请求对象")
     public static class OrderReq implements Serializable {
 
-        @ApiModelProperty("支付类型: adapay, wxpay")
+        @ApiModelProperty("支付类型: adapay")
         private String paymentType;
 
         @ApiModelProperty("业务类型Id")
@@ -227,9 +227,6 @@ public class UserPaymentOrderVo {
         @ApiModelProperty("微信支付公众号")
         private String wxAppId;
 
-        @ApiModelProperty(value = "收货地址", hidden = true)
-        private Long receiveAddress;
-
         @ApiModelProperty(value = "支付用户Id", hidden = true)
         private String userId;
 

+ 49 - 0
toolset/toolset-base/src/main/java/com/yonge/toolset/base/util/StringUtil.java

@@ -334,4 +334,53 @@ public class StringUtil {
     public static boolean hasLength(@Nullable String str) {
         return str != null && !str.isEmpty();
     }
+
+    // 定义36进制数字
+    private static final String X36 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+
+    // 定义静态进制数
+    private static int BASE = 36;
+
+
+    // 拿到10进制转换36进制的值键对
+    private static HashMap<Integer, Character> tenToThirtysix = createMapTenToThirtysix();
+
+    private static HashMap<Integer, Character> createMapTenToThirtysix() {
+        HashMap<Integer, Character> map = new HashMap<>();
+        for (int i = 0; i < X36.length(); i++) {
+            // 0--0,... ..., 35 -- Z的对应存放进去
+            map.put(i, X36.charAt(i));
+        }
+        return map;
+    }
+
+    /**
+     * 用递归来实现10 to 36
+     *
+     * @param iSrc
+     * @return
+     */
+    public static String DeciamlToThirtySix(Long iSrc) {
+        String result = "";
+        Long key;
+        Long value;
+
+        key = iSrc / BASE;
+        value = iSrc - key * BASE;
+        if (key != 0) {
+            result = result + DeciamlToThirtySix(key);
+        }
+
+        result = result + tenToThirtysix.get(value.intValue()).toString();
+
+        return result;
+    }
+
+
+
+    public static void main(String[] args) {
+
+        String s = DeciamlToThirtySix(1684471133338419201L);
+        System.out.println(s);
+    }
 }