Joburgess před 5 roky
rodič
revize
23e95cce80

+ 32 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentAttendanceDto.java

@@ -0,0 +1,32 @@
+package com.ym.mec.biz.dal.dto;
+
+import com.ym.mec.biz.dal.entity.StudentAttendance;
+
+import java.util.List;
+
+/**
+ * @Author Joburgess
+ * @Date 2019/11/25
+ */
+public class StudentAttendanceDto {
+
+    private String signInLongitudeLatitude;
+
+    private List<StudentAttendance> studentAttendances;
+
+    public String getSignInLongitudeLatitude() {
+        return signInLongitudeLatitude;
+    }
+
+    public void setSignInLongitudeLatitude(String signInLongitudeLatitude) {
+        this.signInLongitudeLatitude = signInLongitudeLatitude;
+    }
+
+    public List<StudentAttendance> getStudentAttendances() {
+        return studentAttendances;
+    }
+
+    public void setStudentAttendances(List<StudentAttendance> studentAttendances) {
+        this.studentAttendances = studentAttendances;
+    }
+}

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

@@ -33,6 +33,16 @@ public class VipGroupCourseSchduleRecordDto {
     
     private String schoolName;
 
+    private Integer schooleId;
+
+    public Integer getSchooleId() {
+        return schooleId;
+    }
+
+    public void setSchooleId(Integer schooleId) {
+        this.schooleId = schooleId;
+    }
+
     public Integer getAttendanceNum() {
         return attendanceNum;
     }

+ 20 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TeacherAttendance.java

@@ -61,6 +61,26 @@ public class TeacherAttendance {
 	/**  */
 	private java.util.Date createTime;
 
+	private String signInLongitudeLatitude;
+
+	private String signOutLongitudeLatitude;
+
+	public String getSignInLongitudeLatitude() {
+		return signInLongitudeLatitude;
+	}
+
+	public void setSignInLongitudeLatitude(String signInLongitudeLatitude) {
+		this.signInLongitudeLatitude = signInLongitudeLatitude;
+	}
+
+	public String getSignOutLongitudeLatitude() {
+		return signOutLongitudeLatitude;
+	}
+
+	public void setSignOutLongitudeLatitude(String signOutLongitudeLatitude) {
+		this.signOutLongitudeLatitude = signOutLongitudeLatitude;
+	}
+
 	public TeacherAttendance() {
 	}
 

+ 2 - 3
mec-biz/src/main/java/com/ym/mec/biz/service/StudentAttendanceService.java

@@ -1,16 +1,15 @@
 package com.ym.mec.biz.service;
 
 import com.ym.mec.biz.dal.dto.CourseScheduleResponse;
+import com.ym.mec.biz.dal.dto.StudentAttendanceDto;
 import com.ym.mec.biz.dal.dto.StudentPersonalAttendanceDto;
 import com.ym.mec.biz.dal.entity.StudentAttendance;
-import com.ym.mec.biz.dal.enums.SignStatusEnum;
 import com.ym.mec.biz.dal.enums.StudentAttendanceStatusEnum;
 import com.ym.mec.biz.dal.page.CourseHomeworkQueryInfo;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.page.QueryInfo;
 import com.ym.mec.common.service.BaseService;
 
-import java.util.List;
 import java.util.Map;
 
 public interface StudentAttendanceService extends BaseService<Long, StudentAttendance> {
@@ -20,7 +19,7 @@ public interface StudentAttendanceService extends BaseService<Long, StudentAtten
 	 * @Date: 2019/9/11
 	 * 批量插入学生上课签到信息
 	 */
-	void addStudentAttendances(List<StudentAttendance> studentAttendances);
+	void addStudentAttendances(StudentAttendanceDto studentAttendanceInfo);
 
 	/**
 	 * @describe 获取当前课程的学生

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

@@ -58,9 +58,9 @@ public class CourseHomeworkServiceImpl extends BaseServiceImpl<Long, CourseHomew
 					.collect(Collectors.toList());
 			List<Map<Integer, Integer>> courseTimeByClassGroup = teacherAttendanceDao.findCourseTimeByCourseSchedules(courseScheduleIds);
 			Map<Integer, Integer> map = MapUtil.convertIntegerMap(courseTimeByClassGroup);
-			dataList.forEach(teacherHomeworkListDto -> {
-				teacherHomeworkListDto.setCurrentClassTimes(map.get(teacherHomeworkListDto.getCourseScheduleId().longValue()));
-			});
+//			dataList.forEach(teacherHomeworkListDto -> {
+//				teacherHomeworkListDto.setCurrentClassTimes(map.get(teacherHomeworkListDto.getCourseScheduleId().longValue()));
+//			});
 //			List<Integer> courseScheduleIds = dataList.stream().map(TeacherHomeworkListDto::getCourseScheduleId).collect(Collectors.toList());
 //			if (!CollectionUtils.isEmpty(courseScheduleIds)) {
 //				Map<Integer, Integer> courseScheduleCurrentTimes = courseScheduleService.findCourseScheduleCurrentTimes(courseScheduleIds);

+ 5 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java

@@ -142,7 +142,11 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 		if(Objects.isNull(teacherCourseByDateSpeed)){
 			return YesOrNoEnum.NO;
 		}else{
-			if(Objects.nonNull(teacherCourseByDateSpeed.getSignInTime())&&checkSchool&&schoolId.equals(teacherCourseByDateSpeed.getSchoolId().intValue())){
+			if(checkSchool
+					&&Objects.nonNull(teacherCourseByDateSpeed.getSignInTime())
+					&&Objects.nonNull(schoolId)
+					&&Objects.nonNull(teacherCourseByDateSpeed.getSchoolId())
+					&&schoolId.equals(teacherCourseByDateSpeed.getSchoolId().intValue())){
 				return YesOrNoEnum.YES;
 			}else{
 				return YesOrNoEnum.NO;

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

@@ -66,7 +66,8 @@ public class StudentAttendanceServiceImpl extends BaseServiceImpl<Long, StudentA
 
 	@Override
 	@Transactional(rollbackFor = Exception.class)
-	public void addStudentAttendances(List<StudentAttendance> studentAttendances) {
+	public void addStudentAttendances(StudentAttendanceDto studentAttendanceInfos) {
+		List<StudentAttendance> studentAttendances=studentAttendanceInfos.getStudentAttendances();
 		SysUser sysUser = sysUserFeignService.queryUserInfo();
 		if(Objects.isNull(sysUser)){
 			throw new BizException("请登录");
@@ -135,7 +136,9 @@ public class StudentAttendanceServiceImpl extends BaseServiceImpl<Long, StudentA
 		courseScheduleDao.update(courseSchedule);
 
 		TeacherSignOutDto teacherSignOutDto=new TeacherSignOutDto();
-		teacherSignOutDto.setTeacherAttendanceInfo(new TeacherAttendance(courseSchedule.getId(),0));
+		TeacherAttendance teacherAttendance = new TeacherAttendance(courseSchedule.getId(), 0);
+		teacherAttendance.setSignInLongitudeLatitude(studentAttendanceInfos.getSignInLongitudeLatitude());
+		teacherSignOutDto.setTeacherAttendanceInfo(teacherAttendance);
 		teacherAttendanceService.addTeacherAttendanceRecord(teacherSignOutDto);
 	}
 

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

@@ -53,6 +53,8 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 	private ClassGroupDao classGroupDao;
 	@Autowired
 	private SubjectDao subjectDao;
+	@Autowired
+	private SchoolDao schoolDao;
 
 	@Autowired
 	private RedisCache<String,Object> redisCache;
@@ -78,6 +80,10 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 
 		TeacherAttendance teacherAttendance=teacherAttendanceDao.findByTeacherAttendanceInfo(user.getId().longValue(),teacherSignOutDto.getTeacherAttendanceInfo().getCourseScheduleId());
 
+		if(StringUtils.isBlank(teacherSignOutDto.getTeacherAttendanceInfo().getSignInLongitudeLatitude())){
+			throw new BizException("未获取到您的位置");
+		}
+
 		Date date = new Date();
 		if(Objects.isNull(teacherAttendance)){
 			teacherAttendance=teacherSignOutDto.getTeacherAttendanceInfo();
@@ -102,6 +108,30 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 		if(courseSchedule == null){
 			throw new BizException("课程信息不存在");
 		}
+
+		Date tomorrow = DateUtil.addDays1(date, 1);
+
+		if(tomorrow.before(courseSchedule.getStartClassTime())){
+			throw new BizException("明天的课程不能进行签到");
+		}
+
+		School school = schoolDao.get(courseSchedule.getSchoolId());
+
+		//是否在范围内
+		boolean isInScore = true;
+		if(StringUtils.isBlank(school.getLongitudeLatitude())){
+			school.setLongitudeLatitude(teacherSignOutDto.getTeacherAttendanceInfo().getSignInLongitudeLatitude());
+			schoolDao.update(school);
+		}else{
+			SysConfig sysConfig = sysConfigService.findByParamName(SysConfigService.ATTENDANCE_RANGE);
+			double attendanceRange = Double.valueOf(sysConfig.getParanValue());
+			double distance = MapUtil.distance(teacherSignOutDto.getTeacherAttendanceInfo().getSignInLongitudeLatitude(),
+					school.getLongitudeLatitude());
+			if(distance>attendanceRange){
+				isInScore=false;
+			}
+		}
+
 		String classDate = DateUtil.format(courseSchedule.getClassDate(), DateUtil.DEFAULT_PATTERN);
 		String startClassTime = DateUtil.format(courseSchedule.getStartClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
 		String endClassTime = DateUtil.format(courseSchedule.getEndClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
@@ -110,10 +140,9 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 		Date classEndDateTime = DateUtil.stringToDate(classDate + " " + endClassTime, DateUtil.EXPANDED_DATE_TIME_FORMAT);
 		Date classEndDateAdd60Minutes = DateUtil.addMinutes(classEndDateTime, 60);
 		Date add20Minutes = DateUtil.addMinutes(classStartDateTime, advanceSignMinutes * -1);
-		Date add60Minutes = DateUtil.addMinutes(classStartDateTime, -60);
 		if(teacherAttendance.getSignInTime() == null && teacherSignOutDto.getTeacherAttendanceInfo().getStatus().equals(SignStatusEnum.SIGN_IN.getCode())){
 			teacherAttendance.setCurrentClassTimes(courseScheduleDao.countCurrentTimes(teacherAttendance.getClassGroupId(),courseSchedule.getStartClassTime()) + 1);
-
+			teacherAttendance.setSignInLongitudeLatitude(teacherSignOutDto.getTeacherAttendanceInfo().getSignInLongitudeLatitude());
 			if (currentCourseDetail.getEndClassTime().before(date)){
 				throw new BizException("该课程已结束,不能进行签到!");
 			}
@@ -127,8 +156,11 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 			result.put("signInStatus",0);
 			if(yesOrNoEnum == YesOrNoEnum.YES){
 				//连堂课
-			}else if(DateUtil.minutesBetween(add60Minutes,date) >= 0 && DateUtil.minutesBetween(date,add20Minutes) >= 0){
+			}else if(DateUtil.minutesBetween(date,add20Minutes) >= 0){
 				//正常签到范围(开始前60分钟  ~  开始之前20分钟)
+				if(!isInScore){
+					teacherAttendance.setSignInStatus(YesOrNoEnum.NO);
+				}
 			}else if(DateUtil.minutesBetween(add20Minutes,date) > 0){
 				if(StringUtils.isEmpty(teacherAttendance.getRemark())){
 					//当前为异常签到,请填写原因!

+ 1 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java

@@ -1407,6 +1407,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 		//更新vip课
 		vipGroupApplyBaseInfo.setUpdateTime(now);
 		vipGroupDao.update(vipGroupApplyBaseInfo);
+
 	}
 
 	@Override

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

@@ -284,7 +284,8 @@
             s.address_,
             s.longitude_latitude_,
             su.username_ teacher_name_,
-            ta.sign_in_time_
+            ta.sign_in_time_,
+            cs.schoole_id_
         FROM
             course_schedule cs
             LEFT JOIN class_group cg ON cs.class_group_id_=cg.id_

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

@@ -20,6 +20,8 @@
         <result column="remark_" property="remark"/>
         <result column="create_time_" property="createTime"/>
         <result column="current_class_times_" property="currentClassTimes"/>
+        <result column="sign_in_longitude_latitude_" property="signInLongitudeLatitude"/>
+        <result column="sign_out_longitude_latitude_" property="signOutLongitudeLatitude"/>
     </resultMap>
     
     <resultMap type="com.ym.mec.biz.dal.dto.Mapper" id="Mapper">
@@ -47,17 +49,17 @@
         </selectKey>
         -->
         INSERT INTO teacher_attendance
-        (id_,group_type_,teacher_id_,music_group_id_,class_group_id_,course_schedule_id_,sign_in_time_,sign_in_status_,remark_,create_time_,sign_out_time_,sign_out_status_,current_class_times_)
-        VALUES(#{id},#{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{teacherId},#{musicGroupId},#{classGroupId},#{courseScheduleId},#{signInTime},#{signInStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{remark},now(),#{signOutTime},#{signOutStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{currentClassTimes})
+        (id_,group_type_,teacher_id_,music_group_id_,class_group_id_,course_schedule_id_,sign_in_time_,sign_in_status_,remark_,create_time_,sign_out_time_,sign_out_status_,current_class_times_,sign_in_longitude_latitude_,sign_out_longitude_latitude_)
+        VALUES(#{id},#{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{teacherId},#{musicGroupId},#{classGroupId},#{courseScheduleId},#{signInTime},#{signInStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{remark},now(),#{signOutTime},#{signOutStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{currentClassTimes},#{signInLongitudeLatitude},#{signOutLongitudeLatitude})
     </insert>
 
     <insert id="batchInsert" parameterType="com.ym.mec.biz.dal.entity.TeacherAttendance" useGeneratedKeys="true"
             keyColumn="id" keyProperty="id">
         INSERT INTO teacher_attendance
-        (group_type_,teacher_id_,music_group_id_,class_group_id_,course_schedule_id_,sign_in_time_,sign_in_status_,remark_,create_time_,sign_out_time_,sign_out_status_)
+        (group_type_,teacher_id_,music_group_id_,class_group_id_,course_schedule_id_,sign_in_time_,sign_in_status_,remark_,create_time_,sign_out_time_,sign_out_status_,sign_in_longitude_latitude_,sign_out_longitude_latitude_)
         VALUE
         <foreach collection="teacherAttendances" item="teacherAttendance" separator=",">
-            (#{teacherAttendance.groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{teacherAttendance.teacherId},#{teacherAttendance.musicGroupId},#{teacherAttendance.classGroupId},#{teacherAttendance.courseScheduleId},#{teacherAttendance.signInTime},#{teacherAttendance.signInStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{teacherAttendance.remark},now(),#{teacherAttendance.signOutTime},#{teacherAttendance.signOutStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler})
+            (#{teacherAttendance.groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{teacherAttendance.teacherId},#{teacherAttendance.musicGroupId},#{teacherAttendance.classGroupId},#{teacherAttendance.courseScheduleId},#{teacherAttendance.signInTime},#{teacherAttendance.signInStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{teacherAttendance.remark},now(),#{teacherAttendance.signOutTime},#{teacherAttendance.signOutStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{teacherAttendance.signInLongitudeLatitude},#{teacherAttendance.signOutLongitudeLatitude})
         </foreach>
     </insert>
 

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

@@ -545,6 +545,7 @@
         <result column="is_salary_" property="isSalary" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
         <result column="student_num_" property="attendanceNum"/>
         <result column="school_name_" property="schoolName"/>
+        <result column="schoole_id_" property="schooleId"/>
     </resultMap>
 
     <sql id="teachingRecordQueryCondition">
@@ -569,7 +570,8 @@
             cs.status_,
             cs.teach_mode_,
             cs.student_num_,s.name_ school_name_,
-            csts.actual_salary_ IS NOT NULL is_salary_
+            csts.actual_salary_ IS NOT NULL is_salary_,
+            cs.schoole_id_
         FROM
             course_schedule cs
             LEFT JOIN course_schedule_teacher_salary csts ON cs.id_=csts.course_schedule_id_

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

@@ -1,11 +1,9 @@
 package com.ym.mec.teacher.controller;
 
+import com.ym.mec.biz.dal.dto.StudentAttendanceDto;
 import com.ym.mec.biz.dal.dto.TeacherSignOutDto;
-import com.ym.mec.biz.dal.entity.StudentAttendance;
 import com.ym.mec.biz.dal.page.TeacherAttendanceQueryInfo;
 import com.ym.mec.biz.service.ClassGroupService;
-import com.ym.mec.biz.dal.page.TeacherCloseQueryInfo;
-import com.ym.mec.biz.service.ClassGroupService;
 import com.ym.mec.biz.service.StudentAttendanceService;
 import com.ym.mec.biz.service.TeacherAttendanceService;
 import com.ym.mec.common.controller.BaseController;
@@ -14,8 +12,6 @@ import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
-import java.util.List;
-
 @RequestMapping("teacherAttendance")
 @Api(tags = "教师签到服务")
 @RestController
@@ -50,8 +46,8 @@ public class TeacherAttendanceController extends BaseController {
 
     @ApiOperation(value = "点名")
     @PostMapping("/addStudentAttendances")
-    public Object addStudentAttendances(@RequestBody List<StudentAttendance> studentAttendances){
-        studentAttendanceService.addStudentAttendances(studentAttendances);
+    public Object addStudentAttendances(@RequestBody StudentAttendanceDto studentAttendanceInfo){
+        studentAttendanceService.addStudentAttendances(studentAttendanceInfo);
         return succeed();
     }
 }

+ 62 - 0
mec-util/src/main/java/com/ym/mec/util/collection/MapUtil.java

@@ -18,6 +18,11 @@ public class MapUtil {
 	private static final Object[] EMPTY_ARRAY = {};
 
 	/**
+	 * 地球半径,单位:公里/千米
+	 */
+	private static final double EARTH_RADIUS = 6378.137;
+
+	/**
 	* 将一个bean转换成map
 	* @param map
 	* @param bean
@@ -134,4 +139,61 @@ public class MapUtil {
 		});
 		return result;
 	}
+
+	/**
+	 * 经纬度转化成弧度
+	 * @param d
+	 *         经度/纬度
+	 * @return 经纬度转化成的弧度
+	 */
+	private static double radian(double d) {
+		return d * Math.PI / 180.0;
+	}
+
+	/**
+	 * 返回两个地理坐标之间的距离
+	 * @param firsLongitude
+	 *         第一个坐标的经度
+	 * @param firstLatitude
+	 *         第一个坐标的纬度
+	 * @param secondLongitude
+	 *         第二个坐标的经度
+	 * @param secondLatitude
+	 *         第二个坐标的纬度
+	 * @return 两个坐标之间的距离,单位:公里/千米
+	 */
+	public static double distance(double firsLongitude, double firstLatitude,
+								  double secondLongitude, double secondLatitude) {
+		double firstRadianLongitude = radian(firsLongitude);
+		double firstRadianLatitude = radian(firstLatitude);
+		double secondRadianLongitude = radian(secondLongitude);
+		double secondRadianLatitude = radian(secondLatitude);
+
+		double a = firstRadianLatitude - secondRadianLatitude;
+		double b = firstRadianLongitude - secondRadianLongitude;
+		double cal = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2)
+				+ Math.cos(firstRadianLatitude) * Math.cos(secondRadianLatitude)
+				* Math.pow(Math.sin(b / 2), 2)));
+		cal = cal * EARTH_RADIUS;
+
+		return Math.round(cal * 10000d) / 10000d * 1000;
+	}
+
+	/**
+	 * 返回两个地理坐标之间的距离
+	 * @param firstPoint
+	 *         第一个坐标 例如:"23.100919, 113.279868"
+	 * @param secondPoint
+	 *         第二个坐标 例如:"23.149286, 113.347584"
+	 * @return 两个坐标之间的距离,单位:公里/千米
+	 */
+	public static double distance(String firstPoint, String secondPoint) {
+		String[] firstArray = firstPoint.split(",");
+		String[] secondArray = secondPoint.split(",");
+		double firstLatitude = Double.valueOf(firstArray[0].trim());
+		double firstLongitude = Double.valueOf(firstArray[1].trim());
+		double secondLatitude = Double.valueOf(secondArray[0].trim());
+		double secondLongitude = Double.valueOf(secondArray[1].trim());
+		return distance(firstLatitude, firstLongitude, secondLatitude, secondLongitude);
+	}
 }