Pārlūkot izejas kodu

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentDao.java
#	mec-biz/src/main/resources/config/mybatis/StudentMapper.xml
周箭河 5 gadi atpakaļ
vecāks
revīzija
c5a34ad88c
36 mainītis faili ar 831 papildinājumiem un 315 dzēšanām
  1. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleDao.java
  2. 16 6
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleStudentPaymentDao.java
  3. 31 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleTeacherSalaryDao.java
  4. 4 16
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentDao.java
  5. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TeacherAttendanceDao.java
  6. 14 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TeacherSalaryComplaintsDao.java
  7. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseTeacherSalaryStatisticsDto.java
  8. 54 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentCourseTimesDto.java
  9. 44 5
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherCourseSalaryDetail4WebDto.java
  10. 3 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/MessageTypeEnum.java
  11. 32 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/TeacherSalaryConfirmStatus.java
  12. 20 0
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleTeacherSalaryService.java
  13. 8 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentService.java
  14. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/TeacherSalaryComplaintsService.java
  15. 69 7
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java
  16. 28 29
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentAttendanceServiceImpl.java
  17. 47 5
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServiceImpl.java
  18. 7 3
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherAttendanceServiceImpl.java
  19. 11 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherSalaryComplaintsServiceImpl.java
  20. 9 0
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  21. 18 0
      mec-biz/src/main/resources/config/mybatis/CourseScheduleStudentPaymentMapper.xml
  22. 46 5
      mec-biz/src/main/resources/config/mybatis/CourseScheduleTeacherSalaryMapper.xml
  23. 125 213
      mec-biz/src/main/resources/config/mybatis/StudentMapper.xml
  24. 1 1
      mec-biz/src/main/resources/config/mybatis/TeacherAttendanceMapper.xml
  25. 5 0
      mec-biz/src/main/resources/config/mybatis/TeacherSalaryComplaintsMapper.xml
  26. 4 0
      mec-client-api/src/main/java/com/ym/mec/task/TaskRemoteService.java
  27. 5 0
      mec-client-api/src/main/java/com/ym/mec/task/fallback/TaskRemoteServiceFallback.java
  28. 6 0
      mec-im/src/main/java/com/ym/controller/RoomController.java
  29. 46 3
      mec-im/src/main/java/com/ym/service/Impl/RoomServiceImpl.java
  30. 4 1
      mec-im/src/main/java/com/ym/service/RoomService.java
  31. 20 0
      mec-task/src/main/java/com/ym/mec/task/jobs/UpdateStudentOperatingTagTask.java
  32. 2 1
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherSalaryComplaintsController.java
  33. 37 5
      mec-web/src/main/java/com/ym/mec/web/controller/CourseScheduleTeacherSalaryController.java
  34. 78 4
      mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java
  35. 11 0
      mec-web/src/main/java/com/ym/mec/web/controller/TaskController.java
  36. 2 2
      mec-web/src/main/java/com/ym/mec/web/controller/TeacherSalaryComplaintsController.java

+ 12 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleDao.java

@@ -1431,4 +1431,16 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
      * @return
      */
     List<CourseGroupExportDto> getStudentCourseInfo(@Param("studentIds") Set<Integer> studentIds, @Param("groupType") GroupType groupType);
+
+    /**
+     * 获取上一次连堂课
+     * @param classGroupId
+     * @param startTime
+     * @param teacherId
+     * @return
+     */
+    CourseSchedule getLastCourse(@Param("classGroupId") Integer classGroupId,
+                                 @Param("startTime") String startTime,
+                                 @Param("teacherId") Integer teacherId,
+                                 @Param("continueCourseTime") String continueCourseTime);
 }

+ 16 - 6
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleStudentPaymentDao.java

@@ -1,19 +1,22 @@
 package com.ym.mec.biz.dal.dao;
 
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.ibatis.annotations.Param;
+
 import com.ym.mec.biz.dal.dto.BasicUserDto;
 import com.ym.mec.biz.dal.dto.Practice4ExercisesSituationDto;
 import com.ym.mec.biz.dal.dto.StudentAttendanceStatisticsResponse;
+import com.ym.mec.biz.dal.dto.StudentCourseTimesDto;
 import com.ym.mec.biz.dal.dto.VipGroupGiveCourseSortDto;
 import com.ym.mec.biz.dal.entity.CourseSchedule;
 import com.ym.mec.biz.dal.entity.CourseScheduleStudentPayment;
 import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.common.dal.BaseDAO;
-import org.apache.ibatis.annotations.Param;
-
-import java.math.BigDecimal;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
 
 public interface CourseScheduleStudentPaymentDao extends BaseDAO<Long, CourseScheduleStudentPayment> {
 
@@ -249,4 +252,11 @@ public interface CourseScheduleStudentPaymentDao extends BaseDAO<Long, CourseSch
                                                                         @Param("sunday")String sunday);
 
     Integer findNoPracticeStudentTeacherId(@Param("studentId") Integer studentId);
+    
+    /**
+     * 从指定时间开始查询学的线上可数
+     * @param startDate 指定的开始时间
+     * @return
+     */
+    List<StudentCourseTimesDto> queryStudentCourseTimesOfOnline(Date startDate);
 }

+ 31 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleTeacherSalaryDao.java

@@ -5,8 +5,10 @@ import com.ym.mec.biz.dal.entity.CourseSchedule;
 import com.ym.mec.biz.dal.entity.CourseScheduleTeacherSalary;
 import com.ym.mec.biz.dal.entity.TeacherSalaryModifyLog;
 import com.ym.mec.biz.dal.enums.GroupType;
+import com.ym.mec.biz.dal.enums.TeacherSalaryConfirmStatus;
 import com.ym.mec.common.dal.BaseDAO;
 import org.apache.ibatis.annotations.Param;
+
 import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
@@ -395,6 +397,15 @@ public interface CourseScheduleTeacherSalaryDao extends BaseDAO<Long, CourseSche
 											 @Param("month") String month);
 
 	/**
+	 * @describe 获取指定月份已结算的老师编号
+	 * @author Joburgess
+	 * @date 2020/4/16
+	 * @param month:
+	 * @return java.util.List<java.lang.Integer>
+	 */
+	List<Integer> findIsSettlementTeacherIdsWithMonth(@Param("month") String month);
+
+	/**
 	 * @describe 更新指定课酬的确认状态
 	 * @author Joburgess
 	 * @date 2020/4/15
@@ -403,7 +414,16 @@ public interface CourseScheduleTeacherSalaryDao extends BaseDAO<Long, CourseSche
 	 * @return int
 	 */
 	int updateTeacherSalaryConfirmStatus(@Param("ids") List<Long> ids,
-                                         @Param("confirmStatus") Integer confirmStatus);
+                                         @Param("confirmStatus") TeacherSalaryConfirmStatus confirmStatus);
+
+	/**
+	 * @describe 更新指定课酬的确认状态至已完成
+	 * @author Joburgess
+	 * @date 2020/4/16
+	 * @param ids:
+	 * @return int
+	 */
+	int updateTeacherSalaryConfirmStatusToComplied(@Param("ids") List<Long> ids);
 
 	/**
 	 * @describe 统计教师指定月份不同团体类型的课酬
@@ -431,4 +451,14 @@ public interface CourseScheduleTeacherSalaryDao extends BaseDAO<Long, CourseSche
 	 * @param modifyLog
 	 */
     void updateSalary(@Param("modifyLog") TeacherSalaryModifyLog modifyLog);
+
+    /**
+     * @describe 统计指定月份已开启课酬确认的数量
+     * @author Joburgess
+     * @date 2020/4/16
+     * @param month:
+     * @return int
+     */
+    int countOpenConfirmSalarysWithMonth(@Param("month") String month,
+										 @Param("confirmStatus") TeacherSalaryConfirmStatus confirmStatus);
 }

+ 4 - 16
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentDao.java

@@ -1,7 +1,6 @@
 package com.ym.mec.biz.dal.dao;
 
 import com.ym.mec.auth.api.entity.SysUser;
-import com.ym.mec.biz.dal.dto.Student4operating;
 import com.ym.mec.biz.dal.entity.Student;
 import org.apache.ibatis.annotations.Param;
 
@@ -14,20 +13,9 @@ public interface StudentDao extends com.ym.mec.common.dal.BaseDAO<Integer, Stude
 
 
     List<SysUser> findStudents(Map<String, Object> params);
-
     int countStudents(Map<String, Object> params);
-
-    /**
-     * 查询运营学生列表
-     * @param params
-     * @return
-     */
-    List<Student4operating> getOperatingStudents(Map<String, Object> params);
-
-    /**
-     * 查询运营学生总数
-     * @param params
-     * @return
-     */
-    Integer countOperatingStudents(Map<String, Object> params);
+    
+    List<Student> queryByOperatingTag(Integer operatingTag);
+    
+    int batchUpdate(@Param("studentList") List<Student> studentList);
 }

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

@@ -164,7 +164,7 @@ public interface TeacherAttendanceDao extends BaseDAO<Long, TeacherAttendance> {
 	 * 连堂课签到,签退
 	 * @param courseScheduleId
 	 */
-	void cuntinueCourseSign(@Param("courseScheduleId")Long courseScheduleId,@Param("startDateTime")Date startDateTime,@Param("endDateTime")Date endDateTime);
+	void cuntinueCourseSign(@Param("courseScheduleId")Long courseScheduleId,@Param("startDateTime")Date startDateTime,@Param("endDateTime")Date endDateTime,@Param("status")Integer status);
 
 	/**
 	 * 修改课程的签到老师

+ 14 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TeacherSalaryComplaintsDao.java

@@ -5,6 +5,8 @@ import com.ym.mec.biz.dal.enums.TeacherSalaryComplaintsStatusEnum;
 import com.ym.mec.common.dal.BaseDAO;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.List;
+
 public interface TeacherSalaryComplaintsDao extends BaseDAO<Long, TeacherSalaryComplaints> {
 
     /**
@@ -22,5 +24,16 @@ public interface TeacherSalaryComplaintsDao extends BaseDAO<Long, TeacherSalaryC
      * @param teacherId
      * @return
      */
-    Object repealComplaints(@Param("salarySettlementMonth") String salarySettlementMonth, @Param("teacherId") Integer teacherId);
+    Integer repealComplaints(@Param("salarySettlementMonth") String salarySettlementMonth, @Param("teacherId") Integer teacherId);
+
+    /**
+     * @describe 获取教师指定月份的申诉记录
+     * @author Joburgess
+     * @date 2020/4/16
+     * @param teacherId:
+     * @param month:
+     * @return java.util.List<com.ym.mec.biz.dal.entity.TeacherSalaryComplaints>
+     */
+    List<TeacherSalaryComplaints> findTeacherSalaryComplaintsWithMonth(@Param("teacherId") Integer teacherId,
+                                                                       @Param("month") String month);
 }

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

@@ -14,10 +14,20 @@ public class CourseTeacherSalaryStatisticsDto {
 
     private String month;
 
+    private Integer courseTimes;
+
     private BigDecimal totalActualSalary;
 
     private BigDecimal totalReduceSalary;
 
+    public Integer getCourseTimes() {
+        return courseTimes;
+    }
+
+    public void setCourseTimes(Integer courseTimes) {
+        this.courseTimes = courseTimes;
+    }
+
     public String getMonth() {
         return month;
     }

+ 54 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentCourseTimesDto.java

@@ -0,0 +1,54 @@
+package com.ym.mec.biz.dal.dto;
+
+public class StudentCourseTimesDto {
+
+	private Integer userId;
+	
+	private Integer totalCourseTimes;
+	
+	private Integer vipCourseTimes;
+	
+	private Integer practiceCourseTimes;
+	
+	private Integer freePracticeCourseTimes;
+
+	public Integer getUserId() {
+		return userId;
+	}
+
+	public void setUserId(Integer userId) {
+		this.userId = userId;
+	}
+
+	public Integer getTotalCourseTimes() {
+		return totalCourseTimes;
+	}
+
+	public void setTotalCourseTimes(Integer totalCourseTimes) {
+		this.totalCourseTimes = totalCourseTimes;
+	}
+
+	public Integer getVipCourseTimes() {
+		return vipCourseTimes;
+	}
+
+	public void setVipCourseTimes(Integer vipCourseTimes) {
+		this.vipCourseTimes = vipCourseTimes;
+	}
+
+	public Integer getPracticeCourseTimes() {
+		return practiceCourseTimes;
+	}
+
+	public void setPracticeCourseTimes(Integer practiceCourseTimes) {
+		this.practiceCourseTimes = practiceCourseTimes;
+	}
+
+	public Integer getFreePracticeCourseTimes() {
+		return freePracticeCourseTimes;
+	}
+
+	public void setFreePracticeCourseTimes(Integer freePracticeCourseTimes) {
+		this.freePracticeCourseTimes = freePracticeCourseTimes;
+	}
+}

+ 44 - 5
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherCourseSalaryDetail4WebDto.java

@@ -1,6 +1,7 @@
 package com.ym.mec.biz.dal.dto;
 
 import com.ym.mec.biz.dal.enums.GroupType;
+import com.ym.mec.biz.dal.enums.TeacherSalaryConfirmStatus;
 import com.ym.mec.biz.dal.enums.YesOrNoEnum;
 
 import java.math.BigDecimal;
@@ -24,6 +25,8 @@ public class TeacherCourseSalaryDetail4WebDto {
 
     private Date startClassTime;
 
+    private Date endClassTime;
+
     private String courseName;
 
     private Integer teacherId;
@@ -33,21 +36,57 @@ public class TeacherCourseSalaryDetail4WebDto {
     private java.util.Date signInTime;
 
     private YesOrNoEnum signInStatus;
-
-    private YesOrNoEnum signOutStatus;
+    private String signInStatusStr;
 
     private Date signOutTime;
 
+    private YesOrNoEnum signOutStatus;
+    private String signOutStatusStr;
+
     private java.math.BigDecimal expectSalary;
 
     private java.math.BigDecimal actualSalary;
 
     private BigDecimal reduceSalary;
 
-    private YesOrNoEnum confirmStatus;
+    private BigDecimal finalSalary;
+
+    private TeacherSalaryConfirmStatus confirmStatus;
 
     private String memo;
 
+    public String getSignInStatusStr() {
+        return signInStatusStr;
+    }
+
+    public void setSignInStatusStr(String signInStatusStr) {
+        this.signInStatusStr = signInStatusStr;
+    }
+
+    public String getSignOutStatusStr() {
+        return signOutStatusStr;
+    }
+
+    public void setSignOutStatusStr(String signOutStatusStr) {
+        this.signOutStatusStr = signOutStatusStr;
+    }
+
+    public BigDecimal getFinalSalary() {
+        return finalSalary;
+    }
+
+    public void setFinalSalary(BigDecimal finalSalary) {
+        this.finalSalary = finalSalary;
+    }
+
+    public Date getEndClassTime() {
+        return endClassTime;
+    }
+
+    public void setEndClassTime(Date endClassTime) {
+        this.endClassTime = endClassTime;
+    }
+
     public Long getId() {
         return id;
     }
@@ -176,11 +215,11 @@ public class TeacherCourseSalaryDetail4WebDto {
         this.reduceSalary = reduceSalary;
     }
 
-    public YesOrNoEnum getConfirmStatus() {
+    public TeacherSalaryConfirmStatus getConfirmStatus() {
         return confirmStatus;
     }
 
-    public void setConfirmStatus(YesOrNoEnum confirmStatus) {
+    public void setConfirmStatus(TeacherSalaryConfirmStatus confirmStatus) {
         this.confirmStatus = confirmStatus;
     }
 

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

@@ -135,7 +135,9 @@ public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
     BACKSTAGE_STUDENT_APPLY_QUIT_COURSE("BACKSTAGE_STUDENT_APPLY_QUIT_COURSE", "学员申请退课"),
     BACKSTAGE_STUDENT_APPLY_WITHDRAW("BACKSTAGE_STUDENT_APPLY_WITHDRAW", "学员申请提现"),
     PUSH_STUDY_REPORT("PUSH_STUDY_REPORT", "陪练报告"),
-    NEED_POST_STUDY_REPORT("NEED_POST_STUDY_REPORT", "新增待填写月报");
+    NEED_POST_STUDY_REPORT("NEED_POST_STUDY_REPORT", "新增待填写月报"),
+
+    TEACHER_SALARY_CONFIRM_PUSH("TEACHER_SALARY_CONFIRM_PUSH", "课酬确认");
 
 
     MessageTypeEnum(String code, String msg) {

+ 32 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/TeacherSalaryConfirmStatus.java

@@ -0,0 +1,32 @@
+package com.ym.mec.biz.dal.enums;
+
+import com.ym.mec.common.enums.BaseEnum;
+
+/**
+ * @Author Joburgess
+ * @Date 2020/4/16
+ */
+public enum  TeacherSalaryConfirmStatus implements BaseEnum<Integer, TeacherSalaryConfirmStatus> {
+    UNCONFIRMED(1, "待确认"),
+    CONFIRMED(2, "已确认"),
+    COMPLETED(3, "已完成");
+
+    private Integer code;
+
+    private String desc;
+
+    private TeacherSalaryConfirmStatus(Integer code, String desc) {
+        this.code = code;
+        this.desc = desc;
+    }
+
+    @Override
+    public Integer getCode() {
+        return code;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+
+}

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

@@ -99,6 +99,8 @@ public interface CourseScheduleTeacherSalaryService extends BaseService<Long, Co
      */
     List<Long> querySettlementScheduleId(String courseScheduleIds);
 
+
+
     /**
      * @describe 确定教师指定月份的课酬
      * @author Joburgess
@@ -136,4 +138,22 @@ public interface CourseScheduleTeacherSalaryService extends BaseService<Long, Co
      * @return java.util.Map<java.lang.String,java.lang.Object>
      */
     Map<String, Object> findTeacherYearSalarys(Integer teacherId, String year);
+
+    /**
+     * @describe 开启课酬确认
+     * @author Joburgess
+     * @date 2020/4/16
+     * @param month:
+     * @return void
+     */
+    void openSalaryConfirm(String month);
+
+    /**
+     * @describe 关闭课酬确认
+     * @author Joburgess
+     * @date 2020/4/16
+     * @param month:
+     * @return void
+     */
+    void closeSalaryConfirm(String month);
 }

+ 8 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/StudentService.java

@@ -1,5 +1,7 @@
 package com.ym.mec.biz.service;
 
+import java.text.ParseException;
+
 import com.ym.mec.biz.dal.entity.Student;
 import com.ym.mec.biz.dal.page.StudentQueryInfo;
 import com.ym.mec.common.page.PageInfo;
@@ -11,4 +13,10 @@ public interface StudentService extends BaseService<Integer, Student> {
 
     Long upSet(Student student);
 
+    /**
+     * 更新学生运营指标
+     * @return
+     * @throws ParseException 
+     */
+    boolean updateOperatingTag() throws ParseException;
 }

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

@@ -30,5 +30,5 @@ public interface TeacherSalaryComplaintsService extends BaseService<Long, Teache
 	 * @param salarySettlementMonth
 	 * @return
 	 */
-	Object repealComplaints(String salarySettlementMonth);
+	void repealComplaints(String salarySettlementMonth);
 }

+ 69 - 7
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java

@@ -14,6 +14,7 @@ import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
+import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
 import org.slf4j.Logger;
@@ -73,6 +74,10 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
     private VipGroupCategoryDao vipGroupCategoryDao;
     @Autowired
     private StudentAttendanceDao studentAttendanceDao;
+    @Autowired
+    private TeacherSalaryComplaintsDao teacherSalaryComplaintsDao;
+    @Autowired
+    private SysMessageService sysMessageService;
 
     private static final Logger LOGGER = LoggerFactory
             .getLogger(CourseScheduleTeacherSalaryServiceImpl.class);
@@ -828,6 +833,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public void confirmTeacherMonthSalary(Integer teacherId, String month) {
         if(Objects.isNull(month)){
             month=DateUtil.dateToString(DateUtil.addMonths(new Date(), -1), "yyyy-MM");
@@ -836,7 +842,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
         if(CollectionUtils.isEmpty(teacherSalaryIds)){
             return;
         }
-        courseScheduleTeacherSalaryDao.updateTeacherSalaryConfirmStatus(teacherSalaryIds,1);
+        courseScheduleTeacherSalaryDao.updateTeacherSalaryConfirmStatus(teacherSalaryIds,TeacherSalaryConfirmStatus.CONFIRMED);
     }
 
     @Override
@@ -851,6 +857,13 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
             pageInfo.setTotal(count);
             params.put("offset", pageInfo.getOffset());
             dataList = courseScheduleTeacherSalaryDao.findIsSettlementCourseSalarys(params);
+            for (TeacherCourseSalaryDetail4WebDto teacherCourseSalaryDetail4WebDto : dataList) {
+                if(Objects.nonNull(teacherCourseSalaryDetail4WebDto.getReduceSalary())){
+                    teacherCourseSalaryDetail4WebDto.setFinalSalary(teacherCourseSalaryDetail4WebDto.getActualSalary().multiply(teacherCourseSalaryDetail4WebDto.getReduceSalary()));
+                }else{
+                    teacherCourseSalaryDetail4WebDto.setFinalSalary(teacherCourseSalaryDetail4WebDto.getActualSalary());
+                }
+            }
         }
         if (count == 0) {
             dataList = new ArrayList<>();
@@ -867,14 +880,27 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
         PageInfo<TeacherCourseSalaryDetail4WebDto> pageInfo = findIsSettlementCourseSalarys(queryInfo4Web);
         Map<String, Object> result=new HashMap<>();
         result.put("pageInfo",pageInfo);
-        Map<String, BigDecimal> groupTypeSalaryMap = new HashMap<>();
+        List<CourseTeacherSalaryStatisticsDto> teacherGroupTypeSalary = new ArrayList<>();
         if(queryInfo4Web.getPage()<=1){
-            List<CourseTeacherSalaryStatisticsDto> teacherGroupTypeSalary = courseScheduleTeacherSalaryDao.getTeacherGroupTypeSalary(queryInfo4Web.getMonth(), queryInfo4Web.getTeacherId());
-            groupTypeSalaryMap = teacherGroupTypeSalary.stream()
-                    .collect(Collectors.toMap(c->c.getGroupType().getCode(),
-                            c -> Objects.isNull(c.getTotalReduceSalary()) ? c.getTotalActualSalary() : c.getTotalActualSalary().subtract(c.getTotalReduceSalary())));
+            teacherGroupTypeSalary = courseScheduleTeacherSalaryDao.getTeacherGroupTypeSalary(queryInfo4Web.getMonth(), queryInfo4Web.getTeacherId());
+        }
+        result.put("stat", teacherGroupTypeSalary);
+        if(!CollectionUtils.isEmpty(pageInfo.getRows())){
+            if(TeacherSalaryConfirmStatus.CONFIRMED.equals(pageInfo.getRows().get(0).getConfirmStatus())||
+                    TeacherSalaryConfirmStatus.COMPLETED.equals(pageInfo.getRows().get(0).getConfirmStatus())){
+                result.put("confirmStatus",1);
+            }else{
+                result.put("confirmStatus",0);
+            }
+        }else{
+            result.put("confirmStatus",0);
+        }
+        List<TeacherSalaryComplaints> teacherSalaryComplaintsWithMonth = teacherSalaryComplaintsDao.findTeacherSalaryComplaintsWithMonth(queryInfo4Web.getTeacherId(), queryInfo4Web.getMonth());
+        if(CollectionUtils.isEmpty(teacherSalaryComplaintsWithMonth)){
+            result.put("haveComplaints",0);
+        }else{
+            result.put("haveComplaints",1);
         }
-        result.put("stat", groupTypeSalaryMap);
         return result;
     }
 
@@ -896,4 +922,40 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
         result.put("totalSalary", totalSalary);
         return result;
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void openSalaryConfirm(String month) {
+        if(Objects.isNull(month)){
+            month=DateUtil.dateToString(DateUtil.addMonths(new Date(), -1), "yyyy-MM");
+        }
+        int i = courseScheduleTeacherSalaryDao.countOpenConfirmSalarysWithMonth(month,null);
+        if(i<=0){
+            throw new BizException("课酬确认已开启");
+        }
+        List<Long> teacherSalaryIds = courseScheduleTeacherSalaryDao.findTeacherSalaryIdsWithMonth(null, month);
+        if(CollectionUtils.isEmpty(teacherSalaryIds)){
+            return;
+        }
+        courseScheduleTeacherSalaryDao.updateTeacherSalaryConfirmStatus(teacherSalaryIds,TeacherSalaryConfirmStatus.UNCONFIRMED);
+        String notifyUrl="8?http://mteadev.dayaedu.com/#/remuneration?month=" + month;
+        String monthStr = DateUtil.dateToString(DateUtil.stringToDate(month, "yyyy-MM"),"yyyy年MM月");
+        List<Integer> teacherIds = courseScheduleTeacherSalaryDao.findIsSettlementTeacherIdsWithMonth(month);
+        Map<Integer, String> userMap = teacherIds.stream().collect(Collectors.toMap(Integer::valueOf, id->String.valueOf(id)));
+        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TEACHER_SALARY_CONFIRM_PUSH,
+                userMap, null, 0, notifyUrl, "TEACHER", monthStr);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void closeSalaryConfirm(String month) {
+        if(Objects.isNull(month)){
+            month=DateUtil.dateToString(DateUtil.addMonths(new Date(), -1), "yyyy-MM");
+        }
+        List<Long> teacherSalaryIds = courseScheduleTeacherSalaryDao.findTeacherSalaryIdsWithMonth(null, month);
+        if(CollectionUtils.isEmpty(teacherSalaryIds)){
+            return;
+        }
+        courseScheduleTeacherSalaryDao.updateTeacherSalaryConfirmStatusToComplied(teacherSalaryIds);
+    }
 }

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

@@ -500,7 +500,7 @@ public class StudentAttendanceServiceImpl extends BaseServiceImpl<Long, StudentA
 			if(DateUtil.minutesBetween(classEndDateTime,date) >= 0){
 				String continueCourseTime = sysConfigDao.findConfigValue(SysConfigService.ONLINE_CONTINUE_COURSE_TIME);
 				if(StringUtils.isEmpty(continueCourseTime)){
-					continueCourseTime = "10";
+					continueCourseTime = "3";
 				}
 				List<CourseSchedule> courseSchedules = new ArrayList<>();
 				CourseSchedule cs = courseSchedule;
@@ -530,35 +530,34 @@ public class StudentAttendanceServiceImpl extends BaseServiceImpl<Long, StudentA
 							//获取当前课程的单节课时长
 							int signClassMinutes = courseScheduleDao.getSingleClassMinutes(e.getId());
 							totalMinutes -= signClassMinutes;
-							if(totalMinutes >= 0){
-								//补充签到签退时间
-								courseClassDate = DateUtil.format(e.getClassDate(), DateUtil.DEFAULT_PATTERN);
-								courseStartDateTime = DateUtil.format(e.getStartClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
-								courseEndDateTime = DateUtil.format(e.getEndClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
-								Date startDateTime = DateUtil.stringToDate(courseClassDate + " " + courseStartDateTime, DateUtil.EXPANDED_DATE_TIME_FORMAT);
-								Date endDateTime = DateUtil.stringToDate(courseClassDate + " " + courseEndDateTime, DateUtil.EXPANDED_DATE_TIME_FORMAT);
-								StudentAttendance byStatusAndCourseScheduleId = studentAttendanceDao.findByStatusAndCourseScheduleId(userId, e.getId().intValue());
-								if(byStatusAndCourseScheduleId != null){
-									byStatusAndCourseScheduleId.setSignOutTime(date);
-									byStatusAndCourseScheduleId.setStatus(statusEnum);
-									byStatusAndCourseScheduleId.setUpdateTime(date);
-									studentAttendanceDao.update(byStatusAndCourseScheduleId);
-								}else {
-                                    byStatusAndCourseScheduleId = new StudentAttendance();
-									byStatusAndCourseScheduleId.setSignOutTime(endDateTime);
-									byStatusAndCourseScheduleId.setStatus(statusEnum);
-									byStatusAndCourseScheduleId.setSignInTime(startDateTime);
-									byStatusAndCourseScheduleId.setUpdateTime(date);
-									byStatusAndCourseScheduleId.setUserId(userId);
-									byStatusAndCourseScheduleId.setTeacherId(courseSchedule.getActualTeacherId());
-									byStatusAndCourseScheduleId.setClassGroupId(e.getClassGroupId());
-									byStatusAndCourseScheduleId.setCourseScheduleId(e.getId());
-                                    byStatusAndCourseScheduleId.setMusicGroupId(e.getMusicGroupId());
-                                    byStatusAndCourseScheduleId.setGroupType(e.getGroupType());
-									byStatusAndCourseScheduleId.setCurrentClassTimes(classGroup.getCurrentClassTimes() + 1);
-									studentAttendanceDao.insert(byStatusAndCourseScheduleId);
-								}
+							//补充签到签退时间
+							courseClassDate = DateUtil.format(e.getClassDate(), DateUtil.DEFAULT_PATTERN);
+							courseStartDateTime = DateUtil.format(e.getStartClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
+							courseEndDateTime = DateUtil.format(e.getEndClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
+							Date startDateTime = DateUtil.stringToDate(courseClassDate + " " + courseStartDateTime, DateUtil.EXPANDED_DATE_TIME_FORMAT);
+							Date endDateTime = DateUtil.stringToDate(courseClassDate + " " + courseEndDateTime, DateUtil.EXPANDED_DATE_TIME_FORMAT);
+							StudentAttendance byStatusAndCourseScheduleId = studentAttendanceDao.findByStatusAndCourseScheduleId(userId, e.getId().intValue());
+							if(byStatusAndCourseScheduleId != null){
+								byStatusAndCourseScheduleId.setSignOutTime(date);
+								byStatusAndCourseScheduleId.setStatus(statusEnum);
+								byStatusAndCourseScheduleId.setUpdateTime(date);
+								studentAttendanceDao.update(byStatusAndCourseScheduleId);
 							}else {
+								byStatusAndCourseScheduleId = new StudentAttendance();
+								byStatusAndCourseScheduleId.setSignOutTime(endDateTime);
+								byStatusAndCourseScheduleId.setStatus(statusEnum);
+								byStatusAndCourseScheduleId.setSignInTime(startDateTime);
+								byStatusAndCourseScheduleId.setUpdateTime(date);
+								byStatusAndCourseScheduleId.setUserId(userId);
+								byStatusAndCourseScheduleId.setTeacherId(courseSchedule.getActualTeacherId());
+								byStatusAndCourseScheduleId.setClassGroupId(e.getClassGroupId());
+								byStatusAndCourseScheduleId.setCourseScheduleId(e.getId());
+								byStatusAndCourseScheduleId.setMusicGroupId(e.getMusicGroupId());
+								byStatusAndCourseScheduleId.setGroupType(e.getGroupType());
+								byStatusAndCourseScheduleId.setCurrentClassTimes(classGroup.getCurrentClassTimes() + 1);
+								studentAttendanceDao.insert(byStatusAndCourseScheduleId);
+							}
+							if(totalMinutes < 0){
 								break;
 							}
 						}

+ 47 - 5
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServiceImpl.java

@@ -1,6 +1,21 @@
 package com.ym.mec.biz.service.impl;
 
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.ym.mec.biz.dal.dao.CourseScheduleStudentPaymentDao;
 import com.ym.mec.biz.dal.dao.StudentDao;
+import com.ym.mec.biz.dal.dto.StudentCourseTimesDto;
 import com.ym.mec.biz.dal.entity.Student;
 import com.ym.mec.biz.dal.page.StudentQueryInfo;
 import com.ym.mec.biz.service.StudentService;
@@ -8,17 +23,15 @@ import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.util.collection.MapUtil;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.util.*;
 
 @Service
 public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implements StudentService {
 
 	@Autowired
 	private StudentDao studentDao;
+	
+	@Autowired
+	private CourseScheduleStudentPaymentDao courseScheduleStudentPaymentDao;
 
 	@Override
 	public BaseDAO<Integer, Student> getDAO() {
@@ -56,4 +69,33 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
 			return student.getUserId().longValue();
 		}
 	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public boolean updateOperatingTag() throws ParseException {
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+		Date date = sdf.parse("2020-02-08");
+		List<StudentCourseTimesDto> studentCourseTimesDtoList = courseScheduleStudentPaymentDao.queryStudentCourseTimesOfOnline(date);
+		Map<Integer,StudentCourseTimesDto> map = studentCourseTimesDtoList.stream().collect(Collectors.toMap(StudentCourseTimesDto::getUserId, s -> s));
+		//查询服务指标为0的用户
+		List<Student> studentList = studentDao.queryByOperatingTag(0);
+		
+		List<Student> updateStudentList = new ArrayList<Student>();
+		StudentCourseTimesDto dto = null;
+		for(Student s : studentList){
+			dto = map.get(s.getUserId());
+			if(dto != null){
+				if(dto.getTotalCourseTimes() != dto.getFreePracticeCourseTimes()){
+					s.setOperatingTag(1);
+					updateStudentList.add(s);
+				}
+			}
+		}
+		
+		if(updateStudentList.size() > 0){
+			studentDao.batchUpdate(updateStudentList);
+		}
+		
+		return true;
+	}
 }

+ 7 - 3
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherAttendanceServiceImpl.java

@@ -38,8 +38,6 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 	@Autowired
 	private CourseHomeworkService courseHomeworkService;
 	@Autowired
-	private StudentAttendanceDao studentAttendanceDao;
-	@Autowired
 	private StudentCourseHomeworkDao studentCourseHomeworkDao;
 	@Autowired
 	private SysUserFeignService sysUserFeignService;
@@ -348,8 +346,14 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 								courseEndDateTime = DateUtil.format(e.getEndClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
 								Date startDateTime = DateUtil.stringToDate(courseClassDate + " " + courseStartDateTime, DateUtil.EXPANDED_DATE_TIME_FORMAT);
 								Date endDateTime = DateUtil.stringToDate(courseClassDate + " " + courseEndDateTime, DateUtil.EXPANDED_DATE_TIME_FORMAT);
-								teacherAttendanceDao.cuntinueCourseSign(e.getId(),startDateTime,endDateTime);
+								teacherAttendanceDao.cuntinueCourseSign(e.getId(),startDateTime,endDateTime,1);
 							}else {
+								courseClassDate = DateUtil.format(e.getClassDate(), DateUtil.DEFAULT_PATTERN);
+								courseStartDateTime = DateUtil.format(e.getStartClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
+								courseEndDateTime = DateUtil.format(e.getEndClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
+								Date startDateTime = DateUtil.stringToDate(courseClassDate + " " + courseStartDateTime, DateUtil.EXPANDED_DATE_TIME_FORMAT);
+								Date endDateTime = DateUtil.stringToDate(courseClassDate + " " + courseEndDateTime, DateUtil.EXPANDED_DATE_TIME_FORMAT);
+								teacherAttendanceDao.cuntinueCourseSign(e.getId(),startDateTime,endDateTime,0);
 								break;
 							}
 						}

+ 11 - 4
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherSalaryComplaintsServiceImpl.java

@@ -63,14 +63,21 @@ public class TeacherSalaryComplaintsServiceImpl extends BaseServiceImpl<Long, Te
 	@Transactional(rollbackFor = Exception.class)
 	public synchronized Object add(TeacherSalaryComplaints complaints) {
 		String settlementMonth = complaints.getSalarySettlementMonth();
-		Integer teacherId = complaints.getTeacherId();
-		if(StringUtils.isEmpty(settlementMonth) || teacherId == null){
+		String reason = complaints.getReason();
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		if (sysUser == null) {
+			throw new BizException("用户信息获取失败");
+		}
+		Integer teacherId = sysUser.getId();
+		if(StringUtils.isEmpty(settlementMonth) || StringUtils.isEmpty(reason)){
 			throw new BizException("数据提交失败");
 		}
 		TeacherSalaryComplaints salaryComplaints = teacherSalaryComplaintsDao.findByMonthAndTeacherId(settlementMonth,teacherId,PENDING);
 		if(salaryComplaints != null){
 			throw new BizException("申述已提交");
 		}
+		complaints.setTeacherId(teacherId);
+		complaints.setStatusEnum(PENDING);
 		return teacherSalaryComplaintsDao.insert(complaints);
 	}
 
@@ -84,11 +91,11 @@ public class TeacherSalaryComplaintsServiceImpl extends BaseServiceImpl<Long, Te
 	}
 
 	@Override
-	public Object repealComplaints(String salarySettlementMonth) {
+	public void repealComplaints(String salarySettlementMonth) {
 		SysUser sysUser = sysUserFeignService.queryUserInfo();
 		if (sysUser == null) {
 			throw new BizException("用户信息获取失败");
 		}
-		return teacherSalaryComplaintsDao.repealComplaints(salarySettlementMonth,sysUser.getId());
+		teacherSalaryComplaintsDao.repealComplaints(salarySettlementMonth,sysUser.getId());
 	}
 }

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

@@ -2955,5 +2955,14 @@
         AND (cs.del_flag_ IS NULL OR cs.del_flag_ =0)
         GROUP BY cssp.user_id_;
     </select>
+    <select id="getLastCourse" resultMap="CourseSchedule">
+        SELECT cs.* FROM course_schedule cs
+        WHERE cs.class_group_id_ = #{classGroupId}
+        AND TIMESTAMPDIFF(MINUTE, CONCAT(cs.class_date_," ",cs.end_class_time_),#{startTime}) &lt;= #{continueCourseTime}
+        AND TIMESTAMPDIFF(MINUTE, CONCAT(cs.class_date_," ",cs.end_class_time_),#{startTime}) >= 0
+        AND cs.actual_teacher_id_ = #{teacherId} AND CONCAT(cs.class_date_," ",cs.end_class_time_) > NOW()
+        ORDER BY cs.class_date_ DESC,cs.end_class_time_ DESC
+        LIMIT 1
+    </select>
 
 </mapper>

+ 18 - 0
mec-biz/src/main/resources/config/mybatis/CourseScheduleStudentPaymentMapper.xml

@@ -20,6 +20,14 @@
 		<result column="class_group_id_" property="classGroupId" />
 	</resultMap>
 	
+	<resultMap type="com.ym.mec.biz.dal.dto.StudentCourseTimesDto" id="studentCourseTimesDto">
+		<result column="user_id_" property="userId" />
+        <result column="totalTimes" property="totalCourseTimes"/>
+		<result column="vipTimes" property="vipCourseTimes" />
+		<result column="practiceTmes" property="practiceCourseTimes" />
+		<result column="freePracticeTimes" property="freePracticeCourseTimes" />
+	</resultMap>
+	
 	<!-- 根据主键查询一条记录 -->
 	<select id="get" resultMap="CourseScheduleStudentPayment" >
 		SELECT * FROM course_schedule_student_payment WHERE id_ = #{id} 
@@ -373,4 +381,14 @@
 	<delete id="deleteByGroup">
 		DELETE FROM course_schedule_student_payment WHERE music_group_id_=#{groupId} AND group_type_=#{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
 	</delete>
+	
+	<select id="queryStudentCourseTimesOfOnline" resultMap="studentCourseTimesDto">
+		SELECT cssp.`user_id_`,count(*) totalTimes, 
+		sum(case when (pg.buy_months_ > 0) then 1 ELSE 0 END) practiceTmes,
+		sum(case when (pg.buy_months_ IS NULL AND cssp.`group_type_` = 'PRACTICE' ) then 1 ELSE 0 END) freePracticeTimes
+		FROM course_schedule_student_payment cssp LEFT JOIN course_schedule cs on cssp.course_schedule_id_ = cs.id_
+		LEFT JOIN practice_group pg ON pg.id_ = cs.music_group_id_ AND cs.group_type_ = 'PRACTICE'
+		WHERE cs.`teach_mode_` = 'ONLINE' AND cs.`class_date_` &gt;= #{startDate}
+		GROUP BY cssp.`user_id_`
+	</select>
 </mapper>

+ 46 - 5
mec-biz/src/main/resources/config/mybatis/CourseScheduleTeacherSalaryMapper.xml

@@ -449,12 +449,20 @@
 		WHERE course_schedule_id_ = #{modifyLog.courseScheduleId} AND user_id_ = #{modifyLog.teacherId}
 	</update>
 	<update id="updateTeacherSalaryConfirmStatus">
-		UPDATE course_schedule_teacher_salary SET confirm_status_=#{confirmStatus}
+		UPDATE course_schedule_teacher_salary SET confirm_status_=#{confirmStatus, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
 		WHERE id_ IN
 		<foreach collection="ids" item="id" open="(" close=")" separator=",">
 			#{id}
 		</foreach>
 	</update>
+	<update id="updateTeacherSalaryConfirmStatusToComplied">
+		UPDATE course_schedule_teacher_salary SET confirm_status_=3
+		WHERE confirm_status_!=2
+		AND id_ IN
+		<foreach collection="ids" item="id" open="(" close=")" separator=",">
+			#{id}
+		</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}
@@ -728,6 +736,7 @@
 		<result property="groupType" column="group_type_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
 		<result property="courseScheduleId" column="course_schedule_id_" />
 		<result property="startClassTime" column="classes_start_time_" />
+		<result property="endClassTime" column="classes_end_time_" />
 		<result property="courseName" column="course_name_" />
 		<result property="teacherId" column="teacher_id_" />
 		<result property="teacherName" column="teacher_name_" />
@@ -762,7 +771,7 @@
 				AND ta.sign_out_status_=#{signOutStatus}
 			</if>
 			<if test="confirmStatus!=null">
-				AND csts.reduce_salary=#{confirmStatus}
+				AND csts.confirm_status_=#{confirmStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
 			</if>
 			<if test="groupName!=null">
 				AND cs.name_ LIKE CONCAT('%', #{groupName}, '%')
@@ -774,7 +783,7 @@
 				AND FIND_IN_SET(t.organ_id_,#{organIdList})
 			</if>
 			<if test="search!=null">
-				AND (csts.user_id_=#{search} OR su.real_name_ LIKE CONCAT('%', #{search}, '%'))
+				AND (csts.course_schedule_id_=#{search} OR cs.name_ LIKE CONCAT('%', #{search}, '%'))
 			</if>
 		</where>
 	</sql>
@@ -785,7 +794,8 @@
 			cs.id_ course_schedule_id_,
 			cs.group_type_,
 			CONCAT(cs.class_date_, ' ', cs.start_class_time_) classes_start_time_,
-			cs.name_,
+			CONCAT(cs.class_date_, ' ', cs.end_class_time_) classes_end_time_,
+			cs.name_ course_name_,
 			csts.user_id_ teacher_id_,
 			su.real_name_ teacher_name_,
 			t.organ_id_,
@@ -828,6 +838,7 @@
 	<resultMap id="CourseTeacherSalaryStatisticsDto" type="com.ym.mec.biz.dal.dto.CourseTeacherSalaryStatisticsDto">
 		<result property="groupType" column="group_type_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
 		<result property="month" column="month_"/>
+		<result property="courseTimes" column="course_times_"/>
 		<result property="totalActualSalary" column="total_actual_salary_"/>
 		<result property="totalReduceSalary" column="total_reduce_salary_"/>
 	</resultMap>
@@ -835,6 +846,7 @@
     <select id="getTeacherGroupTypeSalary" resultMap="CourseTeacherSalaryStatisticsDto">
 		SELECT
 			csts.group_type_,
+			COUNT(DISTINCT csts.course_schedule_id_) course_times_,
 			SUM(actual_salary_) total_actual_salary_,
 			SUM(reduce_salary) total_reduce_salary_
 		FROM
@@ -871,8 +883,37 @@
 		WHERE
 			( cs.del_flag_ IS NULL OR cs.del_flag_ = 0 )
 			AND csts.settlement_time_ IS NOT NULL
-			AND csts.user_id_ = #{teacherId}
+			<if test="teacherId!=null">
+				AND csts.user_id_ = #{teacherId}
+			</if>
 			AND DATE_FORMAT( cs.class_date_, '%Y-%m' ) = #{month}
 	</select>
+    <select id="findIsSettlementTeacherIdsWithMonth" resultType="int">
+        SELECT
+          DISTINCT csts.user_id_
+        FROM
+        course_schedule_teacher_salary csts
+        LEFT JOIN course_schedule cs ON csts.course_schedule_id_ = cs.id_
+        WHERE
+        ( cs.del_flag_ IS NULL OR cs.del_flag_ = 0 )
+        AND csts.settlement_time_ IS NOT NULL
+        AND DATE_FORMAT( cs.class_date_, '%Y-%m' ) = #{month}
+    </select>
 
+	<select id="countOpenConfirmSalarysWithMonth" resultType="int">
+		SELECT
+			COUNT(csts.id_)
+		FROM
+			course_schedule_teacher_salary csts
+			LEFT JOIN course_schedule cs ON cs.id_ = csts.course_schedule_id_
+		WHERE
+			DATE_FORMAT( cs.class_date_, '%Y-%m' ) = #{month}
+			AND csts.settlement_time_ IS NOT NULL
+			<if test="confirmStatus!=null">
+				AND csts.confirm_status_=#{confirmStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+			</if>
+			<if test="confirmStatus==null">
+				AND csts.confirm_status_ IS NULL
+			</if>
+	</select>
 </mapper>

+ 125 - 213
mec-biz/src/main/resources/config/mybatis/StudentMapper.xml

@@ -5,220 +5,132 @@
 不要修改此文件。所有改动将在下次重新自动生成时丢失。
 -->
 <mapper namespace="com.ym.mec.biz.dal.dao.StudentDao">
+	
+	<resultMap type="com.ym.mec.biz.dal.entity.Student" id="Student">
+		<result column="user_id_" property="userId" />
+		<result column="subject_id_list_" property="subjectIdList" />
+		<result column="service_tag_" property="serviceTag" />
+		<result column="operating_tag_" property="operatingTag" />
+		<result column="create_time_" property="createTime" />
+		<result column="update_time_" property="updateTime" />
+	</resultMap>
 
-    <resultMap type="com.ym.mec.biz.dal.entity.Student" id="Student">
-        <result column="user_id_" property="userId"/>
-        <result column="subject_id_list_" property="subjectIdList"/>
-        <result column="service_tag_" property="serviceTag"/>
-        <result column="operating_tag_" property="operatingTag"/>
-        <result column="create_time_" property="createTime"/>
-        <result column="update_time_" property="updateTime"/>
-    </resultMap>
+	<!-- 根据主键查询一条记录 -->
+	<select id="get" resultMap="Student">
+		SELECT * FROM student WHERE user_id_ = #{id}
+	</select>
 
-    <!-- 根据主键查询一条记录 -->
-    <select id="get" resultMap="Student">
-        SELECT *
-        FROM student
-        WHERE user_id_ = #{id}
-    </select>
+	<!-- 全查询 -->
+	<select id="findAll" resultMap="Student">
+		SELECT * FROM student
+	</select>
 
-    <!-- 全查询 -->
-    <select id="findAll" resultMap="Student">
-        SELECT *
-        FROM student
-    </select>
-
-    <select id="lockUser" resultType="int" useCache="false" flushCache="true">
-        SELECT id_
-        FROM sys_user
-        WHERE id_ = #{userId} FOR
-        UPDATE
-    </select>
-
-    <!-- 向数据库增加一条记录 -->
-    <insert id="insert" parameterType="com.ym.mec.biz.dal.entity.Student" useGeneratedKeys="true" keyColumn="id"
-            keyProperty="id">
-        INSERT INTO student (user_id_,subject_id_list_,
-        <if test="serviceTag != null">
-            service_tag_,
-        </if>
-        <if test="operatingTag != null">
-            operating_tag_,
-        </if>
-        create_time_,update_time_)
-        VALUES
-        (#{userId},#{subjectIdList},
-        <if test="serviceTag != null">
-            #{serviceTag},
-        </if>
-        <if test="operatingTag != null">
-            #{operatingTag},
-        </if>
-        NOW(),NOW())
-    </insert>
-
-    <update id="update" parameterType="com.ym.mec.biz.dal.entity.Student">
-        UPDATE student
-        <set>
-            <if test="subjectIdList != null">
-                subject_id_list_ = #{subjectIdList},
-            </if>
-            <if test="serviceTag != null">
-                service_tag_ = #{serviceTag},
-            </if>
-            <if test="operatingTag != null">
-                operating_tag_ = #{operatingTag},
-            </if>
-            <if test="updateTime != null">
-                update_time_ = #{updateTime},
-            </if>
-            <if test="updateTime == null">
-                update_time_ = NOW()
-            </if>
-        </set>
-        WHERE user_id_ = #{userId}
-    </update>
-
-    <!-- 分页查询 -->
-    <select id="queryPage" resultMap="Student" parameterType="map">
-        SELECT * FROM student
-        <include refid="global.limit"/>
-    </select>
-
-    <!-- 查询当前表的总记录数 -->
-    <select id="queryCount" resultType="int">
-        SELECT COUNT(*)
-        FROM student
-    </select>
-    <select id="findStudents" resultMap="com.ym.mec.biz.dal.dao.TeacherDao.SysUser">
-        SELECT id_, username_, phone_,avatar_ FROM sys_user
-        <include refid="studentQueryCondition"/>
-        ORDER BY id_
-        <include refid="global.limit"/>
-    </select>
-    <select id="countStudents" resultType="int">
-        SELECT COUNT(id_) FROM sys_user
-        <include refid="studentQueryCondition"/>
-    </select>
-    <sql id="studentQueryCondition">
-        <where>
-            <if test="organIdList!=null">
-                organ_id_ IN
-                <foreach collection="organIdList" item="organId" open="(" close=")" separator=",">
-                    #{organId}
-                </foreach>
-            </if>
-            <if test="search!=null">
-                AND (username_ LIKE CONCAT('%', #{search}, '%') OR phone_ LIKE CONCAT('%', #{search}, '%'))
-            </if>
-            AND FIND_IN_SET("STUDENT", user_type_)
-        </where>
-    </sql>
-
-    <resultMap id="student4operating" type="com.ym.mec.biz.dal.dto.Student4operating">
-        <result column="organ_name_" property="organName"/>
-        <result column="organ_id_" property="organId"/>
-        <result column="student_name_" property="studentName"/>
-        <result column="student_id_" property="studentId"/>
-        <result column="teacher_id_" property="teacherId"/>
-        <result column="teacher_name_" property="teacherName"/>
-        <result column="operating_tag_" property="operatingTag"/>
-        <result column="vip_times_" property="vipTimes"/>
-        <result column="free_practice_times_" property="freePracticeTimes"/>
-        <result column="buy_practice_times_" property="buyPracticeTimes"/>
-    </resultMap>
-
-    <select id="getOperatingStudents" resultMap="student4operating">
-        SELECT su.organ_id_,
-               o.name_ organ_name_,
-               su.username_   student_name_,
-               s.user_id_     student_id_,
-               tsu.id_        teacher_id_,
-               tsu.real_name_ teacher_name_,
-               s.operating_tag_,
-               a.vip_times_,
-               a.buy_practice_times_,
-               p.free_practice_times_
-        FROM student s
-                 LEFT JOIN sys_user su ON s.user_id_ = su.id_
-                 LEFT JOIN sys_user tsu ON tsu.id_ = s.teacher_id_
-                 LEFT JOIN organization o ON o.id_ = su.organ_id_
-                 LEFT JOIN (
-            SELECT s.user_id_,
-                   SUM(case when (cs.group_type_ = 'VIP') then 1 ELSE 0 END) vip_times_,
-                   SUM(case when (pg.buy_months_ > 0) then 1 ELSE 0 END)     buy_practice_times_
-            FROM student s
-                     LEFT JOIN course_schedule_student_payment cssp ON cssp.user_id_ = s.user_id_
-                     LEFT JOIN course_schedule cs ON cs.id_ = cssp.course_schedule_id_
-                     LEFT JOIN practice_group pg ON pg.`id_` = cs.`music_group_id_` AND cs.`group_type_` = 'PRACTICE'
-            WHERE cs.status_ = 'NOT_START'
-            GROUP BY s.user_id_
-        ) a on a.user_id_ = s.user_id_
-                 LEFT JOIN (
-            SELECT student_id_, count(id_) free_practice_times_
-            FROM practice_group
-            WHERE buy_months_ IS NULL
-            GROUP BY student_id_
-        ) p ON p.student_id_ = s.user_id_
-        <include refid="student4OperatingQueryCondition"/>
-        ORDER BY s.user_id_
-        <include refid="global.limit"/>
-    </select>
-
-    <select id="countOperatingStudents" resultType="int">
-        SELECT COUNT(s.user_id_) FROM student s
-        LEFT JOIN sys_user su ON s.user_id_ = su.id_
-        LEFT JOIN sys_user tsu ON tsu.id_ = s.teacher_id_
-        LEFT JOIN (
-        SELECT s.user_id_,
-        SUM(case when (cs.group_type_ = 'VIP') then 1 ELSE 0 END) vip_times_,
-        SUM(case when (pg.buy_months_ > 0) then 1 ELSE 0 END)     buy_practice_times_
-        FROM student s
-        LEFT JOIN course_schedule_student_payment cssp ON cssp.user_id_ = s.user_id_
-        LEFT JOIN course_schedule cs ON cs.id_ = cssp.course_schedule_id_
-        LEFT JOIN practice_group pg ON pg.`id_` = cs.`music_group_id_` AND cs.`group_type_` = 'PRACTICE'
-        WHERE cs.status_ = 'NOT_START'
-        GROUP BY s.user_id_
-        ) a on a.user_id_ = s.user_id_
-        LEFT JOIN (
-        SELECT student_id_, count(id_) free_practice_times_
-        FROM practice_group
-        WHERE buy_months_ IS NULL
-        GROUP BY student_id_
-        ) p ON p.student_id_ = s.user_id_
-
-        <include refid="student4OperatingQueryCondition"/>
-    </select>
-
-    <sql id="student4OperatingQueryCondition">
-        <where>
-            <if test="organId != null and organId != ''">
-                AND FIND_IN_SET(su.organ_id_,#{organId})
-            </if>
-            <if test="teacherId!=null">
-                AND s.teacher_id_ = #{teacherId}
-            </if>
-            <if test="operatingTag !=null">
-                AND s.operating_tag_ = #{operatingTag}
-            </if>
-            <if test='hasVip != null and hasVip.toString()=="1".toString()'>
-                AND a.vip_times_ >=1
-            </if>
-            <if test='hasVip != null and hasVip.toString()=="0".toString()'>
-                AND (a.vip_times_ =0 OR a.vip_times_ IS NULL)
-            </if>
-            <if test='HasFreePractice != null and HasFreePractice.toString()=="1".toString()'>
-                AND p.free_practice_times_ >=1
-            </if>
-            <if test='HasFreePractice != null and HasFreePractice.toString()=="0".toString()'>
-                AND (p.free_practice_times_ =0 OR p.free_practice_times_ IS NULL)
-            </if>
-            <if test='HasBuyPractice != null and HasBuyPractice.toString()=="1".toString()'>
-                AND a.buy_practice_times_ >=1
-            </if>
-            <if test='HasBuyPractice != null and HasBuyPractice.toString()=="0".toString()'>
-                AND (a.buy_practice_times_ =0 OR a.buy_practice_times_ IS NULL)
-            </if>
-        </where>
-    </sql>
+	<select id="lockUser" resultType="int" useCache="false" flushCache="true">
+		SELECT id_ FROM sys_user WHERE id_=#{userId} FOR UPDATE
+	</select>
+	
+	<!-- 向数据库增加一条记录 -->
+	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.Student" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
+		INSERT INTO student (user_id_,subject_id_list_,
+		<if test="serviceTag != null">
+			service_tag_,
+		</if>
+		<if test="operatingTag != null">
+			operating_tag_,
+		</if>
+		create_time_,update_time_)
+		VALUES
+		(#{userId},#{subjectIdList},
+		<if test="serviceTag != null">
+			#{serviceTag},
+		</if>
+		<if test="operatingTag != null">
+			#{operatingTag},
+		</if>
+		NOW(),NOW())
+	</insert>
+	
+	<update id="update" parameterType="com.ym.mec.biz.dal.entity.Student">
+		UPDATE student
+		<set>
+			<if test="subjectIdList != null">
+				subject_id_list_ = #{subjectIdList},
+			</if>
+			<if test="serviceTag != null">
+				service_tag_ = #{serviceTag},
+			</if>
+			<if test="operatingTag != null">
+				operating_tag_ = #{operatingTag},
+			</if>
+			<if test="updateTime != null">
+				update_time_ = #{updateTime},
+			</if>
+			<if test="updateTime == null">
+				update_time_ = NOW()
+			</if>
+		</set>
+		WHERE user_id_ = #{userId}
+	</update>
+	
+	<!-- 分页查询 -->
+	<select id="queryPage" resultMap="Student" parameterType="map">
+		SELECT * FROM student <include refid="global.limit"/>
+	</select>
+	
+	<!-- 查询当前表的总记录数 -->
+	<select id="queryCount" resultType="int">
+		SELECT COUNT(*) FROM student
+	</select>
+	<select id="findStudents" resultMap="com.ym.mec.biz.dal.dao.TeacherDao.SysUser">
+		SELECT id_, username_, phone_,avatar_ FROM sys_user
+		<include refid="studentQueryCondition"/>
+		ORDER BY id_
+		<include refid="global.limit"/>
+	</select>
+	<select id="countStudents" resultType="int">
+		SELECT COUNT(id_) FROM sys_user
+		<include refid="studentQueryCondition"/>
+	</select>
+	<sql id="studentQueryCondition">
+		<where>
+			<if test="organIdList!=null">
+				organ_id_ IN
+				<foreach collection="organIdList" item="organId" open="(" close=")" separator=",">
+					#{organId}
+				</foreach>
+			</if>
+			<if test="search!=null">
+				AND (username_ LIKE CONCAT('%', #{search}, '%') OR phone_ LIKE CONCAT('%', #{search}, '%'))
+			</if>
+			AND FIND_IN_SET("STUDENT", user_type_)
+		</where>
+	</sql>
+	
+	<select id="queryByOperatingTag" resultMap="Student">
+		SELECT * FROM student WHERE operating_tag_ = #{operatingTag}
+	</select>
+	
+	<update id="batchUpdate" parameterType="java.util.List">
+    	<foreach collection="studentList" item="item" index="index" open="" close="" separator=";">
+			UPDATE student
+			<set>
+				<if test="item.subjectIdList != null">
+					subject_id_list_ = #{item.subjectIdList},
+				</if>
+				<if test="item.serviceTag != null">
+					service_tag_ = #{item.serviceTag},
+				</if>
+				<if test="item.operatingTag != null">
+					operating_tag_ = #{item.operatingTag},
+				</if>
+				<if test="item.updateTime != null">
+					update_time_ = #{item.updateTime},
+				</if>
+				<if test="item.updateTime == null">
+					update_time_ = NOW()
+				</if>
+			</set>
+			WHERE user_id_ = #{item.userId}
+        </foreach>
+	</update>
 </mapper>

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

@@ -373,7 +373,7 @@
     </update>
     <update id="cuntinueCourseSign">
         UPDATE teacher_attendance
-        SET sign_in_time_ = #{startDateTime},sign_in_status_ = 1,sign_out_status_ = 1,sign_out_time_= #{endDateTime}
+        SET sign_in_time_ = #{startDateTime},sign_in_status_ = 1,sign_out_status_ = #{status},sign_out_time_= #{endDateTime}
     	WHERE course_schedule_id_ = #{courseScheduleId}
     </update>
     <update id="batchUpdateTeacher">

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

@@ -121,4 +121,9 @@
 		AND tsc.status_ = #{statusEnum,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler} LIMIT 1
 	</select>
 
+	<select id="findTeacherSalaryComplaintsWithMonth" resultMap="TeacherSalaryComplaints">
+		SELECT * FROM teacher_salary_complaints tsc
+		WHERE tsc.teacher_id_ = #{teacherId} AND tsc.salary_settlement_month_ = #{month}
+	</select>
+
 </mapper>

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

@@ -105,4 +105,8 @@ public interface TaskRemoteService {
 
 	@GetMapping("task/exercisesSituationStatistics")
 	void exercisesSituationStatistics();
+
+	//更新学生运营指标
+	@GetMapping("task/updateStudentOperatingTag")
+	void updateStudentOperatingTag();
 }

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

@@ -135,4 +135,9 @@ public class TaskRemoteServiceFallback implements TaskRemoteService {
 	public void exercisesSituationStatistics() {
 		logger.info("学员服务信息统计失败");
 	}
+
+	@Override
+	public void updateStudentOperatingTag() {
+		logger.info("更新学生运营指标失败");
+	}
 }

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

@@ -29,6 +29,12 @@ public class RoomController{
         return new BaseResponse<>(roomResult);
     }
 
+    @RequestMapping(value = "/signIn", method = RequestMethod.POST)
+    public Object signIn(Long roomId){
+        roomService.signIn(roomId);
+        return new BaseResponse<>();
+    }
+
     @RequestMapping(value = "/leave", method = RequestMethod.POST)
     public Object leaveRoom(@RequestBody ReqUserData data)
             throws ApiException, Exception {

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

@@ -13,6 +13,7 @@ import com.ym.job.ScheduleManager;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.CourseScheduleDao;
+import com.ym.mec.biz.dal.dao.SysConfigDao;
 import com.ym.mec.biz.dal.dao.TeacherDao;
 import com.ym.mec.biz.dal.entity.CourseSchedule;
 import com.ym.mec.biz.dal.entity.Teacher;
@@ -20,10 +21,12 @@ import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.dal.enums.SignStatusEnum;
 import com.ym.mec.biz.dal.enums.StudentAttendanceStatusEnum;
 import com.ym.mec.biz.service.StudentAttendanceService;
+import com.ym.mec.biz.service.SysConfigService;
 import com.ym.mec.biz.service.TeacherAttendanceService;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.im.IMHelper;
 import com.ym.mec.im.message.*;
+import com.ym.mec.util.date.DateUtil;
 import com.ym.pojo.*;
 import com.ym.service.RoomService;
 import com.ym.utils.CheckUtils;
@@ -32,6 +35,7 @@ import com.ym.utils.DateTimeUtils;
 import com.ym.utils.IdentifierUtils;
 import com.ym.whiteboard.WhiteBoardHelper;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
@@ -42,7 +46,7 @@ import java.util.Date;
 import java.util.List;
 
 /**
- * Created by weiqinxiao on 2019/2/28.
+ * Created by super_zou on 2019/11/28.
  */
 @Slf4j
 @Service
@@ -89,6 +93,9 @@ public class RoomServiceImpl implements RoomService {
     @Autowired
     private SysUserFeignService sysUserFeignService;
 
+    @Autowired
+    private SysConfigDao sysConfigDao;
+
     @Value("${auth.sysconfig.tenantId}")
     private Integer lesseeOrganId;
 
@@ -104,7 +111,24 @@ public class RoomServiceImpl implements RoomService {
         String userId = sysUser.getId().toString();
         Teacher teacher = teacherDao.get(Integer.parseInt(userId));
         CourseSchedule courseSchedule = courseScheduleDao.get(Long.parseLong(roomId));
-        try {
+
+        String continueCourseTime = sysConfigDao.findConfigValue(SysConfigService.ONLINE_CONTINUE_COURSE_TIME);
+        if(StringUtils.isEmpty(continueCourseTime)){
+            continueCourseTime = "3";
+        }
+        CourseSchedule schedule = courseSchedule;
+        //如果当前课程是连堂课,那么获取第一节课的课程编号
+        while (true){
+            String classDate = DateUtil.format(schedule.getClassDate(), DateUtil.DEFAULT_PATTERN);
+            String startClassTime = DateUtil.format(schedule.getStartClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
+            schedule = courseScheduleDao.getLastCourse(schedule.getClassGroupId(),classDate + " " + startClassTime,schedule.getActualTeacherId(),continueCourseTime);
+            if(schedule != null){
+                roomId = schedule.getId().toString();
+            }else {
+                break;
+            }
+        }
+        /*try {
             if(teacher != null && teacher.getId().equals(courseSchedule.getActualTeacherId())){
                 teacherAttendanceService.addTeacherAttendanceRecord(Integer.parseInt(roomId),courseSchedule.getActualTeacherId(), SignStatusEnum.SIGN_IN,true);
             }else {
@@ -112,7 +136,7 @@ public class RoomServiceImpl implements RoomService {
             }
         }catch (Exception e){
             e.printStackTrace();
-        }
+        }*/
         if(courseSchedule.getGroupType() == GroupType.COMM){
             roomId = "I" + roomId;
         }else {
@@ -213,6 +237,25 @@ public class RoomServiceImpl implements RoomService {
         return roomResult;
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void signIn(Long roomId) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        String userId = sysUser.getId().toString();
+        log.info("roomSignIn: roomId={}, userId={}", roomId, userId);
+        Teacher teacher = teacherDao.get(Integer.parseInt(userId));
+        CourseSchedule courseSchedule = courseScheduleDao.get(roomId);
+        try {
+            if(teacher != null && teacher.getId().equals(courseSchedule.getActualTeacherId())){
+                teacherAttendanceService.addTeacherAttendanceRecord(roomId.intValue(),courseSchedule.getActualTeacherId(), SignStatusEnum.SIGN_IN,true);
+            }else {
+                studentAttendanceService.addStudentAttendanceRecord(roomId.intValue(),Integer.parseInt(userId), StudentAttendanceStatusEnum.NORMAL,SignStatusEnum.SIGN_IN);
+            }
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+    }
+
     private void saveRoom(String roomId, String roomName, Date createTime, String display) {
         Room room = new Room();
         room.setRid(roomId);

+ 4 - 1
mec-im/src/main/java/com/ym/service/RoomService.java

@@ -9,12 +9,14 @@ import com.ym.pojo.RoomResult;
 import java.util.List;
 
 /**
- * Created by weiqinxiao on 2019/2/28.
+ * Created by super_zou on 2019/11/28.
  */
 public interface RoomService {
     //everyone
     public RoomResult joinRoom(String userName, String roomId, boolean isAudience, boolean isDisableCamera) throws ApiException, Exception;
 
+    void signIn(Long roomId);
+
     public Boolean leaveRoom(String roomId) throws ApiException, Exception;
 
     //only host
@@ -65,4 +67,5 @@ public interface RoomService {
     public void userIMOfflineKick(String userId);
 
     boolean statusSync(String roomId,String userId) throws Exception;
+
 }

+ 20 - 0
mec-task/src/main/java/com/ym/mec/task/jobs/UpdateStudentOperatingTagTask.java

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

+ 2 - 1
mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherSalaryComplaintsController.java

@@ -40,6 +40,7 @@ public class TeacherSalaryComplaintsController extends BaseController {
     @ApiOperation(value = "撤销当月未处理申述")
     @RequestMapping("/repealComplaints")
     public Object repealComplaints(String salarySettlementMonth){
-        return succeed(teacherSalaryComplaintsService.repealComplaints(salarySettlementMonth));
+        teacherSalaryComplaintsService.repealComplaints(salarySettlementMonth);
+        return succeed();
     }
 }

+ 37 - 5
mec-web/src/main/java/com/ym/mec/web/controller/CourseScheduleTeacherSalaryController.java

@@ -2,8 +2,10 @@ 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.CourseScheduleTeacherSalaryDao;
 import com.ym.mec.biz.dal.dao.EmployeeDao;
 import com.ym.mec.biz.dal.entity.Employee;
+import com.ym.mec.biz.dal.enums.TeacherSalaryConfirmStatus;
 import com.ym.mec.biz.dal.page.CourseSalaryQueryInfo4Web;
 import com.ym.mec.biz.dal.page.CourseScheduleTeacherSalaryQueryInfo;
 import com.ym.mec.biz.service.CourseScheduleTeacherSalaryService;
@@ -11,6 +13,7 @@ import com.ym.mec.biz.service.VipGroupService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.exception.BizException;
+import com.ym.mec.util.date.DateUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -19,9 +22,7 @@ import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
-import java.util.Arrays;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
 
 @RequestMapping("courseScheduleTeacherSalary")
 @Api(tags = "教师薪酬服务")
@@ -30,7 +31,8 @@ public class CourseScheduleTeacherSalaryController extends BaseController {
 
     @Autowired
     private CourseScheduleTeacherSalaryService courseScheduleTeacherSalaryService;
-    
+    @Autowired
+    private CourseScheduleTeacherSalaryDao courseScheduleTeacherSalaryDao;
     @Autowired
     private VipGroupService vipGroupService;
     @Autowired
@@ -72,6 +74,36 @@ public class CourseScheduleTeacherSalaryController extends BaseController {
                 }
             }
         }
-        return succeed(courseScheduleTeacherSalaryService.findIsSettlementCourseSalarys(queryInfo));
+
+        Map<String, Object> result=new HashMap<>();
+        result.put("pageInfo", courseScheduleTeacherSalaryService.findIsSettlementCourseSalarys(queryInfo));
+        int i = courseScheduleTeacherSalaryDao.countOpenConfirmSalarysWithMonth(DateUtil.dateToString(DateUtil.addMonths(new Date(), -1), "yyyy-MM"), TeacherSalaryConfirmStatus.UNCONFIRMED);
+        if(i>0){
+            result.put("isOpenConfirm", 1);
+        }else{
+            int j = courseScheduleTeacherSalaryDao.countOpenConfirmSalarysWithMonth(DateUtil.dateToString(DateUtil.addMonths(new Date(), -1), "yyyy-MM"), null);
+            if(j<=0){
+                result.put("isOpenConfirm", 2);
+            }else{
+                result.put("isOpenConfirm", 0);
+            }
+        }
+        return succeed(result);
+    }
+
+    @ApiOperation(value = "开启课酬确认")
+    @GetMapping("/openSalaryConfirm")
+    @PreAuthorize("@pcs.hasPermissions('courseScheduleTeacherSalary/openSalaryConfirm')")
+    public HttpResponseResult openSalaryConfirm(String month){
+        courseScheduleTeacherSalaryService.openSalaryConfirm(month);
+        return succeed();
+    }
+
+    @ApiOperation(value = "关闭课酬确认")
+    @GetMapping("/closeSalaryConfirm")
+    @PreAuthorize("@pcs.hasPermissions('courseScheduleTeacherSalary/closeSalaryConfirm')")
+    public HttpResponseResult closeSalaryConfirm(String month){
+        courseScheduleTeacherSalaryService.closeSalaryConfirm(month);
+        return succeed();
     }
 }

+ 78 - 4
mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java

@@ -5,10 +5,7 @@ import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.*;
-import com.ym.mec.biz.dal.enums.CourseStatusEnum;
-import com.ym.mec.biz.dal.enums.GroupType;
-import com.ym.mec.biz.dal.enums.KitGroupPurchaseTypeEnum;
-import com.ym.mec.biz.dal.enums.OrderDetailTypeEnum;
+import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.dal.page.*;
 import com.ym.mec.biz.service.*;
 import com.ym.mec.common.controller.BaseController;
@@ -1152,4 +1149,81 @@ public class ExportController extends BaseController {
             }
         }
     }
+
+    @ApiOperation(value = "课外训练-教学导出")
+    @GetMapping("export/isSettlementCourseSalarys")
+    @PreAuthorize("@pcs.hasPermissions('export/isSettlementCourseSalarys')")
+    public void isSettlementCourseSalarys(CourseSalaryQueryInfo4Web queryInfo, HttpServletResponse response) throws IOException {
+        queryInfo.setRows(999999999);
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            throw new BizException("用户信息获取失败");
+        }
+        if (!sysUser.getIsSuperAdmin()) {
+            Employee employee = employeeDao.get(sysUser.getId());
+            if (org.apache.commons.lang3.StringUtils.isEmpty(queryInfo.getOrganIdList())) {
+                queryInfo.setOrganIdList(employee.getOrganIdList());
+            } else if (org.apache.commons.lang3.StringUtils.isEmpty(employee.getOrganIdList())) {
+                throw new BizException("用户所在分部异常");
+            } else {
+                List<String> list = Arrays.asList(employee.getOrganIdList().split(","));
+                if (!list.containsAll(Arrays.asList(queryInfo.getOrganIdList().split(",")))) {
+                    throw new BizException("非法请求");
+                }
+            }
+        }
+        List<TeacherCourseSalaryDetail4WebDto> rows = courseScheduleTeacherSalaryService.findIsSettlementCourseSalarys(queryInfo).getRows();
+        if (CollectionUtils.isEmpty(rows)) {
+            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;
+        }
+        for (TeacherCourseSalaryDetail4WebDto row : rows) {
+            if(Objects.isNull(row.getSignInTime())){
+                row.setSignInStatusStr("未签到");
+            }else{
+                String signInTimeStr = DateUtil.dateToString(row.getSignInTime(), "yyyy-MM-dd HH:mm");
+                if(YesOrNoEnum.YES.equals(row.getSignInStatus())){
+                    row.setSignInStatusStr(signInTimeStr+"(正常签到)");
+                }else{
+                    row.setSignInStatusStr(signInTimeStr+"(异常签到)");
+                }
+            }
+            if(Objects.isNull(row.getSignOutTime())){
+                row.setSignOutStatusStr("未签退");
+            }else{
+                String signOutTimeStr = DateUtil.dateToString(row.getSignOutTime(), "yyyy-MM-dd HH:mm");
+                if(YesOrNoEnum.YES.equals(row.getSignOutStatus())){
+                    row.setSignOutStatusStr(signOutTimeStr+"(正常签退)");
+                }else{
+                    row.setSignOutStatusStr(signOutTimeStr+"(异常签退)");
+                }
+            }
+        }
+        OutputStream ouputStream = null;
+        try {
+            HSSFWorkbook workbook = POIUtil.exportExcel(
+                    new String[]{"分部", "课程组类型", "课程编号", "时间", "课程名称", "老师编号", "老师姓名", "签到时间", "签退时间", "应发课酬",
+                                 "课酬扣款", "结算课酬", "状态", "备注"},
+                    new String[]{"organName", "groupType.desc", "courseScheduleId", "startClassTime", "courseName", "teacherId", "teacherName",
+                                "signInStatusStr", "signOutStatusStr", "actualSalary", "reduceSalary", "finalSalary", "confirmStatus.desc", "memo"}, rows);
+            response.setContentType("application/octet-stream");
+            response.setHeader("Content-Disposition", "attachment;filename=lender-" + DateUtil.getDate(new Date()) + ".xls");
+            ouputStream = response.getOutputStream();
+            workbook.write(ouputStream);
+            ouputStream.flush();
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (ouputStream != null) {
+                try {
+                    ouputStream.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
 }

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

@@ -2,11 +2,13 @@ package com.ym.mec.web.controller;
 
 import com.ym.mec.biz.service.*;
 import com.ym.mec.common.controller.BaseController;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.text.ParseException;
 import java.util.Date;
 
 @RequestMapping("task")
@@ -57,6 +59,9 @@ public class TaskController extends BaseController {
 
 	@Autowired
 	private ExtracurricularExercisesReplyService extracurricularExercisesReplyService;
+	
+	@Autowired
+	private StudentService studentService;
 
 	@GetMapping("/refreshPaymentFeeStatus")
 	// 刷新付费状态
@@ -213,4 +218,10 @@ public class TaskController extends BaseController {
 	public void exercisesSituationStatistics(){
 		extracurricularExercisesReplyService.exercisesSituationStatistics();
 	}
+
+	//更新学生运营指标
+	@GetMapping("/updateStudentOperatingTag")
+	public void updateStudentOperatingTag() throws ParseException{
+		studentService.updateOperatingTag();
+	}
 }

+ 2 - 2
mec-web/src/main/java/com/ym/mec/web/controller/TeacherSalaryComplaintsController.java

@@ -23,14 +23,14 @@ public class TeacherSalaryComplaintsController extends BaseController {
     @Autowired
     private TeacherSalaryComplaintsService teacherSalaryComplaintsService;
 
-    @ApiOperation(value = "终极班级信息分页获取")
+    @ApiOperation(value = "分页获取")
     @RequestMapping("/queryPage")
     @PreAuthorize("@pcs.hasPermissions('teacherSalaryComplaints/queryPage')")
     public Object queryPage(TeacherSalaryModifyQueryInfo queryInfo){
         return succeed(teacherSalaryComplaintsService.queryPage(queryInfo));
     }
 
-    @ApiOperation(value = "终极班级信息获取")
+    @ApiOperation(value = "获取")
     @RequestMapping("/get")
     @PreAuthorize("@pcs.hasPermissions('teacherSalaryComplaints/get')")
     public Object get(Long id){