Browse Source

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

yonge 5 years ago
parent
commit
0756ea85c3
29 changed files with 430 additions and 116 deletions
  1. 18 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentRegistrationDao.java
  2. 9 7
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TeacherAttendanceDao.java
  3. 6 6
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicGroupClassGroupDto.java
  4. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherClassCourseSchudeleDto.java
  5. 16 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TeacherAttendance.java
  6. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleTeacherSalaryService.java
  7. 10 7
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java
  8. 4 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupTeacherMapperServiceImpl.java
  9. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  10. 14 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java
  11. 6 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/DemoGroupServiceImpl.java
  12. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  13. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRechargeServiceImpl.java
  14. 14 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java
  15. 11 12
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherAttendanceServiceImpl.java
  16. 27 21
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java
  17. 3 0
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  18. 8 0
      mec-biz/src/main/resources/config/mybatis/StudentRegistrationMapper.xml
  19. 20 0
      mec-biz/src/main/resources/config/mybatis/TeacherAttendanceMapper.xml
  20. 9 3
      mec-im/src/main/java/com/ym/controller/ConversationController.java
  21. 2 0
      mec-im/src/main/java/com/ym/service/GroupService.java
  22. 9 1
      mec-im/src/main/java/com/ym/service/Impl/GroupServiceImpl.java
  23. 1 1
      mec-im/src/main/java/com/ym/service/Impl/RoomServiceImpl.java
  24. 4 4
      mec-student/src/main/java/com/ym/mec/student/controller/CourseController.java
  25. 9 1
      mec-student/src/main/java/com/ym/mec/student/controller/MusicGroupController.java
  26. 95 5
      mec-student/src/main/java/com/ym/mec/student/controller/StudentOrderController.java
  27. 8 1
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherManageController.java
  28. 56 0
      mec-thirdparty/src/main/java/com/ym/mec/thirdparty/adapay/NotifyEvent.java
  29. 46 39
      mec-thirdparty/src/main/java/com/ym/mec/thirdparty/adapay/Pay.java

+ 18 - 3
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentRegistrationDao.java

@@ -3,6 +3,7 @@ package com.ym.mec.biz.dal.dao;
 import java.util.List;
 import java.util.Map;
 
+import com.ym.mec.biz.dal.entity.MusicGroup;
 import org.apache.ibatis.annotations.Param;
 
 import com.ym.mec.auth.api.entity.SysUser;
@@ -64,7 +65,7 @@ public interface StudentRegistrationDao extends BaseDAO<Long, StudentRegistratio
      * @param musicGroupId
      * @return
      */
-     List<MusicGroupSubjectPlan> getNoClassStuCountByMusicGroupId(@Param("musicGroupId") String musicGroupId);
+    List<MusicGroupSubjectPlan> getNoClassStuCountByMusicGroupId(@Param("musicGroupId") String musicGroupId);
 
     /**
      * 根据乐团id和user_id 更新
@@ -186,12 +187,14 @@ public interface StudentRegistrationDao extends BaseDAO<Long, StudentRegistratio
 
     /**
      * 乐团添加学员
+     *
      * @param studentRegistration
      */
     void insertBasic(StudentRegistration studentRegistration);
 
     /**
      * 获取乐团已缴费学员列表
+     *
      * @param musicGroupId
      * @return
      */
@@ -199,6 +202,7 @@ public interface StudentRegistrationDao extends BaseDAO<Long, StudentRegistratio
 
     /**
      * 统计乐团不同声部报名人数
+     *
      * @param musicGroupId
      * @return
      */
@@ -206,21 +210,32 @@ public interface StudentRegistrationDao extends BaseDAO<Long, StudentRegistratio
 
     /**
      * 根据家长手机号获取用户编号
+     *
      * @param parentPhones
      * @return
      */
     List<Map<Integer, String>> findParentId(String parentPhones);
-    
+
     /**
      * 查询学生数
+     *
      * @return
      */
-    Map<String,Integer> queryStudentNum(@Param("organId") Integer organId);
+    Map<String, Integer> queryStudentNum(@Param("organId") Integer organId);
 
     /**
      * 根据乐团编号获取当前乐团所有已报名学员
+     *
      * @param musicGroupId
      * @return
      */
     List<Map<Integer, String>> findMapByMusicGroupId(String musicGroupId);
+
+    /**
+     * 乐团开启缴费
+     * @param musicGroupId
+     * @param paymentStatus
+     * @return
+     */
+    int musicGroupOpenPay(@Param("musicGroupId") String musicGroupId, @Param("paymentStatus") PaymentStatusEnum paymentStatus);
 }

+ 9 - 7
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TeacherAttendanceDao.java

@@ -1,17 +1,15 @@
 package com.ym.mec.biz.dal.dao;
 
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-
-import com.ym.mec.biz.dal.entity.StudentAttendance;
-import org.apache.ibatis.annotations.Param;
-
 import com.ym.mec.biz.dal.dto.Mapper;
 import com.ym.mec.biz.dal.dto.TeacherAbnormalAttendanceInfoDto;
 import com.ym.mec.biz.dal.dto.TeacherPersonalAttendanceDto;
 import com.ym.mec.biz.dal.entity.TeacherAttendance;
 import com.ym.mec.common.dal.BaseDAO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
 
 public interface TeacherAttendanceDao extends BaseDAO<Long, TeacherAttendance> {
 
@@ -22,6 +20,10 @@ public interface TeacherAttendanceDao extends BaseDAO<Long, TeacherAttendance> {
      */
     List<TeacherPersonalAttendanceDto> getTeacherPersonalAttendances(Map<String,Object> params);
 
+    int batchInsert(@Param("teacherAttendances") List<TeacherAttendance> teacherAttendances);
+
+    int batchDeleteByCourseSchedules(@Param("courseScheduleIds") List<Long> courseScheduleIds);
+
     /**
      * 教师个人签到记录统计
      * @param params

+ 6 - 6
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicGroupClassGroupDto.java

@@ -29,10 +29,10 @@ public class MusicGroupClassGroupDto {
     private Integer currentClassTimes;
 
     @ApiModelProperty(value = "跟班人数", required = true)
-    private String studyNum;
+    private Integer studyNum;
 
     @ApiModelProperty(value = "退班人数", required = true)
-    private String quitNum;
+    private Integer quitNum;
 
     public Integer getClassGroupId() {
         return classGroupId;
@@ -82,19 +82,19 @@ public class MusicGroupClassGroupDto {
         this.currentClassTimes = currentClassTimes;
     }
 
-    public String getStudyNum() {
+    public Integer getStudyNum() {
         return studyNum;
     }
 
-    public void setStudyNum(String studyNum) {
+    public void setStudyNum(Integer studyNum) {
         this.studyNum = studyNum;
     }
 
-    public String getQuitNum() {
+    public Integer getQuitNum() {
         return quitNum;
     }
 
-    public void setQuitNum(String quitNum) {
+    public void setQuitNum(Integer quitNum) {
         this.quitNum = quitNum;
     }
 }

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherClassCourseSchudeleDto.java

@@ -2,6 +2,7 @@ package com.ym.mec.biz.dal.dto;
 
 import com.ym.mec.biz.dal.entity.CourseSchedule;
 import com.ym.mec.biz.dal.enums.CourseStatusEnum;
+import com.ym.mec.biz.dal.enums.TeachModeEnum;
 import io.swagger.annotations.ApiModelProperty;
 
 import java.util.Date;
@@ -57,6 +58,15 @@ public class TeacherClassCourseSchudeleDto {
     @ApiModelProperty(value = "上课学生名称")
     private String studentNames;
 
+    private TeachModeEnum teachMode;
+
+    public TeachModeEnum getTeachMode() {
+        return teachMode;
+    }
+
+    public void setTeachMode(TeachModeEnum teachMode) {
+        this.teachMode = teachMode;
+    }
 
     public String getStudentNames() {
         return studentNames;

+ 16 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TeacherAttendance.java

@@ -46,6 +46,9 @@ public class TeacherAttendance {
 
 	@ApiModelProperty(value = "签退时间")
 	private Date signOutTime;
+
+	@ApiModelProperty(value = "当前课次")
+	private Integer currentClassTimes;
 	
 	/** 备注 */
 	@ApiModelProperty(value = "备注",required = false)
@@ -65,6 +68,19 @@ public class TeacherAttendance {
 		this.createTime = createTime;
 	}
 
+	public TeacherAttendance(Integer teacherId, Long courseScheduleId) {
+		this.teacherId = teacherId;
+		this.courseScheduleId = courseScheduleId;
+	}
+
+	public Integer getCurrentClassTimes() {
+		return currentClassTimes;
+	}
+
+	public void setCurrentClassTimes(Integer currentClassTimes) {
+		this.currentClassTimes = currentClassTimes;
+	}
+
 	public YesOrNoEnum getSignInStatus() {
 		return signInStatus;
 	}

+ 9 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleTeacherSalaryService.java

@@ -26,6 +26,15 @@ public interface CourseScheduleTeacherSalaryService extends BaseService<Long, Co
                                              BigDecimal offlineTeacherSalary);
 
     /**
+     * @describe 批量插入教师课程课酬记录
+     * @author Joburgess
+     * @date 2019/11/7
+     * @param courseScheduleTeacherSalaries:
+     * @return void
+     */
+    void batchInsert(List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries);
+
+    /**
      * @Author: Joburgess
      * @Date: 2019/10/15
      * @params []

+ 10 - 7
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java

@@ -1,6 +1,7 @@
 package com.ym.mec.biz.service.impl;
 
 import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.*;
@@ -84,6 +85,8 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     @Autowired
     private CourseScheduleTeacherSalaryDao courseScheduleTeacherSalaryDao;
     @Autowired
+    private CourseScheduleTeacherSalaryService courseScheduleTeacherSalaryService;
+    @Autowired
     private StudentRegistrationService studentRegistrationService;
     @Autowired
     private ImFeignService imFeignService;
@@ -1013,7 +1016,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             now = now.plusDays(1);
         }
         //老师结算表
-        courseScheduleTeacherSalaryDao.batchInsert(courseScheduleTeacherSalaryList);
+        courseScheduleTeacherSalaryService.batchInsert(courseScheduleTeacherSalaryList);
 
         //加入合奏班
         ClassGroupRelation classGroupRelation = new ClassGroupRelation();
@@ -1226,7 +1229,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             }
         }
         //老师结算表
-        courseScheduleTeacherSalaryDao.batchInsert(courseScheduleTeacherSalaryList);
+        courseScheduleTeacherSalaryService.batchInsert(courseScheduleTeacherSalaryList);
 
         //加入合奏班
         ClassGroupRelation classGroupRelation = new ClassGroupRelation();
@@ -1437,7 +1440,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         classGroupRelationService.insert(classGroupRelation);
 
         //老师结算表
-        courseScheduleTeacherSalaryDao.batchInsert(courseScheduleTeacherSalaryList);
+        courseScheduleTeacherSalaryService.batchInsert(courseScheduleTeacherSalaryList);
 
         //学生结算表
         courseScheduleStudentPaymentDao.batchInsert(courseScheduleStudentPaymentList);
@@ -1458,13 +1461,13 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             Set<Integer> classGroups = dataList.stream().map(e -> e.getClassGroupId()).collect(Collectors.toSet());
             String join = StringUtils.join(classGroups, ",");
             //获取主教老师
-            Map<Integer, String> masterTeachers = MapUtil.convertMybatisMap(classGroupDao.countStudentNum(join, "BISHOP"));
+            Map<Integer, String> masterTeachers = JSONObject.parseObject(JSONObject.toJSONString(MapUtil.convertMybatisMap(classGroupDao.countStudentNum(join, "BISHOP"))),HashMap.class);
             //获取助教老师
-            Map<Integer, String> subTeachers = MapUtil.convertMybatisMap(classGroupDao.countStudentNum(join, "TEACHING"));
+            Map<Integer, String> subTeachers = JSONObject.parseObject(JSONObject.toJSONString(MapUtil.convertMybatisMap(classGroupDao.countStudentNum(join, "TEACHING"))),HashMap.class);
             //获取在读人数
-            Map<Integer, String> studyNums = MapUtil.convertMybatisMap(classGroupDao.countStudyNum(join));
+            Map<Integer, Integer> studyNums = JSONObject.parseObject(JSONObject.toJSONString(MapUtil.convertMybatisMap(classGroupDao.countStudyNum(join))),HashMap.class);
             //获取退班人数
-            Map<Integer, String> quitNums = MapUtil.convertMybatisMap(classGroupDao.countQuitNum(join));
+            Map<Integer, Integer> quitNums = JSONObject.parseObject(JSONObject.toJSONString(MapUtil.convertMybatisMap(classGroupDao.countQuitNum(join))),HashMap.class);
             dataList.forEach(e -> {
                 e.setMasterTeacher(masterTeachers.get(e.getClassGroupId()));
                 e.setSubTeacher(subTeachers.get(e.getClassGroupId()));

+ 4 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupTeacherMapperServiceImpl.java

@@ -37,6 +37,8 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
     @Autowired
     private CourseScheduleTeacherSalaryDao courseScheduleTeacherSalaryDao;
     @Autowired
+    private CourseScheduleTeacherSalaryService courseScheduleTeacherSalaryService;
+    @Autowired
     private TeacherDefaultMusicGroupSalaryDao teacherDefaultMusicGroupSalaryDao;
     @Autowired
     private SysConfigDao sysConfigDao;
@@ -158,7 +160,7 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
                 courseScheduleTeacherSalaryList.add(courseScheduleTeacherSalary);
             }
         }
-        courseScheduleTeacherSalaryDao.batchInsert(courseScheduleTeacherSalaryList);
+        courseScheduleTeacherSalaryService.batchInsert(courseScheduleTeacherSalaryList);
         return true;
     }
 
@@ -241,7 +243,7 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
                         teacherDefaultMusicGroupSalaryWithTeacherId));
             });
         });
-        courseScheduleTeacherSalaryDao.batchInsert(courseScheduleTeacherSalaryList);
+        courseScheduleTeacherSalaryService.batchInsert(courseScheduleTeacherSalaryList);
     }
 
     /**

+ 3 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java

@@ -64,6 +64,8 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 	@Autowired
 	private CourseScheduleStudentPaymentDao courseScheduleStudentPaymentDao;
 	@Autowired
+	private TeacherAttendanceDao teacherAttendanceDao;
+	@Autowired
 	private ClassGroupService classGroupService;
 	@Autowired
 	private ClassGroupDao classGroupDao;
@@ -108,6 +110,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 		courseScheduleDao.batchDeleteCourseSchedules(courseScheduleIds);
 		courseScheduleTeacherSalaryDao.batchDeleteByCourseScheduleIds(courseScheduleIds);
 		courseScheduleStudentPaymentDao.deleteByCourseSchedule(courseScheduleIds);
+		teacherAttendanceDao.batchDeleteByCourseSchedules(courseScheduleIds);
 	}
 
 	@Override

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

@@ -45,6 +45,8 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
     private SysUserCashAccountDetailDao sysUserCashAccountDetailDao;
     @Autowired
     private SysConfigService sysConfigDao;
+    @Autowired
+    private TeacherAttendanceDao teacherAttendanceDao;
 
     private static final Logger LOGGER = LoggerFactory
             .getLogger(CourseScheduleTeacherSalaryServiceImpl.class);
@@ -114,12 +116,23 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
             }
         }
         if(courseScheduleTeacherSalaries.size()>0){
-            courseScheduleTeacherSalaryDao.batchInsert(courseScheduleTeacherSalaries);
+            batchInsert(courseScheduleTeacherSalaries);
         }
     }
 
     @Override
     @Transactional(rollbackFor = Exception.class)
+    public void batchInsert(List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries) {
+        courseScheduleTeacherSalaryDao.batchInsert(courseScheduleTeacherSalaries);
+        List<TeacherAttendance> teacherAttendances=new ArrayList<>();
+        courseScheduleTeacherSalaries.forEach(courseScheduleTeacherSalary -> {
+            teacherAttendances.add(new TeacherAttendance(courseScheduleTeacherSalary.getUserId(),courseScheduleTeacherSalary.getCourseScheduleId()));
+        });
+        teacherAttendanceDao.batchInsert(teacherAttendances);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
     public void teacherSalarySettlement() {
 
         int days = Integer.parseInt(sysConfigDao.findByParamName(SysConfigService.VIP_SETTLEMENT_CYCLE).getParanValue());

+ 6 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/DemoGroupServiceImpl.java

@@ -12,6 +12,7 @@ import com.ym.mec.biz.dal.enums.TeachTypeEnum;
 import com.ym.mec.biz.dal.enums.YesOrNoEnum;
 import com.ym.mec.biz.dal.page.StudentDemoGroupQueryInfo;
 import com.ym.mec.biz.dal.page.TeacherManageDemoGroupQueryInfo;
+import com.ym.mec.biz.service.CourseScheduleService;
 import com.ym.mec.biz.service.DemoGroupService;
 import com.ym.mec.biz.service.SysConfigService;
 import com.ym.mec.common.dal.BaseDAO;
@@ -46,6 +47,8 @@ public class DemoGroupServiceImpl extends BaseServiceImpl<Long, DemoGroup>  impl
 	@Autowired
 	private CourseScheduleDao courseScheduleDao;
 	@Autowired
+	private CourseScheduleService courseScheduleService;
+	@Autowired
 	private ClassGroupStudentMapperDao classGroupStudentMapperDao;
 
 	@Autowired
@@ -219,6 +222,9 @@ public class DemoGroupServiceImpl extends BaseServiceImpl<Long, DemoGroup>  impl
 		className.append("-");
 		className.append(CourseSchedule.CourseScheduleType.DEMO.getMsg());
 		courseScheduleByDemoGroup.setName(className.toString());
+		List<CourseSchedule> courseSchedules=new ArrayList<>();
+		courseSchedules.add(courseScheduleByDemoGroup);
+		courseScheduleService.checkNewCourseSchedules(courseSchedules);
 		courseScheduleDao.insert(courseScheduleByDemoGroup);
 
 		CourseScheduleStudentPayment courseScheduleStudentPayment = new CourseScheduleStudentPayment();

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

@@ -977,7 +977,8 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         musicGroup.setApplyExpireDate(DateUtil.toDate(expireDate));
         musicGroup.setStatus(MusicGroupStatusEnum.PAY);
         musicGroupDao.update(musicGroup);
-        //乐团成立后(开始缴费)
+        //所有人开启缴费
+        studentRegistrationDao.musicGroupOpenPay(musicGroupId,PaymentStatusEnum.OPEN);
         //获取所有已报名学员列表
         HashMap<Integer,String> map = JSONObject.parseObject(JSONObject.toJSONString(MapUtil.convertMybatisMap(studentRegistrationDao.findMapByMusicGroupId(musicGroupId))), HashMap.class);
         if(map != null && map.size() > 0){

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

@@ -120,7 +120,7 @@ public class StudentRechargeServiceImpl extends BaseServiceImpl<String, StudentR
 
 				if ("WXPay".equals(paymentChannel)) {
 					transType = TransTypeEnum.WECHAT;
-				} else if ("Alipay 2.0".equals(paymentChannel)) {
+				} else if ("Alipay".equals(paymentChannel)) {
 					transType = TransTypeEnum.ALIPAY;
 				}
 

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

@@ -510,6 +510,19 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
             studentRegistration.setMusicGroupStatus(ClassGroupStudentStatusEnum.NORMAL);
             studentRegistrationDao.update(studentRegistration);
 
+            //获取当前月
+            Integer month = Integer.parseInt(DateUtil.getMonth(nowDate));
+            //获取下次缴费月份
+            List<MusicGroupPaymentCalender> musicGroupPaymentCalenders = musicGroupPaymentCalenderDao.findByMusicGroupId(studentRegistration.getMusicGroupId());
+            List<Integer> months = musicGroupPaymentCalenders.stream().map(e -> e.getPaymentMonth()).collect(Collectors.toList());
+            for (int i = 0; i < months.size(); i++) {
+                if (months.get(i).equals(month)) {
+                    month = i == months.size() - 1 ? months.get(0) : months.get(i + 1);
+                }
+            }
+            Calendar calendar = Calendar.getInstance();
+            calendar.add(Calendar.MONTH, month);
+
             //加入缴费周期
             MusicGroupStudentFee musicGroupStudentFee = new MusicGroupStudentFee();
             musicGroupStudentFee.setMusicGroupId(studentRegistration.getMusicGroupId());
@@ -517,6 +530,7 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
             musicGroupStudentFee.setCourseFee(musicOneSubjectClassPlan.getFee());
             musicGroupStudentFee.setCreateTime(nowDate);
             musicGroupStudentFee.setUpdateTime(nowDate);
+            musicGroupStudentFee.setNextPaymentDate(DateUtil.getFirstDayOfMonth(calendar.getTime()));
             musicGroupStudentFee.setLatestPaidTime(nowDate);
             musicGroupStudentFee.setSubjectId(studentRegistration.getActualSubjectId());
             musicGroupStudentFee.setPaymentStatus(MusicGroupStudentFee.PaymentStatus.PAID_COMPLETED);

+ 11 - 12
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherAttendanceServiceImpl.java

@@ -174,13 +174,13 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 
 		if(Objects.isNull(teacherAttendance)){
 			teacherAttendance=new TeacherAttendance();
-			teacherAttendance.setTeacherId(userId);
-			teacherAttendance.setClassGroupId(classGroup.getId());
-			teacherAttendance.setMusicGroupId(classGroup.getMusicGroupId());
 			teacherAttendance.setCourseScheduleId(courseScheduleId.longValue());
 		}else{
 			isAttendance=true;
 		}
+		teacherAttendance.setTeacherId(userId);
+		teacherAttendance.setClassGroupId(classGroup.getId());
+		teacherAttendance.setMusicGroupId(classGroup.getMusicGroupId());
 
 		int timeGap = DateUtil.minutesBetween(now, courseSchedule.getStartClassTime());
 
@@ -192,24 +192,23 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 
 		switch (signStatus){
 			case SIGN_IN:
-				teacherAttendance.setSignInTime(now);
-				if(yesOrNoEnum.equals(YesOrNoEnum.YES)||advanceSignInMinutes<=timeGap&&timeGap<=60){
-					teacherAttendance.setSignInStatus(YesOrNoEnum.YES);
-				}else{
-					teacherAttendance.setSignInStatus(YesOrNoEnum.NO);
+				if (courseSchedule.getEndClassTime().after(now)){
+					teacherAttendance.setSignInTime(now);
+					if(yesOrNoEnum.equals(YesOrNoEnum.YES)||advanceSignInMinutes<=timeGap&&timeGap<=60){
+						teacherAttendance.setSignInStatus(YesOrNoEnum.YES);
+					}else{
+						teacherAttendance.setSignInStatus(YesOrNoEnum.NO);
+					}
 				}
 				int currentClassTimes = teacherAttendanceDao.countClassTime(classGroup.getId().longValue());
 				classGroup.setCurrentClassTimes(currentClassTimes);
-				if(updateCourseScheduleStatus){
+				if(updateCourseScheduleStatus&&courseSchedule.getStatus().equals(CourseStatusEnum.NOT_START)){
 					courseScheduleDao.updateCourscheduleStatus(courseScheduleId,CourseStatusEnum.UNDERWAY.getCode());
 				}
 				break;
 			case SIGN_OUT:
 				teacherAttendance.setSignOutTime(now);
 				teacherAttendance.setSignOutStatus(YesOrNoEnum.YES);
-				if(updateCourseScheduleStatus){
-					courseScheduleDao.updateCourscheduleStatus(courseScheduleId,CourseStatusEnum.OVER.getCode());
-				}
 				break;
 			default:
 

+ 27 - 21
mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java

@@ -96,6 +96,8 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 	private VipGroupDefaultClassesCycleDao vipGroupDefaultClassesCycleDao;
 	@Autowired
 	private TeacherDao teacherDao;
+	@Autowired
+	private TeacherAttendanceDao teacherAttendanceDao;
 
 	@Override
 	public BaseDAO<Long, VipGroup> getDAO() {
@@ -221,20 +223,6 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 		vipGroupClassGroupMapper.setClassGroupId(classGroup.getId());
 		vipGroupClassGroupMapperDao.insert(vipGroupClassGroupMapper);
 
-		//不需要审核
-		if(vipGroupApplyBaseInfoDto.getAuditStatus() == AuditStatusEnum.PASS){
-			//创建融云班级群
-			ImGroupMember[] imGroupMembers = { new ImGroupMember(vipGroup.getVipGroupApplyBaseInfo().getUserId().toString())};
-			// 创建群组
-			imFeignService.groupCreate(new ImGroupModel(classGroup.getId().toString(), imGroupMembers, classGroup.getName()));
-
-			//发送推送短信
-			Map<Integer,String> map = new HashMap<>(1);
-			map.put(sysUser.getId(),sysUser.getPhone());
-			sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.YIMEI,MessageTypeEnum.TEACHER_SMS_VIP_COURSE_ADD,
-					map,null,0,"",vipGroupApplyBaseInfoDto.getName());
-		}
-
 		//创建班级老师关联记录
 		ClassGroupTeacherMapper classGroupTeacherMapper=new ClassGroupTeacherMapper();
 		classGroupTeacherMapper.setMusicGroupId(vipGroupApplyBaseInfoDto.getId().toString());
@@ -271,7 +259,20 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 				vipGroup.getCourseSchedules(),
 				vipGroupApplyBaseInfoDto.getOnlineTeacherSalary(),
 				vipGroupApplyBaseInfoDto.getOfflineTeacherSalary());
-		//
+
+		//不需要审核
+		if(vipGroupApplyBaseInfoDto.getAuditStatus() == AuditStatusEnum.PASS){
+			//创建融云班级群
+			ImGroupMember[] imGroupMembers = { new ImGroupMember(vipGroup.getVipGroupApplyBaseInfo().getUserId().toString())};
+			// 创建群组
+			imFeignService.groupCreate(new ImGroupModel(classGroup.getId().toString(), imGroupMembers, classGroup.getName()));
+
+			//发送推送短信
+			Map<Integer,String> map = new HashMap<>(1);
+			map.put(sysUser.getId(),sysUser.getPhone());
+			sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.YIMEI,MessageTypeEnum.TEACHER_SMS_VIP_COURSE_ADD,
+					map,null,0,"",vipGroupApplyBaseInfoDto.getName());
+		}
 	}
 
 	@Override
@@ -634,15 +635,17 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 			switch (vipGroupSalarySettlementDto.getOnlineSalarySettlement().getSalarySettlementType()){
 				case TEACHER_DEFAULT:
 					if(vipGroup instanceof VipGroupApplyBaseInfoDto&&!useDefaultTeacherSalary
-							&&vipGroupActivity.getSalaryReadonlyFlag().equals("1")){
+							&&vipGroupActivity.getSalaryReadonlyFlag().equals("0")){
 						teacherOnlineSalary=((VipGroupApplyBaseInfoDto) vipGroup).getOnlineTeacherSalary();
 					}
 
 					if(Objects.isNull(teacherOnlineSalary)){
 						if(Objects.isNull(teacherDefaultVipGroupSalary)||Objects.isNull(teacherDefaultVipGroupSalary.getOnlineClassesSalary())){
-							throw new BizException("请设置教师课酬");
+//							throw new BizException("请设置教师课酬");
+							teacherOnlineSalary=new BigDecimal(0);
+						}else{
+							teacherOnlineSalary=teacherDefaultVipGroupSalary.getOnlineClassesSalary();
 						}
-						teacherOnlineSalary=teacherDefaultVipGroupSalary.getOnlineClassesSalary();
 						teacherOnlineSalary=teacherOnlineSalary.multiply(classTimeDuty);
 					}
 					results.put("onlineTeacherSalary",teacherOnlineSalary);
@@ -663,14 +666,16 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 			switch (vipGroupSalarySettlementDto.getOfflineSalarySettlement().getSalarySettlementType()){
 				case TEACHER_DEFAULT:
 					if(vipGroup instanceof VipGroupApplyBaseInfoDto&&!useDefaultTeacherSalary
-							&&vipGroupActivity.getSalaryReadonlyFlag().equals("1")){
+							&&vipGroupActivity.getSalaryReadonlyFlag().equals("0")){
 						teacherOfflineSalary=((VipGroupApplyBaseInfoDto) vipGroup).getOfflineTeacherSalary();
 					}
 					if(Objects.isNull(teacherOfflineSalary)||Objects.isNull(Objects.isNull(teacherDefaultVipGroupSalary))){
 						if(Objects.isNull(teacherDefaultVipGroupSalary)){
-							throw new BizException("请设置教师课酬");
+//							throw new BizException("请设置教师课酬");
+							teacherOfflineSalary=new BigDecimal(0);
+						}else{
+							teacherOfflineSalary=teacherDefaultVipGroupSalary.getOfflineClassesSalary();
 						}
-						teacherOfflineSalary=teacherDefaultVipGroupSalary.getOfflineClassesSalary();
 						teacherOfflineSalary=teacherOfflineSalary.multiply(classTimeDuty);
 					}
 					results.put("offlineTeacherSalary",teacherOfflineSalary);
@@ -1113,6 +1118,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 		courseScheduleDao.batchDeleteCourseSchedules(courseScheduleIds);
 		courseScheduleTeacherSalaryDao.batchDeleteByCourseScheduleIds(courseScheduleIds);
 		courseScheduleStudentPaymentDao.deleteByCourseSchedule(courseScheduleIds);
+		teacherAttendanceDao.batchDeleteByCourseSchedules(courseScheduleIds);
 		//vip课停止通知
 		Teacher teacher = teacherDao.get(vipGroup.getUserId());
 		Map<Integer,String> map = new HashMap<>(1);

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

@@ -887,6 +887,7 @@
         <result property="currentClassTimes" column="current_class_times_"/>
         <result property="totalClassTimes" column="total_class_times_"/>
         <result property="studentNames" column="student_names_"/>
+        <result column="teach_mode_" property="teachMode" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
     </resultMap>
 
     <sql id="teacherClassCourseScheduleQueryCondition">
@@ -913,6 +914,7 @@
             cs.type_,
             cs.status_,
             cs.actual_teacher_id_,
+            cs.teach_mode_,
             su.username_,
             cg.total_class_times_
         FROM
@@ -938,6 +940,7 @@
             cs.type_,
             cs.status_,
             cs.actual_teacher_id_,
+            cs.teach_mode_,
             su.username_,
             cg.total_class_times_,
             GROUP_CONCAT(IF(sa.status_='NORMAL',ssu.username_,NULL)) student_names_,

+ 8 - 0
mec-biz/src/main/resources/config/mybatis/StudentRegistrationMapper.xml

@@ -453,6 +453,14 @@
         update_time_ = now()
         WHERE FIND_IN_SET(id_,#{ids}) AND payment_status_ = '0'
     </update>
+
+    <!-- 乐团批量开启缴费 -->
+    <update id="musicGroupOpenPay">
+        UPDATE student_registration
+        SET payment_status_ = #{paymentStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+        update_time_ = now()
+        WHERE music_group_id_ = #{musicGroupId} AND payment_status_ = '0'
+    </update>
     
     <select id="queryStudentNum" resultType="map">
         SELECT count(sr.id_) total_num_,sum(case when sr.create_time_ >= timestamp(date_add(curdate(), interval - day(curdate()) + 1 day)) then 1 else 0 end) new_num_,sum(case when sr.music_group_status_ = 'QUIT' and sr.update_time_ >= timestamp(date_add(curdate(), interval - day(curdate()) + 1 day)) then 1 else 0 end) quit_num_ FROM student_registration sr left join music_group mg on sr.music_group_id_ = mg.id_

+ 20 - 0
mec-biz/src/main/resources/config/mybatis/TeacherAttendanceMapper.xml

@@ -48,6 +48,16 @@
         VALUES(#{id},#{teacherId},#{musicGroupId},#{classGroupId},#{courseScheduleId},#{signInTime},#{signInStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{remark},now(),#{signOutTime},#{signOutStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler})
     </insert>
 
+    <insert id="batchInsert" parameterType="com.ym.mec.biz.dal.entity.TeacherAttendance" useGeneratedKeys="true"
+            keyColumn="id" keyProperty="id">
+        INSERT INTO teacher_attendance
+        (teacher_id_,music_group_id_,class_group_id_,course_schedule_id_,sign_in_time_,sign_in_status_,remark_,create_time_,sign_out_time_,sign_out_status_)
+        VALUE
+        <foreach collection="teacherAttendances" item="teacherAttendance" separator=",">
+            (#{teacherAttendance.teacherId},#{teacherAttendance.musicGroupId},#{teacherAttendance.classGroupId},#{teacherAttendance.courseScheduleId},#{teacherAttendance.signInTime},#{teacherAttendance.signInStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{teacherAttendance.remark},now(),#{teacherAttendance.signOutTime},#{teacherAttendance.signOutStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler})
+        </foreach>
+    </insert>
+
     <!-- 根据主键查询一条记录 -->
     <update id="update" parameterType="com.ym.mec.biz.dal.entity.TeacherAttendance">
         UPDATE teacher_attendance
@@ -79,6 +89,9 @@
             <if test="signOutStatus != null">
                 sign_out_status_ = #{signOutStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
             </if>
+            <if test="currentClassTimes != null">
+                current_class_times_ = #{currentClassTimes},
+            </if>
         </set>
         WHERE id_ = #{id}
     </update>
@@ -88,6 +101,13 @@
 		DELETE FROM teacher_attendance WHERE id_ = #{id} 
 	</delete>
 
+    <delete id="batchDeleteByCourseSchedules">
+        DELETE FROM teacher_attendance WHERE id_ IN
+        <foreach collection="courseScheduleIds" item="courseScheduleId" open="(" close=")" separator=",">
+            #{courseScheduleId}
+        </foreach>
+    </delete>
+
     <!-- 分页查询 -->
     <select id="queryPage" resultMap="TeacherAttendance" parameterType="map">
         SELECT * FROM teacher_attendance ORDER BY id_

+ 9 - 3
mec-im/src/main/java/com/ym/controller/ConversationController.java

@@ -1,5 +1,6 @@
 package com.ym.controller;
 
+import com.ym.mec.common.controller.BaseController;
 import com.ym.service.GroupService;
 import io.rong.models.conversation.ConversationModel;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -13,18 +14,23 @@ import org.springframework.web.bind.annotation.RestController;
  */
 @RestController
 @RequestMapping("/conversation")
-public class ConversationController{
+public class ConversationController extends BaseController {
 
     @Autowired
     GroupService groupService;
 
     @RequestMapping(value = "/mute", method = RequestMethod.POST)
     public Object mute(@RequestBody ConversationModel conversationModel) throws Exception {
-        return groupService.conversationMute(conversationModel);
+        return succeed(groupService.conversationMute(conversationModel));
     }
 
     @RequestMapping(value = "/unmute", method = RequestMethod.POST)
     public Object unmute(@RequestBody ConversationModel conversationModel) throws Exception {
-        return groupService.conversationUnmute(conversationModel);
+        return succeed(groupService.conversationUnmute(conversationModel));
+    }
+
+    @RequestMapping(value = "/get", method = RequestMethod.POST)
+    public Object get(@RequestBody ConversationModel conversationModel) throws Exception {
+        return succeed(groupService.conversationGet(conversationModel));
     }
 }

+ 2 - 0
mec-im/src/main/java/com/ym/service/GroupService.java

@@ -52,4 +52,6 @@ public interface GroupService {
     Result conversationMute(ConversationModel conversationModel) throws Exception;
 
     Result conversationUnmute(ConversationModel conversationModel) throws Exception;
+
+    Result conversationGet(ConversationModel conversationModel) throws Exception;
 }

+ 9 - 1
mec-im/src/main/java/com/ym/service/Impl/GroupServiceImpl.java

@@ -41,7 +41,10 @@ public class GroupServiceImpl implements GroupService {
         return new User(appKey,appSecret,rongCloud);
     }
     private Conversation getConversation(){
-        return new Conversation(appKey,appSecret);
+        RongCloud rongCloud = RongCloud.getInstance(appKey, appSecret);
+        Conversation conversation = new Conversation(appKey, appSecret);
+        conversation.setRongCloud(rongCloud);
+        return conversation;
     }
 
     @Override
@@ -133,4 +136,9 @@ public class GroupServiceImpl implements GroupService {
     public Result conversationUnmute(ConversationModel conversationModel) throws Exception {
         return getConversation().unMute(conversationModel);
     }
+
+    @Override
+    public Result conversationGet(ConversationModel conversationModel) throws Exception {
+        return getConversation().get(conversationModel);
+    }
 }

+ 1 - 1
mec-im/src/main/java/com/ym/service/Impl/RoomServiceImpl.java

@@ -82,7 +82,7 @@ public class RoomServiceImpl implements RoomService {
     @Autowired
     private SysUserFeignService sysUserFeignService;
 
-    @Transactional
+    @Transactional(rollbackFor = Exception.class)
     @Override
     public RoomResult joinRoom(String userName, String roomId, boolean isAudience, boolean isDisableCamera) throws ApiException, Exception {
         CheckUtils.checkArgument(userName != null, "userName must't be null");

+ 4 - 4
mec-student/src/main/java/com/ym/mec/student/controller/CourseController.java

@@ -46,12 +46,12 @@ public class CourseController extends BaseController {
     }
 
     @ApiOperation(value = "根据群编号,获取群组基本信息")
-    @GetMapping("/findGroupById")
-    public Object findGroupById(String groupId){
-        if(StringUtils.isEmpty(groupId)){
+    @GetMapping("/course/findGroupById")
+    public Object findGroupById(Integer groupId){
+        if(null == groupId){
             return failed("参数校验错误");
         }
-        return succeed(classGroupService.get(Integer.parseInt(groupId.substring(2))));
+        return succeed(classGroupService.get(groupId));
     }
 
     @ApiOperation(value = "分页获取学员购买记录")

+ 9 - 1
mec-student/src/main/java/com/ym/mec/student/controller/MusicGroupController.java

@@ -289,6 +289,14 @@ public class MusicGroupController extends BaseController {
         if (registerPayDto.getGoodsGroupIds() != null && !registerPayDto.getGoodsGroupIds().equals("")) {
             goodsGroups = musicGroupSubjectGoodsGroupService.findGoodsGroupByIds(registerPayDto.getGoodsGroupIds());
             for (MusicGroupSubjectGoodsGroup goodsGroup : goodsGroups) {
+                if (goodsGroup.getType().equals(GoodsType.INSTRUMENT) && musicOneSubjectClassPlan.getKitGroupPurchaseType().equals(KitGroupPurchaseTypeEnum.LEASE)) {
+                    orderAmount = orderAmount.add(musicOneSubjectClassPlan.getDepositFee());
+                    continue;
+                }
+                if (goodsGroup.getType().equals(GoodsType.INSTRUMENT) && musicOneSubjectClassPlan.getKitGroupPurchaseType().equals(KitGroupPurchaseTypeEnum.FREE)) {
+                    continue;
+                }
+
                 orderAmount = orderAmount.add(goodsGroup.getPrice());
                 //团购乐器减免课程费用
                 if (goodsGroup.getType().equals(GoodsType.INSTRUMENT) && goodsGroup.getRemissionCourseFee() != null && musicOneSubjectClassPlan.getKitGroupPurchaseType().equals(KitGroupPurchaseTypeEnum.GROUP)) {//团购
@@ -320,7 +328,7 @@ public class MusicGroupController extends BaseController {
 
         String orderNo = idGeneratorService.generatorId("payment") + "";
 
-        Map payMap = payService.getPayMap(orderAmount, orderNo, "http://47.99.212.176:8000/studentOrder/notify", "http://dev.dayaedu.com", "测试订单", "测试订单");
+        Map payMap = payService.getPayMap(orderAmount, orderNo, "http://mstudev.dayaedu.com/api-student/studentOrder/notify", "http://dev.dayaedu.com", "测试订单", "测试订单");
 
         studentRegistrationService.reAddOrder(userId, amount, orderNo, (String) payMap.get("type"), courseFee, goodsGroups, goodsList, otherGoodsList, studentRegistration.getMusicGroupId(), ApplyOrder);
 

+ 95 - 5
mec-student/src/main/java/com/ym/mec/student/controller/StudentOrderController.java

@@ -11,12 +11,16 @@ import com.ym.mec.biz.service.StudentPaymentOrderService;
 import com.ym.mec.biz.service.StudentRegistrationService;
 import com.ym.mec.biz.service.VipGroupService;
 import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.thirdparty.adapay.NotifyEvent;
 import com.ym.mec.thirdparty.adapay.Pay;
 import com.ym.mec.thirdparty.yqpay.Msg;
 import com.ym.mec.thirdparty.yqpay.YqPayUtil;
 import com.ym.mec.thirdparty.yqpay.YqPayFeignService;
 import com.ym.mec.thirdparty.yqpay.RsqMsg;
+import com.ym.mec.util.http.HttpUtil;
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
@@ -27,8 +31,11 @@ import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.web.bind.annotation.*;
 
 import java.math.BigDecimal;
+import java.net.URLEncoder;
 import java.util.*;
 
+import static com.netflix.config.DeploymentContext.ContextKey.appId;
+
 @RequestMapping("studentOrder")
 @Api(tags = "订单回调")
 @RestController
@@ -106,10 +113,12 @@ public class StudentOrderController extends BaseController {
         //支付中订单存在,更新状态
         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"));
-            this.updateOrder(notifyMap);
+            notifyMap.put("channelType", channelType);
+            updateOrder(notifyMap);
             msg.setCode("000000");
             msg.setMsg("success");
         }
@@ -132,13 +141,39 @@ public class StudentOrderController extends BaseController {
 
     @ApiOperation(value = "台牌支付")
     @PostMapping("/executePayment")
-    public Object executePayment(BigDecimal amount, String orderNo, String notifyUrl, String returnUrl, String orderSubject, String orderBody, String payChannel, String sign) throws Exception {
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "amount", value = "支付金额", required = true, dataType = "BigDecimal"),
+            @ApiImplicitParam(name = "orderNo", value = "订单号", required = true, dataType = "String"),
+            @ApiImplicitParam(name = "payChannel", value = "支付方式(alipay-支付宝app支付)", required = true, dataType = "String"),
+    })
+    public Object executePayment(BigDecimal amount, String orderNo, String payChannel, String notifyUrl, String returnUrl, String orderSubject, String orderBody, String sign, String code) throws Exception {
+        String appId = "wxcf8e8b33a9477845";
+        String appSecret = "1286452b9c68b13325dece7cdf892645";
+        String wxMpOAuth2AccessTokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code";
         payChannel = PayChannelEnum.ALIPAY_QR.getCode();
 //        if (!new Pay().verifySign(amount, orderNo, notifyUrl, orderSubject, orderBody,sign)) {
 //            return failed("签名验证失败");
 //        }
-        Payment payment = new Pay().executePayment(amount, orderNo, payChannel, orderSubject, orderBody);
+
+        String openid = "";
+        if (payChannel == "wx_pub") {
+            if (code == null || code.isEmpty()) {
+                return failed("微信支付请先授权");
+            }
+            wxMpOAuth2AccessTokenUrl = String.format(wxMpOAuth2AccessTokenUrl, appId, appSecret, code);
+            Map<String, String> weChatRes = JSON.parseObject(HttpUtil.get(wxMpOAuth2AccessTokenUrl, new HashMap<>()), Map.class);
+            if (!weChatRes.containsKey("openid")) {
+                return failed("授权失败,请重新授权");
+            }
+            openid = weChatRes.get("openid");
+        }
+
         StudentPaymentOrder order = studentPaymentOrderService.findOrderByOrderNo(orderNo);
+        if (order == null) {
+            return failed("订单不存在");
+        }
+
+        Payment payment = new Pay().executePayment(amount, orderNo, payChannel, orderSubject, orderBody, code);
         order.setTransNo(payment.getId());
         studentPaymentOrderService.update(order);
 
@@ -180,6 +215,9 @@ public class StudentOrderController extends BaseController {
             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 (Arrays.asList(statusArr).contains(rpMap.get("tradeState"))) {
                     updateOrder(rpMap); //更新订单
                 }
@@ -216,7 +254,6 @@ public class StudentOrderController extends BaseController {
         }
     }
 
-
     public void closeOrders(List<String> orderNoList) throws Exception {
         if (orderNoList.size() == 0) {
             return;
@@ -241,7 +278,7 @@ public class StudentOrderController extends BaseController {
 
     }
 
-    @Scheduled(cron = "0/5 * * * * ?")
+    // @Scheduled(cron = "0/5 * * * * ?")
     public void adaPayQuery() throws Exception {
         List<StudentPaymentOrder> payingOrders = studentPaymentOrderService.findOrdersByStatus(DealStatusEnum.ING, "ADAPAY");
 
@@ -272,4 +309,57 @@ public class StudentOrderController extends BaseController {
     }
 
 
+    @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"));
+            updateOrder(notifyMap);
+        }
+    }
+
+
+    @GetMapping("/authorize")
+    public String authorize(@RequestParam("returnUrl") String returnUrl) {
+        String appId = "wxcf8e8b33a9477845";
+        String url = URLEncoder.encode("http://wxwechat.utools.club/studentOrder/userInfo");
+
+        String redirectURL = String.format("https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=snsapi_base&state=1&connect_redirect=1#wechat_redirect",
+                appId, url);
+
+        return "redirect:" + redirectURL;
+    }
+
+    @GetMapping("/userInfo")
+    public Object userInfo(@RequestParam("code") String code,
+                           @RequestParam("state") String returnUrl) throws Exception {
+        String appId = "wxcf8e8b33a9477845";
+        String appSecret = "1286452b9c68b13325dece7cdf892645";
+
+        String wxMpOAuth2AccessTokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code";
+
+        wxMpOAuth2AccessTokenUrl = String.format(wxMpOAuth2AccessTokenUrl, appId, appSecret, code);
+
+        Map<String, String> map = JSON.parseObject(HttpUtil.get(wxMpOAuth2AccessTokenUrl, new HashMap<>()), Map.class);
+
+        if (!map.containsKey("openid")) {
+            return failed("授权失败,请重新授权");
+        }
+
+        return map.get("openid");
+
+    }
+
 }

+ 8 - 1
mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherManageController.java

@@ -5,7 +5,6 @@ import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dto.CashAccountDetail;
 import com.ym.mec.biz.dal.entity.SysSuggestion;
 import com.ym.mec.biz.dal.entity.SysUserBankCard;
-import com.ym.mec.biz.dal.page.queryMusicGroupStudentQueryInfo;
 import com.ym.mec.biz.service.*;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.UploadReturnBean;
@@ -68,6 +67,14 @@ public class TeacherManageController extends BaseController {
         return succeed();
     }
 
+    @ApiOperation(value = "根据群编号,获取群组基本信息")
+    @GetMapping("/course/findGroupById")
+    public Object findGroupById(Integer groupId){
+        if(null == groupId){
+            return failed("参数校验错误");
+        }
+        return succeed(classGroupService.get(groupId));
+    }
 
     @ApiOperation(value = "根据群编号,获取群组所有成员基本信息")
     @GetMapping("classGroup/findGroupUsers")

+ 56 - 0
mec-thirdparty/src/main/java/com/ym/mec/thirdparty/adapay/NotifyEvent.java

@@ -0,0 +1,56 @@
+package com.ym.mec.thirdparty.adapay;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+public class NotifyEvent {
+    private String id;
+    private String type;
+    private String created_time;
+    private String prod_mode;
+    private String data;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getCreated_time() {
+        return created_time;
+    }
+
+    public void setCreated_time(String created_time) {
+        this.created_time = created_time;
+    }
+
+    public String getProd_mode() {
+        return prod_mode;
+    }
+
+    public void setProd_mode(String prod_mode) {
+        this.prod_mode = prod_mode;
+    }
+
+    public String getData() {
+        return data;
+    }
+
+    public void setData(String data) {
+        this.data = data;
+    }
+
+    @Override
+    public String toString() {
+        return ToStringBuilder.reflectionToString(this);
+    }
+}

+ 46 - 39
mec-thirdparty/src/main/java/com/ym/mec/thirdparty/adapay/Pay.java

@@ -9,6 +9,7 @@ import com.huifu.adapay.exception.BaseAdaPayException;
 import com.huifu.adapay.model.DeviceInfo;
 import com.huifu.adapay.model.payment.*;
 import com.huifu.adapay.util.AdaPaySign;
+import org.aspectj.apache.bcel.classfile.Module;
 
 import java.math.BigDecimal;
 import java.util.*;
@@ -18,9 +19,11 @@ import java.util.*;
  */
 public class Pay {
     private static final String appId = "app_7d87c043-aae3-4357-9b2c-269349a980d6";
+    private static final String wxAppId = "wxcf8e8b33a9477845";
 
     /**
      * 运行支付类接口
+     *
      * @return paymentId
      * @throws Exception 异常
      */
@@ -32,7 +35,7 @@ public class Pay {
         //公钥
         String pubKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCwN6xgd6Ad8v2hIIsQVnbt8a3JituR8o4Tc3B5WlcFR55bz4OMqrG/356Ur3cPbc2Fe8ArNd/0gZbC9q56Eb16JTkVNA/fye4SXznWxdyBPR7+guuJZHc/VW2fKH2lfZ2P3Tt0QkKZZoawYOGSMdIvO+WqK44updyax0ikK6JlNQIDAQAB";
         //私钥
-        String privateKey= "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAMQhsygJ2pp4nCiDAXiqnZm6AzKSVAh+C0BgGR6QaeXzt0TdSi9VR0OQ7Qqgm92NREB3ofobXvxxT+wImrDNk6R6lnHPMTuJ/bYpm+sx397rPboRAXpV3kalQmbZ3P7oxtEWOQch0zV5B1bgQnTvxcG3REAsdaUjGs9Xvg0iDS2tAgMBAAECgYAqGFmNdF/4234Yq9V7ApOE1Qmupv1mPTdI/9ckWjaAZkilfSFY+2KqO8bEiygo6xMFCyg2t/0xDVjr/gTFgbn4KRPmYucGG+FzTRLH0nVIqnliG5Ekla6a4gwh9syHfstbOpIvJR4DfldicZ5n7MmcrdEwSmMwXrdinFbIS/P1+QJBAOr6NpFtlxVSGzr6haH5FvBWkAsF7BM0CTAUx6UNHb+RCYYQJbk8g3DLp7/vyio5uiusgCc04gehNHX4laqIdl8CQQDVrckvnYy+NLz+K/RfXEJlqayb0WblrZ1upOdoFyUhu4xqK0BswOh61xjZeS+38R8bOpnYRbLf7eoqb7vGpZ9zAkEAobhdsA99yRW+WgQrzsNxry3Ua1HDHaBVpnrWwNjbHYpDxLn+TJPCXvI7XNU7DX63i/FoLhOucNPZGExjLYBH/wJATHNZQAgGiycjV20yicvgla8XasiJIDP119h4Uu21A1Su8G15J2/9vbWn1mddg1pp3rwgvxhw312oInbHoFMxsQJBAJlyDDu6x05MeZ2nMor8gIokxq2c3+cnm4GYWZgboNgq/BknbIbOMBMoe8dJFj+ji3YNTvi1MSTDdSDqJuN/qS0=";
+        String privateKey = "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAMQhsygJ2pp4nCiDAXiqnZm6AzKSVAh+C0BgGR6QaeXzt0TdSi9VR0OQ7Qqgm92NREB3ofobXvxxT+wImrDNk6R6lnHPMTuJ/bYpm+sx397rPboRAXpV3kalQmbZ3P7oxtEWOQch0zV5B1bgQnTvxcG3REAsdaUjGs9Xvg0iDS2tAgMBAAECgYAqGFmNdF/4234Yq9V7ApOE1Qmupv1mPTdI/9ckWjaAZkilfSFY+2KqO8bEiygo6xMFCyg2t/0xDVjr/gTFgbn4KRPmYucGG+FzTRLH0nVIqnliG5Ekla6a4gwh9syHfstbOpIvJR4DfldicZ5n7MmcrdEwSmMwXrdinFbIS/P1+QJBAOr6NpFtlxVSGzr6haH5FvBWkAsF7BM0CTAUx6UNHb+RCYYQJbk8g3DLp7/vyio5uiusgCc04gehNHX4laqIdl8CQQDVrckvnYy+NLz+K/RfXEJlqayb0WblrZ1upOdoFyUhu4xqK0BswOh61xjZeS+38R8bOpnYRbLf7eoqb7vGpZ9zAkEAobhdsA99yRW+WgQrzsNxry3Ua1HDHaBVpnrWwNjbHYpDxLn+TJPCXvI7XNU7DX63i/FoLhOucNPZGExjLYBH/wJATHNZQAgGiycjV20yicvgla8XasiJIDP119h4Uu21A1Su8G15J2/9vbWn1mddg1pp3rwgvxhw312oInbHoFMxsQJBAJlyDDu6x05MeZ2nMor8gIokxq2c3+cnm4GYWZgboNgq/BknbIbOMBMoe8dJFj+ji3YNTvi1MSTDdSDqJuN/qS0=";
 
         //设置AdaPay全局参数,不同环境设置不同的apiKey/pubKey/privateKey
         AdaPay.apiKey = apiKeyLive;
@@ -45,16 +48,16 @@ public class Pay {
         AdaPay.startNotifyListener();
     }
 
-    public static String executePaymentTest() throws Exception{
+    public static String executePaymentTest() throws Exception {
         //test chargeId = "002112019080716223300005091372336111616";
         Pay demo = new Pay();
         //支付接口
-        String orderNo = "jsdk_payment_"+System.currentTimeMillis();
+        String orderNo = "jsdk_payment_" + System.currentTimeMillis();
         String payChannel = PayChannelEnum.ALIPAY_QR.getCode();
         BigDecimal amount = new BigDecimal("0.01");
         String orderSubject = "测试大雅订单";
         String orderBody = "测试大雅订单";
-        Payment payment = demo.executePayment(amount,orderNo,payChannel,orderSubject,orderBody);
+        Payment payment = demo.executePayment(amount, orderNo, payChannel, orderSubject, orderBody,null);
         //支付查询接口
         //demo.queryPayment(payment.getId());
         //关单接口
@@ -67,38 +70,41 @@ public class Pay {
     public Map<String, Object> getPayMap(BigDecimal amount, String orderNo, String notifyUrl, String orderSubject, String orderBody) throws Exception {
 
         Map<String, Object> paymentParams = new HashMap<>(10);
-        paymentParams.put("appId",appId);
+        paymentParams.put("appId", appId);
         paymentParams.put("amount", amount);
         paymentParams.put("orderNo", orderNo);
         paymentParams.put("notifyUrl", notifyUrl);
         paymentParams.put("orderSubject", orderSubject);
         paymentParams.put("orderBody", orderBody);
+        paymentParams.put("wxAppId", wxAppId);
         String originalStr = JSONObject.toJSONString(paymentParams);
 
-        String sign  =  AdaPaySign.sign(originalStr, AdaPay.privateKey);
-        paymentParams.put("sign",sign);
+        String sign = AdaPaySign.sign(originalStr, AdaPay.privateKey);
+        paymentParams.put("sign", sign);
+        paymentParams.put("host", "http://192.168.3.27:8000/api-student/studentOrder/executePayment");
         paymentParams.remove(appId);
-        return  paymentParams;
+        return paymentParams;
     }
 
     public boolean verifySign(BigDecimal amount, String orderNo, String notifyUrl, String orderSubject, String orderBody, String sign) throws Exception {
         Map<String, Object> paymentParams = new HashMap<>(10);
-        paymentParams.put("appId",appId);
+        paymentParams.put("appId", appId);
         paymentParams.put("amount", amount);
         paymentParams.put("orderNo", orderNo);
         paymentParams.put("notifyUrl", notifyUrl);
         paymentParams.put("orderSubject", orderSubject);
         paymentParams.put("orderBody", orderBody);
         String originalStr = JSONObject.toJSONString(paymentParams);
-        return AdaPaySign.verifySign(originalStr,sign, AdaPay.pubKey);
+        return AdaPaySign.verifySign(originalStr, sign, AdaPay.pubKey);
     }
 
     /**
      * 执行一个支付交易
+     *
      * @return 创建的支付对象
      * @throws Exception 异常
      */
-    public static Payment executePayment(BigDecimal amount,String orderNo,String payChannel,String orderSubject,String orderBody) throws Exception {
+    public static Payment executePayment(BigDecimal amount, String orderNo, String payChannel, String orderSubject, String orderBody, String openid) throws Exception {
         System.out.println("=======execute payment begin=======");
         //创建支付对象的参数,全部参数请参考 https://docs.adapay.tech/api/04-trade.html#id3
         Map<String, Object> paymentParams = new HashMap<>(10);
@@ -110,29 +116,28 @@ public class Pay {
         paymentParams.put("goods_title", orderSubject);
         paymentParams.put("goods_desc", orderBody);
 
-        DeviceInfo deviceInfo = new DeviceInfo();
-        deviceInfo.setDeviceType(DeviceTypeEnum.MOBILE.getCode());
-        deviceInfo.setDeviceIp("127.0.0.1");
-        paymentParams.put("device_info", deviceInfo);
-
-        List<GoodsDetail> goodsDetailList = new ArrayList<>();
-        GoodsDetail goodsDetail = new GoodsDetail();
-        goodsDetail.setGoodsId("your goods id");
-        goodsDetail.setGoodsName("your goods name");
-        goodsDetail.setQuantity("1");
-        goodsDetail.setPrice("100.00");
-        goodsDetailList.add(goodsDetail);
-
-        PromotionDetail promotionDetail = new PromotionDetail();
-        promotionDetail.setGoodsDetail(goodsDetailList);
-        promotionDetail.setCostPrice("100.00");
-
-        PaymentExpend expend = new PaymentExpend();
-        expend.setPromotionDetail(promotionDetail);
-        expend.setBuyerId("2088012928900274");
-        expend.setBuyerLogonId("");
-
-        paymentParams.put("expend", expend);
+//        DeviceInfo deviceInfo = new DeviceInfo();
+//        deviceInfo.setDeviceType(DeviceTypeEnum.MOBILE.getCode());
+//        deviceInfo.setDeviceIp("127.0.0.1");
+//        paymentParams.put("device_info", deviceInfo);
+
+//        List<GoodsDetail> goodsDetailList = new ArrayList<>();
+//        GoodsDetail goodsDetail = new GoodsDetail();
+//        goodsDetail.setGoodsId("your goods id");
+//        goodsDetail.setGoodsName("your goods name");
+//        goodsDetail.setQuantity("1");
+//        goodsDetail.setPrice("100.00");
+//        goodsDetailList.add(goodsDetail);
+//
+//        PromotionDetail promotionDetail = new PromotionDetail();
+//        promotionDetail.setGoodsDetail(goodsDetailList);
+//        promotionDetail.setCostPrice("100.00");
+
+        if (openid != null && !openid.isEmpty()) {
+            PaymentExpend expend = new PaymentExpend();
+            expend.setOpenId(openid);
+            paymentParams.put("expend", expend);
+        }
 
         //调用sdk方法,创建支付,得到支付对象
         Payment payment = null;
@@ -141,17 +146,18 @@ public class Pay {
         } catch (BaseAdaPayException e) {
             e.printStackTrace();
         }
-        System.out.println("payment result="+JSON.toJSONString(payment));
+        System.out.println("payment result=" + JSON.toJSONString(payment));
         return payment;
     }
 
     /**
      * 关闭一个支付交易
+     *
      * @param paymentId 要关闭的支付id
      * @return 关闭的支付对象
      * @throws Exception 异常
      */
-    public Payment closePayment(String paymentId) throws Exception{
+    public Payment closePayment(String paymentId) throws Exception {
         System.out.println("=======close payment begin=======");
         //关闭支付对象的参数,全部参数请参考 https://docs.adapay.tech/api/04-trade.html#id11
         //调用sdk方法,关闭支付,得到支付对象
@@ -161,17 +167,18 @@ public class Pay {
         } catch (BaseAdaPayException e) {
             e.printStackTrace();
         }
-        System.out.println("close payment result="+JSON.toJSONString(payment));
+        System.out.println("close payment result=" + JSON.toJSONString(payment));
         return payment;
     }
 
     /**
      * 查询一个支付交易
+     *
      * @param paymentId 要查询的支付id
      * @return 查询的支付对象
      * @throws Exception 异常
      */
-    public Payment queryPayment(String paymentId) throws Exception{
+    public Payment queryPayment(String paymentId) throws Exception {
         System.out.println("=======query payment begin=======");
         //查询支付对象的参数,全部参数请参考 https://docs.adapay.tech/api/04-trade.html#id7
         //调用sdk方法,查询支付交易,得到支付对象
@@ -181,7 +188,7 @@ public class Pay {
         } catch (BaseAdaPayException e) {
             e.printStackTrace();
         }
-        System.out.println("query payment result="+JSON.toJSONString(payment));
+        System.out.println("query payment result=" + JSON.toJSONString(payment));
         return payment;
     }
 }