浏览代码

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
      */
     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.service.SysRoleService;
 import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -40,6 +41,10 @@ public class SysRoleServiceImpl extends BaseServiceImpl<Integer, SysRole>  imple
 	@Override
 	@Transactional(rollbackFor = Exception.class)
 	public void addRole(SysRole sysRole) {
+		SysRole findByName = sysRoleDao.findByRoleName(sysRole.getRoleName());
+		if(findByName != null){
+			throw new BizException("操作失败:角色 {} 已存在",sysRole.getRoleName());
+		}
 		sysRoleDao.insert(sysRole);
 		batchSave(sysRole);
 	}
@@ -47,6 +52,10 @@ public class SysRoleServiceImpl extends BaseServiceImpl<Integer, SysRole>  imple
 	@Override
 	@Transactional(rollbackFor = Exception.class)
 	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());
 		sysRoleDao.update(sysRole);
 		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 sr.* FROM sys_role WHERE role_code_ = #{code} AND sr.del_flag_ = 0
     </select>
+    <select id="findByRoleName" resultMap="SysRole">
+        SELECT * FROM sys_role WHERE role_name_ = #{roleName} AND del_flag_ = 0 LIMIT 1
+    </select>
 </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("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 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.entity.CourseSchedule;
 import com.ym.mec.biz.dal.entity.CourseScheduleTeacherSalary;
-import com.ym.mec.biz.dal.entity.TeacherSalaryModifyLog;
+import com.ym.mec.biz.dal.enums.CourseStatusEnum;
 import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.dal.enums.TeachTypeEnum;
 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);
 
+	/**
+	 * @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
      * @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 统计作业布置数据

+ 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);
 
     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
      * @return
      */
+    @Deprecated
     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);
 
     /**
+     * 获取学员注册比例
+     *
+     * @return
+     */
+    List<StudentRegisterPerDto> queryStudentPer1(String month);
+
+    /**
      * 获取乐团报名信息和学校信息
      *
      * @param musicGroupId
@@ -488,8 +495,16 @@ public interface StudentRegistrationDao extends BaseDAO<Long, StudentRegistratio
     StudentRegistration getByUserIdAndMusicGroupId(@Param("musicGroupId") String musicGroupId, @Param("userId") Integer userId);
 
     List<NoClassMusicStudentDto> queryNoClassMusicStudents(Map<String, Object> params);
+
     int countNoClassMusicStudents(Map<String, Object> params);
 
 
     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
      * @date 2020/1/7
      */
+    @Deprecated
     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.StudentAttendanceStatusEnum;
 import com.ym.mec.biz.dal.enums.TeachTypeEnum;
+import com.ym.mec.biz.dal.enums.UpdateAttendanceEnum;
 import io.swagger.annotations.ApiModelProperty;
 
 import java.util.List;
@@ -83,6 +84,9 @@ public class CourseScheduleDto extends CourseSchedule {
     //申述内容
     private String complaintsContent;
 
+    //申诉考勤的方式  SIGN_IN签到,SIGN_OUT签退,ALL所有
+    private UpdateAttendanceEnum complaintsType;
+
     //申述凭证
     private String url;
 
@@ -93,6 +97,14 @@ public class CourseScheduleDto extends CourseSchedule {
 
     private PracticeGroupType practiceType;
 
+    public UpdateAttendanceEnum getComplaintsType() {
+        return complaintsType;
+    }
+
+    public void setComplaintsType(UpdateAttendanceEnum complaintsType) {
+        this.complaintsType = complaintsType;
+    }
+
     public String getHeadUrl() {
         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;
 
+    //申诉考勤的方式  SIGN_IN签到,SIGN_OUT签退,ALL所有
+    private UpdateAttendanceEnum complaintsType;
+
     private UpdateAttendanceEnum updateAttendanceEnum;
 
     private String operatorName;
@@ -42,6 +45,14 @@ public class TeacherAttendanceComplaintsDto{
 
     private String url;
 
+    public UpdateAttendanceEnum getComplaintsType() {
+        return complaintsType;
+    }
+
+    public void setComplaintsType(UpdateAttendanceEnum complaintsType) {
+        this.complaintsType = complaintsType;
+    }
+
     public String getUrl() {
         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;
 
+import com.ym.mec.biz.dal.dto.TeacherSalaryDeductReasonDto;
 import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.dal.enums.TeachTypeEnum;
 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 java.math.BigDecimal;
+import java.util.List;
 
 /**
  * 对应数据库表(course_schedule_teacher_salary):
@@ -69,6 +71,16 @@ public class CourseScheduleTeacherSalary {
 
 	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() {
 		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 serviceIndex;
 
+	@ApiModelProperty(value = "是否结算课酬")
+	private Boolean isSettlementSalary;
+
+	public Boolean getIsSettlementSalary() {
+		return isSettlementSalary;
+	}
+
+	public void setIsSettlementSalary(Boolean isSettlementSalary) {
+		this.isSettlementSalary = isSettlementSalary;
+	}
+
 	public BigDecimal getOperatingIndex() {
 		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 GroupType groupType;
-	
+
 	/**  */
 	@ApiModelProperty(value = "教师编号",required = false)
 	private Integer teacherId;
-	
+
 	/**  */
 	@ApiModelProperty(value = "乐团编号",required = false)
 	private String musicGroupId;
-	
+
 	/**  */
 	@ApiModelProperty(value = "班级编号",required = false)
 	private Integer classGroupId;
-	
+
 	/**  */
 	@ApiModelProperty(value = "课程计划编号",required = false)
 	private Long courseScheduleId;
@@ -38,11 +38,11 @@ public class TeacherAttendance {
 	/**  */
 	@ApiModelProperty(value = "实际教室编号",required = false)
 	private Long currentScheduleId;
-	
+
 	/** 签到时间 */
 	@ApiModelProperty(value = "签到时间",required = false)
 	private java.util.Date signInTime;
-	
+
 	@ApiModelProperty(value = "状态(0:签到,1:签退)",required = false)
 	private Integer status;
 
@@ -57,11 +57,11 @@ public class TeacherAttendance {
 
 	@ApiModelProperty(value = "当前课次")
 	private Integer currentClassTimes;
-	
+
 	/** 备注 */
 	@ApiModelProperty(value = "备注",required = false)
 	private String remark;
-	
+
 	/**  */
 	private java.util.Date createTime;
 
@@ -81,9 +81,12 @@ public class TeacherAttendance {
 	//申述状态0拒绝1通过2待处理3已撤销
 	private ComplaintsStatusEnum complaintsStatus;
 
-	//申述状态0拒绝1通过2待处理3已撤销
+	//修复考勤方式  SIGN_IN签到,SIGN_OUT签退,ALL所有
 	private UpdateAttendanceEnum updateAttendanceEnum;
 
+	//申诉考勤的方式  SIGN_IN签到,SIGN_OUT签退,ALL所有
+	private UpdateAttendanceEnum complaintsType;
+
 	//申述内容
 	private String complaintsContent;
 
@@ -110,6 +113,14 @@ public class TeacherAttendance {
 
 	private String deviceNum;
 
+	public UpdateAttendanceEnum getComplaintsType() {
+		return complaintsType;
+	}
+
+	public void setComplaintsType(UpdateAttendanceEnum complaintsType) {
+		this.complaintsType = complaintsType;
+	}
+
 	public String getDeviceNum() {
 		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 = "线下课是否参与梯度奖励")
 	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() {
 		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","巡查日程提醒"),
     TEACHER_SERVE_PUSH("TEACHER_SERVE_PUSH", "服务指标未完成提醒"),
     MAINTENANCE_NOTICE_PUSH("MAINTENANCE_NOTICE_PUSH", "乐保到期提醒"),
+
+    TEACHER_INCOME_REMIND("TEACHER_INCOME_REMIND", "今日收入"),
     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 = "是否支持额外陪练课授课")
     private Boolean isSupportExtraPracticeLesson;
 
+    @ApiModelProperty(value = "是否结算课酬")
+    private Boolean isSettlementSalary;
+
+    public Boolean getIsSettlementSalary() {
+        return isSettlementSalary;
+    }
+
+    public void setIsSettlementSalary(Boolean isSettlementSalary) {
+        this.isSettlementSalary = isSettlementSalary;
+    }
+
     public Integer getTenantId() {
         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;
 
 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.CourseScheduleTeacherSalaryQueryInfo;
 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.service.BaseService;
+import org.apache.poi.ss.formula.functions.T;
 
 import java.math.BigDecimal;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 
@@ -199,6 +199,14 @@ public interface CourseScheduleTeacherSalaryService extends BaseService<Long, Co
     List<TeacherAttendancesDto> getCourseTeachers(Long courseScheduleId);
 
     /**
+     * @describe 工资奖金标记-新
+     * @author Joburgess
+     * @date 2020/12/25 0025
+     * @return void
+     */
+    void salaryMarkNew(Date startDay);
+
+    /**
      * @describe 工资奖金标记
      * @author Joburgess
      * @date 2020/12/25 0025
@@ -215,4 +223,73 @@ public interface CourseScheduleTeacherSalaryService extends BaseService<Long, Co
      * @return void
      */
     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,
 			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 消息发送者

+ 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 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
 	 */
-	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.JSONObject;
+import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.*;
@@ -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.CourseScheduleTeacherSalaryQueryInfo;
 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.common.constant.CommonConstants;
 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 org.apache.commons.lang3.StringUtils;
+import org.apache.poi.ss.formula.functions.T;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.data.redis.core.RedisTemplate;
@@ -31,6 +35,11 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
 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.stream.Collectors;
 
@@ -264,7 +273,6 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                 trail = false;
             }
 
-
             //如果上课日期在试用期内按80%结算
             if(trail){
                 expectSalary = expectSalary.multiply(new BigDecimal("0.8"));
@@ -503,7 +511,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
             return;
         }
 
-        SysConfig sysConfig = sysConfigService.findByParamName(SysConfigService.ATTENDANCE_RANGE_VIP);
+        SysConfig sysConfig = sysConfigService.findByParamName(SysConfigService.ATTENDANCE_RANGE);
         double attendanceRange = 0;
         if(Objects.nonNull(sysConfig)){
             attendanceRange = Double.valueOf(sysConfig.getParanValue());
@@ -774,7 +782,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                     //早退
                     deductCost = deductCost.add(teacherSalary.abs());
                     deductReasons.add("早退扣除全部课酬");
-                }else if((signOutCourseTimeBetween<=3&&signOutCourseTimeBetween>0)||signOutCourseTimeBetween<=3600){
+                }else if((signOutCourseTimeBetween<=3&&signOutCourseTimeBetween>0)||signOutCourseTimeBetween>=3600){
                     //异常签退,扣除50元
                     deductCost = deductCost.add(new BigDecimal(50));
                     deductReasons.add("异常签退,扣除50元");
@@ -1409,6 +1417,54 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
     }
 
     @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)
     public void salaryMark() {
         Date now = new Date();
@@ -1497,4 +1553,738 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
         }
         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.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);
@@ -467,6 +467,7 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 			params.put("sunday",sunDayDate.toString());
 			params.put("jobNature", JobNatureEnum.FULL_TIME);
 			params.put("unDone",1);
+			params.put("reminded",0);
 			int serveErrTeacherNum = studentExtracurricularExercisesSituationDao.countTeacherServeInfo(params);
 			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("jobNature", JobNatureEnum.FULL_TIME);
 			params.put("unDone",1);
+			params.put("reminded",0);
 			List<Map<Integer, Integer>> teacherServeErrorMapList = indexBaseMonthDataDao.countOrganTeacherServeInfo(params);
 			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);
+			MusicGroup musicGroup = musicGroupDao.get(calender.getMusicGroupId());
 			if(calender.getPaymentType() == ADD_STUDENT || calender.getPaymentType() == SPAN_GROUP_CLASS_ADJUST){
 				// 所有缴费项目已完成排课才能创建下一个缴费项目
 				List<String> batchNoList = new ArrayList<>();
 				batchNoList.add(batchNo);
 				String orignBatchNo = musicGroupPaymentStudentCourseDetailDao.getUnUseBatchNoWithStudentAndCourseTypeAndCourseMinutes(calender.getMusicGroupId(), null, null,batchNoList);
 				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> noPaymentUserIds = musicGroupPaymentCalenderDetailDao.queryNoPaymentUserIds(calender.getMusicGroupId(),userIds);
 				if(noPaymentUserIds.size() > 0){
-					throw new BizException("操作失败:有欠费的学员不允许创建缴费");
+					throw new BizException("{} 有欠费的学员不允许创建缴费",musicGroup.getName());
 				}
 				//获取缴费状态在审核中或者已拒绝的缴费项目的学员
 				String studentIds = musicGroupPaymentCalenderDao.queryCalenderStudentIds(calender.getMusicGroupId(),batchNo);
 				if(StringUtils.isNotEmpty(studentIds)){
 					for (Integer integer : userIds) {
 						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());
 				if(count == 0){
-					MusicGroup musicGroup = musicGroupDao.get(calender.getMusicGroupId());
 					musicGroup.setStatus(MusicGroupStatusEnum.APPLY);
 					musicGroup.setUpdateTime(date);
 					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 {
             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(), ""));
@@ -2788,6 +2782,30 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         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
     @Transactional(rollbackFor = Exception.class)
     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
     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

+ 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 {
 				if (debugMode == true
 						|| 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;
 				} else {
 					status = SendStatusEnum.FAILED;
@@ -365,6 +365,69 @@ public class SysMessageServiceImpl extends BaseServiceImpl<Long, SysMessage> imp
 
 	@Override
 	@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,
 			String url, String group,String jpushType) {
 		if (StringUtils.isBlank(receiver)) {
@@ -377,7 +440,7 @@ public class SysMessageServiceImpl extends BaseServiceImpl<Long, SysMessage> imp
 		if (triggerTime == null || date.after(triggerTime)) {
 			status = SendStatusEnum.SENDING;
 			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;
 				} else {
 					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
 	@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);
 		CourseSchedule courseSchedule = courseScheduleDao.get(courseScheduleId);
 		if(courseSchedule == null){
@@ -751,6 +751,9 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 		}else if(teacherAttendance.getComplaintsStatus() != null && teacherAttendance.getComplaintsStatus() != REPEAL){
             throw new BizException("请勿重复提交考勤申述");
         }
+		if(teacherAttendance.getSignInStatus() == YesOrNoEnum.YES && teacherAttendance.getSignOutStatus() == YesOrNoEnum.YES){
+			throw new BizException("考勤正常,无需提交申诉");
+		}
 		Teacher teacher = teacherDao.get(userId);
 		Date date = new Date();
 		if(teacher.getJobNature() == PART_TIME){
@@ -767,6 +770,10 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 				throw new BizException("超出可申述时间");
 			}
 		}
+		if(complaintsType == null){
+			complaintsType = UpdateAttendanceEnum.ALL;
+		}
+		teacherAttendance.setComplaintsType(complaintsType);
 		teacherAttendance.setIsComplaints(1);
 		teacherAttendance.setComplaintsStatus(ComplaintsStatusEnum.WAIT);
 		teacherAttendance.setComplaintsContent(content);
@@ -811,23 +818,18 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 
 	@Override
 	@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);
 		if(teacherAttendance == null){
 			throw new BizException("考勤信息不存在");
 		}
+		UpdateAttendanceEnum complaintsType = teacherAttendance.getComplaintsType();
 		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("同意异常考勤申述");
 			CourseSchedule courseSchedule = courseScheduleDao.get(teacherAttendance.getCourseScheduleId());
 			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){
 					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.setSignInStatus(YesOrNoEnum.YES);
 			}
-			if(signOutStatus != null && teacherAttendance.getSignOutStatus() != YesOrNoEnum.YES){
+			if(complaintsType != UpdateAttendanceEnum.SIGN_IN && teacherAttendance.getSignOutStatus() != YesOrNoEnum.YES){
 				if(teacherAttendance.getSignOutTime() != null){
 					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();
-			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 cg.id_ FROM music_group mg
         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
         SELECT cg.id_ FROM vip_group vg
         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
         SELECT cg.id_ FROM practice_group pg
         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>
 </mapper>

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

@@ -73,6 +73,7 @@
         <result column="is_complaints_" property="isComplaints"/>
         <result column="complaints_status_" property="complaintsStatus"/>
         <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="dispose_content_" property="disposeContent"/>
         <result column="seal_class_id_" property="sealClassId"/>
@@ -736,6 +737,7 @@
                ta.sign_in_time_,
                ta.complaints_status_,
                ta.complaints_content_,
+               ta.complaints_type_,
                ta.url_,
                ta.dispose_content_,
                cs.teach_mode_
@@ -3750,5 +3752,61 @@
         GROUP BY music_group_id_
     </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>

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

@@ -31,6 +31,7 @@
 		<result column="reduce_salary" property="reduceSalary" />
 		<result column="confirm_status_" property="confirmStatus" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
 		<result column="memo_" property="memo" />
+		<result column="deduction_reason_" property="deductionReason"/>
 		<result column="belong_to_daya_" property="belongToDaya" />
 	</resultMap>
 	
@@ -292,13 +293,15 @@
 		    cs.schoole_id_,
 			csts.*
 		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
 		<if test="startDate != null">
 			AND cs.class_date_ BETWEEN #{startDate} AND #{endDate}
 		</if>
+		AND tea.is_settlement_salary_ = 1
 		AND cs.group_type_ = 'VIP' AND vg.organ_id_ != 41
 		AND csts.settlement_time_ IS NULL
 		AND (cs.del_flag_ IS NULL OR cs.del_flag_=0)
@@ -323,12 +326,14 @@
 		cs.schoole_id_,
 		csts.*
 		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
 		<if test="startDate != null">
 			AND cs.class_date_ BETWEEN #{startDate} AND #{endDate}
 		</if>
+		AND tea.is_settlement_salary_ = 1
 		AND cs.type_ = 'PRACTICE'
 		AND csts.settlement_time_ IS NULL
 		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_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
-		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
 		<foreach collection="courseScheduleIds" item="courseScheduleId" open="(" close=")" separator=",">
 			#{courseScheduleId}
 		</foreach>
+		AND tea.is_settlement_salary_=1
 		AND csts.settlement_time_ IS NULL
 	</select>
 
@@ -707,6 +714,7 @@
 		LEFT JOIN organization mgo ON mgo.id_ = mg.organ_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
+		AND t.is_settlement_salary_ = 1
 		<if test="courseTypeList != null">
 			and cs.type_ in (#{courseTypeList})
 		</if>
@@ -747,6 +755,7 @@
 		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
 		AND cs.group_type_ = 'VIP' AND ts.settlement_time_ IS NOT NULL
+		AND t.is_settlement_salary_ = 1
 		<if test="courseTypeList != null">
 			and cs.type_ in (#{courseTypeList})
 		</if>
@@ -786,6 +795,7 @@
 		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_
 		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">
 			and cs.type_ in (#{courseTypeList})
 		</if>
@@ -842,6 +852,7 @@
 			(cs.del_flag_ IS NULL OR cs.del_flag_=0)
             AND csts.group_type_!='COMM'
 			AND csts.settlement_time_ IS NOT NULL
+			AND t.is_settlement_salary_ = 1
 			<if test="teacherId!=null">
 				AND csts.user_id_=#{teacherId}
 			</if>
@@ -1063,7 +1074,8 @@
 
 	<select id="getIsSalaryWithDate" resultMap="CourseScheduleTeacherSalary">
 		SELECT
-			csts.*
+			csts.*,
+			CONCAT(cs.class_date_,' ',cs.start_class_time_) start_class_time_
 		FROM
 			course_schedule_teacher_salary csts
 			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 csts.settlement_time_ IS NOT NULL
 	</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>

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

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

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

@@ -713,6 +713,12 @@
             </if>
     </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 co.name_,su.real_name_ linkman_
         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="depreciationPrice" column="depreciation_price_"/>
         <result property="salePrice" column="sale_price_"/>
-        <result property="mobileNo" column="phone_"/>
     </resultMap>
 
     <!-- 根据主键查询一条记录 -->
@@ -261,7 +260,7 @@
 
     <!-- 获取问卷分页数据 -->
     <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
         LEFT JOIN replacement_instrument ri ON ri.id_ = ria.instruments_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!=''">
 				AND sees.monday_ BETWEEN #{monday} AND #{sunday}
 			</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">
 				AND sees.teacher_id_ = #{teacherId}
 			</if>

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

@@ -627,6 +627,13 @@
         <result property="per" column="per_"/>
         <result property="perNum" column="per_num_"/>
     </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 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
@@ -964,4 +971,8 @@
             </foreach>
         </if>
     </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>

+ 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_out_longitude_latitude_" property="signOutLongitudeLatitude"/>
         <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="complaints_status_" property="complaintsStatus" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
         <result column="complaints_content_" property="complaintsContent"/>
@@ -150,6 +151,9 @@
             <if test="isComplaints != null">
                 is_complaints_ = #{isComplaints},
             </if>
+            <if test="complaintsType != null">
+                complaints_type_ = #{complaintsType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+            </if>
             <if test="complaintsStatus != null">
                 complaints_status_ = #{complaintsStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
             </if>
@@ -535,6 +539,7 @@
         <result property="signOutStatus" column="sign_out_status_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
         <result property="teacherName" column="teacher_name_"/>
         <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="signInTime" column="sign_in_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_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_
-        ,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
         LEFT JOIN sys_user su ON ta.teacher_id_ = su.id_
         LEFT JOIN teacher t ON t.id_ = su.id_
@@ -649,7 +655,11 @@
     </update>
     <update id="clearAttendanceComplaints">
         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
         <foreach collection="courseScheduleIds" item="courseScheduleId" open="(" close=")" separator=",">
             #{courseScheduleId}
@@ -657,7 +667,11 @@
     </update>
     <update id="clearAttendanceComplaint">
         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}
     </update>
 

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

@@ -55,6 +55,7 @@
         <result column="im_token_" property="imToken"/>
         <result column="subject_name_" property="splitSubjectName"/>
         <result column="id_card_no_" property="idCardNo"/>
+        <result column="is_settlement_salary_" property="isSettlementSalary"/>
     </resultMap>
     
     <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_,
         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.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
         LEFT JOIN sys_user su ON t.id_ = su.id_
         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"
             keyProperty="id">
         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 id="addSysUser" parameterType="com.ym.mec.auth.api.entity.SysUser" useGeneratedKeys="true" keyColumn="id"
@@ -220,6 +222,9 @@
             <if test="idcardHandImg != null">
                 idcard_hand_img_ = #{idcardHandImg},
             </if>
+            <if test="isSettlementSalary != null">
+                is_settlement_salary_ = #{isSettlementSalary},
+            </if>
         </set>
         WHERE id_ = #{id}
     </update>
@@ -293,7 +298,7 @@
     <!-- 分页查询 -->
     <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_,
-        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
         LEFT JOIN sys_user su ON t.id_ = su.id_
         LEFT JOIN `subject` s ON FIND_IN_SET(s.id_,t.subject_id_)
@@ -336,6 +341,9 @@
                     #{item}
                 </foreach>
             </if>
+            <if test="isSettlementSalary!=null">
+                AND t.is_settlement_salary_ = #{isSettlementSalary}
+            </if>
             <if test="search != null">
                 AND (su.real_name_ LIKE CONCAT('%',#{search},'%') OR su.phone_ LIKE CONCAT('%',#{search},'%') OR t.id_ = #{search})
             </if>
@@ -804,7 +812,7 @@
     <select id="findByFlowOrganRangeTeachers" resultMap="TeacherBasicDto">
         SELECT su.id_,su.username_,su.real_name_,t.organ_id_ FROM teacher t
         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 != ''">
             AND (INTE_ARRAY(#{organId},t.flow_organ_range_) OR FIND_IN_SET(t.organ_id_,#{organId}))
         </if>
@@ -821,7 +829,7 @@
     <select id="findTeacherByOrganId" resultMap="TeacherBasicDto">
         SELECT su.id_,su.username_,su.real_name_ FROM teacher t
         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">
             AND (FIND_IN_SET(t.organ_id_,#{organId}) OR INTE_ARRAY(t.flow_organ_range_,#{organId}))
         </if>
@@ -842,7 +850,7 @@
     <select id="searchTeachers" resultMap="TeacherBasicDto">
         SELECT su.id_,su.username_,su.real_name_ FROM teacher t
         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">
             AND FIND_IN_SET(t.organ_id_,#{organId})
         </if>
@@ -853,7 +861,7 @@
     <select id="countTeacherName" resultType="java.lang.Integer">
         SELECT COUNT(su.id_) FROM teacher t
         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"/>
     </select>
     <sql id="queryPageNameSql">
@@ -877,7 +885,7 @@
         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 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"/>
         GROUP BY su.id_
         <include refid="global.limit"/>
@@ -943,7 +951,7 @@
         <if test="search != null and search != ''">
             AND (su.real_name_ LIKE CONCAT('%',#{search},'%') OR su.username_ LIKE CONCAT('%',#{search},'%'))
         </if>
-        AND su.del_flag_ = 0
+        AND su.del_flag_ = 0 AND su.lock_flag_=0
         GROUP BY su.id_
     </select>
     <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="onlineClassJoinGradientRewards" column="online_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>
 	
 	<!-- 根据主键查询一条记录 -->
@@ -50,66 +52,71 @@
 		SELECT SEQ_WSDEFINITION_ID.nextval AS ID FROM DUAL 
 		</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>
 	
 	<!-- 根据主键查询一条记录 -->
 	<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">
-			salary_readonly_flag_ = #{salaryReadonlyFlag},
+				salary_readonly_flag_ = #{salaryReadonlyFlag},
 			</if>
 			<if test="organId != null">
-			organ_id_ = #{organId},
+				organ_id_ = #{organId},
 			</if>
 			<if test="id != null">
-			id_ = #{id},
+				id_ = #{id},
 			</if>
 			<if test="giveClassPaySalaryFlag != null">
-			give_class_pay_salary_flag_ = #{giveClassPaySalaryFlag},
+				give_class_pay_salary_flag_ = #{giveClassPaySalaryFlag},
 			</if>
 			<if test="coursesEndTime != null">
-			courses_end_time_ = #{coursesEndTime},
+				courses_end_time_ = #{coursesEndTime},
 			</if>
 			<if test="attribute1 != null">
-			attribute1_ = #{attribute1},
+				attribute1_ = #{attribute1},
 			</if>
 			<if test="endTime != null">
-			end_time_ = #{endTime},
+				end_time_ = #{endTime},
 			</if>
 			<if test="attribute2 != null">
-			attribute2_ = #{attribute2},
+				attribute2_ = #{attribute2},
 			</if>
 			<if test="name != null">
-			name_ = #{name},
+				name_ = #{name},
 			</if>
 			<if test="startTime != null">
-			start_time_ = #{startTime},
+				start_time_ = #{startTime},
 			</if>
 			<if test="attribute3 != null">
-			attribute3_ = #{attribute3},
+				attribute3_ = #{attribute3},
 			</if>
 			<if test="createTime != null">
-			create_time_ = #{createTime},
+				create_time_ = #{createTime},
 			</if>
 			<if test="vipGroupCategoryIdList != null">
-			vip_group_category_id_list_ = #{vipGroupCategoryIdList},
+				vip_group_category_id_list_ = #{vipGroupCategoryIdList},
 			</if>
 			<if test="description != null">
-			description_ = #{description},
+				description_ = #{description},
 			</if>
 			<if test="salarySettlementJson != null">
-			salary_settlement_json_ = #{salarySettlementJson},
+				salary_settlement_json_ = #{salarySettlementJson},
 			</if>
 			<if test="coursesStartTime != null">
-			courses_start_time_ = #{coursesStartTime},
+				courses_start_time_ = #{coursesStartTime},
 			</if>
 			<if test="type != null">
-			type_ = #{type},
+				type_ = #{type},
 			</if>
 			<if test="delFlag != null">
-			del_flag_ = #{delFlag},
+				del_flag_ = #{delFlag},
 			</if>
 			<if test="paymentReadonlyFlag != null">
 				payment_readonly_flag_ = #{paymentReadonlyFlag},
@@ -120,8 +127,14 @@
 			<if test="offlineClassJoinGradientRewards!=null">
 				offline_class_join_gradient_rewards_=#{offlineClassJoinGradientRewards},
 			</if>
+			<if test="minCourseNum!=null">
+				min_course_num_=#{minCourseNum},
+			</if>
+			<if test="maxCourseNum!=null">
+				max_course_num_=#{maxCourseNum},
+			</if>
 			update_time_ = NOW(),
-			</set> WHERE id_ = #{id}
+		</set>WHERE id_ = #{id}
 	</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.task.fallback.TaskRemoteServiceFallback;
 
+import java.util.Date;
+
 @FeignClient(name = "web-server", contextId = "TaskRemoteService", configuration = { FeignConfiguration.class }, fallback = TaskRemoteServiceFallback.class)
 public interface TaskRemoteService {
 
@@ -177,4 +179,12 @@ public interface TaskRemoteService {
 	//更新学员指导老师和声部信息
 	@GetMapping("task/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 java.util.Date;
+
 @Component
 public class TaskRemoteServiceFallback implements TaskRemoteService {
 
@@ -220,4 +222,14 @@ public class TaskRemoteServiceFallback implements TaskRemoteService {
 	public void updateStudentTeacherAndSubject() {
 		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));
     }
 
+    @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 = "置换支付")
     @PostMapping("/pay")
     @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.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.TeacherIncomeQueryInfo;
 import com.ym.mec.biz.service.CourseScheduleTeacherSalaryService;
 import com.ym.mec.biz.service.TeacherCourseRewardService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.util.date.DateUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.time.LocalDate;
+
 /**
  * @Author Joburgess
  * @Date 2020/4/15
@@ -76,4 +82,39 @@ public class CourseScheduleTeacherSalaryController extends BaseController {
         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.enums.MessageTypeEnum;
 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.service.ClassGroupService;
 import com.ym.mec.biz.service.StudentAttendanceService;
@@ -116,12 +117,12 @@ public class TeacherAttendanceController extends BaseController {
 
     @ApiOperation(value = "提交考勤申述")
     @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();
         if(Objects.isNull(user)){
             throw new BizException("请登录");
         }
-        teacherAttendanceService.addComplaints(courseScheduleId,content,url,user.getId());
+        teacherAttendanceService.addComplaints(courseScheduleId,content,url,user.getId(),complaintsType);
         return succeed();
     }
 

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

@@ -14,7 +14,7 @@ public interface MessageSenderPlugin {
 	 * @return 是否发送成功
 	 * @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 是否发送成功
 	 * @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 是否发送成功
 	 * @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);
 
-		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 是否发送成功
 	 * @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);
 
-		return messageSenderPlugin.batchSend(subject, content, receivers, url, jpushType);
+		return messageSenderPlugin.batchSend(subject, content, receivers, url, jpushType,sound,channelId);
 	}
 
 	@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
-	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 {
 			Map<String, Object> reqParams = new HashMap<String, Object>();
 			reqParams.put("SpCode", appId);
@@ -92,7 +92,7 @@ public class AwSmsPlugin implements MessageSenderPlugin, InitializingBean {
 	}
 
 	@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("");
 		for (int i = 0; i < receivers.length - 1; i++) {
 			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 org.apache.commons.codec.binary.Base64;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.InitializingBean;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
@@ -14,6 +15,7 @@ import org.springframework.stereotype.Service;
 import java.io.IOException;
 import java.util.Arrays;
 import java.util.HashMap;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 /**
@@ -58,7 +60,7 @@ public class JiguangPushPlugin implements MessageSenderPlugin, InitializingBean
 	 * @param content 消息内容
 	 * @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();
 		JSONArray platform = new JSONArray();// 平台
 		platform.add("android");
@@ -74,6 +76,16 @@ public class JiguangPushPlugin implements MessageSenderPlugin, InitializingBean
 		JSONObject notification = new JSONObject();// 通知内容
 		JSONObject android = new JSONObject();// android通知内容
 		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);
 		JSONObject android_extras = new JSONObject();// android额外参数
 		android_extras.put("type", "infomation");
@@ -83,7 +95,7 @@ public class JiguangPushPlugin implements MessageSenderPlugin, InitializingBean
 
 		JSONObject ios = new JSONObject();// ios通知内容
 		ios.put("alert", alert);
-		ios.put("sound", "default");
+		ios.put("sound", sound);
 		ios.put("badge", "+1");
 		JSONObject ios_extras = new JSONObject();// ios额外参数
 		ios_extras.put("type", "infomation");
@@ -96,9 +108,8 @@ public class JiguangPushPlugin implements MessageSenderPlugin, InitializingBean
 		JSONObject message = new JSONObject();// 通知消息内容
 		message.put("title", alert);
 		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("apns_production", this.apns_production);
 
@@ -117,7 +128,7 @@ public class JiguangPushPlugin implements MessageSenderPlugin, InitializingBean
 	 * @param alert 推送消息
 	 * @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 = "";
 		switch (type){
 			case "STUDENT":
@@ -131,7 +142,7 @@ public class JiguangPushPlugin implements MessageSenderPlugin, InitializingBean
 				break;
 		}
 		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
-	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 result = this.push(alias, subject, content, url,type);
+		String result = this.push(alias, subject, content, url,type,sound,channelId);
 		JSONObject json = JSONObject.parseObject(result);
 		if (json.containsKey("error")) {
 			JSONObject jsonObject = json.getJSONObject("error");
@@ -189,8 +200,8 @@ public class JiguangPushPlugin implements MessageSenderPlugin, InitializingBean
 	}
 
 	@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);
 		if (json.containsKey("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
-	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>();
 		reqParams.put("username", username);
 		reqParams.put("pwd", pwd);
@@ -58,7 +58,7 @@ public class MOxintongSMSPlugin implements MessageSenderPlugin, InitializingBean
 	}
 
 	@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();
 		for (int i = 0; i < receivers.length - 1; i++) {
 			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
-	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 {
 			Map<String, Object> reqParams = new HashMap<String, Object>();
 			reqParams.put("account", account);
@@ -93,7 +93,7 @@ public class ShiyuanSMSPlugin implements MessageSenderPlugin, InitializingBean {
 	}
 
 	@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("");
 		for (int i = 0; i < receivers.length - 1; i++) {
 			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
-	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");
 		JSONObject json = JSONObject.parseObject(result);
 		if ("SUCCESS".equals(json.get("code"))) {
@@ -70,7 +70,7 @@ public class YimeiSmsPlugin implements MessageSenderPlugin, InitializingBean {
 	}
 
 	@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 result = getParam(subject, content, join, host + "/simpleinter/sendSMS");
 		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() {
 		courseScheduleTeacherSalaryService.teacherSalarySettlement();
 		redisCache.getRedisTemplate().opsForSet().add(CourseScheduleTeacherSalaryService.TASK_KEY, "VIP");
-		courseScheduleTeacherSalaryService.salaryMark();
+//		courseScheduleTeacherSalaryService.salaryMark();
 	}
 
 	@GetMapping("/practiceTeacherSalarySettlement")
@@ -151,7 +151,7 @@ public class TaskController extends BaseController {
 	public void practiceTeacherSalarySettlement() {
 		courseScheduleTeacherSalaryService.practiceTeacherSalarySettlement();
 		redisCache.getRedisTemplate().opsForSet().add(CourseScheduleTeacherSalaryService.TASK_KEY, "PRACTICE");
-		courseScheduleTeacherSalaryService.salaryMark();
+//		courseScheduleTeacherSalaryService.salaryMark();
 	}
 
 	// 乐团课课酬结算
@@ -159,7 +159,7 @@ public class TaskController extends BaseController {
 	public void musicGroupTeacherSalarySettlement() {
 		courseScheduleTeacherSalaryService.musicGroupTeacherSalarySettlement();
 		redisCache.getRedisTemplate().opsForSet().add(CourseScheduleTeacherSalaryService.TASK_KEY, "MUSIC");
-		courseScheduleTeacherSalaryService.salaryMark();
+//		courseScheduleTeacherSalaryService.salaryMark();
 	}
 
 	@GetMapping("/updateCourseScheduleToOverStatus")
@@ -366,4 +366,16 @@ public class TaskController extends BaseController {
 	public void 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;
 
+import com.ym.mec.biz.dal.enums.UpdateAttendanceEnum;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 
@@ -122,8 +123,8 @@ public class TeacherAttendanceController extends BaseController {
     @ApiOperation(value = "同意教师异常考勤申述")
     @PostMapping("/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();
     }
 
@@ -138,8 +139,8 @@ public class TeacherAttendanceController extends BaseController {
     @ApiOperation(value = "提交考勤申述")
     @PostMapping("/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();
     }