Explorar el Código

Merge remote-tracking branch 'origin/master'

周箭河 hace 5 años
padre
commit
d4b5eb8190

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleTeacherSalaryDao.java

@@ -94,6 +94,17 @@ public interface CourseScheduleTeacherSalaryDao extends BaseDAO<Long, CourseSche
 									   @Param("userIds") List<Integer> userIds);
 
 	/**
+	 * @describe 根据课程编号与老师编号删除对应教师课酬记录
+	 * @author Joburgess
+	 * @date 2019/12/2
+	 * @param courseScheduleId: 课程编号
+	 * @param userIds: 教师编号列表
+	 * @return int
+	 */
+	int batchDeleteByCourseAndTeacher(@Param("courseScheduleId") Long courseScheduleId,
+									  @Param("userIds") List<Integer> userIds);
+
+	/**
 	 * @param courseScheduleIds:
 	 * @param teacherRole:
 	 * @return java.util.List<com.ym.mec.biz.dal.dto.BasicUserDto>

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

@@ -183,6 +183,15 @@ public interface VipGroupService extends BaseService<Long, VipGroup> {
     void createVipGroupCourseScheInfo(Long vipGroupId,ClassGroup classGroup);
 
     /**
+     * @describe 检测能否购买vip课
+     * @author Joburgess
+     * @date 2019/12/2
+     * @param vipGroupId:
+     * @return void
+     */
+    void enableBuyVipGroup(Integer vipGroupId);
+
+    /**
      * @Author: Joburgess
      * @Date: 2019/10/3
      * @params [vipGroupBuyParams]

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

@@ -694,7 +694,7 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 
 		double depositFee = 0d;
 		if (kitGroupPurchaseTypeEnum == KitGroupPurchaseTypeEnum.LEASE) {
-			StudentPaymentOrder studentPaymentOrder = studentPaymentOrderService.findMusicGroupApplyOrderByStatus(userId, musicGroupId, DealStatusEnum.SUCCESS);
+			StudentPaymentOrder studentPaymentOrder = studentPaymentOrderService.findMusicGroupApplyOrderByStatus(userId, musicGroupId, DealStatusEnum.WAIT_PAY);
 
 			if (studentPaymentOrder == null) {
 				throw new BizException("缴费订单不存在");

+ 27 - 6
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java

@@ -532,12 +532,26 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 		errInfo.append("安排的课程存在冲突,");
 		errInfo.append("冲突课程为:");
 		if(Objects.nonNull(preCourseSchedule.getId())&&existCourseScheduleIds.contains(preCourseSchedule.getId())){
+			MusicGroup musicGroup = musicGroupDao.get(preCourseSchedule.getMusicGroupId());
+			if(Objects.nonNull(musicGroup)){
+				errInfo.append(musicGroup.getName());
+				errInfo.append("(");
+				errInfo.append(musicGroup.getId());
+				errInfo.append(")-");
+			}
 			errInfo.append(preCourseSchedule.getName());
 			errInfo.append("(");
 			errInfo.append(preCourseSchedule.getId());
 			errInfo.append(")");
 		}
 		if(Objects.nonNull(backCourseSchedule.getId())&&existCourseScheduleIds.contains(backCourseSchedule.getId())){
+			MusicGroup musicGroup = musicGroupDao.get(backCourseSchedule.getMusicGroupId());
+			if(Objects.nonNull(musicGroup)){
+				errInfo.append(musicGroup.getName());
+				errInfo.append("(");
+				errInfo.append(musicGroup.getId());
+				errInfo.append(")-");
+			}
 			errInfo.append(backCourseSchedule.getName());
 			errInfo.append("(");
 			errInfo.append(backCourseSchedule.getId());
@@ -689,10 +703,10 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 		List<Long> newCourseScheduleIds = newCourseSchedules.stream().map(CourseSchedule::getId).collect(Collectors.toList());
 		//获取对应未修改的课程列表
 		List<CourseSchedule> oldCourseScheduleList = courseScheduleDao.findByCourseScheduleIds(newCourseScheduleIds);
-		if(oldCourseScheduleList.size()!=newCourseSchedules.size()){
+//		if(oldCourseScheduleList.size()!=newCourseSchedules.size()){
+		if(oldCourseScheduleList.size()<=newCourseSchedules.size()){
 			throw new BizException("课程信息错误");
 		}
-		Integer courseScheduleId = null;
 
 		Date now=new Date();
 		//明天日期
@@ -705,14 +719,19 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 		List<CourseScheduleTeacherSalary> teachingTeacherSalarys = courseScheduleDao.findTeachingTeachers(newCourseScheduleIds);
 		Map<Long,List<CourseScheduleTeacherSalary>> courseTeachingTeacherMaps = teachingTeacherSalarys.stream().collect(Collectors.groupingBy(CourseScheduleTeacherSalary::getCourseScheduleId));
 
-		Map<Long, CourseSchedule> oldCourseSchedules = oldCourseScheduleList.stream().collect(Collectors.toMap(CourseSchedule::getId,courseSchedule -> courseSchedule));
+		Map<Long, List<CourseSchedule>> oldCourseScheduleMap = oldCourseScheduleList.stream().collect(Collectors.groupingBy(CourseSchedule::getId));
+
+		Map<Long, CourseSchedule> oldCourseSchedules = new HashMap<>();
+
 		newCourseSchedules.forEach(newCourseSchedule -> {
 
 			if(newCourseSchedule.getStartClassTime().before(tomorrow)&&sysUser.getUserType().equals(SysUserType.TEACHER)){
 			    throw new BizException("调整时间必须为明天及以后");
             }
 
-			CourseSchedule oldCourseSchedule = oldCourseSchedules.get(newCourseSchedule.getId());
+			CourseSchedule oldCourseSchedule = oldCourseScheduleMap.get(newCourseSchedule.getId()).get(0);
+
+			oldCourseSchedules.put(newCourseSchedule.getId(),oldCourseSchedule);
 
             if(oldCourseSchedule.getStartClassTime().before(now)&&sysUser.getUserType().equals(SysUserType.TEACHER)){
                 throw new BizException("不能调整今天及以前的课程");
@@ -818,9 +837,11 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 				oldCourseSchedule.setSchoolId(newCourseSchedule.getSchoolId());
 			}
 			courseScheduleDao.update(oldCourseSchedule);
-			//将被修改的教师预计薪水置零
+			//删除被修改的教师课酬记录
 			if(!CollectionUtils.isEmpty(beReplaceTeacherIds)){
-				courseScheduleTeacherSalaryDao.batchUpdateTeacherExpectSalary(newCourseSchedule.getId().intValue(),beReplaceTeacherIds);
+//				courseScheduleTeacherSalaryDao.batchUpdateTeacherExpectSalary(newCourseSchedule.getId().intValue(),beReplaceTeacherIds);
+				courseScheduleTeacherSalaryDao.batchDeleteByCourseAndTeacher(newCourseSchedule.getId(),beReplaceTeacherIds);
+
 			}
 		});
 		//生成修改后的教师课酬

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

@@ -247,7 +247,7 @@ public class StudentAttendanceServiceImpl extends BaseServiceImpl<Long, StudentA
 		sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG,
 				MessageTypeEnum.TEACHER_PUSH_STUDENT_LEAVE,
 				sendArgs,
-				null,0,"1",courseSchedule.getName(),DateUtil.getDate(courseSchedule.getClassDate()),sysUser.getUsername());
+				null,0,"1",DateUtil.getDate(courseSchedule.getClassDate()),DateUtil.getTime(courseSchedule.getStartClassTime()),courseSchedule.getName(),sysUser.getUsername());
 		return true;
 	}
 

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java

@@ -823,6 +823,16 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
     }
 
 	@Override
+	public void enableBuyVipGroup(Integer vipGroupId) {
+		if (Objects.isNull(vipGroupId)){
+			throw new BizException("请指定VIP课");
+		}
+		VipGroup vipGroup = get(vipGroupId.longValue());
+		List<CourseSchedule> courseSchedules = JSON.parseArray(vipGroup.getCourseSchedulesJson(),CourseSchedule.class);
+		courseScheduleService.checkNewCourseSchedules(courseSchedules,false);
+	}
+
+	@Override
 	@Transactional(rollbackFor = Exception.class)
 	public void updateVipGroupStudentNumAndStatus(Long vipGroupId , ClassGroup classGroup, Integer num, boolean updateVipStatus) {
 		VipGroup vipGroup = vipGroupDao.getLockVipGroup(vipGroupId);

+ 10 - 0
mec-biz/src/main/resources/config/mybatis/CourseScheduleTeacherSalaryMapper.xml

@@ -329,6 +329,16 @@
 			</foreach>
 	</update>
 
+	<update id="batchDeleteByCourseAndTeacher">
+		DELETE FROM course_schedule_teacher_salary
+		WHERE
+		course_schedule_id_ = #{courseScheduleId}
+		AND user_id_ IN
+		<foreach collection="userIds" item="userId" open="(" close=")" separator=",">
+			#{userId}
+		</foreach>
+	</update>
+
 	<select id="findCourseScheduleTeacherSalaryByMusicGroupId" resultMap="CourseScheduleTeacherSalary">
 		SELECT * FROM course_schedule_teacher_salary WHERE music_group_id_=#{musicGroupId} AND group_type_ = #{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
 	</select>

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

@@ -166,7 +166,7 @@
 				AND FIND_IN_SET(organ_id_,#{organId})
 			</if>
 			<if test="musicGroupName != null and musicGroupName != ''">
-				AND name_ LIKE CONCAT('%',#{musicGroupName},'%')
+				AND (name_ LIKE CONCAT('%',#{musicGroupName},'%') or id_ like CONCAT('%',#{musicGroupName},'%'))
 			</if>
 			<if test="chargeTypeId != null">
 				AND charge_type_id_ = #{chargeTypeId}

+ 4 - 5
mec-biz/src/main/resources/config/mybatis/TeacherAttendanceMapper.xml

@@ -142,7 +142,7 @@
         <where>
             (cs.del_flag_ != 1 OR cs.del_flag_ IS NULL)
             <if test="teacherId != null">
-                and ta.teacher_id_ = #{teacherId}
+                and cs.actual_teacher_id_ = #{teacherId}
             </if>
             <if test="courseStartDate != null">
                 and cs.class_date_ &gt;= #{courseStartDate}
@@ -178,16 +178,15 @@
             IF(ta.sign_out_status_ IS NULL,3,ta.sign_out_status_) sign_out_status_,
             ta.remark_
         FROM
-            teacher_attendance ta
-        LEFT JOIN course_schedule cs ON ta.course_schedule_id_=cs.id_
+            course_schedule cs left join teacher_attendance ta  ON ta.course_schedule_id_=cs.id_
         <include refid="queryCondition"/>
         ORDER BY cs.class_date_ DESC,cs.start_class_time_ DESC
         <include refid="global.limit"/>
     </select>
 
     <select id="getTeacherPersonalAttendancesCount" resultType="int">
-        SELECT count(ta.id_) FROM teacher_attendance ta
-        LEFT JOIN course_schedule cs ON ta.course_schedule_id_=cs.id_
+        SELECT count(cs.id_) FROM course_schedule cs left join teacher_attendance ta
+        ON ta.course_schedule_id_=cs.id_
         <include refid="queryCondition"/>
     </select>
 

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

@@ -1,7 +1,6 @@
 package com.ym;
 
 import lombok.extern.slf4j.Slf4j;
-
 import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
@@ -9,7 +8,6 @@ import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
 import org.springframework.cloud.client.loadbalancer.LoadBalanced;
 import org.springframework.cloud.openfeign.EnableFeignClients;
 import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.ComponentScan;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.EnableAspectJAutoProxy;
 import org.springframework.scheduling.annotation.EnableAsync;

+ 1 - 1
mec-im/src/main/java/com/ym/config/ResourceServerConfig.java

@@ -10,6 +10,6 @@ import org.springframework.security.oauth2.config.annotation.web.configuration.R
 public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
     @Override
     public void configure(HttpSecurity http) throws Exception {
-        http.authorizeRequests().antMatchers("/v2/api-docs","/user/register","/group/join","/group/create","/room/leave").permitAll().anyRequest().authenticated().and().csrf().disable();
+        http.authorizeRequests().antMatchers("/v2/api-docs","/user/register","/group/join","/group/create","/room/leave","/room/statusSync").permitAll().anyRequest().authenticated().and().csrf().disable();
     }
 }

+ 11 - 0
mec-im/src/main/java/com/ym/controller/RoomController.java

@@ -1,5 +1,6 @@
 package com.ym.controller;
 
+import com.alibaba.fastjson.JSONObject;
 import com.ym.common.ApiException;
 import com.ym.common.BaseResponse;
 import com.ym.common.ErrorEnum;
@@ -33,6 +34,16 @@ public class RoomController{
         return new BaseResponse<>(result);
     }
 
+    @RequestMapping(value = "/statusSync", method = RequestMethod.POST)
+    public Object statusSync(@RequestBody String body) throws Exception {
+        ChannelStateNotify notify = JSONObject.parseObject(body, ChannelStateNotify.class);
+        boolean result = false;
+        if(notify.getEvent() == 12){
+            result = roomService.statusSync(notify.getChannelId(), notify.getUserId());
+        }
+        return new BaseResponse<>(result);
+    }
+
     @RequestMapping(value = "/downgrade", method = RequestMethod.POST)
     public Object downRole(@RequestBody ReqChangeUserRoleData data)
             throws ApiException, Exception {

+ 81 - 0
mec-im/src/main/java/com/ym/pojo/ChannelStateNotify.java

@@ -0,0 +1,81 @@
+package com.ym.pojo;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ChannelStateNotify {
+
+	private String appKey;
+	private String channelId;
+	private String sessionId;
+	private int event;
+	private String userId;
+	private long timestamp;
+	private String token;
+    private String extra;
+    private List<Member> members = new ArrayList<Member>();
+	public String getAppKey() {
+		return appKey;
+	}
+	public void setAppKey(String appKey) {
+		this.appKey = appKey;
+	}
+	public String getChannelId() {
+		return channelId;
+	}
+	public void setChannelId(String channelId) {
+		this.channelId = channelId;
+	}
+	public String getSessionId() {
+		return sessionId;
+	}
+	public void setSessionId(String sessionId) {
+		this.sessionId = sessionId;
+	}
+	public int getEvent() {
+		return event;
+	}
+	public void setEvent(int event) {
+		this.event = event;
+	}
+	public String getUserId() {
+		return userId;
+	}
+	public void setUserId(String userId) {
+		this.userId = userId;
+	}
+	public long getTimestamp() {
+		return timestamp;
+	}
+	public void setTimestamp(long timestamp) {
+		this.timestamp = timestamp;
+	}
+	public String getToken() {
+		return token;
+	}
+	public void setToken(String token) {
+		this.token = token;
+	}
+	public String getExtra() {
+		return extra;
+	}
+	public void setExtra(String extra) {
+		this.extra = extra;
+	}
+	public List<Member> getMembers() {
+		return members;
+	}
+	public void setMembers(List<Member> members) {
+		this.members = members;
+	}
+	
+	public Member getMemberByUserId (String userId) {
+		for (Member member : this.members) {
+			if (userId.equals(member.getUserId())) {
+				return member;
+			}
+		}
+		return null;
+	}
+	
+}

+ 21 - 0
mec-im/src/main/java/com/ym/pojo/Member.java

@@ -0,0 +1,21 @@
+package com.ym.pojo;
+
+import com.alibaba.fastjson.JSONObject;
+
+public class Member {
+
+	private String userId;
+    private JSONObject data;
+	public String getUserId() {
+		return userId;
+	}
+	public void setUserId(String userId) {
+		this.userId = userId;
+	}
+	public JSONObject getData(){
+		return data;
+	}
+	public void setData(JSONObject data){
+		this.data = data;
+	}
+}

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

@@ -1126,7 +1126,90 @@ public class RoomServiceImpl implements RoomService {
             }
         }
     }
-	private void updateDisplay(String roomId, String senderId, String display, Integer isIncludeSender) throws ApiException, Exception {
+
+    @Override
+    public boolean statusSync(String roomId,String userId) throws Exception {
+        List<RoomMember> byRidAndUid = roomMemberDao.findByRidAndUid(roomId, userId);
+        if(byRidAndUid.size() > 0){
+            SysUser sysUser = sysUserFeignService.queryUserById(Integer.parseInt(userId));
+            Teacher teacher = teacherDao.get(sysUser.getId());
+            if(teacher != null){
+                try {
+                    teacherAttendanceService.addTeacherAttendanceRecord(Integer.parseInt(roomId.substring(4)),sysUser.getId(), SignStatusEnum.SIGN_OUT,true);
+                }catch (Exception e){
+                    e.printStackTrace();
+                }
+            }
+            List<Room> roomList = roomDao.findByRid(roomId);
+            if (roomList.size() == 0) {
+                log.error("room : {} not exist ", roomId);
+                throw new ApiException(ErrorEnum.ERR_ROOM_NOT_EXIST);
+            }
+
+            List<RoomMember> roomMemberList = roomMemberDao.findByRidAndUid(roomId, userId);
+            if (roomMemberList.size() == 0) {
+                log.error("{} not exist in room: {}", userId, roomId);
+                throw new ApiException(ErrorEnum.ERR_USER_NOT_EXIST_IN_ROOM);
+            }
+
+            int userRole = roomMemberList.get(0).getRole();
+            log.info("leaveRoom: roomId={}, role={}", roomId, RoleEnum.getEnumByValue(userRole));
+
+            if (userRole == RoleEnum.RoleTeacher.getValue() || userRole == RoleEnum.RoleAssistant.getValue()) {
+                if (isUserDisplay(roomList.get(0), userId)) {
+                    updateDisplay(roomId, userId, "", 0);
+                    log.info("clear display cause speaker leave: roomId={}", roomId);
+                } else {
+                    log.info("don't update current display: room={}, role={}", roomList.get(0), RoleEnum.getEnumByValue(userRole));
+                }
+            } else {
+                log.info("don't update current display: room={}, userRole={}", roomList.get(0), RoleEnum.getEnumByValue(userRole));
+            }
+
+            if (roomMemberDao.countByRid(roomId) == 1) {
+                IMApiResultInfo apiResultInfo = null;
+                try {
+                    apiResultInfo = imHelper.dismiss(userId, roomId);
+                    if (apiResultInfo.getCode() == 200) {
+                        roomMemberDao.deleteUserByRidAndUid(roomId, userId);
+                        roomDao.deleteByRid(roomId);
+                        deleteWhiteboardByUser(roomId, userId);
+                        log.info("dismiss the room: {}", roomId);
+                    } else {
+                        log.error("{} exit {} room error: {}", userId, roomId, apiResultInfo.getErrorMessage());
+                        throw new ApiException(ErrorEnum.ERR_EXIT_ROOM_ERROR, apiResultInfo.getErrorMessage());
+                    }
+                } catch (Exception e) {
+                    log.error("{} exit {} room error: {}", userId, roomId, e.getMessage());
+                    throw new ApiException(ErrorEnum.ERR_EXIT_ROOM_ERROR, e.getMessage());
+                }
+            } else {
+                IMApiResultInfo apiResultInfo = null;
+                try {
+                    apiResultInfo = imHelper.quit(new String[]{userId}, roomId);
+                    if (apiResultInfo.isSuccess()) {
+                        roomMemberDao.deleteUserByRidAndUid(roomId, userId);
+                        MemberChangedMessage msg = new MemberChangedMessage(MemberChangedMessage.Action_Leave, userId, userRole);
+                        msg.setUserName(sysUser.getUsername());
+                        imHelper.publishMessage(userId, roomId, msg);
+                        imHelper.quit(new String[]{userId}, roomId);
+                        log.info("quit group: roomId={}", roomId);
+                    } else {
+                        throw new ApiException(ErrorEnum.ERR_EXIT_ROOM_ERROR, apiResultInfo.getErrorMessage());
+                    }
+                } catch (Exception e) {
+                    log.error("leave room error: roomId={}, {}", roomId, e.getMessage());
+                    throw new ApiException(ErrorEnum.ERR_EXIT_ROOM_ERROR);
+                }
+            }
+            userDao.deleteByUid(userId);
+
+            return true;
+        }
+        return true;
+    }
+
+    private void updateDisplay(String roomId, String senderId, String display, Integer isIncludeSender) throws ApiException, Exception {
         roomDao.updateDisplayByRid(roomId, display);
         DisplayMessage displayMessage = new DisplayMessage(display);
         imHelper.publishMessage(senderId, roomId, displayMessage, isIncludeSender);

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

@@ -63,4 +63,6 @@ public interface RoomService {
     public void destroyRoom(String roomId);
     public Boolean memberOnlineStatus(List<ReqMemberOnlineStatus> statusList, String nonce, String timestamp, String signature) throws ApiException, Exception;
     public void userIMOfflineKick(String userId);
+
+    boolean statusSync(String roomId,String userId) throws Exception;
 }

+ 11 - 2
mec-student/src/main/java/com/ym/mec/student/controller/StudentVipGroupController.java

@@ -10,10 +10,8 @@ import com.ym.mec.biz.service.SubjectService;
 import com.ym.mec.biz.service.VipGroupCategoryService;
 import com.ym.mec.biz.service.VipGroupService;
 import com.ym.mec.common.controller.BaseController;
-
 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.*;
@@ -75,6 +73,17 @@ public class StudentVipGroupController extends BaseController {
         return succeed(vipGroupService.getVipGroupShowDetail(vipGroupId));
     }
 
+    @ApiOperation(value = "检测vip课成能否购买")
+    @GetMapping(value = "/enableBuyGroup")
+    public Object enableBuyGroup(Integer vipGroupId){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (null == sysUser) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        vipGroupService.enableBuyVipGroup(vipGroupId);
+        return succeed();
+    }
+
     @ApiOperation(value = "vip课购买")
     @PostMapping("/buyVipGroup")
     public Object buyVipGroup(VipGroupBuyParamsDto vipGroupBuyParams) throws Exception {