浏览代码

Merge branch 'master' of http://git.dayaedu.com/yonge/mec

zouxuan 5 年之前
父节点
当前提交
954365accd
共有 40 个文件被更改,包括 1797 次插入188 次删除
  1. 34 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleReviewDao.java
  2. 3 2
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CoursesGroupDao.java
  3. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysTenantAccountDao.java
  4. 35 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TenantPaymentOrderDao.java
  5. 22 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseGroupTeacherCardDto.java
  6. 66 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseReviewDto.java
  7. 46 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ReviewInfoDto.java
  8. 33 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseScheduleReview.java
  9. 110 66
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TenantEntryActivities.java
  10. 281 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TenantPaymentOrder.java
  11. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/OrderTypeEnum.java
  12. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/TenantEntryActivitesQueryInfo.java
  13. 22 0
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseReviewService.java
  14. 3 1
      mec-biz/src/main/java/com/ym/mec/biz/service/CoursesGroupService.java
  15. 14 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SysTenantAccountService.java
  16. 0 7
      mec-biz/src/main/java/com/ym/mec/biz/service/TenantEntryActivitiesService.java
  17. 29 0
      mec-biz/src/main/java/com/ym/mec/biz/service/TenantPaymentOrderService.java
  18. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseHomeworkServiceImpl.java
  19. 99 8
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseReviewServiceImpl.java
  20. 10 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java
  21. 50 38
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CoursesGroupServiceImpl.java
  22. 54 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysTenantAccountServiceImpl.java
  23. 0 21
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantEntryActivitiesServiceImpl.java
  24. 321 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantPaymentOrderServiceImpl.java
  25. 3 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java
  26. 1 1
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  27. 63 6
      mec-biz/src/main/resources/config/mybatis/CourseScheduleReviewMapper.xml
  28. 5 0
      mec-biz/src/main/resources/config/mybatis/CoursesGroupMapper.xml
  29. 2 2
      mec-biz/src/main/resources/config/mybatis/StudentCourseHomeworkMapper.xml
  30. 4 0
      mec-biz/src/main/resources/config/mybatis/SysTenantAccountMapper.xml
  31. 3 2
      mec-biz/src/main/resources/config/mybatis/TeacherMapper.xml
  32. 14 3
      mec-biz/src/main/resources/config/mybatis/TenantEntryActivitiesMapper.xml
  33. 158 0
      mec-biz/src/main/resources/config/mybatis/TenantPaymentOrderMapper.xml
  34. 9 2
      mec-teacher/src/main/java/com/ym/mec/teacher/config/ResourceServerConfig.java
  35. 24 2
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/CourseGroupController.java
  36. 25 4
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/CourseReviewController.java
  37. 1 0
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherController.java
  38. 172 0
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherOrderController.java
  39. 40 0
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/TenantPaymentOrderController.java
  40. 26 18
      mec-web/src/main/java/com/ym/mec/web/controller/TaskController.java

+ 34 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleReviewDao.java

@@ -1,7 +1,9 @@
 package com.ym.mec.biz.dal.dao;
 
+import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dto.CourseReviewDto;
 import com.ym.mec.biz.dal.entity.CourseScheduleReview;
+import com.ym.mec.biz.dal.entity.TeacherDefaultVipGroupSalary;
 import com.ym.mec.common.dal.BaseDAO;
 import org.apache.ibatis.annotations.Param;
 
@@ -62,9 +64,41 @@ public interface CourseScheduleReviewDao extends BaseDAO<Integer, CourseSchedule
 
     /**
      * 获取学生课程评价
+     *
      * @param courseScheduleIds
      * @param studentId
      * @return
      */
     List<CourseScheduleReview> findByCourseSchedulesAndStudentId(@Param("courseScheduleIds") List<Long> courseScheduleIds, @Param("studentId") Integer studentId);
+
+    /**
+     * 获取已结束的课程列表
+     *
+     * @param classGroupId
+     * @return
+     */
+    List<CourseReviewDto> findByClassGroupId(@Param("classGroupId") Long classGroupId);
+
+    /**
+     * 根据课程id获取老师评价
+     *
+     * @param courseScheduleId
+     * @return
+     */
+    List<CourseScheduleReview> findByCourseScheduleId(@Param("courseScheduleId") Long courseScheduleId);
+
+    /**
+     * 批量插入评价
+     *
+     * @param courseScheduleReviews
+     * @return
+     */
+    int batchAdd(@Param("courseScheduleReviews") List<CourseScheduleReview> courseScheduleReviews);
+
+    /**
+     * 根据班级id获取班级学生
+     * @param classGroupId
+     * @return
+     */
+    List<SysUser> findStudentByClassGroupId(@Param("classGroupId") Long classGroupId);
 }

+ 3 - 2
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CoursesGroupDao.java

@@ -13,10 +13,11 @@ public interface CoursesGroupDao extends BaseDAO<Long, CoursesGroup> {
      * @describe 获取指定教师的课程组列表
      * @author Joburgess
      * @date 2020/3/8
-     * @param teacherId: 教师编号
+     * @param params: 教师编号
      * @return java.util.List<com.ym.mec.biz.dal.entity.CoursesGroup>
      */
-    List<CoursesGroup> findTeacherCourseGroups(@Param("teacherId") Integer teacherId);
+    List<CoursesGroup> findTeacherCourseGroups(Map<String, Object> params);
+    int countTeacherGroups(Map<String,Object> params);
 
     /**
      * @describe 获取指定教师的课程组列表

+ 1 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysTenantAccountDao.java

@@ -4,4 +4,5 @@ import com.ym.mec.biz.dal.entity.SysTenantAccount;
 
 public interface SysTenantAccountDao extends com.ym.mec.common.dal.BaseDAO<Integer, SysTenantAccount> {
 
+	SysTenantAccount getLocked(Integer userId);
 }

+ 35 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TenantPaymentOrderDao.java

@@ -0,0 +1,35 @@
+package com.ym.mec.biz.dal.dao;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+
+import com.ym.mec.biz.dal.entity.TenantPaymentOrder;
+import com.ym.mec.biz.dal.enums.DealStatusEnum;
+import com.ym.mec.common.dal.BaseDAO;
+
+public interface TenantPaymentOrderDao extends BaseDAO<Long, TenantPaymentOrder> {
+
+	/**
+	 * 查询用户所有订单
+	 * @param userId
+	 * @return
+	 */
+	List<TenantPaymentOrder> queryByUserId(Integer userId);
+
+	/**
+	 * 根据订单号查询订单
+	 *
+	 * @param orderNo
+	 * @return
+	 */
+	TenantPaymentOrder findOrderByOrderNo(@Param("orderNo") String orderNo);
+
+	/**
+	 * 查询支付中订单
+	 *
+	 * @param status
+	 * @return
+	 */
+	List<TenantPaymentOrder> findOrdersByStatus(@Param("status") DealStatusEnum status, @Param("paymentChannel") String paymentChannel);
+}

+ 22 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseGroupTeacherCardDto.java

@@ -1,5 +1,7 @@
 package com.ym.mec.biz.dal.dto;
 
+import com.ym.mec.biz.dal.enums.GroupType;
+
 import java.util.Date;
 
 /**
@@ -10,6 +12,8 @@ public class CourseGroupTeacherCardDto {
 
     private Long id;
 
+    private GroupType groupType;
+
     private String name;
 
     private Integer subjectId;
@@ -24,10 +28,28 @@ public class CourseGroupTeacherCardDto {
 
     private java.util.Date coursesEndDate;
 
+    private Integer currentClassTimes;
+
     private Integer surplusClassTimes;
 
     private String studentNames;
 
+    public GroupType getGroupType() {
+        return groupType;
+    }
+
+    public void setGroupType(GroupType groupType) {
+        this.groupType = groupType;
+    }
+
+    public Integer getCurrentClassTimes() {
+        return currentClassTimes;
+    }
+
+    public void setCurrentClassTimes(Integer currentClassTimes) {
+        this.currentClassTimes = currentClassTimes;
+    }
+
     public Long getId() {
         return id;
     }

+ 66 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseReviewDto.java

@@ -51,6 +51,24 @@ public class CourseReviewDto {
     @ApiModelProperty(value = "老师id",required = false)
     private Integer teacherId;
 
+    @ApiModelProperty(value = "上课时间",required = false)
+    private Date startClassTime;
+
+    @ApiModelProperty(value = "下课时间",required = false)
+    private Date endClassTime;
+
+    @ApiModelProperty(value = "课程上课日期str",required = false)
+    private String classDateStr;
+
+    @ApiModelProperty(value = "上课时间Str",required = false)
+    private String startClassTimeStr;
+
+    @ApiModelProperty(value = "下课时间Str",required = false)
+    private String endClassTimeStr;
+
+    @ApiModelProperty(value = "课时长度",required = false)
+    private Integer courseDuration;
+
     public Integer getOrganId() {
         return organId;
     }
@@ -170,4 +188,52 @@ public class CourseReviewDto {
     public void setTeacherId(Integer teacherId) {
         this.teacherId = teacherId;
     }
+
+    public Date getStartClassTime() {
+        return startClassTime;
+    }
+
+    public void setStartClassTime(Date startClassTime) {
+        this.startClassTime = startClassTime;
+    }
+
+    public Date getEndClassTime() {
+        return endClassTime;
+    }
+
+    public void setEndClassTime(Date endClassTime) {
+        this.endClassTime = endClassTime;
+    }
+
+    public String getClassDateStr() {
+        return classDateStr;
+    }
+
+    public void setClassDateStr(String classDateStr) {
+        this.classDateStr = classDateStr;
+    }
+
+    public String getStartClassTimeStr() {
+        return startClassTimeStr;
+    }
+
+    public void setStartClassTimeStr(String startClassTimeStr) {
+        this.startClassTimeStr = startClassTimeStr;
+    }
+
+    public String getEndClassTimeStr() {
+        return endClassTimeStr;
+    }
+
+    public void setEndClassTimeStr(String endClassTimeStr) {
+        this.endClassTimeStr = endClassTimeStr;
+    }
+
+    public Integer getCourseDuration() {
+        return courseDuration;
+    }
+
+    public void setCourseDuration(Integer courseDuration) {
+        this.courseDuration = courseDuration;
+    }
 }

+ 46 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ReviewInfoDto.java

@@ -1,9 +1,11 @@
 package com.ym.mec.biz.dal.dto;
 
+import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.entity.CourseScheduleReview;
 import io.swagger.annotations.ApiModelProperty;
 
 import java.util.List;
+import java.util.Set;
 
 public class ReviewInfoDto {
 
@@ -16,6 +18,18 @@ public class ReviewInfoDto {
     @ApiModelProperty(value = "学生评价信息",required = false)
     private List<CourseScheduleComplaintsDto> CourseScheduleComplaints;
 
+    @ApiModelProperty(value = "老师评价信息列表",required = false)
+    private List<CourseScheduleReview> courseScheduleReviewList;
+
+    @ApiModelProperty(value = "老师已评价的学生",required = false)
+    private Set<Integer> review4StudentIds;
+
+    @ApiModelProperty(value = "教学内容",required = false)
+    private String teachingMaterial;
+
+    @ApiModelProperty(value = "班级学生",required = false)
+    private List<SysUser> students;
+
     public TeacherClassHeadInfo getTeacherClassHeadInfo() {
         return teacherClassHeadInfo;
     }
@@ -39,4 +53,36 @@ public class ReviewInfoDto {
     public void setCourseScheduleComplaints(List<CourseScheduleComplaintsDto> courseScheduleComplaints) {
         CourseScheduleComplaints = courseScheduleComplaints;
     }
+
+    public List<CourseScheduleReview> getCourseScheduleReviewList() {
+        return courseScheduleReviewList;
+    }
+
+    public void setCourseScheduleReviewList(List<CourseScheduleReview> courseScheduleReviewList) {
+        this.courseScheduleReviewList = courseScheduleReviewList;
+    }
+
+    public Set<Integer> getReview4StudentIds() {
+        return review4StudentIds;
+    }
+
+    public void setReview4StudentIds(Set<Integer> review4StudentIds) {
+        this.review4StudentIds = review4StudentIds;
+    }
+
+    public String getTeachingMaterial() {
+        return teachingMaterial;
+    }
+
+    public void setTeachingMaterial(String teachingMaterial) {
+        this.teachingMaterial = teachingMaterial;
+    }
+
+    public List<SysUser> getStudents() {
+        return students;
+    }
+
+    public void setStudents(List<SysUser> students) {
+        this.students = students;
+    }
 }

+ 33 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseScheduleReview.java

@@ -112,6 +112,15 @@ public class CourseScheduleReview {
     @ApiModelProperty(value = "老师名字",required = false)
     private String teacherName;
 
+    @ApiModelProperty(value = "老师头像",required = false)
+    private String teacherAvatar;
+
+    @ApiModelProperty(value = "学生名字",required = false)
+    private String studentName;
+
+    @ApiModelProperty(value = "学生",required = false)
+    private String studentAvatar;
+
     public Integer getId() {
         return id;
     }
@@ -292,4 +301,28 @@ public class CourseScheduleReview {
     public void setHomeWork(String homeWork) {
         this.homeWork = homeWork;
     }
+
+    public String getStudentName() {
+        return studentName;
+    }
+
+    public void setStudentName(String studentName) {
+        this.studentName = studentName;
+    }
+
+    public String getTeacherAvatar() {
+        return teacherAvatar;
+    }
+
+    public void setTeacherAvatar(String teacherAvatar) {
+        this.teacherAvatar = teacherAvatar;
+    }
+
+    public String getStudentAvatar() {
+        return studentAvatar;
+    }
+
+    public void setStudentAvatar(String studentAvatar) {
+        this.studentAvatar = studentAvatar;
+    }
 }

+ 110 - 66
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TenantEntryActivities.java

@@ -2,100 +2,128 @@ package com.ym.mec.biz.dal.entity;
 
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
+import com.ym.mec.common.enums.BaseEnum;
+
 /**
  * 对应数据库表(tenant_entry_activites):
  */
 public class TenantEntryActivities {
 
+	public enum SuitableUser implements BaseEnum<String, SuitableUser> {
+		NEW("NEW", "新手"), ALL("ALL", "全部");
+
+		private String code;
+
+		private String desc;
+
+		SuitableUser(String code, String desc) {
+			this.code = code;
+			this.desc = desc;
+		}
+
+		@Override
+		public String getCode() {
+			return code;
+		}
+
+		public String getDesc() {
+			return desc;
+		}
+	}
+
 	/**  */
 	private Integer id;
-	
+
 	/**  */
 	private String name;
-	
+
 	/**  */
 	private String coverImg;
-	
+
 	/**  */
 	private String detail;
-	
+
+	private SuitableUser suitableUser;
+
+	private String tag;
+
 	/**  */
 	private java.math.BigDecimal totalPrice;
-	
+
 	/**  */
 	private java.math.BigDecimal discountPrice;
-	
+
 	private Integer purchaseMinutes;
-	
+
 	/**  */
 	private Integer giveMinutes;
-	
+
 	/**  */
 	private java.util.Date startDate;
-	
+
 	/**  */
 	private java.util.Date endDate;
-	
+
 	/**  */
 	private String condition;
-	
+
 	/**  */
 	private Boolean delFlag;
-	
+
 	/**  */
 	private java.util.Date createTime;
-	
+
 	/**  */
 	private java.util.Date updateTime;
-	
-	public void setId(Integer id){
+
+	public void setId(Integer id) {
 		this.id = id;
 	}
-	
-	public Integer getId(){
+
+	public Integer getId() {
 		return this.id;
 	}
-			
-	public void setName(String name){
+
+	public void setName(String name) {
 		this.name = name;
 	}
-	
-	public String getName(){
+
+	public String getName() {
 		return this.name;
 	}
-			
-	public void setCoverImg(String coverImg){
+
+	public void setCoverImg(String coverImg) {
 		this.coverImg = coverImg;
 	}
-	
-	public String getCoverImg(){
+
+	public String getCoverImg() {
 		return this.coverImg;
 	}
-			
-	public void setDetail(String detail){
+
+	public void setDetail(String detail) {
 		this.detail = detail;
 	}
-	
-	public String getDetail(){
+
+	public String getDetail() {
 		return this.detail;
 	}
-			
-	public void setTotalPrice(java.math.BigDecimal totalPrice){
+
+	public void setTotalPrice(java.math.BigDecimal totalPrice) {
 		this.totalPrice = totalPrice;
 	}
-	
-	public java.math.BigDecimal getTotalPrice(){
+
+	public java.math.BigDecimal getTotalPrice() {
 		return this.totalPrice;
 	}
-			
-	public void setDiscountPrice(java.math.BigDecimal discountPrice){
+
+	public void setDiscountPrice(java.math.BigDecimal discountPrice) {
 		this.discountPrice = discountPrice;
 	}
-	
-	public java.math.BigDecimal getDiscountPrice(){
+
+	public java.math.BigDecimal getDiscountPrice() {
 		return this.discountPrice;
 	}
-			
+
 	public Integer getPurchaseMinutes() {
 		return purchaseMinutes;
 	}
@@ -104,62 +132,78 @@ public class TenantEntryActivities {
 		this.purchaseMinutes = purchaseMinutes;
 	}
 
-	public void setGiveMinutes(Integer giveMinutes){
+	public void setGiveMinutes(Integer giveMinutes) {
 		this.giveMinutes = giveMinutes;
 	}
-	
-	public Integer getGiveMinutes(){
+
+	public Integer getGiveMinutes() {
 		return this.giveMinutes;
 	}
-			
-	public void setStartDate(java.util.Date startDate){
+
+	public void setStartDate(java.util.Date startDate) {
 		this.startDate = startDate;
 	}
-	
-	public java.util.Date getStartDate(){
+
+	public java.util.Date getStartDate() {
 		return this.startDate;
 	}
-			
-	public void setEndDate(java.util.Date endDate){
+
+	public void setEndDate(java.util.Date endDate) {
 		this.endDate = endDate;
 	}
-	
-	public java.util.Date getEndDate(){
+
+	public java.util.Date getEndDate() {
 		return this.endDate;
 	}
-			
-	public void setCondition(String condition){
+
+	public void setCondition(String condition) {
 		this.condition = condition;
 	}
-	
-	public String getCondition(){
+
+	public String getCondition() {
 		return this.condition;
 	}
-			
-	public void setDelFlag(Boolean delFlag){
+
+	public void setDelFlag(Boolean delFlag) {
 		this.delFlag = delFlag;
 	}
-	
-	public Boolean getDelFlag(){
+
+	public Boolean getDelFlag() {
 		return this.delFlag;
 	}
-			
-	public void setCreateTime(java.util.Date createTime){
+
+	public void setCreateTime(java.util.Date createTime) {
 		this.createTime = createTime;
 	}
-	
-	public java.util.Date getCreateTime(){
+
+	public java.util.Date getCreateTime() {
 		return this.createTime;
 	}
-			
-	public void setUpdateTime(java.util.Date updateTime){
+
+	public void setUpdateTime(java.util.Date updateTime) {
 		this.updateTime = updateTime;
 	}
-	
-	public java.util.Date getUpdateTime(){
+
+	public java.util.Date getUpdateTime() {
 		return this.updateTime;
 	}
-			
+
+	public SuitableUser getSuitableUser() {
+		return suitableUser;
+	}
+
+	public void setSuitableUser(SuitableUser suitableUser) {
+		this.suitableUser = suitableUser;
+	}
+
+	public String getTag() {
+		return tag;
+	}
+
+	public void setTag(String tag) {
+		this.tag = tag;
+	}
+
 	@Override
 	public String toString() {
 		return ToStringBuilder.reflectionToString(this);

+ 281 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TenantPaymentOrder.java

@@ -0,0 +1,281 @@
+package com.ym.mec.biz.dal.entity;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+import com.ym.mec.biz.dal.enums.DealStatusEnum;
+import com.ym.mec.common.enums.BaseEnum;
+
+/**
+ * 对应数据库表(tenant_payment_order):
+ */
+public class TenantPaymentOrder {
+
+	public enum TenantPaymentType implements BaseEnum<String, TenantPaymentType> {
+		RECHARGE("RECHARGE", "充值");
+
+		private String code;
+
+		private String desc;
+
+		TenantPaymentType(String code, String desc) {
+			this.code = code;
+			this.desc = desc;
+		}
+
+		@Override
+		public String getCode() {
+			return code;
+		}
+
+		public String getDesc() {
+			return desc;
+		}
+	}
+
+	/**  */
+	private Long id;
+	
+	private Integer activitiesId;
+
+	/**  */
+	private Integer userId;
+
+	/** 分部id */
+	private Integer organId;
+
+	/** 订单类型(购买) */
+	private TenantPaymentType type;
+
+	/** 预计金额 */
+	private java.math.BigDecimal expectAmount;
+
+	/** 实际金额 */
+	private java.math.BigDecimal actualAmount;
+
+	/** 余额支付金额 */
+	private java.math.BigDecimal balancePaymentAmount;
+
+	/** 公户金额 */
+	private java.math.BigDecimal comAmount;
+
+	/** 私户金额 */
+	private java.math.BigDecimal perAmount;
+
+	/** 减免金额 */
+	private java.math.BigDecimal remitFee;
+
+	/** 交易流水号(第三方支付平台) */
+	private String transNo;
+
+	/** 交易状态 */
+	private DealStatusEnum status;
+
+	/** 备注 */
+	private String memo;
+
+	/** 付款渠道 */
+	private String paymentChannel;
+
+	/** 业务渠道 */
+	private String paymentBusinessChannel;
+
+	/** 渠道收款账户 */
+	private String merNos;
+
+	/** 订单号 */
+	private String orderNo;
+
+	/** 支付时间 */
+	private java.util.Date payTime;
+
+	/** 版本 */
+	private Integer version;
+
+	/**  */
+	private java.util.Date createTime;
+
+	/**  */
+	private java.util.Date updateTime;
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public Long getId() {
+		return this.id;
+	}
+
+	public Integer getActivitiesId() {
+		return activitiesId;
+	}
+
+	public void setActivitiesId(Integer activitiesId) {
+		this.activitiesId = activitiesId;
+	}
+
+	public void setUserId(Integer userId) {
+		this.userId = userId;
+	}
+
+	public Integer getUserId() {
+		return this.userId;
+	}
+
+	public void setOrganId(Integer organId) {
+		this.organId = organId;
+	}
+
+	public Integer getOrganId() {
+		return this.organId;
+	}
+
+	public void setType(TenantPaymentType type) {
+		this.type = type;
+	}
+
+	public TenantPaymentType getType() {
+		return this.type;
+	}
+
+	public void setExpectAmount(java.math.BigDecimal expectAmount) {
+		this.expectAmount = expectAmount;
+	}
+
+	public java.math.BigDecimal getExpectAmount() {
+		return this.expectAmount;
+	}
+
+	public void setActualAmount(java.math.BigDecimal actualAmount) {
+		this.actualAmount = actualAmount;
+	}
+
+	public java.math.BigDecimal getActualAmount() {
+		return this.actualAmount;
+	}
+
+	public void setBalancePaymentAmount(java.math.BigDecimal balancePaymentAmount) {
+		this.balancePaymentAmount = balancePaymentAmount;
+	}
+
+	public java.math.BigDecimal getBalancePaymentAmount() {
+		return this.balancePaymentAmount;
+	}
+
+	public void setComAmount(java.math.BigDecimal comAmount) {
+		this.comAmount = comAmount;
+	}
+
+	public java.math.BigDecimal getComAmount() {
+		return this.comAmount;
+	}
+
+	public void setPerAmount(java.math.BigDecimal perAmount) {
+		this.perAmount = perAmount;
+	}
+
+	public java.math.BigDecimal getPerAmount() {
+		return this.perAmount;
+	}
+
+	public void setRemitFee(java.math.BigDecimal remitFee) {
+		this.remitFee = remitFee;
+	}
+
+	public java.math.BigDecimal getRemitFee() {
+		return this.remitFee;
+	}
+
+	public void setTransNo(String transNo) {
+		this.transNo = transNo;
+	}
+
+	public String getTransNo() {
+		return this.transNo;
+	}
+
+	public void setStatus(DealStatusEnum status) {
+		this.status = status;
+	}
+
+	public DealStatusEnum getStatus() {
+		return this.status;
+	}
+
+	public void setMemo(String memo) {
+		this.memo = memo;
+	}
+
+	public String getMemo() {
+		return this.memo;
+	}
+
+	public void setPaymentChannel(String paymentChannel) {
+		this.paymentChannel = paymentChannel;
+	}
+
+	public String getPaymentChannel() {
+		return this.paymentChannel;
+	}
+
+	public void setPaymentBusinessChannel(String paymentBusinessChannel) {
+		this.paymentBusinessChannel = paymentBusinessChannel;
+	}
+
+	public String getPaymentBusinessChannel() {
+		return this.paymentBusinessChannel;
+	}
+
+	public void setMerNos(String merNos) {
+		this.merNos = merNos;
+	}
+
+	public String getMerNos() {
+		return this.merNos;
+	}
+
+	public void setOrderNo(String orderNo) {
+		this.orderNo = orderNo;
+	}
+
+	public String getOrderNo() {
+		return this.orderNo;
+	}
+
+	public void setPayTime(java.util.Date payTime) {
+		this.payTime = payTime;
+	}
+
+	public java.util.Date getPayTime() {
+		return this.payTime;
+	}
+
+	public void setVersion(Integer version) {
+		this.version = version;
+	}
+
+	public Integer getVersion() {
+		return this.version;
+	}
+
+	public void setCreateTime(java.util.Date createTime) {
+		this.createTime = createTime;
+	}
+
+	public java.util.Date getCreateTime() {
+		return this.createTime;
+	}
+
+	public void setUpdateTime(java.util.Date updateTime) {
+		this.updateTime = updateTime;
+	}
+
+	public java.util.Date getUpdateTime() {
+		return this.updateTime;
+	}
+
+	@Override
+	public String toString() {
+		return ToStringBuilder.reflectionToString(this);
+	}
+
+}

+ 2 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/OrderTypeEnum.java

@@ -13,7 +13,8 @@ public enum OrderTypeEnum implements BaseEnum<String, OrderTypeEnum> {
 	SMALL_CLASS_TO_BUY("SMALL_CLASS_TO_BUY", "小课购买"),
 	PRACTICE_GROUP_BUY("PRACTICE_GROUP_BUY", "网管课购买"),
 	COURSE_GROUP_BUY("COURSE_GROUP_BUY","对外课程购买"),
-	LUCK("LUCK", "福袋活动");
+	LUCK("LUCK", "福袋活动"),
+	TENANT_RECHARGE("TENANT_RECHARGE","租户充值");
 
 	private String code;
 

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/TenantEntryActivitesQueryInfo.java

@@ -4,6 +4,7 @@ import io.swagger.annotations.ApiModelProperty;
 
 import java.util.Date;
 
+import com.ym.mec.biz.dal.entity.TenantEntryActivities.SuitableUser;
 import com.ym.mec.common.page.QueryInfo;
 
 public class TenantEntryActivitesQueryInfo extends QueryInfo {
@@ -13,6 +14,8 @@ public class TenantEntryActivitesQueryInfo extends QueryInfo {
 
 	private Boolean delFlag;
 
+	private SuitableUser suitableUser;
+
 	public Date getStartDate() {
 		return startDate;
 	}
@@ -29,4 +32,12 @@ public class TenantEntryActivitesQueryInfo extends QueryInfo {
 		this.delFlag = delFlag;
 	}
 
+	public SuitableUser getSuitableUser() {
+		return suitableUser;
+	}
+
+	public void setSuitableUser(SuitableUser suitableUser) {
+		this.suitableUser = suitableUser;
+	}
+
 }

+ 22 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/CourseReviewService.java

@@ -7,6 +7,7 @@ import com.ym.mec.biz.dal.page.CourseReviewQueryInfo;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
 
+import java.util.List;
 
 
 public interface CourseReviewService extends BaseService<Integer, CourseScheduleReview> {
@@ -60,4 +61,25 @@ public interface CourseReviewService extends BaseService<Integer, CourseSchedule
 	 */
 	void pushNeedReview2Teacher();
 
+	/**
+	 * 获取班级已结束的课程
+	 * @param classGroupId
+	 * @return
+	 */
+	List<CourseReviewDto> getClassOverCourse(Long classGroupId);
+
+	/**
+	 * 根据课程id获取老师和学生评价
+	 * @param courseId
+	 * @return
+	 */
+	ReviewInfoDto getStuAndTeaReview(Long courseId);
+
+	/**
+	 * 批量添加评价
+	 * @param courseScheduleReviewList
+	 * @return
+	 */
+	List<CourseScheduleReview> batchAdd(Integer teacherId, List<CourseScheduleReview> courseScheduleReviewList);
+
 }

+ 3 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/CoursesGroupService.java

@@ -6,6 +6,8 @@ import com.ym.mec.biz.dal.dto.GroupHeadInfoDto;
 import com.ym.mec.biz.dal.entity.CoursesGroup;
 import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
 import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.page.QueryInfo;
 import com.ym.mec.common.service.BaseService;
 
 import java.util.List;
@@ -29,7 +31,7 @@ public interface CoursesGroupService extends BaseService<Long, CoursesGroup> {
      * @param teacherId: 教师编号
      * @return java.util.List<com.ym.mec.biz.dal.dto.CourseGroupTeacherCardDto>
      */
-    List<CourseGroupTeacherCardDto> findTeacherCourseGroups(Integer teacherId);
+    PageInfo findTeacherCourseGroups(Integer teacherId, QueryInfo queryInfo);
 
     /**
      * @describe 获取课程对应班级头部信息

+ 14 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/SysTenantAccountService.java

@@ -1,8 +1,22 @@
 package com.ym.mec.biz.service;
 
+import java.math.BigDecimal;
+
 import com.ym.mec.biz.dal.entity.SysTenantAccount;
+import com.ym.mec.biz.dal.entity.SysTenantAccountDetail.TransType;
 import com.ym.mec.common.service.BaseService;
 
 public interface SysTenantAccountService extends BaseService<Integer, SysTenantAccount> {
 
+	/**
+	 * 更新账户
+	 * @param userId 用户编号
+	 * @param minutes 修改的分钟数(正数相加,负数相减)
+	 * @param type 交易类型
+	 * @param transNo 交易流水
+	 * @param cashAmount 交易金额
+	 * @param memo 备注
+	 * @return
+	 */
+	public boolean update(Integer userId, int minutes, TransType type, String transNo, BigDecimal cashAmount, String memo);
 }

+ 0 - 7
mec-biz/src/main/java/com/ym/mec/biz/service/TenantEntryActivitiesService.java

@@ -12,11 +12,4 @@ public interface TenantEntryActivitiesService extends BaseService<Integer, Tenan
 	 */
 	public boolean merge(TenantEntryActivities tenantEntryActivites);
 
-	/**
-	 * 入驻
-	 * @param userId 用户编号
-	 * @param activitiesId 活动编号
-	 * @return
-	 */
-	public boolean enter(Integer userId, Integer activitiesId);
 }

+ 29 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/TenantPaymentOrderService.java

@@ -0,0 +1,29 @@
+package com.ym.mec.biz.service;
+
+import java.util.Map;
+
+import com.ym.mec.biz.dal.entity.TenantPaymentOrder;
+import com.ym.mec.common.service.BaseService;
+
+public interface TenantPaymentOrderService extends BaseService<Long, TenantPaymentOrder> {
+
+	/**
+	 * 下单
+	 * @param userId
+	 * @param activitiesId
+	 * @return
+	 */
+	public Map<String, Object> createOrder(Integer userId, Integer activitiesId);
+
+	/**
+	 * 回调
+	 * @param tenantPaymentOrder
+	 * @return
+	 */
+	public boolean paymentForCallback(TenantPaymentOrder tenantPaymentOrder);
+
+	/**
+	 * 从第三方查询订单状态
+	 */
+	public void queryOrderStatusFromRemote();
+}

+ 1 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseHomeworkServiceImpl.java

@@ -89,7 +89,7 @@ public class CourseHomeworkServiceImpl extends BaseServiceImpl<Long, CourseHomew
 			Integer userId = (Integer) mapper.getKey();
 			receivers.put(userId, userId + "");
 
-			sysMessageService.batchSendMessage(MessageSender.JIGUANG, MessageTypeEnum.TEACHER_PUSH_JOB_WAIT_REPLY, receivers, null, 0, "6?", "TEACHER",
+			sysMessageService.batchSendMessage(MessageSender.JIGUANG, MessageTypeEnum.TEACHER_PUSH_JOB_WAIT_REPLY, receivers, null, 0, "6", "TEACHER",
 					mapper.getValue());
 		}
 	}

+ 99 - 8
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseReviewServiceImpl.java

@@ -206,7 +206,8 @@ public class CourseReviewServiceImpl extends BaseServiceImpl<Integer, CourseSche
 
                 if (!CollectionUtils.isEmpty(courseScheduleStudentPayments)) {
                     List<StudentCourseHomework> studentCourseHomeworks = new ArrayList<>();
-                    Map<Integer, String> userMap = new HashMap<>();
+                    Teacher teacher = teacherDao.get(courseScheduleReview.getTeacherId());
+                    String dateStr = DateUtil.dateToString(DateUtil.addDays(date, 1), "MM月dd日");
                     for (CourseScheduleStudentPayment courseScheduleStudentPayment : courseScheduleStudentPayments) {
                         StudentCourseHomework studentCourseHomework = new StudentCourseHomework();
                         studentCourseHomework.setCourseHomeworkId(courseHomework.getId());
@@ -217,15 +218,16 @@ public class CourseReviewServiceImpl extends BaseServiceImpl<Integer, CourseSche
                         studentCourseHomework.setStatus(YesOrNoEnum.NO);
                         studentCourseHomework.setIsView(YesOrNoEnum.NO);
                         studentCourseHomework.setIsReplied(YesOrNoEnum.NO);
-                        studentCourseHomeworks.add(studentCourseHomework);
+//                        studentCourseHomeworks.add(studentCourseHomework);
+                        studentCourseHomeworkDao.insert(studentCourseHomework);
+
+                        Map<Integer, String> userMap = new HashMap<>();
                         userMap.put(courseScheduleStudentPayment.getUserId(), courseScheduleStudentPayment.getUserId().toString());
+                        String notifyUrl = "3?courseScheduleID=" + courseSchedule.getId() + "&studentCourseHomeworkId=" + studentCourseHomework.getId();
+                        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.HOMEWORK_REMIND,
+                                userMap, null, 0, notifyUrl, "STUDENT", teacher.getRealName(), courseSchedule.getName(), dateStr);
                     }
-                    studentCourseHomeworkDao.batchInsertStudentCourseHomeworkRecord(studentCourseHomeworks);
-                    Teacher teacher = teacherDao.get(courseScheduleReview.getTeacherId());
-                    String dateStr = DateUtil.dateToString(DateUtil.addDays(date, 1), "MM月dd日");
-                    String notifyUrl = "3?courseScheduleID=" + courseSchedule.getId() + "&studentCourseHomeworkId=" + courseHomework.getId();
-                    sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.HOMEWORK_REMIND,
-                            userMap, null, 0, notifyUrl, "STUDENT", teacher.getRealName(), courseSchedule.getName(), dateStr);
+//                    studentCourseHomeworkDao.batchInsertStudentCourseHomeworkRecord(studentCourseHomeworks);
                 }
             }
 
@@ -351,4 +353,93 @@ public class CourseReviewServiceImpl extends BaseServiceImpl<Integer, CourseSche
                 userMap, null, 0, "8?" + pushUrl, "TEACHER");
 
     }
+
+    @Override
+    public List<CourseReviewDto> getClassOverCourse(Long classGroupId) {
+        List<CourseReviewDto> coursesList = courseScheduleReviewDao.findByClassGroupId(classGroupId);
+
+        Map<Integer, List<CourseScheduleReview>> courseReviewsMap = new HashMap<>();
+        Map<Long, List<CourseScheduleComplaints>> courseComplaintsMap = new HashMap<>();
+        if (coursesList.size() > 0) {
+            List<Long> courseIds = coursesList.stream().map(courseReviewDto -> courseReviewDto.getId().longValue()).collect(Collectors.toList());
+            List<CourseScheduleReview> reviews = courseScheduleReviewDao.findByCourseSchedules(courseIds);
+            courseReviewsMap = reviews.stream().collect(Collectors.groupingBy(CourseScheduleReview::getId));
+            List<CourseScheduleComplaints> studentReviewsList = courseScheduleComplaintsDao.findByCourseScheduleIds(courseIds);
+            courseComplaintsMap = studentReviewsList.stream().collect(Collectors.groupingBy(CourseScheduleComplaints::getCourseScheduleId));
+        }
+        for (CourseReviewDto course : coursesList) {
+            if (courseReviewsMap.containsKey(course.getId())) {
+                List<CourseScheduleReview> reviews = courseReviewsMap.get(course.getId());
+                course.setReviewId(reviews.get(0).getId());
+            }
+            if (courseComplaintsMap.containsKey(course.getId().longValue())) {
+                List<CourseScheduleComplaints> courseScheduleComplaints = courseComplaintsMap.get(course.getId().longValue());
+                course.setStudentReview(courseScheduleComplaints.get(0).getScore().intValue());
+            }
+
+            Date startTime = DateUtil.stringToDate(course.getClassDateStr() + " " + course.getStartClassTimeStr());
+            Date endTime = DateUtil.stringToDate(course.getClassDateStr() + " " + course.getEndClassTimeStr());
+            int duration = DateUtil.minutesBetween(startTime, endTime);
+            course.setCourseDuration(duration);
+            course.setStartClassTimeStr(course.getStartClassTimeStr().substring(0, 5));
+            course.setEndClassTimeStr(course.getEndClassTimeStr().substring(0, 5));
+        }
+        return coursesList;
+    }
+
+    @Override
+    public ReviewInfoDto getStuAndTeaReview(Long courseId) {
+        CourseSchedule courseSchedule = courseScheduleDao.get(courseId);
+        if (courseSchedule == null) {
+            throw new BizException("课程不存在");
+        }
+        //头部信息
+        TeacherClassHeadInfo teacherClassGroupInfo = getCourseInfoHead(courseId.intValue());
+        ReviewInfoDto reviewInfoDto = new ReviewInfoDto();
+        reviewInfoDto.setTeacherClassHeadInfo(teacherClassGroupInfo);
+        //学生评价
+        List<CourseScheduleComplaintsDto> CourseScheduleComplaints = courseScheduleComplaintsDao.findByCourseScheduleId(courseId);
+        if (CourseScheduleComplaints.size() > 0) {
+            reviewInfoDto.setCourseScheduleComplaints(CourseScheduleComplaints);
+        }
+        //老师评价
+        List<CourseScheduleReview> teacherReviews = courseScheduleReviewDao.findByCourseScheduleId(courseId);
+        if (teacherReviews.size() > 0) {
+            reviewInfoDto.setCourseScheduleReviewList(teacherReviews);
+            Set<Integer> review4StudentIds = teacherReviews.stream().map(CourseScheduleReview::getStudentId).collect(Collectors.toSet());
+            reviewInfoDto.setReview4StudentIds(review4StudentIds);
+            reviewInfoDto.setTeachingMaterial(teacherReviews.get(0).getTeachingMaterial());
+        }
+        //班级学生
+        List<SysUser> students = courseScheduleReviewDao.findStudentByClassGroupId(courseSchedule.getClassGroupId().longValue());
+        if (students.size() > 0) {
+            reviewInfoDto.setStudents(students);
+        }
+        return reviewInfoDto;
+    }
+
+    @Override
+    public List<CourseScheduleReview> batchAdd(Integer teacherId, List<CourseScheduleReview> courseScheduleReviewList) {
+        if (courseScheduleReviewList == null || courseScheduleReviewList.size() <= 0) {
+            throw new BizException("提交内容不能为空");
+        }
+        Integer courseScheduleId = courseScheduleReviewList.get(0).getCourseScheduleId();
+        if (courseScheduleId == null || courseScheduleId <= 0) {
+            throw new BizException("课程id不能为空");
+        }
+        CourseSchedule courseSchedule = courseScheduleDao.get(courseScheduleId.longValue());
+        if (courseSchedule == null) {
+            throw new BizException("课程不存在,确保课程id正确");
+        }
+        for (CourseScheduleReview courseScheduleReview : courseScheduleReviewList) {
+            courseScheduleReview.setCourseScheduleId(courseSchedule.getId().intValue());
+            courseScheduleReview.setClassGroupId(courseSchedule.getClassGroupId());
+            courseScheduleReview.setTeacherId(teacherId);
+        }
+        int nums = courseScheduleReviewDao.batchAdd(courseScheduleReviewList);
+        if (nums <= 0) {
+            throw new BizException("评价插入失败,请重试");
+        }
+        return courseScheduleReviewList;
+    }
 }

+ 10 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java

@@ -671,23 +671,31 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
             classGroupTeacherSalaryDao.insert(newClassGroupTeacherSalary);
         }
 
+        TeacherDefaultVipGroupSalary teacherDefaultVipGroupSalary = teacherDefaultVipGroupSalaryDao.findByTeacherAndCategory(vipGroup.getUserId(), vipGroup.getVipGroupCategoryId());
+
         BigDecimal onlineTeacherSalary,
                 offlineTeacherSalary;
 
         onlineTeacherSalary=classGroupTeacherSalary.getOnlineClassesSalary();
+        if(Objects.isNull(onlineTeacherSalary)){
+            onlineTeacherSalary=teacherDefaultVipGroupSalary.getOnlineClassesSalary();
+        }
         offlineTeacherSalary=classGroupTeacherSalary.getSalary();
+        if(Objects.isNull(offlineTeacherSalary)){
+            offlineTeacherSalary=teacherDefaultVipGroupSalary.getOfflineClassesSalary();
+        }
 
         VipGroupCategory vipGroupCategory = vipGroupCategoryDao.get(vipGroup.getVipGroupCategoryId().intValue());
 
         BigDecimal studentNumDecimal = new BigDecimal(studentNum);
         BigDecimal oldStudentNumDecimal = new BigDecimal(vipGroupCategory.getStudentNum());
 
-        if(Objects.nonNull(onlineTeacherSalary)){
+        if(Objects.nonNull(onlineTeacherSalary)||onlineTeacherSalary.compareTo(BigDecimal.ZERO)<=0){
             onlineTeacherSalary = onlineTeacherSalary
                     .divide(oldStudentNumDecimal, CommonConstants.DECIMAL_PLACE,BigDecimal.ROUND_DOWN)
                     .multiply(studentNumDecimal).setScale(0, BigDecimal.ROUND_HALF_UP);
         }
-        if(Objects.nonNull(offlineTeacherSalary)){
+        if(Objects.nonNull(offlineTeacherSalary)||offlineTeacherSalary.compareTo(BigDecimal.ZERO)<=0){
             offlineTeacherSalary = offlineTeacherSalary
                     .divide(oldStudentNumDecimal,CommonConstants.DECIMAL_PLACE,BigDecimal.ROUND_DOWN)
                     .multiply(studentNumDecimal).setScale(0,BigDecimal.ROUND_HALF_UP);

+ 50 - 38
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CoursesGroupServiceImpl.java

@@ -14,9 +14,12 @@ import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.entity.ImGroupMember;
 import com.ym.mec.common.entity.ImGroupModel;
 import com.ym.mec.common.exception.BizException;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.page.QueryInfo;
 import com.ym.mec.common.service.IdGeneratorService;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.im.ImFeignService;
+import com.ym.mec.util.collection.MapUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -114,10 +117,7 @@ public class CoursesGroupServiceImpl extends BaseServiceImpl<Long, CoursesGroup>
 
         //总课程时长
         Integer totalCourseTime=courseCycleInfo.getCourseCount()*courseCycleInfo.getSingleClassMinutes();
-        SysTenantAccount sysTenantAccount = sysTenantAccountService.get(courseGroup.getTeacherId());
-        if(Objects.isNull(sysTenantAccount)||(sysTenantAccount.getAvailableMinutes()-totalCourseTime)<0){
-            throw new BizException("您的可用课程时长不足");
-        }
+        sysTenantAccountService.update(courseGroup.getTeacherId(), -totalCourseTime, SysTenantAccountDetail.TransType.CONSUME, "",BigDecimal.ZERO,"课程组创建");
 
         Date now=new Date();
         courseGroup.setSingleClassMinutes(courseCycleInfo.getSingleClassMinutes());
@@ -214,48 +214,60 @@ public class CoursesGroupServiceImpl extends BaseServiceImpl<Long, CoursesGroup>
     }
 
     @Override
-    public List<CourseGroupTeacherCardDto> findTeacherCourseGroups(Integer teacherId) {
+    public PageInfo findTeacherCourseGroups(Integer teacherId, QueryInfo queryInfo) {
         if(Objects.isNull(teacherId)){
             throw new BizException("请指定老师");
         }
-        List<CoursesGroup> teacherCourseGroups = coursesGroupDao.findTeacherCourseGroups(teacherId);
-        if (CollectionUtils.isEmpty(teacherCourseGroups)){
-            return new ArrayList<>();
-        }
-
-        List<String> groupIds = teacherCourseGroups.stream().map(group -> String.valueOf(group.getId())).collect(Collectors.toList());
 
-        List<Integer> subjectIds = teacherCourseGroups.stream().map(CoursesGroup::getSubjectId).collect(Collectors.toList());
-        List<Subject> subjects = subjectDao.findBySubjectIds(subjectIds);
-        Map<Integer, Subject> idSubjectMap = subjects.stream().collect(Collectors.toMap(Subject::getId, subject -> subject));
-
-        List<ClassGroupStudentMapper> students = classGroupStudentMapperDao.findByGroups(groupIds, GroupType.COMM);
-        Map<String, List<ClassGroupStudentMapper>> groupStudentsMap = students.stream().collect(Collectors.groupingBy(ClassGroupStudentMapper::getMusicGroupId));
-
-        List<GroupCourseTimesDto> groupsCourseTimesInfo = courseScheduleDao.findGroupsCourseTimesInfo(groupIds, GroupType.COMM);
-        Map<String, GroupCourseTimesDto> groupCourseTimesInfoMap = groupsCourseTimesInfo.stream().collect(Collectors.toMap(GroupCourseTimesDto::getGroupId, e -> e));
+        PageInfo pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<>();
+        MapUtil.populateMap(params, queryInfo);
+        params.put("teacherId", teacherId);
 
         List<CourseGroupTeacherCardDto> groupCards=new ArrayList<>();
-        for (CoursesGroup teacherCourseGroup : teacherCourseGroups) {
-            CourseGroupTeacherCardDto groupCard=new CourseGroupTeacherCardDto();
-            groupCard.setId(teacherCourseGroup.getId());
-            groupCard.setName(teacherCourseGroup.getName());
-            groupCard.setSingleClassMinutes(teacherCourseGroup.getSingleClassMinutes());
-            groupCard.setCoursesStartDate(teacherCourseGroup.getCoursesStartDate());
-            groupCard.setCoursesEndDate(teacherCourseGroup.getCoursesEndDate());
-            groupCard.setSubjectId(teacherCourseGroup.getSubjectId());
-            groupCard.setSubjectName(idSubjectMap.get(teacherCourseGroup.getSubjectId()).getName());
-            GroupCourseTimesDto groupCourseTimesInfo = groupCourseTimesInfoMap.get(String.valueOf(teacherCourseGroup.getId()));
-            groupCard.setTotalCourseTimes(groupCourseTimesInfo.getTotalCourseTimes());
-            groupCard.setSurplusClassTimes(groupCourseTimesInfo.getSurplusClassTimes());
-            List<ClassGroupStudentMapper> groupStudents = groupStudentsMap.get(String.valueOf(teacherCourseGroup.getId()));
-            if(!CollectionUtils.isEmpty(groupStudentsMap)){
-                List<String> userNames = groupStudents.stream().map(ClassGroupStudentMapper::getUserName).collect(Collectors.toList());
-                groupCard.setStudentNames(StringUtils.join(userNames,","));
+        int count = coursesGroupDao.countTeacherGroups(params);
+        if (count > 0) {
+            pageInfo.setTotal(count);
+            params.put("offset", pageInfo.getOffset());
+            List<CoursesGroup> teacherCourseGroups = coursesGroupDao.findTeacherCourseGroups(params);
+
+            List<String> groupIds = teacherCourseGroups.stream().map(group -> String.valueOf(group.getId())).collect(Collectors.toList());
+
+            List<Integer> subjectIds = teacherCourseGroups.stream().map(CoursesGroup::getSubjectId).collect(Collectors.toList());
+            List<Subject> subjects = subjectDao.findBySubjectIds(subjectIds);
+            Map<Integer, Subject> idSubjectMap = subjects.stream().collect(Collectors.toMap(Subject::getId, subject -> subject));
+
+            List<ClassGroupStudentMapper> students = classGroupStudentMapperDao.findByGroups(groupIds, GroupType.COMM);
+            Map<String, List<ClassGroupStudentMapper>> groupStudentsMap = students.stream().collect(Collectors.groupingBy(ClassGroupStudentMapper::getMusicGroupId));
+
+            List<GroupCourseTimesDto> groupsCourseTimesInfo = courseScheduleDao.findGroupsCourseTimesInfo(groupIds, GroupType.COMM);
+            Map<String, GroupCourseTimesDto> groupCourseTimesInfoMap = groupsCourseTimesInfo.stream().collect(Collectors.toMap(GroupCourseTimesDto::getGroupId, e -> e));
+
+            groupCards=new ArrayList<>();
+            for (CoursesGroup teacherCourseGroup : teacherCourseGroups) {
+                CourseGroupTeacherCardDto groupCard=new CourseGroupTeacherCardDto();
+                groupCard.setId(teacherCourseGroup.getId());
+                groupCard.setGroupType(GroupType.COMM);
+                groupCard.setName(teacherCourseGroup.getName());
+                groupCard.setSingleClassMinutes(teacherCourseGroup.getSingleClassMinutes());
+                groupCard.setCoursesStartDate(teacherCourseGroup.getCoursesStartDate());
+                groupCard.setCoursesEndDate(teacherCourseGroup.getCoursesEndDate());
+                groupCard.setSubjectId(teacherCourseGroup.getSubjectId());
+                groupCard.setSubjectName(idSubjectMap.get(teacherCourseGroup.getSubjectId()).getName());
+                GroupCourseTimesDto groupCourseTimesInfo = groupCourseTimesInfoMap.get(String.valueOf(teacherCourseGroup.getId()));
+                groupCard.setTotalCourseTimes(groupCourseTimesInfo.getTotalCourseTimes());
+                groupCard.setSurplusClassTimes(groupCourseTimesInfo.getSurplusClassTimes());
+                groupCard.setCurrentClassTimes(groupCard.getTotalCourseTimes()-groupCard.getSurplusClassTimes());
+                List<ClassGroupStudentMapper> groupStudents = groupStudentsMap.get(String.valueOf(teacherCourseGroup.getId()));
+                if(!CollectionUtils.isEmpty(groupStudents)){
+                    List<String> userNames = groupStudents.stream().map(ClassGroupStudentMapper::getUserName).collect(Collectors.toList());
+                    groupCard.setStudentNames(StringUtils.join(userNames,","));
+                }
+                groupCards.add(groupCard);
             }
-            groupCards.add(groupCard);
         }
-        return groupCards;
+        pageInfo.setRows(groupCards);
+        return pageInfo;
     }
 
     @Override

+ 54 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysTenantAccountServiceImpl.java

@@ -1,12 +1,24 @@
 package com.ym.mec.biz.service.impl;
 
+import java.math.BigDecimal;
+import java.util.Date;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
 
 import com.ym.mec.biz.dal.dao.SysTenantAccountDao;
+import com.ym.mec.biz.dal.dao.SysTenantAccountDetailDao;
 import com.ym.mec.biz.dal.entity.SysTenantAccount;
+import com.ym.mec.biz.dal.entity.SysTenantAccount.AccountStatus;
+import com.ym.mec.biz.dal.entity.SysTenantAccountDetail;
+import com.ym.mec.biz.dal.entity.SysTenantAccountDetail.TransStatus;
+import com.ym.mec.biz.dal.entity.SysTenantAccountDetail.TransType;
+import com.ym.mec.biz.dal.enums.DealStatusEnum;
 import com.ym.mec.biz.service.SysTenantAccountService;
 import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 
 @Service
@@ -15,9 +27,51 @@ public class SysTenantAccountServiceImpl extends BaseServiceImpl<Integer, SysTen
 	@Autowired
 	private SysTenantAccountDao sysTenantAccountDao;
 
+	@Autowired
+	private SysTenantAccountDetailDao sysTenantAccountDetailDao;
+
 	@Override
 	public BaseDAO<Integer, SysTenantAccount> getDAO() {
 		return sysTenantAccountDao;
 	}
 
+	@Override
+	@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+	public boolean update(Integer userId, int minutes, TransType type, String transNo, BigDecimal cashAmount, String memo) {
+		SysTenantAccount tenantAccount = sysTenantAccountDao.getLocked(userId);
+		if (tenantAccount == null) {
+			throw new BizException("用户[{}]现金账户不存在", userId);
+		}
+
+		if (tenantAccount.getStatus() != AccountStatus.NORMAL) {
+			throw new BizException("账户不可用");
+		}
+		int balance = tenantAccount.getAvailableMinutes() + minutes;
+		if (balance < 0) {
+			throw new BizException("账户[{}]可用时间不足,可用时间剩{}分钟", userId, tenantAccount.getAvailableMinutes());
+		}
+
+		Date date = new Date();
+
+		tenantAccount.setAvailableMinutes(balance);
+		tenantAccount.setUpdateTime(date);
+		sysTenantAccountDao.update(tenantAccount);
+
+		SysTenantAccountDetail detail = new SysTenantAccountDetail();
+		detail.setTransMinutes(minutes);
+		detail.setTotalAvailableMinutes(tenantAccount.getAvailableMinutes());
+		detail.setMemo(memo);
+		detail.setCreateTime(date);
+		detail.setTransStatus(TransStatus.SUCCESS);
+		detail.setTransType(type);
+		detail.setUpdateTime(date);
+		detail.setUserId(userId);
+		detail.setTransNo(transNo);
+		detail.setTransCashAmount(cashAmount);
+
+		sysTenantAccountDetailDao.insert(detail);
+
+		return true;
+	}
+
 }

+ 0 - 21
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantEntryActivitiesServiceImpl.java

@@ -4,8 +4,6 @@ import java.util.Date;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Propagation;
-import org.springframework.transaction.annotation.Transactional;
 
 import com.ym.mec.biz.dal.dao.TenantEntryActivitiesDao;
 import com.ym.mec.biz.dal.entity.TenantEntryActivities;
@@ -50,23 +48,4 @@ public class TenantEntryActivitiesServiceImpl extends BaseServiceImpl<Integer, T
 		return true;
 	}
 
-	@Override
-	@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
-	public boolean enter(Integer userId, Integer activitiesId) {
-		TenantEntryActivities tenantEntryActivities = tenantEntryActivitiesDao.get(activitiesId);
-		if (tenantEntryActivities == null) {
-			throw new BizException("活动不存在");
-		}
-
-		Date date = new Date();
-		// 判断活动是否有效
-		if (tenantEntryActivities.getDelFlag() == true || date.before(tenantEntryActivities.getStartDate()) || date.after(tenantEntryActivities.getEndDate())) {
-			throw new BizException("活动已结束或未开始");
-		}
-		
-		//是否满足条件
-
-		return true;
-	}
-
 }

+ 321 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantPaymentOrderServiceImpl.java

@@ -0,0 +1,321 @@
+package com.ym.mec.biz.service.impl;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.alibaba.fastjson.JSON;
+import com.huifu.adapay.model.payment.Payment;
+import com.ym.mec.biz.dal.dao.SysConfigDao;
+import com.ym.mec.biz.dal.dao.TeacherDao;
+import com.ym.mec.biz.dal.dao.TenantEntryActivitiesDao;
+import com.ym.mec.biz.dal.dao.TenantPaymentOrderDao;
+import com.ym.mec.biz.dal.entity.SysTenantAccountDetail.TransType;
+import com.ym.mec.biz.dal.entity.Teacher;
+import com.ym.mec.biz.dal.entity.TenantEntryActivities;
+import com.ym.mec.biz.dal.entity.TenantEntryActivities.SuitableUser;
+import com.ym.mec.biz.dal.entity.TenantPaymentOrder;
+import com.ym.mec.biz.dal.entity.TenantPaymentOrder.TenantPaymentType;
+import com.ym.mec.biz.dal.enums.DealStatusEnum;
+import com.ym.mec.biz.service.PayService;
+import com.ym.mec.biz.service.SysTenantAccountService;
+import com.ym.mec.biz.service.TenantPaymentOrderService;
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.exception.BizException;
+import com.ym.mec.common.service.IdGeneratorService;
+import com.ym.mec.common.service.impl.BaseServiceImpl;
+import com.ym.mec.thirdparty.adapay.Pay;
+import com.ym.mec.thirdparty.yqpay.Msg;
+import com.ym.mec.thirdparty.yqpay.RsqMsg;
+import com.ym.mec.thirdparty.yqpay.YqPayFeignService;
+import com.ym.mec.thirdparty.yqpay.YqPayUtil;
+import com.ym.mec.util.date.DateUtil;
+
+@Service
+public class TenantPaymentOrderServiceImpl extends BaseServiceImpl<Long, TenantPaymentOrder> implements TenantPaymentOrderService {
+
+	@Autowired
+	private TenantPaymentOrderDao tenantPaymentOrderDao;
+
+	@Autowired
+	private TenantEntryActivitiesDao tenantEntryActivitiesDao;
+
+	@Autowired
+	private IdGeneratorService idGeneratorService;
+
+	@Autowired
+	private PayService payService;
+
+	@Autowired
+	private SysConfigDao sysConfigDao;
+
+	@Autowired
+	private TeacherDao teacherDao;
+
+	@Autowired
+	private SysTenantAccountService sysTenantAccountService;
+
+	@Autowired
+	private YqPayFeignService yqPayFeignService;
+
+	@Override
+	public BaseDAO<Long, TenantPaymentOrder> getDAO() {
+		return tenantPaymentOrderDao;
+	}
+
+	@Override
+	@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+	public Map<String, Object> createOrder(Integer userId, Integer activitiesId) {
+
+		Teacher teacher = teacherDao.get(userId);
+		if (teacher == null) {
+			throw new BizException("用户信息不存在");
+		}
+
+		Integer organId = teacher.getOrganId();
+
+		TenantEntryActivities tenantEntryActivities = tenantEntryActivitiesDao.get(activitiesId);
+		if (tenantEntryActivities == null) {
+			throw new BizException("活动不存在");
+		}
+
+		Date date = new Date();
+		// 判断活动是否有效
+		if (tenantEntryActivities.getDelFlag() == true) {
+			throw new BizException("活动已下架");
+		}
+		if (date.before(tenantEntryActivities.getStartDate())) {
+			throw new BizException("活动未开始");
+		}
+		if (date.after(tenantEntryActivities.getEndDate())) {
+			throw new BizException("活动已结束");
+		}
+
+		int purchaseTimes = 0; // 购买次数
+		// 查询用户订单
+		List<TenantPaymentOrder> orderList = tenantPaymentOrderDao.queryByUserId(userId);
+		if (orderList != null && orderList.size() > 0) {
+			for (TenantPaymentOrder po : orderList) {
+				if (po.getStatus() == DealStatusEnum.ING || po.getStatus() == DealStatusEnum.SUCCESS) {
+					++purchaseTimes;
+				}
+			}
+		}
+
+		// 是否满足条件
+		if (tenantEntryActivities.getSuitableUser() == SuitableUser.NEW) {
+			if (purchaseTimes > 0) {
+				throw new BizException("您已参与过当前活动,每人只能参与一次");
+			}
+		}
+
+		TenantPaymentOrder tenantPaymentOrder = new TenantPaymentOrder();
+		tenantPaymentOrder.setUserId(userId);
+		tenantPaymentOrder.setOrderNo(idGeneratorService.generatorId("tenant_payment") + "");
+		tenantPaymentOrder.setType(TenantPaymentType.RECHARGE);
+		tenantPaymentOrder.setExpectAmount(tenantEntryActivities.getDiscountPrice());
+		tenantPaymentOrder.setStatus(DealStatusEnum.ING);
+		tenantPaymentOrder.setCreateTime(date);
+		tenantPaymentOrder.setUpdateTime(date);
+		tenantPaymentOrder.setVersion(0);
+		tenantPaymentOrder.setOrganId(organId);
+		tenantPaymentOrder.setActivitiesId(activitiesId);
+		tenantPaymentOrderDao.insert(tenantPaymentOrder);
+
+		String baseApiUrl = sysConfigDao.findConfigValue("teacher_base_url");
+
+		// 分类费用 course,instrument,accessories,other
+		Map<String, BigDecimal> classFee = new HashMap<>();
+		classFee.put("course", BigDecimal.ZERO);
+		classFee.put("instrument", BigDecimal.ZERO);
+		classFee.put("accessories", BigDecimal.ZERO);
+		classFee.put("other", tenantPaymentOrder.getExpectAmount());
+
+		try {
+
+			Map<String, Object> payMap = payService.getPayMap(tenantPaymentOrder.getExpectAmount(), tenantPaymentOrder.getOrderNo(), baseApiUrl
+					+ "/api-teacher/teacherOrder/notify", baseApiUrl + "/#/paymentResult?orderNo=" + tenantPaymentOrder.getOrderNo(),
+					"商户入驻", "商户充值", userId, classFee, organId);
+
+			Map<String, BigDecimal> routingFee = (Map<String, BigDecimal>) payMap.get("routingFee");
+			tenantPaymentOrder.setComAmount(routingFee.get("COM"));
+			tenantPaymentOrder.setPerAmount(routingFee.get("PER"));
+			tenantPaymentOrder.setMerNos((String) payMap.get("routingMerNos"));
+			tenantPaymentOrder.setPaymentChannel((String) payMap.get("type"));
+			tenantPaymentOrder.setUpdateTime(date);
+			tenantPaymentOrderDao.update(tenantPaymentOrder);
+
+			return payMap;
+		} catch (Exception e) {
+			throw new BizException("调用支付接口出错", e);
+		}
+	}
+
+	@Override
+	@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+	public boolean paymentForCallback(TenantPaymentOrder tenantPaymentOrder) {
+
+		Integer activitiesId = tenantPaymentOrder.getActivitiesId();
+
+		Date date = new Date();
+		tenantPaymentOrder.setUpdateTime(date);
+		tenantPaymentOrderDao.update(tenantPaymentOrder);
+
+		Integer userId = tenantPaymentOrder.getUserId();
+
+		if (tenantPaymentOrder.getStatus() == DealStatusEnum.SUCCESS) {
+
+			TenantEntryActivities tenantEntryActivities = tenantEntryActivitiesDao.get(activitiesId);
+			if (tenantEntryActivities == null) {
+				throw new BizException("活动找不到");
+			}
+
+			// 更新账户表信息
+			sysTenantAccountService.update(userId, tenantEntryActivities.getPurchaseMinutes() + tenantEntryActivities.getGiveMinutes(), TransType.RECHARGE, "",
+					tenantEntryActivities.getDiscountPrice(), "");
+		} else {
+
+		}
+
+		return true;
+	}
+
+	@Override
+	public void queryOrderStatusFromRemote() {
+		try {
+			yqPayQuery();
+		} catch (Exception e) {
+			throw new BizException("查询订单状态出现异常");
+		}
+		try {
+			adaPayQuery();
+		} catch (Exception e) {
+			throw new BizException("查询订单状态出现异常");
+		}
+	}
+
+	private void yqPayQuery() throws Exception {
+		List<TenantPaymentOrder> payingOrders = tenantPaymentOrderDao.findOrdersByStatus(DealStatusEnum.ING, "YQPAY");
+
+		if (payingOrders.size() == 0) {
+			return;
+		}
+		List<String> orderNoList = payingOrders.stream().map(TenantPaymentOrder::getOrderNo).collect(Collectors.toList());
+		String merOrderNos = payingOrders.stream().map(TenantPaymentOrder::getOrderNo).collect(Collectors.joining(","));
+
+		String notifyUrl = ""; // 回调地址
+		Map<String, Object> resultMap = new LinkedHashMap<>();
+		resultMap.put("merOrderNoList", merOrderNos);
+		Map<String, Object> requestMap = YqPayUtil.getRequestMap(notifyUrl, resultMap);
+
+		RsqMsg rsqMsg = new RsqMsg(requestMap);
+
+		Msg queryRs = yqPayFeignService.orderQuery(rsqMsg);
+
+		if (queryRs.getCode().equals("88")) {
+			// 更新订单状态
+			String[] statusArr = { "0", "1", "7" };
+			String responseParameters = queryRs.getResponseParameters();
+			List<Map<String, String>> responseList = JSON.parseObject(responseParameters, List.class);
+			for (Map<String, String> response : responseList) {
+				Map<String, String> rpMap = response;
+				String channelType = rpMap.get("channelType").equals("1") ? "WXPay" : (rpMap.get("channelType").equals("2") ? "Alipay" : "quickPay");
+				rpMap.put("channelType", channelType);
+
+				if (orderNoList.contains(rpMap.get("merOrderNo"))) {
+					orderNoList.remove(rpMap.get("merOrderNo"));
+				}
+
+				if (Arrays.asList(statusArr).contains(rpMap.get("tradeState"))) {
+					try {
+						DealStatusEnum status = rpMap.get("tradeState").equals("1") ? DealStatusEnum.SUCCESS : DealStatusEnum.FAILED;
+						TenantPaymentOrder order = tenantPaymentOrderDao.findOrderByOrderNo(rpMap.get("merOrderNo"));
+						if (order == null || !order.getStatus().equals(DealStatusEnum.ING)) {
+							continue;
+						}
+
+						if (status.equals(DealStatusEnum.SUCCESS)) {
+							order.setPayTime(new Date());
+						} else {
+							order.setMemo(rpMap.get("remarks"));
+						}
+						order.setStatus(status);
+						order.setTransNo(rpMap.get("orderNo"));
+						order.setPaymentBusinessChannel(channelType);
+						order.setActualAmount(new BigDecimal(rpMap.get("payAmount")));
+						paymentForCallback(order);
+					} catch (Exception e) {
+						e.printStackTrace();
+						continue;
+					}
+				}
+			}
+
+			Date date = new Date();
+			for (TenantPaymentOrder po : payingOrders) {
+				if (orderNoList.contains(po.getOrderNo())) {
+					// 超过30分钟的关闭订单
+					if (DateUtil.addMinutes(po.getCreateTime(), 30).before(date)) {
+						po.setStatus(DealStatusEnum.FAILED);
+						po.setMemo("超时未支付关闭");
+						paymentForCallback(po);
+					}
+				}
+			}
+		}
+	}
+
+	private void adaPayQuery() throws Exception {
+		List<TenantPaymentOrder> payingOrders = tenantPaymentOrderDao.findOrdersByStatus(DealStatusEnum.ING, "ADAPAY");
+		if (payingOrders.size() == 0) {
+			return;
+		}
+
+		List<String> orderNoList = new ArrayList<String>();
+
+		for (TenantPaymentOrder payingOrder : payingOrders) {
+			if (payingOrder.getTransNo() == null) {
+				orderNoList.add(payingOrder.getOrderNo());
+				continue;
+			}
+			Payment payment = new Pay().queryPayment(payingOrder.getTransNo());
+			Map<String, String> rpMap = new HashMap<>();
+			rpMap.put("merOrderNo", payingOrder.getOrderNo());
+			rpMap.put("remarks", payment.getReason());
+			rpMap.put("orderNo", payment.getId());
+			rpMap.put("channelType", payment.getPayChannel());
+			if (payment.getStatus().equals("succeeded")) {
+				rpMap.put("tradeState", "1");
+			}
+			if (payment.getStatus().equals("failed")) {
+				rpMap.put("tradeState", "0");
+			}
+			if (payment.getStatus().equals("pending")) {
+				orderNoList.add(payingOrder.getOrderNo());
+			}
+		}
+
+		Date date = new Date();
+		for (TenantPaymentOrder po : payingOrders) {
+			if (orderNoList.contains(po.getOrderNo())) {
+				// 超过30分钟的关闭订单
+				if (DateUtil.addMinutes(po.getCreateTime(), 30).before(date)) {
+					po.setStatus(DealStatusEnum.FAILED);
+					po.setMemo("超时未支付关闭");
+					paymentForCallback(po);
+				}
+			}
+		}
+	}
+}

+ 3 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java

@@ -1076,7 +1076,9 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 		List<ClassGroupStudentMapper> classGroupStudents = classGroupStudentMapperDao.findByClassGroup(classGroup.getId());
 
 		List<ImGroupMember> imGroupMemberList = new ArrayList<>();
-		imGroupMemberList.add(new ImGroupMember(vipGroupApplyBaseInfoDto.getEducationalTeacherId().toString()));
+		if(Objects.nonNull(vipGroupApplyBaseInfoDto.getEducationalTeacherId())){
+            imGroupMemberList.add(new ImGroupMember(vipGroupApplyBaseInfoDto.getEducationalTeacherId().toString()));
+        }
 		imGroupMemberList.add(new ImGroupMember(vipGroupApplyBaseInfoDto.getUserId().toString()));
 		//生成学生单课缴费信息
 		for (ClassGroupStudentMapper classGroupStudent : classGroupStudents) {

+ 1 - 1
mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml

@@ -1332,7 +1332,7 @@
         <include refid="global.limit"/>
     </select>
 
-    <select id="countTeacherGroupCourses" resultMap="teacherClassCourseSchedule">
+    <select id="countTeacherGroupCourses" resultType="int">
         SELECT
             COUNT(cs.id_)
         FROM course_schedule cs

+ 63 - 6
mec-biz/src/main/resources/config/mybatis/CourseScheduleReviewMapper.xml

@@ -20,8 +20,11 @@
         <result column="student_review_" jdbcType="TINYINT" property="studentReview"/>
         <result column="create_time_" jdbcType="DATE" property="createTime"/>
         <result column="update_time_" jdbcType="DATE" property="updateTime"/>
-        <result column="coursre_name_" jdbcType="VARCHAR" property="courseName"/>
+        <result column="course_name_" jdbcType="VARCHAR" property="courseName"/>
         <result column="teacher_name_" jdbcType="VARCHAR" property="teacherName"/>
+        <result column="teacher_avatar_" jdbcType="VARCHAR" property="teacherAvatar"/>
+        <result column="student_name_" jdbcType="VARCHAR" property="studentName"/>
+        <result column="student_avatar_" jdbcType="VARCHAR" property="studentAvatar"/>
         <result column="class_date_" jdbcType="DATE" property="classDate"/>
     </resultMap>
 
@@ -52,6 +55,19 @@
         #{handHomework,jdbcType=TINYINT}, #{courseReview,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP},
         #{updateTime,jdbcType=TIMESTAMP})
     </insert>
+
+    <insert id="batchAdd" parameterType="java.util.List" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
+        INSERT INTO course_schedule_review (course_schedule_id_, class_group_id_, teacher_id_, student_id_,
+        teaching_material_,memo_, create_time_,update_time_)
+        VALUE
+        <foreach collection="courseScheduleReviews" item="courseScheduleReview" separator=",">
+            (#{courseScheduleReview.courseScheduleId,jdbcType=INTEGER},#{courseScheduleReview.classGroupId,jdbcType=INTEGER},
+            #{courseScheduleReview.classGroupId,jdbcType=INTEGER},#{courseScheduleReview.teacherId,jdbcType=INTEGER},#{courseScheduleReview.studentId,jdbcType=INTEGER},
+            #{courseScheduleReview.teachingMaterial,jdbcType=VARCHAR},
+            #{courseScheduleReview.memo,jdbcType=VARCHAR},NOW(),now())
+        </foreach>
+    </insert>
+
     <update id="update" parameterType="com.ym.mec.biz.dal.entity.CourseScheduleReview">
         <!--@mbg.generated-->
         update course_schedule_review
@@ -115,7 +131,7 @@
         <result column="subject_id_" jdbcType="INTEGER" property="subjectId"/>
         <result column="organ_id_" jdbcType="INTEGER" property="organId"/>
         <result column="class_date_" jdbcType="DATE" property="classDate"/>
-        <result column="coursre_name_" jdbcType="VARCHAR" property="courseName"/>
+        <result column="course_name_" jdbcType="VARCHAR" property="courseName"/>
         <result column="teacher_name_" jdbcType="VARCHAR" property="teacherName"/>
         <result column="edu_teacher_name_" jdbcType="VARCHAR" property="eduTeacherName"/>
         <result column="buy_months_" property="BuyMonths"/>
@@ -124,6 +140,12 @@
         <result column="hand_homework_" property="handHomework"/>
         <result column="course_review_" property="courseReview"/>
         <result column="teacher_id" property="teacherId"/>
+        <result column="start_class_time_" jdbcType="DATE" property="startClassTime"/>
+        <result column="end_class_time_" jdbcType="DATE" property="endClassTime"/>
+        <result column="class_date_Str_" jdbcType="VARCHAR" property="classDateStr"/>
+        <result column="start_class_time_Str_" jdbcType="VARCHAR" property="startClassTimeStr"/>
+        <result column="end_class_time_Str_" jdbcType="VARCHAR" property="endClassTimeStr"/>
+
     </resultMap>
 
     <sql id="practiceGroupReviewsQueryCondition">
@@ -167,7 +189,7 @@
                 AND csr.has_liaison_ = 1
             </if>
             <if test='hasLiaison !=null and hasLiaison=="0"'>
-                AND (csr.has_liaison_ = 0 OR csr.has_liaison_ IS NULL
+                AND (csr.has_liaison_ = 0 OR csr.has_liaison_ IS NULL)
             </if>
             <if test="courseReview != null">
                 AND csr.course_review_=#{courseReview}
@@ -182,9 +204,11 @@
     </sql>
 
     <select id="getPracticeGroupReviewList" resultMap="CourseReviewDto">
-        SELECT cs.id_,cs.actual_teacher_id_ teacher_id ,cs.class_date_, pg.subject_id_,pg.organ_id_,pg.name_ coursre_name_,su.real_name_
+        SELECT cs.id_,cs.actual_teacher_id_ teacher_id ,cs.class_date_, pg.subject_id_,pg.organ_id_,pg.name_
+        course_name_,su.real_name_
         teacher_name_,edsu.real_name_
-        edu_teacher_name_,pg.buy_months_,csr.id_ review_id_, csc.score_ student_review_,csr.hand_homework_,csr.course_review_
+        edu_teacher_name_,pg.buy_months_,csr.id_ review_id_, csc.score_
+        student_review_,csr.hand_homework_,csr.course_review_
         FROM course_schedule cs
         LEFT JOIN practice_group pg ON cs.music_group_id_ = pg.id_
         LEFT JOIN sys_user su ON cs.actual_teacher_id_ = su.id_
@@ -237,7 +261,7 @@
     </sql>
 
     <select id="getPracticeGroupReview4EduList" resultMap="CourseScheduleReview">
-        SELECT csr.id_,cs.class_date_, pg.name_ coursre_name_,su.real_name_ teacher_name_,csr.hand_homework_
+        SELECT csr.id_,cs.class_date_, pg.name_ course_name_,su.real_name_ teacher_name_,csr.hand_homework_
         FROM course_schedule_review csr
         LEFT JOIN course_schedule cs on cs.id_ = csr.course_schedule_id_
         LEFT JOIN practice_group pg ON cs.music_group_id_ = pg.id_
@@ -275,4 +299,37 @@
         </foreach>
         AND student_id_ = #{studentId}
     </select>
+
+    <select id="findByClassGroupId" resultMap="CourseReviewDto">
+        SELECT id_,
+               class_date_,
+               name_             course_name_,
+               class_date_       class_date_Str_,
+               start_class_time_ start_class_time_Str_,
+               end_class_time_   end_class_time_Str_
+        FROM course_schedule
+        WHERE class_group_id_ = #{classGroupId}
+          AND status_ = 'OVER'
+        ORDER BY class_date_ DESC
+    </select>
+
+    <select id="findByCourseScheduleId" resultMap="CourseScheduleReview">
+        SELECT csr.teacher_id_,
+               t.real_name_  teacher_name_,
+               t.avatar_     teacher_avatar_,
+               csr.student_id_,
+               stu.username_ student_name_,
+               stu.avatar_   student_avatar_,
+               csr.teaching_material_,
+               csr.memo_
+        FROM course_schedule_review csr
+                 LEFT JOIN sys_user t on csr.teacher_id_ = t.id_
+                 LEFT JOIN sys_user stu on csr.student_id_ = t.id_
+        WHERE csr.course_schedule_id_ = #{courseScheduleId}
+    </select>
+
+    <select id="findStudentByClassGroupId" resultMap="com.ym.mec.biz.dal.dao.TeacherDao.SysUser">
+        SELECT su.id_, su.username_,su.avatar_ FROM  class_group_student_mapper cgsm
+        LEFT JOIN sys_user su on cgsm.user_id_ = su.id_ WHERE cgsm.class_group_id_ = #{classGroupId}
+    </select>
 </mapper>

+ 5 - 0
mec-biz/src/main/resources/config/mybatis/CoursesGroupMapper.xml

@@ -132,6 +132,11 @@
 
     <select id="findTeacherCourseGroups" resultMap="CoursesGroup">
 		SELECT * FROM courses_group WHERE teacher_id_=#{teacherId} AND status_ IN ('APPLYING', 'NORMAL') ORDER BY id_ DESC
+		<include refid="global.limit"/>
+    </select>
+
+	<select id="countTeacherGroups" resultType="int">
+		SELECT COUNT(id_) FROM courses_group WHERE teacher_id_=#{teacherId} AND status_ IN ('APPLYING', 'NORMAL')
     </select>
 
     <select id="queryTeacherCourseGroups" resultMap="CoursesGroup">

+ 2 - 2
mec-biz/src/main/resources/config/mybatis/StudentCourseHomeworkMapper.xml

@@ -64,8 +64,8 @@
         </selectKey>
         -->
         INSERT INTO student_course_homework
-        (id_,user_id_,course_schedule_id_,course_homework_id_,attachments_,score_,create_time_,update_time_,remark_,status_,is_replied_,is_view_)
-        VALUES(#{id},#{userId},#{courseScheduleId},#{courseHomeworkId},#{attachments},#{score},now(),now(),#{remark},#{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{isReplied,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{isView,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler})
+        (user_id_,course_schedule_id_,course_homework_id_,attachments_,score_,create_time_,update_time_,remark_,status_,is_replied_,is_view_)
+        VALUES(#{userId},#{courseScheduleId},#{courseHomeworkId},#{attachments},#{score},now(),now(),#{remark},#{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{isReplied,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{isView,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler})
     </insert>
 
     <insert id="batchInsertStudentCourseHomeworkRecord" parameterType="java.util.List" useGeneratedKeys="true"

+ 4 - 0
mec-biz/src/main/resources/config/mybatis/SysTenantAccountMapper.xml

@@ -17,6 +17,10 @@
 	<select id="get" resultMap="SysTenantAccount">
 		SELECT * FROM sys_tenant_account WHERE user_id_ = #{uesrId}
 	</select>
+	
+	<select id="getLocked" resultMap="SysTenantAccount">
+		SELECT * FROM sys_tenant_account WHERE user_id_ = #{uesrId} for update
+	</select>
 
 	<!-- 全查询 -->
 	<select id="findAll" resultMap="SysTenantAccount">

+ 3 - 2
mec-biz/src/main/resources/config/mybatis/TeacherMapper.xml

@@ -52,14 +52,15 @@
         <result column="email_" property="email"/>
         <result column="im_token_" property="imToken"/>
         <result column="subject_name_" property="splitSubjectName"/>
+        <result column="id_card_no_" property="idCardNo"/>
     </resultMap>
 
     <!-- 根据主键查询一条记录 -->
     <select id="get" resultMap="Teacher">
         SELECT t.id_,t.organ_id_ teacher_organ_id_,t.job_type_,t.job_nature_,t.is_probation_period_,t.education_background_,t.graduate_school_,t.graduate_school_,
         t.technical_titles_,t.work_unit_,t.subject_id_,t.entry_date_,t.certificate_type_,t.certificate_num_,t.flow_organ_range_,t.update_time_,
-        t.create_time_,t.introduction_,t.demission_date_,t.is_support_course_schedule_rewards_rules_,t.is_support_extra_practice_lesson_,t.lecture_num_,
-        su.real_name_,su.password_,su.salt_,su.phone_,su.avatar_,
+        t.create_time_,t.introduction_,t.demission_date_,t.is_support_course_schedule_rewards_rules_,t.is_support_extra_practice_lesson_,t.lecture_num_,t.idcard_front_img_,t.idcard_back_img_,t.idcard_hand_img_,
+        su.real_name_,su.id_card_no_,su.password_,su.salt_,su.phone_,su.avatar_,
         su.lock_flag_,su.del_flag_,su.wx_openid_,su.qq_openid_,su.user_type_,
         su.gender_,su.nation_,su.birthdate_,su.email_,su.im_token_,su.username_,su.organ_id_
         FROM teacher t

+ 14 - 3
mec-biz/src/main/resources/config/mybatis/TenantEntryActivitiesMapper.xml

@@ -9,6 +9,8 @@
 		<result column="name_" property="name" />
 		<result column="cover_img_" property="coverImg" />
 		<result column="detail_" property="detail" />
+		<result column="suitable_user_" property="suitableUser" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler" />
+		<result column="tag_" property="tag" />
 		<result column="total_price_" property="totalPrice" />
 		<result column="discount_price_" property="discountPrice" />
 		<result column="purchase_minutes_" property="purchaseMinutes" />
@@ -24,11 +26,14 @@
 	<sql id="queryCondition">
 		<where>
 			<if test="startDate != null">
-				and (start_date_ &gt;= #{startDate} and end_date_ &lt;= #{startDate})
+				and (start_date_ &lt;= #{startDate} and end_date_ &gt;= #{startDate})
 			</if>
 			<if test="delFlag != null">
 				and del_flag_ = #{delFlag}
 			</if>
+			<if test="suitableUser != null">
+				and suitable_user_ = #{suitableUser, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+			</if>
 		</where>
 	</sql>
 
@@ -49,8 +54,8 @@
 		<!-- <selectKey resultClass="int" keyProperty="id" > SELECT SEQ_WSDEFINITION_ID.nextval 
 			AS ID FROM DUAL </selectKey> -->
 		INSERT INTO tenant_entry_activities
-		(id_,name_,cover_img_,detail_,total_price_,discount_price_,purchase_minutes_,give_minutes_,start_date_,end_date_,condition_,del_flag_,create_time_,update_time_)
-		VALUES(#{id},#{name},#{coverImg},#{detail},#{totalPrice},#{discountPrice},#{purchaseMinutes},#{giveMinutes},#{startDate},#{endDate},#{condition},#{delFlag},#{createTime},#{updateTime})
+		(id_,name_,cover_img_,detail_,suitable_user_,tag_,total_price_,discount_price_,purchase_minutes_,give_minutes_,start_date_,end_date_,condition_,del_flag_,create_time_,update_time_)
+		VALUES(#{id},#{name},#{coverImg},#{detail},#{suitableUser, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{tag},#{totalPrice},#{discountPrice},#{purchaseMinutes},#{giveMinutes},#{startDate},#{endDate},#{condition},#{delFlag},#{createTime},#{updateTime})
 	</insert>
 
 	<!-- 根据主键查询一条记录 -->
@@ -72,6 +77,12 @@
 			<if test="id != null">
 				id_ = #{id},
 			</if>
+			<if test="suitableUser != null">
+				suitable_user_ = #{suitableUser, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+			</if>
+			<if test="tag != null">
+				tag_ = #{tag},
+			</if>
 			<if test="purchaseMinutes != null">
 				purchase_minutes_ = #{purchaseMinutes},
 			</if>

+ 158 - 0
mec-biz/src/main/resources/config/mybatis/TenantPaymentOrderMapper.xml

@@ -0,0 +1,158 @@
+<?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.ym.mec.biz.dal.dao.TenantPaymentOrderDao">
+
+	<resultMap type="com.ym.mec.biz.dal.entity.TenantPaymentOrder"
+		id="TenantPaymentOrder">
+		<result column="id_" property="id" />
+		<result column="activities_id_" property="activitiesId" />
+		<result column="user_id_" property="userId" />
+		<result column="organ_id_" property="organId" />
+		<result column="type_" property="type" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler" />
+		<result column="expect_amount_" property="expectAmount" />
+		<result column="actual_amount_" property="actualAmount" />
+		<result column="balance_payment_amount_" property="balancePaymentAmount" />
+		<result column="com_amount_" property="comAmount" />
+		<result column="per_amount_" property="perAmount" />
+		<result column="remit_fee_" property="remitFee" />
+		<result column="trans_no_" property="transNo" />
+		<result column="status_" property="status" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler" />
+		<result column="memo_" property="memo" />
+		<result column="payment_channel_" property="paymentChannel" />
+		<result column="payment_business_channel_" property="paymentBusinessChannel" />
+		<result column="mer_nos_" property="merNos" />
+		<result column="order_no_" property="orderNo" />
+		<result column="pay_time_" property="payTime" />
+		<result column="version_" property="version" />
+		<result column="create_time_" property="createTime" />
+		<result column="update_time_" property="updateTime" />
+	</resultMap>
+
+	<!-- 根据主键查询一条记录 -->
+	<select id="get" resultMap="TenantPaymentOrder">
+		SELECT * FROM tenant_payment_order WHERE id_ = #{id}
+	</select>
+
+	<!-- 全查询 -->
+	<select id="findAll" resultMap="TenantPaymentOrder">
+		SELECT * FROM tenant_payment_order ORDER BY id_
+	</select>
+
+	<!-- 向数据库增加一条记录 -->
+	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.TenantPaymentOrder"
+		useGeneratedKeys="true" keyColumn="id" keyProperty="id">
+		<!-- <selectKey resultClass="int" keyProperty="id" > SELECT SEQ_WSDEFINITION_ID.nextval 
+			AS ID FROM DUAL </selectKey> -->
+		INSERT INTO tenant_payment_order
+		(id_,activities_id_,user_id_,organ_id_,type_,expect_amount_,actual_amount_,balance_payment_amount_,com_amount_,per_amount_,remit_fee_,trans_no_,status_,memo_,payment_channel_,payment_business_channel_,mer_nos_,order_no_,pay_time_,version_,create_time_,update_time_)
+		VALUES(#{id},#{activitiesId},#{userId},#{organId},#{type, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{expectAmount},#{actualAmount},#{balancePaymentAmount},#{comAmount},#{perAmount},#{remitFee},#{transNo},#{status, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{memo},#{paymentChannel},#{paymentBusinessChannel},#{merNos},#{orderNo},#{payTime},#{version},#{createTime},#{updateTime})
+	</insert>
+
+	<!-- 根据主键查询一条记录 -->
+	<update id="update" parameterType="com.ym.mec.biz.dal.entity.TenantPaymentOrder">
+		UPDATE tenant_payment_order
+		<set>
+			<if test="status != null">
+				status_ = #{status, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+			</if>
+			<if test="organId != null">
+				organ_id_ = #{organId},
+			</if>
+			<if test="activitiesId != null">
+				activities_id_ = #{activitiesId},
+			</if>
+			<if test="comAmount != null">
+				com_amount_ = #{comAmount},
+			</if>
+			<if test="orderNo != null">
+				order_no_ = #{orderNo},
+			</if>
+			<if test="id != null">
+				id_ = #{id},
+			</if>
+			<if test="perAmount != null">
+				per_amount_ = #{perAmount},
+			</if>
+			<if test="expectAmount != null">
+				expect_amount_ = #{expectAmount},
+			</if>
+			<if test="balancePaymentAmount != null">
+				balance_payment_amount_ = #{balancePaymentAmount},
+			</if>
+			<if test="version != null">
+				version_ = #{version},
+			</if>
+			<if test="memo != null">
+				memo_ = #{memo},
+			</if>
+			<if test="paymentChannel != null">
+				payment_channel_ = #{paymentChannel},
+			</if>
+			<if test="remitFee != null">
+				remit_fee_ = #{remitFee},
+			</if>
+			<if test="createTime != null">
+				create_time_ = #{createTime},
+			</if>
+			<if test="userId != null">
+				user_id_ = #{userId},
+			</if>
+			<if test="paymentBusinessChannel != null">
+				payment_business_channel_ = #{paymentBusinessChannel},
+			</if>
+			<if test="updateTime != null">
+				update_time_ = #{updateTime},
+			</if>
+			<if test="transNo != null">
+				trans_no_ = #{transNo},
+			</if>
+			<if test="actualAmount != null">
+				actual_amount_ = #{actualAmount},
+			</if>
+			<if test="type != null">
+				type_ = #{type, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+			</if>
+			<if test="merNos != null">
+				mer_nos_ = #{merNos},
+			</if>
+			<if test="payTime != null">
+				pay_time_ = #{payTime},
+			</if>
+		</set>
+		WHERE id_ = #{id}
+	</update>
+
+	<!-- 根据主键删除一条记录 -->
+	<delete id="delete">
+		DELETE FROM tenant_payment_order WHERE id_ = #{id}
+	</delete>
+
+	<!-- 分页查询 -->
+	<select id="queryPage" resultMap="TenantPaymentOrder"
+		parameterType="map">
+		SELECT * FROM tenant_payment_order ORDER BY id_
+		<include refid="global.limit" />
+	</select>
+
+	<!-- 查询当前表的总记录数 -->
+	<select id="queryCount" resultType="int">
+		SELECT COUNT(*) FROM tenant_payment_order
+	</select>
+	
+	<select id="queryByUserId" resultMap="TenantPaymentOrder">
+		SELECT * FROM tenant_payment_order where user_id_ = #{userId} ORDER BY id_
+	</select>
+
+    <!-- 根据订单号查询订单 -->
+    <select id="findOrderByOrderNo" resultMap="TenantPaymentOrder">
+        SELECT * FROM tenant_payment_order WHERE order_no_ = #{orderNo}
+    </select>
+
+    <select id="findOrdersByStatus" resultMap="TenantPaymentOrder">
+        SELECT * FROM tenant_payment_order
+        WHERE status_ = #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+          AND payment_channel_ = #{paymentChannel}
+        LIMIT 100
+    </select>
+</mapper>

+ 9 - 2
mec-teacher/src/main/java/com/ym/mec/teacher/config/ResourceServerConfig.java

@@ -24,8 +24,15 @@ public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
 
 	@Override
 	public void configure(HttpSecurity http) throws Exception {
-		http.csrf().disable().exceptionHandling().accessDeniedHandler(baseAccessDeniedHandler).authenticationEntryPoint(baseAuthenticationEntryPoint).and()
-				.authorizeRequests().antMatchers("/v2/api-docs","/code/*","/teacher/queryStudentApply","/teacher/querySubByMusicGroupId","/studentRegistration/updateSubject","/studyReport/createEvaluate").permitAll().anyRequest().authenticated().and().httpBasic();
+		http.csrf()
+				.disable()
+				.exceptionHandling()
+				.accessDeniedHandler(baseAccessDeniedHandler)
+				.authenticationEntryPoint(baseAuthenticationEntryPoint)
+				.and()
+				.authorizeRequests()
+				.antMatchers("/v2/api-docs", "/code/*", "/teacher/queryStudentApply", "/teacher/querySubByMusicGroupId", "/studentRegistration/updateSubject",
+						"/studyReport/createEvaluate", "/teacherOrder/*","/courseReview/batchAdd").permitAll().anyRequest().authenticated().and().httpBasic();
 	}
 
 	@Override

+ 24 - 2
mec-teacher/src/main/java/com/ym/mec/teacher/controller/CourseGroupController.java

@@ -6,10 +6,13 @@ import com.ym.mec.biz.dal.dao.TeacherDao;
 import com.ym.mec.biz.dal.dto.CourseGroupCreateDto;
 import com.ym.mec.biz.dal.entity.Teacher;
 import com.ym.mec.biz.dal.enums.GroupType;
+import com.ym.mec.biz.dal.page.GroupCourseScheduleQueryInfo;
 import com.ym.mec.biz.service.CoursesGroupService;
 import com.ym.mec.biz.service.GroupClassService;
+import com.ym.mec.biz.service.GroupCourseScheduleService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.page.QueryInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -35,6 +38,8 @@ public class CourseGroupController extends BaseController {
     private GroupClassService groupClassService;
     @Autowired
     private TeacherDao teacherDao;
+    @Autowired
+    private GroupCourseScheduleService groupCourseScheduleService;
 
     @ApiOperation(value = "创建课程组")
     @PostMapping("/createCourseGroup")
@@ -55,12 +60,29 @@ public class CourseGroupController extends BaseController {
 
     @ApiOperation(value = "获取课程组列表")
     @GetMapping("/findTeacherCourseGroups")
-    public HttpResponseResult findTeacherCourseGroups(){
+    public HttpResponseResult findTeacherCourseGroups(QueryInfo queryInfo){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if(Objects.isNull(sysUser)){
+            return failed(HttpStatus.FORBIDDEN,"请登录");
+        }
+        return succeed(coursesGroupService.findTeacherCourseGroups(sysUser.getId(),queryInfo));
+    }
+
+    @ApiOperation(value = "获取课程对应班级头部信息")
+    @GetMapping("/getGroupHeadInfo")
+    public HttpResponseResult getGroupHeadInfo(Long courseScheduleId){
+        return succeed(courseScheduleId);
+    }
+
+    @ApiOperation(value = "获取课程组下指定教师的课表")
+    @GetMapping("/findGroupCourses")
+    public HttpResponseResult findGroupCourses(GroupCourseScheduleQueryInfo queryInfo){
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if(Objects.isNull(sysUser)){
             return failed(HttpStatus.FORBIDDEN,"请登录");
         }
-        return succeed(coursesGroupService.findTeacherCourseGroups(sysUser.getId()));
+        queryInfo.setTeacherId(sysUser.getId());
+        return succeed(groupCourseScheduleService.findGroupCourses(queryInfo));
     }
 
     @ApiOperation(value = "关闭课程组")

+ 25 - 4
mec-teacher/src/main/java/com/ym/mec/teacher/controller/CourseReviewController.java

@@ -11,11 +11,9 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
+import java.util.List;
 import java.util.Objects;
 
 @RequestMapping("courseReview")
@@ -70,4 +68,27 @@ public class CourseReviewController extends BaseController {
     public HttpResponseResult updateReviewInfo(CourseScheduleReview courseScheduleReview) {
         return succeed(courseReviewService.updateReview(courseScheduleReview));
     }
+
+    @ApiOperation(value = "获取班级结束课程评价情况")
+    @GetMapping("getClassOverCourse")
+    public HttpResponseResult getClassOverCourse(Long classGroupId) {
+        return succeed(courseReviewService.getClassOverCourse(classGroupId));
+    }
+
+    @ApiOperation(value = "获取老师评价和学生评价")
+    @GetMapping("getStuAndTeaReview")
+    public HttpResponseResult getStuAndTeaReview(Long courseId) {
+        return succeed(courseReviewService.getStuAndTeaReview(courseId));
+    }
+
+    @ApiOperation(value = "批量添加评价")
+    @PostMapping("batchAdd")
+    public HttpResponseResult batchAdd(@RequestBody List<CourseScheduleReview> courseScheduleReviews) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (Objects.isNull(sysUser)) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        return succeed(courseReviewService.batchAdd(sysUser.getId(),courseScheduleReviews));
+    }
+
 }

+ 1 - 0
mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherController.java

@@ -137,6 +137,7 @@ public class TeacherController extends BaseController {
     }
 
 	@ApiOperation(value = "实名认证")
+    @PostMapping("/realNameAuthentication")
 	@ApiImplicitParams({ @ApiImplicitParam(name = "realName", value = "姓名", required = true, dataType = "String"),
 			@ApiImplicitParam(name = "idcardNo", value = "身份证号码", required = true, dataType = "String"),
 			@ApiImplicitParam(name = "idcardFrontImg", value = "身份证正面", required = true, dataType = "String"),

+ 172 - 0
mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherOrderController.java

@@ -0,0 +1,172 @@
+package com.ym.mec.teacher.controller;
+
+import io.swagger.annotations.Api;
+
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletResponse;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.alibaba.fastjson.JSON;
+import com.ym.mec.biz.dal.dao.SysConfigDao;
+import com.ym.mec.biz.dal.dao.TenantPaymentOrderDao;
+import com.ym.mec.biz.dal.entity.TenantPaymentOrder;
+import com.ym.mec.biz.dal.enums.DealStatusEnum;
+import com.ym.mec.biz.service.TenantPaymentOrderService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.thirdparty.adapay.NotifyEvent;
+import com.ym.mec.thirdparty.yqpay.Msg;
+import com.ym.mec.thirdparty.yqpay.YqPayFeignService;
+
+@RequestMapping("teacherOrder")
+@Api(tags = "订单回调")
+@RestController
+@EnableScheduling
+public class TeacherOrderController extends BaseController {
+	private static final Logger logger = LoggerFactory.getLogger(TeacherOrderController.class);
+	@Autowired
+	private YqPayFeignService yqPayFeignService;
+	@Autowired
+	private TenantPaymentOrderDao tenantPaymentOrderDao;
+	@Autowired
+	private SysConfigDao sysConfigDao;
+	@Autowired
+	private TenantPaymentOrderService tenantPaymentOrderService;
+
+	@PostMapping("/notify")
+	public Msg notify(@ModelAttribute Msg msg) throws Exception {
+		logger.info(msg.toString());
+		Map<String, Object> rqMap = new LinkedHashMap<String, Object>();
+		rqMap.put("code", msg.getCode());
+		rqMap.put("msg", msg.getMsg());
+		rqMap.put("responseType", msg.getResponseType());
+		rqMap.put("responseParameters", msg.getResponseParameters());
+		rqMap.put("sign", msg.getSign());
+		// boolean rs = YqPayUtil.verify(rqMap);
+		msg.setMsg("fail");
+		Map<String, String> notifyMap = new HashMap<>();
+		// if (rs) {
+		notifyMap = JSON.parseObject(msg.getResponseParameters(), Map.class);
+		// }
+		// 支付中订单存在,更新状态
+		if (msg.getResponseType().equals("1") && notifyMap.size() > 0) {
+			String tradeState = msg.getCode().equals("88") ? "1" : "0";
+			String channelType = notifyMap.get("channelType").equals("1") ? "WXPay" : (notifyMap.get("channelType").equals("2") ? "Alipay" : "quickPay");
+			notifyMap.put("tradeState", tradeState);
+			notifyMap.put("totalMoney", notifyMap.get("payAmount"));
+			notifyMap.put("merOrderNo", notifyMap.get("merMerOrderNo"));
+			notifyMap.put("channelType", channelType);
+
+			DealStatusEnum status = tradeState.equals("1") ? DealStatusEnum.SUCCESS : DealStatusEnum.FAILED;
+			TenantPaymentOrder order = tenantPaymentOrderDao.findOrderByOrderNo(notifyMap.get("merMerOrderNo"));
+			if (order == null || !order.getStatus().equals(DealStatusEnum.ING)) {
+				return msg;
+			}
+
+			if (status.equals(DealStatusEnum.SUCCESS)) {
+				order.setPayTime(new Date());
+			} else {
+				order.setMemo(notifyMap.get("remarks"));
+			}
+			order.setStatus(status);
+			order.setTransNo(notifyMap.get("orderNo"));
+			order.setPaymentBusinessChannel(channelType);
+			order.setActualAmount(new BigDecimal(notifyMap.get("payAmount")));
+			tenantPaymentOrderService.paymentForCallback(order);
+			msg.setCode("000000");
+			msg.setMsg("success");
+		}
+		return msg;
+	}
+
+	@PostMapping("/adaNotify")
+	public void adaNotify(@ModelAttribute NotifyEvent notifyEvent) throws Exception {
+		logger.info(notifyEvent.toString());
+		if (notifyEvent.getType().equals("payment.success") && notifyEvent.getType().equals("payment.failed")) {
+			return;
+		}
+
+		Map<String, String> notifyMap = JSON.parseObject(notifyEvent.getData(), Map.class);
+
+		// 支付中订单存在,更新状态
+		if (notifyMap.size() > 0) {
+			String tradeState = notifyEvent.getType().equals("payment.success") ? "1" : "0";
+			notifyMap.put("tradeState", tradeState);
+			notifyMap.put("totalMoney", notifyMap.get("pay_amt"));
+			notifyMap.put("merOrderNo", notifyMap.get("order_no"));
+			notifyMap.put("merOrderNo", notifyMap.get("order_no"));
+			notifyMap.put("remarks", notifyMap.get("description"));
+
+			DealStatusEnum status = tradeState.equals("1") ? DealStatusEnum.SUCCESS : DealStatusEnum.FAILED;
+			TenantPaymentOrder order = tenantPaymentOrderDao.findOrderByOrderNo(notifyMap.get("merMerOrderNo"));
+			if (order == null || !order.getStatus().equals(DealStatusEnum.ING)) {
+				return;
+			}
+
+			if (status.equals(DealStatusEnum.SUCCESS)) {
+				order.setPayTime(new Date());
+			} else {
+				order.setMemo(notifyMap.get("remarks"));
+			}
+			order.setStatus(status);
+			order.setTransNo(notifyMap.get("orderNo"));
+			order.setPaymentBusinessChannel(notifyMap.get("channelType"));
+			order.setActualAmount(new BigDecimal(notifyMap.get("payAmount")));
+			tenantPaymentOrderService.paymentForCallback(order);
+		}
+	}
+
+	@GetMapping("/setSuccessStatus")
+	public void setSuccessStatus() throws Exception {
+		List<TenantPaymentOrder> payingOrders = tenantPaymentOrderDao.findOrdersByStatus(DealStatusEnum.ING, "YQPAY");
+
+		String[] statusArr = { "0", "1", "7" };
+		for (TenantPaymentOrder payingOrder : payingOrders) {
+			Map<String, String> rpMap = new HashMap<>();
+			rpMap.put("tradeState", "1");
+			rpMap.put("remarks", "模拟支付成功");
+			rpMap.put("merOrderNo", payingOrder.getOrderNo());
+			rpMap.put("orderNo", payingOrder.getOrderNo());
+			rpMap.put("channelType", "1");
+
+			String channelType = rpMap.get("channelType").equals("1") ? "WXPay" : (rpMap.get("channelType").equals("2") ? "Alipay" : "quickPay");
+			rpMap.put("channelType", channelType);
+			if (Arrays.asList(statusArr).contains(rpMap.get("tradeState"))) {
+				try {
+					tenantPaymentOrderService.paymentForCallback(payingOrder); // 更新订单
+				} catch (Exception e) {
+					e.printStackTrace();
+					continue;
+				}
+			}
+		}
+
+	}
+
+	@RequestMapping("paymentResult")
+	public void paymentResult(HttpServletResponse response, String orderNo) {
+		try {
+			String baseApiUrl = sysConfigDao.findConfigValue("base_api_url");
+			response.sendRedirect(baseApiUrl + "/#/paymentresult?orderNo=" + orderNo);
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+
+}

+ 40 - 0
mec-teacher/src/main/java/com/ym/mec/teacher/controller/TenantPaymentOrderController.java

@@ -0,0 +1,40 @@
+package com.ym.mec.teacher.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+import java.util.Objects;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.service.TenantPaymentOrderService;
+import com.ym.mec.common.controller.BaseController;
+
+@Api(tags = "租户订单服务")
+@RequestMapping("tenantPaymentOrder")
+@RestController
+public class TenantPaymentOrderController extends BaseController {
+
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+    
+    @Autowired
+    private TenantPaymentOrderService tenantPaymentOrderService;
+
+    @ApiOperation(value = "下单")
+    @PostMapping("/createOrder")
+    public Object createOrder(Integer activitiesId){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if(Objects.isNull(sysUser)){
+            return failed(HttpStatus.FORBIDDEN,"请登录");
+        }
+        return succeed(tenantPaymentOrderService.createOrder(sysUser.getId(), activitiesId));
+    }
+
+}

+ 26 - 18
mec-web/src/main/java/com/ym/mec/web/controller/TaskController.java

@@ -31,7 +31,7 @@ public class TaskController extends BaseController {
 
 	@Autowired
 	private StudentCourseHomeworkService studentCourseHomeworkService;
-	
+
 	@Autowired
 	private CourseHomeworkService courseHomeworkService;
 
@@ -39,6 +39,9 @@ public class TaskController extends BaseController {
 	private StudentPaymentOrderService studentPaymentOrderService;
 
 	@Autowired
+	private TenantPaymentOrderService tenantPaymentOrderService;
+
+	@Autowired
 	private TeacherCourseStatisticsService teacherCourseStatisticsService;
 
 	@Autowired
@@ -107,7 +110,7 @@ public class TaskController extends BaseController {
 	@GetMapping("/studentCoursesScheduleRemind")
 	// 学生有课提醒
 	public void studentCoursesScheduleRemind() {
-		//courseScheduleService.studentCoursesScheduleRemind();
+		// courseScheduleService.studentCoursesScheduleRemind();
 	}
 
 	@GetMapping("/studentSignInRemind")
@@ -131,7 +134,7 @@ public class TaskController extends BaseController {
 	@GetMapping("/teacherSignInRemind")
 	// 老师上课提醒
 	public void teacherSignInRemind() {
-		//courseScheduleService.teacherSignInRemind();
+		// courseScheduleService.teacherSignInRemind();
 	}
 
 	@GetMapping("/homeworkNoReplyRemind")
@@ -140,45 +143,50 @@ public class TaskController extends BaseController {
 		courseHomeworkService.homeworkNoReplyRemind();
 	}
 
-	//查询订单状态
+	// 查询订单状态
 	@GetMapping("/queryOrderStatus")
-	public void  queryOrderStatus() throws Exception {
-		studentPaymentOrderService.queryOrderStatus();
+	public void queryOrderStatus() throws Exception {
+		try {
+			studentPaymentOrderService.queryOrderStatus();
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		tenantPaymentOrderService.queryOrderStatusFromRemote();
 	}
 
-	//统计老师课酬
+	// 统计老师课酬
 	@GetMapping("/teacherCourseStatistic")
-	public void  teacherCourseStatisticsService() throws Exception {
+	public void teacherCourseStatisticsService() throws Exception {
 		teacherCourseStatisticsService.teacherCourseStatistic();
 	}
 
-	//更新历史陪练课至已结束
+	// 更新历史陪练课至已结束
 	@GetMapping("/updateHistoryPracticeGroupStatus")
-	public void updateHistoryPracticeGroupStatus(){
+	public void updateHistoryPracticeGroupStatus() {
 		practiceGroupService.updateHistoryPracticeGroupStatus();
 	}
 
-	//练习报告定时推送
+	// 练习报告定时推送
 	@GetMapping("/pushStudyReport")
-	public void pushStudyReport(){
+	public void pushStudyReport() {
 		practiceGroupService.pushStudyReport(null, "JIGUANG");
 	}
 
-	//新增待填写月报定时推送(推送老师)
+	// 新增待填写月报定时推送(推送老师)
 	@GetMapping("/pushNeedPostReport")
-	public void pushNeedPostReport(){
+	public void pushNeedPostReport() {
 		courseScheduleEvaluateService.pushNeedPostReport();
 	}
 
-	//定时预生成待提交月报
+	// 定时预生成待提交月报
 	@GetMapping("/createEvaluate")
-	public void createEvaluate(){
+	public void createEvaluate() {
 		courseScheduleEvaluateService.createEvaluate(new Date());
 	}
 
-	//新增待填写评论定时推送(推送老师)
+	// 新增待填写评论定时推送(推送老师)
 	@GetMapping("/pushNeedReview2Teacher")
-	public void pushNeedReview2Teacher(){
+	public void pushNeedReview2Teacher() {
 		courseReviewService.pushNeedReview2Teacher();
 	}