Kaynağa Gözat

Merge branch 'master' into adapay_delay_1231

周箭河 4 yıl önce
ebeveyn
işleme
830c14e619

+ 2 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/DegreeRegistrationService.java

@@ -22,6 +22,8 @@ public interface DegreeRegistrationService extends BaseService<Integer, DegreeRe
 
     HttpResponseResult pay(DegreeRegistrationActivityDto degreeRegistration) throws Exception;
 
+    HttpResponseResult theoryPay(DegreeRegistrationActivityDto degreeRegistration) throws Exception;
+
     Boolean updateStatus(StudentPaymentOrder order);
 
     PageInfoDegree<DegreeRegistration> getPageList(DegreeQueryInfo queryInfo);

+ 31 - 26
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java

@@ -256,7 +256,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                 int signOutCourseTimeBetweenSeconds = DateUtil.secondsBetween(teacherAttendance.getSignOutTime(), courseScheduleTeacherSalary.getCourseSchedule().getEndClassTime());
                 int signOutCourseTimeBetween = signOutCourseTimeBetweenSeconds/60;
 
-                if(signCourseTimeBetween<20&&signCourseTimeBetween>-3){
+                if(signCourseTimeBetween<=20&&signOutCourseTimeBetween>3){
                     //课程开始前20分钟至开始后3分钟退出教室
                     deductCost = deductCost.add(courseScheduleTeacherSalary.getExpectSalary());
                     deductReasons.add("课程开始前20分钟至开始后3分钟退出教室扣除全部课酬");
@@ -375,7 +375,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                 int signOutCourseTimeBetweenSeconds = DateUtil.secondsBetween(teacherAttendance.getSignOutTime(), courseScheduleTeacherSalary.getCourseSchedule().getEndClassTime());
                 int signOutCourseTimeBetween = signOutCourseTimeBetweenSeconds/60;
 
-                if(signCourseTimeBetween<=20&&signCourseTimeBetween>-3){
+                if(signCourseTimeBetween<=20&&signOutCourseTimeBetween>3){
                     //课程开始前20分钟至开始后3分钟退出教室
                     deductCost = deductCost.add(courseScheduleTeacherSalary.getExpectSalary());
                     deductReasons.add("课程开始前20分钟至开始后3分钟退出教室扣除全部课酬");
@@ -586,6 +586,24 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                 teacherAttendance = courseTeacherAttendances.get(0);
             }
 
+            School school = idSchoolMap.get(courseSchedule.getSchoolId());
+            boolean signInInRange = false;
+            boolean signOutInRange = false;
+            if(Objects.nonNull(school)&&Objects.nonNull(school.getLongitudeLatitude())
+                    &&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;
+                }
+            }
+
             if(Objects.isNull(teacherAttendance)||Objects.isNull(teacherAttendance.getSignInStatus())){
                 //无签到记录扣除全部课酬
                 deductCost = deductCost.add(teacherSalary);
@@ -606,12 +624,17 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                     deductCost = deductCost.add(teacherSalary);
                     deductReasons.add("迟到30分钟及以上扣除全部课酬");
                 }
+                if(!signInInRange){
+                    //签到经纬度异常扣除50
+                    deductCost = deductCost.add(new BigDecimal(50));
+                    deductReasons.add("签到经纬度异常扣除50");
+                }
             }
 
-            if(Objects.isNull(teacherAttendance)||!isCallName||Objects.isNull(teacherAttendance.getSignOutStatus())){
-                //未签退或者未点名扣除全部课酬
+            if(Objects.isNull(teacherAttendance)||Objects.isNull(teacherAttendance.getSignOutStatus())){
+                //未签退扣除全部课酬
                 deductCost = deductCost.add(teacherSalary);
-                deductReasons.add("未签退或者未点名扣除全部课酬");
+                deductReasons.add("未签退扣除全部课酬");
             }else if(YesOrNoEnum.NO.equals(teacherAttendance.getSignOutStatus())){
                 int signOutCourseTimeBetweenSeconds = DateUtil.secondsBetween(teacherAttendance.getSignOutTime(), courseSchedule.getEndClassTime());
                 int signOutCourseTimeBetween = signOutCourseTimeBetweenSeconds/60;
@@ -619,28 +642,10 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                     //早退
                     deductCost = deductCost.add(teacherSalary);
                     deductReasons.add("早退扣除全部课酬");
-                }else if(isCallName){
-                    //异常签退,但是正常点名扣除50元课酬
+                }else{
+                    //异常签退,扣除50元
                     deductCost = deductCost.add(new BigDecimal(50));
-                    deductReasons.add("异常签退,但是正常点名扣除50元课酬");
-                }
-            }
-
-            School school = idSchoolMap.get(courseSchedule.getSchoolId());
-            boolean signInInRange = false;
-            boolean signOutInRange = false;
-            if(Objects.nonNull(school)&&Objects.nonNull(school.getLongitudeLatitude())
-                    &&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;
+                    deductReasons.add("异常签退,扣除50元");
                 }
             }
 

+ 196 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/DegreeRegistrationServiceImpl.java

@@ -341,6 +341,202 @@ public class DegreeRegistrationServiceImpl extends BaseServiceImpl<Integer, Degr
         return BaseController.succeed(payMap);
     }
 
+
+
+    @Override
+    @Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
+    public HttpResponseResult theoryPay(DegreeRegistrationActivityDto degreeRegistration) throws Exception {
+        studentDao.getLocked(degreeRegistration.getUserId());
+
+        List<DegreeRegistration> userLevelDegrees = degreeRegistrationDao.getUserLevelDegrees(degreeRegistration.getUserId(), ACTIVITY_TAG);
+
+        long endTheoryLevelNum = userLevelDegrees.stream().filter(d -> StringUtils.isNotBlank(d.getTheoryLevel())&&d.getStatus().equals(2)).count();
+        long ingTheoryLevelNum = userLevelDegrees.stream().filter(d -> StringUtils.isNotBlank(d.getTheoryLevel())&&d.getStatus().equals(1)).count();
+
+        if(StringUtils.isNotBlank(degreeRegistration.getTheoryLevel())&&endTheoryLevelNum>0){
+            throw new BizException("您已报考过选择的考级项目");
+        }
+
+        degreeRegistration.setActivityTag(ACTIVITY_TAG);
+
+        Date nowDate = new Date();
+
+        if(ACTIVITY_END_TIME.compareTo(nowDate)<0){
+            throw new BizException("活动已截至");
+        }
+
+        String orderNo = idGeneratorService.generatorId("payment") + "";
+
+        degreeRegistration.setMoney(BigDecimal.ZERO);
+
+        List<String> courseInfos = new ArrayList<>();
+
+        if("免考".equals(degreeRegistration.getTheoryLevel())){
+            degreeRegistration.setTheoryLevel(null);
+        }
+
+        if(StringUtils.isNotBlank(degreeRegistration.getTheoryLevel())){
+            degreeRegistration.setOrderNo(orderNo);
+            BigDecimal theoryMoney = BigDecimal.ZERO;
+            switch (degreeRegistration.getTheoryLevel()) {
+                case "一级":
+                    theoryMoney = new BigDecimal(200);
+                    break;
+                case "二级":
+                    theoryMoney = new BigDecimal(240);
+                    break;
+                case "三级":
+                    theoryMoney = new BigDecimal(280);
+                    break;
+                case "四级":
+                    theoryMoney = new BigDecimal(320);
+                    break;
+                default:
+                    throw new BizException("您选择的乐理级别不存在,请核对");
+            }
+            degreeRegistration.setTheoryMoney(theoryMoney);
+        }else{
+            degreeRegistration.setTheoryMoney(BigDecimal.ZERO);
+        }
+
+        if(Objects.nonNull(degreeRegistration.getSporadicId())||StringUtils.isNotBlank(degreeRegistration.getTheoryLevel())){
+            degreeRegistration.setStatus(1);
+            degreeRegistration.setCreateTime(nowDate);
+            degreeRegistration.setUpdateTime(nowDate);
+            degreeRegistrationDao.insert(degreeRegistration);
+
+            List<DegreeRegistration> updateDegrees = new ArrayList<>();
+            if(ingTheoryLevelNum>0){
+                for (DegreeRegistration userLevelDegree : userLevelDegrees) {
+                    if(Objects.nonNull(userLevelDegree.getSporadicId())&&Objects.nonNull(userLevelDegree.getSporadicId())){
+                        userLevelDegree.setStatus(0);
+                        updateDegrees.add(userLevelDegree);
+                    }
+                    if(Objects.nonNull(userLevelDegree.getTheoryLevel())&&StringUtils.isNotBlank(userLevelDegree.getTheoryLevel())){
+                        userLevelDegree.setStatus(0);
+                        updateDegrees.add(userLevelDegree);
+                    }
+                }
+                if(!CollectionUtils.isEmpty(updateDegrees)){
+                    degreeRegistrationDao.batchUpdate(updateDegrees);
+                }
+            }
+        }
+
+        BigDecimal additionCoursePrice = new BigDecimal("0");
+        if(Objects.nonNull(degreeRegistration.getAdditionCourseInfo())){
+            Map<CourseSchedule.CourseScheduleType, Integer> additionCourseInfo = degreeRegistration.getAdditionCourseInfo();
+            PracticeGroupSellPrice practiceGroupSellPrice = practiceGroupSellPriceDao.get(degreeRegistration.getOrganId());
+            if(Objects.isNull(practiceGroupSellPrice)){
+                throw new BizException("该分部暂未参与此活动");
+            }
+
+            BigDecimal practiceUnitPrice = practiceGroupSellPrice.getOnceOriginalPrice(),
+                    vipUnitPrice = practiceGroupSellPrice.getVipOneStudentTwelveCourseOriginalPriceWithNewUser(),
+                    highUnitPrice = practiceGroupSellPrice.getHighOnlineTenCourseOriginalPriceWithNewUser();
+
+            for (Map.Entry<CourseSchedule.CourseScheduleType, Integer> courseScheduleTypeIntegerEntry : additionCourseInfo.entrySet()) {
+                BigDecimal courseTime = new BigDecimal(courseScheduleTypeIntegerEntry.getValue());
+                switch (courseScheduleTypeIntegerEntry.getKey()){
+                    case VIP:
+                        BigDecimal vipPrice = vipUnitPrice.multiply(courseTime);
+                        additionCoursePrice = additionCoursePrice.add(vipPrice);
+                        courseInfos.add((courseTime.multiply(new BigDecimal(12)))+"节VIP-1V1课程费用:" + vipPrice);
+                        break;
+                    case PRACTICE:
+                        BigDecimal practicePrice = practiceUnitPrice.multiply(courseTime);
+                        additionCoursePrice = additionCoursePrice.add(practicePrice);
+                        courseInfos.add((courseTime.multiply(new BigDecimal(12)))+"节1V1网管课课程费用:" + practicePrice);
+                        break;
+                    case HIGH:
+                        BigDecimal highPrice = highUnitPrice.multiply(courseTime);
+                        additionCoursePrice = additionCoursePrice.add(highPrice);
+                        courseInfos.add((courseTime.multiply(new BigDecimal(10)))+"节乐理课程费用:" + highPrice);
+                        break;
+                }
+            }
+        }
+
+        BigDecimal amount = degreeRegistration.getMoney();
+        amount = amount.add(degreeRegistration.getTheoryMoney());
+        amount = amount.add(additionCoursePrice);
+
+        if(amount.compareTo(degreeRegistration.getPrice())!=0){
+            throw new BizException("商品价格不符");
+        }
+
+        OrderTypeEnum type = OrderTypeEnum.DEGREE_REGISTRATION;
+
+        Integer userId = degreeRegistration.getUserId();
+        String channelType = "";
+        StudentPaymentOrder studentPaymentOrder = new StudentPaymentOrder();
+        studentPaymentOrder.setUserId(userId);
+        studentPaymentOrder.setGroupType(GroupType.SPORADIC);
+        studentPaymentOrder.setOrderNo(orderNo);
+        studentPaymentOrder.setType(type);
+        studentPaymentOrder.setExpectAmount(amount);
+        studentPaymentOrder.setActualAmount(amount);
+        studentPaymentOrder.setStatus(DealStatusEnum.ING);
+        studentPaymentOrder.setClassGroupId(degreeRegistration.getId());
+        if(Objects.nonNull(degreeRegistration.getSporadicId())){
+            studentPaymentOrder.setMusicGroupId(degreeRegistration.getSporadicId().toString());
+        }
+        studentPaymentOrder.setOrganId(degreeRegistration.getOrganId());
+        studentPaymentOrder.setRoutingOrganId(degreeRegistration.getOrganId());
+        if (StringUtils.isNotBlank(degreeRegistration.getTheoryLevel())) {
+            courseInfos.add("乐理" + degreeRegistration.getTheoryLevel() + ",费用:" + degreeRegistration.getTheoryMoney());
+        }
+        studentPaymentOrder.setMemo(StringUtils.join(courseInfos, ";"));
+        studentPaymentOrderService.insert(studentPaymentOrder);
+        studentPaymentOrder.setVersion(0);
+
+        if(BigDecimal.ZERO.compareTo(additionCoursePrice)<0){
+            StudentPaymentOrderDetail studentPaymentOrderDetail = new StudentPaymentOrderDetail();
+            studentPaymentOrderDetail.setType(OrderDetailTypeEnum.DEGREE_REGISTRATION);
+            if(Objects.nonNull(degreeRegistration.getAdditionCourseInfo())){
+                studentPaymentOrderDetail.setGoodsIdList(JSON.toJSONString(degreeRegistration.getAdditionCourseInfo()));
+            }
+            studentPaymentOrderDetail.setPrice(additionCoursePrice);
+            studentPaymentOrderDetail.setRemitFee(BigDecimal.ZERO);
+            studentPaymentOrderDetail.setPaymentOrderId(studentPaymentOrder.getId());
+            studentPaymentOrderDetail.setCreateTime(nowDate);
+            studentPaymentOrderDetail.setUpdateTime(nowDate);
+            studentPaymentOrderDetailDao.insert(studentPaymentOrderDetail);
+        }
+
+        if (amount.compareTo(BigDecimal.ZERO) == 0) {
+            Map<String, String> notifyMap = new HashMap<>();
+            notifyMap.put("tradeState", "1");
+            notifyMap.put("merOrderNo", studentPaymentOrder.getOrderNo());
+            notifyMap.put("channelType", channelType);
+            notifyMap.put("orderNo", "");
+            studentPaymentOrderService.updateOrder(notifyMap);
+            return BaseController.failed(HttpStatus.CREATED, "恭喜您,支付成功!");
+        }
+
+        String baseApiUrl = sysConfigDao.findConfigValue("base_api_url");
+
+        String receiver = "kjRegister";
+        Map payMap = payService.getPayMap(
+                amount,
+                BigDecimal.ZERO,
+                orderNo,
+                baseApiUrl + "/api-student/studentOrder/notify",
+                baseApiUrl + "/api-student/studentOrder/paymentResult?orderNo=" + orderNo,
+                "乐理考级报名活动",
+                "乐理考级报名活动",
+                degreeRegistration.getOrganId(),
+                receiver
+        );
+
+        studentPaymentOrder.setOrganId(degreeRegistration.getOrganId());
+        studentPaymentOrder.setMerNos((String) payMap.get("routingMerNos"));
+        studentPaymentOrder.setPaymentChannel((String) payMap.get("type"));
+        studentPaymentOrder.setUpdateTime(nowDate);
+        studentPaymentOrderService.update(studentPaymentOrder);
+        return BaseController.succeed(payMap);
+    }
+
     @Override
     public Boolean updateStatus(StudentPaymentOrder studentPaymentOrder) {
         DegreeRegistration degree = degreeRegistrationDao.getLock(studentPaymentOrder.getClassGroupId());

+ 13 - 7
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentAttendanceServiceImpl.java

@@ -103,7 +103,13 @@ public class StudentAttendanceServiceImpl extends BaseServiceImpl<Long, StudentA
         Date date = new Date();
         SysConfig attendanceTimeRange;
         if (courseSchedule.getGroupType().equals(GroupType.MUSIC)) {
-            attendanceTimeRange = sysConfigService.findByParamName(SysConfigService.ENABLE_STUDENT_ATTENDANCE_TIME_RANGE);
+            TeacherAttendance teacherAttendanceInfo = teacherAttendanceDao.findByTeacherAttendanceInfo(sysUser.getId().longValue(), courseSchedule.getId());
+            if(Objects.isNull(teacherAttendanceInfo)||Objects.isNull(teacherAttendanceInfo.getSignInStatus())){
+                throw new BizException("您还未签到");
+            }
+            if (!DateUtil.isSameDay(courseSchedule.getEndClassTime(), date)) {
+                throw new BizException("乐团课禁止跨天点名");
+            }
         } else {
             SysConfig beforeAttendanceTimeRange = sysConfigService.findByParamName(SysConfigService.ENABLE_STUDENT_ATTENDANCE_BEFOR_COURSE_START_TIME_RANGE_VIP);
             int courseStartTime = DateUtil.minutesBetween(date, courseSchedule.getStartClassTime());
@@ -111,13 +117,13 @@ public class StudentAttendanceServiceImpl extends BaseServiceImpl<Long, StudentA
                 throw new BizException("VIP课开课前{}分钟禁止点名", beforeAttendanceTimeRange.getParanValue(Integer.class));
             }
             attendanceTimeRange = sysConfigService.findByParamName(SysConfigService.ENABLE_STUDENT_ATTENDANCE_TIME_RANGE_VIP);
+
+            int courseEndTime = DateUtil.minutesBetween(courseSchedule.getEndClassTime(), date);
+            if (date.after(courseSchedule.getEndClassTime()) && courseEndTime > attendanceTimeRange.getParanValue(Integer.class)) {
+                throw new BizException("VIP课结束{}分钟后禁止点名",attendanceTimeRange.getParanValue(Integer.class));
+            }
         }
-        int courseEndTime = DateUtil.minutesBetween(courseSchedule.getEndClassTime(), date);
-        if (date.after(courseSchedule.getEndClassTime()) && courseEndTime > attendanceTimeRange.getParanValue(Integer.class)) {
-            throw new BizException("{}课结束{}分钟后禁止点名",
-                    courseSchedule.getGroupType().equals(GroupType.MUSIC) ? "乐团" : "VIP",
-                    attendanceTimeRange.getParanValue(Integer.class));
-        }
+
         studentAttendanceDao.deleteStudentAttendancesByCourse(courseScheduleId);
         int classTimes = courseScheduleDao.countClassTimes(courseSchedule.getClassGroupId().longValue(), courseSchedule.getStartClassTime());
         studentAttendances.forEach(studentAttendance -> {

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

@@ -207,6 +207,11 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 			}
 			return result;
 		}else if(teacherAttendance.getSignOutTime() == null && teacherSignOutDto.getTeacherAttendanceInfo().getStatus().equals(SignStatusEnum.SIGN_OUT.getCode())){
+			int i = studentAttendanceDao.countByCourseSchedule(courseSchedule.getId());
+			if(i<=0){
+				throw new BizException("请先点名");
+			}
+
 			//是否在范围内
 			boolean isInScore = false;
 			if(StringUtils.isBlank(school.getLongitudeLatitude())){
@@ -233,10 +238,10 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 			if(!isInScore){
 				teacherAttendance.setSignOutStatus(YesOrNoEnum.NO);
 				result.put("signOutStatus",1);
-			}else if(date.compareTo(classEndDateTime) >= 0 && date.compareTo(classEndDateAdd60Minutes) <= 0){
+			}else if(date.compareTo(classEndDateTime) >= 0 && date.compareTo(classEndDateAdd60Minutes) <= 0 && DateUtil.isSameDay(date, classEndDateTime)){
 				teacherAttendance.setSignOutStatus(YesOrNoEnum.YES);
 				result.put("signOutStatus",0);
-			}else if(date.compareTo(classEndDateAdd60Minutes) > 0){
+			}else if(date.compareTo(classEndDateAdd60Minutes) > 0 && DateUtil.isSameDay(date, classEndDateTime)){
 				if(StringUtils.isEmpty(teacherAttendance.getSignOutRemark())&&!teacherSignOutDto.isNotRturnErrorInfo()){
 					//当前为异常签退,请填写原因!
 					result.put("status",2);

+ 25 - 0
mec-student/src/main/java/com/ym/mec/student/controller/DegreeController.java

@@ -93,6 +93,31 @@ public class DegreeController extends BaseController {
         return degreeRegistrationService.pay(degreeRegistration);
     }
 
+    @ApiOperation(value = "考级报名支付")
+    @PostMapping("/theoryPay")
+    public HttpResponseResult theoryPay(@RequestBody DegreeRegistrationActivityDto degreeRegistration) throws Exception {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if(Objects.isNull(user)){
+            return failed(HttpStatus.FORBIDDEN,"请登录");
+        }
+        degreeRegistration.setUserId(user.getId());
+
+        if(Objects.nonNull(degreeRegistration.getTheoryLevel())){
+            IdcardValidator idcardValidator = new IdcardValidator();
+            if (!idcardValidator.isValidatedAllIdcard(degreeRegistration.getIdcard())) {
+                throw new BizException("身份证号不正确,请核对");
+            }
+        }else{
+            degreeRegistration.setOrganId(user.getOrganId());
+        }
+
+        if(Objects.isNull(degreeRegistration.getOrganId())){
+            return failed("该分部暂未参与此活动");
+        }
+
+        return degreeRegistrationService.theoryPay(degreeRegistration);
+    }
+
     @ApiOperation(value = "考级报名检查")
     @PostMapping("/check")
     @Transactional(isolation = Isolation.READ_COMMITTED)