Просмотр исходного кода

Merge remote-tracking branch 'origin/master'

周箭河 4 лет назад
Родитель
Сommit
45f0aa0a82

+ 36 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentAttendanceQueryInfo.java

@@ -2,6 +2,9 @@ package com.ym.mec.biz.dal.page;
 
 import io.swagger.annotations.ApiModelProperty;
 
+import java.util.Date;
+
+import com.ym.mec.biz.dal.enums.CourseStatusEnum;
 import com.ym.mec.biz.dal.enums.StudentAttendanceStatusEnum;
 import com.ym.mec.common.page.QueryInfo;
 
@@ -34,9 +37,18 @@ public class StudentAttendanceQueryInfo extends QueryInfo {
 
     @ApiModelProperty(value = "状态(正常、旷课、请假、休学)",required = false)
     private StudentAttendanceStatusEnum status;
+    
+    @ApiModelProperty(value = "课程状态")
+    private CourseStatusEnum courseStatus;
 
     @ApiModelProperty(value = "过滤状态")
     private StudentAttendanceStatusEnum filterStatus;
+    
+    @ApiModelProperty(value = "课程开始时间")
+    private Date startDateOfCourse;
+    
+    @ApiModelProperty(value = "课程结束时间")
+    private Date endDateOfCourse;
 
     public Long getCourseScheduleId() {
         return courseScheduleId;
@@ -109,4 +121,28 @@ public class StudentAttendanceQueryInfo extends QueryInfo {
     public void setStatus(StudentAttendanceStatusEnum status) {
         this.status = status;
     }
+
+	public CourseStatusEnum getCourseStatus() {
+		return courseStatus;
+	}
+
+	public void setCourseStatus(CourseStatusEnum courseStatus) {
+		this.courseStatus = courseStatus;
+	}
+
+	public Date getStartDateOfCourse() {
+		return startDateOfCourse;
+	}
+
+	public void setStartDateOfCourse(Date startDateOfCourse) {
+		this.startDateOfCourse = startDateOfCourse;
+	}
+
+	public Date getEndDateOfCourse() {
+		return endDateOfCourse;
+	}
+
+	public void setEndDateOfCourse(Date endDateOfCourse) {
+		this.endDateOfCourse = endDateOfCourse;
+	}
 }

+ 83 - 29
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java

@@ -232,12 +232,12 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
             }else if(YesOrNoEnum.NO.equals(teacherAttendance.getSignInStatus())){
                 //异常签到
                 int signCourseTimeBetweenSeconds = DateUtil.secondsBetween(teacherAttendance.getSignInTime(), courseScheduleTeacherSalary.getCourseSchedule().getStartClassTime());
-                int signCourseTimeBetween = signCourseTimeBetweenSeconds/60;
-                if(signCourseTimeBetween<1&&signCourseTimeBetween>-3){
+                float signCourseTimeBetween = (float)signCourseTimeBetweenSeconds/(float)60;
+                if(signCourseTimeBetween<=1&&signCourseTimeBetween>-3){
                     //课程开始前1分钟至开始后3分钟进入教室
-                    deductCost = deductCost.add(new BigDecimal(50));
-                    deductReasons.add("课程开始前1分钟至开始后3分钟进入教室扣除50元");
-                }else if(signCourseTimeBetween<-3){
+                    deductCost = deductCost.add(courseScheduleTeacherSalary.getExpectSalary().divide(new BigDecimal(2)));
+                    deductReasons.add("课程开始前1分钟至开始后3分钟进入教室扣除一半课酬");
+                }else if(signCourseTimeBetween<=-3){
                     //课程开始后3分钟后进入教室
                     deductCost = deductCost.add(courseScheduleTeacherSalary.getExpectSalary());
                     deductReasons.add("课程开始后3分钟进入教室扣除全部课酬");
@@ -250,20 +250,17 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                 deductReasons.add("未签退扣除一半课酬");
             }else if(YesOrNoEnum.NO.equals(teacherAttendance.getSignOutStatus())){
                 //异常签退
-                int signCourseTimeBetweenSeconds = DateUtil.secondsBetween(teacherAttendance.getSignOutTime(), courseScheduleTeacherSalary.getCourseSchedule().getStartClassTime());
-                float signCourseTimeBetween = (float)signCourseTimeBetweenSeconds/(float)60;
-
                 int signOutCourseTimeBetweenSeconds = DateUtil.secondsBetween(teacherAttendance.getSignOutTime(), courseScheduleTeacherSalary.getCourseSchedule().getEndClassTime());
                 float signOutCourseTimeBetween = (float)signOutCourseTimeBetweenSeconds/(float)60;
 
-                if(signCourseTimeBetween<=20&&signOutCourseTimeBetween>3){
+                if(signOutCourseTimeBetween>3){
                     //课程开始前20分钟至开始后3分钟退出教室
                     deductCost = deductCost.add(courseScheduleTeacherSalary.getExpectSalary());
-                    deductReasons.add("课程开始前20分钟至开始后3分钟退出教室扣除全部课酬");
+                    deductReasons.add("课程结束前3分钟之前退出教室扣除全部课酬");
                 }else if(signOutCourseTimeBetween<=3&&signOutCourseTimeBetween>0){
                     //课程结束前3分钟后至课程结束前退出教室
-                    deductCost = deductCost.add(new BigDecimal(50));
-                    deductReasons.add("课程结束前3分钟后至课程结束前退出教室扣除50元");
+                    deductCost = deductCost.add(courseScheduleTeacherSalary.getExpectSalary().divide(new BigDecimal(2)));
+                    deductReasons.add("课程结束前3分钟后至课程结束前退出教室扣除一半课酬");
                 }
             }
 
@@ -274,7 +271,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                 courseScheduleTeacherSalary.setDeductionReason(StringUtils.join(deductReasons, ";"));
             }
 
-            courseScheduleTeacherSalary.setActualSalary(finalSalary);
+            courseScheduleTeacherSalary.setActualSalary(finalSalary.compareTo(BigDecimal.ZERO)<0?BigDecimal.ZERO:finalSalary);
             courseScheduleTeacherSalary.setSettlementTime(now);
             courseScheduleTeacherSalaryDao.update(courseScheduleTeacherSalary);
         });
@@ -348,8 +345,8 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                 float signCourseTimeBetween = (float)signCourseTimeBetweenSeconds/(float)60;
                 if(signCourseTimeBetween<=1&&signCourseTimeBetween>-3){
                     //课程开始前1分钟至开始后3分钟进入教室
-                    deductCost = deductCost.add(new BigDecimal(50));
-                    deductReasons.add("课程开始前1分钟至开始后3分钟进入教室扣除50元");
+                    deductCost = deductCost.add(courseScheduleTeacherSalary.getExpectSalary().divide(new BigDecimal(2)));
+                    deductReasons.add("课程开始前1分钟至开始后3分钟进入教室扣除一半课酬");
                 }else if(signCourseTimeBetween<=-3){
                     //课程开始后3分钟后进入教室
                     deductCost = deductCost.add(courseScheduleTeacherSalary.getExpectSalary());
@@ -369,20 +366,17 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                 deductReasons.add("未签退扣除一半课酬");
             }else if(YesOrNoEnum.NO.equals(teacherAttendance.getSignOutStatus())){
                 //异常签退
-                int signCourseTimeBetweenSeconds = DateUtil.secondsBetween(teacherAttendance.getSignOutTime(), courseScheduleTeacherSalary.getCourseSchedule().getStartClassTime());
-                float signCourseTimeBetween = (float)signCourseTimeBetweenSeconds/(float)60;
-
                 int signOutCourseTimeBetweenSeconds = DateUtil.secondsBetween(teacherAttendance.getSignOutTime(), courseScheduleTeacherSalary.getCourseSchedule().getEndClassTime());
                 float signOutCourseTimeBetween = (float)signOutCourseTimeBetweenSeconds/(float)60;
 
-                if(signCourseTimeBetween<=20&&signOutCourseTimeBetween>3){
+                if(signOutCourseTimeBetween>3){
                     //课程开始前20分钟至开始后3分钟退出教室
                     deductCost = deductCost.add(courseScheduleTeacherSalary.getExpectSalary());
-                    deductReasons.add("课程开始前20分钟至开始后3分钟退出教室扣除全部课酬");
+                    deductReasons.add("课程结束前3分钟之前退出教室扣除全部课酬");
                 }else if(signOutCourseTimeBetween<=3&&signOutCourseTimeBetween>0){
                     //课程结束前3分钟后至课程结束前退出教室
-                    deductCost = deductCost.add(new BigDecimal(50));
-                    deductReasons.add("课程结束前3分钟后至课程结束前退出教室扣除50元");
+                    deductCost = deductCost.add(courseScheduleTeacherSalary.getExpectSalary().divide(new BigDecimal(2)));
+                    deductReasons.add("课程结束前3分钟后至课程结束前退出教室扣除一半课酬");
                 }
 
                 if(TeachModeEnum.OFFLINE.equals(courseScheduleTeacherSalary.getCourseSchedule().getTeachMode())){
@@ -399,7 +393,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
 
             BigDecimal finalSalary = courseScheduleTeacherSalary.getExpectSalary().subtract(deductCost).setScale(BigDecimal.ZERO.intValue(), BigDecimal.ROUND_HALF_UP);
 
-            courseScheduleTeacherSalary.setActualSalary(finalSalary);
+            courseScheduleTeacherSalary.setActualSalary(finalSalary.compareTo(BigDecimal.ZERO)<0?BigDecimal.ZERO:finalSalary);
             courseScheduleTeacherSalary.setSettlementTime(now);
             courseScheduleTeacherSalaryDao.update(courseScheduleTeacherSalary);
         });
@@ -464,15 +458,15 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                         || CourseSchedule.CourseScheduleType.HIGH.equals(c.getType()))
                 .map(CourseSchedule::getId).collect(Collectors.toList());
 
-        List<StudentAttendance> studentAttendances = null;
+        List<CourseScheduleStudentPayment> studentAttendances = null;
         if(!CollectionUtils.isEmpty(needStudentAttendanceCourseScheduleIds)){
-            studentAttendances = studentAttendanceDao.findByCourseIds(needStudentAttendanceCourseScheduleIds);
+            studentAttendances = courseScheduleStudentPaymentDao.findByCourseScheduleIds(needStudentAttendanceCourseScheduleIds);
         }
         Map<Long, Long> courseNormalStudentsMap = new HashMap<>();
         if(!CollectionUtils.isEmpty(studentAttendances)){
             courseNormalStudentsMap =studentAttendances.stream()
 //                    .filter(studentAttendance -> StudentAttendanceStatusEnum.NORMAL.equals(studentAttendance.getStatus()))
-                    .collect(Collectors.groupingBy(StudentAttendance::getCourseScheduleId, Collectors.counting()));
+                    .collect(Collectors.groupingBy(CourseScheduleStudentPayment::getCourseScheduleId, Collectors.counting()));
         }
 
         //课程对应乐团结算方式集合
@@ -522,6 +516,66 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                 if(Objects.isNull(teacherSalary)){
                     teacherSalary = BigDecimal.ZERO;
                 }
+
+                //扣除费用
+                BigDecimal deductCost = new BigDecimal(0);
+                List<String> deductReasons = new ArrayList<>();
+                deductReasons.add("课程应到人数:" + normalStudentNum);
+                List<TeacherAttendance> courseTeacherAttendances = teacherCourseAttendanceMap.get(org.apache.commons.lang3.StringUtils.joinWith(":", courseScheduleTeacherSalary.getCourseScheduleId(), courseScheduleTeacherSalary.getUserId()));
+
+                TeacherAttendance teacherAttendance = courseTeacherAttendances.get(0);
+                if(CollectionUtils.isEmpty(courseTeacherAttendances)||Objects.isNull(teacherAttendance.getSignInStatus())){
+                    //未签到扣除全部课酬
+                    deductCost = deductCost.add(teacherSalary);
+                    deductReasons.add("未签到扣除全部课酬");
+                }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)));
+                        deductReasons.add("课程开始前1分钟至开始后3分钟进入教室扣除一半课酬");
+                    }else if(signCourseTimeBetween<=-3){
+                        //课程开始后3分钟后进入教室
+                        deductCost = deductCost.add(teacherSalary);
+                        deductReasons.add("课程开始后3分钟进入教室扣除全部课酬");
+                    }
+                }
+
+                if(CollectionUtils.isEmpty(courseTeacherAttendances)||Objects.isNull(teacherAttendance.getSignOutStatus())){
+                    //未签退扣除一半课酬
+                    deductCost = deductCost.add(teacherSalary.divide(new BigDecimal(2)));
+                    deductReasons.add("未签退扣除一半课酬");
+                }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);
+                        deductReasons.add("课程结束前3分钟之前退出教室扣除全部课酬");
+                    }else if(signOutCourseTimeBetween<=3&&signOutCourseTimeBetween>0){
+                        //课程结束前3分钟后至课程结束前退出教室
+                        deductCost = deductCost.add(teacherSalary.divide(new BigDecimal(2)));
+                        deductReasons.add("课程结束前3分钟后至课程结束前退出教室扣除一半课酬");
+                    }
+                }
+
+                BigDecimal finalSalary = teacherSalary.subtract(deductCost).setScale(BigDecimal.ZERO.intValue(), BigDecimal.ROUND_HALF_UP);
+
+                if(BigDecimal.ZERO.compareTo(deductCost)<0){
+                    deductReasons.add("扣除总费用:" + deductCost);
+                }
+                courseScheduleTeacherSalary.setDeductionReason(org.apache.commons.lang3.StringUtils.join(deductReasons, ";"));
+
+                //更新教师结算信息
+                courseScheduleTeacherSalary.setActualSalary(finalSalary.compareTo(BigDecimal.ZERO)<0?BigDecimal.ZERO:finalSalary);
+                courseScheduleTeacherSalary.setSettlementTime(now);
+                courseScheduleTeacherSalaryDao.update(courseScheduleTeacherSalary);
+
+                continue;
             }else if(CourseSchedule.CourseScheduleType.HIGH.equals(courseSchedule.getType())){
                 //根据课程类型获取对应的默认课酬设置列表
                 List<TeacherDefaultMusicGroupSalary> teacherDefaultMusicGroupSalariesWithCourseType = teacherDefaultMusicGroupSalariesGroupByCourseType.get(courseSchedule.getType());
@@ -611,11 +665,11 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
             }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){
+                if(signCourseTimeBetween>0&&signCourseTimeBetween<=20){
                     //未提前20分钟打卡扣除50元
                     deductCost = deductCost.add(new BigDecimal(50));
                     deductReasons.add("未提前20分钟打卡扣除50元");
-                }else if(signCourseTimeBetween<0&&signCourseTimeBetween>-30){
+                }else if(signCourseTimeBetween<=0&&signCourseTimeBetween>-30){
                     //迟到30分钟内扣除一半课酬
                     deductCost = deductCost.add(teacherSalary.divide(new BigDecimal(2)));
                     deductReasons.add("迟到30分钟内扣除一半课酬");
@@ -642,7 +696,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                     //早退
                     deductCost = deductCost.add(teacherSalary);
                     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元");

+ 43 - 18
mec-biz/src/main/resources/config/mybatis/StudentAttendanceMapper.xml

@@ -31,6 +31,7 @@
         <result column="teacher_name_" property="courseSchedule.teacherName"/>
         <result column="teach_mode_" property="courseSchedule.teachMode"/>
         <result column="course_type_" property="courseSchedule.type"/>
+        <result column="course_status_" property="courseSchedule.status"/>
         <result column="current_schedule_id_" property="courseSchedule.id"/>
         <result column="course_schedule_name_" property="courseSchedule.name"/>
         <result column="class_date_" property="courseSchedule.classDate"/>
@@ -483,66 +484,90 @@
     </select>
     
     <select id="findStudentAttendance" resultMap="StudentAttendance">
-        SELECT sa.*,su.username_,su.phone_,su.avatar_,cs.teach_mode_,cs.type_ course_type_,o.name_ organ_name_,tu.real_name_ teacher_name_,cs.name_ course_schedule_name_,
-        cs.class_date_ ,cs.start_class_time_,cs.end_class_time_ 
-        FROM student_attendance sa
-        LEFT JOIN sys_user su ON sa.user_id_ = su.id_
-        left join course_schedule cs on cs.id_ = sa.course_schedule_id_
+        SELECT cssp.course_schedule_id_,cssp.user_id_,cssp.group_type_,cssp.music_group_id_,sa.sign_in_time_,sa.sign_out_time_,sa.status_,
+        su.username_,su.phone_,su.avatar_,cs.teach_mode_,cs.type_ course_type_,o.name_ organ_name_,tu.real_name_ teacher_name_,cs.name_ course_schedule_name_,cs.status_ course_status_,
+        cs.actual_teacher_id_ teacher_id_,cs.class_date_ ,cs.start_class_time_,cs.end_class_time_ 
+        FROM course_schedule_student_payment cssp left join course_schedule cs on cs.id_ = cssp.course_schedule_id_
+        left join student_attendance sa on cssp.course_schedule_id_ = sa.course_schedule_id_
+        LEFT JOIN sys_user su ON cssp.user_id_ = su.id_
         left join sys_user tu on tu.id_ = cs.actual_teacher_id_
         left join organization o on o.id_ = cs.organ_id_
         <where>
         	<if test="courseScheduleId != null">
-        		sa.course_schedule_id_ = #{courseScheduleId}
+        		cssp.course_schedule_id_ = #{courseScheduleId}
         	</if>
         	<if test="search != null">
-        		sa.course_schedule_id_ = #{search}
+        		cssp.course_schedule_id_ = #{search}
         	</if>
         	<if test="studentID != null">
-        		and sa.user_id_ = #{studentID}
+        		and cssp.user_id_ = #{studentID}
+        	</if>
+        	<if test="startDateOfCourse != null">
+        		and cs.class_date_ &gt;= #{startDateOfCourse}
+        	</if>
+        	<if test="endDateOfCourse != null">
+        		and cs.class_date_ &lt;= #{endDateOfCourse}
         	</if>
         	<if test="courseScheduleType != null">
         		and cs.type_ = #{courseScheduleType}
         	</if>
         	<if test="teacherId != null">
-        		and sa.teacher_id_ = #{teacherId}
+        		and cs.actual_teacher_id_.teacher_id_ = #{teacherId}
+        	</if>
+        	<if test="courseStatus != null">
+        		and cs.status_ = #{courseStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
         	</if>
         	<if test="status != null">
         		and sa.status_ = #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
         	</if>
         	<if test="groupType != null">
-        		and sa.group_type_ = #{groupType}
+        		and cssp.group_type_ = #{groupType}
         	</if>
         	<if test="musicGroupId != null">
-        		and sa.music_group_id_ = #{musicGroupId}
+        		and cssp.music_group_id_ = #{musicGroupId}
         	</if>
         </where>
-        ORDER BY sa.id_ DESC
+        ORDER BY cs.id_ DESC
         <include refid="global.limit"/>
     </select>
     
     <select id="countStudentAttendance" resultType="java.lang.Integer">
-        SELECT COUNT(sa.id_) FROM student_attendance sa left join course_schedule cs on sa.course_schedule_id_ = cs.id_
+        SELECT count(cssp.id_) 
+        FROM course_schedule_student_payment cssp left join course_schedule cs on cs.id_ = cssp.course_schedule_id_
+        left join student_attendance sa on cssp.course_schedule_id_ = sa.course_schedule_id_
         <where>
         	<if test="courseScheduleId != null">
-        		sa.course_schedule_id_ = #{courseScheduleId}
+        		cssp.course_schedule_id_ = #{courseScheduleId}
+        	</if>
+        	<if test="search != null">
+        		cssp.course_schedule_id_ = #{search}
         	</if>
         	<if test="studentID != null">
-        		and sa.user_id_ = #{studentID}
+        		and cssp.user_id_ = #{studentID}
+        	</if>
+        	<if test="startDateOfCourse != null">
+        		and cs.class_date_ &gt;= #{startDateOfCourse}
+        	</if>
+        	<if test="endDateOfCourse != null">
+        		and cs.class_date_ &lt;= #{endDateOfCourse}
         	</if>
         	<if test="courseScheduleType != null">
         		and cs.type_ = #{courseScheduleType}
         	</if>
         	<if test="teacherId != null">
-        		and sa.teacher_id_ = #{teacherId}
+        		and cs.actual_teacher_id_.teacher_id_ = #{teacherId}
+        	</if>
+        	<if test="courseStatus != null">
+        		and cs.status_ = #{courseStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
         	</if>
         	<if test="status != null">
         		and sa.status_ = #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
         	</if>
         	<if test="groupType != null">
-        		and sa.group_type_ = #{groupType}
+        		and cssp.group_type_ = #{groupType}
         	</if>
         	<if test="musicGroupId != null">
-        		and sa.music_group_id_ = #{musicGroupId}
+        		and cssp.music_group_id_ = #{musicGroupId}
         	</if>
         </where>
     </select>