浏览代码

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

zouxuan 5 年之前
父节点
当前提交
9e757360ee
共有 26 个文件被更改,包括 430 次插入28 次删除
  1. 2 0
      mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/entity/SysUserRole.java
  2. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CoursesGroupDao.java
  3. 121 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseReviewDto.java
  4. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/MessageTypeEnum.java
  5. 9 2
      mec-biz/src/main/java/com/ym/mec/biz/service/CoursesGroupService.java
  6. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  7. 22 5
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CoursesGroupServiceImpl.java
  8. 13 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/GroupClassServiceImpl.java
  9. 10 3
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysTenantAccountServiceImpl.java
  10. 5 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantPaymentOrderServiceImpl.java
  11. 1 1
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  12. 14 5
      mec-biz/src/main/resources/config/mybatis/CourseScheduleReviewMapper.xml
  13. 17 0
      mec-biz/src/main/resources/config/mybatis/CoursesGroupMapper.xml
  14. 26 0
      mec-biz/src/main/resources/config/mybatis/SysTenantAccountMapper.xml
  15. 4 0
      mec-client-api/src/main/java/com/ym/mec/task/TaskRemoteService.java
  16. 5 0
      mec-client-api/src/main/java/com/ym/mec/task/fallback/TaskRemoteServiceFallback.java
  17. 5 0
      mec-common/common-core/pom.xml
  18. 14 0
      mec-common/common-core/src/main/java/com/ym/mec/common/config/LocalFastJsonHttpMessageConverter.java
  19. 52 0
      mec-common/common-core/src/main/java/com/ym/mec/common/filters/EmojiEncodingFilter.java
  20. 0 1
      mec-common/common-core/src/main/java/com/ym/mec/common/service/impl/RedisIdGeneratorService.java
  21. 0 5
      mec-task/pom.xml
  22. 19 0
      mec-task/src/main/java/com/ym/mec/task/jobs/CoursesGroupNoStudentsRemindTask.java
  23. 9 0
      mec-web/src/main/java/com/ym/mec/web/controller/CourseReviewController.java
  24. 52 0
      mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java
  25. 9 0
      mec-web/src/main/java/com/ym/mec/web/controller/TaskController.java
  26. 6 0
      pom.xml

+ 2 - 0
mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/entity/SysUserRole.java

@@ -17,6 +17,8 @@ public class SysUserRole {
 	public static Integer ADMISSIONS_DIRECTOR = 6;
 	//教学主任
 	public static Integer DEAN_OF_STUDIES = 7;
+	//总部管理员
+	public static Integer ADMINISTRATOR = 25;
 
 	/** 用户ID */
 	@ApiModelProperty(value = "用户ID",required = false)

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

@@ -4,6 +4,7 @@ import com.ym.mec.biz.dal.entity.CoursesGroup;
 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;
 
@@ -48,4 +49,14 @@ public interface CoursesGroupDao extends BaseDAO<Long, CoursesGroup> {
      */
     List<Map<Long, Long>> findConsumeMinutes(@Param("groupIds") List<Long> groupIds);
 
+    /**
+     * @describe 根据开课时间获取无学生加入的课程组
+     * @author Joburgess
+     * @date 2020/3/17
+     * @param startDate: 开始时间
+     * @return java.util.List<com.ym.mec.biz.dal.entity.CoursesGroup>
+     */
+    List<CoursesGroup> findNoStudentsGroups(@Param("startDate")Date startDate);
+
+    CoursesGroup lockGroup(@Param("groupId") Long groupId);
 }

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

@@ -69,6 +69,39 @@ public class CourseReviewDto {
     @ApiModelProperty(value = "课时长度",required = false)
     private Integer courseDuration;
 
+    @ApiModelProperty(value = "是否提交作业备注",required = false)
+    private String handHomeworkStr;
+
+    @ApiModelProperty(value = "教材内容",required = false)
+    private String teachingMaterial;
+
+    @ApiModelProperty(value = "发音",required = false)
+    private Integer pronunciation;
+
+    @ApiModelProperty(value = "节奏",required = false)
+    private Integer tempo;
+
+    @ApiModelProperty(value = "乐理",required = false)
+    private Integer musicTheory;
+
+    @ApiModelProperty(value = "曲目",required = false)
+    private String song;
+
+    @ApiModelProperty(value = "评价备注",required = false)
+    private String memo;
+
+    @ApiModelProperty(value = "回访日期",required = false)
+    private Date createTime;
+
+    @ApiModelProperty(value = "回访日期Str",required = false)
+    private String createTimeStr;
+
+    @ApiModelProperty(value = "完成app双向沟通",required = false)
+    private String hasLiaison;
+
+    @ApiModelProperty(value = "学生id",required = false)
+    private Integer studentId;
+
     public Integer getOrganId() {
         return organId;
     }
@@ -236,4 +269,92 @@ public class CourseReviewDto {
     public void setCourseDuration(Integer courseDuration) {
         this.courseDuration = courseDuration;
     }
+
+    public String getHandHomeworkStr() {
+        return handHomeworkStr;
+    }
+
+    public void setHandHomeworkStr(String handHomeworkStr) {
+        this.handHomeworkStr = handHomeworkStr;
+    }
+
+    public String getTeachingMaterial() {
+        return teachingMaterial;
+    }
+
+    public void setTeachingMaterial(String teachingMaterial) {
+        this.teachingMaterial = teachingMaterial;
+    }
+
+    public Integer getPronunciation() {
+        return pronunciation;
+    }
+
+    public void setPronunciation(Integer pronunciation) {
+        this.pronunciation = pronunciation;
+    }
+
+    public Integer getTempo() {
+        return tempo;
+    }
+
+    public void setTempo(Integer tempo) {
+        this.tempo = tempo;
+    }
+
+    public Integer getMusicTheory() {
+        return musicTheory;
+    }
+
+    public void setMusicTheory(Integer musicTheory) {
+        this.musicTheory = musicTheory;
+    }
+
+    public String getSong() {
+        return song;
+    }
+
+    public void setSong(String song) {
+        this.song = song;
+    }
+
+    public String getMemo() {
+        return memo;
+    }
+
+    public void setMemo(String memo) {
+        this.memo = memo;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public String getCreateTimeStr() {
+        return createTimeStr;
+    }
+
+    public void setCreateTimeStr(String createTimeStr) {
+        this.createTimeStr = createTimeStr;
+    }
+
+    public String getHasLiaison() {
+        return hasLiaison;
+    }
+
+    public void setHasLiaison(String hasLiaison) {
+        this.hasLiaison = hasLiaison;
+    }
+
+    public Integer getStudentId() {
+        return studentId;
+    }
+
+    public void setStudentId(Integer studentId) {
+        this.studentId = studentId;
+    }
 }

+ 1 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/MessageTypeEnum.java

@@ -48,6 +48,7 @@ public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
     STUDENT_PUSH_JOB_MESSAGE("STUDENT_PUSH_JOB_MESSAGE", "作业提醒"),
     HOMEWORK_REMIND("HOMEWORK_REMIND", "作业提醒-网管课"),
     STUDENT_PUSH_CLASS_MESSAGE("STUDENT_PUSH_CLASS_MESSAGE", "班级消息"),
+    COMM_NO_STUDENTS_PUSH("COMM_NO_STUDENTS_PUSH", "对外课程组无学生提醒"),
 
     TEACHER_PUSH_MUSIC_GROUP_COURSE_ADD_PLAN("TEACHER_PUSH_MUSIC_GROUP_COURSE_ADD_PLAN", "乐团课新增安排"),
     TEACHER_SMS_VIP_COURSE_APPLY_RESULT("TEACHER_SMS_VIP_COURSE_APPLY_RESULT", "VIP课申请结果"),

+ 9 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/CoursesGroupService.java

@@ -1,7 +1,6 @@
 package com.ym.mec.biz.service;
 
 import com.ym.mec.biz.dal.dto.CourseGroupCreateDto;
-import com.ym.mec.biz.dal.dto.CourseGroupTeacherCardDto;
 import com.ym.mec.biz.dal.dto.GroupHeadInfoDto;
 import com.ym.mec.biz.dal.entity.CoursesGroup;
 import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
@@ -10,7 +9,6 @@ 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;
 import java.util.Map;
 
 public interface CoursesGroupService extends BaseService<Long, CoursesGroup> {
@@ -62,4 +60,13 @@ public interface CoursesGroupService extends BaseService<Long, CoursesGroup> {
     HttpResponseResult buyCourseGroup(Integer userId, Long courseGroupId, boolean isUseBalancePayment);
 
     void orderCallback(StudentPaymentOrder studentPaymentOrder);
+
+    /**
+     * @describe 无学生课程组提醒
+     * @author Joburgess
+     * @date 2020/3/17
+     * @param :
+     * @return void
+     */
+    void noStudentsCourseGroupRemind();
 }

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

@@ -3140,6 +3140,9 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         CourseSchedule courseSchedule = courseScheduleDao.get(courseScheduleComplaints.getCourseScheduleId());
         Set<Integer> roleIds = new HashSet<>(1);
         roleIds.add(SysUserRole.EDUCATIONAL_TEACHER);
+        roleIds.add(SysUserRole.OPERATION_EXECUTIVE);
+        roleIds.add(SysUserRole.SECTION_MANAGER);
+        roleIds.add(SysUserRole.ADMINISTRATOR);
         Map<String, Long> memo = new HashMap<>(1);
         memo.put("courseScheduleComplaintsId", courseScheduleComplaints.getId());
         sysMessageService.batchSeoMessage(musicGroupDao.queryUserIdByRoleId(roleIds, user.getOrganId()), MessageTypeEnum.BACKSTAGE_STUDENT_APPEAL, JSONObject.toJSONString(memo), courseSchedule.getName(), user.getUsername());

+ 22 - 5
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CoursesGroupServiceImpl.java

@@ -19,7 +19,9 @@ 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.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.util.collection.MapUtil;
+import com.ym.mec.util.date.DateUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -80,6 +82,8 @@ public class CoursesGroupServiceImpl extends BaseServiceImpl<Long, CoursesGroup>
     private SysTenantAccountService sysTenantAccountService;
     @Autowired
     private StudentDao studentDao;
+    @Autowired
+    private SysMessageService sysMessageService;
 
     private static final Logger LOGGER = LoggerFactory
             .getLogger(PracticeGroupService.class);
@@ -117,11 +121,11 @@ public class CoursesGroupServiceImpl extends BaseServiceImpl<Long, CoursesGroup>
 
         //总课程时长
         Integer totalCourseTime=courseCycleInfo.getCourseCount()*courseCycleInfo.getSingleClassMinutes();
-//        sysTenantAccountService.update(courseGroup.getTeacherId(), -totalCourseTime, SysTenantAccountDetail.TransType.CONSUME, "",BigDecimal.ZERO,"课程组创建");
+        sysTenantAccountService.update(courseGroup.getTeacherId(), -totalCourseTime, "", SysTenantAccountDetail.TransType.CONSUME, "",BigDecimal.ZERO,"课程组创建");
 
         Date now=new Date();
         courseGroup.setSingleClassMinutes(courseCycleInfo.getSingleClassMinutes());
-        courseGroup.setStatus(GroupStatusEnum.APPLYING);
+        courseGroup.setStatus(GroupStatusEnum.NORMAL);
         List<CourseSchedule> newCourses = courseScheduleService.createCourses(courseGroupCreateInfo.getCourseCycleInfo());
         for (CourseSchedule newCourse : newCourses) {
             newCourse.setTeachMode(TeachModeEnum.ONLINE);
@@ -330,9 +334,7 @@ public class CoursesGroupServiceImpl extends BaseServiceImpl<Long, CoursesGroup>
             throw new BizException("请指定课程组");
         }
 
-        studentDao.lockUser(userId);
-
-        CoursesGroup coursesGroup = coursesGroupDao.get(courseGroupId);
+        CoursesGroup coursesGroup = coursesGroupDao.lockGroup(courseGroupId);
         if(Objects.isNull(coursesGroup)){
             throw new BizException("此课程组不存在");
         }
@@ -589,4 +591,19 @@ public class CoursesGroupServiceImpl extends BaseServiceImpl<Long, CoursesGroup>
         // 创建群组
         imFeignService.groupCreate(new ImGroupModel(classGroup.getId().toString(), imGroupMembers, classGroup.getName()));
     }
+
+    @Override
+    public void noStudentsCourseGroupRemind() {
+        Date startDate = DateUtil.addDays(new Date(), -1);
+        List<CoursesGroup> noStudentsGroups = coursesGroupDao.findNoStudentsGroups(startDate);
+        if(CollectionUtils.isEmpty(noStudentsGroups)){
+            return;
+        }
+        for (CoursesGroup noStudentsGroup : noStudentsGroups) {
+            Map<Integer, String> userMap = new HashMap<>();
+            userMap.put(noStudentsGroup.getTeacherId(), noStudentsGroup.getTeacherId().toString());
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.COMM_NO_STUDENTS_PUSH,
+                    userMap, null, 0, null, "TEACHER", noStudentsGroup.getName());
+        }
+    }
 }

+ 13 - 4
mec-biz/src/main/java/com/ym/mec/biz/service/impl/GroupClassServiceImpl.java

@@ -1,15 +1,13 @@
 package com.ym.mec.biz.service.impl;
 
 import com.ym.mec.biz.dal.dao.*;
-import com.ym.mec.biz.dal.entity.CourseSchedule;
-import com.ym.mec.biz.dal.entity.CoursesGroup;
-import com.ym.mec.biz.dal.entity.PracticeGroup;
-import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
+import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.DealStatusEnum;
 import com.ym.mec.biz.dal.enums.GroupStatusEnum;
 import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.dal.enums.PlatformCashAccountDetailTypeEnum;
 import com.ym.mec.biz.service.GroupClassService;
+import com.ym.mec.biz.service.SysTenantAccountService;
 import com.ym.mec.biz.service.SysUserCashAccountService;
 import com.ym.mec.common.exception.BizException;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -59,6 +57,8 @@ public class GroupClassServiceImpl implements GroupClassService {
     private StudentPaymentOrderDao studentPaymentOrderDao;
     @Autowired
     private CoursesGroupDao coursesGroupDao;
+    @Autowired
+    private SysTenantAccountService sysTenantAccountService;
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -150,6 +150,15 @@ public class GroupClassServiceImpl implements GroupClassService {
             if(coursesGroup.getCoursesEndDate().before(now)){
                 throw new BizException("当前课程组不可关闭");
             }
+            if(coursesGroup.getStatus().equals(GroupStatusEnum.CANCEL)){
+                throw new BizException("此课程组已关闭");
+            }
+            List<CourseSchedule> groupNotStartCourses = courseScheduleDao.findGroupNotStartCourses(groupId.toString(), groupType);
+            if(!CollectionUtils.isEmpty(groupNotStartCourses)){
+                //剩余课程时长
+                Integer totalCourseTime=groupNotStartCourses.size()*coursesGroup.getSingleClassMinutes();
+                sysTenantAccountService.update(coursesGroup.getTeacherId(), totalCourseTime, "", SysTenantAccountDetail.TransType.CONSUME, "",BigDecimal.ZERO,"关闭课程组");
+            }
             cleanGroupInfo(groupId.toString(), GroupType.COMM);
             coursesGroup.setMemo("主动关闭课程组");
             coursesGroup.setStatus(GroupStatusEnum.CANCEL);

+ 10 - 3
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysTenantAccountServiceImpl.java

@@ -37,9 +37,18 @@ public class SysTenantAccountServiceImpl extends BaseServiceImpl<Integer, SysTen
 	@Override
 	@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
 	public boolean update(Integer userId, int minutes, String orderNo, TransType type, String transNo, BigDecimal cashAmount, String memo) {
+
+		Date date = new Date();
 		SysTenantAccount tenantAccount = sysTenantAccountDao.getLocked(userId);
 		if (tenantAccount == null) {
-			throw new BizException("用户[{}]现金账户不存在", userId);
+			tenantAccount = new SysTenantAccount();
+			tenantAccount.setUserId(userId);
+			tenantAccount.setCreateTime(date);
+			tenantAccount.setUpdateTime(date);
+			tenantAccount.setStatus(AccountStatus.NORMAL);
+			tenantAccount.setAvailableMinutes(0);
+			tenantAccount.setFrozenMinutes(0);
+			sysTenantAccountDao.insert(tenantAccount);
 		}
 
 		if (tenantAccount.getStatus() != AccountStatus.NORMAL) {
@@ -50,8 +59,6 @@ public class SysTenantAccountServiceImpl extends BaseServiceImpl<Integer, SysTen
 			throw new BizException("账户[{}]可用时间不足,可用时间剩{}分钟", userId, tenantAccount.getAvailableMinutes());
 		}
 
-		Date date = new Date();
-
 		tenantAccount.setAvailableMinutes(balance);
 		tenantAccount.setUpdateTime(date);
 		sysTenantAccountDao.update(tenantAccount);

+ 5 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantPaymentOrderServiceImpl.java

@@ -254,12 +254,15 @@ public class TenantPaymentOrderServiceImpl extends BaseServiceImpl<Long, TenantP
 						if (status.equals(DealStatusEnum.SUCCESS)) {
 							order.setPayTime(new Date());
 						} else {
-							order.setMemo(rpMap.get("remarks").toString());
+							Object remarks = rpMap.get("remarks");
+							if (remarks != null) {
+								order.setMemo(remarks.toString());
+							}
 						}
 						order.setStatus(status);
 						order.setTransNo(rpMap.get("orderNo").toString());
 						order.setPaymentBusinessChannel(channelType);
-						order.setActualAmount(new BigDecimal(rpMap.get("totalMoney").toString()));
+						order.setActualAmount(new BigDecimal(rpMap.get("moneyPayed").toString()));
 						paymentForCallback(order);
 					} catch (Exception e) {
 						e.printStackTrace();

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

@@ -2735,7 +2735,7 @@
         )
     </select>
     <select id="findGroupNotStartCourses" resultMap="CourseSchedule">
-        SELECT * FROM course_schedule WHERE group_type_=#{groupType, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler} AND music_group_id_ = #{groupId} AND CONCAT(class_date_, ' ', start_class_time_)>NOW()
+        SELECT * FROM course_schedule WHERE group_type_=#{groupType, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler} AND music_group_id_ = #{groupId} AND CONCAT(class_date_, ' ', start_class_time_)&gt;NOW()
     </select>
     <select id="getSubjectNameById" resultType="java.lang.String">
         SELECT GROUP_CONCAT(DISTINCT s.name_) FROM course_schedule cs

+ 14 - 5
mec-biz/src/main/resources/config/mybatis/CourseScheduleReviewMapper.xml

@@ -143,14 +143,22 @@
         <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"/>
+        <result column="teaching_material_" property="teachingMaterial"/>
+        <result column="pronunciation_" property="pronunciation"/>
+        <result column="tempo_" property="tempo"/>
+        <result column="music_theory_" property="musicTheory"/>
+        <result column="song_" property="song"/>
+        <result column="memo_" property="memo"/>
+        <result column="create_time_" property="createTime"/>
+        <result column="has_liaison_" property="hasLiaison"/>
+        <result column="student_id_" property="studentId"/>
     </resultMap>
 
     <sql id="practiceGroupReviewsQueryCondition">
         <where>
-            AND pg.id_ > 0 AND cs.group_type_='PRACTICE' AND cs.status_='OVER' AND (cs.del_flag_ = 0 OR cs.del_flag_ IS
-            NULL)
+            AND pg.id_ > 0 AND cs.group_type_='PRACTICE' AND cs.status_='OVER' AND (cs.del_flag_ = 0 OR cs.del_flag_ IS NULL)
             <if test="search!=null and search!=''">
-                AND (pg.name_ LIKE CONCAT('%',#{search},'%') OR pg.id_= #{search})
+                AND (cs.name_ LIKE CONCAT('%',#{search},'%') OR cs.id_= #{search})
             </if>
             <if test="organId != null">
                 AND FIND_IN_SET(pg.organ_id_,#{organId})
@@ -208,7 +216,8 @@
         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_
+        student_review_,csr.hand_homework_,csr.course_review_,pg.student_id_,csr.teaching_material_,csr.pronunciation_,csr.tempo_,
+        csr.music_theory_,csr.song_,csr.memo_,csr.create_time_,csr.has_liaison_
         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_
@@ -324,7 +333,7 @@
                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_
+                 LEFT JOIN sys_user stu on csr.student_id_ = stu.id_
         WHERE csr.course_schedule_id_ = #{courseScheduleId}
     </select>
 

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

@@ -33,6 +33,10 @@
 	<select id="get" resultMap="CoursesGroup" >
 		SELECT * FROM courses_group WHERE id_ = #{id} 
 	</select>
+
+	<select id="lockGroup" resultMap="CoursesGroup" >
+		SELECT * FROM courses_group WHERE id_ = #{groupId} FOR UPDATE
+	</select>
 	
 	<!-- 全查询 -->
 	<select id="findAll" resultMap="CoursesGroup">
@@ -169,4 +173,17 @@
 		AND cs.group_type_ = 'COMM' AND CONCAT(cs.class_date_,' ',cs.start_class_time_) &lt;= NOW()
 		GROUP BY cg.id_
 	</select>
+    <select id="findNoStudentsGroups" resultMap="CoursesGroup">
+		SELECT
+			csg.*
+		FROM
+			courses_group csg
+			LEFT JOIN class_group cg ON cg.music_group_id_ = csg.id_
+			LEFT JOIN course_schedule cs ON cs.music_group_id_ = csg.id_
+		WHERE
+			cg.group_type_ = 'COMM'
+			AND cs.group_type_ = 'COMM'
+			AND cg.student_num_ = 0
+		GROUP BY csg.id_ HAVING MAX(cs.class_date_)&lt;=DATE_FORMAT(#{startDate}, '%Y-%m-%d')
+    </select>
 </mapper>

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

@@ -22,6 +22,32 @@
 		SELECT * FROM sys_tenant_account WHERE user_id_ = #{uesrId} for update
 	</select>
 
+	<!-- 根据主键查询一条记录 -->
+	<update id="update" parameterType="com.ym.mec.biz.dal.entity.SysTenantAccount">
+		UPDATE sys_tenant_account
+		<set>
+			<if test="status != null">
+				status_ = #{status, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+			</if>
+			<if test="userId != null">
+				user_id_ = #{userId},
+			</if>
+			<if test="availableMinutes != null">
+				available_minutes_ = #{availableMinutes},
+			</if>
+			<if test="updateTime != null">
+				update_time_ = #{updateTime},
+			</if>
+			<if test="frozenMinutes != null">
+				frozen_minutes_ = #{frozenMinutes},
+			</if>
+			<if test="createTime != null">
+				create_time_ = #{createTime},
+			</if>
+		</set>
+		WHERE user_id_ = #{userId}
+	</update>
+
 	<!-- 全查询 -->
 	<select id="findAll" resultMap="SysTenantAccount">
 		SELECT * FROM sys_tenant_account

+ 4 - 0
mec-client-api/src/main/java/com/ym/mec/task/TaskRemoteService.java

@@ -96,4 +96,8 @@ public interface TaskRemoteService {
 	@GetMapping("task/pushNeedReview2Teacher")
 	void pushNeedReview2Teacher();
 
+	//对外无学生课程组提醒
+	@GetMapping("task/noStudentsCourseGroupRemind")
+	void noStudentsCourseGroupRemind();
+
 }

+ 5 - 0
mec-client-api/src/main/java/com/ym/mec/task/fallback/TaskRemoteServiceFallback.java

@@ -120,4 +120,9 @@ public class TaskRemoteServiceFallback implements TaskRemoteService {
 	public void pushNeedReview2Teacher() {
 		logger.info("新增待填写评论推送失败");
 	}
+
+	@Override
+	public void noStudentsCourseGroupRemind() {
+		logger.info("对外课程组无学生推送失败");
+	}
 }

+ 5 - 0
mec-common/common-core/pom.xml

@@ -61,5 +61,10 @@
 			<version>2.2.1.RELEASE</version>
 		</dependency>
 
+		<dependency>
+			<groupId>com.vdurmont</groupId>
+			<artifactId>emoji-java</artifactId>
+		</dependency>
+
 	</dependencies>
 </project>

+ 14 - 0
mec-common/common-core/src/main/java/com/ym/mec/common/config/LocalFastJsonHttpMessageConverter.java

@@ -2,6 +2,7 @@ package com.ym.mec.common.config;
 
 import java.io.IOException;
 import java.io.OutputStream;
+import java.lang.reflect.Type;
 import java.math.BigDecimal;
 import java.util.Date;
 
@@ -11,9 +12,12 @@ import org.springframework.http.HttpOutputMessage;
 import org.springframework.http.converter.HttpMessageNotReadableException;
 import org.springframework.http.converter.HttpMessageNotWritableException;
 
+import com.alibaba.fastjson.serializer.JSONSerializer;
+import com.alibaba.fastjson.serializer.ObjectSerializer;
 import com.alibaba.fastjson.serializer.SimpleDateFormatSerializer;
 import com.alibaba.fastjson.serializer.ValueFilter;
 import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
+import com.vdurmont.emoji.EmojiParser;
 import com.ym.mec.common.enums.BaseEnum;
 import com.ym.mec.util.json.JsonUtil;
 
@@ -31,12 +35,22 @@ public class LocalFastJsonHttpMessageConverter extends FastJsonHttpMessageConver
 
 		OutputStream out = outputMessage.getBody();
 		JsonUtil.getConfig().put(Date.class, new SimpleDateFormatSerializer(FORMAT));
+		JsonUtil.getConfig().put(String.class, new EmojiSerializer());
 		String text = JsonUtil.toJSONString(obj, EnumFilter.instance, getFeatures());
 		byte[] bytes = text.getBytes(getCharset());
 		out.write(bytes);
 	}
 }
 
+class EmojiSerializer implements ObjectSerializer{
+
+	@Override
+	public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException {
+		serializer.write(EmojiParser.parseToUnicode(object.toString()));
+	}
+	
+}
+
 class EnumFilter implements ValueFilter {
 
 	public static EnumFilter instance = new EnumFilter();

+ 52 - 0
mec-common/common-core/src/main/java/com/ym/mec/common/filters/EmojiEncodingFilter.java

@@ -0,0 +1,52 @@
+package com.ym.mec.common.filters;
+
+import java.io.IOException;
+
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.annotation.WebFilter;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
+
+import org.springframework.core.annotation.Order;
+
+import com.vdurmont.emoji.EmojiParser;
+
+@Order(1)
+//执行的顺序,值越小,越先执行
+@WebFilter(urlPatterns = "/*")
+public class EmojiEncodingFilter  implements Filter {
+
+	@Override
+	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
+		request = new HttpServletRequestWrapper((HttpServletRequest) request) {
+
+            @Override
+            public String getParameter(String name) {
+                // 参数名
+                // 返回值之前 先进行 Emoji 转化
+                return EmojiParser.parseToAliases(super.getParameter(name));
+            }
+
+            @Override
+            public String[] getParameterValues(String name) {
+                // 参数值
+                // 返回值之前 先进行 Emoji 转化
+                String[] values = super.getParameterValues(name);
+                if (values != null) {
+                    for (int i = 0; i < values.length; i++) {
+                        values[i] = EmojiParser.parseToAliases(values[i]);
+                    }
+                }
+                return values;
+            }
+
+        };
+
+        chain.doFilter(request, response);
+	}
+
+}

+ 0 - 1
mec-common/common-core/src/main/java/com/ym/mec/common/service/impl/RedisIdGeneratorService.java

@@ -1,7 +1,6 @@
 package com.ym.mec.common.service.impl;
 
 import com.google.common.base.Strings;
-import com.timevale.tgtext.text.au;
 import com.ym.mec.common.redis.service.RedisCache;
 import com.ym.mec.common.service.IdGeneratorService;
 

+ 0 - 5
mec-task/pom.xml

@@ -26,11 +26,6 @@
 		</dependency>
 		
 		<dependency>
-			<groupId>com.ym</groupId>
-			<artifactId>common-core</artifactId>
-		</dependency>
-
-		<dependency>
 			<groupId>org.quartz-scheduler</groupId>
 			<artifactId>quartz</artifactId>
 		</dependency>

+ 19 - 0
mec-task/src/main/java/com/ym/mec/task/jobs/CoursesGroupNoStudentsRemindTask.java

@@ -0,0 +1,19 @@
+package com.ym.mec.task.jobs;
+
+import com.ym.mec.task.TaskRemoteService;
+import com.ym.mec.task.core.BaseTask;
+import com.ym.mec.task.core.TaskException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class CoursesGroupNoStudentsRemindTask extends BaseTask {
+
+	@Autowired
+	private TaskRemoteService taskRemoteService;
+
+	@Override
+	public void execute() throws TaskException {
+		taskRemoteService.noStudentsCourseGroupRemind();
+	}
+}

+ 9 - 0
mec-web/src/main/java/com/ym/mec/web/controller/CourseReviewController.java

@@ -3,21 +3,30 @@ package com.ym.mec.web.controller;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.EmployeeDao;
+import com.ym.mec.biz.dal.dto.CourseReviewDto;
+import com.ym.mec.biz.dal.dto.MusicGroupStudentsDto;
 import com.ym.mec.biz.dal.entity.Employee;
 import com.ym.mec.biz.dal.page.CourseReviewQueryInfo;
+import com.ym.mec.biz.dal.page.MusicGroupStudentQueryInfo;
 import com.ym.mec.biz.service.CourseReviewService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.util.date.DateUtil;
+import com.ym.mec.util.excel.POIUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.servlet.http.HttpServletResponse;
 import java.util.Arrays;
+import java.util.Date;
 import java.util.List;
 
 @RequestMapping("courseReview")

+ 52 - 0
mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java

@@ -29,6 +29,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
 import java.math.BigDecimal;
 import java.util.*;
 import java.util.stream.Collectors;
@@ -68,6 +69,8 @@ public class ExportController extends BaseController {
     private SporadicChargeInfoService sporadicChargeInfoService;
     @Autowired
     private PracticeGroupDao practiceGroupDao;
+    @Autowired
+    private CourseReviewService courseReviewService;
 
     @ApiOperation(value = "导出老师课酬")
     @PostMapping("export/teacherSalary")
@@ -625,4 +628,53 @@ public class ExportController extends BaseController {
             e.printStackTrace();
         }
     }
+
+    @ApiOperation(value = "评论列表导出")
+    @RequestMapping("export/courseReviews")
+    @PreAuthorize("@pcs.hasPermissions('export/courseReviews')")
+    public void export(CourseReviewQueryInfo queryInfo, HttpServletResponse response) throws IOException {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (!sysUser.getIsSuperAdmin()) {
+            Employee employee = employeeDao.get(sysUser.getId());
+            queryInfo.setOrganId(employee.getOrganIdList());
+        }
+        queryInfo.setRows(99999);
+        PageInfo<CourseReviewDto> practiceGroupReviews = courseReviewService.findPracticeGroupReviews(queryInfo);
+        if(practiceGroupReviews.getTotal() <= 0){
+            response.setStatus(500);
+            response.setContentType("Content-Type: application/json;charset=UTF-8");
+            response.getOutputStream().write("{\"data\": null, \"code\": 500, \"status\": false, \"msg\": \"没有可导出的记录\"}".getBytes());
+            response.flushBuffer();
+            return;
+        }
+        try {
+            for (CourseReviewDto row : practiceGroupReviews.getRows()) {
+                row.setClassDateStr(DateUtil.dateToString(row.getClassDate(), "yyyy-MM-dd"));
+                if (row.getHandHomework() != null && row.getHandHomework() > 0) {
+                    row.setHandHomeworkStr("是");
+                } else {
+                    row.setHandHomeworkStr("否");
+                }
+                if (row.getHasLiaison() != null && row.getHasLiaison().equals("1")) {
+                    row.setHasLiaison("是");
+                } else {
+                    row.setHasLiaison("否");
+                }
+                if (row.getCreateTime() != null) {
+                    row.setCreateTimeStr(DateUtil.dateToString(row.getCreateTime(), "yyyy-MM-dd"));
+                }
+            }
+
+            String[] header = {"分部", "上课日期", "学生编号", "课程班名称", "老师", "教材内容", "发音", "节奏", "乐理", "曲目", "评价备注", "回访日期(布置作业)", "完成app双向沟通", "是否提交作业", "教务老师", "教务评价"};
+            String[] body = {"organName", "classDateStr", "studentId", "courseName", "teacherName", "teachingMaterial", "pronunciation", "tempo", "musicTheory", "song", "memo", "createTimeStr", "hasLiaison", "handHomeworkStr", "eduTeacherName", "courseReview"};
+            HSSFWorkbook workbook = POIUtil.exportExcel(header, body, practiceGroupReviews.getRows());
+            response.setContentType("application/octet-stream");
+            response.setHeader("Content-Disposition", "attachment;filename=lender-" + DateUtil.getDate(new Date()) + ".xls");
+            response.flushBuffer();
+            workbook.write(response.getOutputStream());
+            workbook.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
 }

+ 9 - 0
mec-web/src/main/java/com/ym/mec/web/controller/TaskController.java

@@ -53,6 +53,9 @@ public class TaskController extends BaseController {
 	@Autowired
 	private CourseReviewService courseReviewService;
 
+	@Autowired
+	private CoursesGroupService coursesGroupService;
+
 	@GetMapping("/refreshPaymentFeeStatus")
 	// 刷新付费状态
 	public void refreshPaymentFeeStatus() {
@@ -190,4 +193,10 @@ public class TaskController extends BaseController {
 		courseReviewService.pushNeedReview2Teacher();
 	}
 
+	//对外无学生课程组提醒
+	@GetMapping("/noStudentsCourseGroupRemind")
+	public void noStudentsCourseGroupRemind(){
+		coursesGroupService.noStudentsCourseGroupRemind();
+	}
+
 }

+ 6 - 0
pom.xml

@@ -183,6 +183,12 @@
 				<version>${google.zxing.version}</version>
 			</dependency>
 
+			<dependency>
+				<groupId>com.vdurmont</groupId>
+				<artifactId>emoji-java</artifactId>
+				<version>5.1.1</version>
+			</dependency>
+
 		</dependencies>
 	</dependencyManagement>