Bläddra i källkod

merge:解决冲突

liujunchi 3 år sedan
förälder
incheckning
63cebedc93
33 ändrade filer med 812 tillägg och 165 borttagningar
  1. 7 0
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/dal/dao/SysUserDao.java
  2. 4 0
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/service/impl/SysUserServiceImpl.java
  3. 6 4
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/web/controller/UserController.java
  4. 3 0
      cooleshow-auth/auth-server/src/main/resources/config/mybatis/SysUserMapper.xml
  5. 37 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/PracticeController.java
  6. 3 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseScheduleDao.java
  7. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseScheduleRepliedDao.java
  8. 14 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/PracticeDao.java
  9. 3 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserAccountDao.java
  10. 8 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserBankCardDao.java
  11. 27 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/UserBankCardDto.java
  12. 110 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/PracticeSearch.java
  13. 6 6
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserAccount.java
  14. 18 19
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserBankCard.java
  15. 1 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/InOrOutEnum.java
  16. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseScheduleService.java
  17. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/PracticeService.java
  18. 2 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserBankCardService.java
  19. 36 30
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseRepliedServiceImpl.java
  20. 8 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleServiceImpl.java
  21. 29 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/PracticeServiceImpl.java
  22. 5 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserAccountServiceImpl.java
  23. 34 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserBankCardServiceImpl.java
  24. 3 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserWithdrawalServiceImpl.java
  25. 168 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/PracticeVo.java
  26. 9 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  27. 14 14
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleRepliedMapper.xml
  28. 89 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/PracticeMapper.xml
  29. 4 4
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserAccountMapper.xml
  30. 9 3
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserBankCardMapper.xml
  31. 13 0
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/CourseScheduleController.java
  32. 3 1
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/UserBankCardController.java
  33. 125 72
      toolset/utils/src/main/java/com/yonge/toolset/utils/validator/CommonValidator.java

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

@@ -136,4 +136,11 @@ public interface SysUserDao extends BaseDAO<Long, SysUser> {
      * @updateTime 2022/3/22 11:06
      */
     void updatetSetDetail(@Param("param") UserSetReq setReq, @Param("id") Long id);
+    /***
+     * 创建用户账户
+     * @author liweifan
+     * @param: id
+     * @updateTime 2022/4/14 17:07
+     */
+    void createUserAccount(@Param("userId")Long id);
 }

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

@@ -11,6 +11,7 @@ import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.toolset.utils.idcard.IdcardInfoExtractor;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.userdetails.User;
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -158,6 +159,8 @@ public class SysUserServiceImpl extends BaseServiceImpl<Long, SysUser> implement
             //sysTenantAccount
             //创建teacher表
             sysUserDao.saveTeacher(sysUser.getId());
+            //创建老师账户
+            sysUserDao.createUserAccount(sysUser.getId());
             return queryUserInfoByPhone(phone);
         } else if (StringUtils.equalsIgnoreCase(clientId, "STUDENT")) {
             sysUser.setUserType("STUDENT");
@@ -181,6 +184,7 @@ public class SysUserServiceImpl extends BaseServiceImpl<Long, SysUser> implement
 
     @Override
     public void saveTeacher(Long userId) {
+
         sysUserDao.saveTeacher(userId);
     }
 

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

@@ -158,7 +158,7 @@ public class UserController extends BaseController {
     @ApiOperation(value = "设置用户名密码")
     @PostMapping(value = "/setUsernameAndPassword", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
     @ApiImplicitParams({@ApiImplicitParam(name = "password", value = "密码", required = true, dataType = "String"),
-            @ApiImplicitParam(name = "username", value = "用户名", required = true, dataType = "String")})
+            @ApiImplicitParam(name = "username", value = "用户名", dataType = "String")})
     public Object setPassword(String password, String username) {
         if (StringUtils.isEmpty(password)) {
             return failed("参数校验失败");
@@ -171,10 +171,12 @@ public class UserController extends BaseController {
         if (sysUser == null) {
             return failed("用户不存在");
         }
-        if (sysUser.getUserType().contains("SYSTEM")) {
-            sysUser.setRealName(username);
+        if(!StringUtil.isEmpty(username)){
+            if (sysUser.getUserType().contains("SYSTEM")) {
+                sysUser.setRealName(username);
+            }
+            sysUser.setUsername(username);
         }
-        sysUser.setUsername(username);
 		/*if(StringUtils.isEmpty(sysUser.getImToken())){
 			ImResult register = imFeignService.register(new ImUserModel(sysUser.getId().toString(), username, sysUser.getAvatar()));
 			sysUser.setImToken(register.getToken());

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

@@ -71,6 +71,9 @@
     <insert id="saveStudent">
         INSERT INTO student (user_id_,create_time_,update_time_) VALUES(#{userId},NOW(),NOW())
     </insert>
+    <insert id="createUserAccount">
+        INSERT INTO user_cash_account (user_id_,create_time_,update_time_)VALUES(#{userId},NOW(),NOW())
+    </insert>
 
     <!-- 根据主键查询一条记录 -->
     <update id="update" parameterType="com.yonge.cooleshow.auth.api.entity.SysUser">

+ 37 - 0
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/PracticeController.java

@@ -0,0 +1,37 @@
+package com.yonge.cooleshow.admin.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.cooleshow.biz.dal.dto.search.PracticeSearch;
+import com.yonge.cooleshow.biz.dal.service.PracticeService;
+import com.yonge.cooleshow.biz.dal.support.PageUtil;
+import com.yonge.cooleshow.biz.dal.vo.PracticeVo;
+import com.yonge.cooleshow.common.controller.BaseController;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.page.PageInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@RequestMapping("/pactice")
+@Api(value = "陪练课")
+public class PracticeController extends BaseController {
+
+    @Autowired
+    private PracticeService pacticeService;
+
+    @ApiOperation(value = "陪练课-老师详情")
+    @PostMapping("/teacherPactice")
+    public HttpResponseResult<PageInfo<PracticeVo>> teacherPactice(@RequestBody PracticeSearch search) {
+        IPage<PracticeVo> pages = pacticeService.selectTeacherPactice(PageUtil.getPage(search), search);
+        return succeed(PageUtil.pageInfo(pages));
+    }
+
+    @ApiOperation(value = "陪练课-学生详情")
+    @PostMapping("/studentPactice")
+    public HttpResponseResult<PageInfo<PracticeVo>> studentPactice(@RequestBody PracticeSearch search) {
+        IPage<PracticeVo> pages = pacticeService.selectStudentPactice(PageUtil.getPage(search), search);
+        return succeed(PageUtil.pageInfo(pages));
+    }
+}

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

@@ -88,5 +88,8 @@ public interface CourseScheduleDao extends BaseMapper<CourseSchedule> {
 
     //根据学生id查询老师
     List<MyCourseVo> queryStudentPracticeCourse(IPage<MyCourseVo> page, @Param("param") MyCourseSearch search);
+
+    //查询学生约课日历
+    List<String> queryCourseScheduleStudent(MyCourseSearch search);
 }
 

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

@@ -50,5 +50,5 @@ public interface CourseScheduleRepliedDao extends BaseMapper<CourseScheduleRepli
 	 * @Author: cy
 	 * @Date: 2022/4/13
 	 */
-	void insertReplied(CourseScheduleReplied replied);
+	void insertReplied(@Param("param") CourseScheduleReplied replied);
 }

+ 14 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/PracticeDao.java

@@ -0,0 +1,14 @@
+package com.yonge.cooleshow.biz.dal.dao;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.cooleshow.biz.dal.dto.search.PracticeSearch;
+import com.yonge.cooleshow.biz.dal.vo.PracticeVo;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface PracticeDao {
+    List<PracticeVo> selectTeacherPactice(IPage page, @Param("param") PracticeSearch search);
+
+    List<PracticeVo> selectStudentPactice(IPage<PracticeVo> page, @Param("param") PracticeSearch search);
+}

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

@@ -36,7 +36,7 @@ public interface UserAccountDao extends BaseMapper<UserAccount>{
 	 * @updateTime 2022/4/7 17:54
 	 * @return: java.lang.Integer
 	 */
-    Integer frozenChangeAccount(@Param("userId") Long userId, @Param("transAmount") BigDecimal transAmount,@Param("inOrOut") InOrOutEnum inOrOut);
+    Integer frozenChangeAccount(@Param("userId") Long userId, @Param("transAmount") BigDecimal transAmount,@Param("inOrOut") String inOrOut);
 	/***
 	 * 账户变更(解冻)
 	 * @author liweifan
@@ -45,7 +45,7 @@ public interface UserAccountDao extends BaseMapper<UserAccount>{
 	 * @updateTime 2022/4/7 17:54
 	 * @return: java.lang.Integer
 	 */
-	Integer unfrozenChangeAccount(@Param("userId") Long userId, @Param("transAmount") BigDecimal transAmount,@Param("inOrOut") InOrOutEnum inOrOut);
+	Integer unfrozenChangeAccount(@Param("userId") Long userId, @Param("transAmount") BigDecimal transAmount,@Param("inOrOut") String inOrOut);
 	/***
 	 * 账户变更(余额)
 	 * @author liweifan
@@ -54,5 +54,5 @@ public interface UserAccountDao extends BaseMapper<UserAccount>{
 	 * @updateTime 2022/4/7 19:11
 	 * @return: java.lang.Integer
 	 */
-	Integer changeAccount(@Param("userId") Long userId, @Param("transAmount") BigDecimal transAmount,@Param("inOrOut") InOrOutEnum inOrOut);
+	Integer changeAccount(@Param("userId") Long userId, @Param("transAmount") BigDecimal transAmount,@Param("inOrOut") String inOrOut);
 }

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

@@ -43,4 +43,12 @@ public interface UserBankCardDao extends BaseMapper<UserBankCard>{
 	 * @return: com.yonge.cooleshow.biz.dal.vo.UserBankCardVo
 	 */
     UserBankCardVo getBankByUserIdAndCardId(@Param("userId") Long userId,@Param("bankCardId")  Long bankCardId);
+	/***
+	 * 删除用户所有银行卡
+	 * @author liweifan
+	 * @param: userId
+	 * @updateTime 2022/4/14 16:36
+	 * @return: java.lang.Integer
+	 */
+    Integer deleteByUserId(@Param("userId") Long userId);
 }

+ 27 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/UserBankCardDto.java

@@ -0,0 +1,27 @@
+package com.yonge.cooleshow.biz.dal.dto;
+
+import com.yonge.cooleshow.biz.dal.entity.UserBankCard;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * @Author: liweifan
+ * @Data: 2022/4/14 16:10
+ */
+@ApiModel(value = "UserBankCardDto对象", description = "银行卡绑卡数据传输对象")
+public class UserBankCardDto extends UserBankCard {
+
+    @ApiModelProperty(value = "身份证号码")
+    @NotBlank(message = "身份证号码不能为空")
+    private String idCardNo;
+
+    public String getIdCardNo() {
+        return idCardNo;
+    }
+
+    public void setIdCardNo(String idCardNo) {
+        this.idCardNo = idCardNo;
+    }
+}

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

@@ -0,0 +1,110 @@
+package com.yonge.cooleshow.biz.dal.dto.search;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.yonge.cooleshow.common.page.QueryInfo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+/**
+ * @Author: cy
+ * @Date: 2022/4/14
+ */
+@ApiModel(value = "PracticeSearch")
+public class PracticeSearch extends QueryInfo {
+    @ApiModelProperty(value = "老师id")
+    private Long teacherId;
+
+    @ApiModelProperty(value = "学生id")
+    private Long studentId;
+
+    @ApiModelProperty(value = "课程编号/用户编号/用户姓名/用户手机")
+    private String search;
+
+    @ApiModelProperty(value = "订单号")
+    private String orderNo;
+
+    @ApiModelProperty("课程声部id")
+    private Long subjectId;
+
+    @ApiModelProperty(value = "课程状态")
+    private String status;
+
+    @ApiModelProperty(value = "开始时间")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date startTime;
+
+    @ApiModelProperty(value = "结束时间")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date endTime;
+
+    public Long getTeacherId() {
+        return teacherId;
+    }
+
+    public void setTeacherId(Long teacherId) {
+        this.teacherId = teacherId;
+    }
+
+    public Long getStudentId() {
+        return studentId;
+    }
+
+    public void setStudentId(Long studentId) {
+        this.studentId = studentId;
+    }
+
+    @Override
+    public String getSearch() {
+        return search;
+    }
+
+    @Override
+    public void setSearch(String search) {
+        this.search = search;
+    }
+
+    public String getOrderNo() {
+        return orderNo;
+    }
+
+    public void setOrderNo(String orderNo) {
+        this.orderNo = orderNo;
+    }
+
+    public Long getSubjectId() {
+        return subjectId;
+    }
+
+    public void setSubjectId(Long subjectId) {
+        this.subjectId = subjectId;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    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;
+    }
+}

+ 6 - 6
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserAccount.java

@@ -21,27 +21,27 @@ import java.math.BigDecimal;
 public class UserAccount implements Serializable {
 	private static final long serialVersionUID = 1L;
     @ApiModelProperty("用户表id ")
-    @TableId(value = "user_id_", type = IdType.AUTO)
+    @TableId(value = "user_id_")
     private Long userId;
     @ApiModelProperty("总金额 ")
-	@TableField(value = "amount_total")
+	@TableField(value = "amount_total_")
     private BigDecimal amountTotal;
     @ApiModelProperty("可用余额 ")
-	@TableField(value = "amount_usable")
+	@TableField(value = "amount_usable_")
     private BigDecimal amountUsable;
     @ApiModelProperty("冻结金额 ")
-	@TableField(value = "amount_frozen")
+	@TableField(value = "amount_frozen_")
     private BigDecimal amountFrozen;
     @ApiModelProperty("状态 0-停用 1-使用 ")
 	@TableField(value = "status_")
     private Byte status;
     @ApiModelProperty("创建时间 ")
-	@TableField(value = "create_time")
+	@TableField(value = "create_time_")
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
     private Date createTime;
     @ApiModelProperty("修改时间 ")
-	@TableField(value = "update_time")
+	@TableField(value = "update_time_")
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
     private Date updateTime;

+ 18 - 19
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserBankCard.java

@@ -28,9 +28,6 @@ public class UserBankCard implements Serializable {
 	@TableField(value = "name_")
     @NotBlank(message = "持卡人姓名不能为空")
     private String name;
-    @ApiModelProperty("开户行 ")
-	@TableField(value = "bank_name_")
-    private String bankName;
     @ApiModelProperty("银行卡号 ")
 	@TableField(value = "bank_card_")
     @NotBlank(message = "银行卡号不能为空")
@@ -41,11 +38,13 @@ public class UserBankCard implements Serializable {
     private String phone;
     @ApiModelProperty("开户行编码 ")
 	@TableField(value = "bank_code_")
-    @NotBlank(message = "开户行不能为空")
     private String bankCode;
+    @ApiModelProperty("开户行 ")
+    @TableField(value = "bank_name_")
+    private String bankName;
     @ApiModelProperty("是否默认 ")
-	@TableField(value = "is_default_")
-    private Byte isDefault;
+	@TableField(value = "default_flag_")
+    private Boolean defaultFlag;
     @ApiModelProperty("创建时间 ")
 	@TableField(value = "create_time_")
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@@ -59,7 +58,7 @@ public class UserBankCard implements Serializable {
     @ApiModelProperty("逻辑删除 ")
     @TableField(value = "del_flag_")
     @TableLogic
-    private Byte delFlag;
+    private Boolean delFlag;
 	public Long getId() {
         return id;
     }
@@ -115,24 +114,24 @@ public class UserBankCard implements Serializable {
     public void setBankCode(String bankCode) {
         this.bankCode = bankCode;
     }
-    
-	public Byte getDelFlag() {
-        return delFlag;
+
+    public Boolean getDefaultFlag() {
+        return defaultFlag;
     }
 
-    public void setDelFlag(Byte delFlag) {
-        this.delFlag = delFlag;
+    public void setDefaultFlag(Boolean defaultFlag) {
+        this.defaultFlag = defaultFlag;
     }
-    
-	public Byte getIsDefault() {
-        return isDefault;
+
+    public Boolean getDelFlag() {
+        return delFlag;
     }
 
-    public void setIsDefault(Byte isDefault) {
-        this.isDefault = isDefault;
+    public void setDelFlag(Boolean delFlag) {
+        this.delFlag = delFlag;
     }
-    
-	public Date getCreateTime() {
+
+    public Date getCreateTime() {
         return createTime;
     }
 

+ 1 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/InOrOutEnum.java

@@ -12,6 +12,7 @@ public enum InOrOutEnum implements BaseEnum<String, InOrOutEnum> {
 
     IN("收入"),
     OUT("支出");
+
     @EnumValue
     private String code;
     private String msg;

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

@@ -156,5 +156,7 @@ public interface CourseScheduleService extends IService<CourseSchedule> {
      * @return boolean true 属于老师
      */
     boolean checkCourseSchedule(Long teacherId, Long courseId);
+
+    List<String> queryCourseScheduleStudent(MyCourseSearch search);
 }
 

+ 11 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/PracticeService.java

@@ -0,0 +1,11 @@
+package com.yonge.cooleshow.biz.dal.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.cooleshow.biz.dal.dto.search.PracticeSearch;
+import com.yonge.cooleshow.biz.dal.vo.PracticeVo;
+
+public interface PracticeService {
+    IPage<PracticeVo> selectTeacherPactice(IPage<PracticeVo> page, PracticeSearch search);
+
+    IPage<PracticeVo> selectStudentPactice(IPage<PracticeVo> page, PracticeSearch search);
+}

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

@@ -2,6 +2,7 @@ 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.biz.dal.dto.UserBankCardDto;
 import com.yonge.cooleshow.biz.dal.vo.UserBankCardVo;
 import com.yonge.cooleshow.biz.dal.dto.search.UserBankCardSearch;
 import com.yonge.cooleshow.biz.dal.entity.UserBankCard;
@@ -34,5 +35,5 @@ public interface UserBankCardService extends IService<UserBankCard>  {
 	 * @updateTime 2022/4/14 15:53
 	 * @return: com.yonge.cooleshow.common.entity.HttpResponseResult<com.yonge.cooleshow.biz.dal.entity.UserBankCard>
 	 */
-    HttpResponseResult<UserBankCard> bankCard(UserBankCard bankCard);
+    HttpResponseResult<UserBankCard> bankCard(UserBankCardDto bankCard);
 }

+ 36 - 30
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseRepliedServiceImpl.java

@@ -51,55 +51,45 @@ public class CourseRepliedServiceImpl extends ServiceImpl<CourseScheduleRepliedD
         Long scheduleId = replied.getCourseScheduleId();
         Long studentId = replied.getStudentId();
 
-        CourseSchedule schedule = scheduleDao.selectById(scheduleId);
-        if (schedule == null) {
+        CourseSchedule courseSchedule = scheduleDao.selectById(scheduleId);
+        if (courseSchedule == null) {
             throw new RuntimeException("课程不存在");
         }
-        if (schedule.getStatus().equals(CourseScheduleEnum.NOT_START.getCode())) {
+        if (courseSchedule.getStatus().equals(CourseScheduleEnum.NOT_START.getCode())) {
             throw new RuntimeException("课程未开始无法评论");
         }
 
         //当前用户为老师
-        CourseSchedule courseSchedule = scheduleDao.selectById(scheduleId);
-        if (courseSchedule != null) {
-            Long teacherId = courseSchedule.getTeacherId();
-            if (userId == teacherId) {
-                if (studentId == null) {
-                    throw new RuntimeException("学生id不能为空");
-                }
-                replied.setScore(null);
-                replied.setStudentReplied(null);
-                if (!repliedIsNull(replied)){//评论已存在
-                    repliedDao.updateReplied(replied);
-                    return;
-                }
-                repliedDao.insertReplied(replied);
+        if (userId == courseSchedule.getTeacherId()) {
+            if (studentId == null) {
+                throw new RuntimeException("评价的学生id不能为空");
+            }
+            isPayment(studentId, scheduleId);
+            replied.setScore(null);
+            replied.setStudentReplied(null);
+            if (!repliedIsNull(replied)) {
+                repliedDao.updateReplied(replied);
                 return;
             }
+            repliedDao.insert(replied);
+            return;
         }
 
         //当前用户为学员
-        QueryWrapper<CourseScheduleStudentPayment> wrapper = new QueryWrapper<>();
-        wrapper.eq("user_id_", userId);
-        wrapper.eq("course_id_", scheduleId);
-        wrapper.eq("course_type_", CourseScheduleEnum.PRACTICE);
-        CourseScheduleStudentPayment payment = paymentDao.selectOne(wrapper);
-        if (payment == null) {
-            throw new RuntimeException("未购买该课无法评论");
-        }
+        isPayment(userId, scheduleId);
         replied.setStudentId(userId);
         replied.setTeacherReplied(null);
-        if (!repliedIsNull(replied)){//评论已存在
+        if (!repliedIsNull(replied)) {
             repliedDao.updateReplied(replied);
             return;
         }
-        repliedDao.insertReplied(replied);
+        repliedDao.insert(replied);
     }
 
     /**
-     * @Description: 判断评论是否存在
-     * @Author: cy
-     * @Date: 2022/4/13
+     * 判断评论是否存在
+     * @param replied
+     * @return
      */
     public boolean repliedIsNull(CourseScheduleReplied replied) {
         QueryWrapper<CourseScheduleReplied> queryWrapper = new QueryWrapper<>();
@@ -112,6 +102,22 @@ public class CourseRepliedServiceImpl extends ServiceImpl<CourseScheduleRepliedD
     }
 
     /**
+     * 校验当前用户是否购买课程
+     * @param userId     学员id
+     * @param scheduleId 课程id
+     */
+    public void isPayment(Long userId, Long scheduleId) {
+        QueryWrapper<CourseScheduleStudentPayment> wrapper = new QueryWrapper<>();
+        wrapper.eq("user_id_", userId);
+        wrapper.eq("course_id_", scheduleId);
+        wrapper.eq("course_type_", CourseScheduleEnum.PRACTICE.getCode());
+        CourseScheduleStudentPayment payment = paymentDao.selectOne(wrapper);
+        if (payment == null) {
+            throw new RuntimeException("学生未购买该课无法评论");
+        }
+    }
+
+    /**
      * @Description: 首页-我的课程-课程详情-查询评价
      * @Author: cy
      * @Date: 2022/4/12

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

@@ -681,5 +681,13 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         CourseSchedule courseSchedule = this.getById(courseId);
         return teacherId.equals(courseSchedule.getTeacherId());
     }
+    /**
+     * @Description: 查询学生约课日历
+     * @Author: cy
+     * @Date: 2022/4/14
+     */
+    public List<String> queryCourseScheduleStudent(MyCourseSearch search) {
+        return baseMapper.queryCourseScheduleStudent(search);
+    }
 }
 

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

@@ -0,0 +1,29 @@
+package com.yonge.cooleshow.biz.dal.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.cooleshow.biz.dal.dao.PracticeDao;
+import com.yonge.cooleshow.biz.dal.dto.search.PracticeSearch;
+import com.yonge.cooleshow.biz.dal.service.PracticeService;
+import com.yonge.cooleshow.biz.dal.vo.PracticeVo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author: cy
+ * @date: 2022/4/14 15:04
+ */
+@Service
+public class PracticeServiceImpl implements PracticeService {
+    @Autowired
+    private PracticeDao practiceDao;
+
+    @Override
+    public IPage<PracticeVo> selectTeacherPactice(IPage<PracticeVo> page, PracticeSearch search) {
+        return page.setRecords(practiceDao.selectTeacherPactice(page, search));
+    }
+
+    @Override
+    public IPage<PracticeVo> selectStudentPactice(IPage<PracticeVo> page, PracticeSearch search) {
+        return page.setRecords(practiceDao.selectStudentPactice(page, search));
+    }
+}

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

@@ -64,11 +64,11 @@ public class UserAccountServiceImpl extends ServiceImpl<UserAccountDao, UserAcco
 
     private HttpResponseResult<UserAccountRecord> doAccountChange(UserAccountRecordDto accountRecordDto) {
         if (FrozenTypeEnum.FROZEN.equals(accountRecordDto.getFrozenType())) {
-            baseMapper.frozenChangeAccount(accountRecordDto.getUserId(), accountRecordDto.getTransAmount(), accountRecordDto.getInOrOut());
+            baseMapper.frozenChangeAccount(accountRecordDto.getUserId(), accountRecordDto.getTransAmount(), accountRecordDto.getInOrOut().getCode());
         } else if (FrozenTypeEnum.UNFROZEN.equals(accountRecordDto.getFrozenType())) {
-            baseMapper.unfrozenChangeAccount(accountRecordDto.getUserId(), accountRecordDto.getTransAmount(), accountRecordDto.getInOrOut());
+            baseMapper.unfrozenChangeAccount(accountRecordDto.getUserId(), accountRecordDto.getTransAmount(), accountRecordDto.getInOrOut().getCode());
         } else {
-            baseMapper.changeAccount(accountRecordDto.getUserId(), accountRecordDto.getTransAmount(), accountRecordDto.getInOrOut());
+            baseMapper.changeAccount(accountRecordDto.getUserId(), accountRecordDto.getTransAmount(), accountRecordDto.getInOrOut().getCode());
         }
 
         UserAccountVo detail = detail(accountRecordDto.getUserId());
@@ -77,8 +77,9 @@ public class UserAccountServiceImpl extends ServiceImpl<UserAccountDao, UserAcco
             throw new BizException("账户变更失败");
         }
         //插入账户变更记录
+        accountRecordDto.setAccountId(accountRecordDto.getUserId());
+        accountRecordDto.setAccountBalance(detail.getAmountUsable());
         userAccountRecordService.save(accountRecordDto);
         return HttpResponseResult.succeed(accountRecordDto);
     }
-
 }

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

@@ -2,18 +2,26 @@ 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.biz.dal.dto.UserBankCardDto;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.toolset.thirdparty.user.realname.RealnameAuthenticationPlugin;
+import com.yonge.toolset.utils.idcard.IdcardInfoExtractor;
+import com.yonge.toolset.utils.idcard.IdcardValidator;
+import com.yonge.toolset.utils.validator.CommonValidator;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.yonge.cooleshow.biz.dal.entity.UserBankCard;
 import com.yonge.cooleshow.biz.dal.vo.UserBankCardVo;
 import com.yonge.cooleshow.biz.dal.dto.search.UserBankCardSearch;
 import com.yonge.cooleshow.biz.dal.dao.UserBankCardDao;
 import com.yonge.cooleshow.biz.dal.service.UserBankCardService;
+import org.springframework.transaction.annotation.Transactional;
 
 
 @Service
 public class UserBankCardServiceImpl extends ServiceImpl<UserBankCardDao, UserBankCard> implements UserBankCardService {
-
+    @Autowired
+    private RealnameAuthenticationPlugin realnameAuthenticationPlugin;
 	@Override
     public UserBankCardVo detail(Long id) {
         UserBankCardVo detail = baseMapper.detail(id);
@@ -26,8 +34,31 @@ public class UserBankCardServiceImpl extends ServiceImpl<UserBankCardDao, UserBa
     }
 
     @Override
-    public HttpResponseResult<UserBankCard> bankCard(UserBankCard bankCard) {
-	    //todo 用户绑卡
+    @Transactional(rollbackFor = Exception.class)
+    public HttpResponseResult<UserBankCard> bankCard(UserBankCardDto bankCard) {
+        //验证身份证合法性
+        IdcardValidator idcardValidator = new IdcardValidator();
+        //验证身份证号合法性
+        boolean validatedAllIdcard = idcardValidator.isValidatedAllIdcard(bankCard.getIdCardNo());
+        if (!validatedAllIdcard) {
+            return HttpResponseResult.failed("身份证号不合法");
+        }
+        boolean isMobileNo = CommonValidator.isMobileNo(bankCard.getPhone());
+        if (!isMobileNo) {
+            return HttpResponseResult.failed("手机号不合法");
+        }
+        boolean isBankCard = CommonValidator.isBankCard(bankCard.getBankCard());
+        if (!isBankCard) {
+            return HttpResponseResult.failed("银行卡号不合法");
+        }
+        boolean verify = realnameAuthenticationPlugin.verify(bankCard.getName(), bankCard.getIdCardNo());
+        if (!verify) {
+            return HttpResponseResult.failed("未通过实名认证");
+        }
+	    //当前用户只有一张银行卡
+        baseMapper.deleteByUserId(bankCard.getUserId());
+        bankCard.setDefaultFlag(true);
+        baseMapper.insert(bankCard);
         return HttpResponseResult.succeed(bankCard);
     }
 

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

@@ -2,6 +2,7 @@ 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.biz.dal.enums.FrozenTypeEnum;
 import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.cooleshow.biz.dal.dao.UserBankCardDao;
 import com.yonge.cooleshow.biz.dal.dto.UserAccountRecordDto;
@@ -63,6 +64,7 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
         if (null == defaultBank) {
             return HttpResponseResult.failed("用户未绑定银行卡");
         }
+        defaultBank.setPhone(ValueUtil.fuzzyMobile(defaultBank.getPhone()));
         defaultBank.setBankCard(ValueUtil.fuzzyBankCard(defaultBank.getBankCard()));
         withdrawalInfoRes.setUserBankCard(defaultBank);
         //获取平台提现手续费
@@ -99,6 +101,7 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
                 userId, withdrawalReq.getAmountWithdrawal(), InOrOutEnum.OUT, AccountBizTypeEnum.WITHDRAWAL,
                 userWithdrawal.getId(), "老师提现", null
         );
+        accountRecordDto.setFrozenType(FrozenTypeEnum.FROZEN);
         HttpResponseResult<UserAccountRecord> accountChange = userAccountService.accountChange(accountRecordDto);
         if(accountChange.getStatus()){
             return HttpResponseResult.succeed(true);

+ 168 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/PracticeVo.java

@@ -0,0 +1,168 @@
+package com.yonge.cooleshow.biz.dal.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * @Author: cy
+ * @Date: 2022/4/14
+ */
+@ApiModel(value = "PracticeVo")
+public class PracticeVo implements Serializable {
+    @ApiModelProperty(value = "用户id")
+    private Long userId;
+
+    @ApiModelProperty(value = "课程编号")
+    private Long courseId;
+
+    @ApiModelProperty(value = "用户名")
+    private String userName;
+
+    @ApiModelProperty(value = "用户手机号")
+    private String phone;
+
+    @ApiModelProperty(value = "课程声部")
+    private String subjectName;
+
+    @ApiModelProperty(value = "订单号")
+    private String orderNo;
+
+    @ApiModelProperty(value = "原价")
+    private BigDecimal originalPrice;
+
+    @ApiModelProperty(value = "预计价格")
+    private BigDecimal expectPrice;
+
+    @ApiModelProperty(value = "实际价格")
+    private BigDecimal actualPrice;
+
+    @ApiModelProperty(value = "支付时间")
+    private String paymentTime;
+
+    @ApiModelProperty(value = "上课日期")
+    private String classDate;
+
+    @ApiModelProperty(value = "上课时间")
+    private String startTime;
+
+    @ApiModelProperty(value = "下课时间")
+    private String endTime;
+
+    @ApiModelProperty(value = "课程状态")
+    private String status;
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public Long getCourseId() {
+        return courseId;
+    }
+
+    public void setCourseId(Long courseId) {
+        this.courseId = courseId;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public String getSubjectName() {
+        return subjectName;
+    }
+
+    public void setSubjectName(String subjectName) {
+        this.subjectName = subjectName;
+    }
+
+    public String getOrderNo() {
+        return orderNo;
+    }
+
+    public void setOrderNo(String orderNo) {
+        this.orderNo = orderNo;
+    }
+
+    public BigDecimal getOriginalPrice() {
+        return originalPrice;
+    }
+
+    public void setOriginalPrice(BigDecimal originalPrice) {
+        this.originalPrice = originalPrice;
+    }
+
+    public BigDecimal getExpectPrice() {
+        return expectPrice;
+    }
+
+    public void setExpectPrice(BigDecimal expectPrice) {
+        this.expectPrice = expectPrice;
+    }
+
+    public BigDecimal getActualPrice() {
+        return actualPrice;
+    }
+
+    public void setActualPrice(BigDecimal actualPrice) {
+        this.actualPrice = actualPrice;
+    }
+
+    public String getPaymentTime() {
+        return paymentTime;
+    }
+
+    public void setPaymentTime(String paymentTime) {
+        this.paymentTime = paymentTime;
+    }
+
+    public String getClassDate() {
+        return classDate;
+    }
+
+    public void setClassDate(String classDate) {
+        this.classDate = classDate;
+    }
+
+    public String getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(String startTime) {
+        this.startTime = startTime;
+    }
+
+    public String getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(String endTime) {
+        this.endTime = endTime;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+}

+ 9 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml

@@ -243,8 +243,17 @@
         <if test="param.subjectId !=null">
             AND g.subject_id_ = #{param.subjectId}
         </if>
+        <if test="param.classDate !=null and param.classDate !=''">
+            AND s.class_date_ = #{param.classDate}
+        </if>
         <if test="param.classMonth !=null and param.classMonth !=''">
             AND DATE_FORMAT(s.class_date_,'%Y-%m') = #{param.classMonth}
         </if>
     </select>
+    <select id="queryCourseScheduleStudent" resultType="java.lang.String"
+            parameterType="com.yonge.cooleshow.biz.dal.dto.search.MyCourseSearch">
+        SELECT class_date_ FROM course_schedule
+        WHERE id_ IN (SELECT course_id_ FROM course_schedule_student_payment WHERE user_id_ = #{studentId} AND course_type_ = 'PRACTICE')
+        AND DATE_FORMAT(class_date_,'%Y-%m') = #{classMonth}
+    </select>
 </mapper>

+ 14 - 14
cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleRepliedMapper.xml

@@ -30,48 +30,48 @@
     <insert id="insertReplied" parameterType="com.yonge.cooleshow.biz.dal.entity.CourseScheduleReplied">
         INSERT INTO course_schedule_replied
         <trim prefix="(" suffix=")" suffixOverrides=",">
-            <if test="studentId != null">
+            <if test="param.studentId != null">
                 student_id_,
             </if>
-            <if test="courseScheduleId != null">
+            <if test="param.courseScheduleId != null">
                 course_schedule_id_,
             </if>
-            <if test="courseGroupType != null">
+            <if test="param.courseGroupType != null">
                 course_group_type_,
             </if>
-            <if test="courseGroupId != null">
+            <if test="param.courseGroupId != null">
                 course_group_id_,
             </if>
-            <if test="score != null">
+            <if test="param.score != null">
                 score_,
             </if>
-            <if test="studentReplied != null">
+            <if test="param.studentReplied != null">
                 student_replied_,
             </if>
-            <if test="teacherReplied != null">
+            <if test="param.teacherReplied != null">
                 teacher_replied_,
             </if>
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
-            <if test="studentId != null">
+            <if test="param.studentId != null">
                 studentId,
             </if>
-            <if test="courseScheduleId != null">
+            <if test="param.courseScheduleId != null">
                 courseScheduleId,
             </if>
-            <if test="courseGroupType != null">
+            <if test="param.courseGroupType != null">
                 courseGroupType,
             </if>
-            <if test="courseGroupId != null">
+            <if test="param.courseGroupId != null">
                 courseGroupId,
             </if>
-            <if test="score != null">
+            <if test="param.score != null">
                 score,
             </if>
-            <if test="studentReplied != null">
+            <if test="param.studentReplied != null">
                 studentReplied,
             </if>
-            <if test="teacherReplied != null">
+            <if test="param.teacherReplied != null">
                 teacherReplied,
             </if>
         </trim>

+ 89 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/PracticeMapper.xml

@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.yonge.cooleshow.biz.dal.dao.PracticeDao">
+	<select id="selectTeacherPactice" resultType="com.yonge.cooleshow.biz.dal.vo.PracticeVo">
+		SELECT
+			u.id_ AS userId,
+			u.username_ AS userName,
+			u.phone_ AS phone,
+			s.name_ AS subjectName,
+			p.course_id_ AS courseId,
+			p.order_no_ AS orderNo,
+			p.original_price_ AS originalPrice,
+			p.expect_price_ AS expectPrice,
+			p.actual_price_ AS actualPrice,
+			p.created_time_ AS paymentTime,
+			cs.class_date_ AS classDate,
+			cs.start_time_ AS startTime,
+			cs.end_time_ AS endTime,
+			cs.status_ AS `status`
+		FROM course_schedule_student_payment p
+		LEFT JOIN sys_user u ON p.user_id_ = u.id_
+		LEFT JOIN `subject` s ON p.course_group_id_ = s.id_
+		LEFT JOIN course_schedule cs ON p.course_id_ = cs.id_
+		WHERE p.course_id_ IN (SELECT id_ FROM course_schedule WHERE teacher_id_ = #{param.teacherId} AND type_ = 'PRACTICE')
+		<if test="null != param.search and '' != param.search">
+			AND (
+			cs.id_ LIKE CONCAT('%', #{param.search}, '%') OR
+			u.id_ LIKE CONCAT('%', #{param.search}, '%') OR
+			u.username_ LIKE CONCAT('%', #{param.search}, '%') OR
+			u.phone_ LIKE CONCAT('%', #{param.search}, '%')
+			)
+		</if>
+		<if test="null != param.orderNo and '' != param.orderNo">
+			AND p.order_no_ = #{param.orderNo}
+		</if>
+		<if test="null != param.subjectId">
+			AND s.id_ = #{param.subjectId}
+		</if>
+		<if test="param.startTime !=null">
+			<![CDATA[AND p.created_time_ >= #{param.startTime} ]]>
+		</if>
+		<if test="param.endTime !=null">
+			<![CDATA[AND p.created_time_ <= #{param.endTime} ]]>
+		</if>
+	</select>
+	<select id="selectStudentPactice" resultType="com.yonge.cooleshow.biz.dal.vo.PracticeVo">
+		SELECT
+			u.id_ AS userId,
+			u.username_ AS userName,
+			u.phone_ AS phone,
+			s.name_ AS subjectName,
+			p.course_id_ AS courseId,
+			p.order_no_ AS orderNo,
+			p.original_price_ AS originalPrice,
+			p.expect_price_ AS expectPrice,
+			p.actual_price_ AS actualPrice,
+			p.created_time_ AS paymentTime,
+			cs.class_date_ AS classDate,
+			cs.start_time_ AS startTime,
+			cs.end_time_ AS endTime,
+			cs.status_ AS `status`
+		FROM course_schedule cs
+		LEFT JOIN course_schedule_student_payment p ON cs.id_ = p.course_id_
+		LEFT JOIN sys_user u ON cs.teacher_id_ = u.id_
+		LEFT JOIN `subject` s ON p.course_group_id_ = s.id_
+		WHERE cs.id_ IN (SELECT course_id_ FROM course_schedule_student_payment WHERE user_id_ = #{param.studentId} AND course_type_ = 'PRACTICE')
+		<if test="null != param.search and '' != param.search">
+			AND (
+			cs.id_ LIKE CONCAT('%', #{param.search}, '%') OR
+			u.id_ LIKE CONCAT('%', #{param.search}, '%') OR
+			u.username_ LIKE CONCAT('%', #{param.search}, '%') OR
+			u.phone_ LIKE CONCAT('%', #{param.search}, '%')
+			)
+		</if>
+		<if test="null != param.orderNo and '' != param.orderNo">
+			AND p.order_no_ = #{param.orderNo}
+		</if>
+		<if test="null != param.subjectId">
+			AND s.id_ = #{param.subjectId}
+		</if>
+		<if test="param.startTime !=null">
+			<![CDATA[AND p.created_time_ >= #{param.startTime} ]]>
+		</if>
+		<if test="param.endTime !=null">
+			<![CDATA[AND p.created_time_ <= #{param.endTime} ]]>
+		</if>
+	</select>
+</mapper>

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

@@ -26,10 +26,10 @@
         update user_cash_account
         <choose>
             <when test="null != inOrOut and inOrOut == 'IN'">
-                set amount_total_ = (amount_total_ + #{transAmount}),amount_frozen_ = (amount_frozen + #{transAmount})
+                set amount_total_ = (amount_total_ + #{transAmount}),amount_frozen_ = (amount_frozen_ + #{transAmount})
             </when>
             <otherwise>
-                set amount_usable_ = (amount_usable_ - #{transAmount}),amount_frozen_ = (amount_frozen + #{transAmount})
+                set amount_usable_ = (amount_usable_ - #{transAmount}),amount_frozen_ = (amount_frozen_ + #{transAmount})
             </otherwise>
         </choose>
         where user_id_ = #{userId}
@@ -38,10 +38,10 @@
         update user_cash_account
         <choose>
             <when test="null != inOrOut and inOrOut == 'IN'">
-                set amount_usable_ = (amount_usable_ + #{transAmount}),amount_frozen_ = (amount_frozen - #{transAmount})
+                set amount_usable_ = (amount_usable_ + #{transAmount}),amount_frozen_ = (amount_frozen_ - #{transAmount})
             </when>
             <otherwise>
-                set amount_total_ = (amount_total_ - #{transAmount}),amount_frozen_ = (amount_frozen - #{transAmount})
+                set amount_total_ = (amount_total_ - #{transAmount}),amount_frozen_ = (amount_frozen_ - #{transAmount})
             </otherwise>
         </choose>
         where user_id_ = #{userId}

+ 9 - 3
cooleshow-user/user-biz/src/main/resources/config/mybatis/UserBankCardMapper.xml

@@ -9,7 +9,7 @@
 	        <result column="bank_card_" property="bankCard" />
 	        <result column="phone_" property="phone" />
 	        <result column="bank_code_" property="bankCode" />
-	        <result column="is_default_" property="isDefault" />
+	        <result column="default_flag_" property="defaultFlag" />
 	        <result column="create_time_" property="createTime" />
 	        <result column="update_time_" property="updateTime" />
 		</resultMap>
@@ -23,7 +23,7 @@
         , t.bank_card_ as bankCard
         , t.phone_ as phone
         , t.bank_code_ as bankCode
-        , t.is_default_ as isDefault
+        , t.default_flag_ as defaultFlag
         , t.create_time_ as createTime
         , t.update_time_ as updateTime
         , t.del_flag_ as delFlag
@@ -42,14 +42,16 @@
 		FROM user_bank_card t
 		where t.del_flag_ = 0
 	</select>
+
     <select id="getDefaultBankByUserId" resultType="com.yonge.cooleshow.biz.dal.vo.UserBankCardVo">
         SELECT
             <include refid="baseColumns"/>
         FROM user_bank_card t
         where t.del_flag_ = 0 and  t.user_id_ = #{userId}
-        order by is_default_ desc,create_time_ desc
+        order by default_flag_ desc,create_time_ desc
         limit 1
     </select>
+
     <select id="getBankByUserIdAndCardId" resultType="com.yonge.cooleshow.biz.dal.vo.UserBankCardVo">
         SELECT
             <include refid="baseColumns"/>
@@ -58,4 +60,8 @@
         and  t.user_id_ = #{userId}
         and t.id_ = #{bankCardId}
     </select>
+
+    <update id="deleteByUserId">
+        update user_bank_card set del_flag_ = 1 where user_id_ = #{userId}
+    </update>
 </mapper>

+ 13 - 0
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/CourseScheduleController.java

@@ -23,6 +23,8 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.List;
+
 /**
  * @Author: cy
  * @Date: 2022/4/13
@@ -76,5 +78,16 @@ public class CourseScheduleController extends BaseController {
         replied.setCourseGroupType(CourseScheduleEnum.PRACTICE.getCode());
         return succeed(repliedService.selectReplied(replied));
     }
+
+    @ApiOperation("学生端-课表-日历")
+    @PostMapping("/queryCourseScheduleStudent")
+    public HttpResponseResult<List<String>> queryCourseScheduleStudent(@RequestBody MyCourseSearch search) {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        search.setStudentId(user.getId());
+        return succeed(courseScheduleService.queryCourseScheduleStudent(search));
+    }
 }
 

+ 3 - 1
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/UserBankCardController.java

@@ -2,6 +2,7 @@ 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.biz.dal.dto.UserBankCardDto;
 import com.yonge.cooleshow.biz.dal.entity.UserBankCard;
 import com.yonge.cooleshow.biz.dal.service.UserBankCardService;
 import com.yonge.cooleshow.common.controller.BaseController;
@@ -25,11 +26,12 @@ public class UserBankCardController extends BaseController {
 
 	@PostMapping("/bankCard")
 	@ApiOperation(value = "用户绑卡")
-	public HttpResponseResult<UserBankCard> bankCard(@Valid @RequestBody UserBankCard bankCard) {
+	public HttpResponseResult<UserBankCard> bankCard(@Valid @RequestBody UserBankCardDto bankCard) {
 		SysUser user = sysUserFeignService.queryUserInfo();
 		if (user == null || null == user.getId()) {
 			return failed(HttpStatus.FORBIDDEN, "请登录");
 		}
+		bankCard.setUserId(user.getId());
 		return userBankCardService.bankCard(bankCard);
 	}
 

+ 125 - 72
toolset/utils/src/main/java/com/yonge/toolset/utils/validator/CommonValidator.java

@@ -7,91 +7,144 @@ import org.apache.commons.lang3.StringUtils;
 
 /**
  * 常用验证类,如邮箱,手机格式验证
+ *
  * @author pengdc
  */
 public class CommonValidator {
 
-	private final static String MOBILE_NO = "^((13[0-9])|(14[5|7|9])|(15[^4,\\D])|(166)|(18[0-9])|(17[0|1|3|5|6|7|8])|(19[8|9]))\\d{8}$";
+    private final static String MOBILE_NO = "^((13[0-9])|(14[5|7|9])|(15[^4,\\D])|(166)|(18[0-9])|(17[0|1|3|5|6|7|8])|(19[8|9]))\\d{8}$";
 
-	private static final String TELEPHONE_NO = "((\\d{10})|(\\d{11})|^((\\d{7,8})|(\\d{4}|\\d{3})-(\\d{7,8})|(\\d{4}|\\d{3})-(\\d{7,8})-(\\d{4}|\\d{3}"
-			+ "|\\d{2}|\\d{1})|(\\d{7,8})-(\\d{4}|\\d{3}|\\d{2}|\\d{1}))$)";
+    private static final String TELEPHONE_NO = "((\\d{10})|(\\d{11})|^((\\d{7,8})|(\\d{4}|\\d{3})-(\\d{7,8})|(\\d{4}|\\d{3})-(\\d{7,8})-(\\d{4}|\\d{3}"
+            + "|\\d{2}|\\d{1})|(\\d{7,8})-(\\d{4}|\\d{3}|\\d{2}|\\d{1}))$)";
 
-	private static final String EMAIL_ADDR = "^([a-z0-9A-Z]+[-|_|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$";
+    private static final String EMAIL_ADDR = "^([a-z0-9A-Z]+[-|_|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$";
 
-	private static final String PWD_CHECK_REGEX = "^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,16}$";
+    private static final String PWD_CHECK_REGEX = "^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,16}$";
 
-	private static Pattern mobileNoPattern = Pattern.compile(MOBILE_NO);
-	private static Pattern telephoneNoPattern = Pattern.compile(TELEPHONE_NO);
-	private static Pattern emailAddrPattern = Pattern.compile(EMAIL_ADDR);
-	private static Pattern pwdCheckPattern = Pattern.compile(PWD_CHECK_REGEX);
+    private static Pattern mobileNoPattern = Pattern.compile(MOBILE_NO);
+    private static Pattern telephoneNoPattern = Pattern.compile(TELEPHONE_NO);
+    private static Pattern emailAddrPattern = Pattern.compile(EMAIL_ADDR);
+    private static Pattern pwdCheckPattern = Pattern.compile(PWD_CHECK_REGEX);
 
-	/**
-	 * 是否邮箱地址
-	 * @param emailAddr
-	 * @return
-	 */
-	public static boolean isEmailAddr(String emailAddr) {
-		if (StringUtils.isBlank(emailAddr)) {
-			return false;
-		}
-		Matcher matcher = emailAddrPattern.matcher(emailAddr);
-		return matcher.matches();
-	}
+    /**
+     * 是否邮箱地址
+     *
+     * @param emailAddr
+     * @return
+     */
+    public static boolean isEmailAddr(String emailAddr) {
+        if (StringUtils.isBlank(emailAddr)) {
+            return false;
+        }
+        Matcher matcher = emailAddrPattern.matcher(emailAddr);
+        return matcher.matches();
+    }
 
-	/**
-	 * 是否手机
-	 * @param mobileNo
-	 * @return boolean
-	 */
-	public static boolean isMobileNo(String mobileNo) {
-		if (StringUtils.isBlank(mobileNo)) {
-			return false;
-		}
-		Matcher matcher = mobileNoPattern.matcher(mobileNo);
-		return matcher.matches();
-	}
+    /**
+     * 是否手机
+     *
+     * @param mobileNo
+     * @return boolean
+     */
+    public static boolean isMobileNo(String mobileNo) {
+        if (StringUtils.isBlank(mobileNo)) {
+            return false;
+        }
+        Matcher matcher = mobileNoPattern.matcher(mobileNo);
+        return matcher.matches();
+    }
 
-	/**
-	 * 是否座机
-	 * @param telephoneNo
-	 * @return boolean
-	 */
-	public static boolean isTelephoneNo(String telephoneNo) {
-		if (StringUtils.isBlank(telephoneNo)) {
-			return false;
-		}
-		Matcher matcher = telephoneNoPattern.matcher(telephoneNo);
-		return matcher.matches();
-	}
+    /**
+     * 是否座机
+     *
+     * @param telephoneNo
+     * @return boolean
+     */
+    public static boolean isTelephoneNo(String telephoneNo) {
+        if (StringUtils.isBlank(telephoneNo)) {
+            return false;
+        }
+        Matcher matcher = telephoneNoPattern.matcher(telephoneNo);
+        return matcher.matches();
+    }
 
-	/**
-	 * 是否是座机或手机号码
-	 * @param teleOrMobileNo
-	 * @return boolean
-	 */
-	public static boolean isTelephoneOrMobileNo(String teleOrMobileNo) {
-		if (StringUtils.isBlank(teleOrMobileNo)) {
-			return false;
-		}
-		Matcher matcher1 = telephoneNoPattern.matcher(teleOrMobileNo);
-		if (matcher1.matches()) {
-			return true;
-		}
-		Matcher matcher2 = mobileNoPattern.matcher(teleOrMobileNo);
-		return matcher2.matches();
-	}
+    /**
+     * 是否是座机或手机号码
+     *
+     * @param teleOrMobileNo
+     * @return boolean
+     */
+    public static boolean isTelephoneOrMobileNo(String teleOrMobileNo) {
+        if (StringUtils.isBlank(teleOrMobileNo)) {
+            return false;
+        }
+        Matcher matcher1 = telephoneNoPattern.matcher(teleOrMobileNo);
+        if (matcher1.matches()) {
+            return true;
+        }
+        Matcher matcher2 = mobileNoPattern.matcher(teleOrMobileNo);
+        return matcher2.matches();
+    }
+
+    /**
+     * 是否至少包含数字、字母,长度在6-16位的字符串
+     *
+     * @param password
+     * @return boolean
+     */
+    public static boolean isComplexityOfPwd(String password) {
+        if (StringUtils.isBlank(password)) {
+            return false;
+        }
+        Matcher matcher = pwdCheckPattern.matcher(password);
+        return matcher.matches();
+    }
+
+
+    /**
+     * 校验银行卡号方法
+     *
+     * @param bankCard
+     * @return
+     */
+    public static boolean isBankCard(String bankCard) {
+        if (bankCard.length() < 15 || bankCard.length() > 19) {
+            return false;
+        }
+        char bit = getBankCardCheckCode(bankCard.substring(0, bankCard.length() - 1));
+        if (bit == 'N') {
+            return false;
+        }
+        return bankCard.charAt(bankCard.length() - 1) == bit;
+    }
+
+    /**
+     * 从不含校验位的银行卡卡号采用 Luhm 校验算法获得校验位
+     *
+     * @param nonCheckCodeBankCard
+     * @return
+     */
+    public static char getBankCardCheckCode(String nonCheckCodeBankCard) {
+        if (nonCheckCodeBankCard == null || nonCheckCodeBankCard.trim().length() == 0
+                || !nonCheckCodeBankCard.matches("\\d+")) {
+            //如果传的不是数据返回N
+            return 'N';
+        }
+        char[] chs = nonCheckCodeBankCard.trim().toCharArray();
+        int luhmSum = 0;
+        for (int i = chs.length - 1, j = 0; i >= 0; i--, j++) {
+            int k = chs[i] - '0';
+            if (j % 2 == 0) {
+                k *= 2;
+                k = k / 10 + k % 10;
+            }
+            luhmSum += k;
+        }
+        return (luhmSum % 10 == 0) ? '0' : (char) ((10 - luhmSum % 10) + '0');
+    }
+
+	public static void main(String[] args) {
 
-	/**
-	 * 是否至少包含数字、字母,长度在6-16位的字符串
-	 * @param telephoneNo
-	 * @return boolean
-	 */
-	public static boolean isComplexityOfPwd(String password) {
-		if (StringUtils.isBlank(password)) {
-			return false;
-		}
-		Matcher matcher = pwdCheckPattern.matcher(password);
-		return matcher.matches();
 	}
 
 }