فهرست منبع

Merge remote-tracking branch 'origin/master'

liujunchi 3 سال پیش
والد
کامیت
7bfe3667e8
45فایلهای تغییر یافته به همراه1302 افزوده شده و 843 حذف شده
  1. 0 1
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/web/controller/TokenController.java
  2. 5 12
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/ContractTemplateController.java
  3. 27 2
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/CourseGroupController.java
  4. 1 7
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ContractTemplateDao.java
  5. 42 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseGroupDao.java
  6. 5 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/SysUserContractRecordDao.java
  7. 0 9
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserOpenContractRecordDao.java
  8. 1 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserWithdrawalDao.java
  9. 22 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/CourseGroupSearch.java
  10. 0 102
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOpenContractRecord.java
  11. 3 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/ContractTypeEnum.java
  12. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/MessageTypeEnum.java
  13. 32 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/OpenContractEnum.java
  14. 0 79
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/props/WithdrawalProperties.java
  15. 143 26
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/sdk/WithdrawSdk.java
  16. 3 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ContractTemplateService.java
  17. 33 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseGroupService.java
  18. 0 47
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/LingXinService.java
  19. 10 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/SysUserContractRecordService.java
  20. 1 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TeacherService.java
  21. 6 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserWithdrawalService.java
  22. 139 139
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ContractTemplateServiceImpl.java
  23. 20 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseGroupServiceImpl.java
  24. 0 236
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/LingXinServiceImpl.java
  25. 8 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/SysUserContractRecordServiceImpl.java
  26. 2 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherServiceImpl.java
  27. 29 18
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserWithdrawalServiceImpl.java
  28. 86 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/CourseGroupStudentVo.java
  29. 115 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/CourseGroupVideoVo.java
  30. 12 6
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/CourseSchedulePaymentVo.java
  31. 106 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/CourseSchedulePlanVo.java
  32. 33 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/UserOrderDetailVo.java
  33. 10 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/UserWithdrawalVo.java
  34. 8 7
      cooleshow-user/user-biz/src/main/resources/config/mybatis/ContractTemplateMapper.xml
  35. 134 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseGroupMapper.xml
  36. 19 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/SysUserContractRecordMapper.xml
  37. 6 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderDetailMapper.xml
  38. 2 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserWithdrawalMapper.xml
  39. 1 2
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/SysUserContractRecordController.java
  40. 1 1
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/config/ResourceServerConfig.java
  41. 94 0
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/SysUserContractRecordController.java
  42. 0 28
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/TeacherSysUserContractRecordController.java
  43. 29 5
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/UserWithdrawalController.java
  44. 110 96
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/WithdrawController.java
  45. 2 2
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/model/Payment.java

+ 0 - 1
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/web/controller/TokenController.java

@@ -75,7 +75,6 @@ public class TokenController extends BaseController {
     public SysUser queryUserInfo() {
 		AuthUser authUser = SecurityUtils.getUser();
 		if(authUser != null){
-			SysUser sysUser = userService.get(authUser.getUserId());
 			return userService.get(authUser.getUserId());
 		}
 		return null;

+ 5 - 12
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/ContractTemplateController.java

@@ -1,18 +1,16 @@
 package com.yonge.cooleshow.admin.controller;
 
+import com.yonge.cooleshow.biz.dal.enums.ContractTypeEnum;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiOperation;
 
+import io.swagger.annotations.ApiParam;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.MediaType;
 import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
@@ -53,13 +51,8 @@ public class ContractTemplateController extends BaseController {
 	@ApiOperation("查询最新启用的协议模板")
 	@GetMapping(value = "/queryLatestContractTemplate")
 	@PreAuthorize("@pcs.hasPermissions('contractTemplate/queryLatestContractTemplate')")
-	public HttpResponseResult<ContractTemplate> queryLatestContractTemplate() {
-		SysUser sysUser = sysUserFeignService.queryUserInfo();
-
-		if (sysUser == null || sysUser.getId() == null) {
-			return failed(HttpStatus.FORBIDDEN, "请登录");
-		}
-		return succeed(contractTemplateService.queryLatestContractTemplate(null, null));
+	public HttpResponseResult<ContractTemplate> queryLatestContractTemplate(@ApiParam(value = "业务类型 REGISTER 注册 COURSES 课程购买 PRODUCT 产品 WITHDRAW 提现", required = true) @RequestParam("contractType") ContractTypeEnum contractType) {
+		return succeed(contractTemplateService.queryLatestContractTemplate(contractType));
 	}
 
 	@ApiOperation("新增")

+ 27 - 2
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/CourseGroupController.java

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.admin.controller;
 
 import com.yonge.cooleshow.biz.dal.dto.search.CourseGroupDetailSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.CourseGroupSearch;
+import com.yonge.cooleshow.biz.dal.entity.VideoLessonGroupDetail;
 import com.yonge.cooleshow.biz.dal.service.CourseGroupService;
 import com.yonge.cooleshow.biz.dal.support.PageUtil;
 import com.yonge.cooleshow.biz.dal.vo.*;
@@ -45,8 +46,32 @@ public class CourseGroupController extends BaseController {
     }
 
     @ApiOperation(value = "课程组管理-直播课-购买学员")
-    @PostMapping(value = "/live/student")
+    @PostMapping(value = "/live/studentPayment")
     public HttpResponseResult<PageInfo<CourseSchedulePaymentVo>> selectLiveGroupStudent(@RequestBody CourseGroupSearch search) {
         return succeed(PageUtil.pageInfo(courseGroupService.selectLiveGroupStudent(PageUtil.getPage(search), search)));
     }
-}
+
+    @ApiOperation(value = "课程组管理-直播课-教学计划")
+    @PostMapping(value = "/live/plan")
+    public HttpResponseResult<PageInfo<CourseSchedulePlanVo>> selectLiveGroupPlan(@RequestBody CourseGroupSearch search) {
+        return succeed(PageUtil.pageInfo(courseGroupService.selectLiveGroupPlan(PageUtil.getPage(search), search)));
+    }
+
+    @ApiOperation(value = "课程组管理-视频课")
+    @PostMapping(value = "/video")
+    public HttpResponseResult<PageInfo<CourseGroupVideoVo>> selectVideoGroup(@RequestBody CourseGroupSearch search) {
+        return succeed(PageUtil.pageInfo(courseGroupService.selectVideoGroup(PageUtil.getPage(search), search)));
+    }
+
+    @ApiOperation(value = "课程组管理-视频课-购买学员")
+    @PostMapping(value = "/video/studentPayment")
+    public HttpResponseResult<PageInfo<CourseGroupStudentVo>> selectVideoGroupStudent(@RequestBody CourseGroupSearch search) {
+        return succeed(PageUtil.pageInfo(courseGroupService.selectVideoGroupStudent(PageUtil.getPage(search), search)));
+    }
+
+    @ApiOperation(value = "课程组管理-视频课-教学计划")
+    @PostMapping(value = "/video/plan")
+    public HttpResponseResult<PageInfo<VideoLessonGroupDetail>> selectVideoGroupPlan(@RequestBody CourseGroupSearch search) {
+        return succeed(PageUtil.pageInfo(courseGroupService.selectVideoGroupPlan(PageUtil.getPage(search), search)));
+    }
+}

+ 1 - 7
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ContractTemplateDao.java

@@ -13,13 +13,7 @@ public interface ContractTemplateDao extends BaseDAO<Integer, ContractTemplate>
 
 	List<ContractTemplateDto> queryPageList(Map<String, Object> params);
 	
-	/**
-	 * 获取最新协议模板
-	 * @param owner
-	 * @param type
-	 * @return
-	 */
-	ContractTemplate queryLatestContractTemplate(@Param("owner") String owner, @Param("type") String type);
+	ContractTemplate queryLatestContractTemplate( @Param("type") String type);
 	
 	int disableContract(@Param("owner") String owner, @Param("type") String type);
 	

+ 42 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseGroupDao.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.yonge.cooleshow.biz.dal.dto.search.*;
 import com.yonge.cooleshow.biz.dal.entity.CourseGroup;
+import com.yonge.cooleshow.biz.dal.entity.VideoLessonGroupDetail;
 import com.yonge.cooleshow.biz.dal.vo.*;
 import org.apache.ibatis.annotations.Param;
 
@@ -122,7 +123,7 @@ public interface CourseGroupDao extends BaseMapper<CourseGroup> {
                                              @Param("param") CourseGroupSearch search);
 
     /**
-     * 查询购买学员
+     * 查询直播课购买学员
      *
      * @param page
      * @param search
@@ -130,5 +131,45 @@ public interface CourseGroupDao extends BaseMapper<CourseGroup> {
      */
     IPage<CourseSchedulePaymentVo> selectLiveGroupStudent(@Param("page") IPage<CourseSchedulePaymentVo> page,
                                                           @Param("param") CourseGroupSearch search);
+
+    /**
+     * 查询直播课教学计划
+     *
+     * @param page
+     * @param search
+     * @return
+     */
+    IPage<CourseSchedulePlanVo> selectLiveGroupPlan(@Param("page") IPage<CourseSchedulePlanVo> page,
+                                                    @Param("param") CourseGroupSearch search);
+
+    /**
+     * 查询视频课
+     *
+     * @param page
+     * @param search
+     * @return
+     */
+    IPage<CourseGroupVideoVo> selectVideoGroup(@Param("page") IPage<CourseGroupVideoVo> page,
+                                               @Param("param") CourseGroupSearch search);
+
+    /**
+     * 查询视频课购课学员
+     *
+     * @param page
+     * @param search
+     * @return
+     */
+    IPage<CourseGroupStudentVo> selectVideoGroupStudent(@Param("page") IPage<CourseGroupStudentVo> page,
+                                                        @Param("param") CourseGroupSearch search);
+
+    /**
+     * 查询视频课教学计划
+     *
+     * @param page
+     * @param search
+     * @return
+     */
+    IPage<VideoLessonGroupDetail> selectVideoGroupPlan(@Param("page") IPage<VideoLessonGroupDetail> page,
+                                                       @Param("param") CourseGroupSearch search);
 }
 

+ 5 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/SysUserContractRecordDao.java

@@ -2,9 +2,11 @@ package com.yonge.cooleshow.biz.dal.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.yonge.cooleshow.biz.dal.entity.SysUserContractRecord;
+import com.yonge.cooleshow.biz.dal.enums.ContractTypeEnum;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * 用户协议记录表-一个用户一种协议一个版本一条记录(SysUserContractRecord)表数据库访问层
@@ -16,5 +18,8 @@ public interface SysUserContractRecordDao extends BaseMapper<SysUserContractReco
 
     int insertBatch(@Param("entities") List<SysUserContractRecord> entities);
 
+    Boolean checkContractSign(@Param("userId")Long userId,@Param("contractType") String contractType);
+
+    void contractCallbackUpdate(@Param("param") Map<String, Object> map);
 }
 

+ 0 - 9
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserOpenContractRecordDao.java

@@ -1,9 +0,0 @@
-package com.yonge.cooleshow.biz.dal.dao;
-
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.yonge.cooleshow.biz.dal.entity.UserOpenContractRecord;
-
-
-public interface UserOpenContractRecordDao extends BaseMapper<UserOpenContractRecord>{
-
-}

+ 1 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserWithdrawalDao.java

@@ -1,6 +1,7 @@
 package com.yonge.cooleshow.biz.dal.dao;
 
 import java.util.List;
+import java.util.Map;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;

+ 22 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/CourseGroupSearch.java

@@ -23,9 +23,15 @@ public class CourseGroupSearch extends QueryInfo {
     @ApiModelProperty("课程组id")
     private Long groupId;
 
+    @ApiModelProperty("课程id")
+    private Long courseId;
+
     @ApiModelProperty(value = "课程状态")
     private String status;
 
+    @ApiModelProperty(value = "结算状态")
+    private String salaryStatus;
+
     @ApiModelProperty(value = "订单号")
     private String orderNo;
 
@@ -39,6 +45,22 @@ public class CourseGroupSearch extends QueryInfo {
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date endTime;
 
+    public Long getCourseId() {
+        return courseId;
+    }
+
+    public void setCourseId(Long courseId) {
+        this.courseId = courseId;
+    }
+
+    public String getSalaryStatus() {
+        return salaryStatus;
+    }
+
+    public void setSalaryStatus(String salaryStatus) {
+        this.salaryStatus = salaryStatus;
+    }
+
     public Long getGroupId() {
         return groupId;
     }

+ 0 - 102
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOpenContractRecord.java

@@ -1,102 +0,0 @@
-package com.yonge.cooleshow.biz.dal.entity;
-
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-
-import java.io.Serializable;
-import java.util.Date;
-import com.fasterxml.jackson.annotation.JsonFormat;
-import org.springframework.format.annotation.DateTimeFormat;
-
-/**
- * 用户签署三方协议记录表
- */
-@TableName("user_open_contract_record")
-@ApiModel(value = "UserOpenContractRecord对象", description = "用户签署三方协议记录表")
-public class UserOpenContractRecord implements Serializable {
-	private static final long serialVersionUID = 1L;
-    @ApiModelProperty("主键 ")
-    @TableId(value = "id_", type = IdType.AUTO)
-    private Long id;
-    @ApiModelProperty("用户id ")
-	@TableField(value = "user_id_")
-    private Long userId;
-    @ApiModelProperty("业务类型 lingxinpay 灵薪付 ")
-	@TableField(value = "biz_type_")
-    private String bizType;
-    @ApiModelProperty("协议地址 ")
-	@TableField(value = "url_")
-    private String url;
-    @ApiModelProperty("合同编号 ")
-	@TableField(value = "contract_no_")
-    private String contractNo;
-    @ApiModelProperty("备注 ")
-	@TableField(value = "remark_")
-    private String remark;
-    @ApiModelProperty("创建时间 ")
-	@TableField(value = "created_time_")
-    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
-    private Date createdTime;
-
-	public Long getId() {
-        return id;
-    }
-
-    public void setId(Long id) {
-        this.id = id;
-    }
-    
-	public Long getUserId() {
-        return userId;
-    }
-
-    public void setUserId(Long userId) {
-        this.userId = userId;
-    }
-    
-	public String getBizType() {
-        return bizType;
-    }
-
-    public void setBizType(String bizType) {
-        this.bizType = bizType;
-    }
-    
-	public String getUrl() {
-        return url;
-    }
-
-    public void setUrl(String url) {
-        this.url = url;
-    }
-    
-	public String getContractNo() {
-        return contractNo;
-    }
-
-    public void setContractNo(String contractNo) {
-        this.contractNo = contractNo;
-    }
-    
-	public String getRemark() {
-        return remark;
-    }
-
-    public void setRemark(String remark) {
-        this.remark = remark;
-    }
-    
-	public Date getCreatedTime() {
-        return createdTime;
-    }
-
-    public void setCreatedTime(Date createdTime) {
-        this.createdTime = createdTime;
-    }
-    
-}

+ 3 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/ContractTypeEnum.java

@@ -10,7 +10,8 @@ public enum ContractTypeEnum implements BaseEnum<String, ContractTypeEnum> {
 
     REGISTER("REGISTER","注册"),
     COURSES("COURSES","课程购买"),
-    PRODUCT("PRODUCT","产品")
+    PRODUCT("PRODUCT","产品"),
+    WITHDRAW("WITHDRAW","用户提现")
     ;
 
     @EnumValue
@@ -18,7 +19,7 @@ public enum ContractTypeEnum implements BaseEnum<String, ContractTypeEnum> {
 
     private String desc;
 
-    private ContractTypeEnum(String code,String desc) {
+    ContractTypeEnum(String code,String desc) {
         this.code = code;
         this.desc = desc;
     }

+ 2 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/MessageTypeEnum.java

@@ -80,6 +80,8 @@ public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
     TEACHER_STYLE_VIDEO_SUCCESS("TEACHER_STYLE_VIDEO_SUCCESS","个人风采审核通过"),
     TEACHER_STYLE_VIDEO_FAIL("TEACHER_STYLE_VIDEO_FAIL","个人风采审核失败"),
 
+    TEACHER_WITHDRAW_SUCCESS("TEACHER_WITHDRAW_SUCCESS","老师提现成功"),
+
     //------短信模板------
     SMS_BUY_LIVE("SMS_BUY_LIVE","直播课购买成功"),
     SMS_LIVE_COMPLETION_SUCCESS("SMS_LIVE_COMPLETION_SUCCESS","直播课成课"),

+ 32 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/OpenContractEnum.java

@@ -0,0 +1,32 @@
+package com.yonge.cooleshow.biz.dal.enums;
+
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.yonge.toolset.base.enums.BaseEnum;
+
+public enum OpenContractEnum implements BaseEnum<String, OpenContractEnum> {
+
+    lingxinpay("灵薪付")
+    ;
+    @EnumValue
+    private String code;
+    private String msg;
+
+    OpenContractEnum(String msg) {
+        this.code = this.name();
+        this.msg = msg;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+
+    @Override
+    public String getCode() {
+        return this.code;
+    }
+}

+ 0 - 79
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/props/WithdrawalProperties.java

@@ -1,79 +0,0 @@
-package com.yonge.cooleshow.biz.dal.props;
-
-import org.springframework.boot.context.properties.ConfigurationProperties;
-import org.springframework.stereotype.Component;
-
-@Component
-@ConfigurationProperties(prefix = "withdrawal")
-public class WithdrawalProperties {
-    //提现服务提供方 lingxinpay 灵薪付
-    private String openType;
-    //第三方url
-    private String apiUrl;
-    //商户号
-    private String memberNo;
-    //第三方公钥
-    private String publicKey;
-    //第三方私钥
-    private String privateKey;
-    //MD5加密的key
-    private String md5Key;
-    //回调地址
-    private String notifyUrl;
-
-    public String getOpenType() {
-        return openType;
-    }
-
-    public void setOpenType(String openType) {
-        this.openType = openType;
-    }
-
-    public String getApiUrl() {
-        return apiUrl;
-    }
-
-    public void setApiUrl(String apiUrl) {
-        this.apiUrl = apiUrl;
-    }
-
-    public String getMemberNo() {
-        return memberNo;
-    }
-
-    public void setMemberNo(String memberNo) {
-        this.memberNo = memberNo;
-    }
-
-    public String getPublicKey() {
-        return publicKey;
-    }
-
-    public void setPublicKey(String publicKey) {
-        this.publicKey = publicKey;
-    }
-
-    public String getPrivateKey() {
-        return privateKey;
-    }
-
-    public void setPrivateKey(String privateKey) {
-        this.privateKey = privateKey;
-    }
-
-    public String getMd5Key() {
-        return md5Key;
-    }
-
-    public void setMd5Key(String md5Key) {
-        this.md5Key = md5Key;
-    }
-
-    public String getNotifyUrl() {
-        return notifyUrl;
-    }
-
-    public void setNotifyUrl(String notifyUrl) {
-        this.notifyUrl = notifyUrl;
-    }
-}

+ 143 - 26
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/sdk/WithdrawSdk.java

@@ -1,7 +1,8 @@
 package com.yonge.cooleshow.biz.dal.sdk;
 
 import com.alibaba.fastjson.JSONObject;
-import com.yonge.cooleshow.biz.dal.props.WithdrawalProperties;
+import com.alibaba.fastjson.JSONPath;
+import com.yonge.toolset.base.exception.ThirdpartyException;
 import com.yonge.toolset.thirdparty.lingxinpay.Md5EncryptUtils;
 import com.yonge.toolset.thirdparty.lingxinpay.RSA;
 import com.yonge.toolset.utils.date.DateUtil;
@@ -9,7 +10,7 @@ import com.yonge.toolset.utils.http.HttpUtil;
 import org.apache.commons.lang3.StringUtils;
 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 java.io.IOException;
@@ -25,8 +26,119 @@ import java.util.Map;
 public class WithdrawSdk {
     private static final Logger logger = LoggerFactory.getLogger(WithdrawSdk.class);
 
-    @Autowired
-    private WithdrawalProperties withdrawalProperties;
+    // 商户号
+    @Value("${withdraw.memberNo}")
+    private String memberNo;
+    // 模板协议号
+    @Value("${withdraw.contractNo}")
+    private String contractNo;
+    @Value("${withdraw.md5Key}")
+    private String md5Key;
+    @Value("${withdraw.publicKey}")
+    private String publicKey;
+    //签署协议回调地址
+    @Value("${withdraw.contractNotifyUrl}")
+    private String contractNotifyUrl;
+    //签署协议url
+    @Value("${withdraw.contractApiUrl}")
+    private String contractApiUrl;
+    //提现回调地址
+    @Value("${withdraw.notifyUrl}")
+    private String notifyUrl;
+    //提现第三方url
+    @Value("${withdraw.apiUrl}")
+    private String apiUrl;
+
+    /**
+     * 签署协议
+     *
+     * @param realName 真实姓名
+     * @param idcard   身份证号
+     * @param mobileNo 手机号
+     * @param serialNo 唯一标识
+     * @return
+     */
+    public boolean signContract(String realName, String idcard, String mobileNo, String serialNo) {
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("signType", "RSA");
+        jsonObject.put("service", "bpotop.zx.contract");
+        jsonObject.put("charset", "UTF-8");
+        jsonObject.put("version", "1.0");
+        jsonObject.put("createTime", DateUtil.format(new Date(), DateUtil.DEFAULT_PATTERN));
+
+        jsonObject.put("outMemberNo", memberNo);// 公司商户号
+        jsonObject.put("serialNo", serialNo);// 流水号(商户唯一标识)
+        jsonObject.put("contractNo", contractNo);// 合同模板号
+        jsonObject.put("notifyUrl", contractNotifyUrl);// 返回结果异步通知地址
+
+        JSONObject jsonObject2 = new JSONObject();
+        jsonObject2.put("name", realName);
+        jsonObject2.put("phone", mobileNo);
+        jsonObject2.put("identityId", idcard);
+        jsonObject2.put("citizenship", "0");
+        jsonObject2.put("signTime", DateUtil.format(new Date(), DateUtil.DEFAULT_PATTERN));
+        jsonObject.put("contractSignInfo", jsonObject2);
+        String jsonStr = JSONObject.toJSONString(jsonObject);
+
+        try {
+            String encryptStr = RSA.encryptPub(jsonStr, publicKey);
+            jsonObject.put("sign", encryptStr);
+        } catch (Exception e) {
+            logger.error("加密失败", e);
+            throw new ThirdpartyException("加密失败:{}", e.getMessage());
+        }
+        logger.info("[合同签署]请求参数:{}", jsonObject.toJSONString());
+        try {
+            String s = HttpUtil.postForHttp(contractApiUrl + "/api/signContract", jsonObject.toJSONString(), null);
+            logger.info("请求[合同签署]响应参数:{}", s);
+
+            jsonObject = JSONObject.parseObject(s);
+            if (StringUtils.equals(jsonObject.getString("return_code"), "T")) {
+                return true;
+            }
+            throw new ThirdpartyException("合同签署失败:{}", jsonObject.getString("content"));
+        } catch (IOException e) {
+            logger.error("请求[合同签署]接口报错", e);
+            throw new ThirdpartyException("请求[合同签署]接口报错:{}", e.getMessage());
+        }
+    }
+
+    /**
+     * 查询协议
+     *
+     * @param serialNo 唯一标识
+     * @return
+     */
+    public String querySignContractResult(String serialNo) {
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("outMemberNo", memberNo);
+        jsonObject.put("serialNo", serialNo);
+        jsonObject.put("contractNo", contractNo);
+        try {
+            String encryptStr = RSA.encryptPub(JSONObject.toJSONString(jsonObject), publicKey);
+            jsonObject.put("sign", encryptStr);
+        } catch (Exception e) {
+            logger.error("加密失败", e);
+            throw new ThirdpartyException("加密失败:{}", e.getMessage());
+        }
+        jsonObject.put("signType", "RSA");
+        jsonObject.put("service", "bpotop.zx.contract");
+        jsonObject.put("charset", "UTF-8");
+        jsonObject.put("version", "1.0");
+        jsonObject.put("createTime", DateUtil.format(new Date(), DateUtil.DEFAULT_PATTERN));
+        try {
+            String s = HttpUtil.postForHttp(contractApiUrl + "/api/queryContractInfo", jsonObject.toJSONString(), null);
+            logger.info("[合同查询]响应参数:{}", s);
+
+            jsonObject = JSONObject.parseObject(s);
+            if (StringUtils.equals(jsonObject.getString("return_code"), "T")) {
+                return (String) JSONPath.eval(jsonObject, "$.content.contractUrl");
+            }
+        } catch (IOException e) {
+            logger.error("请求[合同查询]接口报错", e);
+        }
+        return null;
+    }
 
     /**
      * 单笔提现
@@ -43,40 +155,33 @@ public class WithdrawSdk {
     public String withdraw(String outerOrderNo, String name, String mobile, String certificateNo, Integer predictAmount,
                            String payAccount, String remark) {
         Map<String, Object> map = new HashMap<>();
-        map.put("outMemberNo", withdrawalProperties.getMemberNo());
+        map.put("outMemberNo", memberNo);
         map.put("outerOrderNo", outerOrderNo);
         map.put("name", name);
         map.put("certificateNo", certificateNo);
         map.put("predictAmount", predictAmount);
-        String signs = Md5EncryptUtils.sign(map, withdrawalProperties.getMd5Key());
+        String signs = Md5EncryptUtils.sign(map, md5Key);
 
         map.put("charset", "UTF-8");
         map.put("mobile", mobile);
         map.put("version", "1.1");
         map.put("service", "bpotop.zx.pay.order");
         map.put("Md5Key", signs);
-        map.put("notifyUrl", withdrawalProperties.getNotifyUrl());
-        //卡类型 DC 借记卡
+        map.put("notifyUrl", notifyUrl);
         map.put("cardType", "DC");
-        //输入发放类型(0:工资,1:奖金,2:绩效,3:劳务,4:个人经营所得,5:其他)
-        map.put("salaryType", 4);
-        map.put("projectName", name + DateUtil.format(new Date(), DateUtil.DEFAULT_PATTERN) + "提现");
-        //支付类型(1:银行卡,2:支付宝,4:微信) 以实际业务为准
-        map.put("payType", 1);
-        //卡属性:(C:对私)
+        map.put("salaryType", "4");
+        map.put("projectName", name + "-" + DateUtil.getStrDate());
+        map.put("payType", "1");
         map.put("cardAttribute", "C");
         map.put("payAccount", payAccount);
-        if (StringUtils.isNotBlank(remark)) {
-            map.put("remark", remark);
-        }
         String jsonStr = JSONObject.toJSONString(map);
 
         //签名
         JSONObject mapParam = new JSONObject();
         try {
             //使用公钥加密
-            String encryptStr = RSA.encryptPub(jsonStr, withdrawalProperties.getPublicKey());
-            mapParam.put("outMemberNo", withdrawalProperties.getMemberNo());
+            String encryptStr = RSA.encryptPub(jsonStr, publicKey);
+            mapParam.put("outMemberNo", memberNo);
             mapParam.put("signType", "RSA");
             mapParam.put("sign", encryptStr);
             logger.info("单笔请求请求参数:{}", JSONObject.toJSONString(mapParam));
@@ -86,7 +191,7 @@ public class WithdrawSdk {
 
         //发送
         try {
-            String resultJsonStr = HttpUtil.postForHttp(withdrawalProperties.getApiUrl() + "/bpotop_trade/single", JSONObject.toJSONString(mapParam), null);
+            String resultJsonStr = HttpUtil.postForHttp(apiUrl + "/bpotop_trade/single", JSONObject.toJSONString(mapParam), null);
             logger.info("单笔请求返回参数:{}", resultJsonStr);
             return resultJsonStr;
         } catch (IOException e) {
@@ -101,23 +206,35 @@ public class WithdrawSdk {
      * @param outerOrderNo 商户唯一订单号
      * @throws Exception
      */
-    public void query(String outerOrderNo) throws Exception {
+    public String query(String outerOrderNo) {
         Map<String, Object> requestMap = new HashMap<>();
-        requestMap.put("outMemberNo", withdrawalProperties.getMemberNo());
+        requestMap.put("outMemberNo", memberNo);
         requestMap.put("outerOrderNo", outerOrderNo);
         requestMap.put("service", "bpotop.zx.pay.order");
         requestMap.put("version", "1.0");
         requestMap.put("signType", "RSA");
         requestMap.put("charset", "UTF-8");
         String jsonStr = JSONObject.toJSONString(requestMap);
-        String encryptStr = RSA.encryptPub(jsonStr, withdrawalProperties.getPublicKey());
+        String encryptStr = null;
+        try {
+            encryptStr = RSA.encryptPub(jsonStr, publicKey);
+        } catch (Exception e) {
+            throw new ThirdpartyException("加密失败:{}", e.getMessage());
+        }
 
         Map<String, Object> requestMap2 = new HashMap<>();
-        requestMap2.put("outMemberNo", withdrawalProperties.getMemberNo());
+        requestMap2.put("outMemberNo", memberNo);
         requestMap2.put("sign", encryptStr);
         logger.info("单笔查询请求参数:{}", JSONObject.toJSONString(requestMap2));
-        String resultJsonStr = HttpUtil.postForHttp(withdrawalProperties.getApiUrl() + "/bpotop_trade/order_query", JSONObject.toJSONString(requestMap2), null);
-        logger.info("单笔查询响应参数:{}", resultJsonStr);
+        String resultJsonStr = null;
+        try {
+            resultJsonStr = HttpUtil.postForHttp(apiUrl + "/bpotop_trade/order_query", JSONObject.toJSONString(requestMap2), null);
+            logger.info("单笔查询响应参数:{}", resultJsonStr);
+            return resultJsonStr;
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return null;
     }
 
 }

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

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.biz.dal.service;
 
 import com.yonge.cooleshow.biz.dal.dto.ContractTemplateDto;
 import com.yonge.cooleshow.biz.dal.entity.ContractTemplate;
+import com.yonge.cooleshow.biz.dal.enums.ContractTypeEnum;
 import com.yonge.toolset.base.page.PageInfo;
 import com.yonge.toolset.base.page.QueryInfo;
 import com.yonge.toolset.mybatis.service.BaseService;
@@ -31,11 +32,10 @@ public interface ContractTemplateService extends BaseService<Integer, ContractTe
 	
 	/**
 	 * 查询最新协议模板
-	 * @param owner
-	 * @param type
+	 * @param contractType
 	 * @return
 	 */
-	ContractTemplate queryLatestContractTemplate(String owner, String type);
+	ContractTemplate queryLatestContractTemplate(ContractTypeEnum contractType);
 	
 	boolean createContractTemplate(ContractTemplate contractTemplate);
 	

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

@@ -10,7 +10,7 @@ import com.yonge.cooleshow.biz.dal.dto.req.OrderReq;
 import com.yonge.cooleshow.biz.dal.dto.search.*;
 import com.yonge.cooleshow.biz.dal.entity.CourseGroup;
 import com.yonge.cooleshow.biz.dal.entity.CourseTimeEntity;
-import com.yonge.cooleshow.biz.dal.entity.UserOrderRefund;
+import com.yonge.cooleshow.biz.dal.entity.VideoLessonGroupDetail;
 import com.yonge.cooleshow.biz.dal.vo.*;
 import com.yonge.cooleshow.biz.dal.vo.res.OrderCreateRes;
 import com.yonge.cooleshow.biz.dal.vo.res.RefundCreateRes;
@@ -203,5 +203,37 @@ public interface CourseGroupService extends IService<CourseGroup> {
      * @return
      */
     IPage<CourseSchedulePaymentVo> selectLiveGroupStudent(IPage<CourseSchedulePaymentVo> page, CourseGroupSearch search);
+
+    /**
+     * 课程组管理-直播课-教学计划
+     * @param page
+     * @param search
+     * @return
+     */
+    IPage<CourseSchedulePlanVo> selectLiveGroupPlan(IPage<CourseSchedulePlanVo> page, CourseGroupSearch search);
+
+    /**
+     * 课程组管理-视频课
+     * @param page
+     * @param search
+     * @return
+     */
+    IPage<CourseGroupVideoVo> selectVideoGroup(IPage<CourseGroupVideoVo> page, CourseGroupSearch search);
+
+    /**
+     * 课程组管理-视频课-购买学员
+     * @param page
+     * @param search
+     * @return
+     */
+    IPage<CourseGroupStudentVo> selectVideoGroupStudent(IPage<CourseGroupStudentVo> page, CourseGroupSearch search);
+
+    /**
+     * 课程组管理-视频课-教学计划
+     * @param page
+     * @param search
+     * @return
+     */
+    IPage<VideoLessonGroupDetail> selectVideoGroupPlan(IPage<VideoLessonGroupDetail> page, CourseGroupSearch search);
 }
 

+ 0 - 47
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/LingXinService.java

@@ -1,47 +0,0 @@
-package com.yonge.cooleshow.biz.dal.service;
-
-/**
- * @author: cy
- * @date: 2022/5/18 14:52
- */
-public interface LingXinService {
-    /**
-     * 签署协议
-     *
-     * @param realName 真实姓名
-     * @param idcard   身份证号
-     * @param mobileNo 手机号
-     * @param serialNo 唯一标识
-     * @return
-     */
-    boolean signContract(String realName, String idcard, String mobileNo, String serialNo);
-
-    /**
-     * 查询协议
-     *
-     * @param serialNo 唯一标识
-     * @return
-     */
-    String querySignContractResult(String serialNo);
-
-    /**
-     * 单笔提现
-     *
-     * @param outerOrderNo  唯一单号
-     * @param name          收款方姓名
-     * @param mobile        收款方电话
-     * @param certificateNo 收款方身份证号
-     * @param predictAmount 应发金额(单位为:分,范围: 1~10000000000)
-     * @param payAccount    收款方银行卡号
-     * @return
-     */
-    String withdraw(String outerOrderNo, String name, String mobile, String certificateNo, Integer predictAmount, String payAccount);
-
-    /**
-     * 查询接口
-     *
-     * @param outerOrderNo 商户唯一订单号
-     * @throws Exception
-     */
-    String query(String outerOrderNo);
-}

+ 10 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/SysUserContractRecordService.java

@@ -3,6 +3,8 @@ package com.yonge.cooleshow.biz.dal.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.yonge.cooleshow.biz.dal.dao.SysUserContractRecordDao;
 import com.yonge.cooleshow.biz.dal.entity.SysUserContractRecord;
+import com.yonge.cooleshow.biz.dal.enums.ContractTypeEnum;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
 
 /**
  * 用户协议记录表-一个用户一种协议一个版本一条记录(SysUserContractRecord)表服务接口
@@ -13,5 +15,13 @@ import com.yonge.cooleshow.biz.dal.entity.SysUserContractRecord;
 public interface SysUserContractRecordService extends IService<SysUserContractRecord> {
 
     SysUserContractRecordDao getDao();
+
+    /**
+     * 查询用户是否签署协议
+     * @param userId
+     * @param contractType
+     * @return
+     */
+    HttpResponseResult<Boolean> checkContractSign(Long userId, ContractTypeEnum contractType);
 }
 

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

@@ -2,14 +2,11 @@ package com.yonge.cooleshow.biz.dal.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dto.TeacherDto;
-import com.yonge.cooleshow.biz.dal.dto.req.UserSetReq;
 import com.yonge.cooleshow.biz.dal.dto.req.TeacherSubmitReq;
 import com.yonge.cooleshow.biz.dal.dto.search.TeacherSearch;
 import com.yonge.cooleshow.biz.dal.entity.Subject;
 import com.yonge.cooleshow.biz.dal.entity.Teacher;
-import com.yonge.cooleshow.biz.dal.enums.YesOrNoEnum;
 import com.yonge.cooleshow.biz.dal.vo.*;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 
@@ -128,4 +125,5 @@ public interface TeacherService extends IService<Teacher> {
      * @return
      */
     IPage<MyFens> queryMyFans(IPage<MyFens> page, Long teacherId);
+
 }

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

@@ -68,6 +68,12 @@ public interface UserWithdrawalService extends IService<UserWithdrawal>  {
 	 */
 	void callback(UserWithdrawalCallback callback,String jsonStr);
 
+	/**
+	 * 异步回调接收-签署协议
+	 * @param map
+	 */
+	void contractCallback(Map<String, Object> map);
+
 	/***
 	 * 导入
 	 * @author liweifan

+ 139 - 139
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ContractTemplateServiceImpl.java

@@ -7,6 +7,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.concurrent.TimeUnit;
 
+import com.yonge.cooleshow.biz.dal.enums.ContractTypeEnum;
 import com.yonge.toolset.mybatis.service.impl.BaseServiceImpl;
 import org.redisson.api.RLock;
 import org.redisson.api.RedissonClient;
@@ -27,150 +28,149 @@ import com.yonge.toolset.utils.collection.MapUtil;
 @Service
 public class ContractTemplateServiceImpl extends BaseServiceImpl<Integer, ContractTemplate> implements ContractTemplateService {
 
-	@Autowired
-	private ContractTemplateDao contractTemplateDao;
+    @Autowired
+    private ContractTemplateDao contractTemplateDao;
 
-	@Autowired
-	private RedissonClient redissonClient;
+    @Autowired
+    private RedissonClient redissonClient;
 
-	private final static String LOCK_NAME = "contract_template";
+    private final static String LOCK_NAME = "contract_template";
 
-	@Override
-	public BaseDAO<Integer, ContractTemplate> getDAO() {
-		return contractTemplateDao;
-	}
+    @Override
+    public BaseDAO<Integer, ContractTemplate> getDAO() {
+        return contractTemplateDao;
+    }
+
+    @Override
+    public PageInfo<ContractTemplateDto> queryPageList(QueryInfo queryInfo) {
+        PageInfo<ContractTemplateDto> pageInfo = new PageInfo<ContractTemplateDto>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<String, Object>();
+        MapUtil.populateMap(params, queryInfo);
+
+        List<ContractTemplateDto> dataList = null;
+        int count = this.findCount(params);
+        if (count > 0) {
+            pageInfo.setTotal(count);
+            params.put("offset", pageInfo.getOffset());
+            dataList = contractTemplateDao.queryPageList(params);
+        }
+        if (count == 0) {
+            dataList = new ArrayList<ContractTemplateDto>();
+        }
+        pageInfo.setRows(dataList);
+        return pageInfo;
+    }
 
-	@Override
-	public PageInfo<ContractTemplateDto> queryPageList(QueryInfo queryInfo) {
-		PageInfo<ContractTemplateDto> pageInfo = new PageInfo<ContractTemplateDto>(queryInfo.getPage(), queryInfo.getRows());
-		Map<String, Object> params = new HashMap<String, Object>();
-		MapUtil.populateMap(params, queryInfo);
+    @Override
+    @Transactional
+    public boolean enableContract(Integer id, Long userId) {
+        ContractTemplate contractTemplate = contractTemplateDao.get(id);
+
+        if (contractTemplate == null) {
+            throw new BizException("未查询到协议模板");
+        }
+
+        if (contractTemplate.getStatus()) {
+            return true;
+        }
+
+        RLock lock = redissonClient.getLock(LOCK_NAME);
+
+        try {
+            if (lock.tryLock(10, 10, TimeUnit.SECONDS)) {
+
+                Integer maxVersion = contractTemplateDao.queryMaxVersion();
+                int version = maxVersion == null ? 1 : maxVersion + 1;
+
+                contractTemplate.setVersion(version);
+
+                contractTemplateDao.disableContract(contractTemplate.getOwner(), contractTemplate.getType());
+
+                Date date = new Date();
+
+                contractTemplate.setStatus(true);
+                contractTemplate.setUpdateTime(date);
+                contractTemplate.setModifyBy(userId);
+
+                contractTemplateDao.update(contractTemplate);
+
+                return true;
+            }
+        } catch (InterruptedException e) {
+            throw new BizException("锁获取失败:{}", e.getMessage());
+        } finally {
+            lock.unlock();
+        }
+
+        return false;
+    }
+
+    @Override
+    public boolean updateContractVersion() {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    @Override
+    public ContractTemplate queryLatestContractTemplate(ContractTypeEnum contractType) {
+        ContractTemplate ContractTemplate = contractTemplateDao.queryLatestContractTemplate(contractType.getCode());
+        return ContractTemplate;
+    }
+
+    @Override
+    @Transactional
+    public boolean createContractTemplate(ContractTemplate ContractTemplate) {
+
+        RLock lock = redissonClient.getLock(LOCK_NAME);
+
+        try {
+            if (lock.tryLock(10, 10, TimeUnit.SECONDS)) {
+
+                Integer maxVersion = contractTemplateDao.queryMaxVersion();
+                int version = maxVersion == null ? 1 : maxVersion + 1;
+
+                ContractTemplate.setVersion(version);
+                Date date = new Date();
+                ContractTemplate.setCreateTime(date);
+                ContractTemplate.setUpdateTime(date);
+                insert(ContractTemplate);
+
+                return true;
+            }
+        } catch (InterruptedException e) {
+            throw new BizException("锁获取失败:{}", e.getMessage());
+        } finally {
+            lock.unlock();
+        }
+
+        return false;
+    }
+
+    @Override
+    @Transactional
+    public boolean updateContractTempalte(ContractTemplate ContractTemplate) {
+
+        RLock lock = redissonClient.getLock(LOCK_NAME);
+
+        try {
+            if (lock.tryLock(10, 10, TimeUnit.SECONDS)) {
+                Integer maxVersion = contractTemplateDao.queryMaxVersion();
+                int version = maxVersion == null ? 1 : maxVersion + 1;
+
+                ContractTemplate.setVersion(version);
+                Date date = new Date();
+                ContractTemplate.setUpdateTime(date);
 
-		List<ContractTemplateDto> dataList = null;
-		int count = this.findCount(params);
-		if (count > 0) {
-			pageInfo.setTotal(count);
-			params.put("offset", pageInfo.getOffset());
-			dataList = contractTemplateDao.queryPageList(params);
-		}
-		if (count == 0) {
-			dataList = new ArrayList<ContractTemplateDto>();
-		}
-		pageInfo.setRows(dataList);
-		return pageInfo;
-	}
+                update(ContractTemplate);
+                return true;
+            }
+        } catch (InterruptedException e) {
+            throw new BizException("锁获取失败:{}", e.getMessage());
+        } finally {
+            lock.unlock();
+        }
 
-	@Override
-	@Transactional
-	public boolean enableContract(Integer id, Long userId) {
-		ContractTemplate contractTemplate = contractTemplateDao.get(id);
-
-		if (contractTemplate == null) {
-			throw new BizException("未查询到协议模板");
-		}
-
-		if (contractTemplate.getStatus()) {
-			return true;
-		}
-
-		RLock lock = redissonClient.getLock(LOCK_NAME);
-
-		try {
-			if (lock.tryLock(10, 10, TimeUnit.SECONDS)) {
-
-				Integer maxVersion = contractTemplateDao.queryMaxVersion();
-				int version = maxVersion == null ? 1 : maxVersion + 1;
-
-				contractTemplate.setVersion(version);
-
-				contractTemplateDao.disableContract(contractTemplate.getOwner(), contractTemplate.getType());
-
-				Date date = new Date();
-
-				contractTemplate.setStatus(true);
-				contractTemplate.setUpdateTime(date);
-				contractTemplate.setModifyBy(userId);
-
-				contractTemplateDao.update(contractTemplate);
-
-				return true;
-			}
-		} catch (InterruptedException e) {
-			throw new BizException("锁获取失败:{}", e.getMessage());
-		} finally {
-			lock.unlock();
-		}
-
-		return false;
-	}
-
-	@Override
-	public boolean updateContractVersion() {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
-	@Override
-	public ContractTemplate queryLatestContractTemplate(String owner, String type) {
-		ContractTemplate ContractTemplate = contractTemplateDao.queryLatestContractTemplate(owner, type);
-
-		return ContractTemplate;
-	}
-
-	@Override
-	@Transactional
-	public boolean createContractTemplate(ContractTemplate ContractTemplate) {
-
-		RLock lock = redissonClient.getLock(LOCK_NAME);
-
-		try {
-			if (lock.tryLock(10, 10, TimeUnit.SECONDS)) {
-
-				Integer maxVersion = contractTemplateDao.queryMaxVersion();
-				int version = maxVersion == null ? 1 : maxVersion + 1;
-
-				ContractTemplate.setVersion(version);
-				Date date = new Date();
-				ContractTemplate.setCreateTime(date);
-				ContractTemplate.setUpdateTime(date);
-				insert(ContractTemplate);
-
-				return true;
-			}
-		} catch (InterruptedException e) {
-			throw new BizException("锁获取失败:{}", e.getMessage());
-		} finally {
-			lock.unlock();
-		}
-
-		return false;
-	}
-
-	@Override
-	@Transactional
-	public boolean updateContractTempalte(ContractTemplate ContractTemplate) {
-
-		RLock lock = redissonClient.getLock(LOCK_NAME);
-
-		try {
-			if (lock.tryLock(10, 10, TimeUnit.SECONDS)) {
-				Integer maxVersion = contractTemplateDao.queryMaxVersion();
-				int version = maxVersion == null ? 1 : maxVersion + 1;
-
-				ContractTemplate.setVersion(version);
-				Date date = new Date();
-				ContractTemplate.setUpdateTime(date);
-
-				update(ContractTemplate);
-				return true;
-			}
-		} catch (InterruptedException e) {
-			throw new BizException("锁获取失败:{}", e.getMessage());
-		} finally {
-			lock.unlock();
-		}
-
-		return false;
-	}
+        return false;
+    }
 
 }

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

@@ -925,6 +925,26 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
         return baseMapper.selectLiveGroupStudent(page,search);
     }
 
+    @Override
+    public IPage<CourseSchedulePlanVo> selectLiveGroupPlan(IPage<CourseSchedulePlanVo> page, CourseGroupSearch search) {
+        return baseMapper.selectLiveGroupPlan(page,search);
+    }
+
+    @Override
+    public IPage<CourseGroupVideoVo> selectVideoGroup(IPage<CourseGroupVideoVo> page, CourseGroupSearch search) {
+        return baseMapper.selectVideoGroup(page,search);
+    }
+
+    @Override
+    public IPage<CourseGroupStudentVo> selectVideoGroupStudent(IPage<CourseGroupStudentVo> page, CourseGroupSearch search) {
+        return baseMapper.selectVideoGroupStudent(page,search);
+    }
+
+    @Override
+    public IPage<VideoLessonGroupDetail> selectVideoGroupPlan(IPage<VideoLessonGroupDetail> page, CourseGroupSearch search) {
+        return baseMapper.selectVideoGroupPlan(page,search);
+    }
+
     /**
      * 定时将符合开售日期的未开售的直播课课程组修改为报名中状态
      */

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

@@ -1,236 +0,0 @@
-package com.yonge.cooleshow.biz.dal.service.impl;
-
-import com.alibaba.fastjson.JSONObject;
-import com.alibaba.fastjson.JSONPath;
-import com.yonge.cooleshow.biz.dal.service.LingXinService;
-import com.yonge.toolset.base.exception.ThirdpartyException;
-import com.yonge.toolset.thirdparty.lingxinpay.Md5EncryptUtils;
-import com.yonge.toolset.thirdparty.lingxinpay.RSA;
-import com.yonge.toolset.utils.date.DateUtil;
-import com.yonge.toolset.utils.http.HttpUtil;
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Service;
-
-import java.io.IOException;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * @author: cy
- * @date: 2022/5/18 14:54
- */
-@Service("lingXinService")
-public class LingXinServiceImpl implements LingXinService {
-    private static final Logger logger = LoggerFactory.getLogger(LingXinServiceImpl.class);
-
-    @Value("${withdraw.publicKey}")
-    private String publicKey;
-    @Value("${withdraw.md5Key}")
-    private String md5Key;
-    @Value("${withdraw.memberNo}")
-    private String memberNo;// 商户号
-    @Value("${withdraw.contractNo}")
-    private String contractNo;// 模板协议号
-    @Value("${withdraw.contractNotifyUrl}")
-    private String contractNotifyUrl;//签署协议回调地址
-    @Value("${withdraw.contractApiUrl}")
-    private String contractApiUrl;//签署协议url
-    @Value("${withdraw.notifyUrl}")
-    private String notifyUrl;//提现回调地址
-    @Value("${withdraw.apiUrl}")
-    private String apiUrl;//提现第三方url
-
-    private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
-
-    /**
-     * 签署协议
-     *
-     * @param realName 真实姓名
-     * @param idcard   身份证号
-     * @param mobileNo 手机号
-     * @param serialNo 唯一标识
-     * @return
-     */
-    public boolean signContract(String realName, String idcard, String mobileNo, String serialNo) {
-        JSONObject jsonObject = new JSONObject();
-        jsonObject.put("signType", "RSA");
-        jsonObject.put("service", "bpotop.zx.contract");
-        jsonObject.put("charset", "UTF-8");
-        jsonObject.put("version", "1.0");
-        jsonObject.put("createTime", sdf.format(new Date()));
-
-        jsonObject.put("outMemberNo", memberNo);// 公司商户号
-        jsonObject.put("serialNo", serialNo);// 流水号(商户唯一标识)
-        jsonObject.put("contractNo", contractNo);// 合同模板号
-        jsonObject.put("notifyUrl", contractNotifyUrl);// 返回结果异步通知地址
-
-        JSONObject jsonObject2 = new JSONObject();
-        jsonObject2.put("name", realName);
-        jsonObject2.put("phone", mobileNo);
-        jsonObject2.put("identityId", idcard);
-        jsonObject2.put("citizenship", "0");
-        jsonObject2.put("signTime", sdf.format(new Date()));
-        jsonObject.put("contractSignInfo", jsonObject2);
-        String jsonStr = JSONObject.toJSONString(jsonObject);
-
-        try {
-            String encryptStr = RSA.encryptPub(jsonStr, publicKey);
-            jsonObject.put("sign", encryptStr);
-        } catch (Exception e) {
-            logger.error("加密失败", e);
-            throw new ThirdpartyException("加密失败:{}", e.getMessage());
-        }
-        logger.info("[合同签署]请求参数:{}", jsonObject.toJSONString());
-        try {
-            String s = HttpUtil.postForHttp(contractApiUrl + "/api/signContract", jsonObject.toJSONString(), null);
-            logger.info("请求[合同签署]响应参数:{}", s);
-
-            jsonObject = JSONObject.parseObject(s);
-            if (StringUtils.equals(jsonObject.getString("return_code"), "T")) {
-                return true;
-            }
-            throw new ThirdpartyException("合同签署失败:{}", jsonObject.getString("content"));
-        } catch (IOException e) {
-            logger.error("请求[合同签署]接口报错", e);
-            throw new ThirdpartyException("请求[合同签署]接口报错:{}", e.getMessage());
-        }
-    }
-
-    /**
-     * 查询协议
-     *
-     * @param serialNo 唯一标识
-     * @return
-     */
-    public String querySignContractResult(String serialNo) {
-        JSONObject jsonObject = new JSONObject();
-        jsonObject.put("outMemberNo", memberNo);
-        jsonObject.put("serialNo", serialNo);
-        jsonObject.put("contractNo", contractNo);
-        try {
-            String encryptStr = RSA.encryptPub(JSONObject.toJSONString(jsonObject), publicKey);
-            jsonObject.put("sign", encryptStr);
-        } catch (Exception e) {
-            logger.error("加密失败", e);
-            throw new ThirdpartyException("加密失败:{}", e.getMessage());
-        }
-        jsonObject.put("signType", "RSA");
-        jsonObject.put("service", "bpotop.zx.contract");
-        jsonObject.put("charset", "UTF-8");
-        jsonObject.put("version", "1.0");
-        jsonObject.put("createTime", sdf.format(new Date()));
-        try {
-            String s = HttpUtil.postForHttp(contractApiUrl + "/api/queryContractInfo", jsonObject.toJSONString(), null);
-            logger.info("[合同查询]响应参数:{}", s);
-
-            jsonObject = JSONObject.parseObject(s);
-            if (StringUtils.equals(jsonObject.getString("return_code"), "T")) {
-                return (String) JSONPath.eval(jsonObject, "$.content.contractUrl");
-            }
-        } catch (IOException e) {
-            logger.error("请求[合同查询]接口报错", e);
-        }
-        return null;
-    }
-
-    /**
-     * 单笔提现
-     *
-     * @param outerOrderNo  商户唯一订单号
-     * @param name          收款方姓名(银行预留姓名等)
-     * @param mobile        收款方电话
-     * @param certificateNo 收款方身份证号
-     * @param predictAmount 应发金额(单位为:分,范围: 1~10000000000)
-     * @param payAccount    收款方账号(银行卡号/支付宝账号 /open_id)以实际业务为准
-     * @return
-     */
-    public String withdraw(String outerOrderNo, String name, String mobile, String certificateNo, Integer predictAmount,
-                           String payAccount) {
-        Map<String, Object> map = new HashMap<>();
-        map.put("outMemberNo", memberNo);
-        map.put("outerOrderNo", outerOrderNo);
-        map.put("name", name);
-        map.put("certificateNo", certificateNo);
-        map.put("predictAmount", predictAmount);
-        String signs = Md5EncryptUtils.sign(map, md5Key);
-
-        map.put("charset", "UTF-8");
-        map.put("mobile", mobile);
-        map.put("version", "1.1");
-        map.put("service", "bpotop.zx.pay.order");
-        map.put("Md5Key", signs);
-        map.put("notifyUrl", notifyUrl);
-        map.put("cardType", "DC");
-        map.put("salaryType", "4");
-        map.put("projectName", name + "-" + DateUtil.getStrDate());
-        map.put("payType", "1");
-        map.put("cardAttribute", "C");
-        map.put("payAccount", payAccount);
-        String jsonStr = JSONObject.toJSONString(map);
-
-        //签名
-        JSONObject mapParam = new JSONObject();
-        try {
-            //使用公钥加密
-            String encryptStr = RSA.encryptPub(jsonStr, publicKey);
-            mapParam.put("outMemberNo", memberNo);
-            mapParam.put("signType", "RSA");
-            mapParam.put("sign", encryptStr);
-            logger.info("单笔请求请求参数:{}", JSONObject.toJSONString(mapParam));
-        } catch (Exception e) {
-            logger.info("加密失败:{}", e);
-        }
-
-        //发送
-        try {
-            String resultJsonStr = HttpUtil.postForHttp(apiUrl + "/bpotop_trade/single", JSONObject.toJSONString(mapParam), null);
-            logger.info("单笔请求返回参数:{}", resultJsonStr);
-            return resultJsonStr;
-        } catch (IOException e) {
-            logger.info("发送失败:{}", e);
-        }
-        return null;
-    }
-
-    /**
-     * 查询接口
-     *
-     * @param outerOrderNo 商户唯一订单号
-     * @throws Exception
-     */
-    public String query(String outerOrderNo) {
-        Map<String, Object> requestMap = new HashMap<>();
-        requestMap.put("outMemberNo", memberNo);
-        requestMap.put("outerOrderNo", outerOrderNo);
-        requestMap.put("service", "bpotop.zx.pay.order");
-        requestMap.put("version", "1.0");
-        requestMap.put("signType", "RSA");
-        requestMap.put("charset", "UTF-8");
-        String jsonStr = JSONObject.toJSONString(requestMap);
-        String encryptStr = null;
-        try {
-            encryptStr = RSA.encryptPub(jsonStr, publicKey);
-        } catch (Exception e) {
-            throw new ThirdpartyException("加密失败:{}", e.getMessage());
-        }
-
-        Map<String, Object> requestMap2 = new HashMap<>();
-        requestMap2.put("outMemberNo", memberNo);
-        requestMap2.put("sign", encryptStr);
-        logger.info("单笔查询请求参数:{}", JSONObject.toJSONString(requestMap2));
-        String resultJsonStr = null;
-        try {
-            resultJsonStr = HttpUtil.postForHttp(apiUrl + "/bpotop_trade/order_query", JSONObject.toJSONString(requestMap2), null);
-            logger.info("单笔查询响应参数:{}", resultJsonStr);
-            return resultJsonStr;
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-        return null;
-    }
-}

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

@@ -3,8 +3,10 @@ package com.yonge.cooleshow.biz.dal.service.impl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yonge.cooleshow.biz.dal.dao.SysUserContractRecordDao;
 import com.yonge.cooleshow.biz.dal.entity.SysUserContractRecord;
+import com.yonge.cooleshow.biz.dal.enums.ContractTypeEnum;
 import com.yonge.cooleshow.biz.dal.service.ContractTemplateService;
 import com.yonge.cooleshow.biz.dal.service.SysUserContractRecordService;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -30,10 +32,15 @@ public class SysUserContractRecordServiceImpl extends ServiceImpl<SysUserContrac
         return this.baseMapper;
     }
 
+    @Override
+    public HttpResponseResult<Boolean> checkContractSign(Long userId, ContractTypeEnum contractType) {
+        return HttpResponseResult.succeed(getDao().checkContractSign(userId, contractType.getCode()));
+    }
+
     /**
      * 校验当前用户签署的协议是否是最新版本
      */
-    public void checkContractRecord(Long userId,String type) {
+    public void checkContractRecord(Long userId, String type) {
         //根据人员id及协议类型查询最新协议记录
         //查询对应类型的最新的协议
         //对比当前类型及人员id的协议版本

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

@@ -7,6 +7,7 @@ import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.dto.RealnameAuthReq;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.auth.api.enums.SysUserType;
+import com.yonge.cooleshow.biz.dal.enums.*;
 import com.yonge.cooleshow.biz.dal.vo.MyFens;
 import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.cooleshow.biz.dal.dao.EmployeeDao;
@@ -14,10 +15,6 @@ import com.yonge.cooleshow.biz.dal.dto.TeacherDto;
 import com.yonge.cooleshow.biz.dal.dto.req.TeacherSubmitReq;
 import com.yonge.cooleshow.biz.dal.dto.search.TeacherSearch;
 import com.yonge.cooleshow.biz.dal.entity.*;
-import com.yonge.cooleshow.biz.dal.enums.AuthStatusEnum;
-import com.yonge.cooleshow.biz.dal.enums.CacheNameEnum;
-import com.yonge.cooleshow.biz.dal.enums.TeacherTypeEnum;
-import com.yonge.cooleshow.biz.dal.enums.YesOrNoEnum;
 import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.vo.TeacherAuthEntryRecordVo;
 import com.yonge.cooleshow.biz.dal.vo.TeacherHomeVo;
@@ -380,4 +377,5 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
         List<MyFens> teacherVos = baseMapper.queryMyFans(page, teacherId);
         return page.setRecords(teacherVos);
     }
+
 }

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

@@ -3,13 +3,11 @@ package com.yonge.cooleshow.biz.dal.service.impl;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
-import com.yonge.cooleshow.biz.dal.dto.excel.UserWithdrawalExport;
+import com.yonge.cooleshow.biz.dal.dao.SysUserContractRecordDao;
 import com.yonge.cooleshow.biz.dal.entity.UserWithdrawalCallback;
 import com.yonge.cooleshow.biz.dal.enums.*;
-import com.yonge.cooleshow.biz.dal.props.WithdrawalProperties;
 import com.yonge.cooleshow.biz.dal.sdk.WithdrawSdk;
-import com.yonge.cooleshow.biz.dal.service.TeacherService;
-import com.yonge.cooleshow.biz.dal.vo.TeacherVo;
+import com.yonge.cooleshow.biz.dal.service.SysMessageService;
 import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.cooleshow.biz.dal.dao.UserBankCardDao;
 import com.yonge.cooleshow.biz.dal.dto.UserAccountRecordDto;
@@ -23,15 +21,12 @@ import com.yonge.cooleshow.biz.dal.vo.res.WithdrawalInfoRes;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.payment.base.enums.TradeStatusEnum;
-import com.yonge.toolset.utils.easyexcel.ErrMsg;
-import com.yonge.toolset.utils.easyexcel.ExcelDataReaderProperty;
-import com.yonge.toolset.utils.easyexcel.ExcelException;
+import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
 import com.yonge.toolset.utils.string.StringUtil;
 import com.yonge.toolset.utils.string.ValueUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.core.parameters.P;
 import org.springframework.stereotype.Service;
 import com.yonge.cooleshow.biz.dal.entity.UserWithdrawal;
 import com.yonge.cooleshow.biz.dal.vo.UserWithdrawalVo;
@@ -39,11 +34,8 @@ import com.yonge.cooleshow.biz.dal.dto.search.TeacherWithdrawalSearch;
 import com.yonge.cooleshow.biz.dal.dao.UserWithdrawalDao;
 import com.yonge.cooleshow.biz.dal.service.UserWithdrawalService;
 import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.CollectionUtils;
-import org.springframework.util.DigestUtils;
 
 import java.math.BigDecimal;
-import java.math.RoundingMode;
 import java.util.*;
 
 
@@ -58,9 +50,11 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
     @Autowired
     private SysConfigService sysConfigService;
     @Autowired
-    private WithdrawalProperties withdrawalProperties;
-    @Autowired
     private WithdrawSdk withdrawSdk;
+    @Autowired
+    private SysMessageService sysMessageService;
+    @Autowired
+    private SysUserContractRecordDao userContractRecordDao;
 
     @Override
     public UserWithdrawalVo detail(Long id) {
@@ -150,7 +144,7 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
         if (null == detail) {
             throw new BizException("参数异常,未找到交易记录,param is {}", jsonStr);
         }
-        if(!TradeStatusEnum.pending.equals(detail.getStatus())){
+        if (!TradeStatusEnum.pending.equals(detail.getStatus())) {
             return;
         }
         if ("1".equals(callback.getStatus())) {
@@ -169,8 +163,9 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
             accountRecordDto.setFrozenType(FrozenTypeEnum.FROZEN_DEDUCT);
             accountRecordDto.setSaveRecord(true);
             userAccountService.accountChange(accountRecordDto);
-
-        }else if("2".equals(callback.getStatus())){
+            //发生提现成功通知
+            successSend(detail.getUserId(), detail.getPhone());
+        } else if ("2".equals(callback.getStatus())) {
             //交易失败
             detail.setStatus(TradeStatusEnum.failed);
             detail.setErrorCode(callback.getErrorCode());
@@ -184,13 +179,29 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
             accountRecordDto.setFrozenType(FrozenTypeEnum.FROZEN_BACK);
             accountRecordDto.setSaveRecord(false);
             userAccountService.accountChange(accountRecordDto);
-        }else{
+        } else {
             return;
         }
         detail.setCallbackJson(jsonStr);
         updateById(detail);
     }
 
+    @Override
+    public void contractCallback(Map<String, Object> map) {
+        userContractRecordDao.contractCallbackUpdate(map);
+    }
+
+    private void successSend(Long userId, String phone) {
+        Map<Long, String> receivers = new HashMap<>();
+        receivers.put(userId, phone);
+        try {
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TEACHER_WITHDRAW_SUCCESS,
+                    receivers, null, 0, null, ClientEnum.TEACHER.getCode());
+        } catch (Exception e) {
+            log.error("老师提现极光消息推送异常,userId={}", userId);
+        }
+    }
+
    /* @Override
     @Transactional(rollbackFor = Exception.class)
     public void importExcel(List<ExcelDataReaderProperty<UserWithdrawalExport>> dataList, Long userId) {
@@ -296,7 +307,7 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
         userWithdrawal.setAmount(withdrawalReq.getAmountWithdrawal());
         userWithdrawal.setPlantformFee(withdrawalServiceFee);
         userWithdrawal.setBankCardId(bankCardVo.getId());
-        userWithdrawal.setOpenType(withdrawalProperties.getOpenType());
+        userWithdrawal.setOpenType(OpenContractEnum.lingxinpay.getCode());
         userWithdrawal.setStatus(TradeStatusEnum.pending);
         userWithdrawal.setCreateTime(new Date());
         userWithdrawal.setUpdateTime(new Date());

+ 86 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/CourseGroupStudentVo.java

@@ -0,0 +1,86 @@
+package com.yonge.cooleshow.biz.dal.vo;
+
+import com.yonge.cooleshow.common.entity.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @Author: cy
+ * @Date: 2022/5/19
+ */
+@ApiModel
+public class CourseGroupStudentVo extends BaseEntity {
+    @ApiModelProperty("学生id")
+    private Long studentId;
+    @ApiModelProperty("学生姓名")
+    private String studentName;
+    @ApiModelProperty("学生真实姓名")
+    private String studentRealName;
+    @ApiModelProperty("学生手机号")
+    private String studentPhone;
+    @ApiModelProperty("订单号")
+    private String orderNo;
+    @ApiModelProperty("支付金额")
+    private BigDecimal payMoney;
+    @ApiModelProperty("下单时间")
+    private Date createTime;
+
+    public String getStudentPhone() {
+        return studentPhone;
+    }
+
+    public void setStudentPhone(String studentPhone) {
+        this.studentPhone = studentPhone;
+    }
+
+    public Long getStudentId() {
+        return studentId;
+    }
+
+    public void setStudentId(Long studentId) {
+        this.studentId = studentId;
+    }
+
+    public String getStudentName() {
+        return studentName;
+    }
+
+    public void setStudentName(String studentName) {
+        this.studentName = studentName;
+    }
+
+    public String getStudentRealName() {
+        return studentRealName;
+    }
+
+    public void setStudentRealName(String studentRealName) {
+        this.studentRealName = studentRealName;
+    }
+
+    public String getOrderNo() {
+        return orderNo;
+    }
+
+    public void setOrderNo(String orderNo) {
+        this.orderNo = orderNo;
+    }
+
+    public BigDecimal getPayMoney() {
+        return payMoney;
+    }
+
+    public void setPayMoney(BigDecimal payMoney) {
+        this.payMoney = payMoney;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+}

+ 115 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/CourseGroupVideoVo.java

@@ -0,0 +1,115 @@
+package com.yonge.cooleshow.biz.dal.vo;
+
+import com.yonge.cooleshow.common.entity.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Date;
+
+/**
+ * @Author: cy
+ * @Date: 2022/5/19
+ */
+@ApiModel
+public class CourseGroupVideoVo extends BaseEntity {
+    @ApiModelProperty("课程组id")
+    private Long groupId;
+    @ApiModelProperty("课组名称")
+    private String lessonName;
+    @ApiModelProperty("声部id")
+    private Long subjectId;
+    @ApiModelProperty("声部名称")
+    private String subjectName;
+    @ApiModelProperty("购课人数")
+    private Integer buyCount;
+    @ApiModelProperty("课时总数")
+    private Integer lessonCount;
+    @ApiModelProperty("老师id")
+    private Long teacherId;
+    @ApiModelProperty("老师姓名")
+    private String teacherName;
+    @ApiModelProperty("老师真实姓名")
+    private String teacherRealName;
+    @ApiModelProperty("创建日期")
+    private Date createTime;
+
+    public Long getGroupId() {
+        return groupId;
+    }
+
+    public void setGroupId(Long groupId) {
+        this.groupId = groupId;
+    }
+
+    public String getLessonName() {
+        return lessonName;
+    }
+
+    public void setLessonName(String lessonName) {
+        this.lessonName = lessonName;
+    }
+
+    public Long getSubjectId() {
+        return subjectId;
+    }
+
+    public void setSubjectId(Long subjectId) {
+        this.subjectId = subjectId;
+    }
+
+    public String getSubjectName() {
+        return subjectName;
+    }
+
+    public void setSubjectName(String subjectName) {
+        this.subjectName = subjectName;
+    }
+
+    public Integer getBuyCount() {
+        return buyCount;
+    }
+
+    public void setBuyCount(Integer buyCount) {
+        this.buyCount = buyCount;
+    }
+
+    public Integer getLessonCount() {
+        return lessonCount;
+    }
+
+    public void setLessonCount(Integer lessonCount) {
+        this.lessonCount = lessonCount;
+    }
+
+    public Long getTeacherId() {
+        return teacherId;
+    }
+
+    public void setTeacherId(Long teacherId) {
+        this.teacherId = teacherId;
+    }
+
+    public String getTeacherName() {
+        return teacherName;
+    }
+
+    public void setTeacherName(String teacherName) {
+        this.teacherName = teacherName;
+    }
+
+    public String getTeacherRealName() {
+        return teacherRealName;
+    }
+
+    public void setTeacherRealName(String teacherRealName) {
+        this.teacherRealName = teacherRealName;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+}

+ 12 - 6
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/CourseSchedulePaymentVo.java

@@ -1,9 +1,9 @@
 package com.yonge.cooleshow.biz.dal.vo;
 
-import com.yonge.cooleshow.biz.dal.entity.CourseScheduleStudentPayment;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
+import java.io.Serializable;
 import java.math.BigDecimal;
 import java.util.Date;
 
@@ -12,13 +12,15 @@ import java.util.Date;
  * @Date: 2022/5/20
  */
 @ApiModel
-public class CourseSchedulePaymentVo extends CourseScheduleStudentPayment {
+public class CourseSchedulePaymentVo implements Serializable {
     @ApiModelProperty(value = "学生id")
     private Long studentId;
     @ApiModelProperty(value = "学生姓名")
     private String studentName;
     @ApiModelProperty(value = "真实姓名")
     private String studentRealName;
+    @ApiModelProperty(value = "学生手机号")
+    private String studentPhone;
     @ApiModelProperty(value = "实际价格")
     private BigDecimal actualPrice;
     @ApiModelProperty(value = "订单号")
@@ -50,22 +52,26 @@ public class CourseSchedulePaymentVo extends CourseScheduleStudentPayment {
         this.studentRealName = studentRealName;
     }
 
-    @Override
+    public String getStudentPhone() {
+        return studentPhone;
+    }
+
+    public void setStudentPhone(String studentPhone) {
+        this.studentPhone = studentPhone;
+    }
+
     public BigDecimal getActualPrice() {
         return actualPrice;
     }
 
-    @Override
     public void setActualPrice(BigDecimal actualPrice) {
         this.actualPrice = actualPrice;
     }
 
-    @Override
     public String getOrderNo() {
         return orderNo;
     }
 
-    @Override
     public void setOrderNo(String orderNo) {
         this.orderNo = orderNo;
     }

+ 106 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/CourseSchedulePlanVo.java

@@ -0,0 +1,106 @@
+package com.yonge.cooleshow.biz.dal.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @Author: cy
+ * @Date: 2022/5/20
+ */
+@ApiModel
+public class CourseSchedulePlanVo implements Serializable {
+    @ApiModelProperty(value = "课程id")
+    private Long courseId;
+    @ApiModelProperty(value = "课程介绍")
+    private String courseIntroduce;
+    @ApiModelProperty(value = "课程状态 NOT_START未开始 ING进行中 COMPLETE已完成 CANCEL已取消")
+    private String courseStatus;
+    @ApiModelProperty(value = "课时数")
+    private Integer classNum;
+    @ApiModelProperty(value = "上课日期")
+    private Date classDate;
+    @ApiModelProperty(value = "上课时间")
+    private Date startTime;
+    @ApiModelProperty(value = "下课时间")
+    private Date endTime;
+    @ApiModelProperty(value = "结算状态 NOT_START未上课、WAIT待结算、COMPLETE已结算、CANCEL已取消")
+    private String salaryStatus;
+    @ApiModelProperty(value = "录播地址")
+    private String url;
+
+    public Long getCourseId() {
+        return courseId;
+    }
+
+    public void setCourseId(Long courseId) {
+        this.courseId = courseId;
+    }
+
+    public String getCourseIntroduce() {
+        return courseIntroduce;
+    }
+
+    public void setCourseIntroduce(String courseIntroduce) {
+        this.courseIntroduce = courseIntroduce;
+    }
+
+    public String getCourseStatus() {
+        return courseStatus;
+    }
+
+    public void setCourseStatus(String courseStatus) {
+        this.courseStatus = courseStatus;
+    }
+
+    public Integer getClassNum() {
+        return classNum;
+    }
+
+    public void setClassNum(Integer classNum) {
+        this.classNum = classNum;
+    }
+
+    public Date getClassDate() {
+        return classDate;
+    }
+
+    public void setClassDate(Date classDate) {
+        this.classDate = classDate;
+    }
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+
+    public String getSalaryStatus() {
+        return salaryStatus;
+    }
+
+    public void setSalaryStatus(String salaryStatus) {
+        this.salaryStatus = salaryStatus;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+}
+

+ 33 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/UserOrderDetailVo.java

@@ -18,6 +18,15 @@ public class UserOrderDetailVo extends UserOrderDetail {
     @ApiModelProperty("订单id ")
     private Long orderId;
 
+    @ApiModelProperty("头像 ")
+    private String avatar;
+
+    @ApiModelProperty("用户名 ")
+    private String username;
+
+    @ApiModelProperty("星级 ")
+    private Double starGrade;
+
     @ApiModelProperty(value = "冗余字段,用于传递参数用")
     private Object bizParam;
 
@@ -37,6 +46,30 @@ public class UserOrderDetailVo extends UserOrderDetail {
         this.orderId = orderId;
     }
 
+    public String getAvatar() {
+        return avatar;
+    }
+
+    public void setAvatar(String avatar) {
+        this.avatar = avatar;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public Double getStarGrade() {
+        return starGrade;
+    }
+
+    public void setStarGrade(Double starGrade) {
+        this.starGrade = starGrade;
+    }
+
     public Object getBizParam() {
         return bizParam;
     }

+ 10 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/UserWithdrawalVo.java

@@ -18,6 +18,8 @@ public class UserWithdrawalVo extends UserWithdrawal {
 	private String bankName;
 	@ApiModelProperty("提现人 ")
 	private String	withdrawaUser;
+	@ApiModelProperty("提现手机号 ")
+	private String phone;
 
 	public String getBankName() {
 		return bankName;
@@ -42,4 +44,12 @@ public class UserWithdrawalVo extends UserWithdrawal {
 	public void setBankCard(String bankCard) {
 		this.bankCard = bankCard;
 	}
+
+	public String getPhone() {
+		return phone;
+	}
+
+	public void setPhone(String phone) {
+		this.phone = phone;
+	}
 }

+ 8 - 7
cooleshow-user/user-biz/src/main/resources/config/mybatis/ContractTemplateMapper.xml

@@ -139,13 +139,14 @@
 	</select>
 	
 	<select id="queryLatestContractTemplate" resultMap="BaseResultMap" parameterType="map">
-		SELECT * FROM contract_template where status_ = 1
-		<if test="type != null">
-			and type_ = #{type}
-		</if>
-		<if test="owner != null">
-			and owner_ = #{owner}
-		</if>
+		SELECT a.* FROM (
+			select
+				type_,MAX(version_) as version_
+			from contract_template where status_ = 1 and type_ = #{type}
+			group by type_
+		) t
+		left join contract_template a on t.type_ = a.type_ and t.version_ = a.version_
+		where a.type_ = #{type}
 	</select>
 	
 	<update id="disableContract" parameterType="map">

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

@@ -485,7 +485,140 @@
         </if>
     </select>
     <select id="selectLiveGroupStudent" resultType="com.yonge.cooleshow.biz.dal.vo.CourseSchedulePaymentVo">
-
+        SELECT
+            p.user_id_ AS studentId,
+            u.username_ AS studentName,
+            u.real_name_ AS studentRealName,
+            u.phone_ AS studentPhone,
+            p.actual_price_ AS actualPrice,
+            p.order_no_ AS orderNo,
+            o.create_time_ AS createdOrderTime
+        FROM course_schedule_student_payment p
+        LEFT JOIN sys_user u ON p.user_id_=u.id_
+        LEFT JOIN user_order o ON p.order_no_ = o.order_no_
+        WHERE p.course_group_id_=#{param.groupId}
+        <if test="param.search != null and param.search != ''">
+            AND (
+            p.course_id_ LIKE concat('%',#{param.search},'%') OR
+            p.user_id_ LIKE concat('%',#{param.search},'%') OR
+            u.username_ LIKE concat('%',#{param.search},'%') OR
+            u.phone_ LIKE concat('%',#{param.search},'%')
+            )
+        </if>
+        <if test="param.orderNo != null and param.orderNo != ''">
+            AND p.order_no_ = #{param.orderNo}
+        </if>
+        <if test="param.startTime != null">
+            AND o.create_time_ &lt;= #{param.startTime}
+        </if>
+        <if test="param.endTime != null">
+            AND o.create_time_ &gt;= #{param.endTime}
+        </if>
+    </select>
+    <select id="selectLiveGroupPlan" resultType="com.yonge.cooleshow.biz.dal.vo.CourseSchedulePlanVo">
+        SELECT
+            cs.id_ AS courseId,
+            g.course_introduce_ AS courseIntroduce,
+            cs.class_num_ AS classNum,
+            cs.class_date_ AS classDate,
+            cs.start_time_ AS startTime,
+            cs.end_time_ AS endTime,
+            ts.status_ AS salaryStatus,
+            v.url_ AS url,
+            cs.status_ AS courseStatus,
+            (CASE WHEN cs.start_time_ &gt;= ta.sign_in_time_ THEN 1 ELSE 0 END) AS teacherInSign,
+            (CASE WHEN cs.end_time_ &lt;= ta.sign_out_time_ THEN 1 ELSE 0 END) AS teacherOutSign
+        FROM course_schedule cs
+        LEFT JOIN course_group g ON cs.course_group_id_=g.id_
+        LEFT JOIN course_schedule_teacher_salary ts ON cs.id_=ts.course_schedule_id_
+        LEFT JOIN live_room_video v ON cs.id_=v.course_id_
+        LEFT JOIN teacher_attendance ta ON cs.id_=ta.course_schedule_id_
+        WHERE cs.course_group_id_= #{param.groupId}
+        <if test="param.salaryStatus != null and param.salaryStatus != ''">
+            AND ts.status_ = #{param.salaryStatus}
+        </if>
+        <if test="param.startTime != null">
+            AND cs.start_time_ &lt;= #{param.startTime}
+        </if>
+        <if test="param.endTime != null">
+            AND cs.end_time_ &gt;= #{param.endTime}
+        </if>
+        <if test="param.endTime != null">
+            AND cs.id_ LIKE concat('%',#{param.courseId},'%')
+        </if>
+    </select>
+    <select id="selectVideoGroup" resultType="com.yonge.cooleshow.biz.dal.vo.CourseGroupVideoVo">
+        SELECT
+            g.id_ AS groupId,
+            g.lesson_name_ AS lessonName,
+            g.lesson_subject_ AS subjectId,
+            s.name_ AS subjectName,
+            g.lesson_count_ AS lessonCount,
+            IFNULL(p.count_,0)  AS buyCount,
+            g.teacher_id_ AS teacherId,
+            u.username_ AS teacherName,
+            u.real_name_ AS teacherRealName,
+            g.create_time_ AS createTime
+        FROM video_lesson_group g
+        LEFT JOIN `subject` s ON g.lesson_subject_=s.id_
+        LEFT JOIN sys_user u ON g.teacher_id_=u.id_
+        LEFT JOIN (
+            SELECT video_lesson_group_id_,COUNT(1) AS count_ FROM video_lesson_purchase_record
+            WHERE order_status_='PAID' GROUP BY video_lesson_group_id_) p ON g.id_=p.video_lesson_group_id_
+        <where>
+            <if test="param.search != null and param.search != ''">
+                AND (
+                g.id_ LIKE concat('%',#{param.search},'%') OR
+                g.lesson_name_ LIKE concat('%',#{param.search},'%') OR
+                g.teacher_id_ LIKE concat('%',#{param.search},'%') OR
+                u.username_ LIKE concat('%',#{param.search},'%')
+                )
+            </if>
+            <if test="param.subjectId != null and param.subjectId != ''">
+                AND g.lesson_subject_ = #{param.subjectId}
+            </if>
+        </where>
+    </select>
+    <select id="selectVideoGroupStudent" resultType="com.yonge.cooleshow.biz.dal.vo.CourseGroupStudentVo">
+        SELECT
+            r.student_id_ AS studentId,
+            u.username_ AS studentName,
+            u.real_name_ AS studentRealName,
+            u.phone_ AS studentPhone,
+            r.order_no_ AS orderNo,
+            r.pay_money_ AS payMoney,
+            o.create_time_ AS createTime
+        FROM video_lesson_purchase_record r
+        LEFT JOIN sys_user u ON r.student_id_=u.id_
+        LEFT JOIN user_order o ON r.order_no_=o.order_no_
+        WHERE r.order_status_='PAID'
+        AND video_lesson_group_id_ = #{param.groupId}
+        <if test="param.search != null and param.search != ''">
+            AND (
+            r.student_id_ LIKE concat('%',#{param.search},'%') OR
+            u.username_ LIKE concat('%',#{param.search},'%') OR
+            u.phone_ LIKE concat('%',#{param.search},'%')
+            )
+        </if>
+        <if test="param.orderNo != null and param.orderNo != ''">
+            AND r.order_no_ = #{param.orderNo}
+        </if>
+        <if test="param.startTime != null">
+            AND o.create_time_ &lt;= #{param.startTime}
+        </if>
+        <if test="param.endTime != null">
+            AND o.create_time_ &gt;= #{param.endTime}
+        </if>
+    </select>
+    <select id="selectVideoGroupPlan" resultType="com.yonge.cooleshow.biz.dal.entity.VideoLessonGroupDetail">
+        SELECT
+            id_ AS id,
+            video_title_ AS videoTitle,
+            video_content_ AS videoContent,
+            video_url_ AS videoUrl,
+            cover_url_ AS coverUrl
+        FROM video_lesson_group_detail
+        WHERE video_lesson_group_id_=#{param.groupId}
     </select>
 
     <update id="opsPreStudentNum">

+ 19 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/SysUserContractRecordMapper.xml

@@ -27,5 +27,24 @@
             #{entity.contractNo}, #{entity.remark})
         </foreach>
     </insert>
+    <update id="contractCallbackUpdate" parameterType="java.util.Map">
+        UPDATE sys_user_contract_record
+        <set>
+            <if test="param.contractUrl !=null">url_ = #{param.contractUrl},</if>
+            created_time_ = SYSDATE()
+        </set>
+        WHERE contract_no_ = #{param.serialNo}
+    </update>
+
+    <select id="checkContractSign" resultType="java.lang.Boolean">
+        select count(1) from (
+            select
+                type_,MAX(version_) as version_
+            from contract_template where status_ = 1 and type_ = #{contractType}  group by type_
+        ) t
+        left join contract_template a on t.type_ = a.type_ and t.version_ = a.version_
+        left join sys_user_contract_record b on a.id_ = b.contract_id_
+        where b.user_id_ = #{userId}
+    </select>
 
 </mapper>

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

@@ -84,8 +84,13 @@
 
     <select id="getOrderDetilListByOrderNo" resultType="com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo">
         SELECT
-            <include refid="baseColumns" />
+            <include refid="baseColumns" />,
+            u.avatar_ as avatar,
+            u.username_ as username,
+            a.star_grade_ as starGrade
         FROM user_order_detail t
+        left join sys_user u on t.merch_id_ = u.id_
+        left join teacher_total a on t.merch_id_ = a.user_id_
         where t.order_no_ = #{orderNo}
     </select>
 

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

@@ -42,7 +42,8 @@
             <include refid="baseColumns"/>,
             bc.bank_name_ as bankName,
             bc.bank_card_ as bankCard,
-            u.username_  as withdrawaUser
+            bc.phone_ as phone,
+            u.username_  as withdrawaUser,
         FROM user_withdrawal t
         LEFT JOIN user_bank_card bc on t.bank_card_id_ = bc.id_ and t.user_id_ = bc.user_id_
         left join sys_user u on t.user_id_ = u.id_

+ 1 - 2
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/StudentSysUserContractRecordController.java → cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/SysUserContractRecordController.java

@@ -1,6 +1,5 @@
 package com.yonge.cooleshow.student.controller;
 
-import com.yonge.cooleshow.biz.dal.entity.SysUserContractRecord;
 import com.yonge.cooleshow.biz.dal.service.SysUserContractRecordService;
 import org.springframework.web.bind.annotation.*;
 import com.yonge.cooleshow.common.controller.BaseController;
@@ -17,7 +16,7 @@ import javax.annotation.Resource;
 @Api(tags = "用户协议记录表-一个用户一种协议一个版本一条记录")
 @RestController
 @RequestMapping("/sysUserContractRecord")
-public class StudentSysUserContractRecordController extends BaseController {
+public class SysUserContractRecordController extends BaseController {
     /**
      * 服务对象
      */

+ 1 - 1
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/config/ResourceServerConfig.java

@@ -33,7 +33,7 @@ public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
 				.authorizeRequests()
 				.antMatchers("/task/**").hasIpAddress("0.0.0.0/0")
 				.antMatchers("/v2/api-docs", "/code/*","/payment/callback",
-                        "/liveRoom/test","/liveRoom/syncUserStatus","/courseGroup/getLockCache","/withdraw/callback")
+                        "/liveRoom/test","/liveRoom/syncUserStatus","/courseGroup/getLockCache","/withdraw/callback","/withdraw/contractCallback")
                 .permitAll().anyRequest().authenticated().and().httpBasic();
 	}
 

+ 94 - 0
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/SysUserContractRecordController.java

@@ -0,0 +1,94 @@
+package com.yonge.cooleshow.teacher.controller;
+
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.auth.api.enums.SysUserType;
+import com.yonge.cooleshow.biz.dal.entity.ContractTemplate;
+import com.yonge.cooleshow.biz.dal.entity.SysUserContractRecord;
+import com.yonge.cooleshow.biz.dal.enums.ContractTypeEnum;
+import com.yonge.cooleshow.biz.dal.sdk.WithdrawSdk;
+import com.yonge.cooleshow.biz.dal.service.ContractTemplateService;
+import com.yonge.cooleshow.biz.dal.service.SysUserContractRecordService;
+import com.yonge.cooleshow.common.controller.BaseController;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.service.IdGeneratorService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+/**
+ * 用户协议记录表-一个用户一种协议一个版本一条记录(SysUserContractRecord)表控制层
+ *
+ * @author hgw
+ * @since 2022-05-07 15:04:05
+ */
+@Api(tags = "用户协议记录表-一个用户一种协议一个版本一条记录")
+@RestController
+@RequestMapping("/sysUserContractRecord")
+public class SysUserContractRecordController extends BaseController {
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private ContractTemplateService contractTemplateService;
+    @Resource
+    private SysUserContractRecordService sysUserContractRecordService;
+    @Autowired
+    private WithdrawSdk withdrawSdk;
+    @Autowired
+    private IdGeneratorService idGeneratorService;
+
+    @ApiOperation("判断用户是否签署协议")
+    @GetMapping(value = "/checkContractSign", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+    public HttpResponseResult<Boolean> checkContractSign(@ApiParam(value = "业务类型 REGISTER 注册 COURSES 课程购买 PRODUCT 产品 WITHDRAW 提现", required = true) @RequestParam("contractType") ContractTypeEnum contractType) {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        return sysUserContractRecordService.checkContractSign(user.getId(), contractType);
+    }
+
+    @ApiOperation("签署协议")
+    @GetMapping(value = "/sign", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+
+
+    public HttpResponseResult<Boolean> sign(
+            @ApiParam(value = "模板id", required = true) @RequestParam("templateId") Integer templateId) {
+
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+
+        String userType = "";
+        boolean flag = false;
+
+        Long contractNo = idGeneratorService.generatorId("contractNo");
+
+        ContractTemplate contractTemplate = contractTemplateService.get(templateId);
+        if (ContractTypeEnum.WITHDRAW.getCode().equals(contractTemplate.getType())) {
+            //签署提现协议
+            userType = SysUserType.TEACHER.getCode();
+
+            flag = withdrawSdk.signContract(user.getRealName(), user.getIdCardNo(), user.getPhone(), contractNo.toString());
+        }
+
+        if (flag) {
+            SysUserContractRecord contractRecord = new SysUserContractRecord();
+            contractRecord.setUserId(user.getId());
+            contractRecord.setUserType(userType);
+            contractRecord.setContractId(contractTemplate.getId());
+            contractRecord.setContractNo(contractNo.toString());
+            sysUserContractRecordService.save(contractRecord);
+        }
+        return HttpResponseResult.succeed(true);
+    }
+
+
+}
+

+ 0 - 28
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/TeacherSysUserContractRecordController.java

@@ -1,28 +0,0 @@
-package com.yonge.cooleshow.teacher.controller;
-
-import com.yonge.cooleshow.biz.dal.service.SysUserContractRecordService;
-import com.yonge.cooleshow.common.controller.BaseController;
-import io.swagger.annotations.Api;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import javax.annotation.Resource;
-
-/**
- * 用户协议记录表-一个用户一种协议一个版本一条记录(SysUserContractRecord)表控制层
- *
- * @author hgw
- * @since 2022-05-07 15:04:05
- */
-@Api(tags = "用户协议记录表-一个用户一种协议一个版本一条记录")
-@RestController
-@RequestMapping("/sysUserContractRecord")
-public class TeacherSysUserContractRecordController extends BaseController {
-    /**
-     * 服务对象
-     */
-    @Resource
-    private SysUserContractRecordService sysUserContractRecordService;
-
-}
-

+ 29 - 5
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/UserWithdrawalController.java

@@ -7,7 +7,6 @@ import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dto.req.WithdrawalReq;
 import com.yonge.cooleshow.biz.dal.dto.search.TeacherWithdrawalSearch;
 import com.yonge.cooleshow.biz.dal.entity.UserWithdrawalCallback;
-import com.yonge.cooleshow.biz.dal.props.WithdrawalProperties;
 import com.yonge.cooleshow.biz.dal.service.UserWithdrawalService;
 import com.yonge.cooleshow.biz.dal.support.PageUtil;
 import com.yonge.cooleshow.biz.dal.vo.UserWithdrawalVo;
@@ -28,6 +27,7 @@ import org.apache.commons.lang3.StringUtils;
 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.http.HttpStatus;
 import org.springframework.web.bind.annotation.*;
 import springfox.documentation.annotations.ApiIgnore;
@@ -53,8 +53,8 @@ public class UserWithdrawalController extends BaseController {
     @Autowired
     private SysUserFeignService sysUserFeignService;
 
-    @Autowired
-    private WithdrawalProperties withdrawalProperties;
+    @Value("${withdraw.privateKey}")
+    private String privateKey;
 
     @PostMapping("/getWithdrawalInfo")
     @ApiOperation(value = "查询提现页面信息")
@@ -76,6 +76,7 @@ public class UserWithdrawalController extends BaseController {
         return userWithdrawalService.withdrawal(user, withdrawalReq);
     }
 
+
     @PostMapping("/withdrawalPage")
     @ApiOperation(value = "提现记录")
     @ApiImplicitParams({
@@ -118,7 +119,7 @@ public class UserWithdrawalController extends BaseController {
     }
 
     /**
-     * 异步回调接收
+     * 异步回调接收-提现
      * @param content
      * @param request
      * @return
@@ -131,7 +132,7 @@ public class UserWithdrawalController extends BaseController {
                 throw new Exception();
             }
             Map<String, Object> map = JSONObject.parseObject(content);
-            String jsonStr = RSA.decryptPri((String) map.get("sign"), withdrawalProperties.getPrivateKey());
+            String jsonStr = RSA.decryptPri((String) map.get("sign"), privateKey);
             log.info("jsonStr:{}", jsonStr);
 
             Map<String, Object> withdrawRecord = JSONObject.parseObject(jsonStr);
@@ -148,4 +149,27 @@ public class UserWithdrawalController extends BaseController {
         return "success";
     }
 
+    /**
+     * 异步回调接收-签署协议
+     * @param content
+     * @param request
+     * @return
+     */
+    @PostMapping("/contractCallback")
+    public String contractCallback(@RequestBody String content, HttpServletRequest request) {
+        log.info("回调请求地址:{} 请求参数:{}", request.getRemoteAddr(), content);
+        try {
+            if (StringUtils.isBlank(content)) {
+                throw new Exception();
+            }
+            Map<String, Object> map = JSONObject.parseObject(content);
+            String jsonStr = (String) map.get("content");
+            Map<String, Object> record = JSONObject.parseObject(jsonStr);
+            userWithdrawalService.contractCallback(record);
+        } catch (Exception e) {
+            log.error("签署失败e:{}", e);
+            return "failed";
+        }
+        return "success";
+    }
 }

+ 110 - 96
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/WithdrawController.java

@@ -1,96 +1,110 @@
-package com.yonge.cooleshow.teacher.controller;
-
-import com.alibaba.fastjson.JSONObject;
-import com.yonge.cooleshow.biz.dal.entity.UserWithdrawalCallback;
-import com.yonge.cooleshow.biz.dal.service.LingXinService;
-import com.yonge.cooleshow.biz.dal.service.UserWithdrawalCallbackService;
-import com.yonge.cooleshow.common.controller.BaseController;
-import com.yonge.toolset.thirdparty.lingxinpay.RSA;
-import com.yonge.cooleshow.biz.dal.sdk.WithdrawSdk;
-import com.yonge.toolset.utils.json.JsonUtil;
-import io.swagger.annotations.Api;
-import org.apache.commons.lang3.StringUtils;
-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.web.bind.annotation.*;
-
-import javax.servlet.http.HttpServletRequest;
-import java.util.Map;
-import java.util.UUID;
-
-/**
- * @Description: 提现回调
- * @Author: cy
- * @Date: 2022/5/9
- */
-@RestController
-@RequestMapping("/withdraw")
-@Api(value = "提现回调", tags = "提现回调")
-public class WithdrawController extends BaseController {
-    private final static Logger log = LoggerFactory.getLogger(WithdrawController.class);
-
-    @Value("${withdraw.privateKey}")
-    private String privateKey;//商户自己生成的私钥
-
-    @Autowired
-    private UserWithdrawalCallbackService callbackService;
-
-    /**
-     * 异步回调接收
-     *
-     * @param content
-     * @param request
-     * @return
-     */
-    @PostMapping("/callback")
-    public String test(@RequestBody String content, HttpServletRequest request) {
-        System.out.println(privateKey);
-        log.info("交易回调请求地址:{} 请求参数:{}", request.getRemoteAddr(), content);
-        try {
-            if (StringUtils.isBlank(content)) {
-                throw new Exception();
-            }
-            Map<String, Object> map = JSONObject.parseObject(content);
-            String jsonStr = RSA.decryptPri((String) map.get("sign"), privateKey);
-            log.info("jsonStr:{}", jsonStr);
-
-            Map<String, Object> withdrawRecord = JSONObject.parseObject(jsonStr);
-            UserWithdrawalCallback callback = JsonUtil.toJavaObject(withdrawRecord, UserWithdrawalCallback.class);
-            callbackService.insertCallback(callback);
-        } catch (Exception e) {
-            log.error("解密失败e:{}", e);
-            return "failed";
-        }
-        return "success";
-    }
-
-    /**
-     * 提现测试接口
-     * @param remark
-     * @return
-     */
-    @GetMapping("/test")
-    public String a(String remark) {
-        WithdrawSdk withdraw = new WithdrawSdk();
-        //输入商户订单号
-        String outerOrderNo = UUID.randomUUID().toString().substring(0, 12);
-        System.out.println("商户订单号:" + outerOrderNo);
-        //输入收款人手机号
-        String name = "何亮";
-        //输入收款人姓名
-        String mobile = "17600220933";
-        //输入收款人身份证号
-        String certificateNo = "130423199206192818";
-        //输入转账金额(单位分)
-        Integer predictAmount = 1;
-        //输入收款人账号
-        String payAccount = "6228480018864836772";
-
-        String requestParam = withdraw.withdraw(outerOrderNo, name, mobile, certificateNo, predictAmount,
-                payAccount, remark);
-        log.info("单笔请求返回参数:{}", requestParam);
-        return requestParam;
-    }
-}
+//package com.yonge.cooleshow.teacher.controller;
+//
+//import com.alibaba.fastjson.JSONObject;
+//import com.yonge.cooleshow.biz.dal.entity.UserWithdrawalCallback;
+//import com.yonge.cooleshow.biz.dal.service.LingXinService;
+//import com.yonge.cooleshow.biz.dal.service.UserWithdrawalCallbackService;
+//import com.yonge.cooleshow.common.controller.BaseController;
+//import com.yonge.toolset.thirdparty.lingxinpay.RSA;
+//import com.yonge.cooleshow.biz.dal.sdk.WithdrawSdk;
+//import com.yonge.toolset.utils.json.JsonUtil;
+//import io.swagger.annotations.Api;
+//import org.apache.commons.lang3.StringUtils;
+//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.web.bind.annotation.*;
+//
+//import javax.servlet.http.HttpServletRequest;
+//import java.util.Map;
+//import java.util.UUID;
+//
+///**
+// * @Description: 提现回调
+// * @Author: cy
+// * @Date: 2022/5/9
+// */
+//@RestController
+//@RequestMapping("/withdraw")
+//@Api(value = "提现回调", tags = "提现回调")
+//public class WithdrawController extends BaseController {
+//    private final static Logger log = LoggerFactory.getLogger(WithdrawController.class);
+//
+//    @Value("${withdraw.privateKey}")
+//    private String privateKey;//商户自己生成的私钥
+//
+//    @Autowired
+//    private UserWithdrawalCallbackService callbackService;
+//    @Autowired
+//    private LingXinService lingXinService;
+//
+//    /**
+//     * 异步回调接收
+//     *
+//     * @param content
+//     * @param request
+//     * @return
+//     */
+//    @PostMapping("/callback")
+//    public String test(@RequestBody String content, HttpServletRequest request) {
+//        System.out.println(privateKey);
+//        log.info("交易回调请求地址:{} 请求参数:{}", request.getRemoteAddr(), content);
+//        try {
+//            if (StringUtils.isBlank(content)) {
+//                throw new Exception();
+//            }
+//            Map<String, Object> map = JSONObject.parseObject(content);
+//            String jsonStr = RSA.decryptPri((String) map.get("sign"), privateKey);
+//            log.info("jsonStr:{}", jsonStr);
+//
+//            Map<String, Object> withdrawRecord = JSONObject.parseObject(jsonStr);
+//            UserWithdrawalCallback callback = JsonUtil.toJavaObject(withdrawRecord, UserWithdrawalCallback.class);
+//            callbackService.insertCallback(callback);
+//        } catch (Exception e) {
+//            log.error("解密失败e:{}", e);
+//            return "failed";
+//        }
+//        return "success";
+//    }
+//
+//    @PostMapping("/contractCallback")
+//    public String contractCallback(@RequestBody String content, HttpServletRequest request) {
+//        log.info("回调请求地址:{} 请求参数:{}", request.getRemoteAddr(), content);
+//        try {
+//            System.out.println("===成功===");
+//        } catch (Exception e) {
+//            System.out.println("===失败===");
+//            return "failed";
+//        }
+//        return "success";
+//    }
+//
+//    /**
+//     * 提现测试接口
+//     * @param remark
+//     * @return
+//     */
+//    @GetMapping("/test")
+//    public String a(String remark) {
+//        WithdrawSdk withdraw = new WithdrawSdk();
+//        //输入商户订单号
+//        String outerOrderNo = UUID.randomUUID().toString().substring(0, 12);
+//        System.out.println("商户订单号:" + outerOrderNo);
+//        //输入收款人手机号
+//        String name = "何亮";
+//        //输入收款人姓名
+//        String mobile = "17600220933";
+//        //输入收款人身份证号
+//        String certificateNo = "130423199206192818";
+//        //输入转账金额(单位分)
+//        Integer predictAmount = 1;
+//        //输入收款人账号
+//        String payAccount = "6228480018864836772";
+//
+//        String requestParam = withdraw.withdraw(outerOrderNo, name, mobile, certificateNo, predictAmount,
+//                payAccount, remark);
+//        log.info("单笔请求返回参数:{}", requestParam);
+//        return requestParam;
+//    }
+//}

+ 2 - 2
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/model/Payment.java

@@ -14,13 +14,13 @@ import java.util.Map;
  */
 public class Payment extends Base {
     /***
-     * 三方支付流水号(请求后才有)
+     * 三方支付流水号(请求后才有) 查询订单必传
      * @author liweifan
      * @updateTime 2022/3/31 11:00
      */
     private String id;
     /***
-     * 支付订单号(必填)
+     * 支付订单号(必填) 查询订单必传
      * @author liweifan
      * @updateTime 2022/3/31 11:00
      */