فهرست منبع

Merge remote-tracking branch 'origin/master'

zouxuan 3 سال پیش
والد
کامیت
4581c29946
80فایلهای تغییر یافته به همراه3654 افزوده شده و 1055 حذف شده
  1. 3 3
      cooleshow-auth/auth-api/src/main/java/com/yonge/cooleshow/auth/api/dto/RealnameAuthReq.java
  2. 16 0
      cooleshow-auth/auth-api/src/main/java/com/yonge/cooleshow/auth/api/dto/UserSetReq.java
  3. 20 4
      cooleshow-auth/auth-api/src/main/java/com/yonge/cooleshow/auth/api/vo/UserSetVo.java
  4. 4 0
      cooleshow-auth/auth-server/src/main/resources/config/mybatis/SysUserMapper.xml
  5. 1 1
      cooleshow-cms/src/main/resources/config/mybatis/SysNewsInformationMapper.xml
  6. 7 0
      cooleshow-mall/mall-admin/pom.xml
  7. 1 1
      cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/MallAdminApplication.java
  8. 25 3
      cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/controller/OmsOrderReturnApplyController.java
  9. 62 0
      cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/controller/PaymentController.java
  10. 7 0
      cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/OmsOrderReturnApplyService.java
  11. 122 0
      cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/OmsOrderReturnApplyServiceImpl.java
  12. 41 0
      cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/mapper/UserOrderRefundMapper.java
  13. 39 1
      cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/model/UserOrderPayment.java
  14. 163 0
      cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/model/UserOrderRefund.java
  15. 917 0
      cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/model/UserOrderRefundExample.java
  16. 38 4
      cooleshow-mall/mall-mbg/src/main/resources/config/mybatis/UserOrderPaymentMapper.xml
  17. 323 0
      cooleshow-mall/mall-mbg/src/main/resources/config/mybatis/UserOrderRefundMapper.xml
  18. 13 0
      cooleshow-mall/mall-pay/pom.xml
  19. 4 1
      cooleshow-mall/mall-pay/src/main/java/com/yonge/cooleshow/enums/OrdeerCacherEnmu.java
  20. 37 48
      cooleshow-mall/mall-pay/src/main/java/com/yonge/cooleshow/sdk/adapay/PaymentSdk.java
  21. 3 1
      cooleshow-mall/mall-pay/src/main/java/com/yonge/cooleshow/sdk/adapay/dto/PaymentReq.java
  22. 139 0
      cooleshow-mall/mall-pay/src/main/java/com/yonge/cooleshow/sdk/adapay/dto/RefundReq.java
  23. 4 4
      cooleshow-mall/mall-pay/src/main/java/com/yonge/cooleshow/sdk/req/OrderPayReq.java
  24. 68 0
      cooleshow-mall/mall-pay/src/main/java/com/yonge/cooleshow/sdk/req/OrderRefundReq.java
  25. 37 37
      cooleshow-mall/mall-pay/src/main/java/com/yonge/cooleshow/sdk/res/OrderPayRes.java
  26. 92 0
      cooleshow-mall/mall-pay/src/main/java/com/yonge/cooleshow/sdk/res/OrderRefundRes.java
  27. 4 1
      cooleshow-mall/mall-pay/src/main/java/com/yonge/cooleshow/service/PaymentService.java
  28. 41 5
      cooleshow-mall/mall-pay/src/main/java/com/yonge/cooleshow/service/impl/AdapayPaymentServiceImpl.java
  29. 1 1
      cooleshow-mall/mall-pay/src/main/java/com/yonge/cooleshow/util/DistributedLock.java
  30. 0 13
      cooleshow-mall/mall-portal/pom.xml
  31. 6 3
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/PaymentController.java
  32. 26 37
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsPortalOrderServiceImpl.java
  33. 2 2
      cooleshow-mall/mall-portal/src/main/resources/config/mybatis/PortalOrderDao.xml
  34. 0 1
      cooleshow-task/src/main/java/com/yonge/cooleshow/task/jobs/CancelTimeOutOrderTask.java
  35. 46 24
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/UploadFileController.java
  36. 3 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/TeacherFreeTimeDao.java
  37. 8 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserOrderDao.java
  38. 10 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/req/OrderPayReq.java
  39. 19 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/OrderSearch.java
  40. 1 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/TeacherWithdrawalSearch.java
  41. 49 27
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOrderPayment.java
  42. 0 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserWithdrawal.java
  43. 63 81
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/VideoLessonGroup.java
  44. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/VideoLessonGroupDetail.java
  45. 2 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/TradeStatusEnum.java
  46. 1 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/props/HuifuProperties.java
  47. 24 14
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/sdk/PaymentSdk.java
  48. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseScheduleService.java
  49. 126 107
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UploadFileService.java
  50. 8 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderPaymentService.java
  51. 91 63
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderService.java
  52. 2 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleServiceImpl.java
  53. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicSheetServiceImpl.java
  54. 2 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/StudentServiceImpl.java
  55. 18 18
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserAccountServiceImpl.java
  56. 7 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderPaymentServiceImpl.java
  57. 176 69
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderServiceImpl.java
  58. 4 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/VideoLessonPurchaseRecordServiceImpl.java
  59. 0 18
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/HomeTotalVo.java
  60. 21 19
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/LessonGroupVo.java
  61. 12 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/StudentHomeVo.java
  62. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/VideoLessonPurchaseStudent.java
  63. 9 9
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/VideoLessonStudentVo.java
  64. 7 7
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/res/AccountTotal.java
  65. 15 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TeacherFreeTimeMapper.xml
  66. 68 61
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderMapper.xml
  67. 4 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderPaymentMapper.xml
  68. 1 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/VideoLessonGroupDetailMapper.xml
  69. 1 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/VideoLessonGroupMapper.xml
  70. 1 1
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/MusicSheetController.java
  71. 9 2
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/PaymentController.java
  72. 2 2
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/StudentCourseScheduleController.java
  73. 50 1
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/UserOrderController.java
  74. 0 1
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/VideoLessonController.java
  75. 16 1
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/UserWithdrawalController.java
  76. 42 0
      toolset/thirdparty-component/src/main/java/com/yonge/toolset/thirdparty/entity/UploadSign.java
  77. 42 28
      toolset/thirdparty-component/src/main/java/com/yonge/toolset/thirdparty/storage/StoragePlugin.java
  78. 35 28
      toolset/thirdparty-component/src/main/java/com/yonge/toolset/thirdparty/storage/StoragePluginContext.java
  79. 187 138
      toolset/thirdparty-component/src/main/java/com/yonge/toolset/thirdparty/storage/provider/AliyunOssStoragePlugin.java
  80. 192 146
      toolset/thirdparty-component/src/main/java/com/yonge/toolset/thirdparty/storage/provider/KS3StoragePlugin.java

+ 3 - 3
cooleshow-auth/auth-api/src/main/java/com/yonge/cooleshow/auth/api/dto/RealnameAuthReq.java

@@ -27,7 +27,7 @@ public class RealnameAuthReq implements Serializable {
 
     @NotNull(message = "缺少是否修改用户信息")
     @ApiModelProperty(value = "是否修改用户信息", required = true)
-    private Boolean isSave;
+    private Boolean save;
 
     private Long userId;
     // 性别(1,男 0,女)
@@ -62,11 +62,11 @@ public class RealnameAuthReq implements Serializable {
     }
 
     public Boolean getSave() {
-        return isSave;
+        return save;
     }
 
     public void setSave(Boolean save) {
-        isSave = save;
+        this.save = save;
     }
 
     public int getGender() {

+ 16 - 0
cooleshow-auth/auth-api/src/main/java/com/yonge/cooleshow/auth/api/dto/UserSetReq.java

@@ -1,8 +1,12 @@
 package com.yonge.cooleshow.auth.api.dto;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.yonge.cooleshow.common.enums.UserGenderEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
 
 /**
  * @Author: liweifan
@@ -16,6 +20,10 @@ public class UserSetReq {
     private String username;
     @ApiModelProperty(value = "性别 0女 1男")
     private Integer gender;
+    @ApiModelProperty(value = "出生日期")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date birthdate;
 
     public String getAvatar() {
         return avatar;
@@ -40,4 +48,12 @@ public class UserSetReq {
     public void setGender(Integer gender) {
         this.gender = gender;
     }
+
+    public Date getBirthdate() {
+        return birthdate;
+    }
+
+    public void setBirthdate(Date birthdate) {
+        this.birthdate = birthdate;
+    }
 }

+ 20 - 4
cooleshow-auth/auth-api/src/main/java/com/yonge/cooleshow/auth/api/vo/UserSetVo.java

@@ -1,7 +1,11 @@
 package com.yonge.cooleshow.auth.api.vo;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
 
 /**
  *
@@ -18,8 +22,12 @@ public class UserSetVo {
     private Integer gender;
     @ApiModelProperty(value = "手机号")
     private String phone;
-    @ApiModelProperty(value = "是否实名 0否 1是")
-    private Boolean isReal;
+    @ApiModelProperty(value = "是否实名")
+    private Boolean real;
+    @ApiModelProperty(value = "出生日期")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date birthdate;
 
     public String getAvatar() {
         return avatar;
@@ -54,10 +62,18 @@ public class UserSetVo {
     }
 
     public Boolean getReal() {
-        return isReal;
+        return real;
     }
 
     public void setReal(Boolean real) {
-        isReal = real;
+        this.real = real;
+    }
+
+    public Date getBirthdate() {
+        return birthdate;
+    }
+
+    public void setBirthdate(Date birthdate) {
+        this.birthdate = birthdate;
     }
 }

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

@@ -233,6 +233,7 @@
             u.username_ as username,
             u.gender_ as gender,
             u.phone_ as phone,
+            u.birthdate_ as birthdate,
             (case when isnull(u.id_card_no_) then 0 else 1 end) as isReal
         FROM sys_user u
         where u.id_ = #{id}
@@ -250,6 +251,9 @@
         <if test="param.gender != null">
             gender_ = #{param.gender},
         </if>
+        <if test="param.birthdate != null">
+            birthdate_ = #{param.birthdate},
+        </if>
         update_time_ = now()
         WHERE id_ = #{id}
     </update>

+ 1 - 1
cooleshow-cms/src/main/resources/config/mybatis/SysNewsInformationMapper.xml

@@ -63,7 +63,7 @@
 				<if test="platformType != 'ADMIN'" >
 					and sni.status_ = 1
 					<if test="type != 5">
-						and sni.online_time_ &lt;= now()
+						and if(sni.online_time_ is not null,sni.online_time_ &lt;= now(),1=1)
 						and if(sni.offline_time_ is not null,sni.offline_time_ &gt;= now(),1=1)
 					</if>
 				</if>

+ 7 - 0
cooleshow-mall/mall-admin/pom.xml

@@ -54,6 +54,13 @@
             <version>20.0</version>
             <scope>compile</scope>
         </dependency>
+
+
+
+        <dependency>
+            <groupId>com.yonge.cooleshow</groupId>
+            <artifactId>mall-pay</artifactId>
+        </dependency>
     </dependencies>
 
     <build>

+ 1 - 1
cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/MallAdminApplication.java

@@ -16,7 +16,7 @@ import org.springframework.context.annotation.ComponentScan;
 @EnableDiscoveryClient
 @MapperScan({"com.yonge.cooleshow.admin.dao","com.yonge.cooleshow.mbg.mapper"})
 @ComponentScan(basePackages = {"com.yonge.cooleshow.admin", "com.yonge.cooleshow.mbg", "com.yonge.cooleshow.mall.common",
-                               "com.yonge.cooleshow.common"})
+                               "com.yonge.cooleshow.common","com.yonge.cooleshow"})
 @EnableSwagger2Doc
 @EnableFeignClients("com.yonge.cooleshow")
 public class MallAdminApplication {

+ 25 - 3
cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/controller/OmsOrderReturnApplyController.java

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.admin.controller;
 
+import com.yonge.cooleshow.enums.OrdeerCacherEnmu;
 import com.yonge.cooleshow.mall.common.api.CommonPage;
 import com.yonge.cooleshow.mall.common.api.CommonResult;
 import com.yonge.cooleshow.admin.dto.OmsOrderReturnApplyResult;
@@ -9,11 +10,16 @@ import com.yonge.cooleshow.mbg.model.OmsOrderReturnApply;
 import com.yonge.cooleshow.admin.service.OmsOrderReturnApplyService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
+import java.util.concurrent.TimeUnit;
 
 /**
  * 订单退货申请管理Controller
@@ -26,6 +32,11 @@ public class OmsOrderReturnApplyController {
     @Autowired
     private OmsOrderReturnApplyService returnApplyService;
 
+    @Autowired
+    private RedissonClient redissonClient;
+
+    private static final Logger log = LoggerFactory.getLogger(OmsOrderReturnApplyController.class);
+
     @ApiOperation("分页查询退货申请")
     @RequestMapping(value = "/list", method = RequestMethod.GET)
     @ResponseBody
@@ -59,10 +70,21 @@ public class OmsOrderReturnApplyController {
     @RequestMapping(value = "/update/status/{id}", method = RequestMethod.POST)
     @ResponseBody
     public CommonResult updateStatus(@PathVariable Long id, @RequestBody OmsUpdateStatusParam statusParam) {
-        int count = returnApplyService.updateStatus(id, statusParam);
-        if (count > 0) {
-            return CommonResult.success(count);
+        RLock lock = redissonClient.getLock(OrdeerCacherEnmu.LOCK_REFUND_ORDER_MALL + ":refundOrder:" + id);
+        try {
+            boolean b = lock.tryLock(60, 60, TimeUnit.SECONDS);
+            if (b) {
+                int count = returnApplyService.updateStatus(id, statusParam);
+                if (count > 0) {
+                    return CommonResult.success(count);
+                }
+            }
+        } catch (Exception e) {
+            log.error(e.getLocalizedMessage());
+            e.printStackTrace();
+            lock.unlock();
         }
+
         return CommonResult.failed();
     }
 

+ 62 - 0
cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/controller/PaymentController.java

@@ -0,0 +1,62 @@
+package com.yonge.cooleshow.admin.controller;
+
+import com.huifu.adapay.core.AdapayCore;
+import com.huifu.adapay.core.util.AdapaySign;
+import com.yonge.cooleshow.admin.service.OmsOrderReturnApplyService;
+import com.yonge.cooleshow.common.controller.BaseController;
+import io.swagger.annotations.Api;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * @Author: liweifan
+ * @Data: 2022/3/11 18:16
+ */
+@RestController
+@RequestMapping("/payment")
+@Api(value = "付款接口", tags = "付款接口")
+public class PaymentController extends BaseController {
+    private final static Logger log = LoggerFactory.getLogger(PaymentController.class);
+
+    @Autowired
+    private OmsOrderReturnApplyService orderReturnApplyService;
+
+    /**
+     * 汇付回调
+     * 问题:1、成功失败需要回执什么信息 2、回调url地址是否需要加入白名单
+     * @author liweifan
+     * @param: request
+     * @updateTime 2022/3/11 18:35
+     */
+    @PostMapping("/callback")
+    public void callback(HttpServletRequest request) {
+        try {
+            //验签传参data
+            String data = request.getParameter("data");
+            //验签传参sign
+            String sign = request.getParameter("sign");
+            //验签传参publicKey
+            String publicKey = AdapayCore.PUBLIC_KEY;
+            //验签
+            boolean checkSign = AdapaySign.verifySign(data, sign, publicKey);
+            log.info("汇付回调,res is {}", data);
+            if (checkSign) {
+                //验签成功逻辑
+                log.info("验签成功");
+                String type = request.getParameter("type");
+                if (type.contains("refund")) {
+                    orderReturnApplyService.orderCallback(data);
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+}

+ 7 - 0
cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/OmsOrderReturnApplyService.java

@@ -31,4 +31,11 @@ public interface OmsOrderReturnApplyService {
      * 获取指定申请详情
      */
     OmsOrderReturnApplyResult getItem(Long id);
+
+    /**
+     * 退款订单回调
+     *
+     * @param data
+     */
+    void orderCallback(String data);
 }

+ 122 - 0
cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/OmsOrderReturnApplyServiceImpl.java

@@ -1,17 +1,31 @@
 package com.yonge.cooleshow.admin.service.impl;
 
+import com.alibaba.fastjson.JSONObject;
 import com.github.pagehelper.PageHelper;
 import com.yonge.cooleshow.admin.dao.OmsOrderReturnApplyDao;
 import com.yonge.cooleshow.admin.dto.OmsOrderReturnApplyResult;
 import com.yonge.cooleshow.admin.dto.OmsReturnApplyQueryParam;
 import com.yonge.cooleshow.admin.dto.OmsUpdateStatusParam;
+import com.yonge.cooleshow.common.exception.BizException;
+import com.yonge.cooleshow.enums.PayStatusEnum;
 import com.yonge.cooleshow.mbg.mapper.OmsOrderReturnApplyMapper;
+import com.yonge.cooleshow.mbg.mapper.UserOrderPaymentMapper;
+import com.yonge.cooleshow.mbg.mapper.UserOrderRefundMapper;
 import com.yonge.cooleshow.mbg.model.OmsOrderReturnApply;
 import com.yonge.cooleshow.mbg.model.OmsOrderReturnApplyExample;
 import com.yonge.cooleshow.admin.service.OmsOrderReturnApplyService;
+import com.yonge.cooleshow.mbg.model.UserOrderPayment;
+import com.yonge.cooleshow.mbg.model.UserOrderRefund;
+import com.yonge.cooleshow.sdk.req.OrderRefundReq;
+import com.yonge.cooleshow.sdk.res.OrderRefundRes;
+import com.yonge.cooleshow.service.PaymentService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.Date;
 import java.util.List;
 
@@ -21,10 +35,23 @@ import java.util.List;
  */
 @Service
 public class OmsOrderReturnApplyServiceImpl implements OmsOrderReturnApplyService {
+
+    private static final Logger log = LoggerFactory.getLogger(OmsOrderReturnApplyService.class);
+
     @Autowired
     private OmsOrderReturnApplyDao returnApplyDao;
     @Autowired
     private OmsOrderReturnApplyMapper returnApplyMapper;
+
+    @Autowired
+    private PaymentService adapayPaymentService;
+
+    @Autowired
+    private UserOrderPaymentMapper userOrderPaymentMapper;
+
+    @Autowired
+    private UserOrderRefundMapper userOrderRefundMapper;
+
     @Override
     public List<OmsOrderReturnApply> list(OmsReturnApplyQueryParam queryParam, Integer pageSize, Integer pageNum) {
         PageHelper.startPage(pageNum,pageSize);
@@ -41,6 +68,10 @@ public class OmsOrderReturnApplyServiceImpl implements OmsOrderReturnApplyServic
     @Override
     public int updateStatus(Long id, OmsUpdateStatusParam statusParam) {
         Integer status = statusParam.getStatus();
+        OmsOrderReturnApply omsOrderReturnApply = returnApplyMapper.selectByPrimaryKey(id);
+        if (omsOrderReturnApply.getStatus().equals(statusParam.getStatus())) {
+            return 1;
+        }
         OmsOrderReturnApply returnApply = new OmsOrderReturnApply();
         if(status.equals(1)){
             //确认退货
@@ -58,6 +89,7 @@ public class OmsOrderReturnApplyServiceImpl implements OmsOrderReturnApplyServic
             returnApply.setReceiveTime(new Date());
             returnApply.setReceiveMan(statusParam.getReceiveMan());
             returnApply.setReceiveNote(statusParam.getReceiveNote());
+            refundAmount(returnApply);
         }else if(status.equals(3)){
             //拒绝退货
             returnApply.setId(id);
@@ -71,8 +103,98 @@ public class OmsOrderReturnApplyServiceImpl implements OmsOrderReturnApplyServic
         return returnApplyMapper.updateByPrimaryKeySelective(returnApply);
     }
 
+    /**
+     * 退款处理
+     *
+     * @param returnApply 退款信息
+     */
+    private void refundAmount(OmsOrderReturnApply returnApply) {
+        // 退款
+        UserOrderPayment userOrderPayment = userOrderPaymentMapper.selectByOrderNo(returnApply.getOrderSn());
+        OrderRefundReq refundReq = new OrderRefundReq();
+        refundReq.setOrderNo(returnApply.getOrderSn());
+        refundReq.setRefundAmount(returnApply.getReturnAmount().setScale(2, RoundingMode.HALF_UP).toString());
+        refundReq.setReason(returnApply.getProductName());
+        refundReq.setTransNo(userOrderPayment.getTransNo());
+        OrderRefundRes orderRefundRes = adapayPaymentService.orderRefund(refundReq);
+        if (orderRefundRes.isStatus()) {
+            UserOrderRefund userOrderRefund = new UserOrderRefund();
+            userOrderRefund.setOrderNo(orderRefundRes.getRefundOrderNo());
+            userOrderRefund.setTransNo(orderRefundRes.getTransNo());
+            userOrderRefund.setPayTransNo(orderRefundRes.getPayTransNo());
+            userOrderRefund.setRefundAmt(new BigDecimal(orderRefundRes.getRefundAmount()));
+            userOrderRefund.setStatus(orderRefundRes.getRefundStatus().getCode());
+            userOrderRefundMapper.insert(userOrderRefund);
+        } else {
+            throw new BizException(orderRefundRes.getMessage());
+        }
+    }
+
     @Override
     public OmsOrderReturnApplyResult getItem(Long id) {
         return returnApplyDao.getDetail(id);
     }
+
+    @Override
+    public void orderCallback(String data) {
+        JSONObject hfRes = JSONObject.parseObject(data);
+        UserOrderRefund userOrderRefund = userOrderRefundMapper.selectByTransNo(hfRes.getString("id"));
+        if (null == userOrderRefund) {
+            log.error("汇付退款回调,订单未找到。 req is {}", data);
+            return;
+        }
+
+        if (!userOrderRefund.getStatus().equals(PayStatusEnum.pending.getCode())) {
+            log.error("汇付退款回调,订单状态异常。 req is {}", data);
+        }
+        if (PayStatusEnum.succeeded.getCode().equals(hfRes.getString("status"))) {
+            //退款成功
+            refundSuccess(userOrderRefund, hfRes);
+        } else {
+            // 退款失败
+            refundCancel(userOrderRefund,hfRes);
+        }
+    }
+
+    /**
+     * 退款失败
+     *
+     * @param userOrderRefund
+     * @param hfRes
+     */
+    private void refundCancel(UserOrderRefund userOrderRefund, JSONObject hfRes) {
+        userOrderRefund.setArrivalTime(new Date());
+        userOrderRefund.setStatus(PayStatusEnum.failed.getCode());
+        if (hfRes != null) {
+            try {
+                userOrderRefund.setPayFailMsg(hfRes.getString("error_msg"));
+            }catch (Exception e) {
+                log.error("退款订单,退款失败参数错误,参数{}", hfRes.toJSONString());
+            }
+        }
+        userOrderRefundMapper.updateByPrimaryKeySelective(userOrderRefund);
+    }
+
+    /**
+     * 退款成功
+     *
+     * @param userOrderRefund
+     * @param hfRes
+     */
+    private void refundSuccess(UserOrderRefund userOrderRefund, JSONObject hfRes) {
+
+        userOrderRefund.setArrivalTime(new Date());
+        userOrderRefund.setStatus(PayStatusEnum.succeeded.getCode());
+        if (hfRes != null) {
+            try {
+                userOrderRefund.setFeeAmt(hfRes.getBigDecimal("fee_amt"));
+                userOrderRefund.setRefundAmt(hfRes.getBigDecimal("pay_amt"));
+            }catch (Exception e) {
+                log.error("退款订单,金额格式化失败,参数{}", hfRes.toJSONString());
+            }
+        }
+        userOrderRefundMapper.updateByPrimaryKeySelective(userOrderRefund);
+
+
+    }
 }

+ 41 - 0
cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/mapper/UserOrderRefundMapper.java

@@ -0,0 +1,41 @@
+package com.yonge.cooleshow.mbg.mapper;
+
+import com.yonge.cooleshow.mbg.model.UserOrderRefund;
+import com.yonge.cooleshow.mbg.model.UserOrderRefundExample;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * Description
+ *
+ * @author: feng-ji
+ * @date: 2022-04-27
+ */
+public interface UserOrderRefundMapper {
+    long countByExample(UserOrderRefundExample example);
+
+    int deleteByExample(UserOrderRefundExample example);
+
+    int deleteByPrimaryKey(Long id);
+
+    int insert(UserOrderRefund record);
+
+    int insertSelective(UserOrderRefund record);
+
+    List<UserOrderRefund> selectByExample(UserOrderRefundExample example);
+
+    UserOrderRefund selectByPrimaryKey(Long id);
+
+    int updateByExampleSelective(@Param("record") UserOrderRefund record, @Param(
+            "example") UserOrderRefundExample example);
+
+    int updateByExample(@Param("record") UserOrderRefund record, @Param("example") UserOrderRefundExample example);
+
+    int updateByPrimaryKeySelective(UserOrderRefund record);
+
+    int updateByPrimaryKey(UserOrderRefund record);
+
+    UserOrderRefund selectByTransNo(@Param("transNo") String transNo);
+}

+ 39 - 1
cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/model/UserOrderPayment.java

@@ -38,6 +38,18 @@ public class UserOrderPayment implements Serializable {
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
     private Date arrivalTime;
+
+    @ApiModelProperty("关单状态 pending 交易处理中 succeeded 交易成功 failed 交易失败")
+    private String closeStatus;
+
+    @ApiModelProperty("失败信息 ")
+    private String closeFailMsg;
+
+    @ApiModelProperty("关单时间 ")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    private Date closeTime;
+
     @ApiModelProperty("创建时间 ")
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
@@ -47,7 +59,33 @@ public class UserOrderPayment implements Serializable {
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
     private Date updateTime;
 
-	public Long getId() {
+
+    public String getCloseStatus() {
+        return closeStatus;
+    }
+
+    public void setCloseStatus(String closeStatus) {
+        this.closeStatus = closeStatus;
+    }
+
+    public String getCloseFailMsg() {
+        return closeFailMsg;
+    }
+
+    public void setCloseFailMsg(String closeFailMsg) {
+        this.closeFailMsg = closeFailMsg;
+    }
+
+    public Date getCloseTime() {
+        return closeTime;
+    }
+
+    public void setCloseTime(Date closeTime) {
+        this.closeTime = closeTime;
+    }
+
+
+    public Long getId() {
         return id;
     }
 

+ 163 - 0
cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/model/UserOrderRefund.java

@@ -0,0 +1,163 @@
+package com.yonge.cooleshow.mbg.model;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+* Description
+* @author: feng-ji
+* @date: 2022-04-27
+*/
+
+/**
+ * 平台订单退款表
+ */
+@ApiModel(value = "平台订单退款表")
+public class UserOrderRefund {
+    @ApiModelProperty(value = "")
+    private Long id;
+
+    /**
+     * 订单号
+     */
+    @ApiModelProperty(value = "订单号")
+    private String orderNo;
+
+    /**
+     * 退款流水号
+     */
+    @ApiModelProperty(value = "退款流水号")
+    private String transNo;
+
+    /**
+     * 支付流水号
+     */
+    @ApiModelProperty(value = "支付流水号")
+    private String payTransNo;
+
+    /**
+     * 交易金额,必须大于0,保留两位小数点,如0.10、100.05等
+     */
+    @ApiModelProperty(value = "交易金额,必须大于0,保留两位小数点,如0.10、100.05等")
+    private BigDecimal refundAmt;
+
+    /**
+     * 汇付收取的服务费
+     */
+    @ApiModelProperty(value = "汇付收取的服务费")
+    private BigDecimal feeAmt;
+
+    /**
+     * 交易状态 pending 交易处理中 succeeded 交易成功 failed 交易失败
+     */
+    @ApiModelProperty(value = "交易状态 pending 交易处理中 succeeded 交易成功 failed 交易失败")
+    private String status;
+
+    /**
+     * 失败信息
+     */
+    @ApiModelProperty(value = "失败信息")
+    private String payFailMsg;
+
+    /**
+     * 到账时间
+     */
+    @ApiModelProperty(value = "到账时间")
+    private Date arrivalTime;
+
+    @ApiModelProperty(value = "")
+    private Date createTime;
+
+    @ApiModelProperty(value = "")
+    private Date updateTime;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getOrderNo() {
+        return orderNo;
+    }
+
+    public void setOrderNo(String orderNo) {
+        this.orderNo = orderNo;
+    }
+
+    public String getTransNo() {
+        return transNo;
+    }
+
+    public void setTransNo(String transNo) {
+        this.transNo = transNo;
+    }
+
+    public String getPayTransNo() {
+        return payTransNo;
+    }
+
+    public void setPayTransNo(String payTransNo) {
+        this.payTransNo = payTransNo;
+    }
+
+    public BigDecimal getRefundAmt() {
+        return refundAmt;
+    }
+
+    public void setRefundAmt(BigDecimal refundAmt) {
+        this.refundAmt = refundAmt;
+    }
+
+    public BigDecimal getFeeAmt() {
+        return feeAmt;
+    }
+
+    public void setFeeAmt(BigDecimal feeAmt) {
+        this.feeAmt = feeAmt;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public String getPayFailMsg() {
+        return payFailMsg;
+    }
+
+    public void setPayFailMsg(String payFailMsg) {
+        this.payFailMsg = payFailMsg;
+    }
+
+    public Date getArrivalTime() {
+        return arrivalTime;
+    }
+
+    public void setArrivalTime(Date arrivalTime) {
+        this.arrivalTime = arrivalTime;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+}

+ 917 - 0
cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/model/UserOrderRefundExample.java

@@ -0,0 +1,917 @@
+package com.yonge.cooleshow.mbg.model;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+* Description
+* @author: feng-ji
+* @date: 2022-04-27
+*/
+public class UserOrderRefundExample {
+    protected String orderByClause;
+
+    protected boolean distinct;
+
+    protected List<Criteria> oredCriteria;
+
+    public UserOrderRefundExample() {
+        oredCriteria = new ArrayList<>();
+    }
+
+    public void setOrderByClause(String orderByClause) {
+        this.orderByClause = orderByClause;
+    }
+
+    public String getOrderByClause() {
+        return orderByClause;
+    }
+
+    public void setDistinct(boolean distinct) {
+        this.distinct = distinct;
+    }
+
+    public boolean isDistinct() {
+        return distinct;
+    }
+
+    public List<Criteria> getOredCriteria() {
+        return oredCriteria;
+    }
+
+    public void or(Criteria criteria) {
+        oredCriteria.add(criteria);
+    }
+
+    public Criteria or() {
+        Criteria criteria = createCriteriaInternal();
+        oredCriteria.add(criteria);
+        return criteria;
+    }
+
+    public Criteria createCriteria() {
+        Criteria criteria = createCriteriaInternal();
+        if (oredCriteria.size() == 0) {
+            oredCriteria.add(criteria);
+        }
+        return criteria;
+    }
+
+    protected Criteria createCriteriaInternal() {
+        Criteria criteria = new Criteria();
+        return criteria;
+    }
+
+    public void clear() {
+        oredCriteria.clear();
+        orderByClause = null;
+        distinct = false;
+    }
+
+    protected abstract static class GeneratedCriteria {
+        protected List<Criterion> criteria;
+
+        protected GeneratedCriteria() {
+            super();
+            criteria = new ArrayList<>();
+        }
+
+        public boolean isValid() {
+            return criteria.size() > 0;
+        }
+
+        public List<Criterion> getAllCriteria() {
+            return criteria;
+        }
+
+        public List<Criterion> getCriteria() {
+            return criteria;
+        }
+
+        protected void addCriterion(String condition) {
+            if (condition == null) {
+                throw new RuntimeException("Value for condition cannot be null");
+            }
+            criteria.add(new Criterion(condition));
+        }
+
+        protected void addCriterion(String condition, Object value, String property) {
+            if (value == null) {
+                throw new RuntimeException("Value for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value));
+        }
+
+        protected void addCriterion(String condition, Object value1, Object value2, String property) {
+            if (value1 == null || value2 == null) {
+                throw new RuntimeException("Between values for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value1, value2));
+        }
+
+        public Criteria andIdIsNull() {
+            addCriterion("id_ is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIsNotNull() {
+            addCriterion("id_ is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdEqualTo(Long value) {
+            addCriterion("id_ =", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotEqualTo(Long value) {
+            addCriterion("id_ <>", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThan(Long value) {
+            addCriterion("id_ >", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("id_ >=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThan(Long value) {
+            addCriterion("id_ <", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThanOrEqualTo(Long value) {
+            addCriterion("id_ <=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIn(List<Long> values) {
+            addCriterion("id_ in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotIn(List<Long> values) {
+            addCriterion("id_ not in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdBetween(Long value1, Long value2) {
+            addCriterion("id_ between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotBetween(Long value1, Long value2) {
+            addCriterion("id_ not between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrderNoIsNull() {
+            addCriterion("order_no_ is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrderNoIsNotNull() {
+            addCriterion("order_no_ is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrderNoEqualTo(String value) {
+            addCriterion("order_no_ =", value, "orderNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrderNoNotEqualTo(String value) {
+            addCriterion("order_no_ <>", value, "orderNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrderNoGreaterThan(String value) {
+            addCriterion("order_no_ >", value, "orderNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrderNoGreaterThanOrEqualTo(String value) {
+            addCriterion("order_no_ >=", value, "orderNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrderNoLessThan(String value) {
+            addCriterion("order_no_ <", value, "orderNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrderNoLessThanOrEqualTo(String value) {
+            addCriterion("order_no_ <=", value, "orderNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrderNoLike(String value) {
+            addCriterion("order_no_ like", value, "orderNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrderNoNotLike(String value) {
+            addCriterion("order_no_ not like", value, "orderNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrderNoIn(List<String> values) {
+            addCriterion("order_no_ in", values, "orderNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrderNoNotIn(List<String> values) {
+            addCriterion("order_no_ not in", values, "orderNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrderNoBetween(String value1, String value2) {
+            addCriterion("order_no_ between", value1, value2, "orderNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrderNoNotBetween(String value1, String value2) {
+            addCriterion("order_no_ not between", value1, value2, "orderNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andTransNoIsNull() {
+            addCriterion("trans_no_ is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTransNoIsNotNull() {
+            addCriterion("trans_no_ is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTransNoEqualTo(String value) {
+            addCriterion("trans_no_ =", value, "transNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andTransNoNotEqualTo(String value) {
+            addCriterion("trans_no_ <>", value, "transNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andTransNoGreaterThan(String value) {
+            addCriterion("trans_no_ >", value, "transNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andTransNoGreaterThanOrEqualTo(String value) {
+            addCriterion("trans_no_ >=", value, "transNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andTransNoLessThan(String value) {
+            addCriterion("trans_no_ <", value, "transNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andTransNoLessThanOrEqualTo(String value) {
+            addCriterion("trans_no_ <=", value, "transNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andTransNoLike(String value) {
+            addCriterion("trans_no_ like", value, "transNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andTransNoNotLike(String value) {
+            addCriterion("trans_no_ not like", value, "transNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andTransNoIn(List<String> values) {
+            addCriterion("trans_no_ in", values, "transNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andTransNoNotIn(List<String> values) {
+            addCriterion("trans_no_ not in", values, "transNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andTransNoBetween(String value1, String value2) {
+            addCriterion("trans_no_ between", value1, value2, "transNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andTransNoNotBetween(String value1, String value2) {
+            addCriterion("trans_no_ not between", value1, value2, "transNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andPayTransNoIsNull() {
+            addCriterion("pay_trans_no_ is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPayTransNoIsNotNull() {
+            addCriterion("pay_trans_no_ is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPayTransNoEqualTo(String value) {
+            addCriterion("pay_trans_no_ =", value, "payTransNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andPayTransNoNotEqualTo(String value) {
+            addCriterion("pay_trans_no_ <>", value, "payTransNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andPayTransNoGreaterThan(String value) {
+            addCriterion("pay_trans_no_ >", value, "payTransNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andPayTransNoGreaterThanOrEqualTo(String value) {
+            addCriterion("pay_trans_no_ >=", value, "payTransNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andPayTransNoLessThan(String value) {
+            addCriterion("pay_trans_no_ <", value, "payTransNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andPayTransNoLessThanOrEqualTo(String value) {
+            addCriterion("pay_trans_no_ <=", value, "payTransNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andPayTransNoLike(String value) {
+            addCriterion("pay_trans_no_ like", value, "payTransNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andPayTransNoNotLike(String value) {
+            addCriterion("pay_trans_no_ not like", value, "payTransNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andPayTransNoIn(List<String> values) {
+            addCriterion("pay_trans_no_ in", values, "payTransNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andPayTransNoNotIn(List<String> values) {
+            addCriterion("pay_trans_no_ not in", values, "payTransNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andPayTransNoBetween(String value1, String value2) {
+            addCriterion("pay_trans_no_ between", value1, value2, "payTransNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andPayTransNoNotBetween(String value1, String value2) {
+            addCriterion("pay_trans_no_ not between", value1, value2, "payTransNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andRefundAmtIsNull() {
+            addCriterion("refund_amt_ is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andRefundAmtIsNotNull() {
+            addCriterion("refund_amt_ is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andRefundAmtEqualTo(BigDecimal value) {
+            addCriterion("refund_amt_ =", value, "refundAmt");
+            return (Criteria) this;
+        }
+
+        public Criteria andRefundAmtNotEqualTo(BigDecimal value) {
+            addCriterion("refund_amt_ <>", value, "refundAmt");
+            return (Criteria) this;
+        }
+
+        public Criteria andRefundAmtGreaterThan(BigDecimal value) {
+            addCriterion("refund_amt_ >", value, "refundAmt");
+            return (Criteria) this;
+        }
+
+        public Criteria andRefundAmtGreaterThanOrEqualTo(BigDecimal value) {
+            addCriterion("refund_amt_ >=", value, "refundAmt");
+            return (Criteria) this;
+        }
+
+        public Criteria andRefundAmtLessThan(BigDecimal value) {
+            addCriterion("refund_amt_ <", value, "refundAmt");
+            return (Criteria) this;
+        }
+
+        public Criteria andRefundAmtLessThanOrEqualTo(BigDecimal value) {
+            addCriterion("refund_amt_ <=", value, "refundAmt");
+            return (Criteria) this;
+        }
+
+        public Criteria andRefundAmtIn(List<BigDecimal> values) {
+            addCriterion("refund_amt_ in", values, "refundAmt");
+            return (Criteria) this;
+        }
+
+        public Criteria andRefundAmtNotIn(List<BigDecimal> values) {
+            addCriterion("refund_amt_ not in", values, "refundAmt");
+            return (Criteria) this;
+        }
+
+        public Criteria andRefundAmtBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("refund_amt_ between", value1, value2, "refundAmt");
+            return (Criteria) this;
+        }
+
+        public Criteria andRefundAmtNotBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("refund_amt_ not between", value1, value2, "refundAmt");
+            return (Criteria) this;
+        }
+
+        public Criteria andFeeAmtIsNull() {
+            addCriterion("fee_amt_ is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andFeeAmtIsNotNull() {
+            addCriterion("fee_amt_ is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andFeeAmtEqualTo(BigDecimal value) {
+            addCriterion("fee_amt_ =", value, "feeAmt");
+            return (Criteria) this;
+        }
+
+        public Criteria andFeeAmtNotEqualTo(BigDecimal value) {
+            addCriterion("fee_amt_ <>", value, "feeAmt");
+            return (Criteria) this;
+        }
+
+        public Criteria andFeeAmtGreaterThan(BigDecimal value) {
+            addCriterion("fee_amt_ >", value, "feeAmt");
+            return (Criteria) this;
+        }
+
+        public Criteria andFeeAmtGreaterThanOrEqualTo(BigDecimal value) {
+            addCriterion("fee_amt_ >=", value, "feeAmt");
+            return (Criteria) this;
+        }
+
+        public Criteria andFeeAmtLessThan(BigDecimal value) {
+            addCriterion("fee_amt_ <", value, "feeAmt");
+            return (Criteria) this;
+        }
+
+        public Criteria andFeeAmtLessThanOrEqualTo(BigDecimal value) {
+            addCriterion("fee_amt_ <=", value, "feeAmt");
+            return (Criteria) this;
+        }
+
+        public Criteria andFeeAmtIn(List<BigDecimal> values) {
+            addCriterion("fee_amt_ in", values, "feeAmt");
+            return (Criteria) this;
+        }
+
+        public Criteria andFeeAmtNotIn(List<BigDecimal> values) {
+            addCriterion("fee_amt_ not in", values, "feeAmt");
+            return (Criteria) this;
+        }
+
+        public Criteria andFeeAmtBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("fee_amt_ between", value1, value2, "feeAmt");
+            return (Criteria) this;
+        }
+
+        public Criteria andFeeAmtNotBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("fee_amt_ not between", value1, value2, "feeAmt");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusIsNull() {
+            addCriterion("status_ is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusIsNotNull() {
+            addCriterion("status_ is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusEqualTo(String value) {
+            addCriterion("status_ =", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusNotEqualTo(String value) {
+            addCriterion("status_ <>", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusGreaterThan(String value) {
+            addCriterion("status_ >", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusGreaterThanOrEqualTo(String value) {
+            addCriterion("status_ >=", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusLessThan(String value) {
+            addCriterion("status_ <", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusLessThanOrEqualTo(String value) {
+            addCriterion("status_ <=", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusLike(String value) {
+            addCriterion("status_ like", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusNotLike(String value) {
+            addCriterion("status_ not like", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusIn(List<String> values) {
+            addCriterion("status_ in", values, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusNotIn(List<String> values) {
+            addCriterion("status_ not in", values, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusBetween(String value1, String value2) {
+            addCriterion("status_ between", value1, value2, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusNotBetween(String value1, String value2) {
+            addCriterion("status_ not between", value1, value2, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andPayFailMsgIsNull() {
+            addCriterion("pay_fail_msg_ is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPayFailMsgIsNotNull() {
+            addCriterion("pay_fail_msg_ is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPayFailMsgEqualTo(String value) {
+            addCriterion("pay_fail_msg_ =", value, "payFailMsg");
+            return (Criteria) this;
+        }
+
+        public Criteria andPayFailMsgNotEqualTo(String value) {
+            addCriterion("pay_fail_msg_ <>", value, "payFailMsg");
+            return (Criteria) this;
+        }
+
+        public Criteria andPayFailMsgGreaterThan(String value) {
+            addCriterion("pay_fail_msg_ >", value, "payFailMsg");
+            return (Criteria) this;
+        }
+
+        public Criteria andPayFailMsgGreaterThanOrEqualTo(String value) {
+            addCriterion("pay_fail_msg_ >=", value, "payFailMsg");
+            return (Criteria) this;
+        }
+
+        public Criteria andPayFailMsgLessThan(String value) {
+            addCriterion("pay_fail_msg_ <", value, "payFailMsg");
+            return (Criteria) this;
+        }
+
+        public Criteria andPayFailMsgLessThanOrEqualTo(String value) {
+            addCriterion("pay_fail_msg_ <=", value, "payFailMsg");
+            return (Criteria) this;
+        }
+
+        public Criteria andPayFailMsgLike(String value) {
+            addCriterion("pay_fail_msg_ like", value, "payFailMsg");
+            return (Criteria) this;
+        }
+
+        public Criteria andPayFailMsgNotLike(String value) {
+            addCriterion("pay_fail_msg_ not like", value, "payFailMsg");
+            return (Criteria) this;
+        }
+
+        public Criteria andPayFailMsgIn(List<String> values) {
+            addCriterion("pay_fail_msg_ in", values, "payFailMsg");
+            return (Criteria) this;
+        }
+
+        public Criteria andPayFailMsgNotIn(List<String> values) {
+            addCriterion("pay_fail_msg_ not in", values, "payFailMsg");
+            return (Criteria) this;
+        }
+
+        public Criteria andPayFailMsgBetween(String value1, String value2) {
+            addCriterion("pay_fail_msg_ between", value1, value2, "payFailMsg");
+            return (Criteria) this;
+        }
+
+        public Criteria andPayFailMsgNotBetween(String value1, String value2) {
+            addCriterion("pay_fail_msg_ not between", value1, value2, "payFailMsg");
+            return (Criteria) this;
+        }
+
+        public Criteria andArrivalTimeIsNull() {
+            addCriterion("arrival_time_ is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andArrivalTimeIsNotNull() {
+            addCriterion("arrival_time_ is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andArrivalTimeEqualTo(Date value) {
+            addCriterion("arrival_time_ =", value, "arrivalTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andArrivalTimeNotEqualTo(Date value) {
+            addCriterion("arrival_time_ <>", value, "arrivalTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andArrivalTimeGreaterThan(Date value) {
+            addCriterion("arrival_time_ >", value, "arrivalTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andArrivalTimeGreaterThanOrEqualTo(Date value) {
+            addCriterion("arrival_time_ >=", value, "arrivalTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andArrivalTimeLessThan(Date value) {
+            addCriterion("arrival_time_ <", value, "arrivalTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andArrivalTimeLessThanOrEqualTo(Date value) {
+            addCriterion("arrival_time_ <=", value, "arrivalTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andArrivalTimeIn(List<Date> values) {
+            addCriterion("arrival_time_ in", values, "arrivalTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andArrivalTimeNotIn(List<Date> values) {
+            addCriterion("arrival_time_ not in", values, "arrivalTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andArrivalTimeBetween(Date value1, Date value2) {
+            addCriterion("arrival_time_ between", value1, value2, "arrivalTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andArrivalTimeNotBetween(Date value1, Date value2) {
+            addCriterion("arrival_time_ not between", value1, value2, "arrivalTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIsNull() {
+            addCriterion("create_time_ is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIsNotNull() {
+            addCriterion("create_time_ is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeEqualTo(Date value) {
+            addCriterion("create_time_ =", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotEqualTo(Date value) {
+            addCriterion("create_time_ <>", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeGreaterThan(Date value) {
+            addCriterion("create_time_ >", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeGreaterThanOrEqualTo(Date value) {
+            addCriterion("create_time_ >=", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeLessThan(Date value) {
+            addCriterion("create_time_ <", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeLessThanOrEqualTo(Date value) {
+            addCriterion("create_time_ <=", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIn(List<Date> values) {
+            addCriterion("create_time_ in", values, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotIn(List<Date> values) {
+            addCriterion("create_time_ not in", values, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeBetween(Date value1, Date value2) {
+            addCriterion("create_time_ between", value1, value2, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotBetween(Date value1, Date value2) {
+            addCriterion("create_time_ not between", value1, value2, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeIsNull() {
+            addCriterion("update_time_ is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeIsNotNull() {
+            addCriterion("update_time_ is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeEqualTo(Date value) {
+            addCriterion("update_time_ =", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeNotEqualTo(Date value) {
+            addCriterion("update_time_ <>", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeGreaterThan(Date value) {
+            addCriterion("update_time_ >", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeGreaterThanOrEqualTo(Date value) {
+            addCriterion("update_time_ >=", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeLessThan(Date value) {
+            addCriterion("update_time_ <", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeLessThanOrEqualTo(Date value) {
+            addCriterion("update_time_ <=", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeIn(List<Date> values) {
+            addCriterion("update_time_ in", values, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeNotIn(List<Date> values) {
+            addCriterion("update_time_ not in", values, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeBetween(Date value1, Date value2) {
+            addCriterion("update_time_ between", value1, value2, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeNotBetween(Date value1, Date value2) {
+            addCriterion("update_time_ not between", value1, value2, "updateTime");
+            return (Criteria) this;
+        }
+    }
+
+    public static class Criteria extends GeneratedCriteria {
+
+        protected Criteria() {
+            super();
+        }
+    }
+
+    public static class Criterion {
+        private String condition;
+
+        private Object value;
+
+        private Object secondValue;
+
+        private boolean noValue;
+
+        private boolean singleValue;
+
+        private boolean betweenValue;
+
+        private boolean listValue;
+
+        private String typeHandler;
+
+        public String getCondition() {
+            return condition;
+        }
+
+        public Object getValue() {
+            return value;
+        }
+
+        public Object getSecondValue() {
+            return secondValue;
+        }
+
+        public boolean isNoValue() {
+            return noValue;
+        }
+
+        public boolean isSingleValue() {
+            return singleValue;
+        }
+
+        public boolean isBetweenValue() {
+            return betweenValue;
+        }
+
+        public boolean isListValue() {
+            return listValue;
+        }
+
+        public String getTypeHandler() {
+            return typeHandler;
+        }
+
+        protected Criterion(String condition) {
+            super();
+            this.condition = condition;
+            this.typeHandler = null;
+            this.noValue = true;
+        }
+
+        protected Criterion(String condition, Object value, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.typeHandler = typeHandler;
+            if (value instanceof List<?>) {
+                this.listValue = true;
+            } else {
+                this.singleValue = true;
+            }
+        }
+
+        protected Criterion(String condition, Object value) {
+            this(condition, value, null);
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.secondValue = secondValue;
+            this.typeHandler = typeHandler;
+            this.betweenValue = true;
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue) {
+            this(condition, value, secondValue, null);
+        }
+    }
+}

+ 38 - 4
cooleshow-mall/mall-mbg/src/main/resources/config/mybatis/UserOrderPaymentMapper.xml

@@ -14,13 +14,16 @@
         <result column="status_" jdbcType="VARCHAR" property="status" />
         <result column="pay_fail_msg_" jdbcType="VARCHAR" property="payFailMsg" />
         <result column="arrival_time_" jdbcType="TIMESTAMP" property="arrivalTime" />
+        <result column="close_status_" jdbcType="TIMESTAMP" property="closeStatus" />
+        <result column="close_fail_msg_" jdbcType="TIMESTAMP" property="closeFailMsg" />
+        <result column="close_time_" jdbcType="TIMESTAMP" property="closeTime" />
         <result column="create_time_" jdbcType="TIMESTAMP" property="createTime" />
         <result column="update_time_" jdbcType="TIMESTAMP" property="updateTime" />
     </resultMap>
     <sql id="Base_Column_List">
         <!--@mbg.generated-->
         id_, order_no_, trans_no_, pay_channel_, pay_amt_, fee_amt_, pay_info_, status_,
-        pay_fail_msg_, arrival_time_, create_time_, update_time_
+        pay_fail_msg_, arrival_time_,close_status_,close_fail_msg_,close_time_,create_time_, update_time_
     </sql>
     <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
         <!--@mbg.generated-->
@@ -39,11 +42,12 @@
         insert into user_order_payment (order_no_, trans_no_, pay_channel_,
         pay_amt_, fee_amt_, pay_info_,
         status_, pay_fail_msg_, arrival_time_,
-        create_time_, update_time_)
+        create_time_, update_time_,close_status_,close_fail_msg_,close_time_)
         values (#{orderNo,jdbcType=VARCHAR}, #{transNo,jdbcType=VARCHAR}, #{payChannel,jdbcType=VARCHAR},
         #{payAmt,jdbcType=DECIMAL}, #{feeAmt,jdbcType=DECIMAL}, #{payInfo,jdbcType=VARCHAR},
         #{status,jdbcType=VARCHAR}, #{payFailMsg,jdbcType=VARCHAR}, #{arrivalTime,jdbcType=TIMESTAMP},
-        #{createTime,jdbcType=TIMESTAMP}, #{updateTime,jdbcType=TIMESTAMP})
+        #{createTime,jdbcType=TIMESTAMP}, #{updateTime,jdbcType=TIMESTAMP},#{closeStatus},#{closeFailMsg}
+        ,#{closeTime})
     </insert>
     <insert id="insertSelective" keyColumn="id_" keyProperty="id" parameterType="com.yonge.cooleshow.mbg.model.UserOrderPayment" useGeneratedKeys="true">
         <!--@mbg.generated-->
@@ -82,6 +86,15 @@
             <if test="updateTime != null">
                 update_time_,
             </if>
+            <if test="closeStatus != null">
+                close_status_,
+            </if>
+            <if test="closeFailMsg != null">
+                close_fail_msg_,
+            </if>
+            <if test="closeTime != null">
+                close_time_,
+            </if>
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="orderNo != null">
@@ -117,6 +130,15 @@
             <if test="updateTime != null">
                 #{updateTime,jdbcType=TIMESTAMP},
             </if>
+            <if test="closeStatus != null">
+                #{closeStatus},
+            </if>
+            <if test="closeFailMsg != null">
+                #{closeFailMsg},
+            </if>
+            <if test="closeTime != null">
+                #{closeTime},
+            </if>
         </trim>
     </insert>
     <update id="updateByPrimaryKeySelective" parameterType="com.yonge.cooleshow.mbg.model.UserOrderPayment">
@@ -156,6 +178,15 @@
             <if test="updateTime != null">
                 update_time_ = #{updateTime,jdbcType=TIMESTAMP},
             </if>
+            <if test="closeStatus != null">
+                close_status_ = #{closeStatus},
+            </if>
+            <if test="closeFailMsg != null">
+                close_fail_msg_ = #{closeFailMsg},
+            </if>
+            <if test="closeTime != null">
+                close_time_ = #{closeTime,jdbcType=TIMESTAMP},
+            </if>
         </set>
         where id_ = #{id,jdbcType=BIGINT}
     </update>
@@ -172,7 +203,10 @@
         pay_fail_msg_ = #{payFailMsg,jdbcType=VARCHAR},
         arrival_time_ = #{arrivalTime,jdbcType=TIMESTAMP},
         create_time_ = #{createTime,jdbcType=TIMESTAMP},
-        update_time_ = #{updateTime,jdbcType=TIMESTAMP}
+        update_time_ = #{updateTime,jdbcType=TIMESTAMP},
+        close_status_ = #{closeStatus},
+        close_fail_msg_ = #{closeFailMsg},
+        close_time_ = #{closeTime,jdbcType=TIMESTAMP},
         where id_ = #{id,jdbcType=BIGINT}
     </update>
 

+ 323 - 0
cooleshow-mall/mall-mbg/src/main/resources/config/mybatis/UserOrderRefundMapper.xml

@@ -0,0 +1,323 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.yonge.cooleshow.mbg.mapper.UserOrderRefundMapper">
+  <resultMap id="BaseResultMap" type="com.yonge.cooleshow.mbg.model.UserOrderRefund">
+    <!--@mbg.generated-->
+    <!--@Table user_order_refund-->
+    <id column="id_" jdbcType="BIGINT" property="id" />
+    <result column="order_no_" jdbcType="VARCHAR" property="orderNo" />
+    <result column="trans_no_" jdbcType="VARCHAR" property="transNo" />
+    <result column="pay_trans_no_" jdbcType="VARCHAR" property="payTransNo" />
+    <result column="refund_amt_" jdbcType="DECIMAL" property="refundAmt" />
+    <result column="fee_amt_" jdbcType="DECIMAL" property="feeAmt" />
+    <result column="status_" jdbcType="VARCHAR" property="status" />
+    <result column="pay_fail_msg_" jdbcType="VARCHAR" property="payFailMsg" />
+    <result column="arrival_time_" jdbcType="TIMESTAMP" property="arrivalTime" />
+    <result column="create_time_" jdbcType="TIMESTAMP" property="createTime" />
+    <result column="update_time_" jdbcType="TIMESTAMP" property="updateTime" />
+  </resultMap>
+  <sql id="Example_Where_Clause">
+    <!--@mbg.generated-->
+    <where>
+      <foreach collection="oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Update_By_Example_Where_Clause">
+    <!--@mbg.generated-->
+    <where>
+      <foreach collection="example.oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Base_Column_List">
+    <!--@mbg.generated-->
+    id_, order_no_, trans_no_, pay_trans_no_, refund_amt_, fee_amt_, status_, pay_fail_msg_, 
+    arrival_time_, create_time_, update_time_
+  </sql>
+  <select id="selectByExample" parameterType="com.yonge.cooleshow.mbg.model.UserOrderRefundExample" resultMap="BaseResultMap">
+    <!--@mbg.generated-->
+    select
+    <if test="distinct">
+      distinct
+    </if>
+    <include refid="Base_Column_List" />
+    from user_order_refund
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+    <if test="orderByClause != null">
+      order by ${orderByClause}
+    </if>
+  </select>
+  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
+    <!--@mbg.generated-->
+    select 
+    <include refid="Base_Column_List" />
+    from user_order_refund
+    where id_ = #{id,jdbcType=BIGINT}
+  </select>
+  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
+    <!--@mbg.generated-->
+    delete from user_order_refund
+    where id_ = #{id,jdbcType=BIGINT}
+  </delete>
+  <delete id="deleteByExample" parameterType="com.yonge.cooleshow.mbg.model.UserOrderRefundExample">
+    <!--@mbg.generated-->
+    delete from user_order_refund
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </delete>
+  <insert id="insert" keyColumn="id_" keyProperty="id" parameterType="com.yonge.cooleshow.mbg.model.UserOrderRefund" useGeneratedKeys="true">
+    <!--@mbg.generated-->
+    insert into user_order_refund (order_no_, trans_no_, pay_trans_no_, 
+      refund_amt_, fee_amt_, status_, 
+      pay_fail_msg_, arrival_time_, create_time_, 
+      update_time_)
+    values (#{orderNo,jdbcType=VARCHAR}, #{transNo,jdbcType=VARCHAR}, #{payTransNo,jdbcType=VARCHAR}, 
+      #{refundAmt,jdbcType=DECIMAL}, #{feeAmt,jdbcType=DECIMAL}, #{status,jdbcType=VARCHAR}, 
+      #{payFailMsg,jdbcType=VARCHAR}, #{arrivalTime,jdbcType=TIMESTAMP}, #{createTime,jdbcType=TIMESTAMP}, 
+      #{updateTime,jdbcType=TIMESTAMP})
+  </insert>
+  <insert id="insertSelective" keyColumn="id_" keyProperty="id" parameterType="com.yonge.cooleshow.mbg.model.UserOrderRefund" useGeneratedKeys="true">
+    <!--@mbg.generated-->
+    insert into user_order_refund
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="orderNo != null">
+        order_no_,
+      </if>
+      <if test="transNo != null">
+        trans_no_,
+      </if>
+      <if test="payTransNo != null">
+        pay_trans_no_,
+      </if>
+      <if test="refundAmt != null">
+        refund_amt_,
+      </if>
+      <if test="feeAmt != null">
+        fee_amt_,
+      </if>
+      <if test="status != null">
+        status_,
+      </if>
+      <if test="payFailMsg != null">
+        pay_fail_msg_,
+      </if>
+      <if test="arrivalTime != null">
+        arrival_time_,
+      </if>
+      <if test="createTime != null">
+        create_time_,
+      </if>
+      <if test="updateTime != null">
+        update_time_,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="orderNo != null">
+        #{orderNo,jdbcType=VARCHAR},
+      </if>
+      <if test="transNo != null">
+        #{transNo,jdbcType=VARCHAR},
+      </if>
+      <if test="payTransNo != null">
+        #{payTransNo,jdbcType=VARCHAR},
+      </if>
+      <if test="refundAmt != null">
+        #{refundAmt,jdbcType=DECIMAL},
+      </if>
+      <if test="feeAmt != null">
+        #{feeAmt,jdbcType=DECIMAL},
+      </if>
+      <if test="status != null">
+        #{status,jdbcType=VARCHAR},
+      </if>
+      <if test="payFailMsg != null">
+        #{payFailMsg,jdbcType=VARCHAR},
+      </if>
+      <if test="arrivalTime != null">
+        #{arrivalTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="createTime != null">
+        #{createTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="updateTime != null">
+        #{updateTime,jdbcType=TIMESTAMP},
+      </if>
+    </trim>
+  </insert>
+  <select id="countByExample" parameterType="com.yonge.cooleshow.mbg.model.UserOrderRefundExample" resultType="java.lang.Long">
+    <!--@mbg.generated-->
+    select count(*) from user_order_refund
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </select>
+  <update id="updateByExampleSelective" parameterType="map">
+    <!--@mbg.generated-->
+    update user_order_refund
+    <set>
+      <if test="record.id != null">
+        id_ = #{record.id,jdbcType=BIGINT},
+      </if>
+      <if test="record.orderNo != null">
+        order_no_ = #{record.orderNo,jdbcType=VARCHAR},
+      </if>
+      <if test="record.transNo != null">
+        trans_no_ = #{record.transNo,jdbcType=VARCHAR},
+      </if>
+      <if test="record.payTransNo != null">
+        pay_trans_no_ = #{record.payTransNo,jdbcType=VARCHAR},
+      </if>
+      <if test="record.refundAmt != null">
+        refund_amt_ = #{record.refundAmt,jdbcType=DECIMAL},
+      </if>
+      <if test="record.feeAmt != null">
+        fee_amt_ = #{record.feeAmt,jdbcType=DECIMAL},
+      </if>
+      <if test="record.status != null">
+        status_ = #{record.status,jdbcType=VARCHAR},
+      </if>
+      <if test="record.payFailMsg != null">
+        pay_fail_msg_ = #{record.payFailMsg,jdbcType=VARCHAR},
+      </if>
+      <if test="record.arrivalTime != null">
+        arrival_time_ = #{record.arrivalTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="record.createTime != null">
+        create_time_ = #{record.createTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="record.updateTime != null">
+        update_time_ = #{record.updateTime,jdbcType=TIMESTAMP},
+      </if>
+    </set>
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByExample" parameterType="map">
+    <!--@mbg.generated-->
+    update user_order_refund
+    set id_ = #{record.id,jdbcType=BIGINT},
+      order_no_ = #{record.orderNo,jdbcType=VARCHAR},
+      trans_no_ = #{record.transNo,jdbcType=VARCHAR},
+      pay_trans_no_ = #{record.payTransNo,jdbcType=VARCHAR},
+      refund_amt_ = #{record.refundAmt,jdbcType=DECIMAL},
+      fee_amt_ = #{record.feeAmt,jdbcType=DECIMAL},
+      status_ = #{record.status,jdbcType=VARCHAR},
+      pay_fail_msg_ = #{record.payFailMsg,jdbcType=VARCHAR},
+      arrival_time_ = #{record.arrivalTime,jdbcType=TIMESTAMP},
+      create_time_ = #{record.createTime,jdbcType=TIMESTAMP},
+      update_time_ = #{record.updateTime,jdbcType=TIMESTAMP}
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByPrimaryKeySelective" parameterType="com.yonge.cooleshow.mbg.model.UserOrderRefund">
+    <!--@mbg.generated-->
+    update user_order_refund
+    <set>
+      <if test="orderNo != null">
+        order_no_ = #{orderNo,jdbcType=VARCHAR},
+      </if>
+      <if test="transNo != null">
+        trans_no_ = #{transNo,jdbcType=VARCHAR},
+      </if>
+      <if test="payTransNo != null">
+        pay_trans_no_ = #{payTransNo,jdbcType=VARCHAR},
+      </if>
+      <if test="refundAmt != null">
+        refund_amt_ = #{refundAmt,jdbcType=DECIMAL},
+      </if>
+      <if test="feeAmt != null">
+        fee_amt_ = #{feeAmt,jdbcType=DECIMAL},
+      </if>
+      <if test="status != null">
+        status_ = #{status,jdbcType=VARCHAR},
+      </if>
+      <if test="payFailMsg != null">
+        pay_fail_msg_ = #{payFailMsg,jdbcType=VARCHAR},
+      </if>
+      <if test="arrivalTime != null">
+        arrival_time_ = #{arrivalTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="createTime != null">
+        create_time_ = #{createTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="updateTime != null">
+        update_time_ = #{updateTime,jdbcType=TIMESTAMP},
+      </if>
+    </set>
+    where id_ = #{id,jdbcType=BIGINT}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.yonge.cooleshow.mbg.model.UserOrderRefund">
+    <!--@mbg.generated-->
+    update user_order_refund
+    set order_no_ = #{orderNo,jdbcType=VARCHAR},
+      trans_no_ = #{transNo,jdbcType=VARCHAR},
+      pay_trans_no_ = #{payTransNo,jdbcType=VARCHAR},
+      refund_amt_ = #{refundAmt,jdbcType=DECIMAL},
+      fee_amt_ = #{feeAmt,jdbcType=DECIMAL},
+      status_ = #{status,jdbcType=VARCHAR},
+      pay_fail_msg_ = #{payFailMsg,jdbcType=VARCHAR},
+      arrival_time_ = #{arrivalTime,jdbcType=TIMESTAMP},
+      create_time_ = #{createTime,jdbcType=TIMESTAMP},
+      update_time_ = #{updateTime,jdbcType=TIMESTAMP}
+    where id_ = #{id,jdbcType=BIGINT}
+  </update>
+
+  <select id="selectByTransNo" resultMap="BaseResultMap">
+    select
+    <include refid="Base_Column_List" />
+    from user_order_refund
+    where #{transNo} = trans_no_ limit 1
+  </select>
+</mapper>

+ 13 - 0
cooleshow-mall/mall-pay/pom.xml

@@ -25,6 +25,19 @@
             <groupId>com.yonge.cooleshow</groupId>
             <artifactId>mall-common</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.redisson</groupId>
+            <artifactId>redisson</artifactId>
+            <version>3.16.4</version>
+            <scope>compile</scope>
+        </dependency>
+
+        <!-- redisson -->
+        <dependency>
+            <groupId>org.redisson</groupId>
+            <artifactId>redisson-spring-boot-starter</artifactId>
+            <version>3.16.4</version>
+        </dependency>
     </dependencies>
 
 </project>

+ 4 - 1
cooleshow-mall/mall-pay/src/main/java/com/yonge/cooleshow/enums/OrdeerCacherEnmu.java

@@ -14,7 +14,10 @@ import java.time.Duration;
 public enum OrdeerCacherEnmu {
     LOCK_EXECUTE_ORDER("用户下单锁"),
     LOCK_PAY_ORDER("用户付款锁"),
-    LOCK_CHANGE_ACCOUNT("账户变更锁");
+    LOCK_CHANGE_ACCOUNT("账户变更锁"),
+    LOCK_REFUND_ORDER_MALL("商城退款锁"),
+
+    ;
 
     ;
     /***

+ 37 - 48
cooleshow-mall/mall-pay/src/main/java/com/yonge/cooleshow/sdk/PaymentSdk.java → cooleshow-mall/mall-pay/src/main/java/com/yonge/cooleshow/sdk/adapay/PaymentSdk.java

@@ -1,14 +1,16 @@
-package com.yonge.cooleshow.sdk;
+package com.yonge.cooleshow.sdk.adapay;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.huifu.adapay.core.exception.BaseAdaPayException;
 import com.huifu.adapay.model.Payment;
 import com.huifu.adapay.model.PaymentConfirm;
+import com.huifu.adapay.model.Refund;
 import com.yonge.cooleshow.common.constant.CommonConstants;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.config.HuifuConfiguration;
-import com.yonge.cooleshow.sdk.req.PaymentReq;
+import com.yonge.cooleshow.sdk.adapay.dto.PaymentReq;
+import com.yonge.cooleshow.sdk.adapay.dto.RefundReq;
 import com.yonge.toolset.thirdparty.exception.ThirdpartyException;
 import com.yonge.toolset.utils.collection.MapUtil;
 import com.yonge.toolset.utils.http.HttpUtil;
@@ -168,54 +170,41 @@ public class PaymentSdk {
         }
     }
 
-/*
-    public static Map<String, Object> queryList(Integer pageIndex, Long createdGte, Long createdLte) throws Exception {
-        Map<String, Object> paymentParams = new HashMap<>();
-        paymentParams.put("app_id", ConfigInit.appId);
-        paymentParams.put("page_index", pageIndex);
-        paymentParams.put("page_size", "20");
-        paymentParams.put("created_gte", createdGte);
-        paymentParams.put("created_lte", createdLte);
-        Map<String, Object> payment = com.huifu.adapay.model.Payment.queryList(paymentParams);
-        String error_code = (String) payment.get("error_code");
-        if (null != error_code) {
-            String errorMsg = (String) payment.get("error_msg");
-            throw new ThirdpartyException(errorMsg);
-        }
-        return payment;
-    }
 
-    public static Map<String, Object> queryConfirmList(String paymentId) throws Exception {
-        Map<String, Object> paymentParams = new HashMap<>();
-        paymentParams.put("app_id", ConfigInit.appId);
-        paymentParams.put("payment_id", paymentId);
+    /**
+     * 退款
+     *
+     * @return 关闭的支付对象
+     */
+    public HttpResponseResult<Map<String, Object>> refundPayment(RefundReq refundReq) {
 
-        Map<String, Object> payment = com.huifu.adapay.model.Payment.queryConfirmList(paymentParams);
-        String error_code = (String) payment.get("error_code");
-        if (null != error_code) {
-            String errorMsg = (String) payment.get("error_msg");
-            throw new ThirdpartyException(errorMsg);
+        refundReq.setFail_fast("Y");
+        //创建分账对象
+        Map<String, String> div_member = new HashMap<>();
+        div_member.put("member_id", "0");
+        div_member.put("amount", refundReq.getRefund_amt());
+        div_member.put("fee_flag", "Y");
+        List<Map<String, String>> div_members = Arrays.asList(div_member);
+        refundReq.setDiv_members(JSONObject.toJSONString(div_members));
+
+        log.info("汇付[退款对象] Req:{}", JSONObject.toJSONString(refundReq));
+        //调用sdk方法,创建退款,得到退款对象
+        Map<String, Object> paymentParams = MapUtil.populateMap(new HashMap<>(), refundReq);
+        Map<String, Object> res;
+        try {
+            res = Refund.create(refundReq.getId(),paymentParams);
+        } catch (BaseAdaPayException e) {
+            return HttpResponseResult.failed(e.getMessage());
         }
-        return payment;
+        if (null == res) {
+            return HttpResponseResult.failed("请求失败");
+        }
+        log.info("汇付[创建退款对象] Resp:{}", res);
+        String errorCode = (String) res.get("error_code");
+        if (null != errorCode) {
+            String errorMsg = (String) res.get("error_msg");
+            return HttpResponseResult.failed(errorMsg);
+        }
+        return HttpResponseResult.succeed(res);
     }
-
-
-    public static Map<String, Object> getPayMap(BigDecimal amount, String orderNo, String notifyUrl, String returnUrl, String orderSubject, String orderBody) throws Exception {
-        Map<String, Object> paymentParams = new LinkedHashMap<>();
-        paymentParams.put("appId", ConfigInit.appId);
-        paymentParams.put("amount", amount.setScale(2, BigDecimal.ROUND_HALF_UP));
-        paymentParams.put("orderNo", orderNo);
-//        paymentParams.put("notifyUrl", notifyUrl);
-//        paymentParams.put("returnUrl", returnUrl);
-        paymentParams.put("orderSubject", orderSubject);
-        paymentParams.put("orderBody", orderBody);
-        paymentParams.put("wxAppId", ConfigInit.wxAppId);
-
-        String originalStr = JSONObject.toJSONString(paymentParams);
-        String sign = DigestUtils.md5DigestAsHex(originalStr.getBytes());
-
-        paymentParams.put("sign", sign);
-        paymentParams.remove("appId");
-        return paymentParams;
-    }*/
 }

+ 3 - 1
cooleshow-mall/mall-pay/src/main/java/com/yonge/cooleshow/sdk/req/PaymentReq.java → cooleshow-mall/mall-pay/src/main/java/com/yonge/cooleshow/sdk/adapay/dto/PaymentReq.java

@@ -1,4 +1,6 @@
-package com.yonge.cooleshow.sdk.req;
+package com.yonge.cooleshow.sdk.adapay.dto;
+
+import com.yonge.cooleshow.sdk.req.DeviceInfo;
 
 import java.io.Serializable;
 import java.util.Map;

+ 139 - 0
cooleshow-mall/mall-pay/src/main/java/com/yonge/cooleshow/sdk/adapay/dto/RefundReq.java

@@ -0,0 +1,139 @@
+package com.yonge.cooleshow.sdk.adapay.dto;
+
+import com.yonge.cooleshow.sdk.req.DeviceInfo;
+
+import java.io.Serializable;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-04-27
+ */
+public class RefundReq implements Serializable {
+
+    /**
+     * 当支付确认成功后进行退款,请传入支付确认对象的id;当实时分账成功后进行退款,请传入支付对象的id。
+     *
+     * Y
+     */
+    private String id;
+
+    /**
+     * 请求订单号,只能为英文、数字或者下划线的一种或多种组合
+     *
+     * Y
+     */
+    private String refund_order_no;
+
+    /**
+     * 退款金额,若退款金额小于原交易金额,则认为是部分退款,必须大于0,保留两位小数点,如0.10、100.05等
+     *
+     * Y
+     */
+    private String refund_amt;
+
+    /**
+     * 退款描述
+     */
+    private String reason;
+
+    /**
+     * 扩展域
+     */
+    private String expend;
+
+    /**
+     * 前端设备信息
+     */
+    private DeviceInfo device_info;
+
+    /**
+     * 分账对象信息列表
+     */
+    private String div_members;
+
+    /**
+     * 异步通知地址,url为http/https路径,服务器POST回调,URL 上请勿附带参数
+     */
+    private String notify_url;
+
+    /**
+     * 快速失败标识:N 或者为空时-退款失败及时返回错误,仅支持实时分账场景;
+     * 为Y时,退款失败会走 Adapay 人工审核流程,核对后再次出款或回账,最晚 T+3 返回终态结果
+     */
+    private String fail_fast;
+
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getRefund_order_no() {
+        return refund_order_no;
+    }
+
+    public void setRefund_order_no(String refund_order_no) {
+        this.refund_order_no = refund_order_no;
+    }
+
+    public String getRefund_amt() {
+        return refund_amt;
+    }
+
+    public void setRefund_amt(String refund_amt) {
+        this.refund_amt = refund_amt;
+    }
+
+    public String getReason() {
+        return reason;
+    }
+
+    public void setReason(String reason) {
+        this.reason = reason;
+    }
+
+    public String getExpend() {
+        return expend;
+    }
+
+    public void setExpend(String expend) {
+        this.expend = expend;
+    }
+
+    public DeviceInfo getDevice_info() {
+        return device_info;
+    }
+
+    public void setDevice_info(DeviceInfo device_info) {
+        this.device_info = device_info;
+    }
+
+    public String getDiv_members() {
+        return div_members;
+    }
+
+    public void setDiv_members(String div_members) {
+        this.div_members = div_members;
+    }
+
+    public String getNotify_url() {
+        return notify_url;
+    }
+
+    public void setNotify_url(String notify_url) {
+        this.notify_url = notify_url;
+    }
+
+    public String getFail_fast() {
+        return fail_fast;
+    }
+
+    public void setFail_fast(String fail_fast) {
+        this.fail_fast = fail_fast;
+    }
+}

+ 4 - 4
cooleshow-mall/mall-pay/src/main/java/com/yonge/cooleshow/sdk/req/OrderPayReq.java

@@ -47,7 +47,7 @@ public class OrderPayReq {
 
     public void orderStatus(Integer orderStatus) {
         if (orderStatus == 0) {
-            this.orderStatus = OrderStatusEnum.WAIT_PAY;
+            this.orderStatus = OrderStatusEnum.PAYING;
         } else if (orderStatus == 1) {
             this.orderStatus = OrderStatusEnum.PAID;
         }else if (orderStatus == 2) {
@@ -59,9 +59,9 @@ public class OrderPayReq {
         }else if (orderStatus == 5) {
             this.orderStatus = OrderStatusEnum.CLOSE;
         }else if (orderStatus == 6) {
-            this.orderStatus = OrderStatusEnum.PAYING;
-        }else if (orderStatus == 7) {
-            this.orderStatus = OrderStatusEnum.FAIL;
+            this.orderStatus = OrderStatusEnum.WAIT_PAY;
+        } else {
+            this.orderStatus = OrderStatusEnum.CLOSE;
         }
     }
 

+ 68 - 0
cooleshow-mall/mall-pay/src/main/java/com/yonge/cooleshow/sdk/req/OrderRefundReq.java

@@ -0,0 +1,68 @@
+package com.yonge.cooleshow.sdk.req;
+
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * Description 退款请求参数
+ *
+ * @author liujunchi
+ * @date 2022-04-27
+ */
+public class OrderRefundReq {
+
+    @ApiModelProperty("支付流水号")
+    private String transNo;
+
+
+    @ApiModelProperty("订单号")
+    private String orderNo;
+
+    @ApiModelProperty("退款金额")
+    private String refundAmount;
+
+    @ApiModelProperty("退款描述")
+    private String reason;
+
+    @ApiModelProperty(value = "用户端公网ip ")
+    private String ipAddress;
+
+    public String getTransNo() {
+        return transNo;
+    }
+
+    public void setTransNo(String transNo) {
+        this.transNo = transNo;
+    }
+
+    public String getOrderNo() {
+        return orderNo;
+    }
+
+    public void setOrderNo(String orderNo) {
+        this.orderNo = orderNo;
+    }
+
+    public String getRefundAmount() {
+        return refundAmount;
+    }
+
+    public void setRefundAmount(String refundAmount) {
+        this.refundAmount = refundAmount;
+    }
+
+    public String getReason() {
+        return reason;
+    }
+
+    public void setReason(String reason) {
+        this.reason = reason;
+    }
+
+    public String getIpAddress() {
+        return ipAddress;
+    }
+
+    public void setIpAddress(String ipAddress) {
+        this.ipAddress = ipAddress;
+    }
+}

+ 37 - 37
cooleshow-mall/mall-pay/src/main/java/com/yonge/cooleshow/sdk/res/OrderPayRes.java

@@ -1,6 +1,6 @@
 package com.yonge.cooleshow.sdk.res;
 
-import com.yonge.cooleshow.enums.OrderStatusEnum;
+import com.yonge.cooleshow.enums.PayStatusEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -18,12 +18,13 @@ public class OrderPayRes {
     @ApiModelProperty("执行状态")
     private boolean status = true;
 
-    @ApiModelProperty("订单状态")
-    private OrderStatusEnum orderStatus;
-
     @ApiModelProperty("出错信息")
     private String message;
 
+    @ApiModelProperty("支付状态")
+    private PayStatusEnum payStatus;
+
+
     @ApiModelProperty("订单编号")
     private String orderNo;
 
@@ -33,37 +34,20 @@ public class OrderPayRes {
     @ApiModelProperty("交易流水号")
     private String transNo;
 
-
-    public String getTransNo() {
-        return transNo;
-    }
-
-    public void setTransNo(String transNo) {
-        this.transNo = transNo;
-    }
-
-    public String getOrderNo() {
-        return orderNo;
-    }
-
-    public void setOrderNo(String orderNo) {
-        this.orderNo = orderNo;
-    }
-
-    public String getPayChannel() {
-        return payChannel;
+    public String getPay_amt() {
+        return pay_amt;
     }
 
-    public void setPayChannel(String payChannel) {
-        this.payChannel = payChannel;
+    public void setPay_amt(String pay_amt) {
+        this.pay_amt = pay_amt;
     }
 
-    public OrderStatusEnum getOrderStatus() {
-        return orderStatus;
+    public String getPay_info() {
+        return pay_info;
     }
 
-    public void setOrderStatus(OrderStatusEnum orderStatus) {
-        this.orderStatus = orderStatus;
+    public void setPay_info(String pay_info) {
+        this.pay_info = pay_info;
     }
 
     public boolean isStatus() {
@@ -82,19 +66,35 @@ public class OrderPayRes {
         this.message = message;
     }
 
-    public String getPay_amt() {
-        return pay_amt;
+    public PayStatusEnum getPayStatus() {
+        return payStatus;
     }
 
-    public void setPay_amt(String pay_amt) {
-        this.pay_amt = pay_amt;
+    public void setPayStatus(PayStatusEnum payStatus) {
+        this.payStatus = payStatus;
     }
 
-    public String getPay_info() {
-        return pay_info;
+    public String getOrderNo() {
+        return orderNo;
     }
 
-    public void setPay_info(String pay_info) {
-        this.pay_info = pay_info;
+    public void setOrderNo(String orderNo) {
+        this.orderNo = orderNo;
+    }
+
+    public String getPayChannel() {
+        return payChannel;
+    }
+
+    public void setPayChannel(String payChannel) {
+        this.payChannel = payChannel;
+    }
+
+    public String getTransNo() {
+        return transNo;
+    }
+
+    public void setTransNo(String transNo) {
+        this.transNo = transNo;
     }
 }

+ 92 - 0
cooleshow-mall/mall-pay/src/main/java/com/yonge/cooleshow/sdk/res/OrderRefundRes.java

@@ -0,0 +1,92 @@
+package com.yonge.cooleshow.sdk.res;
+
+import com.yonge.cooleshow.enums.PayStatusEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-04-27
+ */
+@ApiModel("退款返回数据")
+public class OrderRefundRes {
+
+    @ApiModelProperty("退款流水号")
+    private String transNo;
+
+    @ApiModelProperty("支付流水号")
+    private String payTransNo;
+
+    @ApiModelProperty("订单号")
+    private String refundOrderNo;
+
+    @ApiModelProperty("退款金额")
+    private String refundAmount;
+
+    @ApiModelProperty("退款状态")
+    private PayStatusEnum refundStatus;
+
+    @ApiModelProperty("执行状态")
+    private boolean status = true;
+
+    @ApiModelProperty("出错信息")
+    private String message;
+
+    public String getRefundOrderNo() {
+        return refundOrderNo;
+    }
+
+    public void setRefundOrderNo(String refundOrderNo) {
+        this.refundOrderNo = refundOrderNo;
+    }
+
+    public boolean isStatus() {
+        return status;
+    }
+
+    public void setStatus(boolean status) {
+        this.status = status;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    public String getTransNo() {
+        return transNo;
+    }
+
+    public void setTransNo(String transNo) {
+        this.transNo = transNo;
+    }
+
+    public String getPayTransNo() {
+        return payTransNo;
+    }
+
+    public void setPayTransNo(String payTransNo) {
+        this.payTransNo = payTransNo;
+    }
+
+    public String getRefundAmount() {
+        return refundAmount;
+    }
+
+    public void setRefundAmount(String refundAmount) {
+        this.refundAmount = refundAmount;
+    }
+
+    public PayStatusEnum getRefundStatus() {
+        return refundStatus;
+    }
+
+    public void setRefundStatus(PayStatusEnum status) {
+        this.refundStatus = status;
+    }
+}

+ 4 - 1
cooleshow-mall/mall-pay/src/main/java/com/yonge/cooleshow/service/PaymentService.java

@@ -1,8 +1,9 @@
 package com.yonge.cooleshow.service;
 
-import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.sdk.req.OrderPayReq;
+import com.yonge.cooleshow.sdk.req.OrderRefundReq;
 import com.yonge.cooleshow.sdk.res.OrderPayRes;
+import com.yonge.cooleshow.sdk.res.OrderRefundRes;
 
 /**
  * Description 支付服务
@@ -24,4 +25,6 @@ public interface PaymentService {
 
 
     OrderPayRes orderPayPaying(OrderPayReq payReq);
+
+    OrderRefundRes orderRefund(OrderRefundReq refundReq);
 }

+ 41 - 5
cooleshow-mall/mall-pay/src/main/java/com/yonge/cooleshow/service/impl/AdapayPaymentServiceImpl.java

@@ -6,10 +6,13 @@ import com.yonge.cooleshow.config.HuifuConfiguration;
 import com.yonge.cooleshow.enums.OrderStatusEnum;
 import com.yonge.cooleshow.enums.PayChannelEnum;
 import com.yonge.cooleshow.enums.PayStatusEnum;
-import com.yonge.cooleshow.sdk.PaymentSdk;
+import com.yonge.cooleshow.sdk.adapay.PaymentSdk;
+import com.yonge.cooleshow.sdk.adapay.dto.RefundReq;
 import com.yonge.cooleshow.sdk.req.DeviceInfo;
 import com.yonge.cooleshow.sdk.req.OrderPayReq;
-import com.yonge.cooleshow.sdk.req.PaymentReq;
+import com.yonge.cooleshow.sdk.adapay.dto.PaymentReq;
+import com.yonge.cooleshow.sdk.req.OrderRefundReq;
+import com.yonge.cooleshow.sdk.res.OrderRefundRes;
 import com.yonge.cooleshow.sdk.res.OrderPayRes;
 import com.yonge.cooleshow.service.PaymentService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -82,12 +85,11 @@ public class AdapayPaymentServiceImpl implements PaymentService {
             );
             String pay_info = ((JSONObject) res.get("expend")).getString("pay_info");
             orderPayRes.setPay_info(pay_info);
-            orderPayRes.setOrderStatus(OrderStatusEnum.PAYING);
-            orderPayRes.setPay_amt(payReq.getOrderPrice().setScale(2, RoundingMode.HALF_UP).toString());
+            orderPayRes.setPayStatus(PayStatusEnum.pending);
             return orderPayRes;
         } else {
             //入订单付款表,同时修改订单状态
-            orderPayRes.setOrderStatus(OrderStatusEnum.FAIL);
+            orderPayRes.setPayStatus(PayStatusEnum.failed);
             orderPayRes.setStatus(false);
             orderPayRes.setMessage(responseResult.getMsg());
             return orderPayRes;
@@ -106,4 +108,38 @@ public class AdapayPaymentServiceImpl implements PaymentService {
         }
         return orderPayRes;
     }
+
+    @Override
+    public OrderRefundRes orderRefund(OrderRefundReq orderRefundReq) {
+        RefundReq refundReq = new RefundReq();
+        refundReq.setRefund_order_no(orderRefundReq.getTransNo());
+        refundReq.setRefund_amt(orderRefundReq.getRefundAmount());
+        refundReq.setId(orderRefundReq.getTransNo());
+        refundReq.setReason(orderRefundReq.getReason());
+        DeviceInfo deviceInfo = new DeviceInfo();
+        deviceInfo.setDevice_ip(orderRefundReq.getIpAddress());
+
+        refundReq.setDevice_info(deviceInfo);
+
+        //异步通知地址
+        refundReq.setNotify_url(HuifuConfiguration.getHuifuProperties().getNotifyUrl());
+        //付款请求
+        HttpResponseResult<Map<String, Object>> responseResult = paymentSdk.refundPayment(refundReq);
+
+        OrderRefundRes  orderRefundRes = new OrderRefundRes();
+        if (responseResult.getStatus()) {
+            Map<String, Object> data = responseResult.getData();
+            orderRefundRes.setTransNo(data.get("id").toString());
+            orderRefundRes.setPayTransNo(data.get("payment_id").toString());
+            orderRefundRes.setRefundOrderNo(data.get("refund_order_no").toString());
+            orderRefundRes.setRefundAmount(new BigDecimal(data.get("refund_amt").toString())
+                                                   .setScale(2,RoundingMode.HALF_UP).toString());
+            orderRefundRes.setRefundStatus(PayStatusEnum.pending);
+
+        } else {
+            orderRefundRes.setStatus(false);
+            orderRefundRes.setMessage(responseResult.getMsg());
+        }
+        return orderRefundRes;
+    }
 }

+ 1 - 1
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/util/DistributedLock.java → cooleshow-mall/mall-pay/src/main/java/com/yonge/cooleshow/util/DistributedLock.java

@@ -1,4 +1,4 @@
-package com.yonge.cooleshow.portal.util;
+package com.yonge.cooleshow.util;
 
 import org.redisson.api.RLock;
 import org.redisson.api.RedissonClient;

+ 0 - 13
cooleshow-mall/mall-portal/pom.xml

@@ -69,19 +69,6 @@
             <version>20.0</version>
             <scope>compile</scope>
         </dependency>
-        <dependency>
-            <groupId>org.redisson</groupId>
-            <artifactId>redisson</artifactId>
-            <version>3.16.4</version>
-            <scope>compile</scope>
-        </dependency>
-
-        <!-- redisson -->
-        <dependency>
-            <groupId>org.redisson</groupId>
-            <artifactId>redisson-spring-boot-starter</artifactId>
-            <version>3.16.4</version>
-        </dependency>
 
     </dependencies>
 

+ 6 - 3
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/PaymentController.java

@@ -9,8 +9,8 @@ import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.enums.OrdeerCacherEnmu;
 import com.yonge.cooleshow.portal.service.OmsPortalOrderService;
-import com.yonge.cooleshow.portal.util.DistributedLock;
-import com.yonge.cooleshow.sdk.PaymentSdk;
+import com.yonge.cooleshow.util.DistributedLock;
+import com.yonge.cooleshow.sdk.adapay.PaymentSdk;
 import com.yonge.cooleshow.sdk.req.OrderPayReq;
 import com.yonge.cooleshow.sdk.res.OrderPayRes;
 import com.yonge.toolset.utils.web.WebUtil;
@@ -93,7 +93,10 @@ public class PaymentController extends BaseController {
             if (checkSign) {
                 //验签成功逻辑
                 log.info("验签成功");
-                portalOrderService.orderCallback(data);
+                String type = request.getParameter("type");
+                if (type.contains("payment")) {
+                    portalOrderService.orderCallback(data);
+                }
             }
         } catch (Exception e) {
             e.printStackTrace();

+ 26 - 37
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsPortalOrderServiceImpl.java

@@ -18,14 +18,13 @@ 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.PaymentSdk;
+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 org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
@@ -34,7 +33,6 @@ import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.text.SimpleDateFormat;
 import java.util.*;
-import java.util.function.Consumer;
 import java.util.stream.Collectors;
 
 /**
@@ -209,8 +207,8 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         order.setPayType(orderParam.getPayType());
         //订单来源:0->PC订单;1->app订单
         order.setSourceType(1);
-        //订单状态:0->待付款;1->待发货;2->已发货;3->已完成;4->已关闭;5->无效订单
-        order.setStatus(0);
+        //订单状态:0->待付款;1->待发货;2->已发货;3->已完成;4->已关闭;5->无效订单 6 -> 未支付
+        order.setStatus(6);
         //订单类型:0->正常订单;1->秒杀订单
         order.setOrderType(0);
         //收货人信息:姓名、电话、邮编、地址
@@ -288,29 +286,12 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         if (CollectionUtils.isEmpty(timeOutOrders)) {
             return count;
         }
-        //修改订单状态为交易取消
-        List<Long> ids = new ArrayList<>();
-        for (OmsOrderDetail timeOutOrder : timeOutOrders) {
-            ids.add(timeOutOrder.getId());
-        }
-        portalOrderDao.updateOrderStatus(ids, 4);
         for (OmsOrderDetail timeOutOrder : timeOutOrders) {
-            //解除订单商品库存锁定
-            portalOrderDao.releaseSkuStockLock(timeOutOrder.getOrderItemList());
-            //修改优惠券使用状态
-            updateCouponStatus(timeOutOrder.getCouponId(), timeOutOrder.getMemberId(), 0);
-            //返还使用积分
-            if (timeOutOrder.getUseIntegration() != null) {
-                UmsMember member = memberService.getById(timeOutOrder.getMemberId());
-                memberService.updateIntegration(timeOutOrder.getMemberId(), member.getIntegration() + timeOutOrder.getUseIntegration());
-            }
 
-            UserOrderPayment orderPayment = userOrderPaymentService.getByOrderNo(timeOutOrder.getOrderSn());
-            if (null != orderPayment) {
-                //更新付款单
-                orderPayment.setStatus(OrderStatusEnum.FAIL.getCode());
-                orderPayment.setPayFailMsg("交易取消");
-                userOrderPaymentService.saveOrUpdate(orderPayment);
+            if (timeOutOrder.getStatus() == 0) {
+                payingOrderHandle(timeOutOrder);
+            } else if (timeOutOrder.getStatus() == 6) {
+                cancelOrder(timeOutOrder.getId());
             }
         }
         return timeOutOrders.size();
@@ -347,7 +328,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
             UserOrderPayment orderPayment = userOrderPaymentService.getByOrderNo(cancelOrder.getOrderSn());
             if (null != orderPayment) {
                 //更新付款单
-                orderPayment.setStatus(OrderStatusEnum.FAIL.getCode());
+                orderPayment.setStatus(PayStatusEnum.failed.getCode());
                 orderPayment.setPayFailMsg("交易取消");
                 userOrderPaymentService.saveOrUpdate(orderPayment);
             }
@@ -489,15 +470,25 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         }
         // 支付中的返回拉起信息
         orderPayRes = adapayPaymentService.orderPay(payReq);
-        // 订单状态没变直接返回
-        if (payReq.getOrderStatus().getCode().equals(orderPayRes.getOrderStatus().getCode())) {
+        if (!orderPayRes.isStatus()) {
+            if (orderPayRes.getPayStatus() != null
+            && PayStatusEnum.failed.getCode().equals(orderPayRes.getPayStatus().getCode())) {
+                // 异常将取消订单
+                cancelOrder(detail.getId());
+            }
+            throw new BizException(orderPayRes.getMessage());
+        }
+        // 订单状态和付款状态都是付款中,直接返回付款拉起信息
+        if (OrderStatusEnum.PAYING.getCode().equals(payReq.getOrderStatus().getCode())
+                && PayStatusEnum.pending.getCode().equals(orderPayRes.getPayStatus().getCode())) {
             return orderPayRes;
         }
-        // 订单状态变了, 改支付状态 和订单支付表
+
+
         OmsOrder omsOrder = new OmsOrder();
         omsOrder.setId(detail.getId());
-        if (orderPayRes.getOrderStatus().getCode().equals(OrderStatusEnum.PAYING.getCode())) {
-            omsOrder.setStatus(6);
+        if (orderPayRes.getPayStatus().getCode().equals(OrderStatusEnum.PAYING.getCode())) {
+            omsOrder.setStatus(1);
             orderMapper.updateByPrimaryKeySelective(omsOrder);
             // 保存订单支付表
             if (userOrderPayment == null) {
@@ -508,7 +499,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
             userOrderPayment.setTransNo(orderPayRes.getTransNo());
             userOrderPayment.setPayAmt(new BigDecimal(orderPayRes.getPay_amt()));
             userOrderPayment.setPayInfo(orderPayRes.getPay_info());
-            userOrderPayment.setStatus(orderPayRes.getOrderStatus().getCode());
+            userOrderPayment.setStatus(PayStatusEnum.pending.getCode());
             userOrderPayment.setPayFailMsg(orderPayRes.getMessage());
             userOrderPayment.setCreateTime(new Date());
             userOrderPayment.setUpdateTime(new Date());
@@ -531,9 +522,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
                 log.error("汇付支付回调,订单未找到。 req is {}", data);
                 return;
             }
-            if (orderDetail.getStatus() == 0
-                    && orderDetail.getStatus() == 6
-                    && orderDetail.getStatus() == 7) {
+            if (orderDetail.getStatus() == 0) {
                 orderSuccess(orderDetail, hfRes);
             } else {
                 log.error("汇付支付回调,订单状态异常。 req is {}", data);
@@ -585,7 +574,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         } else if (orderPayment.getPayChannel().equals("wx_lite")) {
             paySuccess(detail.getId(),2);
         }
-        orderPayment.setStatus(OrderStatusEnum.PAID.getCode());
+        orderPayment.setStatus(PayStatusEnum.succeeded.getCode());
         orderPayment.setArrivalTime(new Date());
         if (null != hfRes) {
             try {

+ 2 - 2
cooleshow-mall/mall-portal/src/main/resources/config/mybatis/PortalOrderDao.xml

@@ -44,8 +44,8 @@
             LEFT JOIN oms_order_item ot ON o.id = ot.order_id
         left join user_order_payment uop on uop.order_no_ = o.order_sn
         WHERE
-            (o.status = 0 AND o.create_time &lt; date_add(NOW(), INTERVAL -#{orderMinute} MINUTE))
-            or (o.status = 6 and uop.create_time_ &lt; date_add(NOW(), INTERVAL -#{payMinute} MINUTE));
+            (o.status = 6 AND o.create_time &lt; date_add(NOW(), INTERVAL -#{orderMinute} MINUTE))
+            or (o.status = 0 and uop.create_time_ &lt; date_add(NOW(), INTERVAL -#{payMinute} MINUTE));
     </select>
 
     <update id="updateSkuStock">

+ 0 - 1
cooleshow-task/src/main/java/com/yonge/cooleshow/task/jobs/CancelTimeOutOrderTask.java

@@ -3,7 +3,6 @@ package com.yonge.cooleshow.task.jobs;
 import com.yonge.cooleshow.task.core.BaseTask;
 import com.yonge.cooleshow.task.core.TaskException;
 import com.yonge.cooleshow.task.feign.MallPortalFeignService;
-import com.yonge.cooleshow.task.feign.StudentFeignService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 

+ 46 - 24
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/UploadFileController.java

@@ -1,13 +1,16 @@
 package com.yonge.cooleshow.admin.controller;
 
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiParam;
+import com.ksyun.ks3.dto.PostObjectFormFields;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.toolset.thirdparty.entity.UploadSign;
+import io.swagger.annotations.*;
 
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;
@@ -17,32 +20,51 @@ import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.UploadReturnBean;
 import com.yonge.toolset.utils.upload.UploadUtil;
 
-/** 
+/**
  * 上传控制层
  */
 @RestController
 @Api(tags = "文件上传服务")
 public class UploadFileController extends BaseController {
 
-	private final static Logger LOGGER = LoggerFactory.getLogger(UploadFileController.class);
-
-	@Autowired
-	private UploadFileService uploadFileService;
-
-	@PostMapping(value = "uploadFile")
-	public Object uploadFile(@ApiParam(value = "上传的文件", required = true) @RequestParam("file") MultipartFile file) {
-		try {
-			if (file != null && StringUtils.isNotBlank(file.getOriginalFilename())) {
-				UploadReturnBean bean = uploadFileService.uploadFile(file.getInputStream(), UploadUtil.getExtension(file.getOriginalFilename()));
-				bean.setName(file.getOriginalFilename());
-				if (bean.isStatus()) {
-					return succeed(bean);
-				}
-				return failed(bean.getMessage());
-			}
-		} catch (Exception e) {
-			LOGGER.error("上传失败", e);
-		}
-		return failed("上传失败");
-	}
+    private final static Logger LOGGER = LoggerFactory.getLogger(UploadFileController.class);
+
+    @Autowired
+    private UploadFileService uploadFileService;
+
+    @PostMapping(value = "uploadFile")
+    public Object uploadFile(@ApiParam(value = "上传的文件", required = true) @RequestParam("file") MultipartFile file) {
+        try {
+            if (file != null && StringUtils.isNotBlank(file.getOriginalFilename())) {
+                UploadReturnBean bean = uploadFileService.uploadFile(file.getInputStream(), UploadUtil.getExtension(file.getOriginalFilename()));
+                bean.setName(file.getOriginalFilename());
+                if (bean.isStatus()) {
+                    return succeed(bean);
+                }
+                return failed(bean.getMessage());
+            }
+        } catch (Exception e) {
+            LOGGER.error("上传失败", e);
+        }
+        return failed("上传失败");
+    }
+
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "fileName", dataType = "String", value = "要上传的文件名称,不包含路径信息"),
+            @ApiImplicitParam(name = "postData", dataType = "Map", value = "1.如果使用js sdk上传的时候设置了ACL请设置,例\"acl\":\"public-read\"值要与SDK中一致,没有则删除该项</br>" +
+                    "2.提供js sdk中的key值,例\"key\":\"20150115/中文/${filename}\""),
+            @ApiImplicitParam(name = "unknowValueField", dataType = "List", value = "对于用户无法确定表单值的放在unknownValueField中(比如有的上传控件会添加一些表单项,但表单项的值可能是随机的)"),
+    })
+    @ApiOperation(value="获取上传文件签名",notes = "{\n" +
+            "    \"fileName\":\"aa\",\n" +
+            "    \"postData\":{\n" +
+            "        \"acl\":\"public-read\",\n" +
+            "        \"key\":\"20150115/中文/${filename}\"\n" +
+            "    },\n" +
+            "    \"unknowValueField\":[\"test\"]\n" +
+            "}")
+    @PostMapping("/getUploadSign")
+    public HttpResponseResult<PostObjectFormFields> getUploadSign(@RequestBody UploadSign uploadSign) {
+        return succeed(uploadFileService.getUploadSign(uploadSign));
+    }
 }

+ 3 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/TeacherFreeTimeDao.java

@@ -55,5 +55,8 @@ public interface TeacherFreeTimeDao extends BaseMapper<TeacherFreeTime> {
 
     //查询老师声部默认售价
     TeacherSubjectPrice selectSubjectPrice(@Param("teacherId") Long teacherId, @Param("subjectId") Long subjectId);
+
+    //查询老师所有声部配置
+    List<TeacherSubjectPrice> selectPriceByTeacherId(Long teacherId);
 }
 

+ 8 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserOrderDao.java

@@ -34,6 +34,14 @@ public interface UserOrderDao extends BaseMapper<UserOrder>{
 	 * @return: com.yonge.cooleshow.biz.dal.vo.UserOrderVo
 	 */
 	UserOrderVo detailApp(@Param("param") UserOrder param);
+	/***
+	 * 通过业务id查询用户正在交易中的订单
+	 * @author liweifan
+	 * @param: param
+	 * @updateTime 2022/4/27 17:05
+	 * @return: com.yonge.cooleshow.biz.dal.vo.UserOrderVo
+	 */
+	UserOrderVo getPendingOrder(@Param("param") OrderSearch param);
 	/**
 	 * 分页查询
      * @author liweifan

+ 10 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/req/OrderPayReq.java

@@ -27,6 +27,8 @@ public class OrderPayReq {
     private String ipAddress;
     @ApiModelProperty(value = "微信用户openId(微信支付必传)")
     private String openId;
+    @ApiModelProperty(value = "用户说明 ")
+    private String reason;
 
     public String getOrderNo() {
         return orderNo;
@@ -67,4 +69,12 @@ public class OrderPayReq {
     public void setOpenId(String openId) {
         this.openId = openId;
     }
+
+    public String getReason() {
+        return reason;
+    }
+
+    public void setReason(String reason) {
+        this.reason = reason;
+    }
 }

+ 19 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/OrderSearch.java

@@ -35,10 +35,12 @@ public class OrderSearch extends QueryInfo{
 	private Long userId;
 	@ApiModelProperty("卖家id")
 	private Long merchId;
-
 	@ApiModelProperty("查询时间(yyyy-mm) ")
 	private String searchDate;
 
+	private String goodType;
+	private Long bizId;
+
 	public String getSearchNo() {
 		return searchNo;
 	}
@@ -103,4 +105,20 @@ public class OrderSearch extends QueryInfo{
 	public void setSearchDate(String searchDate) {
 		this.searchDate = searchDate;
 	}
+
+	public String getGoodType() {
+		return goodType;
+	}
+
+	public void setGoodType(String goodType) {
+		this.goodType = goodType;
+	}
+
+	public Long getBizId() {
+		return bizId;
+	}
+
+	public void setBizId(Long bizId) {
+		this.bizId = bizId;
+	}
 }

+ 1 - 3
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/TeacherWithdrawalSearch.java

@@ -27,9 +27,7 @@ public class TeacherWithdrawalSearch extends QueryInfo{
 	@ApiModelProperty(value = "申请结束时间")
 	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
 	private LocalDateTime endTime;
-
-
-	@ApiModelProperty("查询时间(yyyy-mm) ")
+	@ApiModelProperty("查询时间(yyyy-MM) ")
 	private String searchDate;
 
 	private Long userId;

+ 49 - 27
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOrderPayment.java

@@ -5,7 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.yonge.cooleshow.biz.dal.enums.PayChannelEnum;
-import com.yonge.cooleshow.biz.dal.enums.PayStatusEnum;
+import com.yonge.cooleshow.biz.dal.enums.TradeStatusEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -44,7 +44,7 @@ public class UserOrderPayment implements Serializable {
     private String payInfo;
     @ApiModelProperty("交易状态 pending 交易处理中 succeeded 交易成功 failed 交易失败")
     @TableField(value = "status_")
-    private PayStatusEnum status;
+    private TradeStatusEnum status;
     @ApiModelProperty("失败信息 ")
     @TableField(value = "pay_fail_msg_")
     private String payFailMsg;
@@ -53,6 +53,12 @@ public class UserOrderPayment implements Serializable {
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
     private Date arrivalTime;
+    @ApiModelProperty("关单状态 pending 交易处理中 succeeded 交易成功 failed 交易失败")
+    @TableField(value = "close_status_")
+    private TradeStatusEnum closeStatus;
+    @ApiModelProperty("关单失败信息 ")
+    @TableField(value = "close_fail_msg_")
+    private String closeFailMsg;
     @ApiModelProperty("创建时间 ")
     @TableField(value = "create_time_")
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@@ -64,23 +70,23 @@ public class UserOrderPayment implements Serializable {
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
     private Date updateTime;
 
-	public Long getId() {
+    public Long getId() {
         return id;
     }
 
     public void setId(Long id) {
         this.id = id;
     }
-    
-	public String getOrderNo() {
+
+    public String getOrderNo() {
         return orderNo;
     }
 
     public void setOrderNo(String orderNo) {
         this.orderNo = orderNo;
     }
-    
-	public String getTransNo() {
+
+    public String getTransNo() {
         return transNo;
     }
 
@@ -103,8 +109,16 @@ public class UserOrderPayment implements Serializable {
     public void setPayAmt(BigDecimal payAmt) {
         this.payAmt = payAmt;
     }
-    
-	public String getPayInfo() {
+
+    public BigDecimal getFeeAmt() {
+        return feeAmt;
+    }
+
+    public void setFeeAmt(BigDecimal feeAmt) {
+        this.feeAmt = feeAmt;
+    }
+
+    public String getPayInfo() {
         return payInfo;
     }
 
@@ -112,14 +126,22 @@ public class UserOrderPayment implements Serializable {
         this.payInfo = payInfo;
     }
 
-    public PayStatusEnum getStatus() {
+    public TradeStatusEnum getStatus() {
         return status;
     }
 
-    public void setStatus(PayStatusEnum status) {
+    public void setStatus(TradeStatusEnum status) {
         this.status = status;
     }
 
+    public String getPayFailMsg() {
+        return payFailMsg;
+    }
+
+    public void setPayFailMsg(String payFailMsg) {
+        this.payFailMsg = payFailMsg;
+    }
+
     public Date getArrivalTime() {
         return arrivalTime;
     }
@@ -128,35 +150,35 @@ public class UserOrderPayment implements Serializable {
         this.arrivalTime = arrivalTime;
     }
 
-    public Date getCreateTime() {
-        return createTime;
+    public TradeStatusEnum getCloseStatus() {
+        return closeStatus;
     }
 
-    public void setCreateTime(Date createTime) {
-        this.createTime = createTime;
+    public void setCloseStatus(TradeStatusEnum closeStatus) {
+        this.closeStatus = closeStatus;
     }
 
-    public Date getUpdateTime() {
-        return updateTime;
+    public String getCloseFailMsg() {
+        return closeFailMsg;
     }
 
-    public void setUpdateTime(Date updateTime) {
-        this.updateTime = updateTime;
+    public void setCloseFailMsg(String closeFailMsg) {
+        this.closeFailMsg = closeFailMsg;
     }
 
-    public BigDecimal getFeeAmt() {
-        return feeAmt;
+    public Date getCreateTime() {
+        return createTime;
     }
 
-    public void setFeeAmt(BigDecimal feeAmt) {
-        this.feeAmt = feeAmt;
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
     }
 
-    public String getPayFailMsg() {
-        return payFailMsg;
+    public Date getUpdateTime() {
+        return updateTime;
     }
 
-    public void setPayFailMsg(String payFailMsg) {
-        this.payFailMsg = payFailMsg;
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
     }
 }

+ 0 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserWithdrawal.java

@@ -67,7 +67,6 @@ public class UserWithdrawal implements Serializable {
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
     private Date updateTime;
 
-
 	public Long getId() {
         return id;
     }

+ 63 - 81
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/VideoLessonGroup.java

@@ -13,6 +13,8 @@ import org.apache.commons.lang3.builder.ToStringBuilder;
 
 import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.Date;
 
 /**
  * 视频课基本信息表
@@ -50,7 +52,7 @@ public class VideoLessonGroup extends BaseEntity {
     @TableField("lesson_price_")
     @ApiModelProperty(value = "课程价格", required = true)
     @NotNull(message = "课程价格不能为空;", groups = {AddGroup.class, UpdateGroup.class})
-    private Integer lessonPrice;  //课程价格
+    private BigDecimal lessonPrice;  //课程价格
 
     @TableField("lesson_cover_url_")
     @ApiModelProperty(value = "课程封面图片URL", required = true)
@@ -101,25 +103,28 @@ public class VideoLessonGroup extends BaseEntity {
     @ApiModelProperty(value = "审批人id")
     private Integer auditId;
 
-    public String getAuditName() {
-        return auditName;
+    public Long getId() {
+        return id;
     }
 
-    public void setAuditName(String auditName) {
-        this.auditName = auditName;
+    public void setId(Long id) {
+        this.id = id;
     }
 
-    public Integer getAuditId() {
-        return auditId;
+    public String getLessonName() {
+        return lessonName;
     }
 
-    public void setAuditId(Integer auditId) {
-        this.auditId = auditId;
+    public void setLessonName(String lessonName) {
+        this.lessonName = lessonName;
     }
 
-    public VideoLessonGroup setId(Long id) {
-        this.id = id;
-        return this;
+    public String getLessonSubject() {
+        return lessonSubject;
+    }
+
+    public void setLessonSubject(String lessonSubject) {
+        this.lessonSubject = lessonSubject;
     }
 
     public String getLessonSubjectName() {
@@ -130,107 +135,76 @@ public class VideoLessonGroup extends BaseEntity {
         this.lessonSubjectName = lessonSubjectName;
     }
 
-    public Long getId() {
-        return this.id;
-    }
-
-    public VideoLessonGroup setLessonName(String lessonName) {
-        this.lessonName = lessonName;
-        return this;
-    }
-
-    public String getLessonName() {
-        return this.lessonName;
-    }
-
-    public VideoLessonGroup setLessonSubject(String lessonSubject) {
-        this.lessonSubject = lessonSubject;
-        return this;
-    }
-
-    public String getLessonSubject() {
-        return this.lessonSubject;
+    public String getLessonDesc() {
+        return lessonDesc;
     }
 
-    public VideoLessonGroup setLessonDesc(String lessonDesc) {
+    public void setLessonDesc(String lessonDesc) {
         this.lessonDesc = lessonDesc;
-        return this;
     }
 
-    public String getLessonDesc() {
-        return this.lessonDesc;
+    public BigDecimal getLessonPrice() {
+        return lessonPrice;
     }
 
-    public VideoLessonGroup setLessonPrice(Integer lessonPrice) {
+    public void setLessonPrice(BigDecimal lessonPrice) {
         this.lessonPrice = lessonPrice;
-        return this;
     }
 
-    public Integer getLessonPrice() {
-        return this.lessonPrice;
+    public String getLessonCoverUrl() {
+        return lessonCoverUrl;
     }
 
-    public VideoLessonGroup setLessonCoverUrl(String lessonCoverUrl) {
+    public void setLessonCoverUrl(String lessonCoverUrl) {
         this.lessonCoverUrl = lessonCoverUrl;
-        return this;
     }
 
-    public String getLessonCoverUrl() {
-        return this.lessonCoverUrl;
+    public Long getTeacherId() {
+        return teacherId;
     }
 
-    public VideoLessonGroup setTeacherId(Long teacherId) {
+    public void setTeacherId(Long teacherId) {
         this.teacherId = teacherId;
-        return this;
     }
 
-    public Long getTeacherId() {
-        return this.teacherId;
+    public Integer getLessonCount() {
+        return lessonCount;
     }
 
-    public VideoLessonGroup setLessonCount(Integer lessonCount) {
+    public void setLessonCount(Integer lessonCount) {
         this.lessonCount = lessonCount;
-        return this;
     }
 
-    public Integer getLessonCount() {
-        return this.lessonCount;
+    public Integer getSortNumber() {
+        return sortNumber;
     }
 
-    public VideoLessonGroup setSortNumber(Integer sortNumber) {
+    public void setSortNumber(Integer sortNumber) {
         this.sortNumber = sortNumber;
-        return this;
     }
 
-    public Integer getSortNumber() {
-        return this.sortNumber;
+    public String getLessonTag() {
+        return lessonTag;
     }
 
-    public VideoLessonGroup setLessonTag(String lessonTag) {
+    public void setLessonTag(String lessonTag) {
         this.lessonTag = lessonTag;
-        return this;
     }
 
-    public String getLessonTag() {
-        return this.lessonTag;
+    public Integer getTopFlag() {
+        return topFlag;
     }
 
-    public VideoLessonGroup setTopFlag(Integer topFlag) {
+    public void setTopFlag(Integer topFlag) {
         this.topFlag = topFlag;
-        return this;
     }
 
-    public Integer getTopFlag() {
-        return this.topFlag;
+    public Integer getHotFlag() {
+        return hotFlag;
     }
 
-    public VideoLessonGroup setHotFlag(Integer hotFlag) {
+    public void setHotFlag(Integer hotFlag) {
         this.hotFlag = hotFlag;
-        return this;
-    }
-
-    public Integer getHotFlag() {
-        return this.hotFlag;
     }
 
     public AuthStatusEnum getAuditStatus() {
@@ -241,27 +215,35 @@ public class VideoLessonGroup extends BaseEntity {
         this.auditStatus = auditStatus;
     }
 
-    public VideoLessonGroup setCreateTime(java.util.Date createTime) {
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
         this.createTime = createTime;
-        return this;
     }
 
-    public java.util.Date getCreateTime() {
-        return this.createTime;
+    public Date getUpdateTime() {
+        return updateTime;
     }
 
-    public VideoLessonGroup setUpdateTime(java.util.Date updateTime) {
+    public void setUpdateTime(Date updateTime) {
         this.updateTime = updateTime;
-        return this;
     }
 
-    public java.util.Date getUpdateTime() {
-        return this.updateTime;
+    public String getAuditName() {
+        return auditName;
     }
 
-    @Override
-    public String toString() {
-        return ToStringBuilder.reflectionToString(this);
+    public void setAuditName(String auditName) {
+        this.auditName = auditName;
     }
 
+    public Integer getAuditId() {
+        return auditId;
+    }
+
+    public void setAuditId(Integer auditId) {
+        this.auditId = auditId;
+    }
 }

+ 1 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/VideoLessonGroupDetail.java

@@ -20,7 +20,7 @@ import javax.validation.constraints.NotNull;
  * @version v1.0
  **/
 @ApiModel(value = "video_lesson_group_detail-视频课明细表")
-public class VideoLessonGroupDetail extends BaseEntity {
+public class 	VideoLessonGroupDetail extends BaseEntity {
 
     @TableId(value = "id_", type = IdType.AUTO)
     @ApiModelProperty(value = "主键id")

+ 2 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/PayStatusEnum.java → cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/TradeStatusEnum.java

@@ -8,7 +8,7 @@ import com.yonge.cooleshow.common.enums.BaseEnum;
  * @Author: liweifan
  * @Data: 2022/3/31 14:59
  */
-public enum PayStatusEnum implements BaseEnum<String, PayStatusEnum> {
+public enum TradeStatusEnum implements BaseEnum<String, TradeStatusEnum> {
     pending("pending","交易处理中"),
     succeeded("succeeded","交易成功"),
     failed("failed","交易失败")
@@ -17,7 +17,7 @@ public enum PayStatusEnum implements BaseEnum<String, PayStatusEnum> {
     private String code;
     private String msg;
 
-    PayStatusEnum(String code, String msg) {
+    TradeStatusEnum(String code, String msg) {
         this.code = code;
         this.msg = msg;
     }

+ 1 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/props/HuifuProperties.java

@@ -107,4 +107,5 @@ public class HuifuProperties {
     public void setNotifyUrl(String notifyUrl) {
         this.notifyUrl = notifyUrl;
     }
+
 }

+ 24 - 14
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/sdk/PaymentSdk.java

@@ -18,6 +18,7 @@ import com.yonge.toolset.utils.string.StringUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
 
 import java.util.*;
 
@@ -50,7 +51,7 @@ public class PaymentSdk {
         } catch (BaseAdaPayException e) {
             return HttpResponseResult.failed(e.getMessage());
         }
-        if (null == res) {
+        if (CollectionUtils.isEmpty(res)) {
             return HttpResponseResult.failed("请求失败");
         }
         log.info("汇付[创建支付对象] Resp:{}", res);
@@ -87,21 +88,29 @@ public class PaymentSdk {
      * @return 关闭的支付对象
      * @throws Exception 异常
      */
-    public Map<String, Object> closePayment(String paymentId) throws Exception {
-        Map<String, Object> payment = new HashMap<>();
+    public HttpResponseResult<Map<String, Object>> closePayment(String paymentId, String reason, String expend) {
         Map<String, Object> paymentParams = new HashMap<>(10);
         paymentParams.put("payment_id", paymentId);
-        paymentParams.put("reason", "reason");
-        paymentParams.put("expend", "expend");
-        paymentParams.put("notify_url", "notify_url");
-        payment = com.huifu.adapay.model.Payment.close(paymentParams);
+        paymentParams.put("reason", reason);
+        paymentParams.put("expend", expend);
+        paymentParams.put("notify_url", HuifuConfiguration.getHuifuProperties().getNotifyUrl());
 
-        String error_code = (String) payment.get("error_code");
-        if (null != error_code) {
-            String errorMsg = (String) payment.get("error_msg");
-            throw new ThirdpartyException(errorMsg);
+        Map<String, Object> res;
+        try {
+            res = Payment.close(paymentParams);
+        } catch (BaseAdaPayException e) {
+            return HttpResponseResult.failed(e.getMessage());
         }
-        return payment;
+        if (CollectionUtils.isEmpty(res)) {
+            return HttpResponseResult.failed("请求失败");
+        }
+        log.info("汇付[创建支付对象] Resp:{}", res);
+        String errorCode = (String) res.get("error_code");
+        if (null != errorCode) {
+            String errorMsg = (String) res.get("error_msg");
+            return HttpResponseResult.failed(errorMsg);
+        }
+        return HttpResponseResult.succeed(res);
     }
 
     /**
@@ -133,6 +142,7 @@ public class PaymentSdk {
         System.out.println("=======query payment end=======");
         return payment;
     }
+
     /***
      * 获取openId
      * @author liweifan
@@ -153,12 +163,12 @@ public class PaymentSdk {
             JSONObject jsonObject = JSONObject.parseObject(res);
             log.info("微信[获取用户openId] Res:{}", jsonObject.toJSONString());
             String errcode = jsonObject.getString("errcode");
-            if(StringUtil.isEmpty(errcode) || "0".equals(errcode)){
+            if (StringUtil.isEmpty(errcode) || "0".equals(errcode)) {
                 Map<String, String> resMap = new HashMap<>();
                 resMap.put("openid", jsonObject.getString("openid"));
                 resMap.put("session_key", jsonObject.getString("session_key"));
                 return HttpResponseResult.succeed(resMap);
-            }else{
+            } else {
                 return HttpResponseResult.failed(jsonObject.getString("errmsg"));
             }
         } catch (Exception e) {

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

@@ -187,6 +187,6 @@ public interface CourseScheduleService extends IService<CourseSchedule> {
 
     StudentHomePage queryLiveAndVideo(Long studentId);
 
-    TeacherSubjectPrice teacherSubjectPrice(Long teacherId, Long subjectId);
+    List<TeacherSubjectPrice> teacherSubjectPrice(Long teacherId);
 }
 

+ 126 - 107
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UploadFileService.java

@@ -7,6 +7,8 @@ import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 
+import com.ksyun.ks3.dto.PostObjectFormFields;
+import com.yonge.toolset.thirdparty.entity.UploadSign;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -21,116 +23,133 @@ import com.yonge.toolset.thirdparty.storage.StoragePluginContext;
 import com.yonge.toolset.thirdparty.storage.provider.KS3StoragePlugin;
 import com.yonge.toolset.utils.upload.UploadUtil;
 
-/** 
+/**
  * 上传工具服务层实现类
  */
 @Service
 public class UploadFileService {
 
-	@Autowired
-	private StoragePluginContext storagePluginContext;
-
-	/** 最大上传大小,单位kb */
-	@Value("${common.upload.maxSize:153600}")
-	private int maxSize;
-
-	/** 支持的扩展名 */
-	@Value("${common.upload.supportExtensions:jpg,jpeg,gif,png,mp3,mid,midi,aac,m4a,mp4,xml,xlsx,xls,doc,docx,txt,pdf,psd,eps,rar,zip}")
-	private String supportExtensions;
-
-	/** 文件根目录 */
-	@Value("/var/tmp/")
-	private String fileRoot;
-
-	public UploadReturnBean uploadFile(InputStream in, String ext) {
-		UploadReturnBean uploadReturn = new UploadReturnBean("", false, "");
-		String fileName = UploadUtil.getFileName(ext);
-
-		String supportType = supportExtensions;
-		if (!UploadUtil.validateImgFile(ext, supportType)) {
-			uploadReturn.setMessage("上传图片格式错误,目前只支持" + supportType);
-			return uploadReturn;
-		}
-
-		String root = fileRoot;
-		if (StringUtils.isBlank(root)) {
-			uploadReturn.setMessage("上传临时目录没有配置");
-			return uploadReturn;
-		}
-
-		String staticFloder = "";
-
-		String folder = UploadUtil.getFileFloder();
-		String filePath = UploadUtil.getFilePath(root, staticFloder, folder);
-		File file = uploadFile(in, filePath, fileName);
-		if (maxSize > 0 && maxSize < file.length() / 1024) {
-			FileUtils.deleteQuietly(file);
-			uploadReturn.setMessage("超出允许的大小(" + (maxSize / 1024) + "M)限制");
-			return uploadReturn;
-		}
-
-		//String url = storagePlugin.uploadFile(staticFloder + folder, file);
-		String url = storagePluginContext.uploadFile(KS3StoragePlugin.PLUGIN_NAME,staticFloder + folder, file);
-
-		FileUtils.deleteQuietly(file);
-		uploadReturn.setStatus(true);
-		uploadReturn.setUrl(url);
-		return uploadReturn;
-	}
-
-
-	@Async
-	public UploadReturnBean uploadImHistoryMsgFile(File msgFile) throws FileNotFoundException {
-		InputStream in = new FileInputStream(msgFile);
-		UploadReturnBean uploadReturn = new UploadReturnBean("", false, "");
-		String fileName = UploadUtil.getFileName(msgFile.getName());
-
-		String root = fileRoot + "im_history_msg/";
-		if (StringUtils.isBlank(root)) {
-			uploadReturn.setMessage("上传临时目录没有配置");
-			return uploadReturn;
-		}
-
-		String staticFloder = "";
-		String folder = UploadUtil.getFileFloder();
-		String filePath = UploadUtil.getFilePath(root, staticFloder, folder);
-		File file = uploadFile(in, filePath, fileName);
-		String url = storagePluginContext.uploadFile(KS3StoragePlugin.PLUGIN_NAME,staticFloder + folder, file);
-
-		FileUtils.deleteQuietly(file);
-
-		uploadReturn.setStatus(true);
-		uploadReturn.setUrl(url);
-		return uploadReturn;
-	}
-
-	public void setMaxSize(int maxSize) {
-		this.maxSize = maxSize;
-	}
-
-	/**
-	 * 上传文件的工具方法
-	 * @param in
-	 * @param path
-	 * @return
-	 */
-	private File uploadFile(InputStream inputStream, String filePath, String fileName) {
-		File file = new File(filePath + "/" + fileName);
-		try {
-			if (!file.getParentFile().exists()) {
-				file.getParentFile().mkdirs();
-			}
-			FileOutputStream fos = new FileOutputStream(file);
-			IOUtils.copy(inputStream, fos);
-			if (!file.exists() || file.length() == 0) {
-				throw new BizException("图片上传出现错误,请重新上传");
-			}
-		} catch (IOException e) {
-			throw new BizException("图片上传失败", e);
-		} finally {
-			IOUtils.closeQuietly(inputStream);
-		}
-		return file;
-	}
-
+    @Autowired
+    private StoragePluginContext storagePluginContext;
+
+    /**
+     * 最大上传大小,单位kb
+     */
+    @Value("${common.upload.maxSize:153600}")
+    private int maxSize;
+
+    /**
+     * 支持的扩展名
+     */
+    @Value("${common.upload.supportExtensions:jpg,jpeg,gif,png,mp3,mid,midi,aac,m4a,mp4,xml,xlsx,xls,doc,docx,txt,pdf,psd,eps,rar,zip}")
+    private String supportExtensions;
+
+    /**
+     * 文件根目录
+     */
+    @Value("/var/tmp/")
+    private String fileRoot;
+
+    public UploadReturnBean uploadFile(InputStream in, String ext) {
+        UploadReturnBean uploadReturn = new UploadReturnBean("", false, "");
+        String fileName = UploadUtil.getFileName(ext);
+
+        String supportType = supportExtensions;
+        if (!UploadUtil.validateImgFile(ext, supportType)) {
+            uploadReturn.setMessage("上传图片格式错误,目前只支持" + supportType);
+            return uploadReturn;
+        }
+
+        String root = fileRoot;
+        if (StringUtils.isBlank(root)) {
+            uploadReturn.setMessage("上传临时目录没有配置");
+            return uploadReturn;
+        }
+
+        String staticFloder = "";
+
+        String folder = UploadUtil.getFileFloder();
+        String filePath = UploadUtil.getFilePath(root, staticFloder, folder);
+        File file = uploadFile(in, filePath, fileName);
+        if (maxSize > 0 && maxSize < file.length() / 1024) {
+            FileUtils.deleteQuietly(file);
+            uploadReturn.setMessage("超出允许的大小(" + (maxSize / 1024) + "M)限制");
+            return uploadReturn;
+        }
+
+        //String url = storagePlugin.uploadFile(staticFloder + folder, file);
+        String url = storagePluginContext.uploadFile(KS3StoragePlugin.PLUGIN_NAME, staticFloder + folder, file);
+
+        FileUtils.deleteQuietly(file);
+        uploadReturn.setStatus(true);
+        uploadReturn.setUrl(url);
+        return uploadReturn;
+    }
+
+
+    @Async
+    public UploadReturnBean uploadImHistoryMsgFile(File msgFile) throws FileNotFoundException {
+        InputStream in = new FileInputStream(msgFile);
+        UploadReturnBean uploadReturn = new UploadReturnBean("", false, "");
+        String fileName = UploadUtil.getFileName(msgFile.getName());
+
+        String root = fileRoot + "im_history_msg/";
+        if (StringUtils.isBlank(root)) {
+            uploadReturn.setMessage("上传临时目录没有配置");
+            return uploadReturn;
+        }
+
+        String staticFloder = "";
+        String folder = UploadUtil.getFileFloder();
+        String filePath = UploadUtil.getFilePath(root, staticFloder, folder);
+        File file = uploadFile(in, filePath, fileName);
+        String url = storagePluginContext.uploadFile(KS3StoragePlugin.PLUGIN_NAME, staticFloder + folder, file);
+
+        FileUtils.deleteQuietly(file);
+
+        uploadReturn.setStatus(true);
+        uploadReturn.setUrl(url);
+        return uploadReturn;
+    }
+
+    public void setMaxSize(int maxSize) {
+        this.maxSize = maxSize;
+    }
+
+    /**
+     * 上传文件的工具方法
+     *
+     * @param inputStream
+     * @param filePath
+     * @param fileName
+     * @return
+     */
+    private File uploadFile(InputStream inputStream, String filePath, String fileName) {
+        File file = new File(filePath + "/" + fileName);
+        try {
+            if (!file.getParentFile().exists()) {
+                file.getParentFile().mkdirs();
+            }
+            FileOutputStream fos = new FileOutputStream(file);
+            IOUtils.copy(inputStream, fos);
+            if (!file.exists() || file.length() == 0) {
+                throw new BizException("图片上传出现错误,请重新上传");
+            }
+        } catch (IOException e) {
+            throw new BizException("图片上传失败", e);
+        } finally {
+            IOUtils.closeQuietly(inputStream);
+        }
+        return file;
+    }
+
+    /**
+     * 获取上传文件签名
+     *
+     * @param uploadSign
+     * @return
+     */
+    public PostObjectFormFields getUploadSign(UploadSign uploadSign) {
+        return storagePluginContext.getUploadSign(KS3StoragePlugin.PLUGIN_NAME, uploadSign);
+    }
 }

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

@@ -18,5 +18,12 @@ public interface UserOrderPaymentService extends IService<UserOrderPayment> {
      * @return: com.yonge.cooleshow.biz.dal.entity.UserOrderPayment
      */
     UserOrderPayment detailByOrderNo(String orderNo);
-
+    /***
+     * 通过交易流水号查询付款单
+     * @author liweifan
+     * @param: orderNo
+     * @updateTime 2022/4/13 16:09
+     * @return: com.yonge.cooleshow.biz.dal.entity.UserOrderPayment
+     */
+    UserOrderPayment detailByTransNo(String transNo);
 }

+ 91 - 63
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderService.java

@@ -14,54 +14,72 @@ import java.util.List;
 
 /**
  * 平台订单表 服务类
+ *
  * @author liweifan
  * @date 2022-03-30
  */
-public interface UserOrderService extends IService<UserOrder>  {
+public interface UserOrderService extends IService<UserOrder> {
 
-	/**
+    /**
      * 查询详情 通过订单id
+     *
      * @author liweifan
- 	 * @date 2022-03-30
+     * @date 2022-03-30
      */
-	UserOrderVo detail(Long id);
-	/**
-	 * 查询详情 通过订单号
-	 * @author liweifan
-	 * @date 2022-03-30
-	 */
-	UserOrderVo detail(String orderNo);
-	/**
+    UserOrderVo detail(Long id);
+
+    /**
+     * 查询详情 通过订单号
+     *
+     * @author liweifan
+     * @date 2022-03-30
+     */
+    UserOrderVo detail(String orderNo);
+
+    /**
      * 分页查询
+     *
      * @author liweifan
- 	 * @date 2022-03-30
+     * @date 2022-03-30
      */
     IPage<UserOrderVo> selectPage(IPage<UserOrderVo> page, OrderSearch query);
-	/***
-	 * 查询集合
-	 * @author liweifan
-	 * @param: query
-	 * @updateTime 2022/4/15 15:05
-	 * @return: java.util.List<com.yonge.cooleshow.biz.dal.vo.UserOrderVo>
-	 */
-	List<UserOrderVo> selectList(OrderSearch query);
 
-	/***
-	 * 下单接口
-	 * @author liweifan
-	 * @param: orderReq
-	 * @updateTime 2022/3/31 15:42
-	 * @return: com.yonge.cooleshow.common.entity.HttpResponseResult<com.yonge.cooleshow.biz.dal.entity.Order>
-	 */
+    /***
+     * 查询集合
+     * @author liweifan
+     * @param: query
+     * @updateTime 2022/4/15 15:05
+     * @return: java.util.List<com.yonge.cooleshow.biz.dal.vo.UserOrderVo>
+     */
+    List<UserOrderVo> selectList(OrderSearch query);
+
+    /***
+     * 下单接口
+     * @author liweifan
+     * @param: orderReq
+     * @updateTime 2022/3/31 15:42
+     * @return: com.yonge.cooleshow.common.entity.HttpResponseResult<com.yonge.cooleshow.biz.dal.entity.Order>
+     */
     HttpResponseResult<UserOrder> executeOrder(OrderReq orderReq);
-	/***
-	 * 订单付款
-	 * @author liweifan
-	 * @param: payReq
-	 * @updateTime 2022/3/31 17:23
-	 * @return: com.yonge.cooleshow.common.entity.HttpResponseResult
-	 */
+
+    /***
+     * 订单付款
+     * @author liweifan
+     * @param: payReq
+     * @updateTime 2022/3/31 17:23
+     * @return: com.yonge.cooleshow.common.entity.HttpResponseResult
+     */
     HttpResponseResult<OrderPayRes> orderPay(OrderPayReq payReq);
+
+    /***
+     * 通过业务id查询用户正在交易中的订单
+     * @author liweifan
+     * @param: query
+     * @updateTime 2022/4/27 16:56
+     * @return: com.yonge.cooleshow.common.entity.HttpResponseResult<com.yonge.cooleshow.biz.dal.vo.UserOrderVo>
+     */
+    HttpResponseResult<UserOrderVo> getPendingOrder(OrderSearch query);
+
     /***
      * 支付中订单付款
      * @author liweifan
@@ -69,34 +87,44 @@ public interface UserOrderService extends IService<UserOrder>  {
      * @updateTime 2022/4/21 19:32
      * @return: com.yonge.cooleshow.common.entity.HttpResponseResult<com.yonge.cooleshow.biz.dal.vo.res.OrderPayRes>
      */
-	HttpResponseResult<OrderPayRes> orderPaytoPaying(OrderPayReq payReq);
-	/***
-	 * 用户付款回调
-	 * @author liweifan
-	 * @param: data
-	 * @updateTime 2022/4/8 18:24
-	 */
-	void orderCallback(String data);
-	/***
-	 * 轮询用户订单
-	 * @author liweifan
-	 * @updateTime 2022/4/13 16:27
-	 */
+    HttpResponseResult<OrderPayRes> orderPaytoPaying(OrderPayReq payReq);
+
+    /***
+     * 用户付款回调
+     * @author liweifan
+     * @param: data
+     * @updateTime 2022/4/8 18:24
+     */
+    void orderCallback(String data, String type);
+
+    /***
+     * 轮询用户订单
+     * @author liweifan
+     * @updateTime 2022/4/13 16:27
+     */
     void pollingOrder();
-	/***
-	 * app查询订单详情
-	 * @author liweifan
-	 * @param: orderNo
-	 * @updateTime 2022/4/24 17:49
-	 * @return: com.yonge.cooleshow.biz.dal.vo.UserOrderVo
-	 */
-	UserOrderVo detailApp(UserOrder param);
-	/***
-	 * 取消订单
-	 * @author liweifan
-	 * @param: payReq
-	 * @updateTime 2022/4/21 19:39
-	 * @return: com.yonge.cooleshow.common.entity.HttpResponseResult<java.lang.Boolean>
-	 */
-	HttpResponseResult<Boolean> orderCancel(OrderPayReq payReq);
+
+    /***
+     * app查询订单详情
+     * @author liweifan
+     * @param: orderNo
+     * @updateTime 2022/4/24 17:49
+     * @return: com.yonge.cooleshow.biz.dal.vo.UserOrderVo
+     */
+    UserOrderVo detailApp(UserOrder param);
+
+    /***
+     * 取消订单
+     * @author liweifan
+     * @param: payReq
+     * @updateTime 2022/4/21 19:39
+     * @return: com.yonge.cooleshow.common.entity.HttpResponseResult<java.lang.Boolean>
+     */
+    HttpResponseResult<Boolean> orderCancel(OrderPayReq payReq);
+    /***
+     * 完成所有订单
+     * @author liweifan
+     * @updateTime 2022/4/27 17:38
+     */
+    void setSuccessStatus();
 }

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

@@ -983,7 +983,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
      * @Author: cy
      * @Date: 2022/4/26
      */
-    public TeacherSubjectPrice teacherSubjectPrice(Long teacherId,Long subjectId){
-        return teacherFreeTimeDao.selectSubjectPrice(teacherId,subjectId);
+    public List<TeacherSubjectPrice> teacherSubjectPrice(Long teacherId){
+        return teacherFreeTimeDao.selectPriceByTeacherId(teacherId);
     }
 }

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

@@ -358,7 +358,7 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
                 .lambdaQuery()
                 .eq(MusicSheetPurchaseRecord::getMusicSheetId, musicSheetId)
                 .eq(MusicSheetPurchaseRecord::getStudentId, userId)
-                .eq(MusicSheetPurchaseRecord::getOrderStatus, YesOrNoEnum.YES)
+                .eq(MusicSheetPurchaseRecord::getOrderStatus,OrderStatusEnum.PAID)
                 .list();
         if (!CollectionUtils.isEmpty(list)) {
             throw  new BizException("已经购买了当前曲目");

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

@@ -52,6 +52,7 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
         }
         studentHomeVo.setHeardUrl(user.getAvatar());
         studentHomeVo.setUsername(user.getUsername());
+        studentHomeVo.setBirthdate(user.getBirthdate());
         int num = DateUtil.daysBetween(new Date(), detail.getMembershipEndTime());
         studentHomeVo.setMembershipDays(num < 0 ? 0 : num);
         StudentTotal total = (StudentTotal) redissonClient.getBucket(CacheNameEnum.STUDENT_TOTAL.getRedisKey(user.getId()))
@@ -70,6 +71,6 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
 
     @Override
     public Integer setSubject(Long id, String subjectIds) {
-        return baseMapper.setSubject(id,subjectIds);
+        return baseMapper.setSubject(id, subjectIds);
     }
 }

+ 18 - 18
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserAccountServiceImpl.java

@@ -90,23 +90,23 @@ public class UserAccountServiceImpl extends ServiceImpl<UserAccountDao, UserAcco
         AccountTotal total = new AccountTotal();
 
         total.setTotalInAmount(practiceAmount.add(liveAmount).add(musicAmount));
-        total.setPracticeAmount(practiceAmount);
-        BigDecimal practiceRate = total.getPracticeAmount()
-                .divide(total.getTotalInAmount(), 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100"));
-        total.setPracticeRate(practiceRate);
-
-        total.setLiveAmount(liveAmount);
-        BigDecimal liveRate = total.getLiveAmount()
-                .divide(total.getTotalInAmount(), 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100"));
-        total.setLiveRate(liveRate);
-
-        total.setMusicAmount(musicAmount);
-        BigDecimal musicRate = total.getMusicAmount()
-                .divide(total.getTotalInAmount(), 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100"));
-        total.setMusicRate(musicRate);
-
+        if (!BigDecimal.ZERO.equals(total.getTotalInAmount())) {
+            total.setPracticeAmount(practiceAmount);
+            BigDecimal practiceRate = total.getPracticeAmount()
+                    .divide(total.getTotalInAmount(), 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100"));
+            total.setPracticeRate(practiceRate);
+
+            total.setLiveAmount(liveAmount);
+            BigDecimal liveRate = total.getLiveAmount()
+                    .divide(total.getTotalInAmount(), 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100"));
+            total.setLiveRate(liveRate);
+
+            total.setMusicAmount(musicAmount);
+            BigDecimal musicRate = total.getMusicAmount()
+                    .divide(total.getTotalInAmount(), 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100"));
+            total.setMusicRate(musicRate);
+        }
         total.setInfoList(infoList);
-
         return HttpResponseResult.succeed(total);
     }
 
@@ -117,7 +117,7 @@ public class UserAccountServiceImpl extends ServiceImpl<UserAccountDao, UserAcco
             baseMapper.frozenDeductChangeAccount(accountRecordDto.getUserId(), accountRecordDto.getTransAmount(), accountRecordDto.getInOrOut().getCode());
         } else if (FrozenTypeEnum.FROZEN_BACK.equals(accountRecordDto.getFrozenType())) {
             baseMapper.frozenBackChangeAccount(accountRecordDto.getUserId(), accountRecordDto.getTransAmount(), accountRecordDto.getInOrOut().getCode());
-        }  else {
+        } else {
             baseMapper.changeAccount(accountRecordDto.getUserId(), accountRecordDto.getTransAmount(), accountRecordDto.getInOrOut().getCode());
         }
 
@@ -126,7 +126,7 @@ public class UserAccountServiceImpl extends ServiceImpl<UserAccountDao, UserAcco
                 || detail.getAmountUsable().doubleValue() < 0 || detail.getAmountFrozen().doubleValue() < 0) {
             throw new BizException("账户变更失败");
         }
-        if(accountRecordDto.getSaveRecord()){
+        if (accountRecordDto.getSaveRecord()) {
             //插入账户变更记录
             accountRecordDto.setAccountId(accountRecordDto.getUserId());
             accountRecordDto.setAccountBalance(detail.getAmountUsable());

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

@@ -14,6 +14,12 @@ public class UserOrderPaymentServiceImpl extends ServiceImpl<UserOrderPaymentDao
     @Override
     public UserOrderPayment detailByOrderNo(String orderNo) {
         return baseMapper.selectOne(Wrappers.<UserOrderPayment>lambdaQuery()
-                .eq(UserOrderPayment::getOrderNo,orderNo));
+                .eq(UserOrderPayment::getOrderNo, orderNo));
+    }
+
+    @Override
+    public UserOrderPayment detailByTransNo(String transNo) {
+        return baseMapper.selectOne(Wrappers.<UserOrderPayment>lambdaQuery()
+                .eq(UserOrderPayment::getTransNo, transNo));
     }
 }

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

@@ -4,7 +4,6 @@ import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yonge.cooleshow.biz.dal.config.HuifuConfiguration;
-import com.yonge.cooleshow.biz.dal.entity.StudentTime;
 import com.yonge.cooleshow.biz.dal.enums.*;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
 import com.yonge.cooleshow.common.constant.SysConfigConstant;
@@ -22,6 +21,7 @@ import com.yonge.cooleshow.biz.dal.vo.res.OrderPayRes;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.exception.BizException;
 import com.yonge.cooleshow.common.service.IdGeneratorService;
+import com.yonge.toolset.utils.string.StringUtil;
 import org.apache.commons.beanutils.BeanUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -88,14 +88,14 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         orderCreate.put(GoodTypeEnum.VIDEO, recordService::buyVideoCourse);
 
         //曲目购买
-        orderCreate.put(GoodTypeEnum.MUSIC,musicSheetService::buyMusicSheetCheck);
+        orderCreate.put(GoodTypeEnum.MUSIC, musicSheetService::buyMusicSheetCheck);
 
 
         /**********订单生成后******************/
 
 
         //曲目购买
-        orderAfter.put(GoodTypeEnum.MUSIC,musicSheetService::orderAfterSheet);
+        orderAfter.put(GoodTypeEnum.MUSIC, musicSheetService::orderAfterSheet);
 
         /**********订单完成后******************/
         //vip开通缴费
@@ -110,7 +110,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
 
 
         //曲目购买
-        orderSuccess.put(GoodTypeEnum.MUSIC,musicSheetService::buyMusicSheetSuccess);
+        orderSuccess.put(GoodTypeEnum.MUSIC, musicSheetService::buyMusicSheetSuccess);
 
         /**********订单取消后******************/
         //陪练课购买
@@ -121,7 +121,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         orderCancel.put(GoodTypeEnum.LIVE, courseGroupService::buyLiveCourseCancel);
 
         // 曲目购买
-        orderCancel.put(GoodTypeEnum.MUSIC,musicSheetService::buyMusicSheetCancel);
+        orderCancel.put(GoodTypeEnum.MUSIC, musicSheetService::buyMusicSheetCancel);
     }
 
     @Override
@@ -146,6 +146,8 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
     public UserOrderVo detailApp(UserOrder param) {
         UserOrderVo userOrderVo = baseMapper.detailApp(param);
         if (null != userOrderVo) {
+            userOrderVo.setFeeAmt(null);
+            userOrderVo.setPlantformFee(null);
             List<UserOrderDetailVo> orderDetilList = orderDetailService.getOrderDetilListByOrderNo(userOrderVo.getOrderNo());
             orderDetilList.forEach(o -> {
                 o.setPlantformFee(null);
@@ -159,11 +161,24 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
     @Override
     public HttpResponseResult<Boolean> orderCancel(OrderPayReq payReq) {
         UserOrderVo detail = detail(payReq.getOrderNo());
-        orderCancel(detail);
+        if (null == detail) {
+            return HttpResponseResult.failed("未找到订单信息");
+        }
+        doOrderCancel(detail, OrderStatusEnum.CLOSE, StringUtil.isEmpty(payReq.getReason()) ? "用户取消订单" : payReq.getReason());
         return HttpResponseResult.succeed(true);
     }
 
     @Override
+    public void setSuccessStatus() {
+        OrderSearch query = new OrderSearch();
+        query.setStatus("WAIT_PAY,PAYING");
+        List<UserOrderVo> userOrderVos = selectList(query);
+        for(UserOrderVo userOrderVo : userOrderVos){
+            orderSuccess(userOrderVo);
+        }
+    }
+
+    @Override
     public IPage<UserOrderVo> selectPage(IPage<UserOrderVo> page, OrderSearch query) {
         return page.setRecords(baseMapper.selectPage(page, query));
     }
@@ -237,6 +252,15 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
     }
 
     @Override
+    public HttpResponseResult<UserOrderVo> getPendingOrder(OrderSearch query) {
+        UserOrderVo userOrderVo = baseMapper.getPendingOrder(query);
+        if (null != userOrderVo) {
+            userOrderVo.setOrderDetailList(orderDetailService.getOrderDetilListByOrderNo(userOrderVo.getOrderNo()));
+        }
+        return HttpResponseResult.succeed(userOrderVo);
+    }
+
+    @Override
     public HttpResponseResult<OrderPayRes> orderPaytoPaying(OrderPayReq payReq) {
         //查询订单
         UserOrderVo detail = detail(payReq.getOrderNo());
@@ -248,25 +272,108 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
     }
 
     @Override
-    public void orderCallback(String data) {
+    public void orderCallback(String data, String type) {
         JSONObject hfRes = JSONObject.parseObject(data);
-        if (PayStatusEnum.succeeded.getCode().equals(hfRes.getString("status"))) {
-            //订单完成
-            UserOrderVo detail = detail(hfRes.getString("order_no"));
-            if (null == detail) {
-                log.error("汇付支付回调,订单未找到。 req is {}", 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);
+        }
+    }
+
+
+    /***
+     * 处理回调-支付成功
+     * @author liweifan
+     * @param: hfRes
+     * @updateTime 2022/4/27 15:09
+     */
+    private void paymentSucceededHandle(JSONObject hfRes) {
+        //订单完成
+        UserOrderVo detail = detail(hfRes.getString("order_no"));
+        if (null == detail) {
+            log.error("汇付支付回调,订单未找到。 req is {}", hfRes.toJSONString());
+            return;
+        }
+        if (!detail.getStatus().equals(OrderStatusEnum.PAID)
+                && !detail.getStatus().equals(OrderStatusEnum.WAIT_PAY)
+                && !detail.getStatus().equals(OrderStatusEnum.CLOSE)) {
+            orderSuccess(detail, hfRes);
+        } else {
+            log.error("汇付支付回调,订单状态异常。 req is {}", hfRes.toJSONString());
+        }
+    }
+
+    /***
+     * 处理回调-支付失败
+     * @author liweifan
+     * @param: hfRes
+     * @updateTime 2022/4/27 15:09
+     */
+    private void paymentFailedHandle(JSONObject hfRes) {
+        //订单完成
+        UserOrderVo detail = detail(hfRes.getString("order_no"));
+
+        if (null == detail) {
+            log.error("汇付支付回调,订单未找到。 req is {}", hfRes.toJSONString());
+            return;
+        }
+        if (!detail.getStatus().equals(OrderStatusEnum.PAID)
+                && !detail.getStatus().equals(OrderStatusEnum.WAIT_PAY)
+                && !detail.getStatus().equals(OrderStatusEnum.CLOSE)) {
+
+            doOrderCancel(detail, OrderStatusEnum.FAIL, "支付失败");
+            //查询
+            UserOrderPayment orderPayment = orderPaymentService.detailByOrderNo(hfRes.getString("order_no"));
+            if (null == orderPayment) {
                 return;
             }
-            if (!detail.getStatus().equals(OrderStatusEnum.PAID)
-                    && !detail.getStatus().equals(OrderStatusEnum.WAIT_PAY)
-                    && !detail.getStatus().equals(OrderStatusEnum.CLOSE)) {
-                orderSuccess(detail, hfRes);
-            } else {
-                log.error("汇付支付回调,订单状态异常。 req is {}", data);
-            }
+            orderPayment.setPayFailMsg("支付回调失败");
+            orderPayment.setStatus(TradeStatusEnum.failed);
+            orderPayment.setUpdateTime(new Date());
+            orderPaymentService.updateById(orderPayment);
+        } else {
+            log.error("汇付支付回调,订单状态异常。 req is {}", hfRes.toJSONString());
         }
     }
 
+    /***
+     * 支付关单成功
+     * @author liweifan
+     * @param: hfRes
+     * @updateTime 2022/4/27 15:33
+     */
+    private void paymentCloseSucceededHandle(JSONObject hfRes) {
+        UserOrderPayment orderPayment = orderPaymentService.detailByTransNo(hfRes.getString("payment_id"));
+        if (null == orderPayment) {
+            return;
+        }
+        orderPayment.setStatus(TradeStatusEnum.succeeded);
+        orderPayment.setUpdateTime(new Date());
+        orderPaymentService.updateById(orderPayment);
+    }
+
+    /***
+     * 支付关单失败
+     * @author liweifan
+     * @param: hfRes
+     * @updateTime 2022/4/27 15:33
+     */
+    private void paymentCloseFailedHandle(JSONObject hfRes) {
+        UserOrderPayment orderPayment = orderPaymentService.detailByTransNo(hfRes.getString("payment_id"));
+        if (null == orderPayment) {
+            return;
+        }
+        orderPayment.setStatus(TradeStatusEnum.failed);
+        orderPayment.setPayFailMsg("支付关单回调失败-" + hfRes.getString("error_msg"));
+        orderPayment.setUpdateTime(new Date());
+        orderPaymentService.updateById(orderPayment);
+    }
+
     @Override
     public void pollingOrder() {
         //WAIT_PAY状态的订单,半个小时自动关闭
@@ -275,7 +382,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         for (UserOrderVo userOrder : orderList) {
             //待支付订单直接取消
             if (OrderStatusEnum.WAIT_PAY.equals(userOrder.getStatus())) {
-                waitPayOrderHandle(userOrder);
+                doOrderCancel(userOrder, OrderStatusEnum.CLOSE, "订单超时");
             }
             if (OrderStatusEnum.PAYING.equals(userOrder.getStatus())) {
                 payingOrderHandle(userOrder);
@@ -284,16 +391,6 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
     }
 
     /***
-     * 处理待支付订单
-     * @author liweifan
-     * @param: userOrder
-     * @updateTime 2022/4/13 16:51
-     */
-    private void waitPayOrderHandle(UserOrderVo userOrder) {
-        orderCancel(userOrder);
-    }
-
-    /***
      * 处理支付中订单
      * @author liweifan
      * @param: userOrder
@@ -309,10 +406,11 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         try {
             Map<String, Object> resMap = paymentSdk.queryPayment(orderPayment.getTransNo());
             //支付成功
-            if (PayStatusEnum.succeeded.getCode().equals(resMap.get("status").toString())) {
+            if (TradeStatusEnum.succeeded.getCode().equals(resMap.get("status").toString())) {
                 orderSuccess(userOrder);
             } else {
-                orderCancel(userOrder);
+                //关闭订单
+                doOrderCancel(userOrder, OrderStatusEnum.CLOSE, "订单超时");
             }
         } catch (Exception e) {
             e.printStackTrace();
@@ -363,9 +461,8 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
             return HttpResponseResult.succeed(orderPayRes);
         } else {
             //入订单付款表,同时修改订单状态
-            orderCancel(detail);
+            doOrderCancel(detail, OrderStatusEnum.FAIL, "订单超时");
             errOrderPayment(responseResult, payReq);
-            baseMapper.updateStatusByOrderNo(payReq.getOrderNo(), OrderStatusEnum.FAIL.getCode());
             return HttpResponseResult.failed(responseResult.getMsg());
         }
 
@@ -391,10 +488,10 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
             );
             String pay_info = ((JSONObject) res.get("expend")).getString("pay_info");
             orderPayment.setPayInfo(pay_info);
-            orderPayment.setStatus(PayStatusEnum.pending);
+            orderPayment.setStatus(TradeStatusEnum.pending);
         } else {
             orderPayment.setPayFailMsg(responseResult.getMsg());
-            orderPayment.setStatus(PayStatusEnum.failed);
+            orderPayment.setStatus(TradeStatusEnum.failed);
         }
         orderPaymentService.save(orderPayment);
         return orderPayment;
@@ -417,7 +514,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
             orderPayment.setPayChannel(payReq.getPayChannel());
         }
         orderPayment.setPayFailMsg(responseResult.getMsg());
-        orderPayment.setStatus(PayStatusEnum.failed);
+        orderPayment.setStatus(TradeStatusEnum.failed);
         orderPayment.setUpdateTime(new Date());
 
         orderPaymentService.saveOrUpdate(orderPayment);
@@ -434,7 +531,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
      */
     private HttpResponseResult<OrderPayRes> orderPayPaying(OrderPayReq payReq, UserOrderVo detail) {
         UserOrderPayment orderPayment = orderPaymentService.detailByOrderNo(payReq.getOrderNo());
-        if (PayStatusEnum.pending.equals(orderPayment.getStatus())) {
+        if (TradeStatusEnum.pending.equals(orderPayment.getStatus())) {
             OrderPayRes orderPayRes = new OrderPayRes();
             orderPayRes.setPay_info(orderPayment.getPayInfo());
             orderPayRes.setPay_amt(orderPayment.getPayAmt().toString());
@@ -601,18 +698,35 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
      * @updateTime 2022/4/13 17:23
      */
     @Transactional(rollbackFor = Exception.class)
-    void orderCancel(UserOrderVo userOrder) {
-        userOrder.setStatus(OrderStatusEnum.CLOSE);
-        userOrder.setUpdateTime(new Date());
-        baseMapper.updateById(userOrder);
+    void doOrderCancel(UserOrderVo userOrder, OrderStatusEnum orderStatus, String reason) {
+        //已经取消过的订单,不能再取消
+        if (OrderStatusEnum.CLOSE.equals(userOrder.getStatus())
+                || OrderStatusEnum.FAIL.equals(userOrder.getStatus())) {
+            return;
+        }
+        //状态只能是关闭和失败
+        if (!OrderStatusEnum.CLOSE.equals(orderStatus)
+                && !OrderStatusEnum.FAIL.equals(orderStatus)) {
+            return;
+        }
 
         UserOrderPayment orderPayment = orderPaymentService.detailByOrderNo(userOrder.getOrderNo());
         if (null != orderPayment) {
             //更新付款单
-            orderPayment.setStatus(PayStatusEnum.failed);
-            orderPayment.setPayFailMsg("交易取消");
+            orderPayment.setStatus(TradeStatusEnum.failed);
+            orderPayment.setPayFailMsg(StringUtil.isEmpty(reason) ? "交易取消" : reason);
             orderPayment.setUpdateTime(new Date());
-            orderPaymentService.updateById(orderPayment);
+            //发送支付关单请求
+            HttpResponseResult<Map<String, Object>> responseResult = paymentSdk.closePayment(userOrder.getTransNo(), reason, "");
+            if (!responseResult.getStatus()) {
+                orderPayment.setCloseStatus(TradeStatusEnum.failed);
+                orderPayment.setCloseFailMsg(responseResult.getMsg());
+                orderPaymentService.updateById(orderPayment);
+                return;
+            } else {
+                orderPayment.setCloseStatus(TradeStatusEnum.pending);
+                orderPaymentService.updateById(orderPayment);
+            }
         }
         List<UserOrderDetailVo> orderDetailList = orderDetailService.getOrderDetilListByOrderNo(userOrder.getOrderNo());
         for (UserOrderDetailVo orderDetailVo : orderDetailList) {
@@ -624,6 +738,10 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
                 userOrderVoConsumer.accept(orderDetailVo);
             }
         }
+
+        userOrder.setStatus(orderStatus);
+        userOrder.setUpdateTime(new Date());
+        baseMapper.updateById(userOrder);
     }
 
     void orderSuccess(UserOrderVo detail) {
@@ -646,22 +764,21 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         updateById(detail);
         //更新付款单
         UserOrderPayment orderPayment = orderPaymentService.detailByOrderNo(detail.getOrderNo());
-        orderPayment.setStatus(PayStatusEnum.succeeded);
-        orderPayment.setArrivalTime(now);
-        orderPayment.setUpdateTime(now);
-        if (null != hfRes) {
-            try {
-                orderPayment.setPayAmt(new BigDecimal(hfRes.getString("pay_amt")));
-                orderPayment.setFeeAmt(new BigDecimal(hfRes.getString("fee_amt")));
-            } catch (Exception e) {
-                e.printStackTrace();
-                log.error("完成订单,付款单金额格式化失败,参数{}", hfRes.toJSONString());
+        if(null != orderPayment){
+            orderPayment.setStatus(TradeStatusEnum.succeeded);
+            orderPayment.setArrivalTime(now);
+            orderPayment.setUpdateTime(now);
+            if (null != hfRes) {
+                try {
+                    orderPayment.setPayAmt(new BigDecimal(hfRes.getString("pay_amt")));
+                    orderPayment.setFeeAmt(new BigDecimal(hfRes.getString("fee_amt")));
+                } catch (Exception e) {
+                    e.printStackTrace();
+                    log.error("完成订单,付款单金额格式化失败,参数{}", hfRes.toJSONString());
+                }
             }
+            orderPaymentService.updateById(orderPayment);
         }
-        orderPaymentService.updateById(orderPayment);
-
-        //StudentTime studentTime = studentTimeService.getById(detail.getUserId());
-
         List<UserOrderDetailVo> orderDetailList = orderDetailService.getOrderDetilListByOrderNo(detail.getOrderNo());
         for (UserOrderDetailVo orderDetailVo : orderDetailList) {
             orderDetailVo.setUserId(detail.getUserId());
@@ -671,16 +788,6 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
             if (!Objects.isNull(userOrderVoConsumer)) {
                 userOrderVoConsumer.accept(orderDetailVo);
             }
-            //设置第一次购买时间
-            //studentTimeService.setTimeByGoodType(studentTime,orderDetailVo.getGoodType());
         }
-
-        //记录第一次购买时间
-        /*if(null == studentTime || null == studentTime.getUserId()){
-            studentTime.setUserId(detail.getUserId());
-            studentTimeService.save(studentTime);
-        }else{
-            studentTimeService.updateById(studentTime);
-        }*/
     }
 }

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

@@ -95,16 +95,16 @@ public class VideoLessonPurchaseRecordServiceImpl extends ServiceImpl<VideoLesso
         purchaseRecord.setOrderNo(orderNo);
         purchaseRecord.setStudentId(studentId);
         purchaseRecord.setOrderStatus(0);
-        purchaseRecord.setOriginalPrice(BigDecimal.valueOf(lessonGroup.getLessonPrice()));//原价
-        purchaseRecord.setExpectPrice(BigDecimal.valueOf(lessonGroup.getLessonPrice()));//预计价格
+        purchaseRecord.setOriginalPrice(lessonGroup.getLessonPrice());//原价
+        purchaseRecord.setExpectPrice(lessonGroup.getLessonPrice());//预计价格
         videoLessonPurchaseRecordDao.insert(purchaseRecord);
 
         OrderCreateRes orderCreateRes = new OrderCreateRes();
         orderCreateRes.setRes(true);
         orderCreateRes.setMerchId(lessonGroup.getTeacherId());
         orderCreateRes.setBizId(orderReqInfo.getCouponId());
-        orderCreateRes.setOriginalPrice(BigDecimal.valueOf(lessonGroup.getLessonPrice()));//原价
-        orderCreateRes.setExpectPrice(BigDecimal.valueOf(lessonGroup.getLessonPrice()));//预计价格
+        orderCreateRes.setOriginalPrice(lessonGroup.getLessonPrice());//原价
+        orderCreateRes.setExpectPrice(lessonGroup.getLessonPrice());//预计价格
         orderCreateRes.setActualPrice(purchaseRecord.getPayMoney());//实际价格
         orderCreateRes.setGoodNum(lessonGroup.getLessonCount());
         orderCreateRes.setGoodType(GoodTypeEnum.VIDEO);

+ 0 - 18
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/HomeTotalVo.java

@@ -1,18 +0,0 @@
-package com.yonge.cooleshow.biz.dal.vo;
-
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-
-import java.util.List;
-
-/**
- * @Author: liweifan
- * @Data: 2022/3/30 17:53
- */
-public class HomeTotalVo {
-    public static class UserToDoNum{
-
-    }
-
-
-}

+ 21 - 19
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/LessonGroupVo.java

@@ -4,6 +4,8 @@ import com.yonge.cooleshow.common.entity.BaseEntity;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
+import java.math.BigDecimal;
+
 /**
  * @Author: cy
  * @Date: 2022/4/11
@@ -26,7 +28,7 @@ public class LessonGroupVo extends BaseEntity {
     private String lessonDesc;
 
     @ApiModelProperty(value = "课程价格")
-    private Integer lessonPrice;
+    private BigDecimal lessonPrice;
 
     @ApiModelProperty(value = "课程封面")
     private String lessonCoverUrl;
@@ -46,22 +48,6 @@ public class LessonGroupVo extends BaseEntity {
     @ApiModelProperty("购买人数")
     private Integer countStudent;
 
-    public String getUserName() {
-        return userName;
-    }
-
-    public void setUserName(String userName) {
-        this.userName = userName;
-    }
-
-    public String getAvatar() {
-        return avatar;
-    }
-
-    public void setAvatar(String avatar) {
-        this.avatar = avatar;
-    }
-
     public Long getId() {
         return id;
     }
@@ -102,11 +88,11 @@ public class LessonGroupVo extends BaseEntity {
         this.lessonDesc = lessonDesc;
     }
 
-    public Integer getLessonPrice() {
+    public BigDecimal getLessonPrice() {
         return lessonPrice;
     }
 
-    public void setLessonPrice(Integer lessonPrice) {
+    public void setLessonPrice(BigDecimal lessonPrice) {
         this.lessonPrice = lessonPrice;
     }
 
@@ -134,6 +120,22 @@ public class LessonGroupVo extends BaseEntity {
         this.teacherId = teacherId;
     }
 
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public String getAvatar() {
+        return avatar;
+    }
+
+    public void setAvatar(String avatar) {
+        this.avatar = avatar;
+    }
+
     public Integer getCountStudent() {
         return countStudent;
     }

+ 12 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/StudentHomeVo.java

@@ -5,6 +5,8 @@ import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import io.swagger.models.auth.In;
 
+import java.util.Date;
+
 /**
  * @Author: liweifan
  * @Data: 2022/3/21 18:37
@@ -16,6 +18,8 @@ public class StudentHomeVo extends Student {
     private String heardUrl;
     @ApiModelProperty("学员昵称")
     private String username;
+    @ApiModelProperty(value = "生日")
+    private Date birthdate;
     @ApiModelProperty("会员剩余有效期天数")
     private Integer membershipDays;
     @ApiModelProperty("累计练习天数")
@@ -49,6 +53,14 @@ public class StudentHomeVo extends Student {
         this.username = username;
     }
 
+    public Date getBirthdate() {
+        return birthdate;
+    }
+
+    public void setBirthdate(Date birthdate) {
+        this.birthdate = birthdate;
+    }
+
     public Integer getExerciseDays() {
         return exerciseDays;
     }

+ 11 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/VideoLessonPurchaseStudent.java

@@ -12,6 +12,9 @@ import java.util.Date;
  */
 @ApiModel(value = "VideoLessonPurchaseStudent对象")
 public class VideoLessonPurchaseStudent extends BaseEntity {
+    @ApiModelProperty("用户id")
+    private Long userId;
+
     @ApiModelProperty("头像地址")
     private String avatar;
 
@@ -21,6 +24,14 @@ public class VideoLessonPurchaseStudent extends BaseEntity {
     @ApiModelProperty(value = "性别 0女 1男")
     private Integer gender;
 
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
     private java.util.Date createTime;
 
     public String getAvatar() {

+ 9 - 9
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/VideoLessonStudentVo.java

@@ -18,15 +18,7 @@ public class VideoLessonStudentVo extends BaseEntity {
     private List<VideoLessonGroupDetail> detailList;
 
     @ApiModelProperty(value = "true已买,false未买")
-    private Boolean isAlreadyBuy;
-
-    public Boolean getAlreadyBuy() {
-        return isAlreadyBuy;
-    }
-
-    public void setAlreadyBuy(Boolean alreadyBuy) {
-        isAlreadyBuy = alreadyBuy;
-    }
+    private Boolean alreadyBuy;
 
     public VideoLessonGroupVo getLessonGroup() {
         return lessonGroup;
@@ -43,4 +35,12 @@ public class VideoLessonStudentVo extends BaseEntity {
     public void setDetailList(List<VideoLessonGroupDetail> detailList) {
         this.detailList = detailList;
     }
+
+    public Boolean getAlreadyBuy() {
+        return alreadyBuy;
+    }
+
+    public void setAlreadyBuy(Boolean alreadyBuy) {
+        this.alreadyBuy = alreadyBuy;
+    }
 }

+ 7 - 7
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/res/AccountTotal.java

@@ -13,19 +13,19 @@ import java.util.List;
 @ApiModel(value = "AccountTotal", description = "用户账户统计对象")
 public class AccountTotal {
     @ApiModelProperty("总收入")
-    private BigDecimal totalInAmount;
+    private BigDecimal totalInAmount = BigDecimal.ZERO;
     @ApiModelProperty("陪练课")
-    private BigDecimal practiceAmount;
+    private BigDecimal practiceAmount = BigDecimal.ZERO;
     @ApiModelProperty("陪练课-百分比")
-    private BigDecimal practiceRate;
+    private BigDecimal practiceRate = BigDecimal.ZERO;
     @ApiModelProperty("直播课")
-    private BigDecimal liveAmount;
+    private BigDecimal liveAmount = BigDecimal.ZERO;
     @ApiModelProperty("直播课-百分比")
-    private BigDecimal liveRate;
+    private BigDecimal liveRate = BigDecimal.ZERO;
     @ApiModelProperty("乐谱")
-    private BigDecimal musicAmount;
+    private BigDecimal musicAmount = BigDecimal.ZERO;
     @ApiModelProperty("乐谱-百分比")
-    private BigDecimal musicRate;
+    private BigDecimal musicRate = BigDecimal.ZERO;
 
     @ApiModelProperty("时间(详情数据中使用)")
     private String timeStr;

+ 15 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/TeacherFreeTimeMapper.xml

@@ -95,4 +95,19 @@
         LEFT JOIN teacher_subject_price p ON f.id_=p.teacher_free_time_id
         WHERE f.teacher_id_=#{teacherId} AND f.default_flag_=1 AND p.subject_id_=#{subjectId}
     </select>
+    <select id="selectPriceByTeacherId" resultType="com.yonge.cooleshow.biz.dal.entity.TeacherSubjectPrice"
+            parameterType="java.lang.Long">
+        SELECT
+            p.id_ AS id,
+            p.teacher_free_time_id AS teacherFreeTimeId,
+            p.teacher_id_ AS teacherId,
+            p.free_minutes_ AS freeMinutes,
+            p.course_minutes_ AS courseMinutes,
+            p.subject_id_ AS subjectId,
+            p.subject_name_ AS subjectName,
+            p.subject_price_ AS subjectPrice
+        FROM teacher_free_time f
+                 LEFT JOIN teacher_subject_price p ON f.id_=p.teacher_free_time_id
+        WHERE f.teacher_id_=#{teacherId} AND f.default_flag_=1
+    </select>
 </mapper>

+ 68 - 61
cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderMapper.xml

@@ -1,25 +1,25 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE  mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
 <mapper namespace="com.yonge.cooleshow.biz.dal.dao.UserOrderDao">
-	<resultMap id="BaseResultMap" type="com.yonge.cooleshow.biz.dal.entity.UserOrder">
-            <result column="id_" property="id" />
-	        <result column="order_no_" property="orderNo" />
-	        <result column="user_id_" property="userId" />
-	        <result column="order_name_" property="orderName" />
-            <result column="order_type_" property="orderType" />
-            <result column="order_desc_" property="orderDesc" />
-	        <result column="status_" property="status" />
-	        <result column="original_price_" property="originalPrice" />
-	        <result column="expect_price_" property="expectPrice" />
-	        <result column="actual_price_" property="actualPrice" />
-	        <result column="coupon_amount_" property="couponAmount" />
-	        <result column="plantform_fee_" property="plantformFee" />
-	        <result column="user_note_" property="userNote" />
-	        <result column="create_time_" property="createTime" />
-	        <result column="pay_time_" property="payTime" />
-	        <result column="update_time_" property="updateTime" />
-		</resultMap>  
-    
+    <resultMap id="BaseResultMap" type="com.yonge.cooleshow.biz.dal.entity.UserOrder">
+        <result column="id_" property="id"/>
+        <result column="order_no_" property="orderNo"/>
+        <result column="user_id_" property="userId"/>
+        <result column="order_name_" property="orderName"/>
+        <result column="order_type_" property="orderType"/>
+        <result column="order_desc_" property="orderDesc"/>
+        <result column="status_" property="status"/>
+        <result column="original_price_" property="originalPrice"/>
+        <result column="expect_price_" property="expectPrice"/>
+        <result column="actual_price_" property="actualPrice"/>
+        <result column="coupon_amount_" property="couponAmount"/>
+        <result column="plantform_fee_" property="plantformFee"/>
+        <result column="user_note_" property="userNote"/>
+        <result column="create_time_" property="createTime"/>
+        <result column="pay_time_" property="payTime"/>
+        <result column="update_time_" property="updateTime"/>
+    </resultMap>
+
     <!-- 表字段 -->
     <sql id="baseColumns">
          t.id_ as id
@@ -42,11 +42,11 @@
 
     <select id="detailById" resultType="com.yonge.cooleshow.biz.dal.vo.UserOrderVo">
         SELECT
-            <include refid="baseColumns"/>,
-            p.trans_no_ as transNo,
-            p.fee_amt_ as feeAmt,
-            u.username_ as username,
-            u.phone_ as phone
+        <include refid="baseColumns"/>,
+        p.trans_no_ as transNo,
+        p.fee_amt_ as feeAmt,
+        u.username_ as username,
+        u.phone_ as phone
         FROM user_order t
         left join user_order_payment p on t.order_no_ = p.order_no_
         left join sys_user u on t.user_id_ = u.id_
@@ -55,42 +55,27 @@
 
     <select id="detailApp" resultType="com.yonge.cooleshow.biz.dal.vo.UserOrderVo">
         SELECT
-            t.id_ as id
-            , t.order_no_ as orderNo
-            , t.user_id_ as userId
-            , t.order_name_ as orderName
-            , t.order_type_ as orderType
-            , t.order_desc_ as orderDesc
-            , t.status_ as status
-            , t.original_price_ as originalPrice
-            , t.expect_price_ as expectPrice
-            , t.actual_price_ as actualPrice
-            , t.coupon_amount_ as couponAmount
-            , t.user_note_ as userNote
-            , t.pay_time_ as payTime
-            , t.create_time_ as createTime
-            , p.trans_no_ as transNo
-            , p.pay_channel_ as payChannel
+            <include refid="baseColumns"/>,
+            p.trans_no_ as transNo,
+            p.pay_channel_ as payChannel
         FROM user_order t
         left join user_order_payment p on t.order_no_ = p.order_no_
-        left join sys_user u on t.user_id_ = u.id_
-        <where>
-            <if test="param.id != null">
-                and t.id_ = #{param.id}
-            </if>
-            <if test="param.orderNo != null and param.orderNo != ''">
-                and t.order_no_ = #{param.orderNo}
-            </if>
-        </where>
+        where t.user_id_ = #{param.userId}
+        <if test="param.id != null">
+            and t.id_ = #{param.id}
+        </if>
+        <if test="param.orderNo != null and param.orderNo != ''">
+            and t.order_no_ = #{param.orderNo}
+        </if>
     </select>
 
     <select id="detailByOrderNo" resultType="com.yonge.cooleshow.biz.dal.vo.UserOrderVo">
         SELECT
-            <include refid="baseColumns"/>,
-            p.trans_no_ as transNo,
-            p.fee_amt_ as feeAmt,
-            u.username_ as username,
-            u.phone_ as phone
+        <include refid="baseColumns"/>,
+        p.trans_no_ as transNo,
+        p.fee_amt_ as feeAmt,
+        u.username_ as username,
+        u.phone_ as phone
         FROM user_order t
         left join user_order_payment p on t.order_no_ = p.order_no_
         left join sys_user u on t.user_id_ = u.id_
@@ -100,11 +85,11 @@
 
     <sql id="selectSql">
         SELECT
-            <include refid="baseColumns" />,
-            p.trans_no_ as transNo,
-            p.fee_amt_ as feeAmt,
-            u.username_ as username,
-            u.phone_ as phone
+        <include refid="baseColumns"/>,
+        p.trans_no_ as transNo,
+        p.fee_amt_ as feeAmt,
+        u.username_ as username,
+        u.phone_ as phone
         FROM user_order t
         left join user_order_payment p on t.order_no_ = p.order_no_
         left join sys_user u on t.user_id_ = u.id_
@@ -139,11 +124,11 @@
             </if>
         </where>
         order by t.create_time_ desc
-        </sql>
+    </sql>
 
     <select id="selectPage" resultType="com.yonge.cooleshow.biz.dal.vo.UserOrderVo">
         <include refid="selectSql"/>
-	</select>
+    </select>
     <select id="selectList" resultType="com.yonge.cooleshow.biz.dal.vo.UserOrderVo">
         <include refid="selectSql"/>
     </select>
@@ -154,6 +139,28 @@
         where (t.status_ = 'WAIT_PAY' and t.create_time_ &lt;= date_sub(now(), interval 30 minute))
         or ( t.status_ = 'PAYING' and p.create_time_ &lt;= date_sub(now(), interval 120 minute))
     </select>
+    <select id="getPendingOrder" resultType="com.yonge.cooleshow.biz.dal.vo.UserOrderVo">
+        SELECT
+        <include refid="baseColumns"/>,
+        p.trans_no_ as transNo,
+        p.pay_channel_ as payChannel
+        FROM user_order t
+        left join user_order_payment p on t.order_no_ = p.order_no_
+        where t.status_ in ('WAIT_PAY','PAYING')
+        and t.user_id_ = #{param.userId}
+        and exists (
+        select 1 from user_order_detail d where t.order_no_ = d.order_no_
+        and d.good_type_ = #{param.goodType}
+        <choose>
+            <when test="param.goodType != null and param.goodType == 'PRACTICE'">
+                and d.merch_id_ = #{param.bizId}
+            </when>
+            <otherwise>
+                and d.biz_id_ = #{param.bizId}
+            </otherwise>
+        </choose>
+        )
+    </select>
 
     <update id="updateStatusByOrderNo">
         update user_order set status_ = #{orderStatus},update_time_ = now() where order_no_ = #{orderNo}

+ 4 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderPaymentMapper.xml

@@ -12,6 +12,8 @@
         <result column="status_" property="status" />
         <result column="pay_fail_msg_" property="payFailMsg" />
         <result column="arrival_time_" property="arrivalTime" />
+        <result column="close_status_" property="closeStatus" />
+        <result column="close_fail_msg_" property="closeFailMsg" />
         <result column="create_time_" property="createTime" />
         <result column="update_time_" property="updateTime" />
     </resultMap>
@@ -28,6 +30,8 @@
         , t.status_ as status
         , t.pay_fail_msg_ as payFailMsg
         , t.arrival_time_ as arrivalTime
+        , close_status_ as closeStatus
+        , close_fail_msg_ as closeFailMsg
         , t.create_time_ as createTime
         , t.update_time_ as updateTime
         </sql>

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

@@ -64,6 +64,7 @@
 	</select>
 	<select id="selectPageStudent" resultType="com.yonge.cooleshow.biz.dal.vo.VideoLessonPurchaseStudent">
 		SELECT
+		id_ AS userId,
 		<include refid="userDetail"/>
 		FROM sys_user
 		WHERE id_ IN

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

@@ -247,6 +247,7 @@
 				(SELECT video_lesson_group_id_ FROM video_lesson_purchase_record WHERE student_id_=#{param.studentId} AND order_status_=1)
 			</if>
 		</where>
+		ORDER BY g.create_time_ DESC
 	</select>
 	<select id="queryGroupList" resultType="com.yonge.cooleshow.biz.dal.vo.VideoLessonAuthGroup">
 		SELECT

+ 1 - 1
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/MusicSheetController.java

@@ -146,7 +146,7 @@ public class MusicSheetController extends BaseController {
 
 
     /**
-     * 最近练习
+     * 检查实名认证
      */
     @GetMapping("/realNameAuth/check")
     @ApiOperation(value = "检查实名认证")

+ 9 - 2
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/PaymentController.java

@@ -3,6 +3,7 @@ package com.yonge.cooleshow.student.controller;
 import com.alibaba.fastjson.JSONObject;
 import com.huifu.adapay.core.AdapayCore;
 import com.huifu.adapay.core.util.AdapaySign;
+import com.huifu.adapay.core.util.StringUtil;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.sdk.PaymentSdk;
@@ -75,15 +76,21 @@ public class PaymentController extends BaseController {
             String data = request.getParameter("data");
             //验签传参sign
             String sign = request.getParameter("sign");
+            //回调业务类型
+            String type = request.getParameter("type");
+            log.info("汇付回调,type is {}, res is {}", type, data);
+            if (StringUtil.isEmpty(type)) {
+                log.error("汇付回调参数异常");
+                return;
+            }
             //验签传参publicKey
             String publicKey = AdapayCore.PUBLIC_KEY;
             //验签
             boolean checkSign = AdapaySign.verifySign(data, sign, publicKey);
-            log.info("汇付回调,res is {}", data);
             if (checkSign) {
                 //验签成功逻辑
                 log.info("验签成功");
-                userOrderService.orderCallback(data);
+                userOrderService.orderCallback(data, type);
             }
         } catch (Exception e) {
             e.printStackTrace();

+ 2 - 2
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/StudentCourseScheduleController.java

@@ -152,8 +152,8 @@ public class StudentCourseScheduleController extends BaseController {
 
     @ApiOperation("查询老师陪练课配置")
     @GetMapping("/getTeacherSubjectPrice")
-    public HttpResponseResult<TeacherSubjectPrice> getTeacherSubjectPrice(@NotNull Long teacherId, @NotNull Long subjectId) {
-        return succeed(courseScheduleService.teacherSubjectPrice(teacherId, subjectId));
+    public HttpResponseResult<List<TeacherSubjectPrice>> getTeacherSubjectPrice(@NotNull Long teacherId) {
+        return succeed(courseScheduleService.teacherSubjectPrice(teacherId));
     }
 }
 

+ 50 - 1
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/UserOrderController.java

@@ -8,6 +8,7 @@ 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.CacheNameEnum;
+import com.yonge.cooleshow.biz.dal.enums.GoodTypeEnum;
 import com.yonge.cooleshow.biz.dal.service.UserOrderService;
 import com.yonge.cooleshow.biz.dal.support.DistributedLock;
 import com.yonge.cooleshow.biz.dal.support.PageUtil;
@@ -99,10 +100,38 @@ public class UserOrderController extends BaseController {
         }
     }
 
+    @ApiOperation(value = "通过业务id查询用户正在交易中的订单")
+    @PostMapping("/getPendingOrder")
+    @ApiImplicitParams({
+            @ApiImplicitParam(
+                    name = "goodType",
+                    value = "订单类型:  PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播",
+                    paramType = "query", dataType = "String", required = true
+            ),
+            @ApiImplicitParam(
+                    name = "bizId",
+                    value = "业务id 直播课、陪练课购买为课程组id;陪练课为老师id;单曲点播传曲子id",
+                    paramType = "query", dataType = "Long"
+            )
+    })
+    public HttpResponseResult<UserOrderVo> getPendingOrder(@ApiIgnore @RequestBody OrderSearch query) {
+        if (null == query.getGoodType()
+                || (!GoodTypeEnum.VIP.equals(query.getGoodType()) && null == query.getBizId())) {
+            return HttpResponseResult.failed("参数异常");
+        }
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        query.setUserId(user.getId());
+        return userOrderService.getPendingOrder(query);
+    }
+
     @ApiOperation(value = "取消订单")
     @PostMapping("/orderCancel")
     @ApiImplicitParams({
-            @ApiImplicitParam(name = "orderNo", value = "订单号", paramType = "query", dataType = "String")
+            @ApiImplicitParam(name = "orderNo", value = "订单号", paramType = "query", dataType = "String", required = true),
+            @ApiImplicitParam(name = "reason", value = "取消说明", paramType = "query", dataType = "String")
     })
     public HttpResponseResult<Boolean> orderCancel(@ApiIgnore @RequestBody OrderPayReq payReq, HttpServletRequest request) {
         SysUser user = sysUserFeignService.queryUserInfo();
@@ -187,7 +216,12 @@ public class UserOrderController extends BaseController {
     @GetMapping("/detail/{id}")
     @ApiOperation(value = "通过id查询详情", notes = "传入id")
     public HttpResponseResult<UserOrderVo> detail(@PathVariable("id") Long id) {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
         UserOrder param = new UserOrder();
+        param.setUserId(user.getId());
         param.setId(id);
         UserOrderVo detail = userOrderService.detailApp(param);
         return succeed(detail);
@@ -199,9 +233,24 @@ public class UserOrderController extends BaseController {
     @GetMapping("/detailByOrderNo/{orderNo}")
     @ApiOperation(value = "通过订单号查询详情", notes = "传入orderNo")
     public HttpResponseResult<UserOrderVo> detailByOrderNo(@PathVariable("orderNo") String orderNo) {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
         UserOrder param = new UserOrder();
+        param.setUserId(user.getId());
         param.setOrderNo(orderNo);
         UserOrderVo detail = userOrderService.detailApp(param);
         return succeed(detail);
     }
+
+    /**
+     * 查询单条
+     */
+    @GetMapping("/setSuccessStatus")
+    @ApiOperation(value = "完成所有订单")
+    public HttpResponseResult<Boolean> setSuccessStatus() {
+        userOrderService.setSuccessStatus();
+        return succeed(true);
+    }
 }

+ 0 - 1
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/VideoLessonController.java

@@ -12,7 +12,6 @@ import com.yonge.cooleshow.biz.dal.service.VideoLessonGroupService;
 import com.yonge.cooleshow.biz.dal.support.PageUtil;
 import com.yonge.cooleshow.biz.dal.vo.LessonGroupVo;
 import com.yonge.cooleshow.biz.dal.vo.VideoLessonEvaluateVo;
-import com.yonge.cooleshow.biz.dal.vo.VideoLessonGroupVo;
 import com.yonge.cooleshow.biz.dal.vo.VideoLessonStudentVo;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;

+ 16 - 1
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/UserWithdrawalController.java

@@ -16,10 +16,13 @@ import com.yonge.cooleshow.common.page.PageInfo;
 import com.yonge.toolset.utils.date.DateUtil;
 import com.yonge.toolset.utils.string.StringUtil;
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.web.bind.annotation.*;
+import springfox.documentation.annotations.ApiIgnore;
 
 import javax.validation.Valid;
 import java.time.LocalDate;
@@ -59,7 +62,19 @@ public class UserWithdrawalController extends BaseController {
 
     @PostMapping("/withdrawalPage")
     @ApiOperation(value = "提现记录")
-    public HttpResponseResult<PageInfo<UserWithdrawalVo>> withdrawalPage(@RequestBody TeacherWithdrawalSearch query) {
+    @ApiImplicitParams({
+            @ApiImplicitParam(
+                    name = "status",
+                    value = "状态 DOING、审核中 PASS、通过 UNPASS、不通过",
+                    paramType = "query", dataType = "String"
+            ),
+            @ApiImplicitParam(
+                    name = "searchDate",
+                    value = "查询时间(yyyy-mm)",
+                    paramType = "query", dataType = "String"
+            )
+    })
+    public HttpResponseResult<PageInfo<UserWithdrawalVo>> withdrawalPage(@ApiIgnore @RequestBody TeacherWithdrawalSearch query) {
         SysUser user = sysUserFeignService.queryUserInfo();
         if (user == null || null == user.getId()) {
             return failed(HttpStatus.FORBIDDEN, "请登录");

+ 42 - 0
toolset/thirdparty-component/src/main/java/com/yonge/toolset/thirdparty/entity/UploadSign.java

@@ -0,0 +1,42 @@
+package com.yonge.toolset.thirdparty.entity;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Author: cy
+ * @Date: 2022/4/27
+ */
+public class UploadSign implements Serializable {
+    private String fileName;
+    
+    private Map<String, String> postData;
+    
+    private List<String> unknowValueField;
+
+    public String getFileName() {
+        return fileName;
+    }
+
+    public void setFileName(String fileName) {
+        this.fileName = fileName;
+    }
+
+    public Map<String, String> getPostData() {
+        return postData;
+    }
+
+    public void setPostData(Map<String, String> postData) {
+        this.postData = postData;
+    }
+
+    public List<String> getUnknowValueField() {
+        return unknowValueField;
+    }
+
+    public void setUnknowValueField(List<String> unknowValueField) {
+        this.unknowValueField = unknowValueField;
+    }
+}
+

+ 42 - 28
toolset/thirdparty-component/src/main/java/com/yonge/toolset/thirdparty/storage/StoragePlugin.java

@@ -1,35 +1,49 @@
 package com.yonge.toolset.thirdparty.storage;
 
+import com.ksyun.ks3.dto.PostObjectFormFields;
+import com.yonge.toolset.thirdparty.entity.UploadSign;
+
 import java.io.File;
 import java.io.IOException;
 
 public interface StoragePlugin {
-	
-	String getName();
-
-	/**
-	 * 上传文件
-	 * @param folderName 文件夹
-	 * @param file 需要上传的文件
-	 * @return 返回文件路径
-	 */
-	String uploadFile(String folderName, File file);
-
-	/**
-	 * 上传文件
-	 * @param folderName 文件夹
-	 * @param file 需要上传的文件
-	 * @param delLocalFile 删除本地文件
-	 * @return 返回文件路径
-	 */
-	String asyncUploadFile(String folderName, File file, boolean delLocalFile);
-
-	/**
-	 * 下载文件
-	 * @param folderName 文件夹
-	 * @param fileName 文件名称
-	 * @return 返回文件内容
-	 * @throws IOException
-	 */
-	byte[] getFile(String folderName, String fileName) throws IOException;
+
+    String getName();
+
+    /**
+     * 上传文件
+     *
+     * @param folderName 文件夹
+     * @param file       需要上传的文件
+     * @return 返回文件路径
+     */
+    String uploadFile(String folderName, File file);
+
+    /**
+     * 上传文件
+     *
+     * @param folderName   文件夹
+     * @param file         需要上传的文件
+     * @param delLocalFile 删除本地文件
+     * @return 返回文件路径
+     */
+    String asyncUploadFile(String folderName, File file, boolean delLocalFile);
+
+    /**
+     * 下载文件
+     *
+     * @param folderName 文件夹
+     * @param fileName   文件名称
+     * @return 返回文件内容
+     * @throws IOException
+     */
+    byte[] getFile(String folderName, String fileName) throws IOException;
+
+    /**
+     * 获取上传文件签名
+     *
+     * @param uploadSign
+     * @return
+     */
+    PostObjectFormFields getUploadSign(UploadSign uploadSign);
 }

+ 35 - 28
toolset/thirdparty-component/src/main/java/com/yonge/toolset/thirdparty/storage/StoragePluginContext.java

@@ -2,8 +2,11 @@ package com.yonge.toolset.thirdparty.storage;
 
 import java.io.File;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
+import com.ksyun.ks3.dto.PostObjectFormFields;
+import com.yonge.toolset.thirdparty.entity.UploadSign;
 import org.springframework.stereotype.Component;
 
 import com.yonge.toolset.thirdparty.exception.ThirdpartyException;
@@ -11,33 +14,37 @@ import com.yonge.toolset.thirdparty.exception.ThirdpartyException;
 @Component
 public class StoragePluginContext {
 
-	private static final Map<String, StoragePlugin> mapper = new HashMap<String, StoragePlugin>();
-	
-	public static void addStoragePlugin(StoragePlugin storagePlugin) {
-		if (mapper.containsKey(storagePlugin.getName())) {
-			throw new ThirdpartyException("存储插件:{}已存在", storagePlugin.getName());
-		}
-		mapper.put(storagePlugin.getName(), storagePlugin);
-	}
-	
-	public String uploadFile(String storagePluginName, String folderName, File file){
-		StoragePlugin StoragePlugin = getStoragePlugin(storagePluginName);
-		return StoragePlugin.uploadFile(folderName, file);
-	}
-	
-	public String asyncUploadFile(String storagePluginName, String folderName, File file, boolean delLocalFile){
-		StoragePlugin StoragePlugin = getStoragePlugin(storagePluginName);
-		return StoragePlugin.asyncUploadFile(folderName, file, delLocalFile);
-	}
-
-	private StoragePlugin getStoragePlugin(String storagePluginName) {
-		StoragePlugin storagePlugin = mapper.get(storagePluginName);
-
-		if (storagePlugin == null) {
-			throw new ThirdpartyException("存储插件:{}不存在", storagePluginName);
-		}
-
-		return storagePlugin;
-	}
+    private static final Map<String, StoragePlugin> mapper = new HashMap<String, StoragePlugin>();
 
+    public static void addStoragePlugin(StoragePlugin storagePlugin) {
+        if (mapper.containsKey(storagePlugin.getName())) {
+            throw new ThirdpartyException("存储插件:{}已存在", storagePlugin.getName());
+        }
+        mapper.put(storagePlugin.getName(), storagePlugin);
+    }
+
+    public String uploadFile(String storagePluginName, String folderName, File file) {
+        StoragePlugin StoragePlugin = getStoragePlugin(storagePluginName);
+        return StoragePlugin.uploadFile(folderName, file);
+    }
+
+    public String asyncUploadFile(String storagePluginName, String folderName, File file, boolean delLocalFile) {
+        StoragePlugin StoragePlugin = getStoragePlugin(storagePluginName);
+        return StoragePlugin.asyncUploadFile(folderName, file, delLocalFile);
+    }
+
+    public PostObjectFormFields getUploadSign(String storagePluginName, UploadSign uploadSign) {
+        StoragePlugin StoragePlugin = getStoragePlugin(storagePluginName);
+        return StoragePlugin.getUploadSign(uploadSign);
+    }
+
+    private StoragePlugin getStoragePlugin(String storagePluginName) {
+        StoragePlugin storagePlugin = mapper.get(storagePluginName);
+
+        if (storagePlugin == null) {
+            throw new ThirdpartyException("存储插件:{}不存在", storagePluginName);
+        }
+
+        return storagePlugin;
+    }
 }

+ 187 - 138
toolset/thirdparty-component/src/main/java/com/yonge/toolset/thirdparty/storage/provider/AliyunOssStoragePlugin.java

@@ -2,8 +2,17 @@ package com.yonge.toolset.thirdparty.storage.provider;
 
 import java.io.File;
 import java.io.IOException;
-
+import java.util.List;
+import java.util.Map;
+
+import com.alibaba.fastjson.JSON;
+import com.ksyun.ks3.dto.PostObjectFormFields;
+import com.ksyun.ks3.service.Ks3;
+import com.ksyun.ks3.service.Ks3Client;
+import com.ksyun.ks3.service.Ks3ClientConfig;
+import com.yonge.toolset.thirdparty.entity.UploadSign;
 import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.util.IOUtils;
 import org.springframework.beans.factory.DisposableBean;
 import org.springframework.beans.factory.InitializingBean;
@@ -20,141 +29,181 @@ import com.yonge.toolset.thirdparty.storage.StoragePluginContext;
 @Component
 public class AliyunOssStoragePlugin implements StoragePlugin, InitializingBean, DisposableBean {
 
-	public final static String PLUGIN_NAME = "Aliyun";
-
-	@Value("${storage.oss.endpoint:oss-cn-beijing.aliyuncs.com}")
-	private String endpoint;
-
-	@Value("${storage.oss.accessKeyId:LTAI4Fdhxwfo7FsBDZKK8Wfv}")
-	private String accessKeyId;
-
-	@Value("${storage.oss.accessKeySecret:ERRma4P9VWbD98n93gspnZXmoq7rn5}")
-	private String accessKeySecret;
-
-	@Value("${storage.oss.bucketName:daya-online}")
-	private String bucketName;
-
-	private OSSClient ossClient;
-
-	public String getName() {
-		return PLUGIN_NAME;
-	}
-
-	@Override
-	public void afterPropertiesSet() throws Exception {
-		// 创建ClientConfiguration。ClientConfiguration是OSSClient的配置类,可配置代理、连接超时、最大连接数等参数。
-		ClientConfiguration conf = new ClientConfiguration();
-
-		// 设置OSSClient允许打开的最大HTTP连接数,默认为1024个。
-		conf.setMaxConnections(200);
-		// 设置Socket层传输数据的超时时间,默认为50000毫秒。
-		conf.setSocketTimeout(10000);
-		// 设置建立连接的超时时间,默认为50000毫秒。
-		conf.setConnectionTimeout(10000);
-		// 设置从连接池中获取连接的超时时间(单位:毫秒),默认不超时。
-		conf.setConnectionRequestTimeout(1000);
-		// 设置连接空闲超时时间。超时则关闭连接,默认为60000毫秒。
-		conf.setIdleConnectionTime(10000);
-		// 设置失败请求重试次数,默认为3次。
-		conf.setMaxErrorRetry(5);
-		// 设置是否支持将自定义域名作为Endpoint,默认支持。
-		conf.setSupportCname(true);
-
-		ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret, conf);
-		
-		StoragePluginContext.addStoragePlugin(this);
-	}
-
-	@Override
-	public String uploadFile(String folderName, File file) {
-		if (!file.exists()) {
-			throw new ThirdpartyException("需要上传的文件[{}]不存在", file.getAbsolutePath());
-		}
-
-		if (folderName.endsWith("/")) {
-			folderName = folderName.substring(0, folderName.length() - 1);
-		}
-
-		ossClient.putObject(bucketName, folderName + "/" + file.getName(), file);
-
-		return "https://" + bucketName + "." + endpoint + "/" + folderName + "/" + file.getName();
-	}
-
-	@Override
-	public String asyncUploadFile(String folderName, File file, boolean delLocalFile) {
-		if (!file.exists()) {
-			throw new ThirdpartyException("需要上传的文件[{}]不存在", file.getAbsolutePath());
-		}
-
-		if (folderName.endsWith("/")) {
-			folderName = folderName.substring(0, folderName.length() - 1);
-		}
-		
-		final String dir = folderName;
-		
-		Thread thread = new Thread(new Runnable() {
-			
-			@Override
-			public void run() {
-				ossClient.putObject(bucketName, dir + "/" + file.getName(), file);
-				if(delLocalFile){
-					FileUtils.deleteQuietly(file);
-				}
-			}
-		});
-		thread.start();
-
-		return "https://" + bucketName + "." + endpoint + "/" + folderName + "/" + file.getName();
-	}
-
-	@Override
-	public byte[] getFile(String folderName, String fileName) throws IOException {
-		OSSObject ossObject = ossClient.getObject(bucketName, folderName + "/" + fileName);
-		try {
-			return IOUtils.toByteArray(ossObject.getObjectContent());
-		} finally {
-			if (ossObject != null) {
-				ossObject.close();
-			}
-		}
-	}
-
-	@Override
-	public void destroy() throws Exception {
-		if (ossClient != null) {
-			ossClient.shutdown();
-		}
-	}
-
-	public void setEndpoint(String endpoint) {
-		this.endpoint = endpoint;
-	}
-
-	public void setAccessKeyId(String accessKeyId) {
-		this.accessKeyId = accessKeyId;
-	}
-
-	public void setAccessKeySecret(String accessKeySecret) {
-		this.accessKeySecret = accessKeySecret;
-	}
-
-	public void setBucketName(String bucketName) {
-		this.bucketName = bucketName;
-	}
-
-	public static void main(String[] args) throws Exception {
-		AliyunOssStoragePlugin aliyunOssStorageService = new AliyunOssStoragePlugin();
-		aliyunOssStorageService.setAccessKeyId("LTAIwZW9XqrfsZ4r");
-		aliyunOssStorageService.setAccessKeySecret("5uDsNZmHMxcnxav8w9byII4zcPpu5G");
-		aliyunOssStorageService.setBucketName("yooma-test");
-		aliyunOssStorageService.setEndpoint("oss-cn-beijing.aliyuncs.com");
-		aliyunOssStorageService.afterPropertiesSet();
-
-		File file = new File("e:/var/2.jpg");
-		System.out.println(aliyunOssStorageService.uploadFile("aaa", file));
-
-		System.err.println("***********" + aliyunOssStorageService.getFile("aaa", file.getName()).length);
-
-		aliyunOssStorageService.destroy();
-	}
+    public final static String PLUGIN_NAME = "Aliyun";
+
+    @Value("${storage.oss.endpoint:oss-cn-beijing.aliyuncs.com}")
+    private String endpoint;
+
+    @Value("${storage.oss.accessKeyId:LTAI4Fdhxwfo7FsBDZKK8Wfv}")
+    private String accessKeyId;
+
+    @Value("${storage.oss.accessKeySecret:ERRma4P9VWbD98n93gspnZXmoq7rn5}")
+    private String accessKeySecret;
+
+    @Value("${storage.oss.bucketName:daya-online}")
+    private String bucketName;
+
+    private OSSClient ossClient;
+
+    public String getName() {
+        return PLUGIN_NAME;
+    }
+
+    @Override
+    public void afterPropertiesSet() throws Exception {
+        // 创建ClientConfiguration。ClientConfiguration是OSSClient的配置类,可配置代理、连接超时、最大连接数等参数。
+        ClientConfiguration conf = new ClientConfiguration();
+
+        // 设置OSSClient允许打开的最大HTTP连接数,默认为1024个。
+        conf.setMaxConnections(200);
+        // 设置Socket层传输数据的超时时间,默认为50000毫秒。
+        conf.setSocketTimeout(10000);
+        // 设置建立连接的超时时间,默认为50000毫秒。
+        conf.setConnectionTimeout(10000);
+        // 设置从连接池中获取连接的超时时间(单位:毫秒),默认不超时。
+        conf.setConnectionRequestTimeout(1000);
+        // 设置连接空闲超时时间。超时则关闭连接,默认为60000毫秒。
+        conf.setIdleConnectionTime(10000);
+        // 设置失败请求重试次数,默认为3次。
+        conf.setMaxErrorRetry(5);
+        // 设置是否支持将自定义域名作为Endpoint,默认支持。
+        conf.setSupportCname(true);
+
+        ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret, conf);
+
+        StoragePluginContext.addStoragePlugin(this);
+    }
+
+    @Override
+    public String uploadFile(String folderName, File file) {
+        if (!file.exists()) {
+            throw new ThirdpartyException("需要上传的文件[{}]不存在", file.getAbsolutePath());
+        }
+
+        if (folderName.endsWith("/")) {
+            folderName = folderName.substring(0, folderName.length() - 1);
+        }
+
+        ossClient.putObject(bucketName, folderName + "/" + file.getName(), file);
+
+        return "https://" + bucketName + "." + endpoint + "/" + folderName + "/" + file.getName();
+    }
+
+    @Override
+    public String asyncUploadFile(String folderName, File file, boolean delLocalFile) {
+        if (!file.exists()) {
+            throw new ThirdpartyException("需要上传的文件[{}]不存在", file.getAbsolutePath());
+        }
+
+        if (folderName.endsWith("/")) {
+            folderName = folderName.substring(0, folderName.length() - 1);
+        }
+
+        final String dir = folderName;
+
+        Thread thread = new Thread(new Runnable() {
+
+            @Override
+            public void run() {
+                ossClient.putObject(bucketName, dir + "/" + file.getName(), file);
+                if (delLocalFile) {
+                    FileUtils.deleteQuietly(file);
+                }
+            }
+        });
+        thread.start();
+
+        return "https://" + bucketName + "." + endpoint + "/" + folderName + "/" + file.getName();
+    }
+
+    @Override
+    public byte[] getFile(String folderName, String fileName) throws IOException {
+        OSSObject ossObject = ossClient.getObject(bucketName, folderName + "/" + fileName);
+        try {
+            return IOUtils.toByteArray(ossObject.getObjectContent());
+        } finally {
+            if (ossObject != null) {
+                ossObject.close();
+            }
+        }
+    }
+
+    @Override
+    public PostObjectFormFields getUploadSign(UploadSign uploadSign) {
+        //要上传的文件名称,不包含路径信息
+        String fileName = uploadSign.getFileName();
+        //可以确定值得表单项
+        Map<String, String> postData = uploadSign.getPostData();
+        //无法确定值得表单项
+        List<String> unknowValueField = uploadSign.getUnknowValueField();
+
+        Ks3ClientConfig config = new Ks3ClientConfig();
+        // 设置域名
+        config.setEndpoint(endpoint);
+        // 创建Ks3Client实例
+        Ks3 client = new Ks3Client(accessKeyId, accessKeySecret, config);
+
+        /**
+         * 需要用户在postData和unknowValueField中提供所有的除KSSAccessKeyId, signature, file, policy外的所有表单项。否则用生成的签名上传会返回403</br>
+         * 对于用户可以确定表单值的放在 postData中,对于用户无法确定表单值的放在unknownValueField中(比如有的上传控件会添加一些表单项,但表单项的值可能是随机的)</br>
+         */
+        //Map<String, String> postData = new HashMap<String, String>();
+        // 如果使用js sdk上传的时候设置了ACL,请提供以下一行,且值要与SDK中一致,否则删除下面一行代码
+        //postData.put("acl","public-read");
+        // 提供js sdk中的key值
+        //postData.put("key","20150115/中文/${filename}");
+        // 设置无法确定的表单值
+        //List<String> unknowValueField = new ArrayList<String>();
+
+        // js sdk上传的时候会自动加上一个name的表单项,所以下面需要加上这样的代码。
+        unknowValueField.add("name");
+
+        // 如果计算签名时提供的key里不包含${filename}占位符,第二个参数传一个空字符串。
+        String postDataKey = postData.get("key");
+        if (StringUtils.isNotBlank(postDataKey)) {
+            if (postDataKey.indexOf("${filename}") == -1) {
+                return client.postObject(bucketName, "", postData, unknowValueField);
+            }
+        }
+        return client.postObject(bucketName, fileName, postData, unknowValueField);
+    }
+
+    @Override
+    public void destroy() throws Exception {
+        if (ossClient != null) {
+            ossClient.shutdown();
+        }
+    }
+
+    public void setEndpoint(String endpoint) {
+        this.endpoint = endpoint;
+    }
+
+    public void setAccessKeyId(String accessKeyId) {
+        this.accessKeyId = accessKeyId;
+    }
+
+    public void setAccessKeySecret(String accessKeySecret) {
+        this.accessKeySecret = accessKeySecret;
+    }
+
+    public void setBucketName(String bucketName) {
+        this.bucketName = bucketName;
+    }
+
+    public static void main(String[] args) throws Exception {
+        AliyunOssStoragePlugin aliyunOssStorageService = new AliyunOssStoragePlugin();
+        aliyunOssStorageService.setAccessKeyId("LTAIwZW9XqrfsZ4r");
+        aliyunOssStorageService.setAccessKeySecret("5uDsNZmHMxcnxav8w9byII4zcPpu5G");
+        aliyunOssStorageService.setBucketName("yooma-test");
+        aliyunOssStorageService.setEndpoint("oss-cn-beijing.aliyuncs.com");
+        aliyunOssStorageService.afterPropertiesSet();
+
+        File file = new File("e:/var/2.jpg");
+        System.out.println(aliyunOssStorageService.uploadFile("aaa", file));
+
+        System.err.println("***********" + aliyunOssStorageService.getFile("aaa", file.getName()).length);
+
+        aliyunOssStorageService.destroy();
+    }
 }

+ 192 - 146
toolset/thirdparty-component/src/main/java/com/yonge/toolset/thirdparty/storage/provider/KS3StoragePlugin.java

@@ -2,8 +2,14 @@ package com.yonge.toolset.thirdparty.storage.provider;
 
 import java.io.File;
 import java.io.IOException;
+import java.util.List;
+import java.util.Map;
 
+import com.alibaba.fastjson.JSON;
+import com.ksyun.ks3.dto.PostObjectFormFields;
+import com.yonge.toolset.thirdparty.entity.UploadSign;
 import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.util.IOUtils;
 import org.springframework.beans.factory.DisposableBean;
 import org.springframework.beans.factory.InitializingBean;
@@ -27,150 +33,190 @@ import com.yonge.toolset.thirdparty.storage.StoragePluginContext;
 @Component
 public class KS3StoragePlugin implements StoragePlugin, InitializingBean, DisposableBean {
 
-	public final static String PLUGIN_NAME = "Ksyun";
-
-	@Value("${storage.oss.endpoint:ks3-cn-beijing.ksyun.com}")
-	private String endpoint;
-
-	@Value("${storage.oss.accessKeyId:AKLTtTeIbadpRG-pil4S0Q4m-Q}")
-	private String accessKeyId;
-
-	@Value("${storage.oss.accessKeySecret:OB1HmNOfDNW95wHoxMkP6IPFZXormk2ngA800TkvKAw7ozhiJGRqrMnnV8ZrAU3WRQ==}")
-	private String accessKeySecret;
-
-	@Value("${storage.oss.bucketName:daya}")
-	private String bucketName;
-
-	private Ks3 client;
-
-	public String getName() {
-		return PLUGIN_NAME;
-	}
-
-	@Override
-	public void afterPropertiesSet() throws Exception {
-		Ks3ClientConfig config = new Ks3ClientConfig();
-		config.setEndpoint(endpoint);// 如果使用自定义域名,设置endpoint为自定义域名,同时设置domainMode为true
-		/**
-		 * true:表示以自定义域名访问 
-		 * false:表示以KS3的外网域名或内网域名访问
-		 * 默认为false
-		 */
-		config.setDomainMode(false);
-		config.setProtocol(PROTOCOL.http);
-
-		/**
-		 * true表示以   endpoint/{bucket}/{key}的方式访问
-		 * false表示以  {bucket}.endpoint/{key}的方式访问
-		 * 如果domainMode设置为true,pathStyleAccess可忽略设置
-		 */
-		config.setPathStyleAccess(false);
-		HttpClientConfig hconfig = new HttpClientConfig();
-		// 在HttpClientConfig中可以设置httpclient的相关属性,比如代理,超时,重试等。
-		config.setHttpClientConfig(hconfig);
-		client = new Ks3Client(accessKeyId, accessKeySecret, config);
-
-		StoragePluginContext.addStoragePlugin(this);
-	}
-
-	@Override
-	public String uploadFile(String folderName, File file) {
-		if (!file.exists()) {
-			throw new ThirdpartyException("需要上传的文件[{}]不存在", file.getAbsolutePath());
-		}
-
-		if (folderName.endsWith("/")) {
-			folderName = folderName.substring(0, folderName.length() - 1);
-		}
-
-		PutObjectRequest request = new PutObjectRequest(bucketName, folderName + "/" + file.getName(), file);
-
-		// 上传一个公开文件
-		request.setCannedAcl(CannedAccessControlList.PublicRead);
-
-		client.putObject(request);
-
-		return "https://" + bucketName + "." + endpoint + "/" + folderName + "/" + file.getName();
-	}
-
-	@Override
-	public String asyncUploadFile(String folderName, File file, boolean delLocalFile) {
-		if (!file.exists()) {
-			throw new ThirdpartyException("需要上传的文件[{}]不存在", file.getAbsolutePath());
-		}
-
-		if (folderName.endsWith("/")) {
-			folderName = folderName.substring(0, folderName.length() - 1);
-		}
-
-		PutObjectRequest request = new PutObjectRequest(bucketName, folderName + "/" + file.getName(), file);
-
-		// 上传一个公开文件
-		request.setCannedAcl(CannedAccessControlList.PublicRead);
-		
-		Thread thread = new Thread(new Runnable() {
-			
-			@Override
-			public void run() {
-				client.putObject(request);
-				if(delLocalFile){
-					FileUtils.deleteQuietly(file);
-				}
-			}
-		});
-		thread.start();
-
-		return "https://" + bucketName + "." + endpoint + "/" + folderName + "/" + file.getName();
-	}
-
-	@Override
-	public byte[] getFile(String folderName, String fileName) throws IOException {
-		GetObjectRequest request = new GetObjectRequest(bucketName, folderName + "/" + fileName);
-		GetObjectResult result = client.getObject(request);
-
-		Ks3Object object = result.getObject();
-		try {
-			return IOUtils.toByteArray(object.getObjectContent());
-		} finally {
-			if (object != null) {
-				object.close();
-			}
-		}
-	}
-
-	@Override
-	public void destroy() throws Exception {
-	}
-
-	public void setEndpoint(String endpoint) {
-		this.endpoint = endpoint;
-	}
-
-	public void setAccessKeyId(String accessKeyId) {
-		this.accessKeyId = accessKeyId;
-	}
-
-	public void setAccessKeySecret(String accessKeySecret) {
-		this.accessKeySecret = accessKeySecret;
-	}
-
-	public void setBucketName(String bucketName) {
-		this.bucketName = bucketName;
-	}
-
-	public static void main(String[] args) throws Exception {
-		KS3StoragePlugin aliyunOssStorageService = new KS3StoragePlugin();
-		aliyunOssStorageService.setAccessKeyId("LTAIwZW9XqrfsZ4r");
-		aliyunOssStorageService.setAccessKeySecret("5uDsNZmHMxcnxav8w9byII4zcPpu5G");
-		aliyunOssStorageService.setBucketName("yooma-test");
-		aliyunOssStorageService.setEndpoint("oss-cn-beijing.aliyuncs.com");
-		aliyunOssStorageService.afterPropertiesSet();
-
-		File file = new File("e:/var/2.jpg");
-		System.out.println(aliyunOssStorageService.uploadFile("aaa", file));
-
-		System.err.println("***********" + aliyunOssStorageService.getFile("aaa", file.getName()).length);
-
-		aliyunOssStorageService.destroy();
-	}
+    public final static String PLUGIN_NAME = "Ksyun";
+
+    @Value("${storage.oss.endpoint:ks3-cn-beijing.ksyun.com}")
+    private String endpoint;
+
+    @Value("${storage.oss.accessKeyId:AKLTtTeIbadpRG-pil4S0Q4m-Q}")
+    private String accessKeyId;
+
+    @Value("${storage.oss.accessKeySecret:OB1HmNOfDNW95wHoxMkP6IPFZXormk2ngA800TkvKAw7ozhiJGRqrMnnV8ZrAU3WRQ==}")
+    private String accessKeySecret;
+
+    @Value("${storage.oss.bucketName:daya}")
+    private String bucketName;
+
+    private Ks3 client;
+
+    public String getName() {
+        return PLUGIN_NAME;
+    }
+
+    @Override
+    public void afterPropertiesSet() throws Exception {
+        Ks3ClientConfig config = new Ks3ClientConfig();
+        config.setEndpoint(endpoint);// 如果使用自定义域名,设置endpoint为自定义域名,同时设置domainMode为true
+        /**
+         * true:表示以自定义域名访问
+         * false:表示以KS3的外网域名或内网域名访问
+         * 默认为false
+         */
+        config.setDomainMode(false);
+        config.setProtocol(PROTOCOL.http);
+
+        /**
+         * true表示以   endpoint/{bucket}/{key}的方式访问
+         * false表示以  {bucket}.endpoint/{key}的方式访问
+         * 如果domainMode设置为true,pathStyleAccess可忽略设置
+         */
+        config.setPathStyleAccess(false);
+        HttpClientConfig hconfig = new HttpClientConfig();
+        // 在HttpClientConfig中可以设置httpclient的相关属性,比如代理,超时,重试等。
+        config.setHttpClientConfig(hconfig);
+        client = new Ks3Client(accessKeyId, accessKeySecret, config);
+
+        StoragePluginContext.addStoragePlugin(this);
+    }
+
+    @Override
+    public String uploadFile(String folderName, File file) {
+        if (!file.exists()) {
+            throw new ThirdpartyException("需要上传的文件[{}]不存在", file.getAbsolutePath());
+        }
+
+        if (folderName.endsWith("/")) {
+            folderName = folderName.substring(0, folderName.length() - 1);
+        }
+
+        PutObjectRequest request = new PutObjectRequest(bucketName, folderName + "/" + file.getName(), file);
+
+        // 上传一个公开文件
+        request.setCannedAcl(CannedAccessControlList.PublicRead);
+
+        client.putObject(request);
+
+        return "https://" + bucketName + "." + endpoint + "/" + folderName + "/" + file.getName();
+    }
+
+    @Override
+    public String asyncUploadFile(String folderName, File file, boolean delLocalFile) {
+        if (!file.exists()) {
+            throw new ThirdpartyException("需要上传的文件[{}]不存在", file.getAbsolutePath());
+        }
+
+        if (folderName.endsWith("/")) {
+            folderName = folderName.substring(0, folderName.length() - 1);
+        }
+
+        PutObjectRequest request = new PutObjectRequest(bucketName, folderName + "/" + file.getName(), file);
+
+        // 上传一个公开文件
+        request.setCannedAcl(CannedAccessControlList.PublicRead);
+
+        Thread thread = new Thread(new Runnable() {
+
+            @Override
+            public void run() {
+                client.putObject(request);
+                if (delLocalFile) {
+                    FileUtils.deleteQuietly(file);
+                }
+            }
+        });
+        thread.start();
+
+        return "https://" + bucketName + "." + endpoint + "/" + folderName + "/" + file.getName();
+    }
+
+    @Override
+    public byte[] getFile(String folderName, String fileName) throws IOException {
+        GetObjectRequest request = new GetObjectRequest(bucketName, folderName + "/" + fileName);
+        GetObjectResult result = client.getObject(request);
+
+        Ks3Object object = result.getObject();
+        try {
+            return IOUtils.toByteArray(object.getObjectContent());
+        } finally {
+            if (object != null) {
+                object.close();
+            }
+        }
+    }
+
+    @Override
+    public PostObjectFormFields getUploadSign(UploadSign uploadSign) {
+        //要上传的文件名称,不包含路径信息
+        String fileName = uploadSign.getFileName();
+        //可以确定值得表单项
+        Map<String, String> postData = uploadSign.getPostData();
+        //无法确定值得表单项
+        List<String> unknowValueField = uploadSign.getUnknowValueField();
+
+        Ks3ClientConfig config = new Ks3ClientConfig();
+        // 设置域名
+        config.setEndpoint(endpoint);
+        // 创建Ks3Client实例
+        Ks3 client = new Ks3Client(accessKeyId, accessKeySecret, config);
+
+        /**
+         * 需要用户在postData和unknowValueField中提供所有的除KSSAccessKeyId, signature, file, policy外的所有表单项。否则用生成的签名上传会返回403</br>
+         * 对于用户可以确定表单值的放在 postData中,对于用户无法确定表单值的放在unknownValueField中(比如有的上传控件会添加一些表单项,但表单项的值可能是随机的)</br>
+         */
+        //Map<String, String> postData = new HashMap<String, String>();
+        // 如果使用js sdk上传的时候设置了ACL,请提供以下一行,且值要与SDK中一致,否则删除下面一行代码
+        //postData.put("acl","public-read");
+        // 提供js sdk中的key值
+        //postData.put("key","20150115/中文/${filename}");
+        // 设置无法确定的表单值
+        //List<String> unknowValueField = new ArrayList<String>();
+
+        // js sdk上传的时候会自动加上一个name的表单项,所以下面需要加上这样的代码。
+        unknowValueField.add("name");
+
+        // 如果计算签名时提供的key里不包含${filename}占位符,第二个参数传一个空字符串。
+        String postDataKey = postData.get("key");
+        if (StringUtils.isNotBlank(postDataKey)) {
+            if (postDataKey.indexOf("${filename}") == -1) {
+                return client.postObject(bucketName, "", postData, unknowValueField);
+            }
+        }
+        return client.postObject(bucketName, fileName, postData, unknowValueField);
+    }
+
+    @Override
+    public void destroy() throws Exception {
+    }
+
+    public void setEndpoint(String endpoint) {
+        this.endpoint = endpoint;
+    }
+
+    public void setAccessKeyId(String accessKeyId) {
+        this.accessKeyId = accessKeyId;
+    }
+
+    public void setAccessKeySecret(String accessKeySecret) {
+        this.accessKeySecret = accessKeySecret;
+    }
+
+    public void setBucketName(String bucketName) {
+        this.bucketName = bucketName;
+    }
+
+    public static void main(String[] args) throws Exception {
+        KS3StoragePlugin aliyunOssStorageService = new KS3StoragePlugin();
+        aliyunOssStorageService.setAccessKeyId("LTAIwZW9XqrfsZ4r");
+        aliyunOssStorageService.setAccessKeySecret("5uDsNZmHMxcnxav8w9byII4zcPpu5G");
+        aliyunOssStorageService.setBucketName("yooma-test");
+        aliyunOssStorageService.setEndpoint("oss-cn-beijing.aliyuncs.com");
+        aliyunOssStorageService.afterPropertiesSet();
+
+        File file = new File("e:/var/2.jpg");
+        System.out.println(aliyunOssStorageService.uploadFile("aaa", file));
+
+        System.err.println("***********" + aliyunOssStorageService.getFile("aaa", file.getName()).length);
+
+        aliyunOssStorageService.destroy();
+    }
 }