浏览代码

Merge branch 'online1' into inspection_feature_4_23

周箭河 4 年之前
父节点
当前提交
8eeb588a84
共有 62 个文件被更改,包括 2008 次插入157 次删除
  1. 7 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/dal/dao/SysRoleDao.java
  2. 9 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/impl/SysRoleServiceImpl.java
  3. 3 0
      mec-auth/mec-auth-server/src/main/resources/config/mybatis/SysRoleMapper.xml
  4. 15 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleDao.java
  5. 34 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleTeacherSalaryDao.java
  6. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/IndexBaseMonthDataDao.java
  7. 8 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupDao.java
  8. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentManageDao.java
  9. 15 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentRegistrationDao.java
  10. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TeacherDao.java
  11. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseScheduleDto.java
  12. 51 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/LocalDateBigDecimalMapDto.java
  13. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherAttendanceComplaintsDto.java
  14. 96 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherIncomeDto.java
  15. 98 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherIncomeReviewDto.java
  16. 37 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherSalaryDeductReasonDto.java
  17. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseScheduleTeacherSalary.java
  18. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/Teacher.java
  19. 21 10
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TeacherAttendance.java
  20. 22 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/VipGroupActivity.java
  21. 40 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/DeductReasonEnum.java
  22. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/MessageTypeEnum.java
  23. 51 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/TeacherIncomeQueryInfo.java
  24. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/TeacherQueryInfo.java
  25. 81 4
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleTeacherSalaryService.java
  26. 14 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SysMessageService.java
  27. 2 4
      mec-biz/src/main/java/com/ym/mec/biz/service/TeacherAttendanceService.java
  28. 793 3
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java
  29. 3 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/IndexBaseMonthDataServiceImpl.java
  30. 4 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderServiceImpl.java
  31. 34 16
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  32. 5 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentManageServiceImpl.java
  33. 65 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMessageServiceImpl.java
  34. 13 11
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherAttendanceServiceImpl.java
  35. 3 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java
  36. 3 3
      mec-biz/src/main/resources/config/mybatis/ClassGroupMapper.xml
  37. 58 0
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  38. 88 8
      mec-biz/src/main/resources/config/mybatis/CourseScheduleTeacherSalaryMapper.xml
  39. 2 4
      mec-biz/src/main/resources/config/mybatis/IndexBaseMonthDataMapper.xml
  40. 6 0
      mec-biz/src/main/resources/config/mybatis/MusicGroupMapper.xml
  41. 1 2
      mec-biz/src/main/resources/config/mybatis/ReplacementInstrumentActivityMapper.xml
  42. 3 3
      mec-biz/src/main/resources/config/mybatis/StudentExtracurricularExercisesSituationMapper.xml
  43. 11 0
      mec-biz/src/main/resources/config/mybatis/StudentRegistrationMapper.xml
  44. 17 3
      mec-biz/src/main/resources/config/mybatis/TeacherAttendanceMapper.xml
  45. 18 10
      mec-biz/src/main/resources/config/mybatis/TeacherMapper.xml
  46. 35 22
      mec-biz/src/main/resources/config/mybatis/VipGroupActivityMapper.xml
  47. 10 0
      mec-client-api/src/main/java/com/ym/mec/task/TaskRemoteService.java
  48. 12 0
      mec-client-api/src/main/java/com/ym/mec/task/fallback/TaskRemoteServiceFallback.java
  49. 16 0
      mec-student/src/main/java/com/ym/mec/student/controller/ReplacementInstrumentActivityController.java
  50. 19 0
      mec-task/src/main/java/com/ym/mec/task/jobs/DayaSalaryMarkTask.java
  51. 19 0
      mec-task/src/main/java/com/ym/mec/task/jobs/TodayIncomeRemindTask.java
  52. 41 0
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/CourseScheduleTeacherSalaryController.java
  53. 3 2
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherAttendanceController.java
  54. 2 2
      mec-thirdparty/src/main/java/com/ym/mec/thirdparty/message/MessageSenderPlugin.java
  55. 4 4
      mec-thirdparty/src/main/java/com/ym/mec/thirdparty/message/MessageSenderPluginContext.java
  56. 6 6
      mec-thirdparty/src/main/java/com/ym/mec/thirdparty/message/provider/AwSmsPlugin.java
  57. 21 10
      mec-thirdparty/src/main/java/com/ym/mec/thirdparty/message/provider/JiguangPushPlugin.java
  58. 2 2
      mec-thirdparty/src/main/java/com/ym/mec/thirdparty/message/provider/MOxintongSMSPlugin.java
  59. 2 2
      mec-thirdparty/src/main/java/com/ym/mec/thirdparty/message/provider/ShiyuanSMSPlugin.java
  60. 2 2
      mec-thirdparty/src/main/java/com/ym/mec/thirdparty/message/provider/YimeiSmsPlugin.java
  61. 15 3
      mec-web/src/main/java/com/ym/mec/web/controller/TaskController.java
  62. 5 4
      mec-web/src/main/java/com/ym/mec/web/controller/TeacherAttendanceController.java

+ 7 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/dal/dao/SysRoleDao.java

@@ -21,4 +21,11 @@ public interface SysRoleDao extends BaseDAO<Integer, SysRole> {
      * @return
      * @return
      */
      */
     SysRole findRoleByCode(@Param("code") String code);
     SysRole findRoleByCode(@Param("code") String code);
+
+    /**
+     * 根据角色名称获取角色
+     * @param roleName
+     * @return
+     */
+    SysRole findByRoleName(String roleName);
 }
 }

+ 9 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/impl/SysRoleServiceImpl.java

@@ -6,6 +6,7 @@ import com.ym.mec.auth.dal.dao.SysRoleDao;
 import com.ym.mec.auth.dal.dao.SysRoleMenuDao;
 import com.ym.mec.auth.dal.dao.SysRoleMenuDao;
 import com.ym.mec.auth.service.SysRoleService;
 import com.ym.mec.auth.service.SysRoleService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
@@ -40,6 +41,10 @@ public class SysRoleServiceImpl extends BaseServiceImpl<Integer, SysRole>  imple
 	@Override
 	@Override
 	@Transactional(rollbackFor = Exception.class)
 	@Transactional(rollbackFor = Exception.class)
 	public void addRole(SysRole sysRole) {
 	public void addRole(SysRole sysRole) {
+		SysRole findByName = sysRoleDao.findByRoleName(sysRole.getRoleName());
+		if(findByName != null){
+			throw new BizException("操作失败:角色 {} 已存在",sysRole.getRoleName());
+		}
 		sysRoleDao.insert(sysRole);
 		sysRoleDao.insert(sysRole);
 		batchSave(sysRole);
 		batchSave(sysRole);
 	}
 	}
@@ -47,6 +52,10 @@ public class SysRoleServiceImpl extends BaseServiceImpl<Integer, SysRole>  imple
 	@Override
 	@Override
 	@Transactional(rollbackFor = Exception.class)
 	@Transactional(rollbackFor = Exception.class)
 	public void updateRole(SysRole sysRole) {
 	public void updateRole(SysRole sysRole) {
+		SysRole findByName = sysRoleDao.findByRoleName(sysRole.getRoleName());
+		if(findByName != null && !findByName.getId().equals(sysRole.getId())){
+			throw new BizException("操作失败:角色 {} 已存在",sysRole.getRoleName());
+		}
 		sysRole.setUpdateTime(new Date());
 		sysRole.setUpdateTime(new Date());
 		sysRoleDao.update(sysRole);
 		sysRoleDao.update(sysRole);
 		sysRoleMenuDao.deleteAllMenu(sysRole.getId());
 		sysRoleMenuDao.deleteAllMenu(sysRole.getId());

+ 3 - 0
mec-auth/mec-auth-server/src/main/resources/config/mybatis/SysRoleMapper.xml

@@ -83,4 +83,7 @@
     <select id="findRoleByCode" resultMap="SysRole">
     <select id="findRoleByCode" resultMap="SysRole">
         SELECT sr.* FROM sys_role WHERE role_code_ = #{code} AND sr.del_flag_ = 0
         SELECT sr.* FROM sys_role WHERE role_code_ = #{code} AND sr.del_flag_ = 0
     </select>
     </select>
+    <select id="findByRoleName" resultMap="SysRole">
+        SELECT * FROM sys_role WHERE role_name_ = #{roleName} AND del_flag_ = 0 LIMIT 1
+    </select>
 </mapper>
 </mapper>

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

@@ -1294,6 +1294,21 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
                                                                 @Param("startTime") Date startTime,
                                                                 @Param("startTime") Date startTime,
                                                                 @Param("endTime") Date endTime);
                                                                 @Param("endTime") Date endTime);
 
 
+    List<CourseSchedule> getTeacherCourseWithClassDate(@Param("teacherId") Integer teacherId,
+                                                       @Param("startDay") String startDay,
+                                                       @Param("endDay") String endDay,
+                                                       @Param("courseStatus") CourseStatusEnum courseStatus);
+
+    /**
+     * @describe 查询教师课程
+     * @author Joburgess
+     * @date 2021/4/16 0016
+     * @param params:
+     * @return java.util.List<com.ym.mec.biz.dal.entity.CourseSchedule>
+     */
+    List<CourseSchedule> queryTeacherCourse(Map<String, Object> params);
+    int countTeacherCourse(Map<String, Object> params);
+
     /**
     /**
      * @param userId:
      * @param userId:
      * @param startTime:
      * @param startTime:

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

@@ -3,7 +3,7 @@ package com.ym.mec.biz.dal.dao;
 import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.CourseSchedule;
 import com.ym.mec.biz.dal.entity.CourseSchedule;
 import com.ym.mec.biz.dal.entity.CourseScheduleTeacherSalary;
 import com.ym.mec.biz.dal.entity.CourseScheduleTeacherSalary;
-import com.ym.mec.biz.dal.entity.TeacherSalaryModifyLog;
+import com.ym.mec.biz.dal.enums.CourseStatusEnum;
 import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.dal.enums.TeachTypeEnum;
 import com.ym.mec.biz.dal.enums.TeachTypeEnum;
 import com.ym.mec.biz.dal.enums.TeacherSalaryConfirmStatus;
 import com.ym.mec.biz.dal.enums.TeacherSalaryConfirmStatus;
@@ -532,4 +532,37 @@ public interface CourseScheduleTeacherSalaryDao extends BaseDAO<Long, CourseSche
 	 */
 	 */
 	List<CourseScheduleTeacherSalary> getIsSalaryWithDate(@Param("startDate") String startDate, @Param("endDate") String endDate);
 	List<CourseScheduleTeacherSalary> getIsSalaryWithDate(@Param("startDate") String startDate, @Param("endDate") String endDate);
 
 
+	/**
+	 * @describe 获取教师收入总览
+	 * @author Joburgess
+	 * @date 2021/4/16 0016
+	 * @param teacherId:
+	 * @param monthStr:
+	 * @return com.ym.mec.biz.dal.dto.TeacherIncomeReviewDto
+	 */
+	TeacherIncomeReviewDto getTeacherSalaryOverview(@Param("teacherId") Integer teacherId,
+													@Param("startDay") String startDay,
+													@Param("endDay") String endDay,
+													@Param("startClassDay") String startClassDay,
+													@Param("courseStatus") CourseStatusEnum courseStatus);
+
+	/**
+	 * @describe 教师年度收入统计
+	 * @author Joburgess
+	 * @date 2021/4/16 0016
+	 * @param year:
+	 * @return java.util.List<java.util.Map<java.lang.String,java.math.BigDecimal>>
+	 */
+	List<LocalDateBigDecimalMapDto> teacherIncomeStat(@Param("teacherId") Integer teacherId,
+													@Param("year") Integer year,
+													@Param("month") Integer month);
+
+	/**
+	 * @describe 获取今日有课教师编号
+	 * @author Joburgess
+	 * @date 2021/4/19 0019
+	 * @return java.util.List<java.lang.Integer>
+	 */
+	List<Integer> getTodayHasCourseTeacherIds();
+
 }
 }

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

@@ -74,7 +74,8 @@ public interface IndexBaseMonthDataDao extends BaseDAO<Long, IndexBaseMonthData>
      * @date 2021/1/7 0007
      * @date 2021/1/7 0007
      * @return java.util.List<com.ym.mec.biz.dal.dto.IndexBaseMonthDto>
      * @return java.util.List<com.ym.mec.biz.dal.dto.IndexBaseMonthDto>
      */
      */
-    List<IndexBaseMonthData> getStudentSignUpData(@Param("dayStr") String dayStr);
+    List<IndexBaseMonthData> getStudentSignUpData(@Param("dayStr") String dayStr,
+                                                  @Param("courseStartDay") String courseStartDay);
 
 
     /**
     /**
      * @describe 统计作业布置数据
      * @describe 统计作业布置数据

+ 8 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupDao.java

@@ -380,4 +380,12 @@ public interface MusicGroupDao extends BaseDAO<String, MusicGroup> {
     List<String> getNoClassStudentMusicGroupIds(@Param("organIds") List<Integer> organIds);
     List<String> getNoClassStudentMusicGroupIds(@Param("organIds") List<Integer> organIds);
 
 
     CooperationOrgan findCooperationOrganEduTeacher(@Param("id") Integer id);
     CooperationOrgan findCooperationOrganEduTeacher(@Param("id") Integer id);
+
+    /**
+     * 获取乐团合作单位进行中 、暂停、关闭 的乐团
+     * @param cooperationOrganId
+     * @param musicGroupId
+     * @return
+     */
+    Integer getCooperationMusicGroupNum(@Param("cooperationOrganId") Integer cooperationOrganId, @Param("musicGroupId") String musicGroupId);
 }
 }

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

@@ -236,6 +236,7 @@ public interface StudentManageDao {
      * @param userIds
      * @param userIds
      * @return
      * @return
      */
      */
+    @Deprecated
     List<Map<Integer, Integer>> getIsActive(@Param("userIds") Set<Integer> userIds);
     List<Map<Integer, Integer>> getIsActive(@Param("userIds") Set<Integer> userIds);
 
 
     /**
     /**

+ 15 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentRegistrationDao.java

@@ -314,6 +314,13 @@ public interface StudentRegistrationDao extends BaseDAO<Long, StudentRegistratio
     List<StudentRegisterPerDto> queryStudentPer(@Param("userIds") Set<Integer> userIds);
     List<StudentRegisterPerDto> queryStudentPer(@Param("userIds") Set<Integer> userIds);
 
 
     /**
     /**
+     * 获取学员注册比例
+     *
+     * @return
+     */
+    List<StudentRegisterPerDto> queryStudentPer1(String month);
+
+    /**
      * 获取乐团报名信息和学校信息
      * 获取乐团报名信息和学校信息
      *
      *
      * @param musicGroupId
      * @param musicGroupId
@@ -488,8 +495,16 @@ public interface StudentRegistrationDao extends BaseDAO<Long, StudentRegistratio
     StudentRegistration getByUserIdAndMusicGroupId(@Param("musicGroupId") String musicGroupId, @Param("userId") Integer userId);
     StudentRegistration getByUserIdAndMusicGroupId(@Param("musicGroupId") String musicGroupId, @Param("userId") Integer userId);
 
 
     List<NoClassMusicStudentDto> queryNoClassMusicStudents(Map<String, Object> params);
     List<NoClassMusicStudentDto> queryNoClassMusicStudents(Map<String, Object> params);
+
     int countNoClassMusicStudents(Map<String, Object> params);
     int countNoClassMusicStudents(Map<String, Object> params);
 
 
 
 
     List<StudentClassInfoDto> getStudentClassInfo(@Param("studentIds") List<Integer> studentIds);
     List<StudentClassInfoDto> getStudentClassInfo(@Param("studentIds") List<Integer> studentIds);
+
+    /**
+     * 获取乐团已缴费学员数量
+     * @param musicGroupId
+     * @return
+     */
+    Integer getPaymentStudentNum(@Param("musicGroupId") String musicGroupId);
 }
 }

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

@@ -299,6 +299,7 @@ public interface TeacherDao extends BaseDAO<Integer, Teacher> {
      * @author Joburgess
      * @author Joburgess
      * @date 2020/1/7
      * @date 2020/1/7
      */
      */
+    @Deprecated
     List<TeacherBasicDto> searchTeachers(Map<String, Object> params);
     List<TeacherBasicDto> searchTeachers(Map<String, Object> params);
 
 
     /**
     /**

+ 12 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseScheduleDto.java

@@ -4,6 +4,7 @@ import com.ym.mec.biz.dal.entity.CourseSchedule;
 import com.ym.mec.biz.dal.enums.PracticeGroupType;
 import com.ym.mec.biz.dal.enums.PracticeGroupType;
 import com.ym.mec.biz.dal.enums.StudentAttendanceStatusEnum;
 import com.ym.mec.biz.dal.enums.StudentAttendanceStatusEnum;
 import com.ym.mec.biz.dal.enums.TeachTypeEnum;
 import com.ym.mec.biz.dal.enums.TeachTypeEnum;
+import com.ym.mec.biz.dal.enums.UpdateAttendanceEnum;
 import io.swagger.annotations.ApiModelProperty;
 import io.swagger.annotations.ApiModelProperty;
 
 
 import java.util.List;
 import java.util.List;
@@ -83,6 +84,9 @@ public class CourseScheduleDto extends CourseSchedule {
     //申述内容
     //申述内容
     private String complaintsContent;
     private String complaintsContent;
 
 
+    //申诉考勤的方式  SIGN_IN签到,SIGN_OUT签退,ALL所有
+    private UpdateAttendanceEnum complaintsType;
+
     //申述凭证
     //申述凭证
     private String url;
     private String url;
 
 
@@ -93,6 +97,14 @@ public class CourseScheduleDto extends CourseSchedule {
 
 
     private PracticeGroupType practiceType;
     private PracticeGroupType practiceType;
 
 
+    public UpdateAttendanceEnum getComplaintsType() {
+        return complaintsType;
+    }
+
+    public void setComplaintsType(UpdateAttendanceEnum complaintsType) {
+        this.complaintsType = complaintsType;
+    }
+
     public String getHeadUrl() {
     public String getHeadUrl() {
         return headUrl;
         return headUrl;
     }
     }

+ 51 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/LocalDateBigDecimalMapDto.java

@@ -0,0 +1,51 @@
+package com.ym.mec.biz.dal.dto;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.Date;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/4/21 0021
+ */
+public class LocalDateBigDecimalMapDto {
+
+    private Date date;
+
+    private String dateStr;
+
+    private BigDecimal amount;
+
+    public LocalDateBigDecimalMapDto(Date date, String dateStr, BigDecimal amount) {
+        this.date = date;
+        this.dateStr = dateStr;
+        this.amount = amount;
+    }
+
+    public LocalDateBigDecimalMapDto() {
+    }
+
+    public Date getDate() {
+        return date;
+    }
+
+    public void setDate(Date date) {
+        this.date = date;
+    }
+
+    public String getDateStr() {
+        return dateStr;
+    }
+
+    public void setDateStr(String dateStr) {
+        this.dateStr = dateStr;
+    }
+
+    public BigDecimal getAmount() {
+        return amount;
+    }
+
+    public void setAmount(BigDecimal amount) {
+        this.amount = amount;
+    }
+}

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherAttendanceComplaintsDto.java

@@ -28,6 +28,9 @@ public class TeacherAttendanceComplaintsDto{
 
 
     private ComplaintsStatusEnum complaintsStatusEnum;
     private ComplaintsStatusEnum complaintsStatusEnum;
 
 
+    //申诉考勤的方式  SIGN_IN签到,SIGN_OUT签退,ALL所有
+    private UpdateAttendanceEnum complaintsType;
+
     private UpdateAttendanceEnum updateAttendanceEnum;
     private UpdateAttendanceEnum updateAttendanceEnum;
 
 
     private String operatorName;
     private String operatorName;
@@ -42,6 +45,14 @@ public class TeacherAttendanceComplaintsDto{
 
 
     private String url;
     private String url;
 
 
+    public UpdateAttendanceEnum getComplaintsType() {
+        return complaintsType;
+    }
+
+    public void setComplaintsType(UpdateAttendanceEnum complaintsType) {
+        this.complaintsType = complaintsType;
+    }
+
     public String getUrl() {
     public String getUrl() {
         return url;
         return url;
     }
     }

+ 96 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherIncomeDto.java

@@ -0,0 +1,96 @@
+package com.ym.mec.biz.dal.dto;
+
+import com.ym.mec.biz.dal.entity.CourseSchedule;
+import com.ym.mec.biz.dal.entity.TeacherAttendance;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/4/16 0016
+ */
+public class TeacherIncomeDto extends CourseSchedule {
+
+    private BigDecimal expectIncome;
+
+    private java.math.BigDecimal expectSalary;
+
+    private java.math.BigDecimal subsidy;
+
+    private java.math.BigDecimal actualSalary;
+
+    private TeacherAttendance teacherAttendance;
+
+    private Boolean belongToDaya;
+
+    private long sortNum;
+
+    private List<TeacherSalaryDeductReasonDto> deductReasons;
+
+    public long getSortNum() {
+        return sortNum;
+    }
+
+    public void setSortNum(long sortNum) {
+        this.sortNum = sortNum;
+    }
+
+    public BigDecimal getExpectIncome() {
+        return expectIncome;
+    }
+
+    public void setExpectIncome(BigDecimal expectIncome) {
+        this.expectIncome = expectIncome;
+    }
+
+    public TeacherAttendance getTeacherAttendance() {
+        return teacherAttendance;
+    }
+
+    public void setTeacherAttendance(TeacherAttendance teacherAttendance) {
+        this.teacherAttendance = teacherAttendance;
+    }
+
+    public BigDecimal getExpectSalary() {
+        return expectSalary;
+    }
+
+    public void setExpectSalary(BigDecimal expectSalary) {
+        this.expectSalary = expectSalary;
+    }
+
+    @Override
+    public BigDecimal getSubsidy() {
+        return subsidy;
+    }
+
+    @Override
+    public void setSubsidy(BigDecimal subsidy) {
+        this.subsidy = subsidy;
+    }
+
+    public BigDecimal getActualSalary() {
+        return actualSalary;
+    }
+
+    public void setActualSalary(BigDecimal actualSalary) {
+        this.actualSalary = actualSalary;
+    }
+
+    public List<TeacherSalaryDeductReasonDto> getDeductReasons() {
+        return deductReasons;
+    }
+
+    public void setDeductReasons(List<TeacherSalaryDeductReasonDto> deductReasons) {
+        this.deductReasons = deductReasons;
+    }
+
+    public Boolean getBelongToDaya() {
+        return belongToDaya;
+    }
+
+    public void setBelongToDaya(Boolean belongToDaya) {
+        this.belongToDaya = belongToDaya;
+    }
+}

+ 98 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherIncomeReviewDto.java

@@ -0,0 +1,98 @@
+package com.ym.mec.biz.dal.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/4/15 0015
+ */
+public class TeacherIncomeReviewDto {
+
+    @ApiModelProperty(value = "总收入")
+    private BigDecimal totalIncome = new BigDecimal(BigInteger.ZERO, 2);
+
+    @ApiModelProperty(value = "本月预计收入")
+    private BigDecimal thisMonthExpectIncome = new BigDecimal(BigInteger.ZERO, 2);
+
+    @ApiModelProperty(value = "本月实际课耗收入")
+    private BigDecimal thisMonthActualIncome = new BigDecimal(BigInteger.ZERO, 2);
+
+    @ApiModelProperty(value = "大雅课酬")
+    private BigDecimal dayaIncome = new BigDecimal(BigInteger.ZERO, 2);
+
+    @ApiModelProperty(value = "其他课酬")
+    private BigDecimal otherIncome = new BigDecimal("0");
+
+    private int complaintsDaysRange = 1;
+
+    private Double attendanceRange;
+
+    private Double vipAttendanceRange;
+
+    public Double getAttendanceRange() {
+        return attendanceRange;
+    }
+
+    public void setAttendanceRange(Double attendanceRange) {
+        this.attendanceRange = attendanceRange;
+    }
+
+    public Double getVipAttendanceRange() {
+        return vipAttendanceRange;
+    }
+
+    public void setVipAttendanceRange(Double vipAttendanceRange) {
+        this.vipAttendanceRange = vipAttendanceRange;
+    }
+
+    public int getComplaintsDaysRange() {
+        return complaintsDaysRange;
+    }
+
+    public void setComplaintsDaysRange(int complaintsDaysRange) {
+        this.complaintsDaysRange = complaintsDaysRange;
+    }
+
+    public BigDecimal getTotalIncome() {
+        return totalIncome;
+    }
+
+    public void setTotalIncome(BigDecimal totalIncome) {
+        this.totalIncome = totalIncome.setScale(2);
+    }
+
+    public BigDecimal getThisMonthExpectIncome() {
+        return thisMonthExpectIncome;
+    }
+
+    public void setThisMonthExpectIncome(BigDecimal thisMonthExpectIncome) {
+        this.thisMonthExpectIncome = thisMonthExpectIncome.setScale(2);
+    }
+
+    public BigDecimal getThisMonthActualIncome() {
+        return thisMonthActualIncome;
+    }
+
+    public void setThisMonthActualIncome(BigDecimal thisMonthActualIncome) {
+        this.thisMonthActualIncome = thisMonthActualIncome.setScale(2);
+    }
+
+    public BigDecimal getDayaIncome() {
+        return dayaIncome;
+    }
+
+    public void setDayaIncome(BigDecimal dayaIncome) {
+        this.dayaIncome = dayaIncome.setScale(2);
+    }
+
+    public BigDecimal getOtherIncome() {
+        return otherIncome;
+    }
+
+    public void setOtherIncome(BigDecimal otherIncome) {
+        this.otherIncome = otherIncome.setScale(2);
+    }
+}

+ 37 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherSalaryDeductReasonDto.java

@@ -0,0 +1,37 @@
+package com.ym.mec.biz.dal.dto;
+
+import com.ym.mec.biz.dal.enums.DeductReasonEnum;
+
+import java.math.BigDecimal;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/4/16 0016
+ */
+public class TeacherSalaryDeductReasonDto {
+
+    private DeductReasonEnum deductReason;
+
+    private BigDecimal amount;
+
+    public TeacherSalaryDeductReasonDto(DeductReasonEnum deductReason, BigDecimal amount) {
+        this.deductReason = deductReason;
+        this.amount = amount.setScale(2, BigDecimal.ROUND_DOWN);
+    }
+
+    public DeductReasonEnum getDeductReason() {
+        return deductReason;
+    }
+
+    public void setDeductReason(DeductReasonEnum deductReason) {
+        this.deductReason = deductReason;
+    }
+
+    public BigDecimal getAmount() {
+        return amount;
+    }
+
+    public void setAmount(BigDecimal amount) {
+        this.amount = amount.setScale(2, BigDecimal.ROUND_DOWN);
+    }
+}

+ 12 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseScheduleTeacherSalary.java

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.dal.entity;
 package com.ym.mec.biz.dal.entity;
 
 
+import com.ym.mec.biz.dal.dto.TeacherSalaryDeductReasonDto;
 import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.dal.enums.TeachTypeEnum;
 import com.ym.mec.biz.dal.enums.TeachTypeEnum;
 import com.ym.mec.biz.dal.enums.TeacherSalaryConfirmStatus;
 import com.ym.mec.biz.dal.enums.TeacherSalaryConfirmStatus;
@@ -7,6 +8,7 @@ import io.swagger.annotations.ApiModelProperty;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
 
 import java.math.BigDecimal;
 import java.math.BigDecimal;
+import java.util.List;
 
 
 /**
 /**
  * 对应数据库表(course_schedule_teacher_salary):
  * 对应数据库表(course_schedule_teacher_salary):
@@ -69,6 +71,16 @@ public class CourseScheduleTeacherSalary {
 
 
 	private Boolean belongToDaya;
 	private Boolean belongToDaya;
 
 
+	private List<TeacherSalaryDeductReasonDto> deductReasons;
+
+	public List<TeacherSalaryDeductReasonDto> getDeductReasons() {
+		return deductReasons;
+	}
+
+	public void setDeductReasons(List<TeacherSalaryDeductReasonDto> deductReasons) {
+		this.deductReasons = deductReasons;
+	}
+
 	public Boolean getBelongToDaya() {
 	public Boolean getBelongToDaya() {
 		return belongToDaya;
 		return belongToDaya;
 	}
 	}

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/Teacher.java

@@ -123,6 +123,17 @@ public class Teacher extends SysUser {
 	private BigDecimal operatingIndex;
 	private BigDecimal operatingIndex;
 	private BigDecimal serviceIndex;
 	private BigDecimal serviceIndex;
 
 
+	@ApiModelProperty(value = "是否结算课酬")
+	private Boolean isSettlementSalary;
+
+	public Boolean getIsSettlementSalary() {
+		return isSettlementSalary;
+	}
+
+	public void setIsSettlementSalary(Boolean isSettlementSalary) {
+		this.isSettlementSalary = isSettlementSalary;
+	}
+
 	public BigDecimal getOperatingIndex() {
 	public BigDecimal getOperatingIndex() {
 		return operatingIndex;
 		return operatingIndex;
 	}
 	}

+ 21 - 10
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TeacherAttendance.java

@@ -16,21 +16,21 @@ public class TeacherAttendance {
 
 
 	/**  */
 	/**  */
 	private Long id;
 	private Long id;
-	
+
 	private GroupType groupType;
 	private GroupType groupType;
-	
+
 	/**  */
 	/**  */
 	@ApiModelProperty(value = "教师编号",required = false)
 	@ApiModelProperty(value = "教师编号",required = false)
 	private Integer teacherId;
 	private Integer teacherId;
-	
+
 	/**  */
 	/**  */
 	@ApiModelProperty(value = "乐团编号",required = false)
 	@ApiModelProperty(value = "乐团编号",required = false)
 	private String musicGroupId;
 	private String musicGroupId;
-	
+
 	/**  */
 	/**  */
 	@ApiModelProperty(value = "班级编号",required = false)
 	@ApiModelProperty(value = "班级编号",required = false)
 	private Integer classGroupId;
 	private Integer classGroupId;
-	
+
 	/**  */
 	/**  */
 	@ApiModelProperty(value = "课程计划编号",required = false)
 	@ApiModelProperty(value = "课程计划编号",required = false)
 	private Long courseScheduleId;
 	private Long courseScheduleId;
@@ -38,11 +38,11 @@ public class TeacherAttendance {
 	/**  */
 	/**  */
 	@ApiModelProperty(value = "实际教室编号",required = false)
 	@ApiModelProperty(value = "实际教室编号",required = false)
 	private Long currentScheduleId;
 	private Long currentScheduleId;
-	
+
 	/** 签到时间 */
 	/** 签到时间 */
 	@ApiModelProperty(value = "签到时间",required = false)
 	@ApiModelProperty(value = "签到时间",required = false)
 	private java.util.Date signInTime;
 	private java.util.Date signInTime;
-	
+
 	@ApiModelProperty(value = "状态(0:签到,1:签退)",required = false)
 	@ApiModelProperty(value = "状态(0:签到,1:签退)",required = false)
 	private Integer status;
 	private Integer status;
 
 
@@ -57,11 +57,11 @@ public class TeacherAttendance {
 
 
 	@ApiModelProperty(value = "当前课次")
 	@ApiModelProperty(value = "当前课次")
 	private Integer currentClassTimes;
 	private Integer currentClassTimes;
-	
+
 	/** 备注 */
 	/** 备注 */
 	@ApiModelProperty(value = "备注",required = false)
 	@ApiModelProperty(value = "备注",required = false)
 	private String remark;
 	private String remark;
-	
+
 	/**  */
 	/**  */
 	private java.util.Date createTime;
 	private java.util.Date createTime;
 
 
@@ -81,9 +81,12 @@ public class TeacherAttendance {
 	//申述状态0拒绝1通过2待处理3已撤销
 	//申述状态0拒绝1通过2待处理3已撤销
 	private ComplaintsStatusEnum complaintsStatus;
 	private ComplaintsStatusEnum complaintsStatus;
 
 
-	//申述状态0拒绝1通过2待处理3已撤销
+	//修复考勤方式  SIGN_IN签到,SIGN_OUT签退,ALL所有
 	private UpdateAttendanceEnum updateAttendanceEnum;
 	private UpdateAttendanceEnum updateAttendanceEnum;
 
 
+	//申诉考勤的方式  SIGN_IN签到,SIGN_OUT签退,ALL所有
+	private UpdateAttendanceEnum complaintsType;
+
 	//申述内容
 	//申述内容
 	private String complaintsContent;
 	private String complaintsContent;
 
 
@@ -110,6 +113,14 @@ public class TeacherAttendance {
 
 
 	private String deviceNum;
 	private String deviceNum;
 
 
+	public UpdateAttendanceEnum getComplaintsType() {
+		return complaintsType;
+	}
+
+	public void setComplaintsType(UpdateAttendanceEnum complaintsType) {
+		this.complaintsType = complaintsType;
+	}
+
 	public String getDeviceNum() {
 	public String getDeviceNum() {
 		return deviceNum;
 		return deviceNum;
 	}
 	}

+ 22 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/VipGroupActivity.java

@@ -80,6 +80,28 @@ public class VipGroupActivity {
 	@ApiModelProperty(value = "线下课是否参与梯度奖励")
 	@ApiModelProperty(value = "线下课是否参与梯度奖励")
 	private Integer offlineClassJoinGradientRewards;
 	private Integer offlineClassJoinGradientRewards;
 
 
+	@ApiModelProperty(value = "最少课程数量")
+	private Integer minCourseNum;
+
+	@ApiModelProperty(value = "最多可排课数量")
+	private Integer maxCourseNum;
+
+	public Integer getMinCourseNum() {
+		return minCourseNum;
+	}
+
+	public void setMinCourseNum(Integer minCourseNum) {
+		this.minCourseNum = minCourseNum;
+	}
+
+	public Integer getMaxCourseNum() {
+		return maxCourseNum;
+	}
+
+	public void setMaxCourseNum(Integer maxCourseNum) {
+		this.maxCourseNum = maxCourseNum;
+	}
+
 	public Integer getOnlineClassJoinGradientRewards() {
 	public Integer getOnlineClassJoinGradientRewards() {
 		return onlineClassJoinGradientRewards;
 		return onlineClassJoinGradientRewards;
 	}
 	}

+ 40 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/DeductReasonEnum.java

@@ -0,0 +1,40 @@
+package com.ym.mec.biz.dal.enums;
+
+import com.ym.mec.common.enums.BaseEnum;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/4/16 0016
+ **/
+public enum DeductReasonEnum implements BaseEnum<String,DeductReasonEnum> {
+    SIGN_IN_TIME_ERR("SIGN_IN_TIME_ERR", "签到异常"),
+    SIGN_OUT_TIME_ERR("SIGN_OUT_TIME_ERR", "签退异常"),
+    GPS_ERR("GPS_ERR", "签到签退地点异常"),
+    TRAIL("TRAIL", "试用期内");
+
+    private String code;
+
+    private String msg;
+
+    DeductReasonEnum(String code, String msg) {
+        this.code = code;
+        this.msg = msg;
+    }
+
+    @Override
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+}

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

@@ -169,6 +169,8 @@ public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
     SMS_INSPECTION_NOTICE("SMS_INSPECTION_NOTICE","巡查日程提醒"),
     SMS_INSPECTION_NOTICE("SMS_INSPECTION_NOTICE","巡查日程提醒"),
     TEACHER_SERVE_PUSH("TEACHER_SERVE_PUSH", "服务指标未完成提醒"),
     TEACHER_SERVE_PUSH("TEACHER_SERVE_PUSH", "服务指标未完成提醒"),
     MAINTENANCE_NOTICE_PUSH("MAINTENANCE_NOTICE_PUSH", "乐保到期提醒"),
     MAINTENANCE_NOTICE_PUSH("MAINTENANCE_NOTICE_PUSH", "乐保到期提醒"),
+
+    TEACHER_INCOME_REMIND("TEACHER_INCOME_REMIND", "今日收入"),
     REPLACEMENT_PAY_PUSH("REPLACEMENT_PAY_PUSH", "乐器置换支付提醒");
     REPLACEMENT_PAY_PUSH("REPLACEMENT_PAY_PUSH", "乐器置换支付提醒");
 
 
 
 

+ 51 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/TeacherIncomeQueryInfo.java

@@ -0,0 +1,51 @@
+package com.ym.mec.biz.dal.page;
+
+import com.ym.mec.biz.dal.enums.CourseStatusEnum;
+import com.ym.mec.common.page.QueryInfo;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/4/16 0016
+ */
+public class TeacherIncomeQueryInfo extends QueryInfo {
+
+    private Integer teacherId;
+
+    private String startDay;
+
+    private String endDay;
+
+    private CourseStatusEnum courseStatus;
+
+    public Integer getTeacherId() {
+        return teacherId;
+    }
+
+    public void setTeacherId(Integer teacherId) {
+        this.teacherId = teacherId;
+    }
+
+    public String getStartDay() {
+        return startDay;
+    }
+
+    public void setStartDay(String startDay) {
+        this.startDay = startDay;
+    }
+
+    public String getEndDay() {
+        return endDay;
+    }
+
+    public void setEndDay(String endDay) {
+        this.endDay = endDay;
+    }
+
+    public CourseStatusEnum getCourseStatus() {
+        return courseStatus;
+    }
+
+    public void setCourseStatus(CourseStatusEnum courseStatus) {
+        this.courseStatus = courseStatus;
+    }
+}

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

@@ -28,6 +28,17 @@ public class TeacherQueryInfo extends QueryInfo {
     @ApiModelProperty(value = "是否支持额外陪练课授课")
     @ApiModelProperty(value = "是否支持额外陪练课授课")
     private Boolean isSupportExtraPracticeLesson;
     private Boolean isSupportExtraPracticeLesson;
 
 
+    @ApiModelProperty(value = "是否结算课酬")
+    private Boolean isSettlementSalary;
+
+    public Boolean getIsSettlementSalary() {
+        return isSettlementSalary;
+    }
+
+    public void setIsSettlementSalary(Boolean isSettlementSalary) {
+        this.isSettlementSalary = isSettlementSalary;
+    }
+
     public Integer getTenantId() {
     public Integer getTenantId() {
         return tenantId;
         return tenantId;
     }
     }

+ 81 - 4
mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleTeacherSalaryService.java

@@ -1,17 +1,17 @@
 package com.ym.mec.biz.service;
 package com.ym.mec.biz.service;
 
 
 import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.dto.*;
-import com.ym.mec.biz.dal.entity.CourseSchedule;
-import com.ym.mec.biz.dal.entity.CourseScheduleTeacherSalary;
-import com.ym.mec.biz.dal.entity.MusicGroup;
-import com.ym.mec.biz.dal.entity.VipGroup;
+import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.page.CourseSalaryQueryInfo4Web;
 import com.ym.mec.biz.dal.page.CourseSalaryQueryInfo4Web;
 import com.ym.mec.biz.dal.page.CourseScheduleTeacherSalaryQueryInfo;
 import com.ym.mec.biz.dal.page.CourseScheduleTeacherSalaryQueryInfo;
 import com.ym.mec.biz.dal.page.ExportTeacherSalaryQueryInfo;
 import com.ym.mec.biz.dal.page.ExportTeacherSalaryQueryInfo;
+import com.ym.mec.biz.dal.page.TeacherIncomeQueryInfo;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
 import com.ym.mec.common.service.BaseService;
+import org.apache.poi.ss.formula.functions.T;
 
 
 import java.math.BigDecimal;
 import java.math.BigDecimal;
+import java.util.Date;
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
 
 
@@ -199,6 +199,14 @@ public interface CourseScheduleTeacherSalaryService extends BaseService<Long, Co
     List<TeacherAttendancesDto> getCourseTeachers(Long courseScheduleId);
     List<TeacherAttendancesDto> getCourseTeachers(Long courseScheduleId);
 
 
     /**
     /**
+     * @describe 工资奖金标记-新
+     * @author Joburgess
+     * @date 2020/12/25 0025
+     * @return void
+     */
+    void salaryMarkNew(Date startDay);
+
+    /**
      * @describe 工资奖金标记
      * @describe 工资奖金标记
      * @author Joburgess
      * @author Joburgess
      * @date 2020/12/25 0025
      * @date 2020/12/25 0025
@@ -215,4 +223,73 @@ public interface CourseScheduleTeacherSalaryService extends BaseService<Long, Co
      * @return void
      * @return void
      */
      */
     List<BigDecimal> salaryComposition(List<BigDecimal> salaries, BigDecimal targetSalary);
     List<BigDecimal> salaryComposition(List<BigDecimal> salaries, BigDecimal targetSalary);
+
+    /**
+     * @describe 计算乐团课教师实际课酬
+     * @author Joburgess
+     * @date 2021/4/16 0016
+     * @param courseScheduleTeacherSalary:
+     * @param teacherAttendances:
+     * @return void
+     */
+    void calMusicCourseTeacherActualSalary(CourseSchedule courseSchedule, CourseScheduleTeacherSalary courseScheduleTeacherSalary,
+                                           List<TeacherAttendance> teacherAttendances, School school, Teacher teacher, double attendanceRange);
+
+    /**
+     * @describe 计算VIP课教师实际课酬
+     * @author Joburgess
+     * @date 2021/4/16 0016
+     * @param courseScheduleTeacherSalary:
+     * @param teacherAttendances:
+     * @return void
+     */
+    void calVipCourseTeacherActualSalary(CourseSchedule courseSchedule, CourseScheduleTeacherSalary courseScheduleTeacherSalary,
+                                         List<TeacherAttendance> teacherAttendances, School school, Teacher teacher, double attendanceRange);
+
+    /**
+     * @describe 计算网管课教师实际课酬
+     * @author Joburgess
+     * @date 2021/4/16 0016
+     * @param courseScheduleTeacherSalary:
+     * @param teacherAttendances:
+     * @return void
+     */
+    void calPracticeTeacherActualSalary(CourseSchedule courseSchedule, CourseScheduleTeacherSalary courseScheduleTeacherSalary,
+                                        List<TeacherAttendance> teacherAttendances, School school, Teacher teacher);
+
+    /**
+     * @describe
+     * @author Joburgess
+     * @date 2021/4/16 0016
+     * @param teacherId: 获取教师收入总览
+     * @return com.ym.mec.biz.dal.dto.TeacherIncomeReviewDto
+     */
+    TeacherIncomeReviewDto getTeacherSalaryOverview(Integer teacherId);
+
+    /**
+     * @describe 查询教师课酬记录
+     * @author Joburgess
+     * @date 2021/4/16 0016
+     * @param queryInfo:
+     * @return com.ym.mec.common.page.PageInfo<com.ym.mec.biz.dal.dto.TeacherIncomeDto>
+     */
+    PageInfo<TeacherIncomeDto> queryTeacherIncomeList(TeacherIncomeQueryInfo queryInfo);
+
+    /**
+     * @describe 收入统计
+     * @author Joburgess
+     * @date 2021/4/16 0016
+     * @param year:
+     * @return java.util.Map<java.lang.String,java.math.BigDecimal>
+     */
+    Map<String, Object> teacherIncomeStat(Integer teacherId, Integer year, Integer month);
+
+    /**
+     * @describe 推送查看今日收入提醒
+     * @author Joburgess
+     * @date 2021/4/19 0019
+     * @param :
+     * @return void
+     */
+    void todayIncomeRemind();
 }
 }

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

@@ -63,6 +63,20 @@ public interface SysMessageService extends BaseService<Long, SysMessage> {
 	public void batchSendMessage(MessageSender messageSender, MessageTypeEnum messageType, Map<Integer, String> receivers, Date triggerTime,
 	public void batchSendMessage(MessageSender messageSender, MessageTypeEnum messageType, Map<Integer, String> receivers, Date triggerTime,
 			Integer readStatus, String url,String jpushType, Object... args);
 			Integer readStatus, String url,String jpushType, Object... args);
 
 
+
+	/**
+	 * 推送极光自定义消息
+	 * @param messageType 消息类型
+	 * @param receivers 消息接收者(Key:用户编号  value:消息接收对象)
+	 * @param triggerTime 触发时间
+	 * @param readStatus 阅读状态(0-未读  1-已读)
+	 * @param url 超链接地址
+	 * @param args 参数
+	 * @return
+	 */
+	public void batchPushMessage(MessageTypeEnum messageType, Map<Integer, String> receivers, Date triggerTime,
+			Integer readStatus, String url,String jpushType,String sound,String channelId, Object... args);
+
 	/**
 	/**
 	 * 发送消息
 	 * 发送消息
 	 * @param messageSender 消息发送者
 	 * @param messageSender 消息发送者

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

@@ -160,7 +160,7 @@ public interface TeacherAttendanceService extends BaseService<Long, TeacherAtten
 	 * @param courseScheduleId
 	 * @param courseScheduleId
 	 * @param content
 	 * @param content
 	 */
 	 */
-	void addComplaints(Long courseScheduleId, String content,String url,Integer userId);
+	void addComplaints(Long courseScheduleId, String content,String url,Integer userId, UpdateAttendanceEnum complaintsType);
 
 
 	/**
 	/**
 	 * 撤销考勤申述
 	 * 撤销考勤申述
@@ -176,11 +176,9 @@ public interface TeacherAttendanceService extends BaseService<Long, TeacherAtten
 
 
 	/**
 	/**
 	 * 同意异常考勤申述
 	 * 同意异常考勤申述
-	 * @param signInStatus
-	 * @param signOutStatus
 	 * @param teacherAttendanceId
 	 * @param teacherAttendanceId
 	 */
 	 */
-	void agreeTeacherAttendanceComplaints(Integer signInStatus, Integer signOutStatus, long teacherAttendanceId,String content);
+	void agreeTeacherAttendanceComplaints(long teacherAttendanceId,String content);
 
 
 	/**
 	/**
 	 * 拒绝教师课酬申述
 	 * 拒绝教师课酬申述

+ 793 - 3
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java

@@ -2,6 +2,7 @@ package com.ym.mec.biz.service.impl;
 
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;
+import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.entity.*;
@@ -9,6 +10,7 @@ import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.dal.page.CourseSalaryQueryInfo4Web;
 import com.ym.mec.biz.dal.page.CourseSalaryQueryInfo4Web;
 import com.ym.mec.biz.dal.page.CourseScheduleTeacherSalaryQueryInfo;
 import com.ym.mec.biz.dal.page.CourseScheduleTeacherSalaryQueryInfo;
 import com.ym.mec.biz.dal.page.ExportTeacherSalaryQueryInfo;
 import com.ym.mec.biz.dal.page.ExportTeacherSalaryQueryInfo;
+import com.ym.mec.biz.dal.page.TeacherIncomeQueryInfo;
 import com.ym.mec.biz.service.*;
 import com.ym.mec.biz.service.*;
 import com.ym.mec.common.constant.CommonConstants;
 import com.ym.mec.common.constant.CommonConstants;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.dal.BaseDAO;
@@ -20,8 +22,10 @@ import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
 import com.ym.mec.util.date.DateUtil;
 
 
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.ss.formula.functions.T;
 import org.slf4j.Logger;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.data.redis.core.RedisTemplate;
@@ -31,6 +35,11 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 import org.springframework.util.CollectionUtils;
 
 
 import java.math.BigDecimal;
 import java.math.BigDecimal;
+import java.text.DateFormat;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.ChronoField;
+import java.time.temporal.TemporalAdjusters;
 import java.util.*;
 import java.util.*;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 
 
@@ -264,7 +273,6 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                 trail = false;
                 trail = false;
             }
             }
 
 
-
             //如果上课日期在试用期内按80%结算
             //如果上课日期在试用期内按80%结算
             if(trail){
             if(trail){
                 expectSalary = expectSalary.multiply(new BigDecimal("0.8"));
                 expectSalary = expectSalary.multiply(new BigDecimal("0.8"));
@@ -503,7 +511,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
             return;
             return;
         }
         }
 
 
-        SysConfig sysConfig = sysConfigService.findByParamName(SysConfigService.ATTENDANCE_RANGE_VIP);
+        SysConfig sysConfig = sysConfigService.findByParamName(SysConfigService.ATTENDANCE_RANGE);
         double attendanceRange = 0;
         double attendanceRange = 0;
         if(Objects.nonNull(sysConfig)){
         if(Objects.nonNull(sysConfig)){
             attendanceRange = Double.valueOf(sysConfig.getParanValue());
             attendanceRange = Double.valueOf(sysConfig.getParanValue());
@@ -774,7 +782,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                     //早退
                     //早退
                     deductCost = deductCost.add(teacherSalary.abs());
                     deductCost = deductCost.add(teacherSalary.abs());
                     deductReasons.add("早退扣除全部课酬");
                     deductReasons.add("早退扣除全部课酬");
-                }else if((signOutCourseTimeBetween<=3&&signOutCourseTimeBetween>0)||signOutCourseTimeBetween<=3600){
+                }else if((signOutCourseTimeBetween<=3&&signOutCourseTimeBetween>0)||signOutCourseTimeBetween>=3600){
                     //异常签退,扣除50元
                     //异常签退,扣除50元
                     deductCost = deductCost.add(new BigDecimal(50));
                     deductCost = deductCost.add(new BigDecimal(50));
                     deductReasons.add("异常签退,扣除50元");
                     deductReasons.add("异常签退,扣除50元");
@@ -1409,6 +1417,54 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
     }
     }
 
 
     @Override
     @Override
+    public void salaryMarkNew(Date startDay) {
+        Date now = new Date();
+        Date date = DateUtil.addMonths(now, -1);
+        if(Objects.nonNull(startDay)){
+            date = startDay;
+        }
+        String startDate = DateUtil.format(DateUtil.getFirstDayOfMonth(date),DateUtil.DEFAULT_PATTERN);
+        String endDate = DateUtil.format(DateUtil.getLastDayOfMonth(date),DateUtil.DEFAULT_PATTERN);
+
+        redisTemplate.delete(CourseScheduleTeacherSalaryService.TASK_KEY);
+        List<CourseScheduleTeacherSalary> salaries = courseScheduleTeacherSalaryDao.getIsSalaryWithDate(startDate, endDate);
+        if(CollectionUtils.isEmpty(salaries)){
+            return;
+        }
+        SysConfig dayaBaseSalaryAmountConfig = sysConfigService.findByParamName(SysConfigService.DAYA_BASE_SALARY_AMOUNT);
+        BigDecimal dayaBaseSalaryAmount = new BigDecimal(4000);
+        if(Objects.nonNull(dayaBaseSalaryAmountConfig)&&StringUtils.isNotBlank(dayaBaseSalaryAmountConfig.getParanValue())){
+            dayaBaseSalaryAmount = new BigDecimal(dayaBaseSalaryAmountConfig.getParanValue());
+        }
+
+        Map<Integer, List<CourseScheduleTeacherSalary>> teacherSalariesMap = salaries.stream().collect(Collectors.groupingBy(CourseScheduleTeacherSalary::getUserId));
+        List<CourseScheduleTeacherSalary> updateRecords = new ArrayList<>();
+        for (Map.Entry<Integer, List<CourseScheduleTeacherSalary>> teacherSalariesMapEntry : teacherSalariesMap.entrySet()) {
+            List<CourseScheduleTeacherSalary> teacherSalaries = teacherSalariesMapEntry.getValue();
+
+            BigDecimal teacherBaseSalaryAmount = new BigDecimal("0");
+
+            teacherSalaries.sort(Comparator.comparing(ts->ts.getCourseSchedule().getStartClassTime()));
+            for (CourseScheduleTeacherSalary teacherSalary : teacherSalaries) {
+                if(teacherBaseSalaryAmount.compareTo(dayaBaseSalaryAmount)>=0){
+                    break;
+                }
+
+                teacherBaseSalaryAmount = teacherBaseSalaryAmount.add(teacherSalary.getActualSalary());
+
+                CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
+                courseScheduleTeacherSalary.setId(teacherSalary.getId());
+                courseScheduleTeacherSalary.setBelongToDaya(true);
+                updateRecords.add(courseScheduleTeacherSalary);
+            }
+
+        }
+        if(!CollectionUtils.isEmpty(updateRecords)){
+            courseScheduleTeacherSalaryDao.batchUpdate(updateRecords);
+        }
+    }
+
+    @Override
     @Transactional(rollbackFor = Exception.class)
     @Transactional(rollbackFor = Exception.class)
     public void salaryMark() {
     public void salaryMark() {
         Date now = new Date();
         Date now = new Date();
@@ -1497,4 +1553,738 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
         }
         }
         return result.get(0).get(target);
         return result.get(0).get(target);
     }
     }
+
+    @Override
+    public void calMusicCourseTeacherActualSalary(CourseSchedule courseSchedule, CourseScheduleTeacherSalary courseScheduleTeacherSalary,
+                                                  List<TeacherAttendance> teacherAttendances, School school, Teacher teacher, double attendanceRange) {
+
+        BigDecimal teacherSalary = courseScheduleTeacherSalary.getExpectSalary();
+
+        if(CourseSchedule.CourseScheduleType.MUSIC_NETWORK.equals(courseSchedule.getType())||CourseSchedule.CourseScheduleType.HIGH_ONLINE.equals(courseSchedule.getType())){
+            List<TeacherSalaryDeductReasonDto> deductReasons = new ArrayList<>();
+
+            BigDecimal subsidy = new BigDecimal(0);
+            if (Objects.nonNull(school)&&Objects.nonNull(school.getSubsidy())) {
+                subsidy = school.getSubsidy();
+            }
+
+            teacherSalary = teacherSalary.add(subsidy);
+            teacherSalary = teacherSalary.add(subsidy);
+            if(BigDecimal.ZERO.compareTo(teacherSalary)>0){
+                teacherSalary = new BigDecimal(0);
+            }
+
+            BigDecimal expectTeacherSalary = teacherSalary;
+
+            //判断课程是否在试用期内
+            boolean trail = false;
+
+            if(Objects.nonNull(teacher)&&Objects.nonNull(teacher.getEntryDate())&&courseSchedule.getClassDate().compareTo(teacher.getEntryDate())>=0){
+                trail = true;
+            }
+            if(Objects.nonNull(teacher)&&Objects.nonNull(teacher.getFormalStaffDate())&&courseSchedule.getClassDate().compareTo(teacher.getFormalStaffDate())>=0){
+                trail = false;
+            }
+
+            //如果上课日期在试用期内按80%结算
+            if(trail){
+                teacherSalary = teacherSalary.multiply(new BigDecimal("0.8"));
+                deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.TRAIL, expectTeacherSalary.subtract(teacherSalary)));
+            }
+
+            //扣除费用
+            BigDecimal deductCost = new BigDecimal(0);
+
+            TeacherAttendance teacherAttendance = teacherAttendances.get(0);
+            if(CollectionUtils.isEmpty(teacherAttendances)||Objects.isNull(teacherAttendance.getSignInStatus())){
+                //未签到扣除全部课酬
+                deductCost = deductCost.add(teacherSalary.abs());
+                deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_IN_TIME_ERR, teacherSalary.abs()));
+            }else if(YesOrNoEnum.NO.equals(teacherAttendance.getSignInStatus())){
+                //异常签到
+                int signCourseTimeBetweenSeconds = DateUtil.secondsBetween(teacherAttendance.getSignInTime(), courseSchedule.getStartClassTime());
+                float signCourseTimeBetween = (float)signCourseTimeBetweenSeconds/(float)60;
+                if(signCourseTimeBetween<=1&&signCourseTimeBetween>-3){
+                    //课程开始前1分钟至开始后3分钟进入教室
+                    deductCost = deductCost.add(teacherSalary.divide(new BigDecimal(2)).abs());
+                    deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_IN_TIME_ERR, teacherSalary.divide(new BigDecimal(2)).abs()));
+                }else if(signCourseTimeBetween<=-3){
+                    //课程开始后3分钟后进入教室
+                    deductCost = deductCost.add(teacherSalary.abs());
+                    deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_IN_TIME_ERR, teacherSalary.abs()));
+                }
+            }
+
+            if(CollectionUtils.isEmpty(teacherAttendances)||Objects.isNull(teacherAttendance.getSignOutStatus())){
+                //未签退扣除一半课酬
+                deductCost = deductCost.add(teacherSalary.divide(new BigDecimal(2)).abs());
+                deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_OUT_TIME_ERR, teacherSalary.divide(new BigDecimal(2)).abs()));
+            }else if(YesOrNoEnum.NO.equals(teacherAttendance.getSignOutStatus())){
+                //异常签退
+                int signOutCourseTimeBetweenSeconds = DateUtil.secondsBetween(teacherAttendance.getSignOutTime(), courseSchedule.getEndClassTime());
+                float signOutCourseTimeBetween = (float)signOutCourseTimeBetweenSeconds/(float)60;
+
+                if(signOutCourseTimeBetween>3){
+                    //课程开始前20分钟至开始后3分钟退出教室
+                    deductCost = deductCost.add(teacherSalary.abs());
+//                    deductReasons.add("课程结束前3分钟之前退出教室扣除全部课酬");
+                    deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_OUT_TIME_ERR, teacherSalary.abs()));
+                }else if(signOutCourseTimeBetween<=3&&signOutCourseTimeBetween>0){
+                    //课程结束前3分钟后至课程结束前退出教室
+                    deductCost = deductCost.add(teacherSalary.divide(new BigDecimal(2)).abs());
+//                    deductReasons.add("课程结束前3分钟后至课程结束前退出教室扣除一半课酬");
+                    deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_OUT_TIME_ERR, teacherSalary.divide(new BigDecimal(2)).abs()));
+                }
+            }
+
+            BigDecimal finalSalary = teacherSalary.subtract(deductCost).setScale(BigDecimal.ZERO.intValue(), BigDecimal.ROUND_HALF_UP);
+
+            //更新教师结算信息
+            courseScheduleTeacherSalary.setSubsidy(subsidy);
+            courseScheduleTeacherSalary.setActualSalary(finalSalary.compareTo(BigDecimal.ZERO)<0?BigDecimal.ZERO:finalSalary);
+            courseScheduleTeacherSalary.setDeductReasons(deductReasons);
+        }else{
+            List<TeacherSalaryDeductReasonDto> deductReasons = new ArrayList<>();
+
+            BigDecimal subsidy = new BigDecimal(0);
+            if (Objects.nonNull(school)&&Objects.nonNull(school.getSubsidy())) {
+                subsidy = school.getSubsidy();
+            }
+            teacherSalary = teacherSalary.add(subsidy);
+            if(BigDecimal.ZERO.compareTo(teacherSalary)>0){
+                teacherSalary = new BigDecimal(0);
+            }
+
+            BigDecimal expectTeacherSalary = teacherSalary;
+
+            //判断课程是否在试用期内
+            boolean trail = false;
+
+            if(Objects.nonNull(teacher)&&Objects.nonNull(teacher.getEntryDate())&&courseSchedule.getClassDate().compareTo(teacher.getEntryDate())>=0){
+                trail = true;
+            }
+            if(Objects.nonNull(teacher)&&Objects.nonNull(teacher.getFormalStaffDate())&&courseSchedule.getClassDate().compareTo(teacher.getFormalStaffDate())>=0){
+                trail = false;
+            }
+
+            //如果上课日期在试用期内按80%结算
+            if(trail){
+                teacherSalary = teacherSalary.multiply(new BigDecimal("0.8"));
+//                deductReasons.add("未转正");
+                deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.TRAIL, expectTeacherSalary.subtract(teacherSalary)));
+            }
+
+            //扣除费用
+            BigDecimal deductCost = BigDecimal.ZERO;
+
+            TeacherAttendance teacherAttendance = null;
+            if(!CollectionUtils.isEmpty(teacherAttendances)){
+                teacherAttendance = teacherAttendances.get(0);
+            }
+
+            boolean signInInRange = false;
+            boolean signOutInRange = false;
+            if(Objects.nonNull(school)&&Objects.nonNull(school.getLongitudeLatitude())
+                    &&Objects.nonNull(teacherAttendance)
+                    &&StringUtils.isNotBlank(teacherAttendance.getSignInLongitudeLatitude())
+                    &&StringUtils.isNotBlank(teacherAttendance.getSignOutLongitudeLatitude())){
+                double signInDistance = MapUtil.distance(teacherAttendance.getSignInLongitudeLatitude(),
+                        school.getLongitudeLatitude());
+                if (signInDistance <= attendanceRange) {
+                    signInInRange = true;
+                }
+                double signOutDistance = MapUtil.distance(teacherAttendance.getSignOutLongitudeLatitude(),
+                        school.getLongitudeLatitude());
+                if (signOutDistance <= attendanceRange) {
+                    signOutInRange = true;
+                }
+            }
+
+            BigDecimal gpsDeductAmount = new BigDecimal("0");
+
+            if(Objects.isNull(teacherAttendance)||Objects.isNull(teacherAttendance.getSignInStatus())){
+                //无签到记录扣除全部课酬
+                deductCost = deductCost.add(teacherSalary.abs());
+//                deductReasons.add("未签到扣除全部课酬");
+                deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_IN_TIME_ERR, teacherSalary.abs()));
+            }else if(YesOrNoEnum.NO.equals(teacherAttendance.getSignInStatus())){
+                int signCourseTimeBetweenSeconds = DateUtil.secondsBetween(teacherAttendance.getSignInTime(), courseSchedule.getStartClassTime());
+                float signCourseTimeBetween = (float)signCourseTimeBetweenSeconds/(float)60;
+                if(signCourseTimeBetween>0&&signCourseTimeBetween<=20){
+                    //未提前20分钟打卡扣除50元
+                    deductCost = deductCost.add(new BigDecimal(50));
+//                    deductReasons.add("未提前20分钟打卡扣除50元");
+                    deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_IN_TIME_ERR, new BigDecimal(50)));
+                }else if(signCourseTimeBetween<=0&&signCourseTimeBetween>-30){
+                    //迟到30分钟内扣除一半课酬
+                    deductCost = deductCost.add(teacherSalary.divide(new BigDecimal(2)).abs());
+//                    deductReasons.add("迟到30分钟内扣除一半课酬");
+                    deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_IN_TIME_ERR, teacherSalary.divide(new BigDecimal(2)).abs()));
+                }else if(signCourseTimeBetween<=-30){
+                    //迟到30分钟及以上扣除全部课酬
+                    deductCost = deductCost.add(teacherSalary.abs());
+//                    deductReasons.add("迟到30分钟及以上扣除全部课酬");
+                    deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_IN_TIME_ERR, teacherSalary.abs()));
+                }
+                if(!signInInRange){
+                    //签到经纬度异常扣除50
+                    deductCost = deductCost.add(new BigDecimal(50));
+//                    deductReasons.add("签到经纬度异常扣除50");
+                    gpsDeductAmount =  new BigDecimal(50);
+                }
+            }else{
+                signInInRange = true;
+            }
+
+            if(Objects.isNull(teacherAttendance)||Objects.isNull(teacherAttendance.getSignOutStatus())){
+                //未签退扣除全部课酬
+                deductCost = deductCost.add(teacherSalary.abs());
+//                deductReasons.add("未签退扣除全部课酬");
+                deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_OUT_TIME_ERR, teacherSalary.abs()));
+            }else if(YesOrNoEnum.NO.equals(teacherAttendance.getSignOutStatus())){
+                int signOutCourseTimeBetweenSeconds = DateUtil.secondsBetween(teacherAttendance.getSignOutTime(), courseSchedule.getEndClassTime());
+                float signOutCourseTimeBetween = (float)signOutCourseTimeBetweenSeconds/(float) 60;
+                if(signOutCourseTimeBetween>3){
+                    //早退
+                    deductCost = deductCost.add(teacherSalary.abs());
+//                    deductReasons.add("早退扣除全部课酬");
+                    deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_OUT_TIME_ERR, teacherSalary.abs()));
+                }else if((signOutCourseTimeBetween<=3&&signOutCourseTimeBetween>0)||signOutCourseTimeBetween>=3600){
+                    //异常签退,扣除50元
+                    deductCost = deductCost.add(new BigDecimal(50));
+//                    deductReasons.add("异常签退,扣除50元");
+                    deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_OUT_TIME_ERR, new BigDecimal(50)));
+                }else{
+                    //签退经纬度异常,扣除50元
+                    deductCost = deductCost.add(new BigDecimal(50));
+//                    deductReasons.add("签退经纬度异常,扣除50元");
+                    gpsDeductAmount =  new BigDecimal(50);
+                }
+            }else{
+                signOutInRange = true;
+            }
+
+            if(!signInInRange&&!signOutInRange){
+                //签到签退GPS定位在指定距离外
+                deductCost = deductCost.add(teacherSalary.abs());
+//                deductReasons.add("签到签退GPS定位在指定距离外,扣除全部课酬");
+                gpsDeductAmount = teacherSalary.abs();
+            }
+
+            if(BigDecimal.ZERO.compareTo(gpsDeductAmount)<0){
+                deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.GPS_ERR, gpsDeductAmount));
+            }
+
+            BigDecimal finalSalary = teacherSalary.subtract(deductCost).setScale(BigDecimal.ZERO.intValue(), BigDecimal.ROUND_HALF_UP);
+
+            //更新教师结算信息
+            courseScheduleTeacherSalary.setSubsidy(subsidy);
+            courseScheduleTeacherSalary.setActualSalary(finalSalary.compareTo(BigDecimal.ZERO)<0?BigDecimal.ZERO:finalSalary);
+            courseScheduleTeacherSalary.setDeductReasons(deductReasons);
+        }
+    }
+
+    @Override
+    public void calVipCourseTeacherActualSalary(CourseSchedule courseSchedule, CourseScheduleTeacherSalary courseScheduleTeacherSalary,
+                                                List<TeacherAttendance> teacherAttendances, School school, Teacher teacher, double attendanceRange) {
+        List<TeacherSalaryDeductReasonDto> deductReasons = new ArrayList<>();
+
+        BigDecimal expectSalary = courseScheduleTeacherSalary.getExpectSalary();
+
+        BigDecimal subsidy = new BigDecimal(0);
+        if (Objects.nonNull(school)&&Objects.nonNull(school.getSubsidy())) {
+            subsidy = school.getSubsidy();
+        }
+        courseScheduleTeacherSalary.setSubsidy(subsidy);
+        expectSalary = expectSalary.add(subsidy);
+        if(BigDecimal.ZERO.compareTo(expectSalary)>0){
+            expectSalary = new BigDecimal(0);
+        }
+
+        BigDecimal expectTeacherSalary = expectSalary;
+
+        //判断课程是否在试用期内
+        boolean trail = false;
+
+        if(Objects.nonNull(teacher)&&Objects.nonNull(teacher.getEntryDate())&&courseSchedule.getClassDate().compareTo(teacher.getEntryDate())>=0){
+            trail = true;
+        }
+        if(Objects.nonNull(teacher)&&Objects.nonNull(teacher.getFormalStaffDate())&&courseSchedule.getClassDate().compareTo(teacher.getFormalStaffDate())>=0){
+            trail = false;
+        }
+
+        //如果上课日期在试用期内按80%结算
+        if(trail){
+            expectSalary = expectSalary.multiply(new BigDecimal("0.8"));
+//            deductReasons.add("未转正");
+            deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.TRAIL, expectTeacherSalary.subtract(expectSalary)));
+        }
+
+        //扣除费用
+        BigDecimal deductCost = new BigDecimal(0);
+        BigDecimal gpsDeductAmount = new BigDecimal("0");
+
+        if(CollectionUtils.isEmpty(teacherAttendances)||Objects.isNull(teacherAttendances.get(0).getSignInStatus())){
+            //未签到扣除全部课酬
+            deductCost = deductCost.add(expectSalary.abs());
+//            deductReasons.add("未签到扣除全部课酬");
+            deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_IN_TIME_ERR, expectSalary.abs()));
+        }else if(YesOrNoEnum.NO.equals(teacherAttendances.get(0).getSignInStatus())&&TeachModeEnum.ONLINE.equals(courseSchedule.getTeachMode())){
+            //异常签到
+            int signCourseTimeBetweenSeconds = DateUtil.secondsBetween(teacherAttendances.get(0).getSignInTime(), courseSchedule.getStartClassTime());
+            float signCourseTimeBetween = (float)signCourseTimeBetweenSeconds/(float)60;
+            if(signCourseTimeBetween<=1&&signCourseTimeBetween>-3){
+                //课程开始前1分钟至开始后3分钟进入教室
+                deductCost = deductCost.add(expectSalary.divide(new BigDecimal(2)).abs());
+//                deductReasons.add("课程开始前1分钟至开始后3分钟进入教室扣除一半课酬");
+                deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_IN_TIME_ERR, expectSalary.divide(new BigDecimal(2)).abs()));
+            }else if(signCourseTimeBetween<=-3){
+                //课程开始后3分钟后进入教室
+                deductCost = deductCost.add(expectSalary.abs());
+//                deductReasons.add("课程开始后3分钟进入教室扣除全部课酬");
+                deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_IN_TIME_ERR, expectSalary.abs()));
+            }
+        }else if(YesOrNoEnum.NO.equals(teacherAttendances.get(0).getSignInStatus())&&TeachModeEnum.OFFLINE.equals(courseSchedule.getTeachMode())){
+            deductCost = deductCost.add(expectSalary.abs());
+//            deductReasons.add("点名时经纬度不在范围内扣除全部课酬");
+            gpsDeductAmount = expectSalary.abs();
+        }
+
+        if(CollectionUtils.isEmpty(teacherAttendances)||Objects.isNull(teacherAttendances.get(0).getSignOutStatus())){
+            //未签退扣除全部课酬
+            deductCost = deductCost.add(expectSalary.abs());
+//            deductReasons.add("未签退扣除全部课酬");
+            deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_OUT_TIME_ERR, expectSalary.abs()));
+        }else if(YesOrNoEnum.NO.equals(teacherAttendances.get(0).getSignOutStatus())&&TeachModeEnum.ONLINE.equals(courseSchedule.getTeachMode())){
+            //异常签退
+            int signOutCourseTimeBetweenSeconds = DateUtil.secondsBetween(teacherAttendances.get(0).getSignOutTime(), courseSchedule.getEndClassTime());
+            float signOutCourseTimeBetween = (float)signOutCourseTimeBetweenSeconds/(float)60;
+
+            if(signOutCourseTimeBetween>3){
+                //课程开始前20分钟至开始后3分钟退出教室
+                deductCost = deductCost.add(expectSalary.abs());
+//                deductReasons.add("课程结束前3分钟之前退出教室扣除全部课酬");
+                deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_OUT_TIME_ERR, expectSalary.abs()));
+            }else if(signOutCourseTimeBetween<=3&&signOutCourseTimeBetween>0){
+                //课程结束前3分钟后至课程结束前退出教室
+                deductCost = deductCost.add(expectSalary.divide(new BigDecimal(2)).abs());
+//                deductReasons.add("课程结束前3分钟后至课程结束前退出教室扣除一半课酬");
+                deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_OUT_TIME_ERR, expectSalary.divide(new BigDecimal(2)).abs()));
+            }
+        }else if(YesOrNoEnum.NO.equals(teacherAttendances.get(0).getSignInStatus())&&TeachModeEnum.OFFLINE.equals(courseSchedule.getTeachMode())){
+            deductCost = deductCost.add(expectSalary.abs());
+//            deductReasons.add("点名时经纬度不在范围内扣除全部课酬");
+            gpsDeductAmount = expectSalary.abs();
+        }
+
+        if(BigDecimal.ZERO.compareTo(gpsDeductAmount)<0){
+            deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.GPS_ERR, gpsDeductAmount));
+        }
+
+        BigDecimal finalSalary = expectSalary.subtract(deductCost).setScale(BigDecimal.ZERO.intValue(), BigDecimal.ROUND_HALF_UP);
+        courseScheduleTeacherSalary.setActualSalary(finalSalary.compareTo(BigDecimal.ZERO)<0?BigDecimal.ZERO:finalSalary);
+        courseScheduleTeacherSalary.setDeductReasons(deductReasons);
+    }
+
+    @Override
+    public void calPracticeTeacherActualSalary(CourseSchedule courseSchedule, CourseScheduleTeacherSalary courseScheduleTeacherSalary,
+                                               List<TeacherAttendance> teacherAttendances, School school, Teacher teacher) {
+        List<TeacherSalaryDeductReasonDto> deductReasons = new ArrayList<>();
+
+        BigDecimal expectSalary = courseScheduleTeacherSalary.getExpectSalary();
+
+        BigDecimal subsidy = new BigDecimal(0);
+        if (Objects.nonNull(school)&&Objects.nonNull(school.getSubsidy())) {
+            subsidy = school.getSubsidy();
+        }
+        courseScheduleTeacherSalary.setSubsidy(subsidy);
+        expectSalary = expectSalary.add(subsidy);
+        if(BigDecimal.ZERO.compareTo(expectSalary)>0){
+            expectSalary = new BigDecimal(0);
+        }
+
+        BigDecimal expectTeacherSalary = expectSalary;
+
+        //判断课程是否在试用期内
+        boolean trail = false;
+
+        if(Objects.nonNull(teacher)&&Objects.nonNull(teacher.getEntryDate())&&courseSchedule.getClassDate().compareTo(teacher.getEntryDate())>=0){
+            trail = true;
+        }
+        if(Objects.nonNull(teacher)&&Objects.nonNull(teacher.getFormalStaffDate())&&courseSchedule.getClassDate().compareTo(teacher.getFormalStaffDate())>=0){
+            trail = false;
+        }
+
+        //如果上课日期在试用期内按80%结算
+        if(trail){
+            expectSalary = expectSalary.multiply(new BigDecimal("0.8"));
+//            deductReasons.add("未转正");
+            deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.TRAIL, expectTeacherSalary.subtract(expectSalary)));
+        }
+
+        //扣除费用
+        BigDecimal deductCost = new BigDecimal(0);
+
+        TeacherAttendance teacherAttendance = null;
+        if(!CollectionUtils.isEmpty(teacherAttendances)){
+            teacherAttendance = teacherAttendances.get(0);
+        }
+        if(CollectionUtils.isEmpty(teacherAttendances)||Objects.isNull(teacherAttendance.getSignInStatus())){
+            //未签到扣除全部课酬
+            deductCost = deductCost.add(expectSalary.abs());
+//            deductReasons.add("未签到扣除全部课酬");
+            deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_IN_TIME_ERR, expectSalary.abs()));
+        }else if(YesOrNoEnum.NO.equals(teacherAttendance.getSignInStatus())){
+            //异常签到
+            int signCourseTimeBetweenSeconds = DateUtil.secondsBetween(teacherAttendance.getSignInTime(), courseSchedule.getStartClassTime());
+            float signCourseTimeBetween = (float)signCourseTimeBetweenSeconds/(float)60;
+            if(signCourseTimeBetween<=1&&signCourseTimeBetween>-3){
+                //课程开始前1分钟至开始后3分钟进入教室
+                deductCost = deductCost.add(expectSalary.divide(new BigDecimal(2)).abs());
+//                deductReasons.add("课程开始前1分钟至开始后3分钟进入教室扣除一半课酬");
+                deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_IN_TIME_ERR, expectSalary.divide(new BigDecimal(2)).abs()));
+            }else if(signCourseTimeBetween<=-3){
+                //课程开始后3分钟后进入教室
+                deductCost = deductCost.add(expectSalary.abs());
+//                deductReasons.add("课程开始后3分钟进入教室扣除全部课酬");
+                deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_IN_TIME_ERR, expectSalary.abs()));
+            }
+        }
+
+        if(CollectionUtils.isEmpty(teacherAttendances)||Objects.isNull(teacherAttendance.getSignOutStatus())){
+            //未签退扣除全部课酬
+            deductCost = deductCost.add(expectSalary.abs());
+//            deductReasons.add("未签退扣除全部课酬");
+            deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_OUT_TIME_ERR, expectSalary.abs()));
+        }else if(YesOrNoEnum.NO.equals(teacherAttendance.getSignOutStatus())){
+            //异常签退
+            int signOutCourseTimeBetweenSeconds = DateUtil.secondsBetween(teacherAttendance.getSignOutTime(), courseSchedule.getEndClassTime());
+            float signOutCourseTimeBetween = (float)signOutCourseTimeBetweenSeconds/(float)60;
+
+            if(signOutCourseTimeBetween>3){
+                //课程开始前20分钟至开始后3分钟退出教室
+                deductCost = deductCost.add(expectSalary.abs());
+//                deductReasons.add("课程结束前3分钟之前退出教室扣除全部课酬");
+                deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_OUT_TIME_ERR, expectSalary.abs()));
+            }else if(signOutCourseTimeBetween<=3&&signOutCourseTimeBetween>0){
+                //课程结束前3分钟后至课程结束前退出教室
+                deductCost = deductCost.add(expectSalary.divide(new BigDecimal(2)).abs());
+//                deductReasons.add("课程结束前3分钟后至课程结束前退出教室扣除一半课酬");
+                deductReasons.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SIGN_OUT_TIME_ERR, expectSalary.divide(new BigDecimal(2)).abs()));
+            }
+        }
+
+        BigDecimal finalSalary = expectSalary.subtract(deductCost).setScale(BigDecimal.ZERO.intValue(), BigDecimal.ROUND_HALF_UP);
+
+        courseScheduleTeacherSalary.setActualSalary(finalSalary.compareTo(BigDecimal.ZERO)<0?BigDecimal.ZERO:finalSalary);
+        courseScheduleTeacherSalary.setDeductReasons(deductReasons);
+    }
+
+    @Override
+    public TeacherIncomeReviewDto getTeacherSalaryOverview(Integer teacherId) {
+        LocalDate nowDate = LocalDate.now();
+        LocalDate monthFirstDay = nowDate.with(TemporalAdjusters.firstDayOfMonth());
+        LocalDate monthLastDay = nowDate.with(TemporalAdjusters.lastDayOfMonth());
+
+        TeacherIncomeReviewDto teacherSalaryOverview = courseScheduleTeacherSalaryDao.getTeacherSalaryOverview(teacherId, monthFirstDay.toString(), monthLastDay.toString(), "2021-03-01", null);
+        if(Objects.isNull(teacherSalaryOverview)){
+            teacherSalaryOverview = new TeacherIncomeReviewDto();
+        }
+        if(BigDecimal.ZERO.compareTo(teacherSalaryOverview.getThisMonthExpectIncome())>0){
+            teacherSalaryOverview.setThisMonthExpectIncome(BigDecimal.ZERO);
+        }
+
+        List<CourseSchedule> teacherCourses = courseScheduleDao.getTeacherCourseWithClassDate(teacherId, monthFirstDay.toString(), monthLastDay.toString(), CourseStatusEnum.OVER);
+        if(CollectionUtils.isEmpty(teacherCourses)){
+            return teacherSalaryOverview;
+        }
+
+        List<Long> courseIds = teacherCourses.stream().map(CourseSchedule::getId).collect(Collectors.toList());
+
+        //课程教师课酬
+        List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries = courseScheduleTeacherSalaryDao.findByCourseSchedules(courseIds);
+        List<CourseScheduleTeacherSalary> teacherSalaries = courseScheduleTeacherSalaries.stream().filter(c -> teacherId.equals(c.getUserId())).collect(Collectors.toList());
+        if(CollectionUtils.isEmpty(teacherSalaries)){
+            return teacherSalaryOverview;
+        }
+
+        Map<Long, CourseSchedule> idCourseMap = teacherCourses.stream().collect(Collectors.toMap(CourseSchedule::getId, c -> c, (c1, c2) -> c1));
+
+        //教学点
+        Set<Integer> schoolIds = teacherCourses.stream().map(CourseSchedule::getSchoolId).collect(Collectors.toSet());
+        List<School> schools = schoolDao.getSchools(new ArrayList<>(schoolIds));
+        Map<Integer, School> idSchoolMap = new HashMap<>();
+        if(!CollectionUtils.isEmpty(schools)){
+            idSchoolMap = schools.stream().collect(Collectors.toMap(School::getId, s->s, (s1, s2)->s1));
+        }
+
+        //签到GPS范围
+        SysConfig sysConfig = sysConfigService.findByParamName(SysConfigService.ATTENDANCE_RANGE);
+        double attendanceRange = 0;
+        if(Objects.nonNull(sysConfig)){
+            attendanceRange = Double.valueOf(sysConfig.getParanValue());
+        }
+
+        //签到GPS范围VIP
+        SysConfig vipSysConfig = sysConfigService.findByParamName(SysConfigService.ATTENDANCE_RANGE_VIP);
+        double vipAttendanceRange = 0;
+        if(Objects.nonNull(vipSysConfig)){
+            vipAttendanceRange = Double.valueOf(vipSysConfig.getParanValue());
+        }
+
+        //教师签到记录
+        List<TeacherAttendance> allTeacherAttendances = teacherAttendanceDao.findByCourseSchedules(courseIds);
+        Map<Long, List<TeacherAttendance>> teacherCourseAttendanceMap = allTeacherAttendances.stream().filter(c->teacherId.equals(c.getTeacherId())).collect(Collectors.groupingBy(TeacherAttendance::getCourseScheduleId));
+
+        //教师信息
+        Set<Integer> teacherIds = teacherSalaries.stream().map(CourseScheduleTeacherSalary::getUserId).collect(Collectors.toSet());
+        List<Teacher> teachers = teacherDao.findByTeacherIds(new ArrayList<>(teacherIds));
+        Map<Integer, Teacher> idTeacherMap = teachers.stream().collect(Collectors.toMap(Teacher::getId, t -> t, (t1, t2) -> t1));
+
+        for (CourseScheduleTeacherSalary teacherSalary : teacherSalaries) {
+            //课程
+            CourseSchedule courseSchedule = idCourseMap.get(teacherSalary.getCourseScheduleId());
+            //签到记录
+            List<TeacherAttendance> teacherAttendances = teacherCourseAttendanceMap.get(teacherSalary.getCourseScheduleId());
+            //教学点
+            School school = idSchoolMap.get(courseSchedule.getSchoolId());
+            //教师
+            Teacher teacher = idTeacherMap.get(teacherSalary.getUserId());
+
+            switch (courseSchedule.getGroupType()){
+                case MUSIC:
+                    calMusicCourseTeacherActualSalary(courseSchedule, teacherSalary, teacherAttendances, school, teacher, attendanceRange);
+                    break;
+                case VIP:
+                    calVipCourseTeacherActualSalary(courseSchedule, teacherSalary, teacherAttendances, school, teacher, vipAttendanceRange);
+                    break;
+                case PRACTICE:
+                    calPracticeTeacherActualSalary(courseSchedule, teacherSalary, teacherAttendances, school, teacher);
+                    break;
+            }
+        }
+
+        BigDecimal monthActualIncome = teacherSalaries.stream().map(CourseScheduleTeacherSalary::getActualSalary).reduce(BigDecimal.ZERO, BigDecimal::add);
+        teacherSalaryOverview.setThisMonthActualIncome(monthActualIncome);
+
+        SysConfig dayaBaseSalaryAmountConfig = sysConfigService.findByParamName(SysConfigService.DAYA_BASE_SALARY_AMOUNT);
+        BigDecimal dayaBaseSalaryAmount = new BigDecimal(4000);
+        if(Objects.nonNull(dayaBaseSalaryAmountConfig)&&StringUtils.isNotBlank(dayaBaseSalaryAmountConfig.getParanValue())){
+            dayaBaseSalaryAmount = new BigDecimal(dayaBaseSalaryAmountConfig.getParanValue());
+        }
+
+        if(monthActualIncome.compareTo(dayaBaseSalaryAmount)>0){
+            teacherSalaryOverview.setDayaIncome(dayaBaseSalaryAmount);
+            teacherSalaryOverview.setOtherIncome(monthActualIncome.subtract(dayaBaseSalaryAmount));
+        }else{
+            teacherSalaryOverview.setDayaIncome(monthActualIncome);
+        }
+
+        teacherSalaryOverview.setAttendanceRange(attendanceRange);
+        teacherSalaryOverview.setVipAttendanceRange(vipAttendanceRange);
+
+        return teacherSalaryOverview;
+    }
+
+    @Override
+    public PageInfo<TeacherIncomeDto> queryTeacherIncomeList(TeacherIncomeQueryInfo queryInfo) {
+        PageInfo<TeacherIncomeDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<String, Object>();
+        MapUtil.populateMap(params, queryInfo);
+
+        int count = courseScheduleDao.countTeacherCourse(params);
+        pageInfo.setTotal(count);
+        params.put("offset", pageInfo.getOffset());
+        List<CourseSchedule> courseSchedules = courseScheduleDao.queryTeacherCourse(params);
+
+        List<TeacherIncomeDto> dataList = new ArrayList<>();
+        if (!CollectionUtils.isEmpty(courseSchedules)) {
+            List<Long> courseIds = courseSchedules.stream().map(CourseSchedule::getId).collect(Collectors.toList());
+
+            //课程教师课酬
+            List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries = courseScheduleTeacherSalaryDao.findByCourseSchedules(courseIds);
+            List<CourseScheduleTeacherSalary> teacherSalaries = courseScheduleTeacherSalaries.stream().filter(c -> queryInfo.getTeacherId().equals(c.getUserId())).collect(Collectors.toList());
+
+            Map<Long, CourseSchedule> idCourseMap = courseSchedules.stream().collect(Collectors.toMap(CourseSchedule::getId, c -> c, (c1, c2) -> c1));
+
+            //教学点
+            Set<Integer> schoolIds = courseSchedules.stream().map(CourseSchedule::getSchoolId).collect(Collectors.toSet());
+            List<School> schools = schoolDao.getSchools(new ArrayList<>(schoolIds));
+            Map<Integer, School> idSchoolMap = new HashMap<>();
+            if(!CollectionUtils.isEmpty(schools)){
+                idSchoolMap = schools.stream().collect(Collectors.toMap(School::getId, s->s, (s1, s2)->s1));
+            }
+
+            //签到GPS范围
+            SysConfig sysConfig = sysConfigService.findByParamName(SysConfigService.ATTENDANCE_RANGE);
+            double attendanceRange = 0;
+            if(Objects.nonNull(sysConfig)){
+                attendanceRange = Double.valueOf(sysConfig.getParanValue());
+            }
+
+            //签到GPS范围VIP
+            SysConfig vipSysConfig = sysConfigService.findByParamName(SysConfigService.ATTENDANCE_RANGE_VIP);
+            double vipAttendanceRange = 0;
+            if(Objects.nonNull(vipSysConfig)){
+                vipAttendanceRange = Double.valueOf(vipSysConfig.getParanValue());
+            }
+
+            //教师签到记录
+            List<TeacherAttendance> allTeacherAttendances = teacherAttendanceDao.findByCourseSchedules(courseIds);
+            Map<Long, List<TeacherAttendance>> teacherCourseAttendanceMap = allTeacherAttendances.stream().filter(c->queryInfo.getTeacherId().equals(c.getTeacherId())).collect(Collectors.groupingBy(TeacherAttendance::getCourseScheduleId));
+
+            //教师信息
+            Set<Integer> teacherIds = teacherSalaries.stream().map(CourseScheduleTeacherSalary::getUserId).collect(Collectors.toSet());
+            List<Teacher> teachers = teacherDao.findByTeacherIds(new ArrayList<>(teacherIds));
+            Map<Integer, Teacher> idTeacherMap = teachers.stream().collect(Collectors.toMap(Teacher::getId, t -> t, (t1, t2) -> t1));
+
+            for (CourseScheduleTeacherSalary teacherSalary : teacherSalaries) {
+                //课程
+                CourseSchedule courseSchedule = idCourseMap.get(teacherSalary.getCourseScheduleId());
+                //签到记录
+                List<TeacherAttendance> teacherAttendances = teacherCourseAttendanceMap.get(teacherSalary.getCourseScheduleId());
+                //教学点
+                School school = idSchoolMap.get(courseSchedule.getSchoolId());
+                //教师
+                Teacher teacher = idTeacherMap.get(teacherSalary.getUserId());
+
+                BigDecimal oldSalary = null;
+                BigDecimal oldSubsidy = null;
+                if(Objects.nonNull(teacherSalary.getSettlementTime())){
+                    oldSalary = teacherSalary.getActualSalary();
+                    oldSubsidy = teacherSalary.getSubsidy();
+                }
+
+                switch (courseSchedule.getGroupType()){
+                    case MUSIC:
+                        calMusicCourseTeacherActualSalary(courseSchedule, teacherSalary, teacherAttendances, school, teacher, attendanceRange);
+                        break;
+                    case VIP:
+                        calVipCourseTeacherActualSalary(courseSchedule, teacherSalary, teacherAttendances, school, teacher, vipAttendanceRange);
+                        break;
+                    case PRACTICE:
+                        calPracticeTeacherActualSalary(courseSchedule, teacherSalary, teacherAttendances, school, teacher);
+                        break;
+                }
+
+                TeacherIncomeDto teacherIncomeInfo = new TeacherIncomeDto();
+                BeanUtils.copyProperties(courseSchedule, teacherIncomeInfo);
+                teacherIncomeInfo.setExpectSalary(teacherSalary.getExpectSalary());
+                teacherIncomeInfo.setSubsidy(Objects.nonNull(oldSalary)?oldSubsidy:teacherSalary.getSubsidy());
+                teacherIncomeInfo.setActualSalary(Objects.nonNull(oldSalary)?oldSalary:teacherSalary.getActualSalary());
+                teacherIncomeInfo.setExpectIncome(teacherIncomeInfo.getExpectSalary().add(teacherIncomeInfo.getSubsidy()));
+                if(BigDecimal.ZERO.compareTo(teacherIncomeInfo.getExpectIncome())>0){
+                    teacherIncomeInfo.setExpectIncome(BigDecimal.ZERO);
+                }
+                //如果是已结算课程,则需要处理扣减原因
+                if(Objects.nonNull(oldSalary)){
+                    //判断课程是否在试用期内
+                    boolean trail = StringUtils.isNotBlank(teacherSalary.getDeductionReason())&&teacherSalary.getDeductionReason().indexOf("未转正")!=-1;
+
+                    //如果上课日期在试用期内按80%结算
+                    if(trail){
+                        long trailReasonNum = teacherSalary.getDeductReasons().stream().filter(p -> DeductReasonEnum.TRAIL.equals(p.getDeductReason())).count();
+                        if(trailReasonNum<=0){
+                            teacherSalary.getDeductReasons().add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.TRAIL, teacherIncomeInfo.getExpectIncome().subtract(teacherIncomeInfo.getExpectIncome().multiply(new BigDecimal("0.8")))));
+                        }
+                    }else{
+                        teacherSalary.setDeductReasons(teacherSalary.getDeductReasons().stream().filter(p->!DeductReasonEnum.TRAIL.equals(p.getDeductReason())).collect(Collectors.toList()));
+                    }
+                }
+                teacherIncomeInfo.setDeductReasons(teacherSalary.getDeductReasons());
+                teacherIncomeInfo.setTeacherAttendance(teacherAttendances.get(0));
+                if(Objects.nonNull(school)&&Objects.nonNull(teacherIncomeInfo.getTeacherAttendance())){
+                    teacherIncomeInfo.getTeacherAttendance().setSchoolLongitudeLatitude(school.getLongitudeLatitude());
+                }
+                teacherIncomeInfo.setBelongToDaya(teacherSalary.getBelongToDaya());
+                teacherIncomeInfo.setSortNum(courseSchedule.getStartClassTime().getTime()+courseSchedule.getId());
+                dataList.add(teacherIncomeInfo);
+            }
+        }
+        dataList.sort(Comparator.comparing(TeacherIncomeDto::getSortNum).reversed());
+        pageInfo.setRows(dataList);
+        return pageInfo;
+    }
+
+    @Override
+    public Map<String, Object> teacherIncomeStat(Integer teacherId, Integer year, Integer month) {
+        if(Objects.isNull(year)){
+            year = LocalDate.now().get(ChronoField.YEAR);
+        }
+
+        Map<String, Object> result = new HashMap<>();
+        result.put("total", BigDecimal.ZERO);
+        result.put("salary", BigDecimal.ZERO);
+
+        LocalDate minDate = LocalDate.of(2021, 3, 1);
+        LocalDate startDate = LocalDate.of(year, Objects.isNull(month)?1:month, 1);
+
+        if(year<=2021&&Objects.isNull(month)){
+            startDate = startDate.withMonth(3);
+        }
+
+        result.put("total", BigDecimal.ZERO);
+        result.put("salary", BigDecimal.ZERO);
+        result.put("data", Collections.emptyList());
+
+        if(startDate.compareTo(minDate)<0){
+            return result;
+        }
+
+        List<LocalDateBigDecimalMapDto> monthIncomeMapList = courseScheduleTeacherSalaryDao.teacherIncomeStat(teacherId, year, month);
+
+        if(CollectionUtils.isEmpty(monthIncomeMapList)){
+            return result;
+        }
+
+        if(Objects.isNull(month)){
+            Set<String> months = monthIncomeMapList.stream().map(e -> DateUtil.dateToString(e.getDate(), "yyyy-MM")).collect(Collectors.toSet());
+
+            LocalDate now = LocalDate.now();
+            now = now.plusMonths(-1);
+            DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM");
+            while (startDate.compareTo(now)<=0&&year.equals(startDate.get(ChronoField.YEAR))){
+                String dateStr = dateFormatter.format(startDate);
+                if(!months.contains(dateStr)){
+                    monthIncomeMapList.add(new LocalDateBigDecimalMapDto(Date.from(startDate.atStartOfDay(DateUtil.zoneId).toInstant()), dateStr, BigDecimal.ZERO));
+                }
+                startDate = startDate.plusMonths(1);
+            }
+        }else{
+            Set<String> dates = monthIncomeMapList.stream().map(e -> DateUtil.dateToString(e.getDate(), "yyyy-MM-dd")).collect(Collectors.toSet());
+
+            Integer oldMonth = Objects.isNull(month)?new Integer(1):month;
+            while (oldMonth.equals(startDate.get(ChronoField.MONTH_OF_YEAR))){
+                String dateStr = DateUtil.dateFormatter.format(startDate);
+                if(!dates.contains(dateStr)){
+                    monthIncomeMapList.add(new LocalDateBigDecimalMapDto(Date.from(startDate.atStartOfDay(DateUtil.zoneId).toInstant()), dateStr, BigDecimal.ZERO));
+                }
+                startDate = startDate.plusDays(1);
+            }
+        }
+
+        monthIncomeMapList.sort(Comparator.comparing(LocalDateBigDecimalMapDto::getDate));
+
+        BigDecimal reduce = monthIncomeMapList.stream().map(LocalDateBigDecimalMapDto::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
+
+        result.put("total", reduce);
+        result.put("salary", reduce);
+        result.put("data", monthIncomeMapList);
+
+        return result;
+    }
+
+    @Override
+    public void todayIncomeRemind() {
+        List<Integer> teacherIds = courseScheduleTeacherSalaryDao.getTodayHasCourseTeacherIds();
+        if(CollectionUtils.isEmpty(teacherIds)){
+            return;
+        }
+        Map<Integer, String> userMap = new HashMap<>();
+        for (Integer teacherId : teacherIds) {
+            userMap.put(teacherId, teacherId.toString());
+        }
+        sysMessageService.batchPushMessage(MessageTypeEnum.TEACHER_INCOME_REMIND,
+                userMap, null, 0, "12", "TEACHER","income_remind.mp3","income_remind_channel");
+    }
 }
 }

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

@@ -234,7 +234,7 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 		//学员数据
 		//学员数据
 		saveData(indexBaseMonthDataDao.getStudentRegistrationData(dayStr), dayStr, IndexDataType.STUDENT_REGISTRATION_NUM);
 		saveData(indexBaseMonthDataDao.getStudentRegistrationData(dayStr), dayStr, IndexDataType.STUDENT_REGISTRATION_NUM);
 		saveData(indexBaseMonthDataDao.getChargeStudentChangeData(dayStr), dayStr, IndexDataType.CHARGE_STUDENT_CHANGE_RATE);
 		saveData(indexBaseMonthDataDao.getChargeStudentChangeData(dayStr), dayStr, IndexDataType.CHARGE_STUDENT_CHANGE_RATE);
-		saveData(indexBaseMonthDataDao.getStudentSignUpData(dayStr), dayStr, IndexDataType.ACTIVATION_RATE);
+		saveData(indexBaseMonthDataDao.getStudentSignUpData(dayStr, nowDate.plusMonths(-6).toString()), dayStr, IndexDataType.ACTIVATION_RATE);
 
 
 		//运营数据
 		//运营数据
 		saveData(indexBaseMonthDataDao.getSchoolData(dayStr), dayStr, IndexDataType.SCHOOL);
 		saveData(indexBaseMonthDataDao.getSchoolData(dayStr), dayStr, IndexDataType.SCHOOL);
@@ -467,6 +467,7 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 			params.put("sunday",sunDayDate.toString());
 			params.put("sunday",sunDayDate.toString());
 			params.put("jobNature", JobNatureEnum.FULL_TIME);
 			params.put("jobNature", JobNatureEnum.FULL_TIME);
 			params.put("unDone",1);
 			params.put("unDone",1);
+			params.put("reminded",0);
 			int serveErrTeacherNum = studentExtracurricularExercisesSituationDao.countTeacherServeInfo(params);
 			int serveErrTeacherNum = studentExtracurricularExercisesSituationDao.countTeacherServeInfo(params);
 			fourChild.add(new IndexErrInfoDto(IndexErrorType.TEACHER_SERVE_ERROR, IndexErrorType.TEACHER_SERVE_ERROR.getMsg(), serveErrTeacherNum, null));
 			fourChild.add(new IndexErrInfoDto(IndexErrorType.TEACHER_SERVE_ERROR, IndexErrorType.TEACHER_SERVE_ERROR.getMsg(), serveErrTeacherNum, null));
 
 
@@ -609,6 +610,7 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 			params.put("sunday",sunDayDate.toString());
 			params.put("sunday",sunDayDate.toString());
 			params.put("jobNature", JobNatureEnum.FULL_TIME);
 			params.put("jobNature", JobNatureEnum.FULL_TIME);
 			params.put("unDone",1);
 			params.put("unDone",1);
+			params.put("reminded",0);
 			List<Map<Integer, Integer>> teacherServeErrorMapList = indexBaseMonthDataDao.countOrganTeacherServeInfo(params);
 			List<Map<Integer, Integer>> teacherServeErrorMapList = indexBaseMonthDataDao.countOrganTeacherServeInfo(params);
 			teacherServeErrorMap = MapUtil.mapListToMap(teacherServeErrorMapList, Integer.class, Integer.class);
 			teacherServeErrorMap = MapUtil.mapListToMap(teacherServeErrorMapList, Integer.class, Integer.class);
 		}
 		}

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

@@ -1140,26 +1140,27 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 				}
 				}
 			}
 			}
 			MusicGroupPaymentCalender calender = musicGroupPaymentCalenders.get(0);
 			MusicGroupPaymentCalender calender = musicGroupPaymentCalenders.get(0);
+			MusicGroup musicGroup = musicGroupDao.get(calender.getMusicGroupId());
 			if(calender.getPaymentType() == ADD_STUDENT || calender.getPaymentType() == SPAN_GROUP_CLASS_ADJUST){
 			if(calender.getPaymentType() == ADD_STUDENT || calender.getPaymentType() == SPAN_GROUP_CLASS_ADJUST){
 				// 所有缴费项目已完成排课才能创建下一个缴费项目
 				// 所有缴费项目已完成排课才能创建下一个缴费项目
 				List<String> batchNoList = new ArrayList<>();
 				List<String> batchNoList = new ArrayList<>();
 				batchNoList.add(batchNo);
 				batchNoList.add(batchNo);
 				String orignBatchNo = musicGroupPaymentStudentCourseDetailDao.getUnUseBatchNoWithStudentAndCourseTypeAndCourseMinutes(calender.getMusicGroupId(), null, null,batchNoList);
 				String orignBatchNo = musicGroupPaymentStudentCourseDetailDao.getUnUseBatchNoWithStudentAndCourseTypeAndCourseMinutes(calender.getMusicGroupId(), null, null,batchNoList);
 				if (StringUtils.isNoneBlank(orignBatchNo)) {
 				if (StringUtils.isNoneBlank(orignBatchNo)) {
-					throw new BizException("当前乐团存在未排课的缴费项目,请先完成排课再操作");
+					throw new BizException("{} 存在未排课的缴费项目,请先完成排课再操作",musicGroup.getName());
 				}
 				}
 				List<Integer> userIds = Arrays.stream(calender.getStudentIds().split(",")).mapToInt(Integer::valueOf).boxed().collect(Collectors.toList());
 				List<Integer> userIds = Arrays.stream(calender.getStudentIds().split(",")).mapToInt(Integer::valueOf).boxed().collect(Collectors.toList());
 				//获取欠费学员列表
 				//获取欠费学员列表
 				List<Integer> noPaymentUserIds = musicGroupPaymentCalenderDetailDao.queryNoPaymentUserIds(calender.getMusicGroupId(),userIds);
 				List<Integer> noPaymentUserIds = musicGroupPaymentCalenderDetailDao.queryNoPaymentUserIds(calender.getMusicGroupId(),userIds);
 				if(noPaymentUserIds.size() > 0){
 				if(noPaymentUserIds.size() > 0){
-					throw new BizException("操作失败:有欠费的学员不允许创建缴费");
+					throw new BizException("{} 有欠费的学员不允许创建缴费",musicGroup.getName());
 				}
 				}
 				//获取缴费状态在审核中或者已拒绝的缴费项目的学员
 				//获取缴费状态在审核中或者已拒绝的缴费项目的学员
 				String studentIds = musicGroupPaymentCalenderDao.queryCalenderStudentIds(calender.getMusicGroupId(),batchNo);
 				String studentIds = musicGroupPaymentCalenderDao.queryCalenderStudentIds(calender.getMusicGroupId(),batchNo);
 				if(StringUtils.isNotEmpty(studentIds)){
 				if(StringUtils.isNotEmpty(studentIds)){
 					for (Integer integer : userIds) {
 					for (Integer integer : userIds) {
 						if(studentIds.contains(integer.toString())){
 						if(studentIds.contains(integer.toString())){
-							throw new BizException("操作失败:所选学员有待审核或已拒绝的缴费项目");
+							throw new BizException("{} 的 {} 缴费项目,所选学员有待审核或已拒绝的缴费项目",musicGroup.getName(),calender.getPaymentType().getCode());
 						}
 						}
 					}
 					}
 				}
 				}
@@ -1169,7 +1170,6 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 				//统计乐团还在审核中或者审核被拒的缴费
 				//统计乐团还在审核中或者审核被拒的缴费
 				int count = musicGroupPaymentCalenderDao.countAuditReject(calender.getMusicGroupId(),calender.getId());
 				int count = musicGroupPaymentCalenderDao.countAuditReject(calender.getMusicGroupId(),calender.getId());
 				if(count == 0){
 				if(count == 0){
-					MusicGroup musicGroup = musicGroupDao.get(calender.getMusicGroupId());
 					musicGroup.setStatus(MusicGroupStatusEnum.APPLY);
 					musicGroup.setStatus(MusicGroupStatusEnum.APPLY);
 					musicGroup.setUpdateTime(date);
 					musicGroup.setUpdateTime(date);
 					musicGroupDao.update(musicGroup);
 					musicGroupDao.update(musicGroup);

+ 34 - 16
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java

@@ -2742,23 +2742,17 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         } else {
         } else {
             throw new BizException("当前乐团状态不支持此操作");
             throw new BizException("当前乐团状态不支持此操作");
         }
         }
+        //新建团:(乐团合作单位没有进行中 、暂停、关闭 的乐团)
+        //若乐团新建团,则操作【确认开团】时,若【已缴费】学员达到98人,则无需对【未缴费】学员新增回访
+        //若乐团不是新建团,则操作【确认开团】时,若【已缴费】学员达到58人,则无需对【未缴费】学员新增回访
         //报名未交费的学生,完成回访才能到下一步
         //报名未交费的学生,完成回访才能到下一步
-        boolean hasNoVisit = false;
-        StringBuilder tipsMsg = new StringBuilder();
-        List<StudentRegistration> noPaymentStudents = studentRegistrationDao.getNoPaymentStudent(musicGroupId);
-        if (noPaymentStudents.size() > 0) {
-            tipsMsg.append("以下学生未完成回访,");
-            List<Integer> studentIds = noPaymentStudents.stream().map(StudentRegistration::getUserId).collect(Collectors.toList());
-            List<Integer> musicGroupVisitStudent = studentVisitDao.getMusicGroupVisitStudent(musicGroupId, studentIds);
-            for (StudentRegistration noPaymentStudent : noPaymentStudents) {
-                if (!musicGroupVisitStudent.contains(noPaymentStudent.getUserId())) {
-                    hasNoVisit = true;
-                    tipsMsg.append(noPaymentStudent.getName()).append("(").append(noPaymentStudent.getUserId()).append(")、");
-                }
-            }
-        }
-        if (hasNoVisit) {
-            throw new BizException(tipsMsg.append("请完成回访").toString());
+
+        //获取乐团合作单位乐团数量
+        Integer cooperationMusicGroupNum = musicGroupDao.getCooperationMusicGroupNum(musicGroup.getCooperationOrganId(), musicGroupId);
+        Integer paymentStudentNum = studentRegistrationDao.getPaymentStudentNum(musicGroupId);
+
+        if((cooperationMusicGroupNum <= 0 && paymentStudentNum < 98) || (cooperationMusicGroupNum > 0 && paymentStudentNum < 58)){
+            checkStudentVisit(musicGroupId);
         }
         }
 
 
         musicGroupBuildLogDao.insert(new MusicGroupBuildLog(musicGroupId, event, sysUser.getId(), ""));
         musicGroupBuildLogDao.insert(new MusicGroupBuildLog(musicGroupId, event, sysUser.getId(), ""));
@@ -2788,6 +2782,30 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         sysMessageService.batchSeoMessage(integers, MessageTypeEnum.BACKSTAGE_MUSIC_GROUP_MARKING, "", musicGroup.getName());
         sysMessageService.batchSeoMessage(integers, MessageTypeEnum.BACKSTAGE_MUSIC_GROUP_MARKING, "", musicGroup.getName());
     }
     }
 
 
+    /**
+     * 校验回访
+     * @param musicGroupId
+     */
+    private void checkStudentVisit(String musicGroupId){
+        boolean hasNoVisit = false;
+        StringBuilder tipsMsg = new StringBuilder();
+        List<StudentRegistration> noPaymentStudents = studentRegistrationDao.getNoPaymentStudent(musicGroupId);
+        if (noPaymentStudents.size() > 0) {
+            tipsMsg.append("以下学生未完成回访,");
+            List<Integer> studentIds = noPaymentStudents.stream().map(StudentRegistration::getUserId).collect(Collectors.toList());
+            List<Integer> musicGroupVisitStudent = studentVisitDao.getMusicGroupVisitStudent(musicGroupId, studentIds);
+            for (StudentRegistration noPaymentStudent : noPaymentStudents) {
+                if (!musicGroupVisitStudent.contains(noPaymentStudent.getUserId())) {
+                    hasNoVisit = true;
+                    tipsMsg.append(noPaymentStudent.getName()).append("(").append(noPaymentStudent.getUserId()).append(")、");
+                }
+            }
+        }
+        if (hasNoVisit) {
+            throw new BizException(tipsMsg.append("请完成回访").toString());
+        }
+    }
+
     @Override
     @Override
     @Transactional(rollbackFor = Exception.class)
     @Transactional(rollbackFor = Exception.class)
     public List<StudentRegistration> addMusicGroupRegs(String musicGroupId, List<Long> registerIds) throws Exception {
     public List<StudentRegistration> addMusicGroupRegs(String musicGroupId, List<Long> registerIds) throws Exception {

+ 5 - 4
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentManageServiceImpl.java

@@ -681,10 +681,11 @@ public class StudentManageServiceImpl implements StudentManageService {
 
 
     @Override
     @Override
     public List<StudentRegisterPerDto> queryStudentPer() {
     public List<StudentRegisterPerDto> queryStudentPer() {
-        Set<Integer> musicUserIds = scheduleStudentPaymentDao.queryMusicStudentPer();
-        Set<Integer> vipUserIds = scheduleStudentPaymentDao.queryVipStudentPer();
-        musicUserIds.addAll(vipUserIds);
-        return studentRegistrationDao.queryStudentPer(musicUserIds);
+        String format = DateUtil.format(DateUtil.addDays(new Date(), -1), DateUtil.ISO_EXPANDED_DATE_FORMAT);
+//        Set<Integer> musicUserIds = scheduleStudentPaymentDao.queryMusicStudentPer();
+//        Set<Integer> vipUserIds = scheduleStudentPaymentDao.queryVipStudentPer();
+//        musicUserIds.addAll(vipUserIds);
+        return studentRegistrationDao.queryStudentPer1(format);
     }
     }
 
 
     @Override
     @Override

+ 65 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMessageServiceImpl.java

@@ -342,7 +342,7 @@ public class SysMessageServiceImpl extends BaseServiceImpl<Long, SysMessage> imp
 			try {
 			try {
 				if (debugMode == true
 				if (debugMode == true
 						|| messageSenderPluginContext.batchSend(messageSender, messageConfig.getDescription(),
 						|| messageSenderPluginContext.batchSend(messageSender, messageConfig.getDescription(),
-								MessageFormatter.arrayFormat(messageConfig.getContent(), args), tos, url,jpushType)) {
+								MessageFormatter.arrayFormat(messageConfig.getContent(), args), tos, url,jpushType,"default",null)) {
 					status = SendStatusEnum.SUCCESSED;
 					status = SendStatusEnum.SUCCESSED;
 				} else {
 				} else {
 					status = SendStatusEnum.FAILED;
 					status = SendStatusEnum.FAILED;
@@ -365,6 +365,69 @@ public class SysMessageServiceImpl extends BaseServiceImpl<Long, SysMessage> imp
 
 
 	@Override
 	@Override
 	@Async
 	@Async
+	public void batchPushMessage(MessageTypeEnum type, Map<Integer, String> receivers, Date triggerTime, Integer readStatus,
+			String url,String jpushType,String sound,String channelId, Object... args) {
+		if (receivers == null || receivers.size() == 0) {
+			throw new BizException("接收地址不能为空");
+		}
+		if(StringUtils.isNotEmpty(jpushType) && jpushType == "STUDENT"){
+			//如果不是缴费信息
+			if(type != STUDENT_PUSH_VIP_BUY){
+				int hour = DateUtil.getHour(new Date());
+				//如果当前时间在22点之后
+				String messageTime = sysConfigDao.findConfigValue("wait_send_message_time");
+				if(StringUtils.isEmpty(messageTime)){
+					messageTime = "22";
+				}
+				if(hour > Integer.parseInt(messageTime)-1){
+					//保存推送信息
+					WaitSendMessage waitSendMessage = new WaitSendMessage();
+					if(args != null){
+						waitSendMessage.setAgrs(JSON.toJSONString(args));
+					}
+					waitSendMessage.setJpushType(jpushType);
+					waitSendMessage.setMessageSender(MessageSender.JIGUANG.name());
+					waitSendMessage.setMessageType(type.name());
+					waitSendMessage.setReceivers(JSON.toJSONString(receivers));
+					waitSendMessage.setUrl(url);
+					waitSendMessageDao.insert(waitSendMessage);
+					return;
+				}
+			}
+		}
+		String[] tos = receivers.values().toArray(new String[receivers.size()]);
+		SysMessageConfig messageConfig = sysMessageConfigService.queryByType(type);
+		if (messageConfig == null) {
+			throw new BizException("消息类型错误");
+		}else if(messageConfig.getSendFlag() == null || messageConfig.getSendFlag() == 0){
+			return;
+		}
+		Date date = new Date();
+		SendStatusEnum status = SendStatusEnum.WAIT;
+		String errorMsg = null;
+		// 立即发送
+		if (triggerTime == null || date.after(triggerTime)) {
+			status = SendStatusEnum.SENDING;
+			try {
+				if (debugMode == true
+						|| messageSenderPluginContext.batchSend(MessageSender.JIGUANG, messageConfig.getDescription(),
+								MessageFormatter.arrayFormat(messageConfig.getContent(), args), tos, url,jpushType,sound,channelId)) {
+					status = SendStatusEnum.SUCCESSED;
+				} else {
+					status = SendStatusEnum.FAILED;
+				}
+			} catch (Exception e) {
+				status = SendStatusEnum.FAILED;
+				errorMsg = e.getMessage();
+				LOGGER.warn("消息发送失败", e);
+			}
+		}
+		addMessage(receivers, messageConfig.getDescription(), MessageFormatter.arrayFormat(messageConfig.getContent(), args), triggerTime, MessageSendMode.PUSH, status, errorMsg, readStatus,
+				url, messageConfig.getGroup(),jpushType);
+	}
+
+	@Override
+	@Async
 	public void sendMessage(MessageSender messageSender, Integer userId, String title, String content, String receiver, Date triggerTime, Integer readStatus,
 	public void sendMessage(MessageSender messageSender, Integer userId, String title, String content, String receiver, Date triggerTime, Integer readStatus,
 			String url, String group,String jpushType) {
 			String url, String group,String jpushType) {
 		if (StringUtils.isBlank(receiver)) {
 		if (StringUtils.isBlank(receiver)) {
@@ -377,7 +440,7 @@ public class SysMessageServiceImpl extends BaseServiceImpl<Long, SysMessage> imp
 		if (triggerTime == null || date.after(triggerTime)) {
 		if (triggerTime == null || date.after(triggerTime)) {
 			status = SendStatusEnum.SENDING;
 			status = SendStatusEnum.SENDING;
 			try {
 			try {
-				if (debugMode == true || messageSenderPluginContext.send(messageSender, receiver, title, content, url,jpushType)) {
+				if (debugMode == true || messageSenderPluginContext.send(messageSender, receiver, title, content, url,jpushType,"default",null)) {
 					status = SendStatusEnum.SUCCESSED;
 					status = SendStatusEnum.SUCCESSED;
 				} else {
 				} else {
 					status = SendStatusEnum.FAILED;
 					status = SendStatusEnum.FAILED;

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

@@ -734,7 +734,7 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 
 
 	@Override
 	@Override
 	@Transactional(rollbackFor = Exception.class)
 	@Transactional(rollbackFor = Exception.class)
-	public void addComplaints(Long courseScheduleId, String content,String url,Integer userId) {
+	public void addComplaints(Long courseScheduleId, String content,String url,Integer userId, UpdateAttendanceEnum complaintsType) {
 		TeacherAttendance teacherAttendance = teacherAttendanceDao.findByTeacherAttendanceInfo(userId.longValue(), courseScheduleId);
 		TeacherAttendance teacherAttendance = teacherAttendanceDao.findByTeacherAttendanceInfo(userId.longValue(), courseScheduleId);
 		CourseSchedule courseSchedule = courseScheduleDao.get(courseScheduleId);
 		CourseSchedule courseSchedule = courseScheduleDao.get(courseScheduleId);
 		if(courseSchedule == null){
 		if(courseSchedule == null){
@@ -751,6 +751,9 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 		}else if(teacherAttendance.getComplaintsStatus() != null && teacherAttendance.getComplaintsStatus() != REPEAL){
 		}else if(teacherAttendance.getComplaintsStatus() != null && teacherAttendance.getComplaintsStatus() != REPEAL){
             throw new BizException("请勿重复提交考勤申述");
             throw new BizException("请勿重复提交考勤申述");
         }
         }
+		if(teacherAttendance.getSignInStatus() == YesOrNoEnum.YES && teacherAttendance.getSignOutStatus() == YesOrNoEnum.YES){
+			throw new BizException("考勤正常,无需提交申诉");
+		}
 		Teacher teacher = teacherDao.get(userId);
 		Teacher teacher = teacherDao.get(userId);
 		Date date = new Date();
 		Date date = new Date();
 		if(teacher.getJobNature() == PART_TIME){
 		if(teacher.getJobNature() == PART_TIME){
@@ -767,6 +770,10 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 				throw new BizException("超出可申述时间");
 				throw new BizException("超出可申述时间");
 			}
 			}
 		}
 		}
+		if(complaintsType == null){
+			complaintsType = UpdateAttendanceEnum.ALL;
+		}
+		teacherAttendance.setComplaintsType(complaintsType);
 		teacherAttendance.setIsComplaints(1);
 		teacherAttendance.setIsComplaints(1);
 		teacherAttendance.setComplaintsStatus(ComplaintsStatusEnum.WAIT);
 		teacherAttendance.setComplaintsStatus(ComplaintsStatusEnum.WAIT);
 		teacherAttendance.setComplaintsContent(content);
 		teacherAttendance.setComplaintsContent(content);
@@ -811,23 +818,18 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 
 
 	@Override
 	@Override
 	@Transactional(rollbackFor = Exception.class)
 	@Transactional(rollbackFor = Exception.class)
-	public void agreeTeacherAttendanceComplaints(Integer signInStatus, Integer signOutStatus, long teacherAttendanceId,String content) {
+	public void agreeTeacherAttendanceComplaints(long teacherAttendanceId,String content) {
 		TeacherAttendance teacherAttendance = teacherAttendanceDao.get(teacherAttendanceId);
 		TeacherAttendance teacherAttendance = teacherAttendanceDao.get(teacherAttendanceId);
 		if(teacherAttendance == null){
 		if(teacherAttendance == null){
 			throw new BizException("考勤信息不存在");
 			throw new BizException("考勤信息不存在");
 		}
 		}
+		UpdateAttendanceEnum complaintsType = teacherAttendance.getComplaintsType();
 		if(teacherAttendance.getComplaintsStatus() == ComplaintsStatusEnum.WAIT){
 		if(teacherAttendance.getComplaintsStatus() == ComplaintsStatusEnum.WAIT){
-			if(signInStatus != null && signOutStatus != null){
-				teacherAttendance.setUpdateAttendanceEnum(UpdateAttendanceEnum.ALL);
-			}else if (signInStatus != null){
-				teacherAttendance.setUpdateAttendanceEnum(UpdateAttendanceEnum.SIGN_IN);
-			}else if (signOutStatus != null){
-				teacherAttendance.setUpdateAttendanceEnum(UpdateAttendanceEnum.SIGN_OUT);
-			}
+			teacherAttendance.setUpdateAttendanceEnum(complaintsType);
 			StringBuffer remark = new StringBuffer("同意异常考勤申述");
 			StringBuffer remark = new StringBuffer("同意异常考勤申述");
 			CourseSchedule courseSchedule = courseScheduleDao.get(teacherAttendance.getCourseScheduleId());
 			CourseSchedule courseSchedule = courseScheduleDao.get(teacherAttendance.getCourseScheduleId());
 			String classDate = DateUtil.format(courseSchedule.getClassDate(), DateUtil.DEFAULT_PATTERN);
 			String classDate = DateUtil.format(courseSchedule.getClassDate(), DateUtil.DEFAULT_PATTERN);
-			if(signInStatus != null && teacherAttendance.getSignInStatus() != YesOrNoEnum.YES){
+			if(complaintsType != UpdateAttendanceEnum.SIGN_OUT && teacherAttendance.getSignInStatus() != YesOrNoEnum.YES){
 				if(teacherAttendance.getSignInTime() != null){
 				if(teacherAttendance.getSignInTime() != null){
 					remark.append("  原签到时间: ").append(DateUtil.format(teacherAttendance.getSignInTime(),DateUtil.EXPANDED_DATE_TIME_FORMAT));
 					remark.append("  原签到时间: ").append(DateUtil.format(teacherAttendance.getSignInTime(),DateUtil.EXPANDED_DATE_TIME_FORMAT));
 				}
 				}
@@ -836,7 +838,7 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 				teacherAttendance.setSignInTime(DateUtil.addMinutes(date,-1));
 				teacherAttendance.setSignInTime(DateUtil.addMinutes(date,-1));
 				teacherAttendance.setSignInStatus(YesOrNoEnum.YES);
 				teacherAttendance.setSignInStatus(YesOrNoEnum.YES);
 			}
 			}
-			if(signOutStatus != null && teacherAttendance.getSignOutStatus() != YesOrNoEnum.YES){
+			if(complaintsType != UpdateAttendanceEnum.SIGN_IN && teacherAttendance.getSignOutStatus() != YesOrNoEnum.YES){
 				if(teacherAttendance.getSignOutTime() != null){
 				if(teacherAttendance.getSignOutTime() != null){
 					remark.append("  原签退时间: ").append(DateUtil.format(teacherAttendance.getSignOutTime(),DateUtil.EXPANDED_DATE_TIME_FORMAT));
 					remark.append("  原签退时间: ").append(DateUtil.format(teacherAttendance.getSignOutTime(),DateUtil.EXPANDED_DATE_TIME_FORMAT));
 				}
 				}

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

@@ -260,11 +260,10 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 			}
 			}
 		}
 		}
 
 
-		if(Objects.nonNull(vipGroupActivity)&&Objects.nonNull(vipGroupActivity.getAttribute3())&&StringUtils.isNotBlank(vipGroupActivity.getAttribute3())){
-			Integer maxCourseNum = Integer.parseInt(vipGroupActivity.getAttribute3());
+		if(Objects.nonNull(vipGroupActivity)&&Objects.nonNull(vipGroupActivity.getMinCourseNum())&&Objects.nonNull(vipGroupActivity.getMaxCourseNum())){
 			Integer requestCourseNum = vipGroupApplyBaseInfoDto.getOnlineClassesNum() + vipGroupApplyBaseInfoDto.getOfflineClassesNum();
 			Integer requestCourseNum = vipGroupApplyBaseInfoDto.getOnlineClassesNum() + vipGroupApplyBaseInfoDto.getOfflineClassesNum();
-			if(requestCourseNum.compareTo(maxCourseNum)!=0){
-				throw new BizException("该活动课时数为{}节", maxCourseNum);
+			if(requestCourseNum.compareTo(vipGroupActivity.getMinCourseNum())<0||requestCourseNum.compareTo(vipGroupActivity.getMaxCourseNum())>0){
+				throw new BizException("该活动课时数为{}节~{}节", vipGroupActivity.getMinCourseNum(), vipGroupActivity.getMaxCourseNum());
 			}
 			}
 		}
 		}
 
 

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

@@ -1470,14 +1470,14 @@
     <select id="queryGroupClassGroupIds" resultType="java.lang.Long">
     <select id="queryGroupClassGroupIds" resultType="java.lang.Long">
         SELECT cg.id_ FROM music_group mg
         SELECT cg.id_ FROM music_group mg
         LEFT JOIN class_group cg ON cg.music_group_id_ = mg.id_
         LEFT JOIN class_group cg ON cg.music_group_id_ = mg.id_
-        WHERE mg.educational_teacher_id_ = #{userId} AND cg.group_type_ = 'MUSIC' AND mg.status_ = 'PROGRESS'
+        WHERE mg.educational_teacher_id_ = #{userId} AND cg.group_type_ = 'MUSIC' AND mg.status_ = 'PROGRESS' AND cg.del_flag_ = 0
         UNION
         UNION
         SELECT cg.id_ FROM vip_group vg
         SELECT cg.id_ FROM vip_group vg
         LEFT JOIN class_group cg ON cg.music_group_id_ = vg.id_
         LEFT JOIN class_group cg ON cg.music_group_id_ = vg.id_
-        WHERE vg.educational_teacher_id_ = #{userId} AND cg.group_type_ = 'VIP' AND vg.group_status_ = 2
+        WHERE vg.educational_teacher_id_ = #{userId} AND cg.group_type_ = 'VIP' AND vg.group_status_ = 2 AND cg.del_flag_ = 0
         UNION
         UNION
         SELECT cg.id_ FROM practice_group pg
         SELECT cg.id_ FROM practice_group pg
         LEFT JOIN class_group cg ON cg.music_group_id_ = pg.id_
         LEFT JOIN class_group cg ON cg.music_group_id_ = pg.id_
-        WHERE pg.educational_teacher_id_ = #{userId} AND cg.group_type_ = 'PRACTICE' AND pg.group_status_ = 'NORMAL'
+        WHERE pg.educational_teacher_id_ = #{userId} AND cg.group_type_ = 'PRACTICE' AND pg.group_status_ = 'NORMAL' AND cg.del_flag_ = 0
     </select>
     </select>
 </mapper>
 </mapper>

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

@@ -73,6 +73,7 @@
         <result column="is_complaints_" property="isComplaints"/>
         <result column="is_complaints_" property="isComplaints"/>
         <result column="complaints_status_" property="complaintsStatus"/>
         <result column="complaints_status_" property="complaintsStatus"/>
         <result column="complaints_content_" property="complaintsContent"/>
         <result column="complaints_content_" property="complaintsContent"/>
+        <result column="complaints_type_" property="complaintsType" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
         <result column="url_" property="url"/>
         <result column="url_" property="url"/>
         <result column="dispose_content_" property="disposeContent"/>
         <result column="dispose_content_" property="disposeContent"/>
         <result column="seal_class_id_" property="sealClassId"/>
         <result column="seal_class_id_" property="sealClassId"/>
@@ -736,6 +737,7 @@
                ta.sign_in_time_,
                ta.sign_in_time_,
                ta.complaints_status_,
                ta.complaints_status_,
                ta.complaints_content_,
                ta.complaints_content_,
+               ta.complaints_type_,
                ta.url_,
                ta.url_,
                ta.dispose_content_,
                ta.dispose_content_,
                cs.teach_mode_
                cs.teach_mode_
@@ -3750,5 +3752,61 @@
         GROUP BY music_group_id_
         GROUP BY music_group_id_
     </select>
     </select>
 
 
+    <select id="getTeacherCourseWithClassDate" resultMap="CourseSchedule">
+        SELECT
+            <include refid="resultSql"></include>
+        FROM
+            course_schedule cs
+            LEFT JOIN course_schedule_teacher_salary csts ON csts.course_schedule_id_ = cs.id_
+        WHERE
+            ( cs.del_flag_ IS NULL OR cs.del_flag_ = 0 )
+            AND (cs.is_lock_=0 OR cs.is_lock_ IS NULL)
+            AND (cs.new_course_id_ IS NULL OR cs.new_course_id_=cs.id_)
+            AND csts.user_id_ = #{teacherId}
+            AND cs.class_date_ BETWEEN #{startDay} AND #{endDay}
+            <if test="courseStatus!=null">
+                AND cs.status_ = #{courseStatus, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+            </if>
+    </select>
+
+    <sql id="queryTeacherCourseCondition">
+        <where>
+            ( cs.del_flag_ IS NULL OR cs.del_flag_ = 0 )
+            AND (cs.is_lock_=0 OR cs.is_lock_ IS NULL)
+            AND (cs.new_course_id_ IS NULL OR cs.new_course_id_=cs.id_)
+            AND cs.class_date_ &gt;= "2021-03-01"
+            <if test="teacherId!=null">
+                AND csts.user_id_ = #{teacherId}
+            </if>
+            <if test="startDay!=null and startDay!=''">
+                AND cs.class_date_ &gt;= #{startDay}
+            </if>
+            <if test="endDay!=null and endDay!=''">
+                AND cs.class_date_ &lt;= #{endDay}
+            </if>
+            <if test="courseStatus!=null">
+                AND cs.status_ = #{courseStatus, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+            </if>
+        </where>
+    </sql>
+
+    <select id="queryTeacherCourse" resultMap="CourseSchedule">
+        SELECT
+        <include refid="resultSql" />
+        FROM
+            course_schedule cs
+            LEFT JOIN course_schedule_teacher_salary csts ON csts.course_schedule_id_ = cs.id_
+        <include refid="queryTeacherCourseCondition"></include>
+        ORDER BY cs.class_date_ DESC,cs.start_class_time_ DESC,cs.id_ DESC
+        <include refid="global.limit" />
+    </select>
 
 
+    <select id="countTeacherCourse" resultType="int">
+        SELECT
+        COUNT(cs.id_)
+        FROM
+        course_schedule cs
+        LEFT JOIN course_schedule_teacher_salary csts ON csts.course_schedule_id_ = cs.id_
+        <include refid="queryTeacherCourseCondition"></include>
+    </select>
 </mapper>
 </mapper>

+ 88 - 8
mec-biz/src/main/resources/config/mybatis/CourseScheduleTeacherSalaryMapper.xml

@@ -31,6 +31,7 @@
 		<result column="reduce_salary" property="reduceSalary" />
 		<result column="reduce_salary" property="reduceSalary" />
 		<result column="confirm_status_" property="confirmStatus" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
 		<result column="confirm_status_" property="confirmStatus" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
 		<result column="memo_" property="memo" />
 		<result column="memo_" property="memo" />
+		<result column="deduction_reason_" property="deductionReason"/>
 		<result column="belong_to_daya_" property="belongToDaya" />
 		<result column="belong_to_daya_" property="belongToDaya" />
 	</resultMap>
 	</resultMap>
 	
 	
@@ -292,13 +293,15 @@
 		    cs.schoole_id_,
 		    cs.schoole_id_,
 			csts.*
 			csts.*
 		FROM
 		FROM
-		course_schedule_teacher_salary csts
-		LEFT JOIN course_schedule cs ON cs.id_ = csts.course_schedule_id_
-		LEFT JOIN vip_group vg ON vg.id_ = cs.music_group_id_
+			course_schedule_teacher_salary csts
+			LEFT JOIN course_schedule cs ON cs.id_ = csts.course_schedule_id_
+			LEFT JOIN vip_group vg ON vg.id_ = cs.music_group_id_
+			LEFT JOIN teacher tea ON csts.user_id_=tea.id_
 		WHERE 1=1
 		WHERE 1=1
 		<if test="startDate != null">
 		<if test="startDate != null">
 			AND cs.class_date_ BETWEEN #{startDate} AND #{endDate}
 			AND cs.class_date_ BETWEEN #{startDate} AND #{endDate}
 		</if>
 		</if>
+		AND tea.is_settlement_salary_ = 1
 		AND cs.group_type_ = 'VIP' AND vg.organ_id_ != 41
 		AND cs.group_type_ = 'VIP' AND vg.organ_id_ != 41
 		AND csts.settlement_time_ IS NULL
 		AND csts.settlement_time_ IS NULL
 		AND (cs.del_flag_ IS NULL OR cs.del_flag_=0)
 		AND (cs.del_flag_ IS NULL OR cs.del_flag_=0)
@@ -323,12 +326,14 @@
 		cs.schoole_id_,
 		cs.schoole_id_,
 		csts.*
 		csts.*
 		FROM
 		FROM
-		course_schedule_teacher_salary csts
-		LEFT JOIN course_schedule cs ON cs.id_ = csts.course_schedule_id_
+			course_schedule_teacher_salary csts
+			LEFT JOIN course_schedule cs ON cs.id_ = csts.course_schedule_id_
+			LEFT JOIN teacher tea ON csts.user_id_=tea.id_
 		WHERE 1=1
 		WHERE 1=1
 		<if test="startDate != null">
 		<if test="startDate != null">
 			AND cs.class_date_ BETWEEN #{startDate} AND #{endDate}
 			AND cs.class_date_ BETWEEN #{startDate} AND #{endDate}
 		</if>
 		</if>
+		AND tea.is_settlement_salary_ = 1
 		AND cs.type_ = 'PRACTICE'
 		AND cs.type_ = 'PRACTICE'
 		AND csts.settlement_time_ IS NULL
 		AND csts.settlement_time_ IS NULL
 		AND (cs.del_flag_ IS NULL OR cs.del_flag_=0)
 		AND (cs.del_flag_ IS NULL OR cs.del_flag_=0)
@@ -439,12 +444,14 @@
 		WHEN ta.sign_in_status_ IS NULL OR ta.sign_in_status_ = 0 THEN 0.5
 		WHEN ta.sign_in_status_ IS NULL OR ta.sign_in_status_ = 0 THEN 0.5
 		WHEN ta.sign_out_status_ IS NULL OR ta.sign_out_status_ = 0 THEN 0.5 ELSE 1 END) ELSE csts.expect_salary_ END teacher_actual_salary_
 		WHEN ta.sign_out_status_ IS NULL OR ta.sign_out_status_ = 0 THEN 0.5 ELSE 1 END) ELSE csts.expect_salary_ END teacher_actual_salary_
 		FROM course_schedule_teacher_salary csts
 		FROM course_schedule_teacher_salary csts
-		LEFT JOIN teacher_attendance ta ON ta.course_schedule_id_ = csts.course_schedule_id_
-		LEFT JOIN course_schedule cs ON cs.id_ = csts.course_schedule_id_
+			LEFT JOIN teacher_attendance ta ON ta.course_schedule_id_ = csts.course_schedule_id_
+			LEFT JOIN course_schedule cs ON cs.id_ = csts.course_schedule_id_
+			LEFT JOIN teacher tea ON csts.user_id_=tea.id_
 		WHERE csts.course_schedule_id_ IN
 		WHERE csts.course_schedule_id_ IN
 		<foreach collection="courseScheduleIds" item="courseScheduleId" open="(" close=")" separator=",">
 		<foreach collection="courseScheduleIds" item="courseScheduleId" open="(" close=")" separator=",">
 			#{courseScheduleId}
 			#{courseScheduleId}
 		</foreach>
 		</foreach>
+		AND tea.is_settlement_salary_=1
 		AND csts.settlement_time_ IS NULL
 		AND csts.settlement_time_ IS NULL
 	</select>
 	</select>
 
 
@@ -707,6 +714,7 @@
 		LEFT JOIN organization mgo ON mgo.id_ = mg.organ_id_
 		LEFT JOIN organization mgo ON mgo.id_ = mg.organ_id_
 		LEFT JOIN charge_type ct ON ct.id_ = mg.charge_type_id_
 		LEFT JOIN charge_type ct ON ct.id_ = mg.charge_type_id_
 		WHERE cs.class_date_ BETWEEN #{firstDayOfMonth} AND #{lastDayOfMonth} AND cs.`del_flag_` != 1 AND cs.group_type_ = 'MUSIC' AND ts.settlement_time_ IS NOT NULL
 		WHERE cs.class_date_ BETWEEN #{firstDayOfMonth} AND #{lastDayOfMonth} AND cs.`del_flag_` != 1 AND cs.group_type_ = 'MUSIC' AND ts.settlement_time_ IS NOT NULL
+		AND t.is_settlement_salary_ = 1
 		<if test="courseTypeList != null">
 		<if test="courseTypeList != null">
 			and cs.type_ in (#{courseTypeList})
 			and cs.type_ in (#{courseTypeList})
 		</if>
 		</if>
@@ -747,6 +755,7 @@
 		left join vip_group_category vgc on vgc.id_ = vg.vip_group_category_id_
 		left join vip_group_category vgc on vgc.id_ = vg.vip_group_category_id_
 		WHERE vg.organ_id_ != 41 AND cs.class_date_ BETWEEN #{firstDayOfMonth} AND #{lastDayOfMonth} AND cs.`del_flag_` != 1
 		WHERE vg.organ_id_ != 41 AND cs.class_date_ BETWEEN #{firstDayOfMonth} AND #{lastDayOfMonth} AND cs.`del_flag_` != 1
 		AND cs.group_type_ = 'VIP' AND ts.settlement_time_ IS NOT NULL
 		AND cs.group_type_ = 'VIP' AND ts.settlement_time_ IS NOT NULL
+		AND t.is_settlement_salary_ = 1
 		<if test="courseTypeList != null">
 		<if test="courseTypeList != null">
 			and cs.type_ in (#{courseTypeList})
 			and cs.type_ in (#{courseTypeList})
 		</if>
 		</if>
@@ -786,6 +795,7 @@
 		LEFT JOIN practice_group pg ON (pg.id_ = ts.music_group_id_ AND ts.group_type_ = 'PRACTICE')
 		LEFT JOIN practice_group pg ON (pg.id_ = ts.music_group_id_ AND ts.group_type_ = 'PRACTICE')
 		LEFT JOIN organization pgo ON pgo.id_ = pg.organ_id_
 		LEFT JOIN organization pgo ON pgo.id_ = pg.organ_id_
 		WHERE cs.class_date_ BETWEEN #{firstDayOfMonth} AND #{lastDayOfMonth} AND cs.`del_flag_` != 1 AND cs.group_type_ = 'PRACTICE' AND ts.settlement_time_ IS NOT NULL
 		WHERE cs.class_date_ BETWEEN #{firstDayOfMonth} AND #{lastDayOfMonth} AND cs.`del_flag_` != 1 AND cs.group_type_ = 'PRACTICE' AND ts.settlement_time_ IS NOT NULL
+		AND t.is_settlement_salary_ = 1
 		<if test="courseTypeList != null">
 		<if test="courseTypeList != null">
 			and cs.type_ in (#{courseTypeList})
 			and cs.type_ in (#{courseTypeList})
 		</if>
 		</if>
@@ -842,6 +852,7 @@
 			(cs.del_flag_ IS NULL OR cs.del_flag_=0)
 			(cs.del_flag_ IS NULL OR cs.del_flag_=0)
             AND csts.group_type_!='COMM'
             AND csts.group_type_!='COMM'
 			AND csts.settlement_time_ IS NOT NULL
 			AND csts.settlement_time_ IS NOT NULL
+			AND t.is_settlement_salary_ = 1
 			<if test="teacherId!=null">
 			<if test="teacherId!=null">
 				AND csts.user_id_=#{teacherId}
 				AND csts.user_id_=#{teacherId}
 			</if>
 			</if>
@@ -1063,7 +1074,8 @@
 
 
 	<select id="getIsSalaryWithDate" resultMap="CourseScheduleTeacherSalary">
 	<select id="getIsSalaryWithDate" resultMap="CourseScheduleTeacherSalary">
 		SELECT
 		SELECT
-			csts.*
+			csts.*,
+			CONCAT(cs.class_date_,' ',cs.start_class_time_) start_class_time_
 		FROM
 		FROM
 			course_schedule_teacher_salary csts
 			course_schedule_teacher_salary csts
 			LEFT JOIN course_schedule cs ON csts.course_schedule_id_ = cs.id_
 			LEFT JOIN course_schedule cs ON csts.course_schedule_id_ = cs.id_
@@ -1072,4 +1084,72 @@
 		  AND ( cs.del_flag_ IS NULL OR cs.del_flag_ = 0 )
 		  AND ( cs.del_flag_ IS NULL OR cs.del_flag_ = 0 )
 		  AND csts.settlement_time_ IS NOT NULL
 		  AND csts.settlement_time_ IS NOT NULL
 	</select>
 	</select>
+
+    <select id="getTeacherSalaryOverview" resultType="com.ym.mec.biz.dal.dto.TeacherIncomeReviewDto">
+		SELECT
+			SUM(csts.actual_salary_) totalIncome,
+			SUM((CASE DATE_FORMAT(cs.class_date_, '%Y-%m') WHEN DATE_FORMAT(#{startDay}, '%Y-%m') THEN csts.expect_salary_ + IF(s.subsidy_ IS NULL, 0, s.subsidy_) ELSE 0 END)) thisMonthExpectIncome
+		FROM
+			course_schedule_teacher_salary csts
+			LEFT JOIN course_schedule cs ON csts.course_schedule_id_ = cs.id_
+			LEFT JOIN school s ON cs.schoole_id_=s.id_
+		WHERE
+			( cs.del_flag_ IS NULL OR cs.del_flag_ = 0 )
+			AND (cs.is_lock_=0 OR cs.is_lock_ IS NULL)
+			AND (cs.new_course_id_ IS NULL OR cs.new_course_id_=cs.id_)
+			AND csts.user_id_ = #{teacherId}
+			<if test="startClassDay!=null and startClassDay!=''">
+				AND cs.class_date_ &gt;= #{startClassDay}
+			</if>
+			<if test="courseStatus!=null">
+				AND cs.status_ = #{courseStatus, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+			</if>
+	</select>
+
+	<select id="teacherIncomeStat" resultType="com.ym.mec.biz.dal.dto.LocalDateBigDecimalMapDto">
+		SELECT
+			<if test="month==null">
+				CONCAT(DATE_FORMAT( cs.class_date_, '%Y-%m' ), '-01') date,
+				CONCAT(DATE_FORMAT( cs.class_date_, '%Y-%m' )) dateStr,
+			</if>
+			<if test="month!=null">
+				DATE_FORMAT( cs.class_date_, '%Y-%m-%d' ) date,
+				DATE_FORMAT( cs.class_date_, '%Y-%m-%d' ) dateStr,
+			</if>
+			SUM( csts.actual_salary_ ) amount
+		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 ( cs.is_lock_ = 0 OR cs.is_lock_ IS NULL )
+			AND ( cs.new_course_id_ IS NULL OR cs.new_course_id_ = cs.id_ )
+			AND csts.user_id_ = #{teacherId}
+			<if test="year!=null">
+				AND YEAR ( cs.class_date_ ) = #{year}
+			</if>
+		  	AND csts.actual_salary_ &gt; 0
+			<if test="month!=null">
+				AND MONTH(cs.class_date_) = #{month}
+			</if>
+		  	AND cs.class_date_ &gt;= '2021-03-01'
+		  AND csts.settlement_time_ IS NOT NULL
+		GROUP BY
+			<if test="month==null">
+				MONTH(cs.class_date_)
+			</if>
+			<if test="month!=null">
+				DATE_FORMAT( cs.class_date_, '%Y-%m-%d' )
+			</if>
+	</select>
+
+    <select id="getTodayHasCourseTeacherIds" resultType="int">
+		SELECT DISTINCT csts.user_id_
+		FROM course_schedule_teacher_salary csts
+			LEFT JOIN course_schedule cs ON cs.id_=csts.course_schedule_id_
+		WHERE cs.class_date_ = CURDATE()
+			AND ( cs.del_flag_ IS NULL OR cs.del_flag_ = 0 )
+			AND ( cs.is_lock_ = 0 OR cs.is_lock_ IS NULL )
+			AND ( cs.new_course_id_ IS NULL OR cs.new_course_id_ = cs.id_ )
+	</select>
 </mapper>
 </mapper>

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

@@ -171,7 +171,7 @@
 					 mg.status_ IN ( 'PREPARE', 'PROGRESS' )
 					 mg.status_ IN ( 'PREPARE', 'PROGRESS' )
 				   AND sr.music_group_status_ = 'NORMAL'
 				   AND sr.music_group_status_ = 'NORMAL'
 				   AND DATE_FORMAT(sr.create_time_, '%Y-%m-%d')&lt;=#{dayStr}
 				   AND DATE_FORMAT(sr.create_time_, '%Y-%m-%d')&lt;=#{dayStr}
-			 ) UNION
+			 ) UNION ALL
 			(
 			(
 			 SELECT DISTINCT
 			 SELECT DISTINCT
 				 cssp.user_id_
 				 cssp.user_id_
@@ -185,6 +185,7 @@
 			   AND cssp.group_type_ IN ('VIP', 'PRACTICE')
 			   AND cssp.group_type_ IN ('VIP', 'PRACTICE')
 			   AND cs.organ_id_ IS NOT NULL
 			   AND cs.organ_id_ IS NOT NULL
 			   AND DATE_FORMAT(cssp.create_time_, '%Y-%m-%d')&lt;=#{dayStr}
 			   AND DATE_FORMAT(cssp.create_time_, '%Y-%m-%d')&lt;=#{dayStr}
+				AND cs.class_date_ &gt;= #{courseStartDay}
 			)) u
 			)) u
 			LEFT JOIN sys_user su ON u.user_id_ = su.id_
 			LEFT JOIN sys_user su ON u.user_id_ = su.id_
 		WHERE
 		WHERE
@@ -1261,9 +1262,6 @@
 			<if test="teacherId!=null">
 			<if test="teacherId!=null">
 				AND sees.teacher_id_ = #{teacherId}
 				AND sees.teacher_id_ = #{teacherId}
 			</if>
 			</if>
-			<if test="unDone!=null and unDone==1">
-				AND tm.teacher_id_ IS NULL
-			</if>
 			<if test="reminded!=null and reminded==0">
 			<if test="reminded!=null and reminded==0">
 				AND NOT EXISTS (SELECT id_ FROM teacher_remind WHERE teacher_id_=sees.teacher_id_ AND monday_ = sees.monday_ AND type_='SERVICE')
 				AND NOT EXISTS (SELECT id_ FROM teacher_remind WHERE teacher_id_=sees.teacher_id_ AND monday_ = sees.monday_ AND type_='SERVICE')
 			</if>
 			</if>

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

@@ -713,6 +713,12 @@
             </if>
             </if>
     </select>
     </select>
 
 
+    <select id="getCooperationMusicGroupNum" resultType="java.lang.Integer">
+        SELECT COUNT(*) FROM  music_group
+        WHERE cooperation_organ_id_ = #{cooperationOrganId} AND status_ IN ('PROGRESS','PAUSE','CLOSE')
+        AND id_ != #{musicGroupId}
+    </select>
+
     <select id="findCooperationOrganEduTeacher" resultMap="com.ym.mec.biz.dal.dao.CooperationOrganDao.CooperationOrgan">
     <select id="findCooperationOrganEduTeacher" resultMap="com.ym.mec.biz.dal.dao.CooperationOrganDao.CooperationOrgan">
         SELECT co.name_,su.real_name_ linkman_
         SELECT co.name_,su.real_name_ linkman_
         FROM music_group mg
         FROM music_group mg

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

@@ -37,7 +37,6 @@
         <result property="discountPrice" column="discount_price_"/>
         <result property="discountPrice" column="discount_price_"/>
         <result property="depreciationPrice" column="depreciation_price_"/>
         <result property="depreciationPrice" column="depreciation_price_"/>
         <result property="salePrice" column="sale_price_"/>
         <result property="salePrice" column="sale_price_"/>
-        <result property="mobileNo" column="phone_"/>
     </resultMap>
     </resultMap>
 
 
     <!-- 根据主键查询一条记录 -->
     <!-- 根据主键查询一条记录 -->
@@ -261,7 +260,7 @@
 
 
     <!-- 获取问卷分页数据 -->
     <!-- 获取问卷分页数据 -->
     <select id="getPageList" resultMap="ReplacementInstrumentActivityStatDto" parameterType="map">
     <select id="getPageList" resultMap="ReplacementInstrumentActivityStatDto" parameterType="map">
-        SELECT ria.*,su.phone_,o.name_ organ_name_,ri.brand_,ri.specification_,ri.param_,ri.market_price_,ri.discount_price_,ri.depreciation_price_,
+        SELECT ria.*,su.phone_ mobile_no_,o.name_ organ_name_,ri.brand_,ri.specification_,ri.param_,ri.market_price_,ri.discount_price_,ri.depreciation_price_,
         ri.sale_price_,s.name_ subject_name_,co.name_ cooperationOrganName FROM replacement_instrument_activity ria
         ri.sale_price_,s.name_ subject_name_,co.name_ cooperationOrganName FROM replacement_instrument_activity ria
         LEFT JOIN replacement_instrument ri ON ri.id_ = ria.instruments_id_
         LEFT JOIN replacement_instrument ri ON ri.id_ = ria.instruments_id_
         LEFT JOIN subject s ON s.id_ = ria.subject_id_
         LEFT JOIN subject s ON s.id_ = ria.subject_id_

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

@@ -509,9 +509,9 @@
 			<if test="monday!=null and monday!='' and sunday!=null and sunday!=''">
 			<if test="monday!=null and monday!='' and sunday!=null and sunday!=''">
 				AND sees.monday_ BETWEEN #{monday} AND #{sunday}
 				AND sees.monday_ BETWEEN #{monday} AND #{sunday}
 			</if>
 			</if>
-			<if test="unDone!=null and unDone==1">
-				AND tm.teacher_id_ IS NULL
-			</if>
+<!--			<if test="unDone!=null and unDone==1">-->
+<!--				AND tm.teacher_id_ IS NULL-->
+<!--			</if>-->
 			<if test="teacherId!=null">
 			<if test="teacherId!=null">
 				AND sees.teacher_id_ = #{teacherId}
 				AND sees.teacher_id_ = #{teacherId}
 			</if>
 			</if>

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

@@ -627,6 +627,13 @@
         <result property="per" column="per_"/>
         <result property="per" column="per_"/>
         <result property="perNum" column="per_num_"/>
         <result property="perNum" column="per_num_"/>
     </resultMap>
     </resultMap>
+    <select id="queryStudentPer1" resultMap="StudentRegisterPerDtoMap">
+        SELECT o.name_ organ_name_,md.total_num_ student_num_,md.activate_num_ per_num_,md.percent_ per_
+        FROM index_base_month_data md
+        LEFT JOIN organization o ON o.id_ = md.organ_id_
+        WHERE data_type_ = 'ACTIVATION_RATE' AND month_ = #{month}
+        ORDER BY md.percent_ DESC,o.id_
+    </select>
     <select id="queryStudentPer" resultMap="StudentRegisterPerDtoMap">
     <select id="queryStudentPer" resultMap="StudentRegisterPerDtoMap">
         SELECT a.name_ organ_name_,a.num_ student_num_,b.num_ per_num_,ifnull(b.num_,0)*100/a.num_ per_
         SELECT a.name_ organ_name_,a.num_ student_num_,b.num_ per_num_,ifnull(b.num_,0)*100/a.num_ per_
         FROM (SELECT o.id_,o.name_,COUNT(DISTINCT su.id_) num_ FROM sys_user su
         FROM (SELECT o.id_,o.name_,COUNT(DISTINCT su.id_) num_ FROM sys_user su
@@ -964,4 +971,8 @@
             </foreach>
             </foreach>
         </if>
         </if>
     </select>
     </select>
+
+    <select id="getPaymentStudentNum" resultType="int">
+        SELECT COUNT(*) FROM student_registration WHERE music_group_id_ = #{musicGroupId} AND payment_status_ = 2 AND music_group_status_ = 'NORMAL'
+    </select>
 </mapper>
 </mapper>

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

@@ -24,6 +24,7 @@
         <result column="sign_in_longitude_latitude_" property="signInLongitudeLatitude"/>
         <result column="sign_in_longitude_latitude_" property="signInLongitudeLatitude"/>
         <result column="sign_out_longitude_latitude_" property="signOutLongitudeLatitude"/>
         <result column="sign_out_longitude_latitude_" property="signOutLongitudeLatitude"/>
         <result column="longitude_latitude_" property="schoolLongitudeLatitude"/>
         <result column="longitude_latitude_" property="schoolLongitudeLatitude"/>
+        <result column="complaints_type_" property="complaintsType" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
         <result column="is_complaints_" property="isComplaints"/>
         <result column="is_complaints_" property="isComplaints"/>
         <result column="complaints_status_" property="complaintsStatus" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
         <result column="complaints_status_" property="complaintsStatus" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
         <result column="complaints_content_" property="complaintsContent"/>
         <result column="complaints_content_" property="complaintsContent"/>
@@ -150,6 +151,9 @@
             <if test="isComplaints != null">
             <if test="isComplaints != null">
                 is_complaints_ = #{isComplaints},
                 is_complaints_ = #{isComplaints},
             </if>
             </if>
+            <if test="complaintsType != null">
+                complaints_type_ = #{complaintsType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+            </if>
             <if test="complaintsStatus != null">
             <if test="complaintsStatus != null">
                 complaints_status_ = #{complaintsStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
                 complaints_status_ = #{complaintsStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
             </if>
             </if>
@@ -535,6 +539,7 @@
         <result property="signOutStatus" column="sign_out_status_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
         <result property="signOutStatus" column="sign_out_status_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
         <result property="teacherName" column="teacher_name_"/>
         <result property="teacherName" column="teacher_name_"/>
         <result property="complaintsStatusEnum" column="complaints_status_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
         <result property="complaintsStatusEnum" column="complaints_status_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
+        <result column="complaints_type_" property="complaintsType" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
         <result property="operatorName" column="operator_name_"/>
         <result property="operatorName" column="operator_name_"/>
         <result property="signInTime" column="sign_in_time_"/>
         <result property="signInTime" column="sign_in_time_"/>
         <result property="signOutTime" column="sign_out_time_"/>
         <result property="signOutTime" column="sign_out_time_"/>
@@ -549,7 +554,8 @@
         IF(ta.sign_in_status_ IS NULL,3,ta.sign_in_status_) sign_in_status_,
         IF(ta.sign_in_status_ IS NULL,3,ta.sign_in_status_) sign_in_status_,
         IF(ta.sign_out_status_ IS NULL,3,ta.sign_out_status_) sign_out_status_,
         IF(ta.sign_out_status_ IS NULL,3,ta.sign_out_status_) sign_out_status_,
         suo.real_name_ operator_name_,su.real_name_ teacher_name_,ta.complaints_status_,ta.sign_in_time_,ta.sign_out_time_
         suo.real_name_ operator_name_,su.real_name_ teacher_name_,ta.complaints_status_,ta.sign_in_time_,ta.sign_out_time_
-        ,ta.complaints_content_,ta.dispose_content_,cs.end_class_time_,cs.start_class_time_,ta.id_ teacher_attendance_id_,ta.update_attendance_type_,ta.url_
+        ,ta.complaints_content_,ta.dispose_content_,cs.end_class_time_,cs.start_class_time_,
+        ta.id_ teacher_attendance_id_,ta.update_attendance_type_,ta.url_,ta.complaints_type_
         FROM teacher_attendance ta
         FROM teacher_attendance ta
         LEFT JOIN sys_user su ON ta.teacher_id_ = su.id_
         LEFT JOIN sys_user su ON ta.teacher_id_ = su.id_
         LEFT JOIN teacher t ON t.id_ = su.id_
         LEFT JOIN teacher t ON t.id_ = su.id_
@@ -649,7 +655,11 @@
     </update>
     </update>
     <update id="clearAttendanceComplaints">
     <update id="clearAttendanceComplaints">
         UPDATE teacher_attendance
         UPDATE teacher_attendance
-        SET is_complaints_ = 0,complaints_status_ = NULL,complaints_content_ = NULL,dispose_content_ = NULL,operator_ = NULL,complaints_time_ = NULL
+        SET is_complaints_ = 0,complaints_status_ = NULL,complaints_content_ = NULL,
+            dispose_content_ = NULL,operator_ = NULL,complaints_time_ = NULL,complaints_type_ = NULL,
+        sign_out_device_no_ = NULL,sign_in_device_no_ = NULL,url_ = NULL,update_attendance_type_ = NULL,
+            sign_out_remark_ = NULL,sign_out_attachments_ = NULL,current_schedule_id_ = NULL,remark_ = NULL
+        ,sign_in_longitude_latitude_ = NULL,sign_out_longitude_latitude_ = NULL
         WHERE course_schedule_id_ IN
         WHERE course_schedule_id_ IN
         <foreach collection="courseScheduleIds" item="courseScheduleId" open="(" close=")" separator=",">
         <foreach collection="courseScheduleIds" item="courseScheduleId" open="(" close=")" separator=",">
             #{courseScheduleId}
             #{courseScheduleId}
@@ -657,7 +667,11 @@
     </update>
     </update>
     <update id="clearAttendanceComplaint">
     <update id="clearAttendanceComplaint">
         UPDATE teacher_attendance
         UPDATE teacher_attendance
-        SET is_complaints_ = 0,complaints_status_ = NULL,complaints_content_ = NULL,dispose_content_ = NULL,operator_ = NULL,complaints_time_ = NULL
+        SET is_complaints_ = 0,complaints_status_ = NULL,complaints_content_ = NULL,
+            dispose_content_ = NULL,operator_ = NULL,complaints_time_ = NULL,complaints_type_ = NULL,
+            sign_out_device_no_ = NULL,sign_in_device_no_ = NULL,url_ = NULL,update_attendance_type_ = NULL,
+            sign_out_remark_ = NULL,sign_out_attachments_ = NULL,current_schedule_id_ = NULL,remark_ = NULL
+                ,sign_in_longitude_latitude_ = NULL,sign_out_longitude_latitude_ = NULL
         WHERE course_schedule_id_ = #{courseScheduleId}
         WHERE course_schedule_id_ = #{courseScheduleId}
     </update>
     </update>
 
 

+ 18 - 10
mec-biz/src/main/resources/config/mybatis/TeacherMapper.xml

@@ -55,6 +55,7 @@
         <result column="im_token_" property="imToken"/>
         <result column="im_token_" property="imToken"/>
         <result column="subject_name_" property="splitSubjectName"/>
         <result column="subject_name_" property="splitSubjectName"/>
         <result column="id_card_no_" property="idCardNo"/>
         <result column="id_card_no_" property="idCardNo"/>
+        <result column="is_settlement_salary_" property="isSettlementSalary"/>
     </resultMap>
     </resultMap>
     
     
     <resultMap type="com.ym.mec.biz.dal.dto.TeacherDefaultSalaryDto" id="TeacherDefaultSalaryDto">
     <resultMap type="com.ym.mec.biz.dal.dto.TeacherDefaultSalaryDto" id="TeacherDefaultSalaryDto">
@@ -117,7 +118,8 @@
         t.lecture_num_,t.idcard_front_img_,t.idcard_back_img_,t.idcard_hand_img_,t.memo_,
         t.lecture_num_,t.idcard_front_img_,t.idcard_back_img_,t.idcard_hand_img_,t.memo_,
         su.real_name_,su.id_card_no_,su.password_,su.salt_,su.phone_,su.avatar_,
         su.real_name_,su.id_card_no_,su.password_,su.salt_,su.phone_,su.avatar_,
         su.lock_flag_,su.del_flag_,su.wx_openid_,su.qq_openid_,su.user_type_,
         su.lock_flag_,su.del_flag_,su.wx_openid_,su.qq_openid_,su.user_type_,
-        su.gender_,su.nation_,su.birthdate_,su.email_,su.im_token_,su.username_,su.organ_id_
+        su.gender_,su.nation_,su.birthdate_,su.email_,su.im_token_,su.username_,su.organ_id_,
+        t.is_settlement_salary_
         FROM teacher t
         FROM teacher t
         LEFT JOIN sys_user su ON t.id_ = su.id_
         LEFT JOIN sys_user su ON t.id_ = su.id_
         WHERE t.id_ = #{id} AND su.del_flag_ = 0
         WHERE t.id_ = #{id} AND su.del_flag_ = 0
@@ -138,8 +140,8 @@
     <insert id="insert" parameterType="com.ym.mec.biz.dal.entity.Teacher" useGeneratedKeys="true" keyColumn="id"
     <insert id="insert" parameterType="com.ym.mec.biz.dal.entity.Teacher" useGeneratedKeys="true" keyColumn="id"
             keyProperty="id">
             keyProperty="id">
         INSERT INTO teacher
         INSERT INTO teacher
-        (id_,organ_id_,job_type_,job_nature_,is_probation_period_,education_background_,graduate_school_,technical_titles_,work_unit_,subject_id_,entry_date_,demission_date_,formal_staff_date_,certificate_type_,certificate_num_,flow_organ_range_,introduction_,update_time_,create_time_,is_support_course_schedule_rewards_rules_,idcard_front_img_,idcard_back_img_,idcard_hand_img_,memo_)
-        VALUES(#{id},#{organId},#{jobType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{jobNature},#{isProbationPeriod,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{educationBackground},#{graduateSchool},#{technicalTitles},#{workUnit},#{subjectId},#{entryDate},#{demissionDate},#{formalStaffDate},#{certificateType},#{certificateNum},#{flowOrganRange},#{introduction},now(),now(),#{isSupportCourseScheduleRewardsRules},#{idcardFrontImg},#{idcardBackImg},#{idcardHandImg},#{memo})
+        (id_,organ_id_,job_type_,job_nature_,is_probation_period_,education_background_,graduate_school_,technical_titles_,work_unit_,subject_id_,entry_date_,demission_date_,formal_staff_date_,certificate_type_,certificate_num_,flow_organ_range_,introduction_,update_time_,create_time_,is_support_course_schedule_rewards_rules_,idcard_front_img_,idcard_back_img_,idcard_hand_img_,memo_,is_settlement_salary_)
+        VALUES(#{id},#{organId},#{jobType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{jobNature},#{isProbationPeriod,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{educationBackground},#{graduateSchool},#{technicalTitles},#{workUnit},#{subjectId},#{entryDate},#{demissionDate},#{formalStaffDate},#{certificateType},#{certificateNum},#{flowOrganRange},#{introduction},now(),now(),#{isSupportCourseScheduleRewardsRules},#{idcardFrontImg},#{idcardBackImg},#{idcardHandImg},#{memo},#{isSettlementSalary})
     </insert>
     </insert>
 
 
     <insert id="addSysUser" parameterType="com.ym.mec.auth.api.entity.SysUser" useGeneratedKeys="true" keyColumn="id"
     <insert id="addSysUser" parameterType="com.ym.mec.auth.api.entity.SysUser" useGeneratedKeys="true" keyColumn="id"
@@ -220,6 +222,9 @@
             <if test="idcardHandImg != null">
             <if test="idcardHandImg != null">
                 idcard_hand_img_ = #{idcardHandImg},
                 idcard_hand_img_ = #{idcardHandImg},
             </if>
             </if>
+            <if test="isSettlementSalary != null">
+                is_settlement_salary_ = #{isSettlementSalary},
+            </if>
         </set>
         </set>
         WHERE id_ = #{id}
         WHERE id_ = #{id}
     </update>
     </update>
@@ -293,7 +298,7 @@
     <!-- 分页查询 -->
     <!-- 分页查询 -->
     <select id="queryPage" resultMap="Teacher" parameterType="map">
     <select id="queryPage" resultMap="Teacher" parameterType="map">
         SELECT t.id_,su.real_name_,su.lock_flag_,t.subject_id_,su.phone_,t.organ_id_ teacher_organ_id_,t.organ_id_,t.is_support_extra_practice_lesson_,
         SELECT t.id_,su.real_name_,su.lock_flag_,t.subject_id_,su.phone_,t.organ_id_ teacher_organ_id_,t.organ_id_,t.is_support_extra_practice_lesson_,
-        t.job_nature_,t.demission_date_,t.formal_staff_date_,t.is_probation_period_,t.memo_,GROUP_CONCAT(s.name_) subject_name_,su.del_flag_
+        t.job_nature_,t.demission_date_,t.formal_staff_date_,t.is_probation_period_,t.memo_,GROUP_CONCAT(s.name_) subject_name_,su.del_flag_,t.is_settlement_salary_
         FROM teacher t
         FROM teacher t
         LEFT JOIN sys_user su ON t.id_ = su.id_
         LEFT JOIN sys_user su ON t.id_ = su.id_
         LEFT JOIN `subject` s ON FIND_IN_SET(s.id_,t.subject_id_)
         LEFT JOIN `subject` s ON FIND_IN_SET(s.id_,t.subject_id_)
@@ -336,6 +341,9 @@
                     #{item}
                     #{item}
                 </foreach>
                 </foreach>
             </if>
             </if>
+            <if test="isSettlementSalary!=null">
+                AND t.is_settlement_salary_ = #{isSettlementSalary}
+            </if>
             <if test="search != null">
             <if test="search != null">
                 AND (su.real_name_ LIKE CONCAT('%',#{search},'%') OR su.phone_ LIKE CONCAT('%',#{search},'%') OR t.id_ = #{search})
                 AND (su.real_name_ LIKE CONCAT('%',#{search},'%') OR su.phone_ LIKE CONCAT('%',#{search},'%') OR t.id_ = #{search})
             </if>
             </if>
@@ -804,7 +812,7 @@
     <select id="findByFlowOrganRangeTeachers" resultMap="TeacherBasicDto">
     <select id="findByFlowOrganRangeTeachers" resultMap="TeacherBasicDto">
         SELECT su.id_,su.username_,su.real_name_,t.organ_id_ FROM teacher t
         SELECT su.id_,su.username_,su.real_name_,t.organ_id_ FROM teacher t
         LEFT JOIN sys_user su ON t.id_ = su.id_
         LEFT JOIN sys_user su ON t.id_ = su.id_
-        WHERE su.del_flag_ = 0
+        WHERE su.del_flag_ = 0 AND su.lock_flag_=0
         <if test="organId != null and organId != ''">
         <if test="organId != null and organId != ''">
             AND (INTE_ARRAY(#{organId},t.flow_organ_range_) OR FIND_IN_SET(t.organ_id_,#{organId}))
             AND (INTE_ARRAY(#{organId},t.flow_organ_range_) OR FIND_IN_SET(t.organ_id_,#{organId}))
         </if>
         </if>
@@ -821,7 +829,7 @@
     <select id="findTeacherByOrganId" resultMap="TeacherBasicDto">
     <select id="findTeacherByOrganId" resultMap="TeacherBasicDto">
         SELECT su.id_,su.username_,su.real_name_ FROM teacher t
         SELECT su.id_,su.username_,su.real_name_ FROM teacher t
         LEFT JOIN sys_user su ON t.id_ = su.id_
         LEFT JOIN sys_user su ON t.id_ = su.id_
-        WHERE su.del_flag_ != 1
+        WHERE su.del_flag_ != 1 AND su.lock_flag_!=1
         <if test="organId != null">
         <if test="organId != null">
             AND (FIND_IN_SET(t.organ_id_,#{organId}) OR INTE_ARRAY(t.flow_organ_range_,#{organId}))
             AND (FIND_IN_SET(t.organ_id_,#{organId}) OR INTE_ARRAY(t.flow_organ_range_,#{organId}))
         </if>
         </if>
@@ -842,7 +850,7 @@
     <select id="searchTeachers" resultMap="TeacherBasicDto">
     <select id="searchTeachers" resultMap="TeacherBasicDto">
         SELECT su.id_,su.username_,su.real_name_ FROM teacher t
         SELECT su.id_,su.username_,su.real_name_ FROM teacher t
         LEFT JOIN sys_user su ON t.id_ = su.id_
         LEFT JOIN sys_user su ON t.id_ = su.id_
-        WHERE su.del_flag_ != 1
+        WHERE su.del_flag_ != 1 AND su.lock_flag_!=1
         <if test="organId != null">
         <if test="organId != null">
             AND FIND_IN_SET(t.organ_id_,#{organId})
             AND FIND_IN_SET(t.organ_id_,#{organId})
         </if>
         </if>
@@ -853,7 +861,7 @@
     <select id="countTeacherName" resultType="java.lang.Integer">
     <select id="countTeacherName" resultType="java.lang.Integer">
         SELECT COUNT(su.id_) FROM teacher t
         SELECT COUNT(su.id_) FROM teacher t
         LEFT JOIN sys_user su ON t.id_ = su.id_
         LEFT JOIN sys_user su ON t.id_ = su.id_
-        WHERE su.del_flag_ != 1
+        WHERE su.del_flag_ != 1 AND su.lock_flag_!=1
         <include refid="queryPageNameSql"/>
         <include refid="queryPageNameSql"/>
     </select>
     </select>
     <sql id="queryPageNameSql">
     <sql id="queryPageNameSql">
@@ -877,7 +885,7 @@
         SELECT su.id_,su.real_name_,su.avatar_,GROUP_CONCAT(s.name_) subject_name_ FROM teacher t
         SELECT su.id_,su.real_name_,su.avatar_,GROUP_CONCAT(s.name_) subject_name_ FROM teacher t
         LEFT JOIN sys_user su ON t.id_ = su.id_
         LEFT JOIN sys_user su ON t.id_ = su.id_
         LEFT JOIN subject s ON FIND_IN_SET(s.id_, t.subject_id_)
         LEFT JOIN subject s ON FIND_IN_SET(s.id_, t.subject_id_)
-        WHERE su.del_flag_ != 1
+        WHERE su.del_flag_ != 1 AND su.lock_flag_!=1
         <include refid="queryPageNameSql"/>
         <include refid="queryPageNameSql"/>
         GROUP BY su.id_
         GROUP BY su.id_
         <include refid="global.limit"/>
         <include refid="global.limit"/>
@@ -943,7 +951,7 @@
         <if test="search != null and search != ''">
         <if test="search != null and search != ''">
             AND (su.real_name_ LIKE CONCAT('%',#{search},'%') OR su.username_ LIKE CONCAT('%',#{search},'%'))
             AND (su.real_name_ LIKE CONCAT('%',#{search},'%') OR su.username_ LIKE CONCAT('%',#{search},'%'))
         </if>
         </if>
-        AND su.del_flag_ = 0
+        AND su.del_flag_ = 0 AND su.lock_flag_=0
         GROUP BY su.id_
         GROUP BY su.id_
     </select>
     </select>
     <select id="queryTeacherImModel" resultMap="com.ym.mec.biz.dal.dao.MusicGroupDao.ImUserModel">
     <select id="queryTeacherImModel" resultMap="com.ym.mec.biz.dal.dao.MusicGroupDao.ImUserModel">

+ 35 - 22
mec-biz/src/main/resources/config/mybatis/VipGroupActivityMapper.xml

@@ -31,6 +31,8 @@
 		<result property="delFlag" column="del_flag_"/>
 		<result property="delFlag" column="del_flag_"/>
 		<result property="onlineClassJoinGradientRewards" column="online_class_join_gradient_rewards_"/>
 		<result property="onlineClassJoinGradientRewards" column="online_class_join_gradient_rewards_"/>
 		<result property="offlineClassJoinGradientRewards" column="offline_class_join_gradient_rewards_"/>
 		<result property="offlineClassJoinGradientRewards" column="offline_class_join_gradient_rewards_"/>
+		<result property="minCourseNum" column="min_course_num_"/>
+		<result property="maxCourseNum" column="max_course_num_"/>
 	</resultMap>
 	</resultMap>
 	
 	
 	<!-- 根据主键查询一条记录 -->
 	<!-- 根据主键查询一条记录 -->
@@ -50,66 +52,71 @@
 		SELECT SEQ_WSDEFINITION_ID.nextval AS ID FROM DUAL 
 		SELECT SEQ_WSDEFINITION_ID.nextval AS ID FROM DUAL 
 		</selectKey>
 		</selectKey>
 		-->
 		-->
-		INSERT INTO vip_group_activity (id_,name_,description_,vip_group_category_id_list_,start_time_,end_time_,organ_id_,courses_start_time_,courses_end_time_,type_,attribute1_,attribute2_,attribute3_,salary_readonly_flag_,give_class_pay_salary_flag_,create_time_,update_time_,salary_settlement_json_,del_flag_,payment_readonly_flag_,online_class_join_gradient_rewards_,offline_class_join_gradient_rewards_)
-		VALUES(#{id},#{name},#{description},#{vipGroupCategoryIdList},#{startTime},#{endTime},#{organId},#{coursesStartTime},#{coursesEndTime},#{type},#{attribute1},#{attribute2},#{attribute3},#{salaryReadonlyFlag},#{giveClassPaySalaryFlag},now(),now(),#{salarySettlementJson},#{delFlag},#{paymentReadonlyFlag},#{onlineClassJoinGradientRewards},#{offlineClassJoinGradientRewards})
+		INSERT INTO vip_group_activity (id_,name_,description_,vip_group_category_id_list_,start_time_,end_time_,organ_id_,courses_start_time_,courses_end_time_,type_,
+		                                attribute1_,attribute2_,attribute3_,salary_readonly_flag_,give_class_pay_salary_flag_,create_time_,update_time_,salary_settlement_json_,del_flag_,
+		                                payment_readonly_flag_,online_class_join_gradient_rewards_,offline_class_join_gradient_rewards_,min_course_num_,max_course_num_)
+		VALUES(#{id},#{name},#{description},#{vipGroupCategoryIdList},#{startTime},#{endTime},#{organId},#{coursesStartTime},#{coursesEndTime},#{type},#{attribute1},#{attribute2},#{attribute3},
+		       #{salaryReadonlyFlag},#{giveClassPaySalaryFlag},now(),now(),#{salarySettlementJson},#{delFlag},#{paymentReadonlyFlag},#{onlineClassJoinGradientRewards},
+		       #{offlineClassJoinGradientRewards},#{minCourseNum},#{maxCourseNum})
 	</insert>
 	</insert>
 	
 	
 	<!-- 根据主键查询一条记录 -->
 	<!-- 根据主键查询一条记录 -->
 	<update id="update" parameterType="com.ym.mec.biz.dal.entity.VipGroupActivity">
 	<update id="update" parameterType="com.ym.mec.biz.dal.entity.VipGroupActivity">
-		UPDATE vip_group_activity <set>
+		UPDATE vip_group_activity
+		<set>
 			<if test="salaryReadonlyFlag != null">
 			<if test="salaryReadonlyFlag != null">
-			salary_readonly_flag_ = #{salaryReadonlyFlag},
+				salary_readonly_flag_ = #{salaryReadonlyFlag},
 			</if>
 			</if>
 			<if test="organId != null">
 			<if test="organId != null">
-			organ_id_ = #{organId},
+				organ_id_ = #{organId},
 			</if>
 			</if>
 			<if test="id != null">
 			<if test="id != null">
-			id_ = #{id},
+				id_ = #{id},
 			</if>
 			</if>
 			<if test="giveClassPaySalaryFlag != null">
 			<if test="giveClassPaySalaryFlag != null">
-			give_class_pay_salary_flag_ = #{giveClassPaySalaryFlag},
+				give_class_pay_salary_flag_ = #{giveClassPaySalaryFlag},
 			</if>
 			</if>
 			<if test="coursesEndTime != null">
 			<if test="coursesEndTime != null">
-			courses_end_time_ = #{coursesEndTime},
+				courses_end_time_ = #{coursesEndTime},
 			</if>
 			</if>
 			<if test="attribute1 != null">
 			<if test="attribute1 != null">
-			attribute1_ = #{attribute1},
+				attribute1_ = #{attribute1},
 			</if>
 			</if>
 			<if test="endTime != null">
 			<if test="endTime != null">
-			end_time_ = #{endTime},
+				end_time_ = #{endTime},
 			</if>
 			</if>
 			<if test="attribute2 != null">
 			<if test="attribute2 != null">
-			attribute2_ = #{attribute2},
+				attribute2_ = #{attribute2},
 			</if>
 			</if>
 			<if test="name != null">
 			<if test="name != null">
-			name_ = #{name},
+				name_ = #{name},
 			</if>
 			</if>
 			<if test="startTime != null">
 			<if test="startTime != null">
-			start_time_ = #{startTime},
+				start_time_ = #{startTime},
 			</if>
 			</if>
 			<if test="attribute3 != null">
 			<if test="attribute3 != null">
-			attribute3_ = #{attribute3},
+				attribute3_ = #{attribute3},
 			</if>
 			</if>
 			<if test="createTime != null">
 			<if test="createTime != null">
-			create_time_ = #{createTime},
+				create_time_ = #{createTime},
 			</if>
 			</if>
 			<if test="vipGroupCategoryIdList != null">
 			<if test="vipGroupCategoryIdList != null">
-			vip_group_category_id_list_ = #{vipGroupCategoryIdList},
+				vip_group_category_id_list_ = #{vipGroupCategoryIdList},
 			</if>
 			</if>
 			<if test="description != null">
 			<if test="description != null">
-			description_ = #{description},
+				description_ = #{description},
 			</if>
 			</if>
 			<if test="salarySettlementJson != null">
 			<if test="salarySettlementJson != null">
-			salary_settlement_json_ = #{salarySettlementJson},
+				salary_settlement_json_ = #{salarySettlementJson},
 			</if>
 			</if>
 			<if test="coursesStartTime != null">
 			<if test="coursesStartTime != null">
-			courses_start_time_ = #{coursesStartTime},
+				courses_start_time_ = #{coursesStartTime},
 			</if>
 			</if>
 			<if test="type != null">
 			<if test="type != null">
-			type_ = #{type},
+				type_ = #{type},
 			</if>
 			</if>
 			<if test="delFlag != null">
 			<if test="delFlag != null">
-			del_flag_ = #{delFlag},
+				del_flag_ = #{delFlag},
 			</if>
 			</if>
 			<if test="paymentReadonlyFlag != null">
 			<if test="paymentReadonlyFlag != null">
 				payment_readonly_flag_ = #{paymentReadonlyFlag},
 				payment_readonly_flag_ = #{paymentReadonlyFlag},
@@ -120,8 +127,14 @@
 			<if test="offlineClassJoinGradientRewards!=null">
 			<if test="offlineClassJoinGradientRewards!=null">
 				offline_class_join_gradient_rewards_=#{offlineClassJoinGradientRewards},
 				offline_class_join_gradient_rewards_=#{offlineClassJoinGradientRewards},
 			</if>
 			</if>
+			<if test="minCourseNum!=null">
+				min_course_num_=#{minCourseNum},
+			</if>
+			<if test="maxCourseNum!=null">
+				max_course_num_=#{maxCourseNum},
+			</if>
 			update_time_ = NOW(),
 			update_time_ = NOW(),
-			</set> WHERE id_ = #{id}
+		</set>WHERE id_ = #{id}
 	</update>
 	</update>
 
 
 	<!-- 根据主键删除一条记录 -->
 	<!-- 根据主键删除一条记录 -->

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

@@ -6,6 +6,8 @@ import org.springframework.web.bind.annotation.GetMapping;
 import com.ym.mec.common.config.FeignConfiguration;
 import com.ym.mec.common.config.FeignConfiguration;
 import com.ym.mec.task.fallback.TaskRemoteServiceFallback;
 import com.ym.mec.task.fallback.TaskRemoteServiceFallback;
 
 
+import java.util.Date;
+
 @FeignClient(name = "web-server", contextId = "TaskRemoteService", configuration = { FeignConfiguration.class }, fallback = TaskRemoteServiceFallback.class)
 @FeignClient(name = "web-server", contextId = "TaskRemoteService", configuration = { FeignConfiguration.class }, fallback = TaskRemoteServiceFallback.class)
 public interface TaskRemoteService {
 public interface TaskRemoteService {
 
 
@@ -177,4 +179,12 @@ public interface TaskRemoteService {
 	//更新学员指导老师和声部信息
 	//更新学员指导老师和声部信息
 	@GetMapping("task/updateStudentTeacherAndSubject")
 	@GetMapping("task/updateStudentTeacherAndSubject")
 	void updateStudentTeacherAndSubject();
 	void updateStudentTeacherAndSubject();
+
+	//推送查看今日收入提醒
+	@GetMapping("task/todayIncomeRemind")
+	void todayIncomeRemind();
+
+	//大雅基本工资标记
+	@GetMapping("task/salaryMarkNew")
+	void salaryMarkNew();
 }
 }

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

@@ -6,6 +6,8 @@ import org.springframework.stereotype.Component;
 
 
 import com.ym.mec.task.TaskRemoteService;
 import com.ym.mec.task.TaskRemoteService;
 
 
+import java.util.Date;
+
 @Component
 @Component
 public class TaskRemoteServiceFallback implements TaskRemoteService {
 public class TaskRemoteServiceFallback implements TaskRemoteService {
 
 
@@ -220,4 +222,14 @@ public class TaskRemoteServiceFallback implements TaskRemoteService {
 	public void updateStudentTeacherAndSubject() {
 	public void updateStudentTeacherAndSubject() {
 		logger.error("更新学员指导老师和声部信息失败");
 		logger.error("更新学员指导老师和声部信息失败");
 	}
 	}
+
+	@Override
+	public void todayIncomeRemind() {
+		logger.error("推送查看今日收入提醒失败");
+	}
+
+	@Override
+	public void salaryMarkNew() {
+		logger.error("大雅基本工资标记失败");
+	}
 }
 }

+ 16 - 0
mec-student/src/main/java/com/ym/mec/student/controller/ReplacementInstrumentActivityController.java

@@ -115,6 +115,22 @@ public class ReplacementInstrumentActivityController extends BaseController {
         return succeed(replacementInstrumentActivityService.getInfo(id));
         return succeed(replacementInstrumentActivityService.getInfo(id));
     }
     }
 
 
+    @ApiOperation(value = "获取置换的详情")
+    @GetMapping("/getInfoByCooperationOrganId")
+    @ApiImplicitParams({@ApiImplicitParam(name = "cooperationOrganId", value = "合作单位id", required = true, dataType = "int")})
+    public HttpResponseResult<ReplacementInstrumentActivityStatDto> getInfoByCooperationOrganId(Integer cooperationOrganId) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed(HttpStatus.FORBIDDEN, "请重新登陆");
+        }
+        ReplacementInstrumentActivity replacementInstrumentActivity = replacementInstrumentActivityService.findByUserId(cooperationOrganId, sysUser.getId());
+        if(replacementInstrumentActivity == null){
+        	return failed("未查询到您参与调查的记录");
+        }
+        Integer activityId = replacementInstrumentActivity.getId();
+        return succeed(replacementInstrumentActivityService.getInfo(activityId));
+    }
+
     @ApiOperation(value = "置换支付")
     @ApiOperation(value = "置换支付")
     @PostMapping("/pay")
     @PostMapping("/pay")
     @ApiImplicitParams({@ApiImplicitParam(name = "replacementPayDto", value = "支付参数", required = true, dataType = "ReplacementPayDto")})
     @ApiImplicitParams({@ApiImplicitParam(name = "replacementPayDto", value = "支付参数", required = true, dataType = "ReplacementPayDto")})

+ 19 - 0
mec-task/src/main/java/com/ym/mec/task/jobs/DayaSalaryMarkTask.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 DayaSalaryMarkTask extends BaseTask {
+
+    @Autowired
+    private TaskRemoteService taskRemoteService;
+
+    @Override
+    public void execute() throws TaskException {
+        taskRemoteService.salaryMarkNew();
+    }
+}

+ 19 - 0
mec-task/src/main/java/com/ym/mec/task/jobs/TodayIncomeRemindTask.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 TodayIncomeRemindTask extends BaseTask {
+
+    @Autowired
+    private TaskRemoteService taskRemoteService;
+
+    @Override
+    public void execute() throws TaskException {
+        taskRemoteService.todayIncomeRemind();
+    }
+}

+ 41 - 0
mec-teacher/src/main/java/com/ym/mec/teacher/controller/CourseScheduleTeacherSalaryController.java

@@ -2,19 +2,25 @@ package com.ym.mec.teacher.controller;
 
 
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.enums.CourseStatusEnum;
 import com.ym.mec.biz.dal.page.CourseSalaryQueryInfo4Web;
 import com.ym.mec.biz.dal.page.CourseSalaryQueryInfo4Web;
+import com.ym.mec.biz.dal.page.TeacherIncomeQueryInfo;
 import com.ym.mec.biz.service.CourseScheduleTeacherSalaryService;
 import com.ym.mec.biz.service.CourseScheduleTeacherSalaryService;
 import com.ym.mec.biz.service.TeacherCourseRewardService;
 import com.ym.mec.biz.service.TeacherCourseRewardService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.util.date.DateUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.bind.annotation.RestController;
 
 
+import java.time.LocalDate;
+
 /**
 /**
  * @Author Joburgess
  * @Author Joburgess
  * @Date 2020/4/15
  * @Date 2020/4/15
@@ -76,4 +82,39 @@ public class CourseScheduleTeacherSalaryController extends BaseController {
         return succeed(teacherCourseRewardService.findTeacherRewards(queryInfo));
         return succeed(teacherCourseRewardService.findTeacherRewards(queryInfo));
     }
     }
 
 
+    @ApiOperation(value = "获取教师收入总览")
+    @GetMapping("/getTeacherSalaryOverview")
+    public HttpResponseResult getTeacherSalaryOverview(){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+        return succeed(courseScheduleTeacherSalaryService.getTeacherSalaryOverview(sysUser.getId()));
+    }
+
+    @ApiOperation(value = "查询教师课酬记录")
+    @GetMapping("/queryTeacherIncomeList")
+    public HttpResponseResult queryTeacherIncomeList(TeacherIncomeQueryInfo queryInfo){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+        queryInfo.setTeacherId(sysUser.getId());
+        queryInfo.setCourseStatus(CourseStatusEnum.OVER);
+        if(StringUtils.isBlank(queryInfo.getStartDay())){
+            queryInfo.setStartDay("2021-03-01");
+        }
+        return succeed(courseScheduleTeacherSalaryService.queryTeacherIncomeList(queryInfo));
+    }
+
+    @ApiOperation(value = "收入统计")
+    @GetMapping("/teacherIncomeStat")
+    public HttpResponseResult teacherIncomeStat(Integer year, Integer month){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+        return succeed(courseScheduleTeacherSalaryService.teacherIncomeStat(sysUser.getId(), year, month));
+    }
+
 }
 }

+ 3 - 2
mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherAttendanceController.java

@@ -8,6 +8,7 @@ import com.ym.mec.biz.dal.dto.TeacherSignOutDto;
 import com.ym.mec.biz.dal.entity.StudentAttendance;
 import com.ym.mec.biz.dal.entity.StudentAttendance;
 import com.ym.mec.biz.dal.enums.MessageTypeEnum;
 import com.ym.mec.biz.dal.enums.MessageTypeEnum;
 import com.ym.mec.biz.dal.enums.StudentAttendanceStatusEnum;
 import com.ym.mec.biz.dal.enums.StudentAttendanceStatusEnum;
+import com.ym.mec.biz.dal.enums.UpdateAttendanceEnum;
 import com.ym.mec.biz.dal.page.TeacherAttendanceQueryInfo;
 import com.ym.mec.biz.dal.page.TeacherAttendanceQueryInfo;
 import com.ym.mec.biz.service.ClassGroupService;
 import com.ym.mec.biz.service.ClassGroupService;
 import com.ym.mec.biz.service.StudentAttendanceService;
 import com.ym.mec.biz.service.StudentAttendanceService;
@@ -116,12 +117,12 @@ public class TeacherAttendanceController extends BaseController {
 
 
     @ApiOperation(value = "提交考勤申述")
     @ApiOperation(value = "提交考勤申述")
     @PostMapping("/addComplaints")
     @PostMapping("/addComplaints")
-    public Object addComplaints(Long courseScheduleId,String content,String url){
+    public Object addComplaints(Long courseScheduleId, String content, String url, UpdateAttendanceEnum complaintsType){
         SysUser user = sysUserFeignService.queryUserInfo();
         SysUser user = sysUserFeignService.queryUserInfo();
         if(Objects.isNull(user)){
         if(Objects.isNull(user)){
             throw new BizException("请登录");
             throw new BizException("请登录");
         }
         }
-        teacherAttendanceService.addComplaints(courseScheduleId,content,url,user.getId());
+        teacherAttendanceService.addComplaints(courseScheduleId,content,url,user.getId(),complaintsType);
         return succeed();
         return succeed();
     }
     }
 
 

+ 2 - 2
mec-thirdparty/src/main/java/com/ym/mec/thirdparty/message/MessageSenderPlugin.java

@@ -14,7 +14,7 @@ public interface MessageSenderPlugin {
 	 * @return 是否发送成功
 	 * @return 是否发送成功
 	 * @throws IOException
 	 * @throws IOException
 	 */
 	 */
-	public boolean send(String subject, String content, String receiver, String url, String jpushType) throws Exception;
+	public boolean send(String subject, String content, String receiver, String url, String jpushType,String sound,String channelId) throws Exception;
 
 
 	/**
 	/**
 	 * 批量发送消息至目的地
 	 * 批量发送消息至目的地
@@ -26,5 +26,5 @@ public interface MessageSenderPlugin {
 	 * @return 是否发送成功
 	 * @return 是否发送成功
 	 * @throws IOException
 	 * @throws IOException
 	 */
 	 */
-	public boolean batchSend(String subject, String content, String[] receivers, String url, String jpushType) throws Exception;
+	public boolean batchSend(String subject, String content, String[] receivers, String url, String jpushType,String sound,String channelId) throws Exception;
 }
 }

+ 4 - 4
mec-thirdparty/src/main/java/com/ym/mec/thirdparty/message/MessageSenderPluginContext.java

@@ -69,11 +69,11 @@ public class MessageSenderPluginContext implements ApplicationContextAware {
 	 * @return 是否发送成功
 	 * @return 是否发送成功
 	 * @throws IOException
 	 * @throws IOException
 	 */
 	 */
-	public boolean send(MessageSender messageSender, String subject, String content, String receiver, String url, String jpushType) throws Exception {
+	public boolean send(MessageSender messageSender, String subject, String content, String receiver, String url, String jpushType,String sound,String channelId) throws Exception {
 
 
 		messageSenderPlugin = getMessageSenderPlugin(messageSender);
 		messageSenderPlugin = getMessageSenderPlugin(messageSender);
 
 
-		return messageSenderPlugin.send(subject, content, receiver, url, jpushType);
+		return messageSenderPlugin.send(subject, content, receiver, url, jpushType,sound,channelId);
 	}
 	}
 
 
 	/**
 	/**
@@ -86,11 +86,11 @@ public class MessageSenderPluginContext implements ApplicationContextAware {
 	 * @return 是否发送成功
 	 * @return 是否发送成功
 	 * @throws IOException
 	 * @throws IOException
 	 */
 	 */
-	public boolean batchSend(MessageSender messageSender, String subject, String content, String[] receivers, String url, String jpushType) throws Exception {
+	public boolean batchSend(MessageSender messageSender, String subject, String content, String[] receivers, String url, String jpushType,String sound,String channelId) throws Exception {
 
 
 		messageSenderPlugin = getMessageSenderPlugin(messageSender);
 		messageSenderPlugin = getMessageSenderPlugin(messageSender);
 
 
-		return messageSenderPlugin.batchSend(subject, content, receivers, url, jpushType);
+		return messageSenderPlugin.batchSend(subject, content, receivers, url, jpushType,sound,channelId);
 	}
 	}
 
 
 	@Override
 	@Override

+ 6 - 6
mec-thirdparty/src/main/java/com/ym/mec/thirdparty/message/provider/AwSmsPlugin.java

@@ -68,7 +68,7 @@ public class AwSmsPlugin implements MessageSenderPlugin, InitializingBean {
 	}
 	}
 
 
 	@Override
 	@Override
-	public boolean send(String subject, String content, String receiver, String url, String jpushType) throws IOException {
+	public boolean send(String subject, String content, String receiver, String url, String jpushType,String sound,String channelId) throws IOException {
 		try {
 		try {
 			Map<String, Object> reqParams = new HashMap<String, Object>();
 			Map<String, Object> reqParams = new HashMap<String, Object>();
 			reqParams.put("SpCode", appId);
 			reqParams.put("SpCode", appId);
@@ -92,7 +92,7 @@ public class AwSmsPlugin implements MessageSenderPlugin, InitializingBean {
 	}
 	}
 
 
 	@Override
 	@Override
-	public boolean batchSend(String subject, String content, String[] receivers, String url, String jpushType) throws IOException {
+	public boolean batchSend(String subject, String content, String[] receivers, String url, String jpushType,String sound,String channelId) throws IOException {
 		StringBuilder stringBuilder = new StringBuilder("");
 		StringBuilder stringBuilder = new StringBuilder("");
 		for (int i = 0; i < receivers.length - 1; i++) {
 		for (int i = 0; i < receivers.length - 1; i++) {
 			stringBuilder.append(receivers[i]).append(",");
 			stringBuilder.append(receivers[i]).append(",");
@@ -120,8 +120,8 @@ public class AwSmsPlugin implements MessageSenderPlugin, InitializingBean {
 		}
 		}
 	}
 	}
 
 
-	public static void main(String[] args) throws IOException {
-		AwSmsPlugin plugin = new AwSmsPlugin();
-		plugin.send("测试", "您的验证码为274160(5分钟内有效),您正在进行商户认证,请不要向他人透露验证码", "13720176797", "", "");
-	}
+//	public static void main(String[] args) throws IOException {
+//		AwSmsPlugin plugin = new AwSmsPlugin();
+//		plugin.send("测试", "您的验证码为274160(5分钟内有效),您正在进行商户认证,请不要向他人透露验证码", "13720176797", "", "");
+//	}
 }
 }

+ 21 - 10
mec-thirdparty/src/main/java/com/ym/mec/thirdparty/message/provider/JiguangPushPlugin.java

@@ -7,6 +7,7 @@ import com.ym.mec.thirdparty.message.MessageSenderPlugin;
 import com.ym.mec.util.http.HttpUtil;
 import com.ym.mec.util.http.HttpUtil;
 
 
 import org.apache.commons.codec.binary.Base64;
 import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.InitializingBean;
 import org.springframework.beans.factory.InitializingBean;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
@@ -14,6 +15,7 @@ import org.springframework.stereotype.Service;
 import java.io.IOException;
 import java.io.IOException;
 import java.util.Arrays;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.HashMap;
+import java.util.Map;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 
 
 /**
 /**
@@ -58,7 +60,7 @@ public class JiguangPushPlugin implements MessageSenderPlugin, InitializingBean
 	 * @param content 消息内容
 	 * @param content 消息内容
 	 * @return json对象
 	 * @return json对象
 	 */
 	 */
-	private JSONObject generateJson(String[] alias, String alert, String content, String url) {
+	private JSONObject generateJson(String[] alias, String alert, String content, String url,String sound,String channelId) {
 		JSONObject json = new JSONObject();
 		JSONObject json = new JSONObject();
 		JSONArray platform = new JSONArray();// 平台
 		JSONArray platform = new JSONArray();// 平台
 		platform.add("android");
 		platform.add("android");
@@ -74,6 +76,16 @@ public class JiguangPushPlugin implements MessageSenderPlugin, InitializingBean
 		JSONObject notification = new JSONObject();// 通知内容
 		JSONObject notification = new JSONObject();// 通知内容
 		JSONObject android = new JSONObject();// android通知内容
 		JSONObject android = new JSONObject();// android通知内容
 		android.put("alert", alert);
 		android.put("alert", alert);
+		android.put("sound", sound.split("\\.")[0]);
+		JSONObject options = new JSONObject();// 设置参数
+		if(StringUtils.isNotEmpty(channelId)){
+			JSONObject thirdParty = new JSONObject();
+			JSONObject xiaomi = new JSONObject();
+			xiaomi.put("distribution","secondary_push");
+			xiaomi.put("channel_id",channelId);
+			thirdParty.put("xiaomi",xiaomi);
+			options.put("third_party_channel",thirdParty);
+		}
 		android.put("builder_id", 1);
 		android.put("builder_id", 1);
 		JSONObject android_extras = new JSONObject();// android额外参数
 		JSONObject android_extras = new JSONObject();// android额外参数
 		android_extras.put("type", "infomation");
 		android_extras.put("type", "infomation");
@@ -83,7 +95,7 @@ public class JiguangPushPlugin implements MessageSenderPlugin, InitializingBean
 
 
 		JSONObject ios = new JSONObject();// ios通知内容
 		JSONObject ios = new JSONObject();// ios通知内容
 		ios.put("alert", alert);
 		ios.put("alert", alert);
-		ios.put("sound", "default");
+		ios.put("sound", sound);
 		ios.put("badge", "+1");
 		ios.put("badge", "+1");
 		JSONObject ios_extras = new JSONObject();// ios额外参数
 		JSONObject ios_extras = new JSONObject();// ios额外参数
 		ios_extras.put("type", "infomation");
 		ios_extras.put("type", "infomation");
@@ -96,9 +108,8 @@ public class JiguangPushPlugin implements MessageSenderPlugin, InitializingBean
 		JSONObject message = new JSONObject();// 通知消息内容
 		JSONObject message = new JSONObject();// 通知消息内容
 		message.put("title", alert);
 		message.put("title", alert);
 		message.put("msg_content", content);
 		message.put("msg_content", content);
-		message.put("content_type", "text");
+		message.put("content_type","text");
 
 
-		JSONObject options = new JSONObject();// 设置参数
 		options.put("time_to_live", this.time_to_live);
 		options.put("time_to_live", this.time_to_live);
 		options.put("apns_production", this.apns_production);
 		options.put("apns_production", this.apns_production);
 
 
@@ -117,7 +128,7 @@ public class JiguangPushPlugin implements MessageSenderPlugin, InitializingBean
 	 * @param alert 推送消息
 	 * @param alert 推送消息
 	 * @param content 推送内容
 	 * @param content 推送内容
 	 */
 	 */
-	private String push(String[] alias, String alert, String content, String url,String type) {
+	private String push(String[] alias, String alert, String content, String url,String type,String sound,String channelId) {
 		String base64_auth_string = "";
 		String base64_auth_string = "";
 		switch (type){
 		switch (type){
 			case "STUDENT":
 			case "STUDENT":
@@ -131,7 +142,7 @@ public class JiguangPushPlugin implements MessageSenderPlugin, InitializingBean
 				break;
 				break;
 		}
 		}
 		String authorization = "Basic " + base64_auth_string;
 		String authorization = "Basic " + base64_auth_string;
-		return sendPostRequest(generateJson(alias, alert, content, url).toString(), authorization);
+		return sendPostRequest(generateJson(alias, alert, content, url,sound,channelId).toString(), authorization);
 	}
 	}
 
 
 	/**
 	/**
@@ -177,9 +188,9 @@ public class JiguangPushPlugin implements MessageSenderPlugin, InitializingBean
 	}
 	}
 
 
 	@Override
 	@Override
-	public boolean send(String subject, String content, String receiver, String url, String type) throws IOException {
+	public boolean send(String subject, String content, String receiver, String url, String type,String sound,String channelId) throws IOException {
 		String[] alias = { receiver };
 		String[] alias = { receiver };
-		String result = this.push(alias, subject, content, url,type);
+		String result = this.push(alias, subject, content, url,type,sound,channelId);
 		JSONObject json = JSONObject.parseObject(result);
 		JSONObject json = JSONObject.parseObject(result);
 		if (json.containsKey("error")) {
 		if (json.containsKey("error")) {
 			JSONObject jsonObject = json.getJSONObject("error");
 			JSONObject jsonObject = json.getJSONObject("error");
@@ -189,8 +200,8 @@ public class JiguangPushPlugin implements MessageSenderPlugin, InitializingBean
 	}
 	}
 
 
 	@Override
 	@Override
-	public boolean batchSend(String subject, String content, String[] receivers, String url, String type) throws IOException {
-		String result = this.push(receivers, subject, content, url,type);
+	public boolean batchSend(String subject, String content, String[] receivers, String url, String type,String sound,String channelId) throws IOException {
+		String result = this.push(receivers, subject, content, url,type,sound,channelId);
 		JSONObject json = JSONObject.parseObject(result);
 		JSONObject json = JSONObject.parseObject(result);
 		if (json.containsKey("error")) {
 		if (json.containsKey("error")) {
 			JSONObject jsonObject = json.getJSONObject("error");
 			JSONObject jsonObject = json.getJSONObject("error");

+ 2 - 2
mec-thirdparty/src/main/java/com/ym/mec/thirdparty/message/provider/MOxintongSMSPlugin.java

@@ -36,7 +36,7 @@ public class MOxintongSMSPlugin implements MessageSenderPlugin, InitializingBean
 	}
 	}
 
 
 	@Override
 	@Override
-	public boolean send(String subject, String content, String receiver, String url, String jpushType) throws IOException {
+	public boolean send(String subject, String content, String receiver, String url, String jpushType,String sound,String channelId) throws IOException {
 		Map<String, Object> reqParams = new HashMap<String, Object>();
 		Map<String, Object> reqParams = new HashMap<String, Object>();
 		reqParams.put("username", username);
 		reqParams.put("username", username);
 		reqParams.put("pwd", pwd);
 		reqParams.put("pwd", pwd);
@@ -58,7 +58,7 @@ public class MOxintongSMSPlugin implements MessageSenderPlugin, InitializingBean
 	}
 	}
 
 
 	@Override
 	@Override
-	public boolean batchSend(String subject, String content, String[] receivers, String url, String jpushType) throws IOException {
+	public boolean batchSend(String subject, String content, String[] receivers, String url, String jpushType,String sound,String channelId) throws IOException {
 		StringBuilder stringBuilder = new StringBuilder();
 		StringBuilder stringBuilder = new StringBuilder();
 		for (int i = 0; i < receivers.length - 1; i++) {
 		for (int i = 0; i < receivers.length - 1; i++) {
 			stringBuilder.append(receivers[i]).append(",");
 			stringBuilder.append(receivers[i]).append(",");

+ 2 - 2
mec-thirdparty/src/main/java/com/ym/mec/thirdparty/message/provider/ShiyuanSMSPlugin.java

@@ -70,7 +70,7 @@ public class ShiyuanSMSPlugin implements MessageSenderPlugin, InitializingBean {
 	}
 	}
 
 
 	@Override
 	@Override
-	public boolean send(String subject, String content, String receiver, String url,String jpushType) throws IOException {
+	public boolean send(String subject, String content, String receiver, String url,String jpushType,String sound,String channelId) throws IOException {
 		try {
 		try {
 			Map<String, Object> reqParams = new HashMap<String, Object>();
 			Map<String, Object> reqParams = new HashMap<String, Object>();
 			reqParams.put("account", account);
 			reqParams.put("account", account);
@@ -93,7 +93,7 @@ public class ShiyuanSMSPlugin implements MessageSenderPlugin, InitializingBean {
 	}
 	}
 
 
 	@Override
 	@Override
-	public boolean batchSend(String subject, String content, String[] receivers, String url,String jpushType) throws IOException {
+	public boolean batchSend(String subject, String content, String[] receivers, String url,String jpushType,String sound,String channelId) throws IOException {
 		StringBuilder stringBuilder = new StringBuilder("");
 		StringBuilder stringBuilder = new StringBuilder("");
 		for (int i = 0; i < receivers.length - 1; i++) {
 		for (int i = 0; i < receivers.length - 1; i++) {
 			stringBuilder.append(receivers[i]).append(",");
 			stringBuilder.append(receivers[i]).append(",");

+ 2 - 2
mec-thirdparty/src/main/java/com/ym/mec/thirdparty/message/provider/YimeiSmsPlugin.java

@@ -58,7 +58,7 @@ public class YimeiSmsPlugin implements MessageSenderPlugin, InitializingBean {
 	}
 	}
 
 
 	@Override
 	@Override
-	public boolean send(String subject, String content, String receiver, String url,String jpushType) throws Exception {
+	public boolean send(String subject, String content, String receiver, String url,String jpushType,String sound,String channelId) throws Exception {
 		String result = getParam(subject, content, receiver, host + "/simpleinter/sendSMS");
 		String result = getParam(subject, content, receiver, host + "/simpleinter/sendSMS");
 		JSONObject json = JSONObject.parseObject(result);
 		JSONObject json = JSONObject.parseObject(result);
 		if ("SUCCESS".equals(json.get("code"))) {
 		if ("SUCCESS".equals(json.get("code"))) {
@@ -70,7 +70,7 @@ public class YimeiSmsPlugin implements MessageSenderPlugin, InitializingBean {
 	}
 	}
 
 
 	@Override
 	@Override
-	public boolean batchSend(String subject, String content, String[] receivers, String url,String jpushType) throws Exception {
+	public boolean batchSend(String subject, String content, String[] receivers, String url,String jpushType,String sound,String channelId) throws Exception {
 		String join = StringUtils.join(receivers, ",");
 		String join = StringUtils.join(receivers, ",");
 		String result = getParam(subject, content, join, host + "/simpleinter/sendSMS");
 		String result = getParam(subject, content, join, host + "/simpleinter/sendSMS");
 		logger.info("调用短信接口返回:{}", result);
 		logger.info("调用短信接口返回:{}", result);

+ 15 - 3
mec-web/src/main/java/com/ym/mec/web/controller/TaskController.java

@@ -143,7 +143,7 @@ public class TaskController extends BaseController {
 	public void vipGroupTeacherSalarySettlement() {
 	public void vipGroupTeacherSalarySettlement() {
 		courseScheduleTeacherSalaryService.teacherSalarySettlement();
 		courseScheduleTeacherSalaryService.teacherSalarySettlement();
 		redisCache.getRedisTemplate().opsForSet().add(CourseScheduleTeacherSalaryService.TASK_KEY, "VIP");
 		redisCache.getRedisTemplate().opsForSet().add(CourseScheduleTeacherSalaryService.TASK_KEY, "VIP");
-		courseScheduleTeacherSalaryService.salaryMark();
+//		courseScheduleTeacherSalaryService.salaryMark();
 	}
 	}
 
 
 	@GetMapping("/practiceTeacherSalarySettlement")
 	@GetMapping("/practiceTeacherSalarySettlement")
@@ -151,7 +151,7 @@ public class TaskController extends BaseController {
 	public void practiceTeacherSalarySettlement() {
 	public void practiceTeacherSalarySettlement() {
 		courseScheduleTeacherSalaryService.practiceTeacherSalarySettlement();
 		courseScheduleTeacherSalaryService.practiceTeacherSalarySettlement();
 		redisCache.getRedisTemplate().opsForSet().add(CourseScheduleTeacherSalaryService.TASK_KEY, "PRACTICE");
 		redisCache.getRedisTemplate().opsForSet().add(CourseScheduleTeacherSalaryService.TASK_KEY, "PRACTICE");
-		courseScheduleTeacherSalaryService.salaryMark();
+//		courseScheduleTeacherSalaryService.salaryMark();
 	}
 	}
 
 
 	// 乐团课课酬结算
 	// 乐团课课酬结算
@@ -159,7 +159,7 @@ public class TaskController extends BaseController {
 	public void musicGroupTeacherSalarySettlement() {
 	public void musicGroupTeacherSalarySettlement() {
 		courseScheduleTeacherSalaryService.musicGroupTeacherSalarySettlement();
 		courseScheduleTeacherSalaryService.musicGroupTeacherSalarySettlement();
 		redisCache.getRedisTemplate().opsForSet().add(CourseScheduleTeacherSalaryService.TASK_KEY, "MUSIC");
 		redisCache.getRedisTemplate().opsForSet().add(CourseScheduleTeacherSalaryService.TASK_KEY, "MUSIC");
-		courseScheduleTeacherSalaryService.salaryMark();
+//		courseScheduleTeacherSalaryService.salaryMark();
 	}
 	}
 
 
 	@GetMapping("/updateCourseScheduleToOverStatus")
 	@GetMapping("/updateCourseScheduleToOverStatus")
@@ -366,4 +366,16 @@ public class TaskController extends BaseController {
 	public void updateStudentTeacherAndSubject(){
 	public void updateStudentTeacherAndSubject(){
 		studentService.updateStudentTeacherAndSubject();
 		studentService.updateStudentTeacherAndSubject();
 	}
 	}
+
+	//推送查看今日收入提醒
+	@GetMapping("/todayIncomeRemind")
+	public void todayIncomeRemind(){
+		courseScheduleTeacherSalaryService.todayIncomeRemind();
+	}
+
+	//大雅基本工资标记
+	@GetMapping("/salaryMarkNew")
+	public void salaryMarkNew(Date startDay){
+		courseScheduleTeacherSalaryService.salaryMarkNew(startDay);
+	}
 }
 }

+ 5 - 4
mec-web/src/main/java/com/ym/mec/web/controller/TeacherAttendanceController.java

@@ -1,5 +1,6 @@
 package com.ym.mec.web.controller;
 package com.ym.mec.web.controller;
 
 
+import com.ym.mec.biz.dal.enums.UpdateAttendanceEnum;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiOperation;
 
 
@@ -122,8 +123,8 @@ public class TeacherAttendanceController extends BaseController {
     @ApiOperation(value = "同意教师异常考勤申述")
     @ApiOperation(value = "同意教师异常考勤申述")
     @PostMapping("/agreeTeacherAttendanceComplaints")
     @PostMapping("/agreeTeacherAttendanceComplaints")
     @PreAuthorize("@pcs.hasPermissions('teacherAttendance/agreeTeacherAttendanceComplaints')")
     @PreAuthorize("@pcs.hasPermissions('teacherAttendance/agreeTeacherAttendanceComplaints')")
-    public Object agreeTeacherAttendanceComplaints(Integer signInStatus, Integer signOutStatus, long teacherAttendanceId, String content){
-        teacherAttendanceService.agreeTeacherAttendanceComplaints(signInStatus,signOutStatus,teacherAttendanceId,content);
+    public Object agreeTeacherAttendanceComplaints(long teacherAttendanceId, String content){
+        teacherAttendanceService.agreeTeacherAttendanceComplaints(teacherAttendanceId,content);
         return succeed();
         return succeed();
     }
     }
 
 
@@ -138,8 +139,8 @@ public class TeacherAttendanceController extends BaseController {
     @ApiOperation(value = "提交考勤申述")
     @ApiOperation(value = "提交考勤申述")
     @PostMapping("/addComplaints")
     @PostMapping("/addComplaints")
     @PreAuthorize("@pcs.hasPermissions('teacherAttendance/addComplaints')")
     @PreAuthorize("@pcs.hasPermissions('teacherAttendance/addComplaints')")
-    public Object addComplaints(Long courseScheduleId,String content,String url,Integer userId){
-        teacherAttendanceService.addComplaints(courseScheduleId,content,url,userId);
+    public Object addComplaints(Long courseScheduleId,String content,String url,Integer userId, UpdateAttendanceEnum complaintsType){
+        teacherAttendanceService.addComplaints(courseScheduleId,content,url,userId,complaintsType);
         return succeed();
         return succeed();
     }
     }