刘俊驰 10 ماه پیش
والد
کامیت
48caea4a0b
22فایلهای تغییر یافته به همراه321 افزوده شده و 81 حذف شده
  1. 24 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/open/UserOrderClient.java
  2. 12 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/open/UserPaymentClient.java
  3. 2 0
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/dal/dao/SysUserDao.java
  4. 3 0
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/service/SysUserService.java
  5. 14 0
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/service/impl/SysUserServiceImpl.java
  6. 2 2
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/web/controller/UserController.java
  7. 4 0
      cooleshow-auth/auth-server/src/main/resources/config/mybatis/SysUserMapper.xml
  8. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/TenantInfoMapper.java
  9. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/RedisCacheService.java
  10. 3 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TenantInfoService.java
  11. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderPaymentService.java
  12. 4 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserPaymentCoreService.java
  13. 9 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/EmployeeServiceImpl.java
  14. 3 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/StudentServiceImpl.java
  15. 3 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherServiceImpl.java
  16. 9 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantInfoServiceImpl.java
  17. 14 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderPaymentServiceImpl.java
  18. 109 35
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderServiceImpl.java
  19. 94 33
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserPaymentCoreServiceImpl.java
  20. 1 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/UserPaymentOrderWrapper.java
  21. 1 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TeacherMapper.xml
  22. 5 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantInfoMapper.xml

+ 24 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/open/UserOrderClient.java

@@ -2,6 +2,8 @@ package com.yonge.cooleshow.admin.controller.open;
 
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.microsvc.toolkit.common.response.template.R;
+import com.microsvc.toolkit.middleware.payment.common.api.entity.PaymentResp;
 import com.yonge.cooleshow.biz.dal.entity.UserOrder;
 import com.yonge.cooleshow.biz.dal.entity.UserOrderPayment;
 import com.yonge.cooleshow.biz.dal.entity.UserOrderRefundBill;
@@ -10,6 +12,7 @@ import com.yonge.cooleshow.biz.dal.service.UserOrderPaymentService;
 import com.yonge.cooleshow.biz.dal.service.UserOrderRefundService;
 import com.yonge.cooleshow.biz.dal.service.UserOrderService;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderVo;
+import com.yonge.cooleshow.biz.dal.wrapper.UserPaymentOrderWrapper;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.ContractDto;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
@@ -25,6 +28,8 @@ import com.yonge.toolset.payment.base.model.callback.PaymentCallBack;
 import com.yonge.toolset.payment.core.service.PaymentClient;
 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.redisson.api.RedissonClient;
 import org.slf4j.Logger;
@@ -40,6 +45,7 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.servlet.http.HttpServletRequest;
+import java.util.Objects;
 import java.util.concurrent.TimeUnit;
 
 @RestController
@@ -54,6 +60,9 @@ public class UserOrderClient extends BaseController {
     private UserOrderRefundService userOrderRefundService;
     @Autowired
     private UserOrderService userOrderService;
+
+    @Autowired
+    private UserOrderPaymentService userOrderPaymentService;
     @Autowired
     private PaymentClient paymentClient;
     @Autowired
@@ -203,4 +212,19 @@ public class UserOrderClient extends BaseController {
         paymentService.setContractRecord(contract.getType(), contract.getUserId());
         return succeed(true);
     }
+
+    @ApiOperation(value = "关闭订单测试", notes = "关闭订单测试")
+    @ApiImplicitParams({
+        @ApiImplicitParam(name = "orderNo", value = "订单号", dataType = "String")
+    })
+    @GetMapping("/closedV1/{orderNo}")
+    public HttpResponseResult<Boolean> testOrderClosed(@PathVariable("orderNo") String orderNo) {
+        if (!debugMode) {
+            return HttpResponseResult.failed("当前环境不允许调用");
+        }
+        // 测试订单关闭
+        userOrderPaymentService.onlyClosePaymentAndReqOpen( orderNo,"关闭订单测试");
+
+        return HttpResponseResult.succeed();
+    }
 }

+ 12 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/open/UserPaymentClient.java

@@ -321,4 +321,16 @@ public class UserPaymentClient {
         }
         return null;
     }
+
+    @ApiOperation(value = "订单付款状态", notes = "订单付款状态")
+    @PostMapping("/paymentStatus/{orderNo}")
+    public R<Boolean> paymentStatus(@PathVariable("orderNo") String orderNo) {
+
+
+        // 用户订单支付状态
+
+        userPaymentCoreService.paymentStatus(orderNo);
+
+        return R.from(false);
+    }
 }

+ 2 - 0
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/dal/dao/SysUserDao.java

@@ -189,4 +189,6 @@ public interface SysUserDao extends BaseDAO<Long, SysUser> {
     SysUser getCustomerServiceByFriendLeast();
 
     void updateNameAndImg(@Param("userId") Long userId);
+
+    void updateTenantPhone(@Param("id") Long id, @Param("phone") String phone);
 }

+ 3 - 0
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/service/SysUserService.java

@@ -229,4 +229,7 @@ public interface SysUserService extends BaseService<Long, SysUser> {
 
 
     void updateStudentHideFlag(Long userId, int hideFlag);
+
+
+    void updateUser(SysUser sysUser);
 }

+ 14 - 0
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/service/impl/SysUserServiceImpl.java

@@ -142,8 +142,12 @@ public class SysUserServiceImpl extends BaseServiceImpl<Long, SysUser> implement
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public void updateBaseInfo(SysUser sysUser) {
         sysUserDao.update(sysUser);
+        if (StringUtils.isNotBlank(sysUser.getPhone())) {
+            sysUserDao.updateTenantPhone(sysUser.getId(), sysUser.getPhone());
+        }
     }
 
     @Override
@@ -478,4 +482,14 @@ public class SysUserServiceImpl extends BaseServiceImpl<Long, SysUser> implement
     public void updateStudentHideFlag(Long userId, int hideFlag) {
         sysUserDao.updateStudentHideFlag(userId, hideFlag);
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void updateUser(SysUser sysUser) {
+        this.update(sysUser);
+        // 更新机构手机号
+        if (StringUtils.isNotBlank(sysUser.getPhone())) {
+            sysUserDao.updateTenantPhone(sysUser.getId(), sysUser.getPhone());
+        }
+    }
 }

+ 2 - 2
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/web/controller/UserController.java

@@ -141,7 +141,7 @@ public class UserController extends BaseController {
     @PostMapping(value = "/updateSysUser", consumes = MediaType.APPLICATION_JSON_VALUE)
     public HttpResponseResult<Boolean> updateSysUser(@RequestBody SysUser user) {
         user.setUpdateTime(new Date());
-        sysUserService.update(user);
+        sysUserService.updateUser(user);
         return HttpResponseResult.succeed(true);
     }
 
@@ -316,7 +316,7 @@ public class UserController extends BaseController {
         if (smsCodeService.verifyValidCode(newPhone, authCode, "SMS_VERIFY_CODE_UPDATE_PHONE")) {
             sysUser.setPhone(newPhone);
             sysUser.setUpdateTime(new Date());
-            sysUserService.update(sysUser);
+            sysUserService.updateUser(sysUser);
             return succeed();
         } else {
             return failed("验证码错误");

+ 4 - 0
cooleshow-auth/auth-server/src/main/resources/config/mybatis/SysUserMapper.xml

@@ -410,4 +410,8 @@
         update sys_user set bak_username_ = username_,username_ = concat('账号已注销',id_)
                           ,avatar_ = (select param_value_ from sys_config where param_name_ = 'logoff_img') where id_= #{userId};
     </update>
+
+    <update id="updateTenantPhone">
+        update tenant_info set phone_ = #{phone} where user_id_ = #{id}
+    </update>
 </mapper>

+ 2 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/TenantInfoMapper.java

@@ -67,4 +67,6 @@ public interface TenantInfoMapper extends BaseMapper<TenantInfo> {
 	String queryTeacherCount(@Param("id") Long id);
 
     void updateIdPhone(@Param("newId") Long newId, @Param("phone") String phone, @Param("oldId") Long oldId);
+
+    void updatePhoneByUserId(@Param("userId") Long userId, @Param("phone") String phone);
 }

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

@@ -47,7 +47,7 @@ public interface RedisCacheService {
      * @param userId 用户Id
      * @return String
      */
-    String getUserPaymentConfig(String userId, String orderType);
+    String getUserPaymentConfig(String userId, String orderNo);
 
     /**
      * 删除用户支付配置

+ 3 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TenantInfoService.java

@@ -103,4 +103,7 @@ public interface TenantInfoService extends IService<TenantInfo>  {
     Boolean updateTenantInfo(TenantInfo tenantInfo, Long tenantId);
 
     Boolean updateSysUser(SysUser sysUser, Long id);
+
+
+    void updatePhoneByUserId(Long userId, String phone);
 }

+ 2 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderPaymentService.java

@@ -59,6 +59,8 @@ public interface UserOrderPaymentService extends IService<UserOrderPayment> {
     Boolean closePaymentAndReqOpen(String orderNo, String reason);
 
 
+    UserOrderPayment onlyClosePaymentAndReqOpen(String orderNo, String reason);
+
     /***
      * 创建付款单
      * @author liweifan

+ 4 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserPaymentCoreService.java

@@ -4,6 +4,7 @@ import com.microsvc.toolkit.config.jwt.utils.JwtUserInfo;
 import com.microsvc.toolkit.middleware.payment.common.api.entity.PaymentResp;
 import com.microsvc.toolkit.middleware.payment.common.api.entity.RefundResp;
 import com.yonge.cooleshow.biz.dal.wrapper.UserPaymentOrderWrapper;
+import org.springframework.transaction.annotation.Transactional;
 
 /**
  * 用户支付订单服务
@@ -95,4 +96,7 @@ public interface UserPaymentCoreService {
      * @return PaymentResp
      */
     PaymentResp closedPayment( UserPaymentOrderWrapper.UserPaymentOrder paymentOrder);
+
+    @Transactional
+    void paymentStatus(String orderNo);
 }

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

@@ -10,10 +10,7 @@ import com.yonge.cooleshow.biz.dal.entity.Employee;
 import com.yonge.cooleshow.biz.dal.entity.Student;
 import com.yonge.cooleshow.biz.dal.entity.Teacher;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
-import com.yonge.cooleshow.biz.dal.service.EmployeeService;
-import com.yonge.cooleshow.biz.dal.service.StudentService;
-import com.yonge.cooleshow.biz.dal.service.SysConfigService;
-import com.yonge.cooleshow.biz.dal.service.TeacherService;
+import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.service.im.ImGroupCoreService;
 import com.yonge.cooleshow.biz.dal.vo.EmployeeVo;
 import com.yonge.cooleshow.common.constant.SysConfigConstant;
@@ -51,6 +48,9 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Long, Employee> impleme
     @Autowired
     private StudentService studentService;
 
+    @Autowired
+    private TenantInfoService tenantInfoService;
+
     @Override
     public BaseDAO<Long, Employee> getDAO() {
         return employeeDao;
@@ -134,6 +134,11 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Long, Employee> impleme
         sysUser.setGender(param.getGender().getCode());
         employeeDao.updateSysUser(sysUser);
 
+
+        // 如果有机构管理员信息,更新机构管理员信息
+        tenantInfoService.updatePhoneByUserId(sysUser.getId(),sysUser.getPhone());
+
+
         employeeDao.delEmployeeRole(employee.getUserId());
         employeeDao.batchAddEmployeeRole(employee.getUserId(), param.getRoleIds());
 

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

@@ -1021,6 +1021,9 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
                 String newPassword = MessageFormat.format("klx{0}", studentInfo.getPhone().substring(7));
                 sysUser.setPassword(new BCryptPasswordEncoder().encode(newPassword));
             }
+
+            // 如果有机构管理员信息,更新机构管理员信息
+            tenantInfoService.updatePhoneByUserId(sysUser.getId(),studentInfo.getPhone());
             sysUserMapper.updateById(sysUser);
             return sysUser;
         }

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

@@ -614,6 +614,9 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
         sysUser = getUserDetil(sysUser, teacherSubmitReq);
         sysUser.setUpdateTime(new Date());
         employeeDao.updateSysUser(sysUser);
+
+        // 如果有机构管理员信息,更新机构管理员信息
+        tenantInfoService.updatePhoneByUserId(sysUser.getId(),teacherSubmitReq.getPhone());
         return sysUser;
     }
 

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

@@ -656,6 +656,15 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoMapper, TenantI
         return true;
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void updatePhoneByUserId(Long userId, String phone) {
+        if (StringUtils.isNotBlank(phone)) {
+            tenantInfoMapper.updatePhoneByUserId(userId, phone);
+        }
+
+    }
+
 
     /**
      * 匹配地区码与省市区

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

@@ -94,9 +94,19 @@ public class UserOrderPaymentServiceImpl extends ServiceImpl<UserOrderPaymentDao
 
     @Override
     public Boolean closePaymentAndReqOpen(String orderNo, String reason) {
+        UserOrderPayment userOrderPayment = onlyClosePaymentAndReqOpen(orderNo, reason);
+        if (userOrderPayment != null) {
+            updateById(userOrderPayment);
+        }
+        return true;
+    }
+
+
+    @Override
+    public UserOrderPayment onlyClosePaymentAndReqOpen(String orderNo, String reason) {
         UserOrderPayment orderPayment = baseMapper.selectOne(Wrappers.<UserOrderPayment>lambdaQuery().eq(UserOrderPayment::getOrderNo, orderNo).eq(UserOrderPayment::getStatus, TradeStatusEnum.pending));
         if (null == orderPayment) {
-            return true;
+            return null;
         }
         //更新付款单
         orderPayment.setStatus(TradeStatusEnum.close);
@@ -123,8 +133,7 @@ public class UserOrderPaymentServiceImpl extends ServiceImpl<UserOrderPaymentDao
                 }
             }
         }
-        updateById(orderPayment);
-        return true;
+        return orderPayment;
     }
 
     @Override
@@ -198,7 +207,8 @@ public class UserOrderPaymentServiceImpl extends ServiceImpl<UserOrderPaymentDao
     @Transactional(rollbackFor = Exception.class)
     public void executePaymentCallBack(PaymentCallBack data) {
         UserOrderVo userOrderVo = userOrderService.getUserOrderByPaymentNoOrTransNo(data.getPaymentNo(), data.getId());
-        if (OrderStatusEnum.WAIT_PAY.equals(userOrderVo.getStatus()) || OrderStatusEnum.PAYING.equals(userOrderVo.getStatus())) {
+        if (OrderStatusEnum.WAIT_PAY.equals(userOrderVo.getStatus()) || OrderStatusEnum.PAYING.equals(userOrderVo.getStatus())
+            || OrderStatusEnum.PAID.equals(userOrderVo.getStatus())) {
             if (TradeStatusEnum.succeeded.equals(data.getStatus())) {//支付成功
                 paymentSucceededHandle(data);
             } else if (TradeStatusEnum.failed.equals(data.getStatus())) {//支付失败

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

@@ -269,8 +269,20 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public UserOrderVo detailApp(UserOrder param) {
+
         UserOrderVo userOrderVo = baseMapper.detailApp(param);
+
+        if (userOrderVo.getStatus() == OrderStatusEnum.PAYING ) {
+            if (userOrderVo.getPaymentVersion() == EPaymentVersion.V1) {
+                paymentStatus(userOrderVo.getOrderNo());
+
+            } else if (userOrderVo.getPaymentVersion() == EPaymentVersion.V2) {
+                userPaymentCoreService.paymentStatus(userOrderVo.getOrderNo());
+            }
+        }
+        userOrderVo = baseMapper.detailApp(param);
         userOrderDetail(userOrderVo);
         return userOrderVo;
     }
@@ -838,6 +850,58 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         }
     }
 
+    private void paymentStatus(String orderNo) {
+        UserOrderVo detail = detail(orderNo, null);
+        if (null == detail) {
+            return;
+        }
+        if (!OrderStatusEnum.WAIT_PAY.equals(detail.getStatus())
+            && !OrderStatusEnum.PAYING.equals(detail.getStatus())) {
+            return;
+        }
+        UserOrderPayment userOrderPayment = orderPaymentService.detailByTransNoOrPaymentNo(detail.getTransNo(), detail.getPaymentNo());
+        if (userOrderPayment == null) {
+            return;
+        }
+
+        Payment param = new Payment(detail.getOpenType(),
+                PaymentClientEnum.valueOf(userOrderPayment.getPaymentClient()), detail.getPayChannel());
+        param.setId(detail.getTransNo());
+        param.setPaymentNo(detail.getPaymentNo());
+        BaseResult<Payment> res = paymentClient.queryPayment(param);
+        Payment queryPaymentData = res.getData();
+
+        //支付成功
+        if (res.getStatus() && TradeStatusEnum.succeeded.getCode().equals(queryPaymentData.getStatus().getCode())) {
+            //订单已经完成,则完成订单
+            orderSuccess(detail);
+            //付款单改为已完成状态
+            userOrderPayment.setTransNo(queryPaymentData.getId());
+            userOrderPayment.setStatus(TradeStatusEnum.succeeded);
+            userOrderPayment.setUpdateTime(new Date());
+            userOrderPayment.setArrivalTime(new Date());
+            if (queryPaymentData.getPayAmt() != null) {
+                userOrderPayment.setBackPayAmt(new BigDecimal(queryPaymentData.getPayAmt()));
+            }
+
+            ExecutePaymentCallBack executePaymentCallBack = queryPaymentData.getExecutePaymentCallBack();
+            if (null != executePaymentCallBack) {
+                userOrderPayment.setArrivalTime(executePaymentCallBack.getTradeTime());
+                if (executePaymentCallBack.getPayAmt() != null) {
+                    userOrderPayment.setBackPayAmt(
+                            new BigDecimal(executePaymentCallBack.getPayAmt()));
+                    userOrderPayment.setFeeAmt(new BigDecimal(executePaymentCallBack.getFeeAmt()));
+                }
+
+            }
+            orderPaymentService.updateById(userOrderPayment);
+        } else if (res.getStatus() && TradeStatusEnum.close ==queryPaymentData.getStatus()) {
+
+            //关闭订单
+            doOrderCancel(detail, OrderStatusEnum.CLOSE, "三方订单已关闭");
+        }
+    }
+
     /**
      * 判断订单是否完成,若订单已完成则完成订单
      *
@@ -1141,46 +1205,56 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
      */
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void orderSuccess(UserOrderVo detail, PaymentCallBack data) {
-        //订单已完成
-        if (!OrderStatusEnum.WAIT_PAY.equals(detail.getStatus())
-                && !OrderStatusEnum.PAYING.equals(detail.getStatus())) {
-            return;
-        }
+    public void orderSuccess(UserOrderVo detailInfo, PaymentCallBack data) {
 
-        //修改订单状态
-        Date now = new Date();
-        detail.setStatus(OrderStatusEnum.PAID);
-        detail.setPayTime(now);
-        detail.setUpdateTime(now);
-        updateById(detail);
-
-        if (null != data) {
-            //更新付款单
-            UserOrderPayment orderPayment = orderPaymentService
-                    .detailByTransNoOrPaymentNo(data.getId(), data.getPaymentNo());
-            if (null != orderPayment) {
-                orderPayment.setTransNo(data.getId());
-                orderPayment.setStatus(TradeStatusEnum.succeeded);
-                orderPayment.setArrivalTime(now);
-                orderPayment.setUpdateTime(now);
-
-                if (null != data.getExecutePaymentCallBack()) {
-                    orderPayment.setBackPayAmt(
-                            new BigDecimal(data.getExecutePaymentCallBack().getPayAmt()));
-
-                    BigDecimal feeAmt = new BigDecimal(data.getExecutePaymentCallBack().getFeeAmt());
-                    if (BigDecimal.ZERO.compareTo(feeAmt) == 0) {
-                        orderPayment.setFeeAmt(orderPayment.getPayAmt().subtract(orderPayment.getBackPayAmt()));
-                    } else {
-                        orderPayment.setFeeAmt(feeAmt);
+        // 加订单锁
+
+        // 用户下单请求锁
+        String lockName = redisCacheService.getPaymentCacheKey(detailInfo.getOrderNo());
+        DistributedLock.of(redissonClient).runIfLockCanGet(lockName, () -> {
+
+            UserOrderVo detail= detail(detailInfo.getId());
+            //订单已完成
+            if (!OrderStatusEnum.WAIT_PAY.equals(detail.getStatus())
+                    && !OrderStatusEnum.PAYING.equals(detail.getStatus())) {
+                return;
+            }
+
+            //修改订单状态
+            Date now = new Date();
+            detail.setStatus(OrderStatusEnum.PAID);
+            detail.setPayTime(now);
+            detail.setUpdateTime(now);
+            updateById(detail);
+
+            if (null != data) {
+                //更新付款单
+                UserOrderPayment orderPayment = orderPaymentService
+                        .detailByTransNoOrPaymentNo(data.getId(), data.getPaymentNo());
+                if (null != orderPayment) {
+                    orderPayment.setTransNo(data.getId());
+                    orderPayment.setStatus(TradeStatusEnum.succeeded);
+                    orderPayment.setArrivalTime(now);
+                    orderPayment.setUpdateTime(now);
+
+                    if (null != data.getExecutePaymentCallBack()) {
+                        orderPayment.setBackPayAmt(
+                                new BigDecimal(data.getExecutePaymentCallBack().getPayAmt()));
+
+                        BigDecimal feeAmt = new BigDecimal(data.getExecutePaymentCallBack().getFeeAmt());
+                        if (BigDecimal.ZERO.compareTo(feeAmt) == 0) {
+                            orderPayment.setFeeAmt(orderPayment.getPayAmt().subtract(orderPayment.getBackPayAmt()));
+                        } else {
+                            orderPayment.setFeeAmt(feeAmt);
+                        }
                     }
+                    orderPaymentService.updateById(orderPayment);
                 }
-                orderPaymentService.updateById(orderPayment);
             }
-        }
 
-        paySuccess(detail);
+            paySuccess(detail);
+
+        },10L,TimeUnit.SECONDS);
     }
 
     /**

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

@@ -14,6 +14,7 @@ import com.microsvc.toolkit.middleware.payment.common.api.PaymentServiceContext;
 import com.microsvc.toolkit.middleware.payment.common.api.entity.*;
 import com.microsvc.toolkit.middleware.payment.common.api.enums.DivideBackStatus;
 import com.microsvc.toolkit.middleware.payment.common.api.enums.PaymentStatus;
+import com.microsvc.toolkit.middleware.payment.enums.EPaymentVendor;
 import com.yonge.cooleshow.biz.dal.entity.*;
 import com.yonge.cooleshow.biz.dal.enums.*;
 import com.yonge.cooleshow.biz.dal.enums.coupon.CouponCategoryEnum;
@@ -233,31 +234,8 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
                 throw new BizException("无效的支付订单");
             }
 
-            // 订单已关闭返回异常信息,更新订单状态为已支付,后续流程不处理,允许用户进行退款操作
-            if (EPaymentStatus.CLOSED == paymentOrder.getStatus()) {
-
-                // 支付成功
-                if (PaymentStatus.SUCCESSED == paymentResp.getPaymentStatus()) {
-
-
-                    // 根据支付回调消息,更新订单状态
-                    executePaymentSuccess(UserPaymentOrderWrapper.UserPaymentOrder.from(JSON.toJSONString(paymentOrder)), paymentResp);
-
-//                    UserPaymentOrderWrapper.UserPaymentOrder order = UserPaymentOrderWrapper.UserPaymentOrder
-//                        .builder()
-//                        .transNo(paymentResp.getTransNo())
-//                        .id(paymentOrder.getId())
-//                        .status(PAID)
-//                        .updateTime(DateTime.now().toDate())
-//                        .build();
-//                    userPaymentOrderService.updateById(order);
-
-                    log.error("executePaymentCallback 关单异常,更新订单状态为已支付, error={}, status={}, paymentResp={}", paymentOrder.getErrorMsg(),
-                        paymentOrder.getStatus(), JSON.toJSONString(paymentResp));
-                }
-            } else
             // 订单状态为待支付、支付中时,更新订单状态;
-            if (EPaymentStatus.WAIT_PAY == paymentOrder.getStatus() || EPaymentStatus.PAYING == paymentOrder.getStatus()) {
+            if (EPaymentStatus.WAIT_PAY == paymentOrder.getStatus() || EPaymentStatus.PAYING == paymentOrder.getStatus() || PAID == paymentOrder.getStatus()) {
 
                 // 支付成功
                 if (PaymentStatus.SUCCESSED == paymentResp.getPaymentStatus()) {
@@ -284,6 +262,13 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
 
                 log.info("executePaymentCallback WAIT_PAY, status={}, paymentResp={}", paymentOrder.getStatus(),
                     JSON.toJSONString(paymentResp));
+            } else {
+
+                // 支付成功
+                if (PaymentStatus.SUCCESSED == paymentResp.getPaymentStatus()) {
+                    // 根据支付回调消息,更新订单状态
+                    refundOnly("订单已超时,金额原路退回", paymentOrder.getOrderNo());
+                }
             }
 
         }, 60L, TimeUnit.SECONDS);
@@ -717,15 +702,15 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
             if (EPaymentStatus.WAIT_PAY == userPaymentOrder.getStatus() || EPaymentStatus.PAYING == userPaymentOrder.getStatus()) {
 
                 // 订单完成后续流程
-                SpringContextHolder.getBean(UserPaymentCoreService.class)
+                applicationContext.getBean(UserPaymentCoreService.class)
                     .executePaymentSuccess(UserPaymentOrderWrapper.UserPaymentOrder.from(JSON.toJSONString(userPaymentOrder)), paymentResp);
             }
 
             // 删除支付配置
-            redisCacheService.deleteUserPaymentConfig(userId, userPaymentOrder.getOrderType().getCode());
+            redisCacheService.deleteUserPaymentConfig(userId, userPaymentOrder.getOrderNo());
 
             // 删除下单配置
-            redisCacheService.deleteUserOrderConfig(userId, userPaymentOrder.getOrderType().getCode());
+            redisCacheService.deleteUserOrderConfig(userId, userPaymentOrder.getOrderNo());
         }
 
         // 三方支付失败
@@ -740,11 +725,26 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
             userPaymentOrderService.updateById(update);
 
             // 订单关闭流程
-            SpringContextHolder.getBean(UserPaymentCoreService.class)
+            applicationContext.getBean(UserPaymentCoreService.class)
                 .cancelPayment(UserPaymentOrderWrapper.UserPaymentOrder.from(JSON.toJSONString(userPaymentOrder)), paymentResp);
 
             // 删除本地缓存
-            redisCacheService.deleteUserPaymentConfig(userId, userPaymentOrder.getOrderType().getCode());
+            redisCacheService.deleteUserPaymentConfig(userId, userPaymentOrder.getOrderNo());
+        }
+
+        // 三方订单关闭状态
+        if (PaymentStatus.CLOSED == paymentResp.getPaymentStatus() && EPaymentStatus.CLOSED != userPaymentOrder.getStatus()) {
+
+            // 订单关闭流程
+            applicationContext.getBean(UserPaymentCoreService.class)
+                .cancelPayment(UserPaymentOrderWrapper.UserPaymentOrder.from(JSON.toJSONString(userPaymentOrder)), paymentResp);
+
+            // 删除本地缓存
+            redisCacheService.deleteUserPaymentConfig(userId, userPaymentOrder.getOrderNo());
+
+            // 删除下单配置
+            redisCacheService.deleteUserOrderConfig(userId, userPaymentOrder.getOrderNo());
+
         }
     }
 
@@ -1232,7 +1232,7 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
                                     // 支付成功
                                     if (PaymentStatus.SUCCESSED == paymentResp.getPaymentStatus()) {
                                         // 根据支付回调消息,更新订单状态
-                                        SpringContextHolder.getBean(UserPaymentCoreService.class)
+                                        applicationContext.getBean(UserPaymentCoreService.class)
                                             .executePaymentSuccess(UserPaymentOrderWrapper.UserPaymentOrder.from(JSON.toJSONString(item)), paymentResp);
                                     }
 
@@ -1326,9 +1326,6 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
         if (Objects.isNull(paymentOrder)) {
             throw new BizException("订单信息不存在");
         }
-        if (!OrderStatusEnum.PAID.getCode().equals(paymentOrder.getStatus().getCode())) {
-            throw  new BizException("订单状态异常");
-        }
         UserOrderVo detail = userOrderService.detail(paymentOrder.getId());
         if (Objects.isNull(detail)) {
             throw new BizException("订单信息不存在");
@@ -1462,4 +1459,68 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
 
         return paymentResp;
     }
+
+
+    @Transactional
+    @Override
+    public void paymentStatus(String orderNo) {
+
+        // 订单编号查询
+        UserPaymentOrderWrapper.UserPaymentOrder paymentOrder = userPaymentOrderService.getUserPaymentOrderByOrderNo( orderNo);
+        if (Objects.isNull(paymentOrder)) {
+            throw new BizException("订单不存在");
+        }
+
+        UserPaymentOrderWrapper.PaymentOrderReqConfig reqConfig = UserPaymentOrderWrapper.PaymentOrderReqConfig
+            .builder()
+            .userId(String.valueOf(paymentOrder.getUserId()))
+            .merOrderNo(orderNo)
+            .build();
+
+        // 用户下单请求锁
+        String lockName = redisCacheService.getPaymentCacheKey(orderNo);
+        DistributedLock.of(redissonClient).runIfLockCanGet(lockName, () -> {
+
+            // 已产生三方交易流水号,先判断三方订单支付状态若在支付中,则重复返回相同支付配置参数;避免用户重复支付
+            // 原生支付(微信,支付宝)流水号后产品,需要查询三方支付订单状态
+            if (StringUtils.isNotBlank(paymentOrder.getTransNo())
+                || EPaymentVendor.ORIGINAL.name().equalsIgnoreCase(paymentOrder.getPaymentVendor())
+                || EPaymentVendor.WXPAY.name().equalsIgnoreCase(paymentOrder.getPaymentVendor())
+                || EPaymentVendor.ALIPAY.name().equalsIgnoreCase(paymentOrder.getPaymentVendor())) {
+
+                // 获取三方支付订单信息,根据订单状处理
+                PaymentResp paymentResp = paymentServiceContext.getPaymentService(paymentOrder.getPaymentVendor())
+                    .query(paymentOrder.getTransNo(), paymentOrder.getOrderNo());
+                if (Objects.nonNull(paymentResp)) {
+                    if (PaymentStatus.PENDDING == paymentResp.getPaymentStatus()) {
+
+                        // 获取缓存配置信息
+                        String paymentConfig = redisCacheService.getUserPaymentConfig(reqConfig.getUserId(), paymentOrder.getOrderNo());
+                        if (StringUtils.isBlank(paymentConfig) && EPaymentStatus.CLOSED != paymentOrder.getStatus()) {
+                            // 支付配置已失效,待支付订单状态调整为已关闭,提醒用户重新购买
+                            PaymentClose paymentClose = paymentServiceContext.getPaymentService(paymentOrder.getPaymentVendor())
+                                .close(paymentOrder.getTransNo(), "支付超时", paymentOrder.getOrderNo());
+
+                            // 更新订单状态为已超时
+                            UserPaymentOrderWrapper.UserPaymentOrder update = UserPaymentOrderWrapper.UserPaymentOrder
+                                .builder()
+                                .id(paymentOrder.getId())
+                                .status(EPaymentStatus.CLOSED)
+                                .errorMsg(paymentClose.getMsg())
+                                .build();
+                            userPaymentOrderService.updateById(JSON.parseObject(update.jsonString(), UserPaymentOrderWrapper.UserPaymentOrder.class));
+
+                            // 订单关闭流程
+                            cancelPayment(UserPaymentOrderWrapper.UserPaymentOrder.from(JSON.toJSONString(paymentOrder)), paymentResp);
+                        }
+
+                    }
+
+                    // 更新用户支付订单状态
+                    updateUserPaymentOrderStatus(reqConfig.getUserId(), paymentOrder, paymentResp);
+                }
+            }
+        },10L,TimeUnit.SECONDS);
+
+    }
 }

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

@@ -340,6 +340,7 @@ public class UserPaymentOrderWrapper {
                     .activityId(getActivityId())
                     .rewardId(getRewardId())
                     .tenantId(getTenantId())
+                .reason(getErrorMsg())
                     .build();
         }
 

+ 1 - 1
cooleshow-user/user-biz/src/main/resources/config/mybatis/TeacherMapper.xml

@@ -289,7 +289,7 @@
         ) b on t.user_id_ = b.user_id_
         left join vip_card_record vcr on t.user_id_ = vcr.user_id_ and vcr.client_type_ = 'TEACHER'
         and vcr.efficient_flag_ = 1 and vcr.end_time_ >= now() and now() > vcr.start_time_ and (vcr.vip_type_ = 'VIP' or vcr.vip_type_ = 'SVIP') and vcr.client_type_ = 'TEACHER'
-        where u.del_flag_ = 0 and t.user_id_ = #{userId}
+        where t.user_id_ = #{userId}
     </select>
 
     <select id="querySubject" resultMap="com.yonge.cooleshow.biz.dal.dao.SubjectDao.Subject">

+ 5 - 1
cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantInfoMapper.xml

@@ -228,5 +228,9 @@
 
     </select>
 
-
+    <update id="updatePhoneByUserId">
+        update tenant_info
+        set phone_ = #{phone}
+        where user_id_ = #{userId}
+    </update>
 </mapper>