From e6ab06b99474a05b9dc30a58d677ad3847532703 Mon Sep 17 00:00:00 2001 From: zhangyunjie <1920430866@qq.com> Date: Thu, 15 May 2025 18:15:36 +0800 Subject: [PATCH] =?UTF-8?q?Revert=20"feat:=20=E4=B8=9C=E5=8C=BA=E7=BC=B4?= =?UTF-8?q?=E8=B4=B9=E5=88=86=E6=94=AF=E5=88=9D=E5=A7=8B=E5=8C=96"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 90c60a49100f5fa2793597721e14b60eabdc9af5. --- Readme.md | 4 +- .../controller/SocialLoginController.java | 19 + .../yida/data/auth/manager/UserManager.java | 27 +- .../com/yida/data/auth/mapper/MenuMapper.java | 2 +- .../yida/data/auth/mapper/UserMenuMapper.java | 2 +- .../data/auth/service/SocialLoginService.java | 22 + .../impl/FebsUserDetailServiceImpl.java | 23 +- .../service/impl/SocialLoginServiceImpl.java | 60 +- .../src/main/resources/mapper/MenuMapper.xml | 22 +- .../src/main/resources/mapper/UserMapper.xml | 2 + .../main/resources/mapper/UserMenuMapper.xml | 16 +- febs-common/febs-common-core/pom.xml | 24 +- .../data/common/core/common/ModuleName.java | 9 + .../common/core/common/ResultMsgType.java | 7 + .../data/common/core/entity/CurrentUser.java | 6 + .../common/core/entity/ErrorRecordMsg.java | 68 + .../data/common/core/entity/FebsAuthUser.java | 2 + .../core/entity/applyForm/CoreApplyForm.java | 176 ++ .../CoreApplyFormApprovalProcess.java | 90 + .../applyForm/CoreApplyFormFillUser.java | 114 + .../CoreApplyFormFillUserApprovalProcess.java | 125 + ...pplyFormFillUserApprovalProcessRecord.java | 141 + .../entity/applyForm/CoreApplyFormItem.java | 190 ++ .../applyForm/CoreApplyFormItemChildren.java | 105 + .../entity/applyForm/CoreApprovalProcess.java | 106 + .../applyForm/CoreApprovalProcessUser.java | 109 + .../entity/applyForm/CoreApprovalRemind.java | 93 + .../entity/applyForm/CoreOfficialSeal.java | 100 + .../attendance/EduAttendanceRecord.java | 6 + .../attendance/EduAttendanceResult.java | 11 +- .../EduAttendanceResultPushReportRecord.java | 80 + .../attendance/EduAttendanceRuleDevice.java | 6 +- .../attendance/EduAttendanceStaffResult.java | 25 +- .../entity/attendance/EduUserStrategy.java | 116 + .../attendance/AttendanceRecord.java | 265 ++ .../AttendanceReportPushRecord.java | 104 + .../attendance/AttendanceReportStrategy.java | 199 ++ .../attendance/AttendanceResult.java | 196 ++ .../attendance/attendance/AttendanceRule.java | 219 ++ .../attendance/AttendanceRuleAddress.java | 101 + .../attendance/AttendanceRuleAdmin.java | 70 + .../attendance/AttendanceRuleDevice.java | 87 + .../attendance/AttendanceRuleObj.java | 70 + .../attendance/AttendanceRuleObjUser.java | 59 + .../attendance/AttendanceRuleRemind.java | 77 + .../attendance/AttendanceRuleSpecialDate.java | 76 + .../attendance/AttendanceRuleTime.java | 161 ++ .../attendance/AttendanceRuleWhiteList.java | 98 + .../attendance/AttendanceRuleWifi.java | 87 + .../core/entity/classCall/EduClassCall.java | 134 + .../classCall/EduClassCallPushConfig.java | 110 + .../EduClassCallPushConfigProcess.java | 90 + .../EduClassCallPushConfigProcessStaff.java | 91 + .../classCall/EduClassCallStudentRecord.java | 176 ++ .../core/entity/constant/AppConstant.java | 31 +- .../entity/constant/CachePrefixConstant.java | 325 ++- .../constant/ConstructionPayConstant.java | 71 + .../core/entity/constant/ConsumeConstant.java | 50 + .../core/entity/constant/FebsConstant.java | 12 +- .../entity/constant/LockPrefixConstant.java | 9 +- .../entity/constant/NoticeTypeConstant.java | 27 + .../core/entity/constant/QywxConstant.java | 43 + .../constant/QywxServiceProviderConstant.java | 110 + .../core/entity/constant/UPayConstant.java | 134 + .../entity/constant/WxPublicConstant.java | 6 + .../hq/HaiqingCallbackCodeConstant.java | 40 + .../entity/constant/hq/HaiqingConstant.java | 128 + .../consume/DeptConsumeTerminalCache.java | 38 + .../core/entity/consume/EduConsumeConfig.java | 45 + .../core/entity/consume/EduConsumeDevice.java | 73 + .../core/entity/consume/EduConsumeOrder.java | 174 ++ .../entity/consume/EduConsumeOrderRefund.java | 99 + .../consume/EduConsumeOrderStudent.java | 174 ++ .../core/entity/consume/EduConsumeRecord.java | 157 ++ .../entity/consume/EduStudentConsumeCard.java | 77 + .../common/core/entity/consume/Recharge.java | 82 + .../dashboard/EduSchoolDashboardData.java | 126 + .../core/entity/notice/app/AppNotice.java | 5 - .../entity/notice/app/inside/PushMessage.java | 1 - .../notice/qywx/TemplateCardStaffNotice.java | 24 + .../notice/qywx/TextCardStaffNotice.java | 19 + .../qywx/inside/TemplateCardNotice.java | 37 + .../entity/notice/qywx/inside/TextCard.java | 29 + .../qywx/inside/templateCard/CardAction.java | 24 + .../templateCard/HorizontalContent.java | 25 + .../notice/qywx/inside/templateCard/Jump.java | 27 + .../qywx/inside/templateCard/MainTitle.java | 18 + .../qywx/inside/templateCard/textNotice.java | 25 + .../core/entity/pay/ConstructionPayOrder.java | 35 + .../common/core/entity/pay/UPayOrder.java | 49 + .../data/common/core/entity/pay/URefund.java | 37 + .../common/core/entity/pay/UnionPayOrder.java | 2 +- .../core/entity/school/EduDeptHomeApp.java | 155 ++ .../school/EduSchoolFunctionConfig.java | 43 + .../entity/school/EduSchoolManuscript.java | 4 +- .../entity/screen/EduSchoolDashboardData.java | 269 ++ .../screen/EduSchoolDashboardDataBase.java | 98 + .../screen/EduSchoolDashboardDataTeacher.java | 91 + .../smart/ConstructionPayNotifyDTO.java | 86 + .../core/entity/smart/EduGuideStepOrder.java | 195 ++ .../entity/smart/EduSmartWelcomeCampus.java | 84 + .../smart/EduSmartWelcomeDepartment.java | 105 + .../entity/smart/EduSmartWelcomeGuide.java | 147 + .../EduSmartWelcomeGuideClassRecord.java | 155 ++ .../smart/EduSmartWelcomeGuideDormRecord.java | 128 + .../smart/EduSmartWelcomeGuideRoster.java | 291 ++ .../EduSmartWelcomeGuideRosterRelation.java | 131 + ...duSmartWelcomeGuideRosterRelationStep.java | 160 ++ .../smart/EduSmartWelcomeGuideStep.java | 180 ++ .../smart/EduSmartWelcomeGuideStepClass.java | 207 ++ .../EduSmartWelcomeGuideStepClassFix.java | 176 ++ .../smart/EduSmartWelcomeGuideStepDorm.java | 178 ++ .../EduSmartWelcomeGuideStepDormFix.java | 150 ++ .../smart/EduSmartWelcomeGuideStepStaff.java | 108 + .../core/entity/system/BaiduApiConfig.java | 73 + .../entity/system/ConstructionPayConfig.java | 75 + .../data/common/core/entity/system/Dept.java | 8 +- .../common/core/entity/system/EduApp.java | 8 + .../core/entity/system/EduAppTemplate.java | 38 + .../common/core/entity/system/EduBaseApp.java | 63 + .../core/entity/system/EduDeptFunction.java | 40 + .../entity/system/EduQywxServiceProvider.java | 43 + .../system/EduQywxServiceProviderSchool.java | 38 + .../data/common/core/entity/system/Menu.java | 5 +- .../common/core/entity/system/SystemUser.java | 5 + .../core/entity/system/SystemUserMenu.java | 9 + .../common/core/entity/system/UPayConfig.java | 46 + .../common/core/entity/system/WhiteList.java | 42 + .../core/entity/system/enums/RoleEnum.java | 4 +- .../entity/system/enums/SchoolNatureEnum.java | 27 + .../entity/system/enums/SysFunctionEnum.java | 30 + .../entity/user/EduFaceGroupStrategy.java | 150 ++ .../entity/user/EduFaceGroupStrategyPlan.java | 69 + .../user/EduFaceGroupStrategyPlanTime.java | 93 + .../user/EduFaceGroupStrategySpecialDate.java | 89 + .../user/EduFaceGroupStrategySpecialTime.java | 91 + .../common/core/entity/user/EduStaffDept.java | 3 + .../common/core/entity/user/EduStudent.java | 39 + .../core/entity/user/EduStudentApply.java | 77 + .../core/entity/user/EduStudentApplyFor.java | 79 + .../common/core/entity/user/EduUserFace.java | 29 +- .../entity/user/enums/StudentStatusEnum.java | 41 + .../entity/user/enums/StudentTypeEnum.java | 28 + .../EduLeaveRequestProcessConfig.java | 126 + ...estProcessConfigApplicableDepartments.java | 57 + ...LeaveRequestProcessConfigApprovalUser.java | 63 + .../EduLeaveRequestProcessConfigView.java | 65 + .../EduLeaveRequestProcessRecord.java | 148 ++ .../entity/userLeave/EduLeaveRequestUser.java | 200 ++ .../userLeave/EduLeaveRequestUserView.java | 87 + .../data/common/core/enums/AppTypeEnum.java | 31 + .../core/enums/ApprovalRoleTypeEnum.java | 32 + .../common/core/enums/AttendanceResult.java | 28 + .../common/core/enums/AuditStatusEnum.java | 29 + .../common/core/enums/BaiDuModuleEnum.java | 30 + .../enums/ConstructionTradeStateEnum.java | 41 + .../common/core/enums/FileDealStatusEnum.java | 32 + .../common/core/enums/GuideStepTypeEnum.java | 41 + .../common/core/enums/IssuedTypeEnum.java | 31 + .../data/common/core/enums/MsgChannel.java | 4 +- .../yida/data/common/core/enums/PayWay.java | 6 +- .../common/core/enums/QywxAppTypeEnum.java | 31 + .../core/enums/QywxCallbackTypeEnum.java | 27 + .../common/core/enums/RecordTypeEnum.java | 24 + .../core/enums/RegistrationStatusEnum.java | 31 + .../common/core/enums/SchoolFunctionCode.java | 36 + .../core/enums/StaffAttendanceResultEnum.java | 65 + .../core/enums/UPayNotifyResultEnum.java | 31 + .../common/core/enums/UPayTradeStateEnum.java | 53 + .../common/core/enums/UnionPayTypeEnum.java | 2 +- .../data/common/core/enums/UserTypeEnum.java | 31 + .../attendance/AttendanceModeTypeEnum.java | 24 + .../attendance/AttendanceNextDayEnum.java | 24 + .../attendance/AttendanceReportTypeEnum.java | 24 + .../attendance/AttendanceResultEnum.java | 45 + .../AttendanceStrategyTypeEnum.java | 17 + .../enums/attendance/AttendanceTypeEnum.java | 24 + .../attendance/AttendanceUserTypeEnum.java | 29 + .../attendance/AttendanceWifiStatusEnum.java | 23 + .../core/enums/leave/ApprovalResultEnum.java | 44 + .../core/enums/leave/AuditModeEnum.java | 42 + .../enums/leave/LeaveRequestTypeEnum.java | 41 + .../core/enums/school/DeptAppTypeEnum.java | 22 + .../core/enums/school/FunctionConfigCode.java | 24 + .../core/enums/system/MenuShowType.java | 28 + .../common/core/file/IExportExcelClient.java | 31 + .../common/core/file/IExportLargeClient.java | 46 + .../core/file/common/DownloadFileChunk.java | 36 + .../file/common/export/ExportExcelData.java | 47 + .../file/common/export/ExportLargeData.java | 53 + .../file/common/export/SelectExportData.java | 30 + .../core/handler/BaseExceptionHandler.java | 13 +- .../yida/data/common/core/utils/AppUtil.java | 70 +- .../data/common/core/utils/BaiDuUtil.java | 131 + .../core/utils/ConstructionPayUtil.java | 322 +++ .../data/common/core/utils/ConsumeUtil.java | 183 ++ .../yida/data/common/core/utils/DateUtil.java | 116 + .../yida/data/common/core/utils/FebsUtil.java | 96 +- .../yida/data/common/core/utils/FileUtil.java | 10 +- .../common/core/utils/ThreadPoolUtil.java | 30 + .../yida/data/common/core/utils/UPayUtil.java | 440 +++ .../data/common/core/utils/WxPublicUtil.java | 117 +- .../core/utils/WxServiceProviderUtil.java | 407 +++ .../yida/data/common/core/utils/WxUtil.java | 210 +- .../core/utils/construction/ABAProvider.java | 64 + .../common/core/utils/construction/DER.java | 96 + .../core/utils/construction/RSAPubKey.java | 111 + .../core/utils/construction/RSASig.java | 62 + .../common/core/utils/file/ChunkUtil.java | 33 + .../main/resources/META-INF/spring.factories | 3 +- .../data/log/aspect/OperationLogAspect.java | 16 +- .../com/yida/data/log/service/LogService.java | 27 +- .../data/rabbit/constant/RabbitConstant.java | 15 + febs-server/attendance/attendance-api/pom.xml | 19 + .../dto/AddAttendanceRecordDTO.java | 105 + .../dto/AddAttendanceReportStrategyDTO.java | 161 ++ .../dto/AddAttendanceRuleAddressDTO.java | 55 + .../dto/AddAttendanceRuleAdminDTO.java | 56 + .../attendance/dto/AddAttendanceRuleDTO.java | 174 ++ .../dto/AddAttendanceRuleDeviceDTO.java | 43 + .../dto/AddAttendanceRuleObjDTO.java | 40 + .../dto/AddAttendanceRuleRemindDTO.java | 49 + .../dto/AddAttendanceRuleSpecialDateDTO.java | 63 + .../dto/AddAttendanceRuleTimeDTO.java | 102 + .../dto/AddAttendanceRuleWhiteListDTO.java | 31 + .../dto/AddAttendanceRuleWifiDTO.java | 47 + .../dto/AddLeaveRequestStrategyDTO.java | 51 + .../dto/AttendanceCountPageDTO.java | 51 + .../dto/AttendanceDayReportDTO.java | 37 + .../dto/AttendanceFaceMatchDTO.java | 39 + .../dto/AttendanceResultByDayDTO.java | 34 + .../AttendanceResultByStartAndEndTimeDTO.java | 40 + .../dto/AttendanceRuleAdminUserAddDTO.java | 17 + .../dto/AttendanceRuleAdminUserPageDTO.java | 39 + .../dto/AttendanceRuleUserAddDTO.java | 25 + .../dto/AttendanceRuleUserPageDTO.java | 34 + .../dto/AttendanceStatusByMonthDTO.java | 41 + .../dto/AttendanceUserCheckInDTO.java | 47 + .../data/attendance/dto/BssidImportDTO.java | 30 + .../data/attendance/dto/DayReportDataDTO.java | 19 + .../data/attendance/dto/DealRecordDTO.java | 36 + .../yida/data/attendance/dto/DevicePage.java | 16 + .../dto/H5AttendanceRuleWifiDTO.java | 58 + .../data/attendance/dto/IssuedFaceDTO.java | 40 + .../attendance/dto/ListErrorRecordDTO.java | 42 + .../attendance/dto/ManageListUserDTO.java | 50 + .../dto/PageAttendanceRecordDTO.java | 52 + .../attendance/dto/PageAttendanceRuleDTO.java | 46 + .../data/attendance/dto/RemoveFaceDTO.java | 11 + .../dto/UpdateAttendanceRuleStatusDTO.java | 32 + ...RemoteAttendanceDeviceServiceFallback.java | 107 + ...RemoteAttendanceResultServiceFallback.java | 33 + ...moteAttendanceStrategyServiceFallback.java | 106 + .../RemoteUserStrategyServiceFallback.java | 28 + .../feign/RemoteAttendanceDeviceService.java | 71 + .../feign/RemoteAttendanceResultService.java | 19 + .../RemoteAttendanceStrategyService.java | 81 + .../feign/RemoteUserStrategyService.java | 15 + .../attendance/vo/AttdanceResultDetailVO.java | 59 + .../attendance/vo/AttdanceResultTotalVO.java | 30 + .../data/attendance/vo/AttdanceResultVO.java | 58 + .../attendance/vo/AttendanceFaceMatchVO.java | 31 + .../vo/AttendanceRecordExcelVO.java | 50 + .../vo/AttendanceRuleAdminUserVO.java | 49 + .../attendance/vo/AttendanceRuleUserVO.java | 56 + .../data/attendance/vo/AttendanceRuleVO.java | 203 ++ .../vo/AttendanceStatusByMonthVO.java | 39 + .../vo/AttendanceUserCheckInVO.java | 32 + .../data/attendance/vo/AttendanceWifiVO.java | 132 + .../data/attendance/vo/ConflictRuleVO.java | 19 + .../yida/data/attendance/vo/DateStatusVO.java | 18 + .../data/attendance/vo/DayReportDataVO.java | 25 + .../com/yida/data/attendance/vo/DetailVO.java | 35 + .../data/attendance/vo/DeviceNumberVO.java | 34 + .../attendance/vo/DeviceOrDeviceGroupVO.java | 14 + .../com/yida/data/attendance/vo/DeviceVO.java | 52 + .../vo/DownLoadAttendanceResultVO.java | 35 + .../data/attendance/vo/ImportBssidDataVO.java | 30 + ...ManageListUserAttendanceDetailTotalVO.java | 18 + .../vo/ManageListUserAttendanceDetailVO.java | 69 + .../data/attendance/vo/ManageListUserVO.java | 41 + .../data/attendance/vo/OnlineCountVO.java | 11 + .../data/attendance/vo/StaRecordCountVO.java | 23 + .../data/attendance/vo/StaffIdentityVO.java | 13 + ...StudentDormAttendanceDayReportExcelVO.java | 98 + .../StudentDormAttendanceResultExcelVO.java | 68 + ...udentDormAttendanceResultTotalExcelVO.java | 66 + .../vo/UserAttendanceResultByDayVO.java | 24 + .../vo/UserAttendanceResultByTimeSlotVO.java | 55 + .../vo/UserAttendanceResultDayAndNumVO.java | 27 + .../main/resources/META-INF/spring.factories | 6 + febs-server/attendance/attendance-biz/pom.xml | 86 + .../attendance/AttendanceApplication.java | 29 + .../configure/ActiveMqConfigure.java | 147 + .../configure/ThreadPollConfigure.java | 26 + .../attendance/constant/MqttConstant.java | 16 + .../AttendanceDeviceController.java | 175 ++ .../AttendanceDeviceGroupController.java | 122 + .../AttendanceRecordController.java | 96 + .../AttendanceReportStrategyController.java | 51 + .../AttendanceResultController.java | 119 + .../controller/AttendanceRuleController.java | 163 ++ .../EduAttendanceStrategyController.java | 71 + .../H5/H5AttendanceRecordController.java | 38 + .../H5/H5AttendanceRuleController.java | 154 ++ .../in/InAttendanceResultController.java | 89 + .../in/InEduAttendanceDeviceController.java | 42 + .../in/InEduUserStrategyController.java | 32 + .../in/InH5AttendanceRuleController.java | 61 + .../attendance/excel/BssidExcelListener.java | 93 + .../mapper/AttendanceRecordMapper.java | 32 + .../AttendanceReportPushRecordMapper.java | 10 + .../AttendanceReportStrategyMapper.java | 15 + .../mapper/AttendanceResultMapper.java | 44 + .../mapper/AttendanceRuleAddressMapper.java | 13 + .../mapper/AttendanceRuleAdminMapper.java | 15 + .../mapper/AttendanceRuleDeviceMapper.java | 14 + .../mapper/AttendanceRuleMapper.java | 89 + .../mapper/AttendanceRuleObjMapper.java | 17 + .../mapper/AttendanceRuleObjUserMapper.java | 14 + .../mapper/AttendanceRuleRemindMapper.java | 14 + .../AttendanceRuleSpecialDateMapper.java | 14 + .../mapper/AttendanceRuleTimeMapper.java | 14 + .../mapper/AttendanceRuleWhiteListMapper.java | 14 + .../mapper/AttendanceRuleWifiMapper.java | 17 + .../EduAttendanceDeviceGroupMapper.java | 28 + .../mapper/EduAttendanceDeviceMapper.java | 47 + .../mapper/EduDeviceGroupMapper.java | 14 + .../mapper/EduUserStrategyMapper.java | 14 + .../repository/ErrorRecordMsgRepository.java | 18 + .../repository/ReceiveMsgRepository.java | 9 + .../service/AttendanceCheckInService.java | 24 + .../service/AttendanceRecordService.java | 53 + .../AttendanceReportPushRecordService.java | 8 + .../AttendanceReportStrategyService.java | 22 + .../service/AttendanceResultService.java | 205 ++ .../service/AttendanceRuleAddressService.java | 12 + .../service/AttendanceRuleAdminService.java | 15 + .../service/AttendanceRuleDeviceService.java | 13 + .../service/AttendanceRuleObjService.java | 15 + .../service/AttendanceRuleObjUserService.java | 18 + .../service/AttendanceRuleRemindService.java | 12 + .../service/AttendanceRuleService.java | 156 ++ .../AttendanceRuleSpecialDateService.java | 12 + .../service/AttendanceRuleTimeService.java | 15 + .../AttendanceRuleWhiteListService.java | 12 + .../service/AttendanceRuleWifiService.java | 28 + .../EduAttendanceDeviceGroupService.java | 61 + .../service/EduAttendanceDeviceService.java | 103 + .../service/EduAttendanceStrategyService.java | 72 + .../service/EduDeviceGroupService.java | 23 + .../service/EduUserStrategyService.java | 22 + .../service/ErrorRecordMsgService.java | 44 + .../attendance/service/NoticeService.java | 52 + .../impl/AttendanceCheckInServiceImpl.java | 237 ++ .../impl/AttendanceRecordServiceImpl.java | 654 +++++ ...AttendanceReportPushRecordServiceImpl.java | 21 + .../AttendanceReportStrategyServiceImpl.java | 339 +++ .../impl/AttendanceResultServiceImpl.java | 2363 +++++++++++++++++ .../AttendanceRuleAddressServiceImpl.java | 25 + .../impl/AttendanceRuleAdminServiceImpl.java | 30 + .../impl/AttendanceRuleDeviceServiceImpl.java | 24 + .../impl/AttendanceRuleObjServiceImpl.java | 28 + .../AttendanceRuleObjUserServiceImpl.java | 110 + .../impl/AttendanceRuleRemindServiceImpl.java | 25 + .../impl/AttendanceRuleServiceImpl.java | 852 ++++++ .../AttendanceRuleSpecialDateServiceImpl.java | 25 + .../impl/AttendanceRuleTimeServiceImpl.java | 37 + .../AttendanceRuleWhiteListServiceImpl.java | 25 + .../impl/AttendanceRuleWifiServiceImpl.java | 101 + .../EduAttendanceDeviceGroupServiceImpl.java | 117 + .../impl/EduAttendanceDeviceServiceImpl.java | 681 +++++ .../EduAttendanceStrategyServiceImpl.java | 438 +++ .../impl/EduDeviceGroupServiceImpl.java | 32 + .../impl/EduUserStrategyServiceImpl.java | 87 + .../impl/ErrorRecordMsgServiceImpl.java | 84 + .../service/impl/HaiqingCallbackService.java | 888 +++++++ .../service/impl/NoticeServiceImpl.java | 501 ++++ .../yida/data/attendance/utils/FormUtil.java | 99 + .../yida/data/attendance/utils/MqttUtil.java | 95 + .../src/main/resources/banner.txt | 9 + .../src/main/resources/bootstrap.yml | 33 + .../mapper/AttendanceRecordMapper.xml | 78 + .../mapper/AttendanceResultMapper.xml | 316 +++ .../mapper/AttendanceRuleAddressMapper.xml | 5 + .../mapper/AttendanceRuleAdminMapper.xml | 32 + .../mapper/AttendanceRuleDeviceMapper.xml | 5 + .../resources/mapper/AttendanceRuleMapper.xml | 390 +++ .../mapper/AttendanceRuleObjMapper.xml | 16 + .../mapper/AttendanceRuleRemindMapper.xml | 5 + .../AttendanceRuleSpecialDateMapper.xml | 5 + .../mapper/AttendanceRuleTimeMapper.xml | 5 + .../mapper/AttendanceRuleWhiteListMapper.xml | 5 + .../mapper/AttendanceRuleWifiMapper.xml | 11 + .../mapper/EduAttendanceDeviceGroupMapper.xml | 53 + .../mapper/EduAttendanceDeviceMapper.xml | 74 + febs-server/attendance/pom.xml | 25 + .../excel/DefaultExportExcelClient.java | 154 ++ .../excel/DefaultExportLargeClient.java | 285 ++ .../data/common/service/CommonService.java | 578 +++- .../dto/apply/ApplyFormDataInputDTO.java | 33 + .../dto/apply/ApplyFormFillSelectPageDTO.java | 45 + .../dto/apply/ApplyFormFillUserDataDTO.java | 40 + .../dto/apply/ApplyFormSelectPageDTO.java | 43 + .../apply/ApprovalFillUserFormPageDTO.java | 36 + .../apply/ApprovalProcessSelectPageDTO.java | 39 + .../dto/apply/ApprovalRemindDTO.java | 37 + .../customForm/dto/apply/AuditFormDTO.java | 54 + .../dto/apply/FormFillUserPageDTO.java | 30 + .../dto/apply/H5ApplyFormSelectPageDTO.java | 37 + .../dto/apply/OfficialSealSaveDTO.java | 36 + .../dto/apply/OfficialSealSelectPageDTO.java | 44 + .../dto/apply/SaveFormProcessDTO.java | 34 + .../SelectApprovalApplyFormDataListDTO.java | 38 + .../dto/apply/SendParentNoticeDTO.java | 60 + .../dto/apply/SendStaffNoticeDTO.java | 93 + .../vo/apply/ApplyFormFillSelectPageVO.java | 70 + .../vo/apply/ApplyFormFillUserDataVO.java | 61 + .../customForm/vo/apply/ApplyFormInfoVO.java | 75 + .../vo/apply/ApplyFormProcessSelectVO.java | 39 + .../vo/apply/ApplyFormSelectPageVO.java | 49 + .../vo/apply/ApprovalApplyFormPageVO.java | 34 + .../vo/apply/ApprovalProcessInfoVO.java | 43 + .../vo/apply/ApprovalProcessSelectPageVO.java | 47 + .../vo/apply/ApprovalRemindInfoVO.java | 40 + .../vo/apply/MyApplyFormPageVO.java | 65 + .../vo/apply/OfficialSealInfoVO.java | 43 + .../vo/apply/OfficialSealSelectPageVO.java | 49 + .../edu-custom-form-biz/pom.xml | 2 +- .../data/form/EduCustomFormApplication.java | 34 + .../controller/CoreApplyFormController.java | 89 + .../CoreApplyFormFillController.java | 37 + .../CoreApprovalProcessController.java | 71 + .../CoreApprovalRemindController.java | 40 + .../CoreOfficialSealController.java | 80 + .../app/AppApplyFormController.java | 76 + .../form/apply/mapper/AppApplyFormMapper.java | 12 + .../apply/mapper/ApplyFormDataMapper.java | 48 + .../CoreApplyFormApprovalProcessMapper.java | 43 + ...pplyFormFillUserApprovalProcessMapper.java | 15 + ...rmFillUserApprovalProcessRecordMapper.java | 15 + .../mapper/CoreApplyFormFillUserMapper.java | 78 + .../CoreApplyFormItemChildrenMapper.java | 14 + .../apply/mapper/CoreApplyFormItemMapper.java | 15 + .../apply/mapper/CoreApplyFormMapper.java | 49 + .../mapper/CoreApprovalProcessMapper.java | 30 + .../mapper/CoreApprovalProcessUserMapper.java | 15 + .../mapper/CoreApprovalRemindMapper.java | 21 + .../apply/mapper/CoreOfficialSealMapper.java | 33 + .../apply/service/AppApplyFormService.java | 85 + .../apply/service/ApplyFormDataService.java | 25 + .../CoreApplyFormApprovalProcessService.java | 43 + ...mFillUserApprovalProcessRecordService.java | 15 + ...plyFormFillUserApprovalProcessService.java | 15 + .../service/CoreApplyFormFillUserService.java | 42 + .../CoreApplyFormItemChildrenService.java | 16 + .../service/CoreApplyFormItemService.java | 16 + .../apply/service/CoreApplyFormService.java | 66 + .../service/CoreApprovalProcessService.java | 68 + .../CoreApprovalProcessUserService.java | 16 + .../service/CoreApprovalRemindService.java | 34 + .../service/CoreOfficialSealService.java | 67 + .../form/apply/service/SendNoticeService.java | 39 + .../service/impl/AppApplyFormServiceImpl.java | 532 ++++ .../impl/ApplyFormDataServiceImpl.java | 214 ++ ...reApplyFormApprovalProcessServiceImpl.java | 64 + ...lUserApprovalProcessRecordServiceImpl.java | 25 + ...ormFillUserApprovalProcessServiceImpl.java | 25 + .../CoreApplyFormFillUserServiceImpl.java | 47 + .../CoreApplyFormItemChildrenServiceImpl.java | 23 + .../impl/CoreApplyFormItemServiceImpl.java | 25 + .../impl/CoreApplyFormServiceImpl.java | 188 ++ .../impl/CoreApprovalProcessServiceImpl.java | 130 + .../CoreApprovalProcessUserServiceImpl.java | 25 + .../impl/CoreApprovalRemindServiceImpl.java | 55 + .../impl/CoreOfficialSealServiceImpl.java | 75 + .../service/impl/SendNoticeServiceImpl.java | 168 ++ .../CoreCustomFormAuthController.java | 53 + .../controller/CoreCustomFormController.java | 123 + .../CoreCustomFormDataController.java | 154 ++ .../CoreCustomFormGroupController.java | 71 + .../CoreCustomFormModelController.java | 41 + .../CoreCustomFormTypeController.java | 47 + .../InCoreCustomFormController.java | 45 + .../app/AppCustomFormController.java | 145 + .../customForm/entity/FormDataReturn.java | 26 + .../data/form/customForm/entity/RedisKey.java | 14 + .../mapper/CoreCustomFormAuthMapper.java | 14 + .../CoreCustomFormAuthRelationFormMapper.java | 14 + .../mapper/CoreCustomFormDataMapper.java | 42 + .../mapper/CoreCustomFormGroupMapper.java | 23 + .../CoreCustomFormItemChildrenMapper.java | 17 + .../mapper/CoreCustomFormItemsMapper.java | 16 + .../mapper/CoreCustomFormMapper.java | 57 + ...CoreCustomFormModelItemChildrenMapper.java | 14 + .../CoreCustomFormModelItemsMapper.java | 14 + .../mapper/CoreCustomFormModelMapper.java | 14 + .../CoreCustomFormRelationAdminMapper.java | 14 + .../CoreCustomFormRelationUserMapper.java | 31 + ...oreCustomFormRelationUserParentMapper.java | 25 + .../mapper/CoreCustomFormStatisticMapper.java | 14 + .../mapper/CoreCustomFormTopicalMapper.java | 14 + .../mapper/CoreCustomFormTypeMapper.java | 14 + ...CoreCustomFormAuthRelationFormService.java | 15 + .../service/CoreCustomFormAuthService.java | 16 + .../service/CoreCustomFormDataService.java | 74 + .../service/CoreCustomFormGroupService.java | 21 + .../CoreCustomFormItemChildrenService.java | 16 + .../service/CoreCustomFormItemsService.java | 20 + ...oreCustomFormModelItemChildrenService.java | 13 + .../CoreCustomFormModelItemsService.java | 13 + .../service/CoreCustomFormModelService.java | 13 + .../CoreCustomFormRelationAdminService.java | 17 + ...reCustomFormRelationUserParentService.java | 18 + .../CoreCustomFormRelationUserService.java | 41 + .../service/CoreCustomFormService.java | 144 + .../CoreCustomFormStatisticService.java | 18 + .../service/CoreCustomFormTopicalService.java | 17 + .../service/CoreCustomFormTypeService.java | 18 + ...CustomFormAuthRelationFormServiceImpl.java | 27 + .../impl/CoreCustomFormAuthServiceImpl.java | 26 + .../impl/CoreCustomFormDataServiceImpl.java | 433 +++ .../impl/CoreCustomFormGroupServiceImpl.java | 40 + ...CoreCustomFormItemChildrenServiceImpl.java | 27 + .../impl/CoreCustomFormItemsServiceImpl.java | 28 + ...ustomFormModelItemChildrenServiceImpl.java | 26 + .../CoreCustomFormModelItemsServiceImpl.java | 26 + .../impl/CoreCustomFormModelServiceImpl.java | 26 + ...oreCustomFormRelationAdminServiceImpl.java | 26 + ...stomFormRelationUserParentServiceImpl.java | 32 + ...CoreCustomFormRelationUserServiceImpl.java | 49 + .../impl/CoreCustomFormServiceImpl.java | 1062 ++++++++ .../CoreCustomFormStatisticServiceImpl.java | 26 + .../CoreCustomFormTopicalServiceImpl.java | 26 + .../impl/CoreCustomFormTypeServiceImpl.java | 25 + .../mapper/apply/AppApplyFormMapper.xml | 7 + .../mapper/apply/ApplyFormDataMapper.xml | 27 + .../CoreApplyFormApprovalProcessMapper.xml | 38 + .../apply/CoreApplyFormFillUserMapper.xml | 101 + .../mapper/apply/CoreApplyFormMapper.xml | 33 + .../apply/CoreApprovalProcessMapper.xml | 23 + .../mapper/apply/CoreOfficialSealMapper.xml | 23 + .../CoreCustomFormAuthAdminMapper.xml | 5 + .../customForm/CoreCustomFormAuthMapper.xml | 5 + .../customForm/CoreCustomFormDataMapper.xml | 36 + .../customForm/CoreCustomFormGroupMapper.xml | 26 + .../CoreCustomFormGroupRelationFormMapper.xml | 5 + .../CoreCustomFormItemChildrenMapper.xml | 4 + .../customForm/CoreCustomFormItemsMapper.xml | 29 + .../customForm/CoreCustomFormMapper.xml | 151 ++ .../CoreCustomFormModelItemChildrenMapper.xml | 5 + .../CoreCustomFormModelItemsMapper.xml | 5 + .../customForm/CoreCustomFormModelMapper.xml | 5 + .../CoreCustomFormRelationAdminMapper.xml | 5 + .../CoreCustomFormRelationUserMapper.xml | 37 + ...CoreCustomFormRelationUserParentMapper.xml | 22 + .../CoreCustomFormStatisticMapper.xml | 5 + .../CoreCustomFormTopicalMapper.xml | 5 + .../customForm/CoreCustomFormTypeMapper.xml | 5 + .../dto/consume/ConsumeOrderPageDTO.java | 42 + .../dto/consume/CreateConsumeOrderDTO.java | 54 + .../dto/consume/H5ConsumeOrderPageDTO.java | 36 + .../dto/consume/H5ConsumeRecordPageDTO.java | 36 + .../RemoteConsumeCardServiceFallback.java | 32 + .../RemoteConsumeOrderServiceFallback.java | 36 + .../consume/RemoteConsumeCardService.java | 20 + .../consume/RemoteConsumeOrderService.java | 38 + .../device/vo/consume/ConsumeDeviceVO.java | 53 + .../device/vo/consume/ConsumeOrderPageVO.java | 74 + .../consume/ConsumeOrderStudentCacheVO.java | 44 + .../device/vo/consume/ConsumePayInfoVO.java | 77 + .../vo/consume/ConsumeRefundOrderVO.java | 48 + .../data/device/vo/consume/ConsumeVipVO.java | 52 + .../vo/consume/H5ConsumeOrderPageVO.java | 67 + .../vo/consume/H5ConsumeRecordPageVO.java | 85 + .../main/resources/META-INF/spring.factories | 3 +- .../EduConsumeDeviceController.java | 69 + .../controller/EduConsumeOrderController.java | 46 + .../EduStudentConsumeCardController.java | 36 + .../controller/H5ConsumeController.java | 107 + .../InEduConsumeOrderController.java | 80 + .../controller/out/OutConsumeController.java | 35 + .../mapper/EduConsumeDeviceMapper.java | 21 + .../consume/mapper/EduConsumeOrderMapper.java | 80 + .../mapper/EduConsumeOrderRefundMapper.java | 14 + .../mapper/EduConsumeOrderStudentMapper.java | 14 + .../mapper/EduConsumeRecordMapper.java | 30 + .../mapper/EduStudentConsumeCardMapper.java | 14 + .../service/EduConsumeDeviceService.java | 38 + .../service/EduConsumeOrderRefundService.java | 13 + .../service/EduConsumeOrderService.java | 65 + .../EduConsumeOrderStudentService.java | 14 + .../service/EduConsumeRecordService.java | 14 + .../service/EduStudentConsumeCardService.java | 22 + .../consume/service/H5ConsumeService.java | 132 + .../impl/EduConsumeDeviceServiceImpl.java | 74 + .../EduConsumeOrderRefundServiceImpl.java | 26 + .../impl/EduConsumeOrderServiceImpl.java | 594 +++++ .../EduConsumeOrderStudentServiceImpl.java | 24 + .../impl/EduConsumeRecordServiceImpl.java | 24 + .../EduStudentConsumeCardServiceImpl.java | 38 + .../service/impl/H5ConsumeServiceImpl.java | 784 ++++++ .../config/CardRabbitReceiver.java | 2 +- .../controller/EduStudentCardController.java | 9 +- .../EduStudentCardPhoneController.java | 10 +- .../impl/EduStudentCardAlarmServiceImpl.java | 2 +- .../controller/EduTelephoneController.java | 10 +- .../EduTelephoneOrderController.java | 14 +- .../mapper/consume/EduConsumeDeviceMapper.xml | 26 + .../mapper/consume/EduConsumeOrderMapper.xml | 130 + .../consume/EduConsumeOrderRefundMapper.xml | 5 + .../consume/EduConsumeOrderStudentMapper.xml | 5 + .../mapper/consume/EduConsumeRecordMapper.xml | 19 + .../consume/EduStudentConsumeCardMapper.xml | 5 + .../mall/vo/h5/BillOrderStudentCacheVO.java | 2 +- .../mall/controller/EduBillController.java | 9 - .../mall/mapper/EduBillOrderItemMapper.java | 15 - .../data/mall/mapper/EduBillOrderMapper.java | 6 +- .../mall/service/EduBillOrderItemService.java | 12 - .../mall/service/EduBillOrderService.java | 6 +- .../mall/service/EduBillStudentService.java | 13 - .../data/mall/service/H5EduBillService.java | 2 +- .../impl/EduBillOrderItemServiceImpl.java | 5 - .../service/impl/EduBillOrderServiceImpl.java | 8 +- .../mall/service/impl/EduBillServiceImpl.java | 11 +- .../impl/EduBillStatisticsServiceImpl.java | 2 + .../impl/EduBillStudentServiceImpl.java | 97 +- .../service/impl/H5EduBillServiceImpl.java | 52 +- .../mapper/EduBillOrderItemMapper.xml | 16 +- .../resources/mapper/EduBillOrderMapper.xml | 4 - .../school/dto/classCall/ClassCallAddDTO.java | 43 + .../dto/classCall/ClassCallPageDTO.java | 39 + .../data/school/dto/classCall/StudentDTO.java | 18 + .../config/EduSchoolFunctionConfigDTO.java | 29 + .../school/dto/index/SaveDeptHomeAppDTO.java | 30 + .../screen/SchoolDashboardBaseSaveDTO.java | 33 + .../dto/screen/SchoolDashboardSaveDTO.java | 130 + .../screen/SchoolDashboardTeacherSaveDTO.java | 30 + .../dto/smart/AddUploadFileStepDTO.java | 41 + .../school/dto/smart/ClassFixImportDTO.java | 63 + .../data/school/dto/smart/ClassImportDTO.java | 88 + .../school/dto/smart/CustomDormImportDTO.java | 102 + .../data/school/dto/smart/DormImportDTO.java | 67 + .../school/dto/smart/DormImportFixDTO.java | 49 + .../dto/smart/GuideFillInfoSaveDTO.java | 70 + .../dto/smart/GuideRosterErrorExportDTO.java | 30 + .../dto/smart/GuideRosterImportDTO.java | 76 + .../dto/smart/GuideRosterSelectPageDTO.java | 66 + .../data/school/dto/smart/GuideSaveDTO.java | 51 + .../school/dto/smart/GuideSelectPageDTO.java | 40 + .../school/dto/smart/GuideStepSaveDTO.java | 65 + .../school/dto/smart/StaffPassStepDTO.java | 41 + .../school/dto/smart/UpdateQrCodeInfoDTO.java | 34 + .../dto/smart/h5/CreateGuideStepOrderDTO.java | 60 + .../dto/smart/h5/RosterFaceMatchDTO.java | 38 + .../school/dto/smart/h5/RosterPageDTO.java | 39 + .../dto/transaction/ListApplyFunctionDTO.java | 55 + .../school/dto/userLeave/AuditRequestDTO.java | 72 + .../EduLeaveRequestProcessConfigDTO.java | 93 + .../dto/userLeave/LeaveRequestPageDTO.java | 51 + .../dto/userLeave/ListUserRequestDTO.java | 36 + .../dto/userLeave/SendStaffNoticeDTO.java | 96 + .../RemoteDormitoryServiceFallback.java | 16 + .../RemoteDeptHomeInfoServiceFallback.java | 37 + .../RemoteLeaveRequestServiceFallback.java | 15 +- ...uSchoolFuncationConfigServiceFallback.java | 37 + .../RemoteSmartWelcomeServiceFallback.java | 46 + .../facility/RemoteDormitoryService.java | 22 +- .../index/RemoteDeptHomeIndexService.java | 27 + .../leave/RemoteLeaveRequestService.java | 13 +- ...RemoteEduSchoolFuncationConfigService.java | 36 + .../smart/RemoteSmartWelcomeService.java | 60 + .../ClassCallPushConfigPageInfoVO.java | 37 + .../yida/data/school/vo/index/HomeInfoVO.java | 3 + .../school/vo/index/ManuscriptPageInfoVO.java | 4 - .../school/vo/news/SchoolNoticePageVO.java | 4 + .../vo/screen/SchoolDashboardInfoVO.java | 130 + .../school/vo/smart/ClassFixImportVO.java | 106 + .../data/school/vo/smart/ClassImportVO.java | 116 + .../data/school/vo/smart/DormImportFixVO.java | 77 + .../data/school/vo/smart/DormImportVO.java | 80 + .../school/vo/smart/ExportRosterDataVO.java | 46 + .../data/school/vo/smart/GuideInfoVO.java | 71 + .../school/vo/smart/GuideRosterInfoVO.java | 60 + .../vo/smart/GuideRosterSelectPageVO.java | 75 + .../school/vo/smart/GuideSelectPageVO.java | 64 + .../data/school/vo/smart/GuideStepColVO.java | 33 + .../school/vo/smart/ImportRosterDataVO.java | 35 + .../vo/smart/StatisticsGuideRosterVO.java | 35 + .../vo/smart/WelcomeImportProgress.java | 39 + .../yida/data/school/vo/smart/WxConfigVO.java | 38 + .../smart/h5/GuideStepOrderRosterCacheVO.java | 41 + .../school/vo/smart/h5/RosterFaceMatchVO.java | 35 + .../vo/smart/h5/RosterStepPayInfoVO.java | 53 + .../vo/transcation/DownStudentBuyDataVO.java | 35 + .../transcation/EduProductBuyStudentVO.java | 44 + .../EduLeaveRequestProcessConfigVO.java | 31 + .../EduLeaveRequestStatisticsVO.java | 30 + .../vo/userLeave/EduLeaveRequestUserVO.java | 151 ++ .../main/resources/META-INF/spring.factories | 4 +- febs-server/edu-school/edu-school-biz/pom.xml | 152 +- .../data/school/EduSchoolApplication.java | 2 - .../controller/EduClassCallController.java | 58 + .../EduClassCallPushConfigController.java | 48 + .../classCall/mapper/EduClassCallMapper.java | 19 + .../mapper/EduClassCallPushConfigMapper.java | 8 + .../EduClassCallPushConfigProcessMapper.java | 8 + ...ClassCallPushConfigProcessStaffMapper.java | 8 + .../EduClassCallStudentRecordMapper.java | 8 + .../EduClassCallPushConfigProcessService.java | 9 + ...lassCallPushConfigProcessStaffService.java | 9 + .../EduClassCallPushConfigService.java | 12 + .../service/EduClassCallService.java | 30 + .../EduClassCallStudentRecordService.java | 17 + ...ClassCallPushConfigProcessServiceImpl.java | 19 + ...CallPushConfigProcessStaffServiceImpl.java | 20 + .../EduClassCallPushConfigServiceImpl.java | 62 + .../service/impl/EduClassCallServiceImpl.java | 103 + .../EduClassCallStudentRecordServiceImpl.java | 61 + .../in/EduSchoolFunctionConfigController.java | 104 + .../mapper/EduSchoolFunctionConfigMapper.java | 11 + .../EduSchoolFunctionConfigService.java | 12 + .../EduSchoolFunctionConfigServiceImpl.java | 18 + .../CoreExaminationPublishServiceImpl.java | 2 +- .../controller/InEduDormitoryController.java | 36 + .../InEduDormitoryRoomController.java | 19 + .../service/EduDormitoryMasterService.java | 4 +- .../facility/service/EduDormitoryService.java | 2 + .../service/impl/EduDormitoryServiceImpl.java | 47 +- ...ntPhysicalExaminationGroupServiceImpl.java | 2 +- .../controller/EduDeptHomeAppController.java | 79 + .../controller/EduSchoolHomeController.java | 17 +- .../controller/InEduSchoolHomeController.java | 19 +- .../index/mapper/EduDeptHomeAppMapper.java | 16 + .../index/service/EduDeptHomeAppService.java | 22 + .../service/EduSchoolHomeAppService.java | 2 + .../service/EduSchoolHomeCoverService.java | 3 +- .../impl/EduDeptHomeAppServiceImpl.java | 147 + .../impl/EduSchoolHomeAppServiceImpl.java | 3 + .../impl/EduSchoolHomeCoverServiceImpl.java | 169 +- .../impl/EduLeaveRequestServiceImpl.java | 4 +- .../EduLetterBoxConfigController.java | 21 +- .../controller/EduLetterBoxController.java | 50 +- .../controller/H5EduLetterBoxController.java | 53 +- .../out/OutEduLetterBoxController.java | 85 +- .../service/impl/EduLetterBoxServiceImpl.java | 42 +- .../EduSchoolManuscriptController.java | 10 - .../service/EduSchoolManuscriptService.java | 1 - .../service/impl/EduNoticeBuyServiceImpl.java | 6 +- .../impl/EduNoticeSchoolServiceImpl.java | 2 +- .../impl/EduSchoolManuscriptServiceImpl.java | 346 ++- .../impl/EduSchoolMatterServiceImpl.java | 15 +- .../EduSchoolDashboardDataController.java | 42 + .../OutEduSchoolDashboardDataController.java | 34 + .../EduSchoolDashboardDataBaseMapper.java | 14 + .../mapper/EduSchoolDashboardDataMapper.java | 14 + .../EduSchoolDashboardDataTeacherMapper.java | 14 + .../EduSchoolDashboardDataBaseService.java | 14 + .../EduSchoolDashboardDataService.java | 34 + .../EduSchoolDashboardDataTeacherService.java | 14 + ...EduSchoolDashboardDataBaseServiceImpl.java | 25 + .../EduSchoolDashboardDataServiceImpl.java | 122 + ...SchoolDashboardDataTeacherServiceImpl.java | 23 + .../EduSecondClassContentServiceImpl.java | 10 +- .../EduSecondClassVenueOrderServiceImpl.java | 7 +- .../smart/config/ExcelConfiguration.java | 30 + .../smart/config/ExportGuidePicClient.java | 67 + .../EduSmartWelcomeGuideController.java | 242 ++ ...uSmartWelcomeGuideStepClassController.java | 78 + ...duSmartWelcomeGuideStepDormController.java | 103 + .../H5EduSmartWelcomeController.java | 117 + .../InEduGuideStepOrderController.java | 46 + .../InEduSmartWelcomeController.java | 61 + .../OutEduSmartWelcomeController.java | 80 + .../smart/excel/CustomDormExcelListener.java | 104 + .../school/smart/excel/ExcelListener.java | 62 + .../smart/excel/GuideRosterExcelListener.java | 122 + .../smart/excel/SelectGuidePicExportData.java | 31 + .../smart/mapper/EduGuideStepOrderMapper.java | 25 + .../mapper/EduSmartWelcomeCampusMapper.java | 8 + .../EduSmartWelcomeDepartmentMapper.java | 8 + ...EduSmartWelcomeGuideClassRecordMapper.java | 11 + .../EduSmartWelcomeGuideDormRecordMapper.java | 11 + .../mapper/EduSmartWelcomeGuideMapper.java | 30 + .../EduSmartWelcomeGuideRosterMapper.java | 42 + ...SmartWelcomeGuideRosterRelationMapper.java | 29 + ...tWelcomeGuideRosterRelationStepMapper.java | 26 + ...duSmartWelcomeGuideStepClassFixMapper.java | 11 + .../EduSmartWelcomeGuideStepClassMapper.java | 16 + ...EduSmartWelcomeGuideStepDormFixMapper.java | 11 + .../EduSmartWelcomeGuideStepDormMapper.java | 13 + .../EduSmartWelcomeGuideStepMapper.java | 14 + .../EduSmartWelcomeGuideStepStaffMapper.java | 14 + .../service/EduGuideStepOrderService.java | 31 + .../service/EduSmartWelcomeCampusService.java | 9 + .../EduSmartWelcomeDepartmentService.java | 10 + ...duSmartWelcomeGuideClassRecordService.java | 11 + ...EduSmartWelcomeGuideDormRecordService.java | 11 + ...martWelcomeGuideRosterRelationService.java | 24 + ...WelcomeGuideRosterRelationStepService.java | 24 + .../EduSmartWelcomeGuideRosterService.java | 170 ++ .../service/EduSmartWelcomeGuideService.java | 83 + ...uSmartWelcomeGuideStepClassFixService.java | 11 + .../EduSmartWelcomeGuideStepClassService.java | 67 + ...duSmartWelcomeGuideStepDormFixService.java | 11 + .../EduSmartWelcomeGuideStepDormService.java | 68 + .../EduSmartWelcomeGuideStepService.java | 70 + .../EduSmartWelcomeGuideStepStaffService.java | 13 + .../service/H5EduSmartWelcomeService.java | 83 + .../service/ImportGuideRosterService.java | 37 + .../impl/EduGuideStepOrderServiceImpl.java | 170 ++ .../EduSmartWelcomeCampusServiceImpl.java | 20 + .../EduSmartWelcomeDepartmentServiceImpl.java | 52 + ...artWelcomeGuideClassRecordServiceImpl.java | 23 + ...martWelcomeGuideDormRecordServiceImpl.java | 23 + ...WelcomeGuideRosterRelationServiceImpl.java | 78 + ...omeGuideRosterRelationStepServiceImpl.java | 29 + ...EduSmartWelcomeGuideRosterServiceImpl.java | 738 +++++ .../impl/EduSmartWelcomeGuideServiceImpl.java | 470 ++++ ...rtWelcomeGuideStepClassFixServiceImpl.java | 27 + ...SmartWelcomeGuideStepClassServiceImpl.java | 476 ++++ ...artWelcomeGuideStepDormFixServiceImpl.java | 24 + ...uSmartWelcomeGuideStepDormServiceImpl.java | 623 +++++ .../EduSmartWelcomeGuideStepServiceImpl.java | 294 ++ ...SmartWelcomeGuideStepStaffServiceImpl.java | 26 + .../impl/H5EduSmartWelcomeServiceImpl.java | 604 +++++ .../impl/ImportGuideRosterServiceImpl.java | 171 ++ .../controller/EduApplyController.java | 21 +- .../EduApplyFunctionController.java | 9 +- .../controller/EduProductController.java | 19 +- .../controller/EduProductModelController.java | 10 +- .../EduProductNoticeStudentController.java | 38 +- .../controller/EduProductOrderController.java | 13 +- .../controller/InEduProductController.java | 13 +- .../EduProductNoticeStudentService.java | 5 +- .../impl/EduProductNoticeServiceImpl.java | 2 +- .../EduProductNoticeStudentServiceImpl.java | 129 +- .../impl/EduProductOrderServiceImpl.java | 63 +- .../transaction/service/impl/Scheduler.java | 2 +- ...ConfigApplicableDepartmentsController.java | 25 + ...stProcessConfigApprovalUserController.java | 25 + ...duLeaveRequestProcessConfigController.java | 67 + ...duLeaveRequestProcessRecordController.java | 30 + .../EduLeaveRequestUserController.java | 170 ++ .../in/InEduLeaveRequestUserController.java | 52 + ...cessConfigApplicableDepartmentsMapper.java | 15 + ...equestProcessConfigApprovalUserMapper.java | 15 + .../EduLeaveRequestProcessConfigMapper.java | 26 + ...duLeaveRequestProcessConfigViewMapper.java | 16 + .../EduLeaveRequestProcessRecordMapper.java | 15 + .../mapper/EduLeaveRequestUserMapper.java | 60 + .../mapper/EduLeaveRequestUserViewMapper.java | 16 + ...essConfigApplicableDepartmentsService.java | 16 + ...questProcessConfigApprovalUserService.java | 14 + .../EduLeaveRequestProcessConfigService.java | 37 + ...uLeaveRequestProcessConfigViewService.java | 17 + .../EduLeaveRequestProcessRecordService.java | 15 + .../service/EduLeaveRequestUserService.java | 80 + .../EduLeaveRequestUserViewService.java | 15 + ...onfigApplicableDepartmentsServiceImpl.java | 26 + ...tProcessConfigApprovalUserServiceImpl.java | 26 + ...uLeaveRequestProcessConfigServiceImpl.java | 138 + ...veRequestProcessConfigViewServiceImpl.java | 26 + ...uLeaveRequestProcessRecordServiceImpl.java | 28 + .../impl/EduLeaveRequestUserServiceImpl.java | 1381 ++++++++++ .../EduLeaveRequestUserViewServiceImpl.java | 29 + .../impl/EduVisitorRecordServiceImpl.java | 2 +- .../src/main/resources/bootstrap.yml | 1 + .../classCall/EduClassScheduleMapper.xml | 20 + .../mapper/index/EduDeptHomeAppMapper.xml | 5 + .../mapper/news/EduNoticeSchoolMapper.xml | 28 +- .../mapper/news/EduNoticeSystemMapper.xml | 1 + .../mapper/news/EduSchoolManuscriptMapper.xml | 20 +- .../EduSchoolDashboardDataBaseMapper.xml | 5 + .../screen/EduSchoolDashboardDataMapper.xml | 5 + .../EduSchoolDashboardDataTeacherMapper.xml | 5 + .../mapper/smart/EduGuideStepOrderMapper.xml | 17 + .../smart/EduSmartWelcomeGuideMapper.xml | 25 + .../EduSmartWelcomeGuideRosterMapper.xml | 56 + ...uSmartWelcomeGuideRosterRelationMapper.xml | 42 + ...rtWelcomeGuideRosterRelationStepMapper.xml | 27 + .../EduSmartWelcomeGuideStepClassMapper.xml | 15 + .../EduSmartWelcomeGuideStepDormMapper.xml | 9 + .../smart/EduSmartWelcomeGuideStepMapper.xml | 5 + .../EduSmartWelcomeGuideStepStaffMapper.xml | 5 + ...ocessConfigApplicableDepartmentsMapper.xml | 5 + ...RequestProcessConfigApprovalUserMapper.xml | 5 + .../EduLeaveRequestProcessConfigMapper.xml | 42 + ...EduLeaveRequestProcessConfigViewMapper.xml | 5 + .../EduLeaveRequestProcessRecordMapper.xml | 5 + .../userLeave/EduLeaveRequestUserMapper.xml | 117 + .../EduLeaveRequestUserViewMapper.xml | 5 + .../template/固定宿舍学生导入模板.xlsx | Bin 0 -> 10105 bytes .../template/固定班级学生导入模板.xlsx | Bin 0 -> 10143 bytes .../resources/template/宿舍预选导入模板.xlsx | Bin 0 -> 10150 bytes .../resources/template/班级预选导入模板.xlsx | Bin 0 -> 10171 bytes .../resources/template/花名册导入模板.xls | Bin 0 -> 18432 bytes .../data/user/dto/CardErrorExportDTO.java | 33 + .../com/yida/data/user/dto/CardImportDTO.java | 36 + .../user/dto/ImportStaffInformationDTO.java | 25 + .../data/user/dto/ImportStudentTypeDTO.java | 25 + .../data/user/dto/ListStudentApplyDTO.java | 91 + .../data/user/dto/ListStudentApplyForDTO.java | 80 + .../com/yida/data/user/dto/ManagerDTO.java | 11 + .../yida/data/user/dto/OutPageStudentDTO.java | 32 + .../yida/data/user/dto/PageStudentDTO.java | 6 + .../yida/data/user/dto/StaffImportDTO.java | 77 + .../data/user/dto/StrategyPlanSaveDTO.java | 31 + .../user/dto/StrategyPlanTimeSaveDTO.java | 37 + .../yida/data/user/dto/StrategySaveDTO.java | 71 + .../user/dto/StrategySpecialDateSaveDTO.java | 41 + .../user/dto/StrategySpecialTimeSaveDTO.java | 37 + .../data/user/dto/StudentDormExportDTO.java | 40 + .../yida/data/user/dto/StudentExportDTO.java | 72 +- .../data/user/dto/WelcomeInviteImportDTO.java | 111 + .../dto/h5/ListUserDeptAttendanceDTO.java | 32 + .../RemoteFaceGroupDeviceServiceFallback.java | 35 + ...emoteFaceGroupStrategyServiceFallback.java | 31 + .../fallback/RemoteStaffServiceFallback.java | 31 + .../RemoteStudentApplyServiceFallback.java | 44 + .../RemoteStudentServiceFallback.java | 22 + .../RemoteTeacherServiceFallback.java | 9 +- .../RemoteUserDeptServiceFallback.java | 15 + .../RemoteUserDeviceServiceFallback.java | 10 + .../feign/RemoteFaceGroupDeviceService.java | 36 + .../feign/RemoteFaceGroupStrategyService.java | 19 + .../data/user/feign/RemoteStaffService.java | 63 +- .../user/feign/RemoteStudentApplyService.java | 28 + .../data/user/feign/RemoteStudentService.java | 35 + .../data/user/feign/RemoteTeacherService.java | 4 +- .../user/feign/RemoteUserDeptService.java | 31 +- .../user/feign/RemoteUserDeviceService.java | 30 + .../user/feign/RemoteUserFaceService.java | 9 + .../data/user/vo/ClassAttendanceDataVO.java | 55 + .../com/yida/data/user/vo/DeptManagetVO.java | 16 + .../com/yida/data/user/vo/DownLoadPicVO.java | 2 +- .../vo/DownLoadStaffAttendanceRecordVO.java | 35 + .../java/com/yida/data/user/vo/ManagerVo.java | 10 + .../yida/data/user/vo/OutPageStudentVO.java | 46 + .../com/yida/data/user/vo/StrategyInfoVO.java | 71 + .../yida/data/user/vo/StrategyPlanTimeVO.java | 48 + .../com/yida/data/user/vo/StrategyPlanVO.java | 40 + .../data/user/vo/StrategySpecialDateVO.java | 50 + .../data/user/vo/StrategySpecialTimeVO.java | 37 + .../user/vo/StudentApplyImportErrorVO.java | 13 + .../user/vo/StudentApplyImportProgressVO.java | 13 + .../data/user/vo/StudentApplyImportVO.java | 53 + .../data/user/vo/StudentApplyStatusVO.java | 15 + .../com/yida/data/user/vo/TeacherDeptVO.java | 8 + .../com/yida/data/user/vo/UserInfoVO.java | 10 +- .../main/resources/META-INF/spring.factories | 5 +- febs-server/edu-user/edu-user-biz/pom.xml | 2 +- .../data/user/config/ExcelConfiguration.java | 40 + .../data/user/config/ExportStudentClient.java | 91 + .../user/config/ExportStudentDormClient.java | 99 + .../user/controller/EduCourseController.java | 8 +- .../EduFaceGroupStrategyController.java | 41 + .../user/controller/EduStaffController.java | 240 +- .../controller/EduStudentApplyController.java | 148 ++ .../EduStudentApplyForController.java | 84 + .../user/controller/EduStudentController.java | 118 +- .../controller/EduStudentDormController.java | 35 +- .../controller/EduUserDeptController.java | 57 +- .../controller/EduUserDeviceController.java | 5 +- .../controller/EduUserFaceController.java | 25 +- .../controller/InEduUserDeptController.java | 52 +- .../controller/InEduUserDeviceController.java | 39 +- .../controller/InEduUserFaceController.java | 22 +- .../user/controller/InStaffController.java | 49 +- .../in/InEduFaceGroupDeviceController.java | 36 + .../in/InEduFaceGroupStrategyController.java | 37 + .../controller/in/InEduStaffController.java | 95 + .../in/InEduStudentApplyController.java | 53 + .../controller/in/InStudentController.java | 51 +- .../out/OutEduStudentController.java | 28 +- .../out/OutEduUserDeptController.java | 46 + .../WebEduSchoolWelcomeStudentController.java | 5 +- .../user/excel/CardDataDataExcelListener.java | 105 + .../excel/SelectStudentDormExportData.java | 46 + .../user/excel/SelectStudentExportData.java | 67 + .../user/excel/StaffDataExcelListener.java | 90 + .../listener/ImportStudentTypeListener.java | 108 + .../listener/importStudentApplyListener.java | 47 + .../data/user/mapper/EduFaceGroupMapper.java | 3 +- .../mapper/EduFaceGroupStrategyMapper.java | 22 + .../EduFaceGroupStrategyPlanMapper.java | 27 + .../EduFaceGroupStrategyPlanTimeMapper.java | 14 + ...EduFaceGroupStrategySpecialDateMapper.java | 27 + ...EduFaceGroupStrategySpecialTimeMapper.java | 14 + .../user/mapper/EduFaceGroupUserMapper.java | 10 +- .../yida/data/user/mapper/EduStaffMapper.java | 3 +- .../user/mapper/EduStudentApplyForMapper.java | 16 + .../user/mapper/EduStudentApplyMapper.java | 21 + .../data/user/mapper/EduStudentMapper.java | 33 +- .../user/mapper/EduTeacherDeptMapper.java | 22 +- .../service/EduFaceGroupDeviceService.java | 5 + .../user/service/EduFaceGroupService.java | 2 +- .../EduFaceGroupStrategyPlanService.java | 26 + .../EduFaceGroupStrategyPlanTimeService.java | 14 + .../service/EduFaceGroupStrategyService.java | 34 + ...duFaceGroupStrategySpecialDateService.java | 26 + ...duFaceGroupStrategySpecialTimeService.java | 13 + .../user/service/EduFaceGroupUserService.java | 16 +- .../EduSchoolStudentInformationService.java | 2 +- .../data/user/service/EduStaffService.java | 56 +- .../service/EduStudentApplyForService.java | 33 + .../user/service/EduStudentApplyService.java | 55 + .../user/service/EduStudentDormService.java | 16 + .../data/user/service/EduStudentService.java | 60 +- .../user/service/EduTeacherDeptService.java | 10 + .../data/user/service/EduUserDeptService.java | 41 +- .../service/ImportWelcomeStudentService.java | 19 +- .../data/user/service/QywxSyncService.java | 2 +- .../impl/EduFaceGroupDeviceServiceImpl.java | 78 +- .../service/impl/EduFaceGroupServiceImpl.java | 89 +- .../EduFaceGroupStrategyPlanServiceImpl.java | 32 + ...uFaceGroupStrategyPlanTimeServiceImpl.java | 26 + .../impl/EduFaceGroupStrategyServiceImpl.java | 241 ++ ...ceGroupStrategySpecialDateServiceImpl.java | 32 + ...ceGroupStrategySpecialTimeServiceImpl.java | 27 + .../impl/EduFaceGroupUserServiceImpl.java | 129 +- ...duSchoolStudentInformationServiceImpl.java | 4 +- .../service/impl/EduStaffServiceImpl.java | 1166 +++++--- .../impl/EduStudentApplyServiceForImpl.java | 137 + .../impl/EduStudentApplyServiceImpl.java | 426 +++ .../impl/EduStudentDormServiceImpl.java | 85 +- .../service/impl/EduStudentServiceImpl.java | 307 ++- .../service/impl/EduTeachDeptServiceImpl.java | 16 +- .../service/impl/EduUserDeptServiceImpl.java | 762 +++++- .../impl/EduUserDeviceFactoryServiceImpl.java | 8 +- .../service/impl/EduUserFaceServiceImpl.java | 149 +- .../impl/ImportWelcomeStudentServiceImpl.java | 300 ++- .../service/impl/QywxSyncServiceImpl.java | 231 +- .../src/main/resources/bootstrap.yml | 1 + .../resources/mapper/EduFaceGroupMapper.xml | 97 +- .../mapper/EduFaceGroupStrategyMapper.xml | 18 + .../mapper/EduFaceGroupStrategyPlanMapper.xml | 46 + .../EduFaceGroupStrategyPlanTimeMapper.xml | 5 + .../EduFaceGroupStrategySpecialDateMapper.xml | 45 + .../EduFaceGroupStrategySpecialTimeMapper.xml | 5 + .../mapper/EduFaceGroupUserMapper.xml | 339 +-- .../resources/mapper/EduStaffDeptMapper.xml | 1 + .../main/resources/mapper/EduStaffMapper.xml | 735 ++--- .../mapper/EduStudentApplyForMapper.xml | 35 + .../mapper/EduStudentApplyMapper.xml | 59 + .../resources/mapper/EduStudentMapper.xml | 154 +- .../resources/mapper/EduTeacherDeptMapper.xml | 12 + .../mapper/EduUserDeviceFactoryMapper.xml | 6 +- .../template/学生基础信息导入模板.xls | Bin 0 -> 36352 bytes .../template/学生开通应用导入模板.xls | Bin 0 -> 19968 bytes .../resources/template/校园卡号导入模板.xls | Bin 0 -> 19456 bytes febs-server/febs-server-generator/Dockerfile | 7 + febs-server/febs-server-generator/pom.xml | 35 + febs-server/febs-server-generator/run.sh | 4 + .../FebsServerGeneratorApplication.java | 24 + .../controller/GeneratorConfigController.java | 45 + .../controller/GeneratorController.java | 111 + .../server/generator/entity/FieldType.java | 13 + .../generator/helper/GeneratorHelper.java | 149 ++ .../mapper/GeneratorConfigMapper.java | 11 + .../generator/mapper/GeneratorMapper.java | 60 + .../service/GeneratorConfigService.java | 25 + .../generator/service/GeneratorService.java | 55 + .../impl/GeneratorConfigServiceImpl.java | 34 + .../service/impl/GeneratorServiceImpl.java | 49 + .../resources/ValidationMessages.properties | 6 + .../src/main/resources/banner.txt | 9 + .../src/main/resources/bootstrap.yml | 27 + .../generator/templates/controller.ftl | 33 + .../resources/generator/templates/entity.ftl | 100 + .../resources/generator/templates/mapper.ftl | 14 + .../generator/templates/mapperXml.ftl | 5 + .../resources/generator/templates/service.ftl | 18 + .../generator/templates/serviceImpl.ftl | 32 + .../main/resources/mapper/GeneratorMapper.xml | 58 + .../febs-server-job-biz/pom.xml | 2 +- .../yida/data/job/task/AttendanceTask.java | 61 +- .../java/com/yida/data/job/task/BillTask.java | 2 +- .../com/yida/data/job/task/ConsumeTask.java | 32 + .../com/yida/data/job/task/GuideTask.java | 27 + .../yida/data/job/task/ProductUpdateTask.java | 2 + .../java/com/yida/data/job/task/UserTask.java | 18 + .../com/yida/data/system/dto/ListLogDTO.java | 5 + .../system/dto/QywxCallbackHandleDTO.java | 58 + .../data/system/dto/SchoolInformationDTO.java | 2 +- .../fallback/RemoteAppServiceFallback.java | 12 + .../RemoteBaiDuApiConfigServiceFallback.java | 33 + .../RemoteBaseAppServiceFallback.java | 24 + ...eConstructionPayConfigServiceFallback.java | 33 + .../RemoteConsumeConfigServiceFallback.java | 31 + .../RemoteDeptFunctionServiceFallback.java | 31 + .../fallback/RemoteDeptUserviceFallback.java | 10 + .../fallback/RemoteQywxServiceFallback.java | 38 + .../RemoteUPayConfigServiceFallback.java | 31 + .../RemoteWhiteListServiceFallback.java | 31 + .../data/system/feign/RemoteAppService.java | 9 + .../feign/RemoteBaiDuApiConfigService.java | 23 + .../system/feign/RemoteBaseAppService.java | 17 + .../RemoteConstructionPayConfigService.java | 19 + .../feign/RemoteConsumeConfigService.java | 17 + .../feign/RemoteDeptFunctionService.java | 27 + .../data/system/feign/RemoteDeptService.java | 29 +- .../data/system/feign/RemoteDictService.java | 24 + .../data/system/feign/RemoteQywxService.java | 40 + .../system/feign/RemoteUPayConfigService.java | 17 + .../system/feign/RemoteWhiteListService.java | 25 + .../main/resources/META-INF/spring.factories | 9 +- .../yida/data/system/aes/WXBizMsgCrypt.java | 51 +- .../system/configure/InitializeRunner.java | 74 +- .../configure/QywxHandleRabbitReceiver.java | 70 + .../data/system/configure/RabbitConfig.java | 26 +- .../system/configure/SysRabbitReceiver.java | 4 - .../system/controller/CommonController.java | 23 +- .../system/controller/DeptController.java | 60 +- .../system/controller/DictController.java | 24 +- .../controller/EduBaseAppController.java | 34 + .../EduInstructionsContentController.java | 22 +- .../EduInstructionsTypeController.java | 8 +- .../InBaiDuApiConfigController.java | 42 + .../InBaseDeptHomeAppController.java | 37 + .../InConstructionPayConfigController.java | 39 + .../controller/InConsumeConfigController.java | 38 + .../system/controller/InDeptController.java | 49 +- .../controller/InDeptFunctionController.java | 37 + .../system/controller/InDictController.java | 65 + .../system/controller/InEduAppController.java | 22 + .../system/controller/InQywxController.java | 133 +- .../controller/InUPayConfigController.java | 38 + .../system/controller/InUserController.java | 18 +- .../controller/InWhiteListController.java | 35 + .../system/controller/LoginLogController.java | 6 +- .../system/controller/MenuController.java | 23 +- .../system/controller/OutDeptController.java | 14 - .../system/controller/RoleController.java | 10 +- .../system/controller/UserController.java | 32 +- .../system/mapper/BaiduApiConfigMapper.java | 14 + .../mapper/ConstructionPayConfigMapper.java | 14 + .../mapper/DeptSchoolInformationMapper.java | 19 +- .../system/mapper/EduAppTemplateMapper.java | 14 + .../data/system/mapper/EduBaseAppMapper.java | 14 + .../system/mapper/EduConsumeConfigMapper.java | 14 + .../system/mapper/EduDeptFunctionMapper.java | 14 + .../mapper/EduQywxServiceProviderMapper.java | 14 + .../EduQywxServiceProviderSchoolMapper.java | 14 + .../yida/data/system/mapper/MenuMapper.java | 11 + .../data/system/mapper/UPayConfigMapper.java | 14 + .../yida/data/system/mapper/UserMapper.java | 2 + .../data/system/mapper/WhiteListMapper.java | 14 + .../system/service/BaiduApiConfigService.java | 13 + .../data/system/service/CommonService.java | 21 + .../service/ConstructionPayConfigService.java | 15 + .../system/service/EduAppTemplateService.java | 14 + .../system/service/EduBaseAppService.java | 13 + .../service/EduConsumeConfigService.java | 14 + .../service/EduDeptFunctionService.java | 13 + .../EduQywxServiceProviderSchoolService.java | 14 + .../EduQywxServiceProviderService.java | 14 + .../data/system/service/IDeptService.java | 23 +- .../data/system/service/IMenuService.java | 3 +- .../data/system/service/IUserService.java | 13 + .../yida/data/system/service/LogService.java | 19 +- .../system/service/QywxCallbackService.java | 15 +- .../system/service/QywxHandleService.java | 39 + .../yida/data/system/service/QywxService.java | 10 + .../service/QywxServiceProviderService.java | 104 + .../system/service/UPayConfigService.java | 14 + .../data/system/service/WhiteListService.java | 14 + .../impl/BaiduApiConfigServiceImpl.java | 25 + .../service/impl/CommonServiceImpl.java | 91 +- .../ConstructionPayConfigServiceImpl.java | 27 + .../DeptSchoolInformationServiceImpl.java | 18 +- .../system/service/impl/DeptServiceImpl.java | 354 +-- .../impl/EduAppTemplateServiceImpl.java | 24 + .../service/impl/EduBaseAppServiceImpl.java | 26 + .../impl/EduConsumeConfigServiceImpl.java | 25 + .../impl/EduDeptFunctionServiceImpl.java | 25 + ...uQywxServiceProviderSchoolServiceImpl.java | 26 + .../EduQywxServiceProviderServiceImpl.java | 24 + .../system/service/impl/MenuServiceImpl.java | 20 +- .../service/impl/QywxCallbackServiceImpl.java | 333 +-- .../service/impl/QywxHandleServiceImpl.java | 246 ++ .../system/service/impl/QywxServiceImpl.java | 225 +- .../impl/QywxServiceProviderServiceImpl.java | 371 +++ .../system/service/impl/RoleServiceImpl.java | 7 +- .../impl/SystemUserMenuServiceImpl.java | 61 +- .../service/impl/UPayConfigServiceImpl.java | 25 + .../system/service/impl/UserServiceImpl.java | 168 +- .../service/impl/WhiteListServiceImpl.java | 25 + .../mapper/DeptSchoolInformationMapper.xml | 520 ++-- .../resources/mapper/EduBaseAppMapper.xml | 5 + .../mapper/EduConsumeConfigMapper.xml | 5 + .../mapper/EduDeptFunctionMapper.xml | 5 + .../EduSchoolInquireCommonQuestionMapper.xml | 106 +- .../src/main/resources/mapper/MenuMapper.xml | 88 +- .../resources/mapper/UPayConfigMapper.xml | 5 + .../src/main/resources/mapper/UserMapper.xml | 20 +- .../main/resources/mapper/WhiteListMapper.xml | 5 + febs-server/pom.xml | 3 + 1198 files changed, 72566 insertions(+), 3763 deletions(-) create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/ErrorRecordMsg.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/applyForm/CoreApplyForm.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/applyForm/CoreApplyFormApprovalProcess.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/applyForm/CoreApplyFormFillUser.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/applyForm/CoreApplyFormFillUserApprovalProcess.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/applyForm/CoreApplyFormFillUserApprovalProcessRecord.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/applyForm/CoreApplyFormItem.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/applyForm/CoreApplyFormItemChildren.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/applyForm/CoreApprovalProcess.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/applyForm/CoreApprovalProcessUser.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/applyForm/CoreApprovalRemind.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/applyForm/CoreOfficialSeal.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/EduAttendanceResultPushReportRecord.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/EduUserStrategy.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/attendance/AttendanceRecord.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/attendance/AttendanceReportPushRecord.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/attendance/AttendanceReportStrategy.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/attendance/AttendanceResult.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/attendance/AttendanceRule.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/attendance/AttendanceRuleAddress.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/attendance/AttendanceRuleAdmin.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/attendance/AttendanceRuleDevice.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/attendance/AttendanceRuleObj.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/attendance/AttendanceRuleObjUser.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/attendance/AttendanceRuleRemind.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/attendance/AttendanceRuleSpecialDate.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/attendance/AttendanceRuleTime.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/attendance/AttendanceRuleWhiteList.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/attendance/AttendanceRuleWifi.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/classCall/EduClassCall.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/classCall/EduClassCallPushConfig.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/classCall/EduClassCallPushConfigProcess.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/classCall/EduClassCallPushConfigProcessStaff.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/classCall/EduClassCallStudentRecord.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/constant/ConstructionPayConstant.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/constant/ConsumeConstant.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/constant/NoticeTypeConstant.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/constant/QywxServiceProviderConstant.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/constant/UPayConstant.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/constant/hq/HaiqingCallbackCodeConstant.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/constant/hq/HaiqingConstant.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/consume/DeptConsumeTerminalCache.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/consume/EduConsumeConfig.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/consume/EduConsumeDevice.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/consume/EduConsumeOrder.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/consume/EduConsumeOrderRefund.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/consume/EduConsumeOrderStudent.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/consume/EduConsumeRecord.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/consume/EduStudentConsumeCard.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/consume/Recharge.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/dashboard/EduSchoolDashboardData.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/notice/qywx/TemplateCardStaffNotice.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/notice/qywx/TextCardStaffNotice.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/notice/qywx/inside/TemplateCardNotice.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/notice/qywx/inside/TextCard.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/notice/qywx/inside/templateCard/CardAction.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/notice/qywx/inside/templateCard/HorizontalContent.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/notice/qywx/inside/templateCard/Jump.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/notice/qywx/inside/templateCard/MainTitle.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/notice/qywx/inside/templateCard/textNotice.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/pay/ConstructionPayOrder.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/pay/UPayOrder.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/pay/URefund.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/school/EduDeptHomeApp.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/school/EduSchoolFunctionConfig.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/screen/EduSchoolDashboardData.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/screen/EduSchoolDashboardDataBase.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/screen/EduSchoolDashboardDataTeacher.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/ConstructionPayNotifyDTO.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/EduGuideStepOrder.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/EduSmartWelcomeCampus.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/EduSmartWelcomeDepartment.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/EduSmartWelcomeGuide.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/EduSmartWelcomeGuideClassRecord.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/EduSmartWelcomeGuideDormRecord.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/EduSmartWelcomeGuideRoster.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/EduSmartWelcomeGuideRosterRelation.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/EduSmartWelcomeGuideRosterRelationStep.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/EduSmartWelcomeGuideStep.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/EduSmartWelcomeGuideStepClass.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/EduSmartWelcomeGuideStepClassFix.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/EduSmartWelcomeGuideStepDorm.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/EduSmartWelcomeGuideStepDormFix.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/EduSmartWelcomeGuideStepStaff.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/BaiduApiConfig.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/ConstructionPayConfig.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/EduAppTemplate.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/EduBaseApp.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/EduDeptFunction.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/EduQywxServiceProvider.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/EduQywxServiceProviderSchool.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/UPayConfig.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/WhiteList.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/enums/SchoolNatureEnum.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/enums/SysFunctionEnum.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/user/EduFaceGroupStrategy.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/user/EduFaceGroupStrategyPlan.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/user/EduFaceGroupStrategyPlanTime.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/user/EduFaceGroupStrategySpecialDate.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/user/EduFaceGroupStrategySpecialTime.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/user/EduStudentApply.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/user/EduStudentApplyFor.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/user/enums/StudentStatusEnum.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/user/enums/StudentTypeEnum.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/userLeave/EduLeaveRequestProcessConfig.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/userLeave/EduLeaveRequestProcessConfigApplicableDepartments.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/userLeave/EduLeaveRequestProcessConfigApprovalUser.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/userLeave/EduLeaveRequestProcessConfigView.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/userLeave/EduLeaveRequestProcessRecord.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/userLeave/EduLeaveRequestUser.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/userLeave/EduLeaveRequestUserView.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/AppTypeEnum.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/ApprovalRoleTypeEnum.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/AuditStatusEnum.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/BaiDuModuleEnum.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/ConstructionTradeStateEnum.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/FileDealStatusEnum.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/GuideStepTypeEnum.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/IssuedTypeEnum.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/QywxAppTypeEnum.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/QywxCallbackTypeEnum.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/RecordTypeEnum.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/RegistrationStatusEnum.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/SchoolFunctionCode.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/StaffAttendanceResultEnum.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/UPayNotifyResultEnum.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/UPayTradeStateEnum.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/UserTypeEnum.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/attendance/AttendanceModeTypeEnum.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/attendance/AttendanceNextDayEnum.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/attendance/AttendanceReportTypeEnum.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/attendance/AttendanceResultEnum.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/attendance/AttendanceStrategyTypeEnum.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/attendance/AttendanceTypeEnum.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/attendance/AttendanceUserTypeEnum.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/attendance/AttendanceWifiStatusEnum.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/leave/ApprovalResultEnum.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/leave/AuditModeEnum.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/leave/LeaveRequestTypeEnum.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/school/DeptAppTypeEnum.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/school/FunctionConfigCode.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/system/MenuShowType.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/file/IExportExcelClient.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/file/IExportLargeClient.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/file/common/DownloadFileChunk.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/file/common/export/ExportExcelData.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/file/common/export/ExportLargeData.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/file/common/export/SelectExportData.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/BaiDuUtil.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/ConstructionPayUtil.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/ConsumeUtil.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/ThreadPoolUtil.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/UPayUtil.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/WxServiceProviderUtil.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/construction/ABAProvider.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/construction/DER.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/construction/RSAPubKey.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/construction/RSASig.java create mode 100644 febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/file/ChunkUtil.java create mode 100644 febs-server/attendance/attendance-api/pom.xml create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AddAttendanceRecordDTO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AddAttendanceReportStrategyDTO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AddAttendanceRuleAddressDTO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AddAttendanceRuleAdminDTO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AddAttendanceRuleDTO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AddAttendanceRuleDeviceDTO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AddAttendanceRuleObjDTO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AddAttendanceRuleRemindDTO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AddAttendanceRuleSpecialDateDTO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AddAttendanceRuleTimeDTO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AddAttendanceRuleWhiteListDTO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AddAttendanceRuleWifiDTO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AddLeaveRequestStrategyDTO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AttendanceCountPageDTO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AttendanceDayReportDTO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AttendanceFaceMatchDTO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AttendanceResultByDayDTO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AttendanceResultByStartAndEndTimeDTO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AttendanceRuleAdminUserAddDTO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AttendanceRuleAdminUserPageDTO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AttendanceRuleUserAddDTO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AttendanceRuleUserPageDTO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AttendanceStatusByMonthDTO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AttendanceUserCheckInDTO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/BssidImportDTO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/DayReportDataDTO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/DealRecordDTO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/DevicePage.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/H5AttendanceRuleWifiDTO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/IssuedFaceDTO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/ListErrorRecordDTO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/ManageListUserDTO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/PageAttendanceRecordDTO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/PageAttendanceRuleDTO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/RemoveFaceDTO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/UpdateAttendanceRuleStatusDTO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/fallback/RemoteAttendanceDeviceServiceFallback.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/fallback/RemoteAttendanceResultServiceFallback.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/fallback/RemoteAttendanceStrategyServiceFallback.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/fallback/RemoteUserStrategyServiceFallback.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/feign/RemoteAttendanceDeviceService.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/feign/RemoteAttendanceResultService.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/feign/RemoteAttendanceStrategyService.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/feign/RemoteUserStrategyService.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/AttdanceResultDetailVO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/AttdanceResultTotalVO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/AttdanceResultVO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/AttendanceFaceMatchVO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/AttendanceRecordExcelVO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/AttendanceRuleAdminUserVO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/AttendanceRuleUserVO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/AttendanceRuleVO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/AttendanceStatusByMonthVO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/AttendanceUserCheckInVO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/AttendanceWifiVO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/ConflictRuleVO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/DateStatusVO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/DayReportDataVO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/DetailVO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/DeviceNumberVO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/DeviceOrDeviceGroupVO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/DeviceVO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/DownLoadAttendanceResultVO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/ImportBssidDataVO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/ManageListUserAttendanceDetailTotalVO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/ManageListUserAttendanceDetailVO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/ManageListUserVO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/OnlineCountVO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/StaRecordCountVO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/StaffIdentityVO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/StudentDormAttendanceDayReportExcelVO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/StudentDormAttendanceResultExcelVO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/StudentDormAttendanceResultTotalExcelVO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/UserAttendanceResultByDayVO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/UserAttendanceResultByTimeSlotVO.java create mode 100644 febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/UserAttendanceResultDayAndNumVO.java create mode 100644 febs-server/attendance/attendance-api/src/main/resources/META-INF/spring.factories create mode 100644 febs-server/attendance/attendance-biz/pom.xml create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/AttendanceApplication.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/configure/ActiveMqConfigure.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/configure/ThreadPollConfigure.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/constant/MqttConstant.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/controller/AttendanceDeviceController.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/controller/AttendanceDeviceGroupController.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/controller/AttendanceRecordController.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/controller/AttendanceReportStrategyController.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/controller/AttendanceResultController.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/controller/AttendanceRuleController.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/controller/EduAttendanceStrategyController.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/controller/H5/H5AttendanceRecordController.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/controller/H5/H5AttendanceRuleController.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/controller/in/InAttendanceResultController.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/controller/in/InEduAttendanceDeviceController.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/controller/in/InEduUserStrategyController.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/controller/in/InH5AttendanceRuleController.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/excel/BssidExcelListener.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/AttendanceRecordMapper.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/AttendanceReportPushRecordMapper.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/AttendanceReportStrategyMapper.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/AttendanceResultMapper.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/AttendanceRuleAddressMapper.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/AttendanceRuleAdminMapper.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/AttendanceRuleDeviceMapper.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/AttendanceRuleMapper.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/AttendanceRuleObjMapper.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/AttendanceRuleObjUserMapper.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/AttendanceRuleRemindMapper.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/AttendanceRuleSpecialDateMapper.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/AttendanceRuleTimeMapper.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/AttendanceRuleWhiteListMapper.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/AttendanceRuleWifiMapper.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/EduAttendanceDeviceGroupMapper.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/EduAttendanceDeviceMapper.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/EduDeviceGroupMapper.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/EduUserStrategyMapper.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/repository/ErrorRecordMsgRepository.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/repository/ReceiveMsgRepository.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceCheckInService.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceRecordService.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceReportPushRecordService.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceReportStrategyService.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceResultService.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceRuleAddressService.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceRuleAdminService.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceRuleDeviceService.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceRuleObjService.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceRuleObjUserService.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceRuleRemindService.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceRuleService.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceRuleSpecialDateService.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceRuleTimeService.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceRuleWhiteListService.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceRuleWifiService.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/EduAttendanceDeviceGroupService.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/EduAttendanceDeviceService.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/EduAttendanceStrategyService.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/EduDeviceGroupService.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/EduUserStrategyService.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/ErrorRecordMsgService.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/NoticeService.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceCheckInServiceImpl.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceRecordServiceImpl.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceReportPushRecordServiceImpl.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceReportStrategyServiceImpl.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceResultServiceImpl.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceRuleAddressServiceImpl.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceRuleAdminServiceImpl.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceRuleDeviceServiceImpl.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceRuleObjServiceImpl.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceRuleObjUserServiceImpl.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceRuleRemindServiceImpl.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceRuleServiceImpl.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceRuleSpecialDateServiceImpl.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceRuleTimeServiceImpl.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceRuleWhiteListServiceImpl.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceRuleWifiServiceImpl.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/EduAttendanceDeviceGroupServiceImpl.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/EduAttendanceDeviceServiceImpl.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/EduAttendanceStrategyServiceImpl.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/EduDeviceGroupServiceImpl.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/EduUserStrategyServiceImpl.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/ErrorRecordMsgServiceImpl.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/HaiqingCallbackService.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/NoticeServiceImpl.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/utils/FormUtil.java create mode 100644 febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/utils/MqttUtil.java create mode 100644 febs-server/attendance/attendance-biz/src/main/resources/banner.txt create mode 100644 febs-server/attendance/attendance-biz/src/main/resources/bootstrap.yml create mode 100644 febs-server/attendance/attendance-biz/src/main/resources/mapper/AttendanceRecordMapper.xml create mode 100644 febs-server/attendance/attendance-biz/src/main/resources/mapper/AttendanceResultMapper.xml create mode 100644 febs-server/attendance/attendance-biz/src/main/resources/mapper/AttendanceRuleAddressMapper.xml create mode 100644 febs-server/attendance/attendance-biz/src/main/resources/mapper/AttendanceRuleAdminMapper.xml create mode 100644 febs-server/attendance/attendance-biz/src/main/resources/mapper/AttendanceRuleDeviceMapper.xml create mode 100644 febs-server/attendance/attendance-biz/src/main/resources/mapper/AttendanceRuleMapper.xml create mode 100644 febs-server/attendance/attendance-biz/src/main/resources/mapper/AttendanceRuleObjMapper.xml create mode 100644 febs-server/attendance/attendance-biz/src/main/resources/mapper/AttendanceRuleRemindMapper.xml create mode 100644 febs-server/attendance/attendance-biz/src/main/resources/mapper/AttendanceRuleSpecialDateMapper.xml create mode 100644 febs-server/attendance/attendance-biz/src/main/resources/mapper/AttendanceRuleTimeMapper.xml create mode 100644 febs-server/attendance/attendance-biz/src/main/resources/mapper/AttendanceRuleWhiteListMapper.xml create mode 100644 febs-server/attendance/attendance-biz/src/main/resources/mapper/AttendanceRuleWifiMapper.xml create mode 100644 febs-server/attendance/attendance-biz/src/main/resources/mapper/EduAttendanceDeviceGroupMapper.xml create mode 100644 febs-server/attendance/attendance-biz/src/main/resources/mapper/EduAttendanceDeviceMapper.xml create mode 100644 febs-server/attendance/pom.xml create mode 100644 febs-server/edu-common/src/main/java/com/yida/data/common/excel/DefaultExportExcelClient.java create mode 100644 febs-server/edu-common/src/main/java/com/yida/data/common/excel/DefaultExportLargeClient.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/ApplyFormDataInputDTO.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/ApplyFormFillSelectPageDTO.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/ApplyFormFillUserDataDTO.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/ApplyFormSelectPageDTO.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/ApprovalFillUserFormPageDTO.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/ApprovalProcessSelectPageDTO.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/ApprovalRemindDTO.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/AuditFormDTO.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/FormFillUserPageDTO.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/H5ApplyFormSelectPageDTO.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/OfficialSealSaveDTO.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/OfficialSealSelectPageDTO.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/SaveFormProcessDTO.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/SelectApprovalApplyFormDataListDTO.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/SendParentNoticeDTO.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/SendStaffNoticeDTO.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/vo/apply/ApplyFormFillSelectPageVO.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/vo/apply/ApplyFormFillUserDataVO.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/vo/apply/ApplyFormInfoVO.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/vo/apply/ApplyFormProcessSelectVO.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/vo/apply/ApplyFormSelectPageVO.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/vo/apply/ApprovalApplyFormPageVO.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/vo/apply/ApprovalProcessInfoVO.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/vo/apply/ApprovalProcessSelectPageVO.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/vo/apply/ApprovalRemindInfoVO.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/vo/apply/MyApplyFormPageVO.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/vo/apply/OfficialSealInfoVO.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/vo/apply/OfficialSealSelectPageVO.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/EduCustomFormApplication.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/controller/CoreApplyFormController.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/controller/CoreApplyFormFillController.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/controller/CoreApprovalProcessController.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/controller/CoreApprovalRemindController.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/controller/CoreOfficialSealController.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/controller/app/AppApplyFormController.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/mapper/AppApplyFormMapper.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/mapper/ApplyFormDataMapper.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/mapper/CoreApplyFormApprovalProcessMapper.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/mapper/CoreApplyFormFillUserApprovalProcessMapper.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/mapper/CoreApplyFormFillUserApprovalProcessRecordMapper.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/mapper/CoreApplyFormFillUserMapper.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/mapper/CoreApplyFormItemChildrenMapper.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/mapper/CoreApplyFormItemMapper.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/mapper/CoreApplyFormMapper.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/mapper/CoreApprovalProcessMapper.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/mapper/CoreApprovalProcessUserMapper.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/mapper/CoreApprovalRemindMapper.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/mapper/CoreOfficialSealMapper.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/AppApplyFormService.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/ApplyFormDataService.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/CoreApplyFormApprovalProcessService.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/CoreApplyFormFillUserApprovalProcessRecordService.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/CoreApplyFormFillUserApprovalProcessService.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/CoreApplyFormFillUserService.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/CoreApplyFormItemChildrenService.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/CoreApplyFormItemService.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/CoreApplyFormService.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/CoreApprovalProcessService.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/CoreApprovalProcessUserService.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/CoreApprovalRemindService.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/CoreOfficialSealService.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/SendNoticeService.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/impl/AppApplyFormServiceImpl.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/impl/ApplyFormDataServiceImpl.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/impl/CoreApplyFormApprovalProcessServiceImpl.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/impl/CoreApplyFormFillUserApprovalProcessRecordServiceImpl.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/impl/CoreApplyFormFillUserApprovalProcessServiceImpl.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/impl/CoreApplyFormFillUserServiceImpl.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/impl/CoreApplyFormItemChildrenServiceImpl.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/impl/CoreApplyFormItemServiceImpl.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/impl/CoreApplyFormServiceImpl.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/impl/CoreApprovalProcessServiceImpl.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/impl/CoreApprovalProcessUserServiceImpl.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/impl/CoreApprovalRemindServiceImpl.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/impl/CoreOfficialSealServiceImpl.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/impl/SendNoticeServiceImpl.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/controller/CoreCustomFormAuthController.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/controller/CoreCustomFormController.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/controller/CoreCustomFormDataController.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/controller/CoreCustomFormGroupController.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/controller/CoreCustomFormModelController.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/controller/CoreCustomFormTypeController.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/controller/InCoreCustomFormController.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/controller/app/AppCustomFormController.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/entity/FormDataReturn.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/entity/RedisKey.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormAuthMapper.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormAuthRelationFormMapper.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormDataMapper.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormGroupMapper.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormItemChildrenMapper.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormItemsMapper.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormMapper.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormModelItemChildrenMapper.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormModelItemsMapper.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormModelMapper.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormRelationAdminMapper.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormRelationUserMapper.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormRelationUserParentMapper.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormStatisticMapper.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormTopicalMapper.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormTypeMapper.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormAuthRelationFormService.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormAuthService.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormDataService.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormGroupService.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormItemChildrenService.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormItemsService.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormModelItemChildrenService.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormModelItemsService.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormModelService.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormRelationAdminService.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormRelationUserParentService.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormRelationUserService.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormService.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormStatisticService.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormTopicalService.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormTypeService.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormAuthRelationFormServiceImpl.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormAuthServiceImpl.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormDataServiceImpl.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormGroupServiceImpl.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormItemChildrenServiceImpl.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormItemsServiceImpl.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormModelItemChildrenServiceImpl.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormModelItemsServiceImpl.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormModelServiceImpl.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormRelationAdminServiceImpl.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormRelationUserParentServiceImpl.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormRelationUserServiceImpl.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormServiceImpl.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormStatisticServiceImpl.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormTopicalServiceImpl.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormTypeServiceImpl.java create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/apply/AppApplyFormMapper.xml create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/apply/ApplyFormDataMapper.xml create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/apply/CoreApplyFormApprovalProcessMapper.xml create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/apply/CoreApplyFormFillUserMapper.xml create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/apply/CoreApplyFormMapper.xml create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/apply/CoreApprovalProcessMapper.xml create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/apply/CoreOfficialSealMapper.xml create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormAuthAdminMapper.xml create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormAuthMapper.xml create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormDataMapper.xml create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormGroupMapper.xml create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormGroupRelationFormMapper.xml create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormItemChildrenMapper.xml create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormItemsMapper.xml create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormMapper.xml create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormModelItemChildrenMapper.xml create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormModelItemsMapper.xml create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormModelMapper.xml create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormRelationAdminMapper.xml create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormRelationUserMapper.xml create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormRelationUserParentMapper.xml create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormStatisticMapper.xml create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormTopicalMapper.xml create mode 100644 febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormTypeMapper.xml create mode 100644 febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/dto/consume/ConsumeOrderPageDTO.java create mode 100644 febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/dto/consume/CreateConsumeOrderDTO.java create mode 100644 febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/dto/consume/H5ConsumeOrderPageDTO.java create mode 100644 febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/dto/consume/H5ConsumeRecordPageDTO.java create mode 100644 febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/fallback/RemoteConsumeCardServiceFallback.java create mode 100644 febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/fallback/RemoteConsumeOrderServiceFallback.java create mode 100644 febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/feign/consume/RemoteConsumeCardService.java create mode 100644 febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/feign/consume/RemoteConsumeOrderService.java create mode 100644 febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/vo/consume/ConsumeDeviceVO.java create mode 100644 febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/vo/consume/ConsumeOrderPageVO.java create mode 100644 febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/vo/consume/ConsumeOrderStudentCacheVO.java create mode 100644 febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/vo/consume/ConsumePayInfoVO.java create mode 100644 febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/vo/consume/ConsumeRefundOrderVO.java create mode 100644 febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/vo/consume/ConsumeVipVO.java create mode 100644 febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/vo/consume/H5ConsumeOrderPageVO.java create mode 100644 febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/vo/consume/H5ConsumeRecordPageVO.java create mode 100644 febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/controller/EduConsumeDeviceController.java create mode 100644 febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/controller/EduConsumeOrderController.java create mode 100644 febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/controller/EduStudentConsumeCardController.java create mode 100644 febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/controller/H5ConsumeController.java create mode 100644 febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/controller/InEduConsumeOrderController.java create mode 100644 febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/controller/out/OutConsumeController.java create mode 100644 febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/mapper/EduConsumeDeviceMapper.java create mode 100644 febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/mapper/EduConsumeOrderMapper.java create mode 100644 febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/mapper/EduConsumeOrderRefundMapper.java create mode 100644 febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/mapper/EduConsumeOrderStudentMapper.java create mode 100644 febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/mapper/EduConsumeRecordMapper.java create mode 100644 febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/mapper/EduStudentConsumeCardMapper.java create mode 100644 febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/service/EduConsumeDeviceService.java create mode 100644 febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/service/EduConsumeOrderRefundService.java create mode 100644 febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/service/EduConsumeOrderService.java create mode 100644 febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/service/EduConsumeOrderStudentService.java create mode 100644 febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/service/EduConsumeRecordService.java create mode 100644 febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/service/EduStudentConsumeCardService.java create mode 100644 febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/service/H5ConsumeService.java create mode 100644 febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/service/impl/EduConsumeDeviceServiceImpl.java create mode 100644 febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/service/impl/EduConsumeOrderRefundServiceImpl.java create mode 100644 febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/service/impl/EduConsumeOrderServiceImpl.java create mode 100644 febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/service/impl/EduConsumeOrderStudentServiceImpl.java create mode 100644 febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/service/impl/EduConsumeRecordServiceImpl.java create mode 100644 febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/service/impl/EduStudentConsumeCardServiceImpl.java create mode 100644 febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/service/impl/H5ConsumeServiceImpl.java create mode 100644 febs-server/edu-device/edu-device-biz/src/main/resources/mapper/consume/EduConsumeDeviceMapper.xml create mode 100644 febs-server/edu-device/edu-device-biz/src/main/resources/mapper/consume/EduConsumeOrderMapper.xml create mode 100644 febs-server/edu-device/edu-device-biz/src/main/resources/mapper/consume/EduConsumeOrderRefundMapper.xml create mode 100644 febs-server/edu-device/edu-device-biz/src/main/resources/mapper/consume/EduConsumeOrderStudentMapper.xml create mode 100644 febs-server/edu-device/edu-device-biz/src/main/resources/mapper/consume/EduConsumeRecordMapper.xml create mode 100644 febs-server/edu-device/edu-device-biz/src/main/resources/mapper/consume/EduStudentConsumeCardMapper.xml create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/classCall/ClassCallAddDTO.java create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/classCall/ClassCallPageDTO.java create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/classCall/StudentDTO.java create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/config/EduSchoolFunctionConfigDTO.java create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/index/SaveDeptHomeAppDTO.java create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/screen/SchoolDashboardBaseSaveDTO.java create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/screen/SchoolDashboardSaveDTO.java create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/screen/SchoolDashboardTeacherSaveDTO.java create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/AddUploadFileStepDTO.java create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/ClassFixImportDTO.java create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/ClassImportDTO.java create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/CustomDormImportDTO.java create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/DormImportDTO.java create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/DormImportFixDTO.java create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/GuideFillInfoSaveDTO.java create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/GuideRosterErrorExportDTO.java create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/GuideRosterImportDTO.java create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/GuideRosterSelectPageDTO.java create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/GuideSaveDTO.java create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/GuideSelectPageDTO.java create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/GuideStepSaveDTO.java create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/StaffPassStepDTO.java create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/UpdateQrCodeInfoDTO.java create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/h5/CreateGuideStepOrderDTO.java create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/h5/RosterFaceMatchDTO.java create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/h5/RosterPageDTO.java create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/transaction/ListApplyFunctionDTO.java create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/userLeave/AuditRequestDTO.java create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/userLeave/EduLeaveRequestProcessConfigDTO.java create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/userLeave/LeaveRequestPageDTO.java create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/userLeave/ListUserRequestDTO.java create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/userLeave/SendStaffNoticeDTO.java create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/fallback/index/RemoteDeptHomeInfoServiceFallback.java create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/fallback/schoolConfig/RemoteEduSchoolFuncationConfigServiceFallback.java create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/fallback/smart/RemoteSmartWelcomeServiceFallback.java create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/feign/index/RemoteDeptHomeIndexService.java create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/feign/schoolConfig/RemoteEduSchoolFuncationConfigService.java create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/feign/smart/RemoteSmartWelcomeService.java create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/classCall/ClassCallPushConfigPageInfoVO.java create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/screen/SchoolDashboardInfoVO.java create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/ClassFixImportVO.java create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/ClassImportVO.java create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/DormImportFixVO.java create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/DormImportVO.java create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/ExportRosterDataVO.java create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/GuideInfoVO.java create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/GuideRosterInfoVO.java create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/GuideRosterSelectPageVO.java create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/GuideSelectPageVO.java create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/GuideStepColVO.java create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/ImportRosterDataVO.java create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/StatisticsGuideRosterVO.java create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/WelcomeImportProgress.java create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/WxConfigVO.java create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/h5/GuideStepOrderRosterCacheVO.java create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/h5/RosterFaceMatchVO.java create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/h5/RosterStepPayInfoVO.java create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/transcation/DownStudentBuyDataVO.java create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/transcation/EduProductBuyStudentVO.java create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/userLeave/EduLeaveRequestProcessConfigVO.java create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/userLeave/EduLeaveRequestStatisticsVO.java create mode 100644 febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/userLeave/EduLeaveRequestUserVO.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/controller/EduClassCallController.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/controller/EduClassCallPushConfigController.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/mapper/EduClassCallMapper.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/mapper/EduClassCallPushConfigMapper.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/mapper/EduClassCallPushConfigProcessMapper.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/mapper/EduClassCallPushConfigProcessStaffMapper.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/mapper/EduClassCallStudentRecordMapper.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/service/EduClassCallPushConfigProcessService.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/service/EduClassCallPushConfigProcessStaffService.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/service/EduClassCallPushConfigService.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/service/EduClassCallService.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/service/EduClassCallStudentRecordService.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/service/impl/EduClassCallPushConfigProcessServiceImpl.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/service/impl/EduClassCallPushConfigProcessStaffServiceImpl.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/service/impl/EduClassCallPushConfigServiceImpl.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/service/impl/EduClassCallServiceImpl.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/service/impl/EduClassCallStudentRecordServiceImpl.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/config/controller/in/EduSchoolFunctionConfigController.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/config/mapper/EduSchoolFunctionConfigMapper.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/config/service/EduSchoolFunctionConfigService.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/config/service/impl/EduSchoolFunctionConfigServiceImpl.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/index/controller/EduDeptHomeAppController.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/index/mapper/EduDeptHomeAppMapper.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/index/service/EduDeptHomeAppService.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/index/service/impl/EduDeptHomeAppServiceImpl.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/screen/controller/EduSchoolDashboardDataController.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/screen/controller/out/OutEduSchoolDashboardDataController.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/screen/mapper/EduSchoolDashboardDataBaseMapper.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/screen/mapper/EduSchoolDashboardDataMapper.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/screen/mapper/EduSchoolDashboardDataTeacherMapper.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/screen/service/EduSchoolDashboardDataBaseService.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/screen/service/EduSchoolDashboardDataService.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/screen/service/EduSchoolDashboardDataTeacherService.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/screen/service/impl/EduSchoolDashboardDataBaseServiceImpl.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/screen/service/impl/EduSchoolDashboardDataServiceImpl.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/screen/service/impl/EduSchoolDashboardDataTeacherServiceImpl.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/config/ExcelConfiguration.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/config/ExportGuidePicClient.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/controller/EduSmartWelcomeGuideController.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/controller/EduSmartWelcomeGuideStepClassController.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/controller/EduSmartWelcomeGuideStepDormController.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/controller/H5EduSmartWelcomeController.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/controller/InEduGuideStepOrderController.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/controller/InEduSmartWelcomeController.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/controller/OutEduSmartWelcomeController.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/excel/CustomDormExcelListener.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/excel/ExcelListener.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/excel/GuideRosterExcelListener.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/excel/SelectGuidePicExportData.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/mapper/EduGuideStepOrderMapper.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/mapper/EduSmartWelcomeCampusMapper.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/mapper/EduSmartWelcomeDepartmentMapper.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/mapper/EduSmartWelcomeGuideClassRecordMapper.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/mapper/EduSmartWelcomeGuideDormRecordMapper.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/mapper/EduSmartWelcomeGuideMapper.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/mapper/EduSmartWelcomeGuideRosterMapper.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/mapper/EduSmartWelcomeGuideRosterRelationMapper.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/mapper/EduSmartWelcomeGuideRosterRelationStepMapper.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/mapper/EduSmartWelcomeGuideStepClassFixMapper.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/mapper/EduSmartWelcomeGuideStepClassMapper.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/mapper/EduSmartWelcomeGuideStepDormFixMapper.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/mapper/EduSmartWelcomeGuideStepDormMapper.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/mapper/EduSmartWelcomeGuideStepMapper.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/mapper/EduSmartWelcomeGuideStepStaffMapper.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/EduGuideStepOrderService.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/EduSmartWelcomeCampusService.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/EduSmartWelcomeDepartmentService.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/EduSmartWelcomeGuideClassRecordService.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/EduSmartWelcomeGuideDormRecordService.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/EduSmartWelcomeGuideRosterRelationService.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/EduSmartWelcomeGuideRosterRelationStepService.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/EduSmartWelcomeGuideRosterService.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/EduSmartWelcomeGuideService.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/EduSmartWelcomeGuideStepClassFixService.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/EduSmartWelcomeGuideStepClassService.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/EduSmartWelcomeGuideStepDormFixService.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/EduSmartWelcomeGuideStepDormService.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/EduSmartWelcomeGuideStepService.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/EduSmartWelcomeGuideStepStaffService.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/H5EduSmartWelcomeService.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/ImportGuideRosterService.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/EduGuideStepOrderServiceImpl.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/EduSmartWelcomeCampusServiceImpl.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/EduSmartWelcomeDepartmentServiceImpl.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/EduSmartWelcomeGuideClassRecordServiceImpl.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/EduSmartWelcomeGuideDormRecordServiceImpl.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/EduSmartWelcomeGuideRosterRelationServiceImpl.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/EduSmartWelcomeGuideRosterRelationStepServiceImpl.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/EduSmartWelcomeGuideRosterServiceImpl.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/EduSmartWelcomeGuideServiceImpl.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/EduSmartWelcomeGuideStepClassFixServiceImpl.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/EduSmartWelcomeGuideStepClassServiceImpl.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/EduSmartWelcomeGuideStepDormFixServiceImpl.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/EduSmartWelcomeGuideStepDormServiceImpl.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/EduSmartWelcomeGuideStepServiceImpl.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/EduSmartWelcomeGuideStepStaffServiceImpl.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/H5EduSmartWelcomeServiceImpl.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/ImportGuideRosterServiceImpl.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/controller/EduLeaveRequestProcessConfigApplicableDepartmentsController.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/controller/EduLeaveRequestProcessConfigApprovalUserController.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/controller/EduLeaveRequestProcessConfigController.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/controller/EduLeaveRequestProcessRecordController.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/controller/EduLeaveRequestUserController.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/controller/in/InEduLeaveRequestUserController.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/mapper/EduLeaveRequestProcessConfigApplicableDepartmentsMapper.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/mapper/EduLeaveRequestProcessConfigApprovalUserMapper.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/mapper/EduLeaveRequestProcessConfigMapper.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/mapper/EduLeaveRequestProcessConfigViewMapper.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/mapper/EduLeaveRequestProcessRecordMapper.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/mapper/EduLeaveRequestUserMapper.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/mapper/EduLeaveRequestUserViewMapper.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/service/EduLeaveRequestProcessConfigApplicableDepartmentsService.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/service/EduLeaveRequestProcessConfigApprovalUserService.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/service/EduLeaveRequestProcessConfigService.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/service/EduLeaveRequestProcessConfigViewService.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/service/EduLeaveRequestProcessRecordService.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/service/EduLeaveRequestUserService.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/service/EduLeaveRequestUserViewService.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/service/impl/EduLeaveRequestProcessConfigApplicableDepartmentsServiceImpl.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/service/impl/EduLeaveRequestProcessConfigApprovalUserServiceImpl.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/service/impl/EduLeaveRequestProcessConfigServiceImpl.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/service/impl/EduLeaveRequestProcessConfigViewServiceImpl.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/service/impl/EduLeaveRequestProcessRecordServiceImpl.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/service/impl/EduLeaveRequestUserServiceImpl.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/service/impl/EduLeaveRequestUserViewServiceImpl.java create mode 100644 febs-server/edu-school/edu-school-biz/src/main/resources/mapper/classCall/EduClassScheduleMapper.xml create mode 100644 febs-server/edu-school/edu-school-biz/src/main/resources/mapper/index/EduDeptHomeAppMapper.xml create mode 100644 febs-server/edu-school/edu-school-biz/src/main/resources/mapper/screen/EduSchoolDashboardDataBaseMapper.xml create mode 100644 febs-server/edu-school/edu-school-biz/src/main/resources/mapper/screen/EduSchoolDashboardDataMapper.xml create mode 100644 febs-server/edu-school/edu-school-biz/src/main/resources/mapper/screen/EduSchoolDashboardDataTeacherMapper.xml create mode 100644 febs-server/edu-school/edu-school-biz/src/main/resources/mapper/smart/EduGuideStepOrderMapper.xml create mode 100644 febs-server/edu-school/edu-school-biz/src/main/resources/mapper/smart/EduSmartWelcomeGuideMapper.xml create mode 100644 febs-server/edu-school/edu-school-biz/src/main/resources/mapper/smart/EduSmartWelcomeGuideRosterMapper.xml create mode 100644 febs-server/edu-school/edu-school-biz/src/main/resources/mapper/smart/EduSmartWelcomeGuideRosterRelationMapper.xml create mode 100644 febs-server/edu-school/edu-school-biz/src/main/resources/mapper/smart/EduSmartWelcomeGuideRosterRelationStepMapper.xml create mode 100644 febs-server/edu-school/edu-school-biz/src/main/resources/mapper/smart/EduSmartWelcomeGuideStepClassMapper.xml create mode 100644 febs-server/edu-school/edu-school-biz/src/main/resources/mapper/smart/EduSmartWelcomeGuideStepDormMapper.xml create mode 100644 febs-server/edu-school/edu-school-biz/src/main/resources/mapper/smart/EduSmartWelcomeGuideStepMapper.xml create mode 100644 febs-server/edu-school/edu-school-biz/src/main/resources/mapper/smart/EduSmartWelcomeGuideStepStaffMapper.xml create mode 100644 febs-server/edu-school/edu-school-biz/src/main/resources/mapper/userLeave/EduLeaveRequestProcessConfigApplicableDepartmentsMapper.xml create mode 100644 febs-server/edu-school/edu-school-biz/src/main/resources/mapper/userLeave/EduLeaveRequestProcessConfigApprovalUserMapper.xml create mode 100644 febs-server/edu-school/edu-school-biz/src/main/resources/mapper/userLeave/EduLeaveRequestProcessConfigMapper.xml create mode 100644 febs-server/edu-school/edu-school-biz/src/main/resources/mapper/userLeave/EduLeaveRequestProcessConfigViewMapper.xml create mode 100644 febs-server/edu-school/edu-school-biz/src/main/resources/mapper/userLeave/EduLeaveRequestProcessRecordMapper.xml create mode 100644 febs-server/edu-school/edu-school-biz/src/main/resources/mapper/userLeave/EduLeaveRequestUserMapper.xml create mode 100644 febs-server/edu-school/edu-school-biz/src/main/resources/mapper/userLeave/EduLeaveRequestUserViewMapper.xml create mode 100644 febs-server/edu-school/edu-school-biz/src/main/resources/template/固定宿舍学生导入模板.xlsx create mode 100644 febs-server/edu-school/edu-school-biz/src/main/resources/template/固定班级学生导入模板.xlsx create mode 100644 febs-server/edu-school/edu-school-biz/src/main/resources/template/宿舍预选导入模板.xlsx create mode 100644 febs-server/edu-school/edu-school-biz/src/main/resources/template/班级预选导入模板.xlsx create mode 100644 febs-server/edu-school/edu-school-biz/src/main/resources/template/花名册导入模板.xls create mode 100644 febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/CardErrorExportDTO.java create mode 100644 febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/CardImportDTO.java create mode 100644 febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/ImportStaffInformationDTO.java create mode 100644 febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/ImportStudentTypeDTO.java create mode 100644 febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/ListStudentApplyDTO.java create mode 100644 febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/ListStudentApplyForDTO.java create mode 100644 febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/ManagerDTO.java create mode 100644 febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/OutPageStudentDTO.java create mode 100644 febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/StaffImportDTO.java create mode 100644 febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/StrategyPlanSaveDTO.java create mode 100644 febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/StrategyPlanTimeSaveDTO.java create mode 100644 febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/StrategySaveDTO.java create mode 100644 febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/StrategySpecialDateSaveDTO.java create mode 100644 febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/StrategySpecialTimeSaveDTO.java create mode 100644 febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/StudentDormExportDTO.java create mode 100644 febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/h5/ListUserDeptAttendanceDTO.java create mode 100644 febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/fallback/RemoteFaceGroupDeviceServiceFallback.java create mode 100644 febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/fallback/RemoteFaceGroupStrategyServiceFallback.java create mode 100644 febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/fallback/RemoteStudentApplyServiceFallback.java create mode 100644 febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/feign/RemoteFaceGroupDeviceService.java create mode 100644 febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/feign/RemoteFaceGroupStrategyService.java create mode 100644 febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/feign/RemoteStudentApplyService.java create mode 100644 febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/ClassAttendanceDataVO.java create mode 100644 febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/DeptManagetVO.java create mode 100644 febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/DownLoadStaffAttendanceRecordVO.java create mode 100644 febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/ManagerVo.java create mode 100644 febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/OutPageStudentVO.java create mode 100644 febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/StrategyInfoVO.java create mode 100644 febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/StrategyPlanTimeVO.java create mode 100644 febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/StrategyPlanVO.java create mode 100644 febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/StrategySpecialDateVO.java create mode 100644 febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/StrategySpecialTimeVO.java create mode 100644 febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/StudentApplyImportErrorVO.java create mode 100644 febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/StudentApplyImportProgressVO.java create mode 100644 febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/StudentApplyImportVO.java create mode 100644 febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/StudentApplyStatusVO.java create mode 100644 febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/config/ExcelConfiguration.java create mode 100644 febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/config/ExportStudentClient.java create mode 100644 febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/config/ExportStudentDormClient.java create mode 100644 febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/EduFaceGroupStrategyController.java create mode 100644 febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/EduStudentApplyController.java create mode 100644 febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/EduStudentApplyForController.java create mode 100644 febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/in/InEduFaceGroupDeviceController.java create mode 100644 febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/in/InEduFaceGroupStrategyController.java create mode 100644 febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/in/InEduStaffController.java create mode 100644 febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/in/InEduStudentApplyController.java create mode 100644 febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/out/OutEduUserDeptController.java create mode 100644 febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/excel/CardDataDataExcelListener.java create mode 100644 febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/excel/SelectStudentDormExportData.java create mode 100644 febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/excel/SelectStudentExportData.java create mode 100644 febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/excel/StaffDataExcelListener.java create mode 100644 febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/listener/ImportStudentTypeListener.java create mode 100644 febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/listener/importStudentApplyListener.java create mode 100644 febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/mapper/EduFaceGroupStrategyMapper.java create mode 100644 febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/mapper/EduFaceGroupStrategyPlanMapper.java create mode 100644 febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/mapper/EduFaceGroupStrategyPlanTimeMapper.java create mode 100644 febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/mapper/EduFaceGroupStrategySpecialDateMapper.java create mode 100644 febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/mapper/EduFaceGroupStrategySpecialTimeMapper.java create mode 100644 febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/mapper/EduStudentApplyForMapper.java create mode 100644 febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/mapper/EduStudentApplyMapper.java create mode 100644 febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/EduFaceGroupStrategyPlanService.java create mode 100644 febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/EduFaceGroupStrategyPlanTimeService.java create mode 100644 febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/EduFaceGroupStrategyService.java create mode 100644 febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/EduFaceGroupStrategySpecialDateService.java create mode 100644 febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/EduFaceGroupStrategySpecialTimeService.java create mode 100644 febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/EduStudentApplyForService.java create mode 100644 febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/EduStudentApplyService.java create mode 100644 febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduFaceGroupStrategyPlanServiceImpl.java create mode 100644 febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduFaceGroupStrategyPlanTimeServiceImpl.java create mode 100644 febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduFaceGroupStrategyServiceImpl.java create mode 100644 febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduFaceGroupStrategySpecialDateServiceImpl.java create mode 100644 febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduFaceGroupStrategySpecialTimeServiceImpl.java create mode 100644 febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduStudentApplyServiceForImpl.java create mode 100644 febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduStudentApplyServiceImpl.java create mode 100644 febs-server/edu-user/edu-user-biz/src/main/resources/mapper/EduFaceGroupStrategyMapper.xml create mode 100644 febs-server/edu-user/edu-user-biz/src/main/resources/mapper/EduFaceGroupStrategyPlanMapper.xml create mode 100644 febs-server/edu-user/edu-user-biz/src/main/resources/mapper/EduFaceGroupStrategyPlanTimeMapper.xml create mode 100644 febs-server/edu-user/edu-user-biz/src/main/resources/mapper/EduFaceGroupStrategySpecialDateMapper.xml create mode 100644 febs-server/edu-user/edu-user-biz/src/main/resources/mapper/EduFaceGroupStrategySpecialTimeMapper.xml create mode 100644 febs-server/edu-user/edu-user-biz/src/main/resources/mapper/EduStudentApplyForMapper.xml create mode 100644 febs-server/edu-user/edu-user-biz/src/main/resources/mapper/EduStudentApplyMapper.xml create mode 100644 febs-server/edu-user/edu-user-biz/src/main/resources/template/学生基础信息导入模板.xls create mode 100644 febs-server/edu-user/edu-user-biz/src/main/resources/template/学生开通应用导入模板.xls create mode 100644 febs-server/edu-user/edu-user-biz/src/main/resources/template/校园卡号导入模板.xls create mode 100644 febs-server/febs-server-generator/Dockerfile create mode 100644 febs-server/febs-server-generator/pom.xml create mode 100644 febs-server/febs-server-generator/run.sh create mode 100644 febs-server/febs-server-generator/src/main/java/cc/mrbird/febs/server/generator/FebsServerGeneratorApplication.java create mode 100644 febs-server/febs-server-generator/src/main/java/cc/mrbird/febs/server/generator/controller/GeneratorConfigController.java create mode 100644 febs-server/febs-server-generator/src/main/java/cc/mrbird/febs/server/generator/controller/GeneratorController.java create mode 100644 febs-server/febs-server-generator/src/main/java/cc/mrbird/febs/server/generator/entity/FieldType.java create mode 100644 febs-server/febs-server-generator/src/main/java/cc/mrbird/febs/server/generator/helper/GeneratorHelper.java create mode 100644 febs-server/febs-server-generator/src/main/java/cc/mrbird/febs/server/generator/mapper/GeneratorConfigMapper.java create mode 100644 febs-server/febs-server-generator/src/main/java/cc/mrbird/febs/server/generator/mapper/GeneratorMapper.java create mode 100644 febs-server/febs-server-generator/src/main/java/cc/mrbird/febs/server/generator/service/GeneratorConfigService.java create mode 100644 febs-server/febs-server-generator/src/main/java/cc/mrbird/febs/server/generator/service/GeneratorService.java create mode 100644 febs-server/febs-server-generator/src/main/java/cc/mrbird/febs/server/generator/service/impl/GeneratorConfigServiceImpl.java create mode 100644 febs-server/febs-server-generator/src/main/java/cc/mrbird/febs/server/generator/service/impl/GeneratorServiceImpl.java create mode 100644 febs-server/febs-server-generator/src/main/resources/ValidationMessages.properties create mode 100644 febs-server/febs-server-generator/src/main/resources/banner.txt create mode 100644 febs-server/febs-server-generator/src/main/resources/bootstrap.yml create mode 100644 febs-server/febs-server-generator/src/main/resources/generator/templates/controller.ftl create mode 100644 febs-server/febs-server-generator/src/main/resources/generator/templates/entity.ftl create mode 100644 febs-server/febs-server-generator/src/main/resources/generator/templates/mapper.ftl create mode 100644 febs-server/febs-server-generator/src/main/resources/generator/templates/mapperXml.ftl create mode 100644 febs-server/febs-server-generator/src/main/resources/generator/templates/service.ftl create mode 100644 febs-server/febs-server-generator/src/main/resources/generator/templates/serviceImpl.ftl create mode 100644 febs-server/febs-server-generator/src/main/resources/mapper/GeneratorMapper.xml create mode 100644 febs-server/febs-server-job/febs-server-job-biz/src/main/java/com/yida/data/job/task/ConsumeTask.java create mode 100644 febs-server/febs-server-job/febs-server-job-biz/src/main/java/com/yida/data/job/task/GuideTask.java create mode 100644 febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/dto/QywxCallbackHandleDTO.java create mode 100644 febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/fallback/RemoteBaiDuApiConfigServiceFallback.java create mode 100644 febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/fallback/RemoteBaseAppServiceFallback.java create mode 100644 febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/fallback/RemoteConstructionPayConfigServiceFallback.java create mode 100644 febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/fallback/RemoteConsumeConfigServiceFallback.java create mode 100644 febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/fallback/RemoteDeptFunctionServiceFallback.java create mode 100644 febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/fallback/RemoteQywxServiceFallback.java create mode 100644 febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/fallback/RemoteUPayConfigServiceFallback.java create mode 100644 febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/fallback/RemoteWhiteListServiceFallback.java create mode 100644 febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/feign/RemoteBaiDuApiConfigService.java create mode 100644 febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/feign/RemoteBaseAppService.java create mode 100644 febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/feign/RemoteConstructionPayConfigService.java create mode 100644 febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/feign/RemoteConsumeConfigService.java create mode 100644 febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/feign/RemoteDeptFunctionService.java create mode 100644 febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/feign/RemoteDictService.java create mode 100644 febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/feign/RemoteQywxService.java create mode 100644 febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/feign/RemoteUPayConfigService.java create mode 100644 febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/feign/RemoteWhiteListService.java create mode 100644 febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/configure/QywxHandleRabbitReceiver.java create mode 100644 febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/EduBaseAppController.java create mode 100644 febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/InBaiDuApiConfigController.java create mode 100644 febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/InBaseDeptHomeAppController.java create mode 100644 febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/InConstructionPayConfigController.java create mode 100644 febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/InConsumeConfigController.java create mode 100644 febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/InDeptFunctionController.java create mode 100644 febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/InDictController.java create mode 100644 febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/InUPayConfigController.java create mode 100644 febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/InWhiteListController.java create mode 100644 febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/mapper/BaiduApiConfigMapper.java create mode 100644 febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/mapper/ConstructionPayConfigMapper.java create mode 100644 febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/mapper/EduAppTemplateMapper.java create mode 100644 febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/mapper/EduBaseAppMapper.java create mode 100644 febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/mapper/EduConsumeConfigMapper.java create mode 100644 febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/mapper/EduDeptFunctionMapper.java create mode 100644 febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/mapper/EduQywxServiceProviderMapper.java create mode 100644 febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/mapper/EduQywxServiceProviderSchoolMapper.java create mode 100644 febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/mapper/UPayConfigMapper.java create mode 100644 febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/mapper/WhiteListMapper.java create mode 100644 febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/BaiduApiConfigService.java create mode 100644 febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/ConstructionPayConfigService.java create mode 100644 febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/EduAppTemplateService.java create mode 100644 febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/EduBaseAppService.java create mode 100644 febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/EduConsumeConfigService.java create mode 100644 febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/EduDeptFunctionService.java create mode 100644 febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/EduQywxServiceProviderSchoolService.java create mode 100644 febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/EduQywxServiceProviderService.java create mode 100644 febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/QywxHandleService.java create mode 100644 febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/QywxServiceProviderService.java create mode 100644 febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/UPayConfigService.java create mode 100644 febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/WhiteListService.java create mode 100644 febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/BaiduApiConfigServiceImpl.java create mode 100644 febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/ConstructionPayConfigServiceImpl.java create mode 100644 febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/EduAppTemplateServiceImpl.java create mode 100644 febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/EduBaseAppServiceImpl.java create mode 100644 febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/EduConsumeConfigServiceImpl.java create mode 100644 febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/EduDeptFunctionServiceImpl.java create mode 100644 febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/EduQywxServiceProviderSchoolServiceImpl.java create mode 100644 febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/EduQywxServiceProviderServiceImpl.java create mode 100644 febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/QywxHandleServiceImpl.java create mode 100644 febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/QywxServiceProviderServiceImpl.java create mode 100644 febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/UPayConfigServiceImpl.java create mode 100644 febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/WhiteListServiceImpl.java create mode 100644 febs-server/febs-server-system/febs-server-system-biz/src/main/resources/mapper/EduBaseAppMapper.xml create mode 100644 febs-server/febs-server-system/febs-server-system-biz/src/main/resources/mapper/EduConsumeConfigMapper.xml create mode 100644 febs-server/febs-server-system/febs-server-system-biz/src/main/resources/mapper/EduDeptFunctionMapper.xml create mode 100644 febs-server/febs-server-system/febs-server-system-biz/src/main/resources/mapper/UPayConfigMapper.xml create mode 100644 febs-server/febs-server-system/febs-server-system-biz/src/main/resources/mapper/WhiteListMapper.xml diff --git a/Readme.md b/Readme.md index 2e0879f..5406886 100644 --- a/Readme.md +++ b/Readme.md @@ -1,3 +1 @@ -### 校园旧版 - -攀枝花东区-缴费分支 \ No newline at end of file +### 校园旧版 \ No newline at end of file diff --git a/edu-auth/edu-auth-biz/src/main/java/com/yida/data/auth/controller/SocialLoginController.java b/edu-auth/edu-auth-biz/src/main/java/com/yida/data/auth/controller/SocialLoginController.java index eae6e23..a911440 100644 --- a/edu-auth/edu-auth-biz/src/main/java/com/yida/data/auth/controller/SocialLoginController.java +++ b/edu-auth/edu-auth-biz/src/main/java/com/yida/data/auth/controller/SocialLoginController.java @@ -3,12 +3,14 @@ package com.yida.data.auth.controller; import com.yida.data.auth.entity.BindUser; import com.yida.data.auth.service.SocialLoginService; import com.yida.data.common.core.common.ModuleName; +import com.yida.data.common.core.common.ResultBean; import com.yida.data.common.core.entity.FebsResponse; import com.yida.data.common.core.entity.constant.StringConstant; import com.yida.data.common.core.entity.system.UserConnection; import com.yida.data.common.core.exception.FebsException; import com.yida.data.common.core.utils.FebsUtil; import com.yida.data.log.annotation.OperationLog; +import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -29,6 +31,7 @@ import javax.validation.Valid; import javax.validation.constraints.NotBlank; import java.io.IOException; import java.util.List; +import java.util.Map; /** * @author MrBird @@ -203,4 +206,20 @@ public class SocialLoginController { @ApiParam("0-教师,1-家长") Integer type) { return new FebsResponse().data(socialLoginService.h5Login(schoolId, mobile, type)); } + + @ResponseBody + @ApiOperation("检查openId状态") + @GetMapping("smart/checkOpenId") + public ResultBean> checkOpenId(@RequestParam @ApiParam(value = "微信公众号授权code", required = true) String code, + @RequestParam @ApiParam(value = "学校id(链接上附带)", required = true) Long deptId) { + return ResultBean.buildSuccess(socialLoginService.checkOpenId(code, deptId)); + } + + @ResponseBody + @ApiOperation("智慧迎新学生端登录接口") + @GetMapping("wxPublic/welcome/login") + public FebsResponse wxPublicLogin(@RequestParam @ApiParam(value = "微信openId", required = true) String openId, + @RequestParam @ApiParam(value = "学校id(链接上附带)", required = true) Long deptId) { + return new FebsResponse().data(socialLoginService.wxPublicLogin(openId, deptId)); + } } diff --git a/edu-auth/edu-auth-biz/src/main/java/com/yida/data/auth/manager/UserManager.java b/edu-auth/edu-auth-biz/src/main/java/com/yida/data/auth/manager/UserManager.java index 8442134..56e4cd8 100644 --- a/edu-auth/edu-auth-biz/src/main/java/com/yida/data/auth/manager/UserManager.java +++ b/edu-auth/edu-auth-biz/src/main/java/com/yida/data/auth/manager/UserManager.java @@ -1,6 +1,7 @@ package com.yida.data.auth.manager; import cc.mrbird.febs.common.redis.service.RedisService; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.yida.data.auth.mapper.EduUserLogoMapper; @@ -17,6 +18,7 @@ import com.yida.data.common.core.entity.system.EduUserLogo; import com.yida.data.common.core.entity.system.Menu; import com.yida.data.common.core.entity.system.Role; import com.yida.data.common.core.entity.system.SystemUser; +import com.yida.data.common.core.entity.system.SystemUserMenu; import com.yida.data.common.core.entity.system.UserRole; import com.yida.data.common.service.CommonService; import com.yida.data.user.feign.RemoteTeacherService; @@ -79,11 +81,24 @@ public class UserManager { * @param username 用户名 * @return 权限 */ - public String findUserPermissions(String username) { -// List userPermissions = menuMapper.findUserPermissions(username); - // 从用户对应权限表查询权限数据 - List userPermissions = userMenuMapper.findUserPermissions(username); - return userPermissions.stream().map(Menu::getPerms).collect(Collectors.joining(StringConstant.COMMA)); + public List findUserPermissions(String username) { + // 获取角色权限 + List menus = menuMapper.findUserPermissions(username); + // 获取用户权限 + List userPermissions = userMenuMapper.findUserPermissions(username); + // 过滤 + if (CollUtil.isNotEmpty(userPermissions)) { + menus.addAll( + userPermissions.stream().filter(x -> x.getType() == 0).map(SystemUserMenu::getPerms).filter(StrUtil::isNotBlank) + .collect(Collectors.toList())); + List excludePerms = userPermissions.stream().filter(x -> x.getType() == 1).map(SystemUserMenu::getPerms) + .filter(StrUtil::isNotBlank).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(excludePerms)) { + menus = menus.stream().filter(x -> !excludePerms.contains(x)).collect(Collectors.toList()); + } + } + // 只返回串 + return menus; } /** @@ -154,6 +169,6 @@ public class UserManager { public String findMainRole(Long mainDeptId) { // 查询主角色code List rolePerms = userMapper.findMainRole(mainDeptId); - return rolePerms.stream().filter(StringUtils::isNotBlank).collect(Collectors.joining()); + return rolePerms.stream().filter(StringUtils::isNotBlank).distinct().collect(Collectors.joining(StringConstant.COMMA)); } } diff --git a/edu-auth/edu-auth-biz/src/main/java/com/yida/data/auth/mapper/MenuMapper.java b/edu-auth/edu-auth-biz/src/main/java/com/yida/data/auth/mapper/MenuMapper.java index c777d3e..c7ccbbb 100644 --- a/edu-auth/edu-auth-biz/src/main/java/com/yida/data/auth/mapper/MenuMapper.java +++ b/edu-auth/edu-auth-biz/src/main/java/com/yida/data/auth/mapper/MenuMapper.java @@ -16,5 +16,5 @@ public interface MenuMapper extends BaseMapper { * @param username 用户名 * @return 权限集合 */ - List findUserPermissions(String username); + List findUserPermissions(String username); } \ No newline at end of file diff --git a/edu-auth/edu-auth-biz/src/main/java/com/yida/data/auth/mapper/UserMenuMapper.java b/edu-auth/edu-auth-biz/src/main/java/com/yida/data/auth/mapper/UserMenuMapper.java index 29ef945..871ba29 100644 --- a/edu-auth/edu-auth-biz/src/main/java/com/yida/data/auth/mapper/UserMenuMapper.java +++ b/edu-auth/edu-auth-biz/src/main/java/com/yida/data/auth/mapper/UserMenuMapper.java @@ -22,5 +22,5 @@ public interface UserMenuMapper extends BaseMapper { * @author ZYJ * @date 2021/11/8 15:54 */ - List findUserPermissions(String username); + List findUserPermissions(String username); } diff --git a/edu-auth/edu-auth-biz/src/main/java/com/yida/data/auth/service/SocialLoginService.java b/edu-auth/edu-auth-biz/src/main/java/com/yida/data/auth/service/SocialLoginService.java index a4377ce..97bee61 100644 --- a/edu-auth/edu-auth-biz/src/main/java/com/yida/data/auth/service/SocialLoginService.java +++ b/edu-auth/edu-auth-biz/src/main/java/com/yida/data/auth/service/SocialLoginService.java @@ -105,4 +105,26 @@ public interface SocialLoginService { Map wxpublicLogin(String code, String appId, Integer type, Long schoolId, String mobile); Map h5Login(Long schoolId, String mobile, Integer type); + + /** + * 检查openId状态 + * + * @param code 微信公众号授权code + * @param deptId 学校id + * @return java.util.Map + * @author ZYJ + * @date 2023/6/2 10:31 + */ + Map checkOpenId(String code, Long deptId); + + /** + * 迎新功能微信公众号登录 + * + * @param openId 微信openId + * @param deptId 学校id + * @return java.util.Map + * @author ZYJ + * @date 2023/5/18 11:09 + */ + Map wxPublicLogin(String openId, Long deptId); } diff --git a/edu-auth/edu-auth-biz/src/main/java/com/yida/data/auth/service/impl/FebsUserDetailServiceImpl.java b/edu-auth/edu-auth-biz/src/main/java/com/yida/data/auth/service/impl/FebsUserDetailServiceImpl.java index b13476c..1f167fd 100644 --- a/edu-auth/edu-auth-biz/src/main/java/com/yida/data/auth/service/impl/FebsUserDetailServiceImpl.java +++ b/edu-auth/edu-auth-biz/src/main/java/com/yida/data/auth/service/impl/FebsUserDetailServiceImpl.java @@ -1,5 +1,6 @@ package com.yida.data.auth.service.impl; +import cn.hutool.core.collection.CollUtil; import com.yida.data.auth.manager.UserManager; import cc.mrbird.febs.common.redis.service.RedisService; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; @@ -44,7 +45,7 @@ public class FebsUserDetailServiceImpl implements UserDetailsService { HttpServletRequest httpServletRequest = FebsUtil.getHttpServletRequest(); SystemUser systemUser = userManager.findByName(username); if (systemUser != null) { - String permissions = userManager.findUserPermissions(systemUser.getUsername()); + List permissions = userManager.findUserPermissions(systemUser.getUsername()); boolean notLocked = false; if (StringUtils.equals(SystemUser.STATUS_VALID, systemUser.getStatus())) { notLocked = true; @@ -59,31 +60,31 @@ public class FebsUserDetailServiceImpl implements UserDetailsService { // 设置角色权限 if (StringUtils.isNotBlank(systemUser.getRolePerms())) { List collect = Arrays.stream(systemUser.getRolePerms().split(StringConstant.COMMA)) - .map(s -> FebsConstant.SECURITY_ROLE_PREFIX + s) - .collect(Collectors.toList()); + .map(s -> FebsConstant.SECURITY_ROLE_PREFIX + s) + .distinct() + .collect(Collectors.toList()); if (CollectionUtils.isNotEmpty(collect)) { - grantedAuthorities = AuthorityUtils.commaSeparatedStringToAuthorityList(String.join(StringConstant.COMMA, collect)); + grantedAuthorities = AuthorityUtils + .commaSeparatedStringToAuthorityList(String.join(StringConstant.COMMA, collect)); } } // 设置菜单权限 - if (StringUtils.isNotBlank(permissions)) { - if (CollectionUtils.isNotEmpty(grantedAuthorities)) { - grantedAuthorities.addAll(AuthorityUtils.commaSeparatedStringToAuthorityList(permissions)); - } else { - grantedAuthorities = AuthorityUtils.commaSeparatedStringToAuthorityList(permissions); - } + if (CollUtil.isNotEmpty(permissions)) { + grantedAuthorities.addAll(AuthorityUtils.createAuthorityList(permissions.toArray(new String[0]))); } // 查询主角色信息 if (Objects.nonNull(systemUser.getMainDeptId())) { String role = this.userManager.findMainRole(systemUser.getMainDeptId()); systemUser.setMainRolePerms(role); } + + //查询登录所属部门:学校对应的 log.info("登陆用户信息sysUser: {}", systemUser); log.info("登陆权限数据permission: {}", grantedAuthorities); log.info("登陆主角色数据mainRole: {}", systemUser.getMainRolePerms()); FebsAuthUser authUser = new FebsAuthUser(systemUser.getUsername(), password, true, true, true, notLocked, - grantedAuthorities); + grantedAuthorities); BeanUtils.copyProperties(systemUser, authUser); return authUser; diff --git a/edu-auth/edu-auth-biz/src/main/java/com/yida/data/auth/service/impl/SocialLoginServiceImpl.java b/edu-auth/edu-auth-biz/src/main/java/com/yida/data/auth/service/impl/SocialLoginServiceImpl.java index efb60dc..1554122 100644 --- a/edu-auth/edu-auth-biz/src/main/java/com/yida/data/auth/service/impl/SocialLoginServiceImpl.java +++ b/edu-auth/edu-auth-biz/src/main/java/com/yida/data/auth/service/impl/SocialLoginServiceImpl.java @@ -13,6 +13,8 @@ import com.yida.data.auth.service.SocialLoginService; import com.yida.data.auth.service.UserConnectionService; import com.yida.data.common.core.entity.FebsResponse; import com.yida.data.common.core.entity.constant.*; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideRosterRelation; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideStep; import com.yida.data.common.core.entity.system.*; import com.yida.data.common.core.entity.user.EduStaff; import com.yida.data.common.core.enums.RoleName; @@ -22,11 +24,12 @@ import com.yida.data.common.core.utils.FebsUtil; import com.yida.data.common.core.utils.WxPublicUtil; import com.yida.data.common.core.utils.WxUtil; import com.yida.data.common.service.CommonService; -import com.yida.data.school.feign.transaction.RemoteStudentApplyService; +import com.yida.data.school.feign.smart.RemoteSmartWelcomeService; import com.yida.data.system.feign.RemoteDeptService; import com.yida.data.system.feign.RemoteRoleService; import com.yida.data.system.feign.RemoteUserService; import com.yida.data.user.feign.RemoteStaffService; +import com.yida.data.user.feign.RemoteStudentApplyService; import com.yida.data.user.feign.RemoteStudentService; import com.yida.data.user.feign.RemoteTeacherService; import com.yida.data.user.vo.ParentInfoVO; @@ -61,7 +64,6 @@ public class SocialLoginServiceImpl implements SocialLoginService { private static final String USERNAME = "username"; private static final String PASSWORD = "password"; - private static final String NOT_BIND = "not_bind"; private static final String SOCIAL_LOGIN_SUCCESS = "social_login_success"; @@ -73,17 +75,16 @@ public class SocialLoginServiceImpl implements SocialLoginService { private final UserConnectionService userConnectionService; private final ResourceOwnerPasswordTokenGranter granter; private final RedisClientDetailsService redisClientDetailsService; - private final WxUtil wxUtil; - private final WxPublicUtil wxPublicUtil; + + private final RemoteStaffService remoteStaffService; private final RemoteStudentService remoteStudentService; private final RemoteTeacherService remoteTeacherService; - private final RemoteStaffService remoteStaffService; - private final RemoteDeptService remoteDeptService; - private final CommonService commonService; - private final RemoteRoleService remoteRoleService; - private final RemoteUserService remoteUserService; - private final RemoteStudentApplyService remoteStudentApplyService; + private final RemoteSmartWelcomeService remoteSmartWelcomeService; + + private final WxUtil wxUtil; + private final WxPublicUtil wxPublicUtil; private final RedisService redisService; + private final CommonService commonService; @Override public AuthRequest renderAuth(String oauthType) throws FebsException { @@ -579,4 +580,43 @@ public class SocialLoginServiceImpl implements SocialLoginService { res.put("identity", type == 0 ? teacher : parent); return res; } + + @Override + public Map checkOpenId(String code, Long deptId) { + Dept school = commonService.getDept(deptId); + if (Objects.isNull(school)) { + throw new FebsException("学校信息错误"); + } + // 查询用户信息 + String openId = wxPublicUtil.getOpenId(school.getWxPublicAppId(), school.getWxPublicSecret(), code); + // 查询openId是否绑定了对应的信息 + EduSmartWelcomeGuideRosterRelation relation = remoteSmartWelcomeService.getOpenIdRelation(openId, deptId).getData(); + Map map = new HashMap<>(); + // true代表已经绑定,false代表未绑定 + map.put("status", Objects.nonNull(relation)); + // 微信openId + map.put("openId", openId); + return map; + } + + @Override + public Map wxPublicLogin(String openId, Long deptId) { + // 查询关联关系 + EduSmartWelcomeGuideRosterRelation relation = remoteSmartWelcomeService.getOpenIdRelation(openId, deptId).getData(); + if (Objects.isNull(relation) || Objects.isNull(relation.getGuideRoster())) { + throw new FebsException("信息错误"); + } + // 用户信息 + SystemUser systemUser = userManager.findByName(relation.getGuideRoster().getMobile()); + // 登录返回token和用户信息 + Map res = new HashMap<>(); + res.put("token", getOauth2AccessToken(systemUser)); + systemUser.setPassword(null); + res.put("user", systemUser); +// // 查询人员步骤信息 +// List stepList = remoteSmartWelcomeService.listStepInfo(relation.getId(), relation.getGuideId()).getData(); +// relation.setStepList(stepList); + res.put("info", relation); + return res; + } } diff --git a/edu-auth/edu-auth-biz/src/main/resources/mapper/MenuMapper.xml b/edu-auth/edu-auth-biz/src/main/resources/mapper/MenuMapper.xml index 8da1407..848b308 100644 --- a/edu-auth/edu-auth-biz/src/main/resources/mapper/MenuMapper.xml +++ b/edu-auth/edu-auth-biz/src/main/resources/mapper/MenuMapper.xml @@ -2,15 +2,15 @@ - + \ No newline at end of file diff --git a/edu-auth/edu-auth-biz/src/main/resources/mapper/UserMapper.xml b/edu-auth/edu-auth-biz/src/main/resources/mapper/UserMapper.xml index 355aadd..6c2875e 100644 --- a/edu-auth/edu-auth-biz/src/main/resources/mapper/UserMapper.xml +++ b/edu-auth/edu-auth-biz/src/main/resources/mapper/UserMapper.xml @@ -18,6 +18,7 @@ u.description, u.avatar, d.dept_type deptType, + d.school_nature schoolNature, d.dept_name deptName, u.agent_id agentId, GROUP_CONCAT(r.role_id) roleId, @@ -59,6 +60,7 @@ - select distinct m.perms - from t_user_menu um - left join t_user u on (u.user_id = um.user_id) - left join t_menu m on (m.menu_id = um.menu_id) - where u.username = #{userName} - and m.perms is not null - and m.perms <> '' + \ No newline at end of file diff --git a/febs-common/febs-common-core/pom.xml b/febs-common/febs-common-core/pom.xml index edbfcb4..f520f5c 100644 --- a/febs-common/febs-common-core/pom.xml +++ b/febs-common/febs-common-core/pom.xml @@ -148,18 +148,30 @@ ${wxpay.apiv3.version} compile - - com.github.wechatpay-apiv3 - wechatpay-apache-httpclient - ${wxpay.apiv3.version} - compile - + + + + + + com.google.zxing javase ${qr.code.version} + + + com.baidu.aip + java-sdk + ${baidu.api.version} + + + org.slf4j + slf4j-simple + + + diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/common/ModuleName.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/common/ModuleName.java index 0dcfbd0..55b62ac 100644 --- a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/common/ModuleName.java +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/common/ModuleName.java @@ -8,15 +8,24 @@ public enum ModuleName { AUTH("认证中心"), APPLY_PARODUCT("应用商品"), ATTENDANCE("考勤"), + DEVICE("设备"), LETTER_BOX("校长信箱"), NOTICE("通知"), SCHOOL("校园主页"), STUDENT_EXAM("考试管理"), USER("用户管理"), + STUDENT("学生管理"), + STAFF("职工管理"), JOB("任务调度"), SYSTEM("系统管理"), + DEPT("系统部门"), + USER_DEPT("家校部门"), + INSTRUCTION("系统指南"), ELECTRONIC_STUDENT_CARD("电子学生证"), TELEPHONE("亲情电话"), + COURSE("课程表"), + PRODUCT("商品管理"), + TRANSATION("交易管理"), HEALTH("健康管理"); @Getter String name; diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/common/ResultMsgType.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/common/ResultMsgType.java index 326bedd..fcec419 100644 --- a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/common/ResultMsgType.java +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/common/ResultMsgType.java @@ -21,22 +21,29 @@ public enum ResultMsgType { IMPORT_EXCEL_FAIL("导入失败!", 500), FILE_TYPE_ERROR("导入文件类型错误", 500), ID_CARD_EXIST("身份证号码已存在!", 500), + STUDENT_CARD_NUMBER_EXIST("校园学号已存在!", 500), STUDENT_NUMBER_EXIST("学号已存在!", 500), + STUDENT_NUMBER_NOT_EXIST("学号不存在!", 500), CAMPUS_NAME_ERROR("学区名称错误", 500), SECTION_NAME_ERROR("学段名称错误", 500), GRADE_NAME_ERROR("年级名称错误", 500), CLASS_NAME_ERROR("班级名称错误", 500), + START_DATE_ERROR("入学时间错误", 500), SERVER_ERROR("服务器繁忙!请稍后再试", 500), LOGIN_INFO_ERROR("用户登陆信息异常", 500), PAY_TYPE_ERROR("暂不支持此支付方式", 500), ORDER_FAIL("创建订单失败!请稍后再试", 500), + ORDER_NOT_FOUND("未找到订单信息", 500), ORDER_INVALID("该订单已失效!无法执行该操作", 500), ORDER_QUERY_FAIL("订单查询失败", 500), ORDER_CLOSE_FAIL("关闭订单失败", 500), ORDER_REFUND_FAIL("订单退款失败", 500), REFUND_QUERY_FAIL("退款查询失败", 500), + ORDER_MONEY_ERROR("订单金额异常", 500), + + CARD_STATUS_ERROR("卡状态异常", 500), ; private final String value; diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/CurrentUser.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/CurrentUser.java index acc1bd7..3881bb9 100644 --- a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/CurrentUser.java +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/CurrentUser.java @@ -91,6 +91,12 @@ public class CurrentUser implements Serializable { */ private String mainRolePerms; + + /** + * 学校性质:0幼儿园,1小学,2中学,3九年一贯,4十二年一贯,5:高校 + */ + private Integer schoolNature; + @JsonIgnore private EduUserLogo userLogo; } diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/ErrorRecordMsg.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/ErrorRecordMsg.java new file mode 100644 index 0000000..5fcf522 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/ErrorRecordMsg.java @@ -0,0 +1,68 @@ +package com.yida.data.common.core.entity; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.yida.data.common.core.enums.RecordTypeEnum; +import lombok.*; +import org.springframework.data.annotation.Id; +import org.springframework.data.elasticsearch.annotations.Document; +import org.springframework.data.elasticsearch.annotations.Field; +import org.springframework.data.elasticsearch.annotations.FieldType; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * 通行记录错误信息 + * + * @author ZYJ + * @date 2023/11/1 14:00 + */ +@Data +@Builder +@ToString +@NoArgsConstructor +@AllArgsConstructor +@Document(indexName = "error_record_msg", shards = 5) +public class ErrorRecordMsg { + + @Id + private String id; + + /** + * 创建时间 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(shape = JsonFormat.Shape.STRING, timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + /** + * 学校id + */ + @Field(type = FieldType.Long) + private Long schoolId; + + /** + * 处理的信息. AddAttendanceRecordDTO + */ + @Field(type = FieldType.Text) + private String msg; + + /** + * 消息渠道-内部标识 + */ + @Field(type = FieldType.Text) + private String topic; + + /** + * 消息来源渠道 + */ + @Field(type = FieldType.Text) + private String channel; + + /** + * 通行记录类型 {@link RecordTypeEnum} + */ + @Field(type = FieldType.Text) + private String recordType; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/FebsAuthUser.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/FebsAuthUser.java index 57aaf48..71566fa 100644 --- a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/FebsAuthUser.java +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/FebsAuthUser.java @@ -55,6 +55,8 @@ public class FebsAuthUser extends User { private String status; + private Integer schoolNature; + private String deptIds; private Long identityId; diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/applyForm/CoreApplyForm.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/applyForm/CoreApplyForm.java new file mode 100644 index 0000000..f9ccd72 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/applyForm/CoreApplyForm.java @@ -0,0 +1,176 @@ +package com.yida.data.common.core.entity.applyForm; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.yida.data.common.core.enums.EnableStatusEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; + +/** + * 申请类型表单 Entity + * + * @author ZYJ + * @date 2023/11/14 + */ +@Data +@TableName("core_apply_form") +public class CoreApplyForm implements Serializable { + + private static final long serialVersionUID = 1092492140890088204L; + + /** + * 主键id + */ + @ApiModelProperty(value = "主键id") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 是否删除,1删除0未删除,默认0 + */ + @ApiModelProperty(value = "是否删除,1删除0未删除,默认0") + @TableField("del_flag") + @TableLogic(value = "0", delval = "1") + private Integer delFlag; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间") + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + /** + * 创建人id + */ + @ApiModelProperty(value = "创建人id") + @TableField(value = "create_id", fill = FieldFill.INSERT) + private Long createId; + + /** + * 最后修改时间 + */ + @ApiModelProperty(value = "最后修改时间") + @TableField(value = "update_date", fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateDate; + + /** + * 最后修改人id + */ + @ApiModelProperty(value = "最后修改人id") + @TableField(value = "update_id", fill = FieldFill.UPDATE) + private Long updateId; + + /** + * 学校id + */ + @ApiModelProperty(value = "学校id") + @TableField("school_id") + private Long schoolId; + + /** + * 表单标题 + */ + @ApiModelProperty(value = "表单标题") + @TableField("form_title") + private String formTitle; + + /** + * 表单类型 + */ + @ApiModelProperty(value = "表单类型") + @TableField("form_type_id") + private Long formTypeId; + + /** + * 表单描述说明 + */ + @ApiModelProperty(value = "表单描述说明") + @TableField("form_remark") + private String formRemark; + + /** + * 是否显示排序:1=是,0=否 + */ + @ApiModelProperty(value = "是否显示排序:1=是,0=否") + @TableField("sorted") + private String sorted; + + /** + * 对应数据表 + */ + @ApiModelProperty(value = "对应数据表名称") + @TableField("table_name") + private String tableName; + + /** + * 表单状态. 0为停用,1为启用 {@link EnableStatusEnum} + */ + @ApiModelProperty(value = "表单状态. 0为停用,1为启用") + @TableField("status") + private Integer status; + + /** + * 0为不开启一页一题,1为开启一页一题 + */ + @ApiModelProperty(value = "0为不开启一页一题,1为开启一页一题") + @TableField("page_one_question") + private Integer pageOneQuestion; + + /** + * 0为开启进度条,1为关闭进度条 + */ + @ApiModelProperty(value = "0为开启进度条,1为关闭进度条") + @TableField("progress_bar") + private Integer progressBar; + + /** + * 分页最大停留时间(单位秒) + */ + @ApiModelProperty(value = "分页最大停留时间(单位秒)") + @TableField("stop_max_time") + private Integer stopMaxTime; + + /** + * 分页最小停留时间(单位秒) + */ + @ApiModelProperty(value = "分页最小停留时间(单位秒)") + @TableField("stop_min_time") + private Integer stopMinTime; + + /** + * 背景图 + */ + @ApiModelProperty(value = "背景图") + @TableField("background_img_url") + private String backgroundImgUrl; + + /** + * 头图 + */ + @ApiModelProperty(value = "头图") + @TableField("header_img_url") + private String headerImgUrl; + + /** + * 导出模板文件地址 + */ + @ApiModelProperty(value = "导出模板文件地址") + @TableField("template_file_url") + private String templateFileUrl; + + @ApiModelProperty("组件集合") + private transient List itemList; + + @ApiModelProperty("表单对应审核流程节点集合") + private transient List processList; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/applyForm/CoreApplyFormApprovalProcess.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/applyForm/CoreApplyFormApprovalProcess.java new file mode 100644 index 0000000..77ecf84 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/applyForm/CoreApplyFormApprovalProcess.java @@ -0,0 +1,90 @@ +package com.yida.data.common.core.entity.applyForm; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.yida.data.common.core.enums.EnableStatusEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; + +/** + * 申请表单对应的审核流程 + * + * @author ZYJ + * @date 2023/11/20 + */ +@Data +@TableName("core_apply_form_approval_process") +public class CoreApplyFormApprovalProcess implements Serializable { + + private static final long serialVersionUID = 6579266821751952059L; + + /** + * 主键id + */ + @ApiModelProperty(value = "主键id") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 是否删除,1删除0未删除,默认0 + */ + @ApiModelProperty(value = "是否删除,1删除0未删除,默认0") + @TableField("del_flag") + @TableLogic(value = "0", delval = "1") + private Integer delFlag; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间") + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + /** + * 创建人id + */ + @ApiModelProperty(value = "创建人id") + @TableField(value = "create_id", fill = FieldFill.INSERT) + private Long createId; + + /** + * 最后修改时间 + */ + @ApiModelProperty(value = "最后修改时间") + @TableField(value = "update_date", fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateDate; + + /** + * 最后修改人id + */ + @ApiModelProperty(value = "最后修改人id") + @TableField(value = "update_id", fill = FieldFill.UPDATE) + private Long updateId; + + /** + * 申请表单id + */ + @TableField("apply_form_id") + private Long applyFormId; + + /** + * 审核流程id + */ + @TableField("approval_process_id") + private Long approvalProcessId; + + /** + * 排序 + */ + @TableField("sort") + private Integer sort; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/applyForm/CoreApplyFormFillUser.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/applyForm/CoreApplyFormFillUser.java new file mode 100644 index 0000000..92ebd27 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/applyForm/CoreApplyFormFillUser.java @@ -0,0 +1,114 @@ +package com.yida.data.common.core.entity.applyForm; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * 申请表单填报用户信息表 + * + * @author ZYJ + * @date 2023/11/22 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@TableName("core_apply_form_fill_user") +public class CoreApplyFormFillUser implements Serializable { + + private static final long serialVersionUID = -607929134997876061L; + + /** + * 主键id + */ + @ApiModelProperty(value = "主键id") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 是否删除,1删除0未删除,默认0 + */ + @ApiModelProperty(value = "是否删除,1删除0未删除,默认0") + @TableField("del_flag") + @TableLogic(value = "0", delval = "1") + private Integer delFlag; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间") + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + /** + * 创建人id + */ + @ApiModelProperty(value = "创建人id") + @TableField(value = "create_id", fill = FieldFill.INSERT) + private Long createId; + + /** + * 最后修改时间 + */ + @ApiModelProperty(value = "最后修改时间") + @TableField(value = "update_date", fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateDate; + + /** + * 最后修改人id + */ + @ApiModelProperty(value = "最后修改人id") + @TableField(value = "update_id", fill = FieldFill.UPDATE) + private Long updateId; + + @ApiModelProperty("学校id") + private Long schoolId; + + /** + * 表单id + */ + @ApiModelProperty(value = "表单id") + @TableField("apply_form_id") + private Long applyFormId; + + @ApiModelProperty(value = "表单对应填报数据id") + @TableField("apply_form_data_id") + private Long applyFormDataId; + + @ApiModelProperty(value = "填报用户id") + @TableField("user_id") + private Long userId; + + @ApiModelProperty(value = "填报用户名称") + @TableField("user_name") + private String userName; + + @ApiModelProperty("审核状态:默认0未审核,1已通过,2已拒绝,3审核中") + private Integer examineStatus; + + @ApiModelProperty(value = "审核时间") + @TableField(value = "audit_time") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime auditTime; + + @ApiModelProperty(value = "审核不通过原因") + @TableField("refuse_reason") + private String refuseReason; + + @ApiModelProperty("当前状态. 0-待审核审核,1-已通过,2-已拒绝") + private transient Integer currentUserStatus; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/applyForm/CoreApplyFormFillUserApprovalProcess.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/applyForm/CoreApplyFormFillUserApprovalProcess.java new file mode 100644 index 0000000..231519a --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/applyForm/CoreApplyFormFillUserApprovalProcess.java @@ -0,0 +1,125 @@ +package com.yida.data.common.core.entity.applyForm; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; + +/** + * 表单填报用户对应审核流程表 + * + * @author ZYJ + * @date 2023/11/24 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@TableName("core_apply_form_fill_user_approval_process") +public class CoreApplyFormFillUserApprovalProcess implements Serializable { + + private static final long serialVersionUID = -6479609281502216481L; + + /** + * 主键id + */ + @ApiModelProperty("主键id") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 是否删除,1删除0未删除,默认0 + */ + @ApiModelProperty("是否删除,1删除0未删除,默认0") + @TableField("del_flag") + @TableLogic(value = "0", delval = "1") + private Integer delFlag; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + /** + * 创建人id + */ + @ApiModelProperty("创建人id") + @TableField(value = "create_id", fill = FieldFill.INSERT) + private Long createId; + + /** + * 最后修改时间 + */ + @ApiModelProperty("最后修改时间") + @TableField(value = "update_date", fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateDate; + + /** + * 最后修改人id + */ + @ApiModelProperty("最后修改人id") + @TableField(value = "update_id", fill = FieldFill.UPDATE) + private Long updateId; + + /** + * 表单id + */ + @ApiModelProperty("表单id") + @TableField("apply_form_id") + private Long applyFormId; + + @ApiModelProperty("用户填报信息id") + @TableField("fill_user_id") + private Long fillUserId; + + @ApiModelProperty("审核流程节点id") + private Long processId; + + @ApiModelProperty("审核流程节点名称") + private String processName; + + @ApiModelProperty("审核状态:默认0未审核,1已通过,2已拒绝,3审核中") + private Integer examineStatus; + + /** + * 审批人员类型:0指定角色,1指定人员 + */ + @ApiModelProperty("审批人员类型:0-指定角色,1-指定人员") + private Integer approvalUserType; + + /** + * 审批方式:0会审,1或审 + */ + @ApiModelProperty("审批方式:0-会审,1-或审") + private Integer approvalType; + + /** + * 审核顺序 + */ + @ApiModelProperty(value = "审核顺序") + @TableField("sort") + private Integer sort; + + @ApiModelProperty(value = "审核时间") + @TableField(value = "audit_time") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime auditTime; + + @ApiModelProperty("审核记录") + private transient List recordList; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/applyForm/CoreApplyFormFillUserApprovalProcessRecord.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/applyForm/CoreApplyFormFillUserApprovalProcessRecord.java new file mode 100644 index 0000000..7b15484 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/applyForm/CoreApplyFormFillUserApprovalProcessRecord.java @@ -0,0 +1,141 @@ +package com.yida.data.common.core.entity.applyForm; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.yida.data.common.core.entity.user.EduStaff; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * 填报用户表单审核流程记录表(具体的审核信息) + * + * @author ZYJ + * @date 2023/11/24 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@TableName("core_apply_form_fill_user_approval_process_record") +public class CoreApplyFormFillUserApprovalProcessRecord implements Serializable { + + private static final long serialVersionUID = -7325624862092619821L; + + /** + * 主键id + */ + @ApiModelProperty("主键id") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 是否删除,1删除0未删除,默认0 + */ + @ApiModelProperty("是否删除,1删除0未删除,默认0") + @TableField("del_flag") + @TableLogic(value = "0", delval = "1") + private Integer delFlag; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + /** + * 创建人id + */ + @ApiModelProperty("创建人id") + @TableField(value = "create_id", fill = FieldFill.INSERT) + private Long createId; + + /** + * 最后修改时间 + */ + @ApiModelProperty("最后修改时间") + @TableField(value = "update_date", fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateDate; + + /** + * 最后修改人id + */ + @ApiModelProperty("最后修改人id") + @TableField(value = "update_id", fill = FieldFill.UPDATE) + private Long updateId; + + @ApiModelProperty("学校id") + private Long schoolId; + + /** + * 表单id + */ + @ApiModelProperty("表单id") + @TableField("apply_form_id") + private Long applyFormId; + + @ApiModelProperty("用户填报信息id") + @TableField("fill_user_id") + private Long fillUserId; + + @ApiModelProperty("用户审核流程节点id") + private Long userProcessId; + + /** + * 审核人ID + */ + @ApiModelProperty(value = "审核人ID") + @TableField("approval_id") + private Long approvalId; + + /** + * 审核人姓名,记录方便展示 + */ + @ApiModelProperty(value = "审核人姓名,记录方便展示") + @TableField("approval_name") + private String approvalName; + + /** + * 审核结果:2=审核不通过,1=通过,0=待审核,默认0 + */ + @ApiModelProperty(value = "审核结果:2=审核不通过,1=通过,0=待审核,默认0") + @TableField("approval_result") + private Integer approvalResult; + + /** + * 审核不通过的原因 + */ + @ApiModelProperty(value = "审核不通过的原因") + @TableField("approval_reason") + private String approvalReason; + + /** + * 审核顺序 + */ + @ApiModelProperty(value = "审核顺序") + @TableField("sort") + private Integer sort; + + @ApiModelProperty(value = "审核时间") + @TableField(value = "audit_time") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime auditTime; + + @ApiModelProperty("签名图片") + private String signPic; + + @ApiModelProperty(value = "审核人信息") + private transient EduStaff approvalInfo; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/applyForm/CoreApplyFormItem.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/applyForm/CoreApplyFormItem.java new file mode 100644 index 0000000..acf825e --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/applyForm/CoreApplyFormItem.java @@ -0,0 +1,190 @@ +package com.yida.data.common.core.entity.applyForm; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; + +/** + * 申请类型表单组件 Entity + * + * @author ZYJ + * @date 2023/11/14 + */ +@Data +@TableName("core_apply_form_item") +public class CoreApplyFormItem implements Serializable { + + private static final long serialVersionUID = -5678726924637884908L; + + /** + * 主键id + */ + @ApiModelProperty(value = "主键id") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 是否删除,1删除0未删除,默认0 + */ + @ApiModelProperty(value = "是否删除,1删除0未删除,默认0") + @TableField("del_flag") + @TableLogic(value = "0", delval = "1") + private Integer delFlag; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间") + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + /** + * 创建人id + */ + @ApiModelProperty(value = "创建人id") + @TableField(value = "create_id", fill = FieldFill.INSERT) + private Long createId; + + /** + * 最后修改时间 + */ + @ApiModelProperty(value = "最后修改时间") + @TableField(value = "update_date", fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateDate; + + /** + * 最后修改人id + */ + @ApiModelProperty(value = "最后修改人id") + @TableField(value = "update_id", fill = FieldFill.UPDATE) + private Long updateId; + + /** + * 表单ID + */ + @ApiModelProperty(value = "表单ID") + @TableField("form_id") + private Long formId; + + /** + * 组件类型,radio,checkbox,singleInput,moreInput,date,time,dateTime,uploadPic,uploadFile + */ + @ApiModelProperty(value = "组件类型,radio,checkbox,singleInput,moreInput,date,time,dateTime,uploadPic,uploadFile") + @TableField("item_type") + private String itemType; + + /** + * 组件题干名称,如:姓名,性别。。 + */ + @ApiModelProperty(value = "组件题干名称,如:姓名,性别。。") + @TableField("item_title") + private String itemTitle; + + /** + * 表单字段名称 + */ + @ApiModelProperty(value = "表单字段名称") + @TableField("item_filed_name") + private String itemFiledName; + + /** + * 题干说明,子题干 + */ + @ApiModelProperty(value = "题干说明,子题干") + @TableField("item_sub_title") + private String itemSubTitle; + + /** + * 是否必填. 1=是,0=否 + */ + @ApiModelProperty(value = "是否必填. 1=是,0=否") + @TableField("needed") + private String needed; + + /** + * 是否唯一. 1=是,0=否 + */ + @ApiModelProperty(value = "是否唯一. 1=是,0=否") + @TableField("onlyed") + private String onlyed; + + /** + * 图片、文件允许上传数量 + */ + @ApiModelProperty(value = "图片、文件允许上传数量") + @TableField("file_num") + private String fileNum; + + /** + * 输入框宽度,默认 + */ + @ApiModelProperty(value = "输入框宽度,默认") + @TableField("input_width") + private Integer inputWidth; + + /** + * 输入框高度 + */ + @ApiModelProperty(value = "输入框高度") + @TableField("input_height") + private Integer inputHeight; + + /** + * 最少输入 + */ + @ApiModelProperty(value = "最少输入") + @TableField("input_min") + private Integer inputMin; + + /** + * 最大输入 + */ + @ApiModelProperty(value = "最大输入") + @TableField("input_max") + private Integer inputMax; + + /** + * 输入提示 + */ + @ApiModelProperty(value = "输入提示") + @TableField("input_placeholder") + private String inputPlaceholder; + + /** + * 输入限制,0不限,1文本,2数字,3中文,4字母,5邮箱,6电话号码,7身份证,8网址 + */ + @ApiModelProperty(value = "输入限制,0不限,1文本,2数字,3中文,4字母,5邮箱,6电话号码,7身份证,8网址") + @TableField("input_verify") + private Integer inputVerify; + + /** + * 默认值 + */ + @ApiModelProperty(value = "默认值") + @TableField("default_value") + private String defaultValue; + + /** + * 选项布局,1单列,2两列,3三列 + */ + @ApiModelProperty(value = "选项布局,1单列,2两列,3三列") + @TableField("layout") + private Integer layout; + + @ApiModelProperty(value = "排序") + @TableField("sort") + private Integer sort; + + @ApiModelProperty("组件选项集合") + private transient List childrenList; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/applyForm/CoreApplyFormItemChildren.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/applyForm/CoreApplyFormItemChildren.java new file mode 100644 index 0000000..053242d --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/applyForm/CoreApplyFormItemChildren.java @@ -0,0 +1,105 @@ +package com.yida.data.common.core.entity.applyForm; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * 申请类型表单组件选项 Entity + * + * @author ZYJ + * @date 2023/11/14 + */ +@Data +@TableName("core_apply_form_item_children") +public class CoreApplyFormItemChildren implements Serializable { + + private static final long serialVersionUID = -2224125748353276612L; + + /** + * 主键id + */ + @ApiModelProperty(value = "主键id") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 是否删除,1删除0未删除,默认0 + */ + @ApiModelProperty(value = "是否删除,1删除0未删除,默认0") + @TableField("del_flag") + @TableLogic(value = "0", delval = "1") + private Integer delFlag; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间") + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + /** + * 创建人id + */ + @ApiModelProperty(value = "创建人id") + @TableField(value = "create_id", fill = FieldFill.INSERT) + private Long createId; + + /** + * 最后修改时间 + */ + @ApiModelProperty(value = "最后修改时间") + @TableField(value = "update_date", fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateDate; + + /** + * 最后修改人id + */ + @ApiModelProperty(value = "最后修改人id") + @TableField(value = "update_id", fill = FieldFill.UPDATE) + private Long updateId; + + /** + * 表单id + */ + @ApiModelProperty(value = "表单id") + @TableField("form_id") + private Long formId; + + /** + * 表单组件id + */ + @ApiModelProperty(value = "表单组件id") + @TableField("form_item_id") + private Long formItemId; + + /** + * 组件选项排序 + */ + @ApiModelProperty(value = "组件选项排序") + @TableField("sort") + private String sort; + + /** + * 组件选项名称 + */ + @ApiModelProperty(value = "组件选项名称") + @TableField("name") + private String name; + + /** + * 组件选项值 + */ + @ApiModelProperty(value = "组件选项值") + @TableField("value") + private String value; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/applyForm/CoreApprovalProcess.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/applyForm/CoreApprovalProcess.java new file mode 100644 index 0000000..855edde --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/applyForm/CoreApprovalProcess.java @@ -0,0 +1,106 @@ +package com.yida.data.common.core.entity.applyForm; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; + +/** + * 审核流程表 + * + * @author ZYJ + * @date 2023/11/20 + */ +@Data +@TableName("core_approval_process") +public class CoreApprovalProcess implements Serializable { + + private static final long serialVersionUID = 1567064061806999398L; + + /** + * 主键id + */ + @ApiModelProperty(value = "主键id") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 是否删除,1删除0未删除,默认0 + */ + @ApiModelProperty(value = "是否删除,1删除0未删除,默认0") + @TableField("del_flag") + @TableLogic(value = "0", delval = "1") + private Integer delFlag; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间") + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + /** + * 创建人id + */ + @ApiModelProperty(value = "创建人id") + @TableField(value = "create_id", fill = FieldFill.INSERT) + private Long createId; + + /** + * 最后修改时间 + */ + @ApiModelProperty(value = "最后修改时间") + @TableField(value = "update_date", fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateDate; + + /** + * 最后修改人id + */ + @ApiModelProperty(value = "最后修改人id") + @TableField(value = "update_id", fill = FieldFill.UPDATE) + private Long updateId; + + /** + * 部门id + */ + @ApiModelProperty(value = "部门id") + @TableField("dept_id") + private Long deptId; + + /** + * 审核流程名称 + */ + @ApiModelProperty(value = "审核流程名称") + @TableField("approval_process_name") + private String approvalProcessName; + + + /** + * 审批人员类型:0指定角色,1指定人员 + */ + @ApiModelProperty(value = "审批人员类型:0-指定角色,1-指定人员") + @TableField("approval_user_type") + private Integer approvalUserType; + + /** + * 审批方式:0会审,1或审 + */ + @ApiModelProperty(value = "审批方式:0-会审,1-或审") + @TableField("approval_type") + private Integer approvalType; + + @ApiModelProperty("审核人员字符串") + private transient String approvalUserName; + + @ApiModelProperty("对应用户集合") + private transient List userList; +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/applyForm/CoreApprovalProcessUser.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/applyForm/CoreApprovalProcessUser.java new file mode 100644 index 0000000..a2bcd53 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/applyForm/CoreApprovalProcessUser.java @@ -0,0 +1,109 @@ +package com.yida.data.common.core.entity.applyForm; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * 审核流程人员配置表 + * + * @author ZYJ + * @date 2023/11/20 + */ +@Data +@TableName("core_approval_process_user") +public class CoreApprovalProcessUser implements Serializable { + + private static final long serialVersionUID = -3563923283400305812L; + + /** + * 主键id + */ + @ApiModelProperty(value = "主键id") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 是否删除,1删除0未删除,默认0 + */ + @ApiModelProperty(value = "是否删除,1删除0未删除,默认0") + @TableField("del_flag") + @TableLogic(value = "0", delval = "1") + private Integer delFlag; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间") + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + /** + * 创建人id + */ + @ApiModelProperty(value = "创建人id") + @TableField(value = "create_id", fill = FieldFill.INSERT) + private Long createId; + + /** + * 最后修改时间 + */ + @ApiModelProperty(value = "最后修改时间") + @TableField(value = "update_date", fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateDate; + + /** + * 最后修改人id + */ + @ApiModelProperty(value = "最后修改人id") + @TableField(value = "update_id", fill = FieldFill.UPDATE) + private Long updateId; + + /** + * 流程id + */ + @ApiModelProperty(value = "流程id") + @TableField("process_id") + private Long processId; + + /** + * 对应名称 + */ + @TableField("name") + private String name; + + /** + * 指定人员id + */ + @ApiModelProperty(value = "指定人员id") + @TableField("staff_id") + private Long staffId; + + /** + * 指定角色id,这里指的是班主任、系主任. 1、班主任,2、系主任 + */ + @ApiModelProperty(value = "指定角色id,这里指的是班主任、系主任. 1、班主任,2、系主任") + @TableField("staff_role_id") + private Integer staffRoleId; + + /** + * 审核身份 + */ + @TableField("approval_identity") + private String approvalIdentity; + + /** + * 公章id + */ + @TableField("official_seal_id") + private Long officialSealId; +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/applyForm/CoreApprovalRemind.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/applyForm/CoreApprovalRemind.java new file mode 100644 index 0000000..5f314d5 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/applyForm/CoreApprovalRemind.java @@ -0,0 +1,93 @@ +package com.yida.data.common.core.entity.applyForm; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.yida.data.common.core.enums.EnableStatusEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; + +/** + * 审核提醒策略表 + * + * @author ZYJ + * @date 2023/11/20 + */ +@Data +@TableName("core_approval_remind") +public class CoreApprovalRemind implements Serializable { + + private static final long serialVersionUID = 5478339812311556241L; + + /** + * 主键id + */ + @ApiModelProperty(value = "主键id") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 是否删除,1删除0未删除,默认0 + */ + @ApiModelProperty(value = "是否删除,1删除0未删除,默认0") + @TableField("del_flag") + @TableLogic(value = "0", delval = "1") + private Integer delFlag; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间") + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + /** + * 创建人id + */ + @ApiModelProperty(value = "创建人id") + @TableField(value = "create_id", fill = FieldFill.INSERT) + private Long createId; + + /** + * 最后修改时间 + */ + @ApiModelProperty(value = "最后修改时间") + @TableField(value = "update_date", fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateDate; + + /** + * 最后修改人id + */ + @ApiModelProperty(value = "最后修改人id") + @TableField(value = "update_id", fill = FieldFill.UPDATE) + private Long updateId; + + /** + * 部门id + */ + @ApiModelProperty(value = "部门id") + @TableField("dept_id") + private Long deptId; + + /** + * 审核提醒状态. 0为停用,1为启用 {@link EnableStatusEnum} + */ + @ApiModelProperty(value = "审核提醒状态. 0为停用,1为启用") + @TableField("approval_remind_status") + private Integer approvalRemindStatus; + + /** + * 审核结果状态. 0为停用,1为启用 {@link EnableStatusEnum} + */ + @ApiModelProperty(value = "审核结果状态. 0为停用,1为启用") + @TableField("approval_result_status") + private Integer approvalResultStatus; +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/applyForm/CoreOfficialSeal.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/applyForm/CoreOfficialSeal.java new file mode 100644 index 0000000..2687eab --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/applyForm/CoreOfficialSeal.java @@ -0,0 +1,100 @@ +package com.yida.data.common.core.entity.applyForm; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.yida.data.common.core.enums.EnableStatusEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; + +/** + * 学校公章表 Entity + * + * @author ZYJ + * @date 2023/11/17 + */ +@Data +@TableName("core_official_seal") +public class CoreOfficialSeal implements Serializable { + + private static final long serialVersionUID = 1044572430104864196L; + + /** + * 主键id + */ + @ApiModelProperty(value = "主键id") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 是否删除,1删除0未删除,默认0 + */ + @ApiModelProperty(value = "是否删除,1删除0未删除,默认0") + @TableField("del_flag") + @TableLogic(value = "0", delval = "1") + private Integer delFlag; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间") + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + /** + * 创建人id + */ + @ApiModelProperty(value = "创建人id") + @TableField(value = "create_id", fill = FieldFill.INSERT) + private Long createId; + + /** + * 最后修改时间 + */ + @ApiModelProperty(value = "最后修改时间") + @TableField(value = "update_date", fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateDate; + + /** + * 最后修改人id + */ + @ApiModelProperty(value = "最后修改人id") + @TableField(value = "update_id", fill = FieldFill.UPDATE) + private Long updateId; + + /** + * 部门id + */ + @ApiModelProperty(value = "部门id") + @TableField("dept_id") + private Long deptId; + + /** + * 公章名称 + */ + @ApiModelProperty(value = "公章名称") + @TableField("official_seal_title") + private String officialSealTitle; + + /** + * 状态. 0为停用,1为启用 {@link EnableStatusEnum} + */ + @ApiModelProperty("状态. 0为停用,1为启用") + @TableField("status") + private Integer status; + + /** + * 公章图片地址 + */ + @ApiModelProperty("公章图片地址") + @TableField("pic_url") + private String picUrl; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/EduAttendanceRecord.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/EduAttendanceRecord.java index 6cd53c1..c5fb84b 100644 --- a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/EduAttendanceRecord.java +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/EduAttendanceRecord.java @@ -35,6 +35,9 @@ public class EduAttendanceRecord { private String className; + @ApiModelProperty("0上学,1宿舍") + private Integer type; + @ApiModelProperty("宿舍id") private Long dormId; @@ -83,5 +86,8 @@ public class EduAttendanceRecord { @ApiModelProperty("该条记录使用的考勤时间段") private Long ruleTimeId; + @ApiModelProperty("考勤时间段类型:0开始时间,1结束时间") + private Integer ruleTimeType; + private transient String deviceName; } diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/EduAttendanceResult.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/EduAttendanceResult.java index b700b27..464f8a4 100644 --- a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/EduAttendanceResult.java +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/EduAttendanceResult.java @@ -109,9 +109,15 @@ public class EduAttendanceResult { /** * 考勤结果,100-正常, 201-迟到,202-早退,203-迟到早退,204-旷课,205-请假, 211-晚归,212-异常晚归,213-旷宿,214-已被核查但学生还未归寝 */ - @ApiModelProperty(value = "考勤结果,100-正常,201-迟到,202-早退,203-迟到早退,204-旷课,205-请假,211-晚归,212-异常晚归,213-旷宿,214-已被核查但学生还未归寝") + @ApiModelProperty(value = "考勤结果,100-正常,201-迟到,202-早退,203-迟到早退,204-旷课,205-请假,206-上班未打卡|下班正常,207-上班未打卡|下班早退,208-上班未打卡|下班未在有效打卡时间段内,209-上班未在有效打卡时间段内|下班早退,210-上班迟到|下班未打卡,211-晚归,212-异常晚归,213-旷宿,214-已被核查但学生还未归寝") @TableField("status") private Integer status; + @ApiModelProperty(value = "开始时间考勤结果1正常,0异常,空未打卡") + @TableField("begin_status") + private Integer beginStatus; + @ApiModelProperty(value = "结束时间考勤结果1正常,0异常,空未打卡") + @TableField("end_status") + private Integer endStatus; /** * 核查时间 @@ -165,4 +171,7 @@ public class EduAttendanceResult { @ApiModelProperty("学号") private transient String stuNo; + + @ApiModelProperty("类型:1宿舍考勤,0上学考勤") + private transient Integer type; } diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/EduAttendanceResultPushReportRecord.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/EduAttendanceResultPushReportRecord.java new file mode 100644 index 0000000..661efe4 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/EduAttendanceResultPushReportRecord.java @@ -0,0 +1,80 @@ +package com.yida.data.common.core.entity.attendance; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * 考勤结果报告推送记录 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@TableName("edu_attendance_result_push_report_record") +public class EduAttendanceResultPushReportRecord { + + @ApiModelProperty(value = "") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @ApiModelProperty(value = "") + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + @ApiModelProperty(value = "") + @TableField(value = "create_id", fill = FieldFill.INSERT) + private Long createId; + + @ApiModelProperty(value = "") + @TableField(value = "update_date", fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateDate; + + @ApiModelProperty(value = "") + @TableField(value = "update_id", fill = FieldFill.UPDATE) + private Long updateId; + + @ApiModelProperty(value = "") + private Long staffId; + + @ApiModelProperty(value = "宿舍id") + private Long staffRole; + + @ApiModelProperty("推送日期") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") + private LocalDate pushDate; + + @ApiModelProperty(value = "推送时间") + @DateTimeFormat(pattern = "HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "HH:mm:ss") + private LocalTime pushTime; + + @ApiModelProperty("学校ID") + private Long schoolId; + + @ApiModelProperty("类型:1宿舍考勤,0上学考勤") + private Integer type; + + @ApiModelProperty("考勤规则ID") + private Long ruleId; + + @ApiModelProperty("考勤规则时段ID") + private Long ruleTimeId; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/EduAttendanceRuleDevice.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/EduAttendanceRuleDevice.java index 3f44f10..8a59f1f 100644 --- a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/EduAttendanceRuleDevice.java +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/EduAttendanceRuleDevice.java @@ -11,6 +11,7 @@ import java.time.LocalDateTime; @Data @ApiModel("规则设备") public class EduAttendanceRuleDevice { + @TableId(type = IdType.AUTO) private Long id; @@ -23,9 +24,12 @@ public class EduAttendanceRuleDevice { @ApiModelProperty("设备编号") private String deviceSn; + @ApiModelProperty("设备名称") + private String deviceName; + @ApiModelProperty("创建时间") private LocalDateTime createDate; - + @ApiModelProperty("创建人ID") private Long createId; diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/EduAttendanceStaffResult.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/EduAttendanceStaffResult.java index 1238c8e..bb8a816 100644 --- a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/EduAttendanceStaffResult.java +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/EduAttendanceStaffResult.java @@ -1,11 +1,13 @@ package com.yida.data.common.core.entity.attendance; +import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModelProperty; +import java.time.LocalDateTime; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; @@ -60,10 +62,21 @@ public class EduAttendanceStaffResult { /** * 考勤结果,0-正常,1-迟到,2-早退,3-旷工,4-迟到早退,5-上班未在打卡时间段,6-下班未在打卡时间段 */ - @ApiModelProperty(value = "考勤结果,0-正常,1-迟到,2-早退,3-旷工,4-迟到早退,5-上班未在打卡时间段,6-下班未在打卡时间段") + @ApiModelProperty(value = "考勤结果,0-正常,1-迟到,2-早退,3-旷工,4-迟到早退,5-上班未在打卡时间段,6-下班未在打卡时间段,7-上班未在打卡时间段|早退,8-上班迟到|下班未打卡") @TableField("status") private Integer status; + /** + * 上班考勤状态 0 正常 1 异常 + */ + @TableField("start_status") + private Integer startStatus; + /** + * 下班考勤状态 0 正常 1 异常 + */ + @TableField("end_status") + private Integer endStatus; + /** * 考勤日期 */ @@ -92,4 +105,14 @@ public class EduAttendanceStaffResult { @DateTimeFormat(pattern = "HH:mm:ss") @JsonFormat(timezone = "GMT+8", pattern = "HH:mm:ss") private LocalTime endRealTime; + + @TableField(value = "CREATE_TIME", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; + + @TableField(value = "UPDATE_TIME", fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateTime; } diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/EduUserStrategy.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/EduUserStrategy.java new file mode 100644 index 0000000..41f58b0 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/EduUserStrategy.java @@ -0,0 +1,116 @@ +package com.yida.data.common.core.entity.attendance; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * 人员策略信息 Entity + * 请假策略 + * + * @author ZYJ + * @date 2023-11-07 11:40:58 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@TableName("edu_user_strategy") +public class EduUserStrategy implements Serializable { + + private static final long serialVersionUID = -1811492574443072051L; + + /** + * 策略id + */ + @ApiModelProperty(value = "策略id(主键)") + @TableId(value = "strategy_id", type = IdType.INPUT) + private Long strategyId; + + /** + * 是否删除,1删除0未删除,默认0 + */ + @ApiModelProperty(value = "是否删除,1删除0未删除,默认0") + @TableField("del_flag") + @TableLogic(value = "0", delval = "1") + private Integer delFlag; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间") + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + /** + * 创建人id + */ + @ApiModelProperty(value = "创建人id") + @TableField(value = "create_id", fill = FieldFill.INSERT) + private Long createId; + + /** + * 最后修改时间 + */ + @ApiModelProperty(value = "最后修改时间") + @TableField(value = "update_date", fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateDate; + + /** + * 最后修改人id + */ + @ApiModelProperty(value = "最后修改人id") + @TableField(value = "update_id", fill = FieldFill.UPDATE) + private Long updateId; + + /** + * 用户id + */ + @ApiModelProperty(value = "用户id") + @TableField("user_id") + private Long userId; + + /** + * 用户类型,0-学生,1-职工 + */ + @ApiModelProperty(value = "用户类型,0-学生,1-职工") + @TableField("user_type") + private Integer userType; + + /** + * 策略开始时间 + */ + @ApiModelProperty(value = "策略开始时间") + @TableField("start_time") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime startTime; + + /** + * 策略结束时间 + */ + @ApiModelProperty(value = "策略结束时间") + @TableField("end_time") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime endTime; + + /** + * 学校部门id + */ + @ApiModelProperty(value = "学校部门id") + @TableField("dept_id") + private Long deptId; +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/attendance/AttendanceRecord.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/attendance/AttendanceRecord.java new file mode 100644 index 0000000..4ce11a8 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/attendance/AttendanceRecord.java @@ -0,0 +1,265 @@ +package com.yida.data.common.core.entity.attendance.attendance; + +import java.util.Date; +import lombok.Data; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; + +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; +import java.time.LocalDate; +import java.time.LocalTime; + +/** + * @date 2023-08-09 11:37:25 + */ +@Data +@TableName("attendance_record") +public class AttendanceRecord { + + /** + * + */ + @ApiModelProperty(value = "") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * + */ + @ApiModelProperty(value = "") + @TableField("user_type") + private Integer userType; + + /** + * + */ + @ApiModelProperty(value = "") + @TableField("user_id") + private Long userId; + + @ApiModelProperty(value = "") + @TableField("user_name") + private String userName; + + /** + * 学校id + */ + @ApiModelProperty(value = "学校id") + @TableField("school_id") + private Long schoolId; + + /** + * 校区id + */ + @ApiModelProperty(value = "校区id") + @TableField("campus_id") + private Long campusId; + + /** + * 校区id + */ + @ApiModelProperty(value = "校区id") + @TableField("campus_name") + private String campusName; + + @ApiModelProperty(value = "年级id") + @TableField("section_id") + private Long sectionId; + + @ApiModelProperty(value = "年级id") + @TableField("section_name") + private String sectionName; + + /** + * 年级id + */ + @ApiModelProperty(value = "年级id") + @TableField("grade_id") + private Long gradeId; + + /** + * 年级名称 + */ + @ApiModelProperty(value = "年级名称") + @TableField("grade_name") + private String gradeName; + + /** + * 班级id + */ + @ApiModelProperty(value = "班级id") + @TableField("class_id") + private Long classId; + + /** + * 班级名称 + */ + @ApiModelProperty(value = "班级名称") + @TableField("class_name") + private String className; + + /** + * 宿舍id + */ + @ApiModelProperty(value = "宿舍id") + @TableField("dorm_id") + private Long dormId; + + /** + * 宿舍名称 + */ + @ApiModelProperty(value = "宿舍名称") + @TableField("dorm_name") + private String dormName; + + /** + * 考勤时宿舍-寝室id + */ + @ApiModelProperty(value = "考勤时宿舍-寝室id") + @TableField("dorm_room_id") + private Long dormRoomId; + + /** + * 考勤时宿舍-寝室名称 + */ + @ApiModelProperty(value = "考勤时宿舍-寝室名称") + @TableField("dorm_room_name") + private String dormRoomName; + + /** + * 考勤设备id + */ + @ApiModelProperty(value = "考勤设备id") + @TableField("device_id") + private Long deviceId; + + + /** + * 考勤设备Name + */ + @ApiModelProperty(value = "考勤设备Name") + @TableField("device_name") + private String deviceName; + + + /** + * 考勤wifiid + */ + @ApiModelProperty(value = "考勤wifiid") + @TableField("wifi_id") + private Long wifiId; + + + /** + * 考勤wifiName + */ + @ApiModelProperty(value = "考勤wifiName") + @TableField("wifi_name") + private String wifiName; + + /** + * 考勤范围ID + */ + @ApiModelProperty(value = "考勤范围ID") + @TableField("address_id") + private Long addressId; + + /** + * 范围名称 + */ + @ApiModelProperty(value = "范围名称") + @TableField("address_name") + private Long addressName; + + + /** + * 记录生成时间 + */ + @ApiModelProperty(value = "记录生成时间") + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + /** + * 进出时间 + */ + @ApiModelProperty(value = "进出时间") + @TableField("create_time") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; + + /** + * 闸机识别图片地址 + */ + @ApiModelProperty(value = "闸机识别图片地址") + @TableField("pic_url") + private String picUrl; + + /** + * 考勤结果,0-正常,1-异常 + */ + @ApiModelProperty(value = "考勤结果,0-正常,1-异常") + @TableField("status") + private Integer status; + + /** + * 0-进,1-出 + */ + @ApiModelProperty(value = "0-进,1-出") + @TableField("scope") + private Integer scope; + + /** + * 0-进,1-出 + */ + @ApiModelProperty(value = "0-校门,1-宿舍") + @TableField("zone") + private Integer zone; + + /** + * 该次考勤比较的规则中正常考勤时间 + */ + @ApiModelProperty(value = "该次考勤比较的规则中正常考勤时间") + @TableField("sti_time") + @DateTimeFormat(pattern = "HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "HH:mm:ss") + private LocalTime stiTime; + + /** + * 匹配的考勤规则 + */ + @ApiModelProperty(value = "匹配的考勤规则") + @TableField("rule_id") + private Long ruleId; + + /** + * 匹配的考勤时间id + */ + @ApiModelProperty(value = "匹配的考勤时间id") + @TableField("rule_time_id") + private Long ruleTimeId; + + /** + * 考勤时间段类型:0上班时间,1下班时间 + */ + @ApiModelProperty(value = "考勤时间段类型:0上班时间,1下班时间") + @TableField("rule_time_type") + private Integer ruleTimeType; + + /** + * 设备侧元数据ID + */ + @ApiModelProperty(value = "设备侧元数据ID") + @TableField("original_record_id") + private String originalRecordId; +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/attendance/AttendanceReportPushRecord.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/attendance/AttendanceReportPushRecord.java new file mode 100644 index 0000000..656ef55 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/attendance/AttendanceReportPushRecord.java @@ -0,0 +1,104 @@ +package com.yida.data.common.core.entity.attendance.attendance; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * @date 2023-08-09 11:37:25 + */ +@Data +@TableName("attendance_report_push_record") +public class AttendanceReportPushRecord { + + /** + * + */ + @ApiModelProperty(value = "") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * + */ + @ApiModelProperty(value = "") + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + /** + * + */ + @ApiModelProperty(value = "") + @TableField(value = "create_id", fill = FieldFill.INSERT) + private Long createId; + + /** + * + */ + @ApiModelProperty(value = "") + @TableField(value = "create_name", fill = FieldFill.INSERT) + private String createName; + + /** + * + */ + @ApiModelProperty(value = "") + @TableField(value = "update_date", fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateDate; + + /** + * + */ + @ApiModelProperty(value = "") + @TableField(value = "update_id", fill = FieldFill.UPDATE) + private Long updateId; + + /** + * + */ + @ApiModelProperty(value = "") + @TableField("del_flag") + @TableLogic(value = "0", delval = "1") + private Integer delFlag; + + /** + * 学校id + */ + @ApiModelProperty(value = "学校id") + @TableField("school_id") + private Long schoolId; + + + @ApiModelProperty(value = "0-教职工考勤推送,1学生考勤推送") + @TableField("type") + private Integer type; + + @TableField("rule_id") + private Long ruleId; + + + @ApiModelProperty(value = "1日报") + @TableField("report_type") + private Integer reportType; + + + @TableField("push_date") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") + private LocalDate pushDate; + +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/attendance/AttendanceReportStrategy.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/attendance/AttendanceReportStrategy.java new file mode 100644 index 0000000..942854d --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/attendance/AttendanceReportStrategy.java @@ -0,0 +1,199 @@ +package com.yida.data.common.core.entity.attendance.attendance; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * @date 2023-08-09 11:37:25 + */ +@Data +@TableName("attendance_report_strategy") +public class AttendanceReportStrategy { + + /** + * + */ + @ApiModelProperty(value = "") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * + */ + @ApiModelProperty(value = "") + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + /** + * + */ + @ApiModelProperty(value = "") + @TableField(value = "create_id", fill = FieldFill.INSERT) + private Long createId; + + /** + * + */ + @ApiModelProperty(value = "") + @TableField(value = "create_name", fill = FieldFill.INSERT) + private String createName; + + /** + * + */ + @ApiModelProperty(value = "") + @TableField(value = "update_date", fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateDate; + + /** + * + */ + @ApiModelProperty(value = "") + @TableField(value = "update_id", fill = FieldFill.UPDATE) + private Long updateId; + + /** + * + */ + @ApiModelProperty(value = "") + @TableField("del_flag") + @TableLogic(value = "0", delval = "1") + private Integer delFlag; + + /** + * 学校id + */ + @ApiModelProperty(value = "学校id") + @TableField("school_id") + private Long schoolId; + + /** + * 0-教职工考勤推送,1学生考勤推送,2家长提醒 + */ + @ApiModelProperty(value = "0-教职工考勤推送,1学生考勤推送,2家长提醒") + @TableField("type") + private Integer type; + + /** + * 是否推送周报0-否,1是 + */ + @ApiModelProperty(value = "是否推送周报0-否,1是") + @TableField("week_report") + private Integer weekReport; + + @ApiModelProperty(value = "周报推送推送日期:小于周三,推送上月周。大于周三推送本周") + @TableField("week_report_date") + private Integer weekReportDate; + + /** + * 周报推送时间:每周一XX点 + */ + @ApiModelProperty(value = "周报推送时间:每周一XX点") + @TableField("week_report_time") + @DateTimeFormat(pattern = "HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "HH:mm:ss") + private LocalTime weekReportTime; + + + /** + * 是否推送月报0-否,1是 + */ + @ApiModelProperty(value = "是否推送月报0-否,1是") + @TableField("month_report") + private Integer monthReport; + + @ApiModelProperty(value = "月报推送推送日期:小于5号,推送上月。大于5号推送本月") + @TableField("month_report_date") + private Integer monthReportDate; + + /** + * 月报推送时间:每月1号XX点 + */ + @ApiModelProperty(value = "月报推送时间:每月1号XX点") + @TableField("month_report_time") + @DateTimeFormat(pattern = "HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "HH:mm:ss") + private LocalTime monthReportTime; + + /** + * 是否推送迟到报告 0-否,1是 + */ + @ApiModelProperty(value = "是否推送迟到报告 0-否,1是") + @TableField("late_report") + private Integer lateReport; + + /** + * 迟到报告推送时间:超过考勤开始时间XXX分钟 + */ + @ApiModelProperty(value = "迟到报告推送时间:超过考勤开始时间XXX分钟") + @TableField("late_report_time") + private Integer lateReportTime; + + + /** + * 是否推送缺勤报告 0-否,1是 + */ + @ApiModelProperty(value = "是否推送缺勤报告 0-否,1是") + @TableField("miss_report") + private Integer missReport; + + /** + * 缺勤报告推送时间:超过考勤结束时间XXX分钟 + */ + @ApiModelProperty(value = "缺勤报告推送时间:超过考勤结束时间XXX分钟") + @TableField("miss_report_time") + private Integer missReportTime; + + + /** + * 考勤管理员是否推送报告,1是,0否 + */ + @ApiModelProperty(value = "考勤管理员是否推送报告,1是,0否") + @TableField("obj_manager") + private Integer objManager; + + + /** + * 指定人员:职工ID集合,逗号分隔 + */ + @ApiModelProperty(value = "指定人员:职工ID集合,逗号分隔") + @TableField("obj_staff_ids") + private String objStaffIds; + + /** + * 家长入校/离校提醒:0否,1是 + */ + @ApiModelProperty(value = "家长入校/离校提醒:0否,1是") + @TableField("parent_enroll_report") + private Integer parentEnrollReport; + + + /** + * 是否推送日报0-否,1是 + */ + @ApiModelProperty(value = "是否推送日报0-否,1是") + @TableField("day_report") + private Integer dayReport; + + /** + * 日报推送时间:超过考勤结束时间XXX分钟 + */ + @ApiModelProperty(value = "日报推送时间:超过考勤结束时间XXX分钟") + @TableField("day_report_time") + private Integer dayReportTime; +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/attendance/AttendanceResult.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/attendance/AttendanceResult.java new file mode 100644 index 0000000..899f702 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/attendance/AttendanceResult.java @@ -0,0 +1,196 @@ +package com.yida.data.common.core.entity.attendance.attendance; + +import java.util.Date; +import lombok.Data; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; + +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; +import java.time.LocalDate; +import java.time.LocalTime; + +/** + * @date 2023-08-09 11:37:25 + */ +@Data +@TableName("attendance_result") +public class AttendanceResult { + + /** + * + */ + @ApiModelProperty(value = "") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 0-固定上下班时间模式,1自由打卡模式 + */ + @ApiModelProperty(value = "0-固定上下班时间模式,1自由打卡模式") + @TableField("att_type") + private Integer attType; + + /** + * + */ + @ApiModelProperty(value = "") + @TableField("user_type") + private Integer userType; + + /** + * 用户id + */ + @ApiModelProperty(value = "用户id") + @TableField("user_id") + private Long userId; + + /** + * 学校id + */ + @ApiModelProperty(value = "学校id") + @TableField("school_id") + private Long schoolId; + + /** + * 考勤规则id + */ + @ApiModelProperty(value = "考勤规则id") + @TableField("rule_id") + private Long ruleId; + + /** + * 考勤规则时间段id + */ + @ApiModelProperty(value = "考勤规则时间段id") + @TableField("rule_time_id") + private Long ruleTimeId; + + /** + * 考勤结果,0-正常,1-迟到,2-早退,3-旷工,4-迟到早退,5缺卡 + */ + @ApiModelProperty(value = "考勤结果,0-正常,1-迟到,2-早退,3-旷工,4-迟到早退,5缺卡,6请假,7晚归,8异常晚归") + @TableField("status") + private Integer status; + + /** + * 考勤日期 + */ + @ApiModelProperty(value = "考勤日期") + @TableField("attendance_date") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") + private LocalDate attendanceDate; + + /** + * 上班应打卡时间 + */ + @ApiModelProperty(value = "上班应打卡时间") + @TableField("start_sti_time") + @DateTimeFormat(pattern = "HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "HH:mm:ss") + private LocalTime startStiTime; + + /** + * 上班实际打卡时间 + */ + @ApiModelProperty(value = "上班实际打卡时间") + @TableField("start_real_time") + @DateTimeFormat(pattern = "HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "HH:mm:ss") + private LocalTime startRealTime; + + /** + * 上班考勤结果 + */ + @ApiModelProperty(value = "上班考勤结果") + @TableField("start_status") + private Integer startStatus; + + + /** + * 迟到分钟数 + */ + @ApiModelProperty(value = "迟到分钟数") + @TableField("start_late_time") + private Long startLateTime; + + /** + * 上班打卡照片 + */ + @ApiModelProperty(value = "上班打卡照片") + @TableField("start_pic_url") + private String startPicUrl; + + /** + * 早退分钟数 + */ + @ApiModelProperty(value = "早退分钟数") + @TableField("end_leave_time") + private Long endLeaveTime; + + /** + * 下班应打卡时间 + */ + @ApiModelProperty(value = "下班应打卡时间") + @TableField("end_sti_time") + @DateTimeFormat(pattern = "HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "HH:mm:ss") + private LocalTime endStiTime; + + /** + * 下班实际打卡时间 + */ + @ApiModelProperty(value = "下班实际打卡时间") + @TableField("end_real_time") + @DateTimeFormat(pattern = "HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "HH:mm:ss") + private LocalTime endRealTime; + + /** + * 下班考勤结果 + */ + @ApiModelProperty(value = "下班考勤结果") + @TableField("end_status") + private Integer endStatus; + + + /** + * 下班打卡照片 + */ + @ApiModelProperty(value = "下班打卡照片") + @TableField("end_pic_url") + private String endPicUrl; + + /** + * + */ + @ApiModelProperty(value = "") + @TableField("create_time") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; + + /** + * + */ + @ApiModelProperty(value = "") + @TableField("update_time") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateTime; + + + private transient String campusName; + private transient String sectionName; + private transient String gradeName; + private transient String className; + +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/attendance/AttendanceRule.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/attendance/AttendanceRule.java new file mode 100644 index 0000000..fcfadf8 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/attendance/AttendanceRule.java @@ -0,0 +1,219 @@ +package com.yida.data.common.core.entity.attendance.attendance; + +import java.util.Date; +import lombok.Data; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; + +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; +import java.time.LocalDate; +import java.time.LocalTime; + +/** + * @date 2023-08-09 11:37:25 + */ +@Data +@TableName("attendance_rule") +public class AttendanceRule { + + /** + * + */ + @ApiModelProperty(value = "") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * + */ + @ApiModelProperty(value = "") + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + /** + * + */ + @ApiModelProperty(value = "") + @TableField(value = "create_id", fill = FieldFill.INSERT) + private Long createId; + + /** + * + */ + @ApiModelProperty(value = "") + @TableField(value = "create_name", fill = FieldFill.INSERT) + private String createName; + + /** + * + */ + @ApiModelProperty(value = "") + @TableField(value = "update_date", fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateDate; + + /** + * + */ + @ApiModelProperty(value = "") + @TableField(value = "update_id", fill = FieldFill.UPDATE) + private Long updateId; + + /** + * + */ + @ApiModelProperty(value = "") + @TableField("del_flag") + @TableLogic(value = "0", delval = "1") + private Integer delFlag; + + /** + * 学校id + */ + @ApiModelProperty(value = "学校id") + @TableField("school_id") + private Long schoolId; + + /** + * 考勤规则名称 + */ + @ApiModelProperty(value = "考勤规则名称") + @TableField("name") + private String name; + + /** + * 0-教职工打卡,1学生上学考勤,2学生宿舍考勤 + */ + @ApiModelProperty(value = "0-教职工打卡,1学生上学考勤,2学生宿舍考勤") + @TableField("user_type") + private Integer userType; + + /** + * 0-固定上下班时间模式,1自由打卡模式 + */ + @ApiModelProperty(value = "0-固定上下班时间模式,1自由打卡模式") + @TableField("type") + private Integer type; + + /** + * 打卡日期,1-周一,2-周二....多个用','连接 + */ + @ApiModelProperty(value = "打卡日期,1-周一,2-周二....多个用','连接") + @TableField("week") + private String week; + + /** + * 法定节假日是否打卡,0-是,1-否 + */ + @ApiModelProperty(value = "法定节假日是否打卡,0-是,1-否") + @TableField("holiday_attendance") + private Integer holidayAttendance; + + /** + * 管理员打卡规则内容权限,0-无,1-有 + */ + @ApiModelProperty(value = "管理员打卡规则内容权限,0-无,1-有") + @TableField("role_rule") + private Integer roleRule; + + /** + * 管理员打卡人员与白名单权限,0-无,1-有 + */ + @ApiModelProperty(value = "管理员打卡人员与白名单权限,0-无,1-有") + @TableField("role_user") + private Integer roleUser; + + /** + * 管理员节假日与特殊日期权限,0-无,1-有 + */ + @ApiModelProperty(value = "管理员节假日与特殊日期权限,0-无,1-有") + @TableField("role_date") + private Integer roleDate; + + /** + * 管理员打卡提醒权限,0-无,1-有 + */ + @ApiModelProperty(value = "管理员打卡提醒权限,0-无,1-有") + @TableField("role_remind") + private Integer roleRemind; + + /** + * 打卡是必须拍照 0-无,1-必须 + */ + @ApiModelProperty(value = "打卡是必须拍照 0-无,1-必须") + @TableField("photo_take") + private Integer photoTake; + + /** + * 打卡时必须人脸识别0-无,1-必须 + */ + @ApiModelProperty(value = "打卡时必须人脸识别0-无,1-必须") + @TableField("face_take") + private Integer faceTake; + + /** + * 填写备注时必须拍照0-无,1-必须 + */ + @ApiModelProperty(value = "填写备注时必须拍照0-无,1-必须") + @TableField("photo_remark") + private Integer photoRemark; + + /** + * 异常打卡可以提交申请,审批后可修正打卡状态 + */ + @ApiModelProperty(value = "异常打卡可以提交申请,审批后可修正打卡状态") + @TableField("apply_amendment") + private Integer applyAmendment; + + /** + * 每月补卡次数 + */ + @ApiModelProperty(value = "每月补卡次数") + @TableField("reissue_num") + private Integer reissueNum; + + /** + * 每月补卡截止日期 + */ + @ApiModelProperty(value = "每月补卡截止日期") + @TableField("reissue_end_date") + private Integer reissueEndDate; + + + /** + * 启用状态:0-未启用,1-已启用 + */ + @ApiModelProperty(value = "启用状态:0-未启用,1-已启用") + @TableField("status") + private Integer status; + + /** + * 有效开始时间 + */ + @ApiModelProperty(value = "有效开始时间") + @TableField("start_date") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") + private LocalDate startDate; + + + /** + * 有效结束时间 + */ + @ApiModelProperty(value = "有效结束时间") + @TableField("end_date") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") + private LocalDate endDate; +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/attendance/AttendanceRuleAddress.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/attendance/AttendanceRuleAddress.java new file mode 100644 index 0000000..64aa5f5 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/attendance/AttendanceRuleAddress.java @@ -0,0 +1,101 @@ +package com.yida.data.common.core.entity.attendance.attendance; + +import java.util.Date; +import lombok.Data; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; + +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; +import java.time.LocalDate; +import java.time.LocalTime; + +/** + * 考勤规则关联地点 Entity + * + * @date 2023-08-09 11:37:25 + */ +@Data +@TableName("attendance_rule_address") +public class AttendanceRuleAddress { + + /** + * + */ + @ApiModelProperty(value = "") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * + */ + @ApiModelProperty(value = "") + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + /** + * + */ + @ApiModelProperty(value = "") + @TableField(value = "create_id", fill = FieldFill.INSERT) + private Long createId; + + /** + * + */ + @ApiModelProperty(value = "") + @TableField(value = "create_name", fill = FieldFill.INSERT) + private String createName; + + /** + * + */ + @ApiModelProperty(value = "") + @TableField("school_id") + private Long schoolId; + + /** + * 规则ID + */ + @ApiModelProperty(value = "规则ID") + @TableField("rule_id") + private Long ruleId; + + /** + * 地点名称 + */ + @ApiModelProperty(value = "地点名称") + @TableField("address_name") + private Long addressName; + + /** + * 地点纬度 + */ + @ApiModelProperty(value = "地点纬度") + @TableField("address_lat") + private String addressLat; + + /** + * 地点经度 + */ + @ApiModelProperty(value = "地点经度") + @TableField("address_lon") + private String addressLon; + + /** + * 范围,米 + */ + @ApiModelProperty(value = "范围,米") + @TableField("range") + private Integer range; + +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/attendance/AttendanceRuleAdmin.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/attendance/AttendanceRuleAdmin.java new file mode 100644 index 0000000..8269f73 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/attendance/AttendanceRuleAdmin.java @@ -0,0 +1,70 @@ +package com.yida.data.common.core.entity.attendance.attendance; + +import lombok.Data; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; + +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; +import java.time.LocalDate; +import java.time.LocalTime; + +/** + * 考勤-规则管理员 Entity + * + * @date 2023-08-09 11:37:25 + */ +@Data +@TableName("attendance_rule_admin") +public class AttendanceRuleAdmin { + + /** + * + */ + @ApiModelProperty(value = "") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * + */ + @ApiModelProperty(value = "") + @TableField("school_id") + private Long schoolId; + + /** + * + */ + @ApiModelProperty(value = "") + @TableField("rule_id") + private Long ruleId; + + /** + * + */ + @ApiModelProperty(value = "") + @TableField("user_type") + private Integer userType; + + /** + * + */ + @ApiModelProperty(value = "") + @TableField("dept_id") + private Long deptId; + + /** + * + */ + @ApiModelProperty(value = "") + @TableField("staff_id") + private Long staffId; + +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/attendance/AttendanceRuleDevice.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/attendance/AttendanceRuleDevice.java new file mode 100644 index 0000000..53e9f84 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/attendance/AttendanceRuleDevice.java @@ -0,0 +1,87 @@ +package com.yida.data.common.core.entity.attendance.attendance; + +import java.util.Date; +import lombok.Data; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; + +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; +import java.time.LocalDate; +import java.time.LocalTime; + +/** + * 考勤规则关联设备表 Entity + * + * @date 2023-08-09 11:37:25 + */ +@Data +@TableName("attendance_rule_device") +public class AttendanceRuleDevice { + + /** + * + */ + @ApiModelProperty(value = "") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * + */ + @ApiModelProperty(value = "") + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + /** + * + */ + @ApiModelProperty(value = "") + @TableField(value = "create_id", fill = FieldFill.INSERT) + private Long createId; + + /** + * + */ + @ApiModelProperty(value = "") + @TableField(value = "create_name", fill = FieldFill.INSERT) + private String createName; + + /** + * 规则ID + */ + @ApiModelProperty(value = "规则ID") + @TableField("rule_id") + private Long ruleId; + + /** + * 设备类型 + */ + @ApiModelProperty(value = "设备类型") + @TableField("device_type") + private Integer deviceType; + + /** + * 设备ID + */ + @ApiModelProperty(value = "设备ID") + @TableField("device_id") + private Long deviceId; + + /** + * 设备编号 + */ + @ApiModelProperty(value = "设备编号") + @TableField("device_sn") + private String deviceSn; + +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/attendance/AttendanceRuleObj.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/attendance/AttendanceRuleObj.java new file mode 100644 index 0000000..0ae12e7 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/attendance/AttendanceRuleObj.java @@ -0,0 +1,70 @@ +package com.yida.data.common.core.entity.attendance.attendance; + +import lombok.Data; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; + +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; +import java.time.LocalDate; +import java.time.LocalTime; + +/** + * 规则适用部门 Entity + * + * @date 2023-08-09 11:37:25 + */ +@Data +@TableName("attendance_rule_obj") +public class AttendanceRuleObj { + + /** + * + */ + @ApiModelProperty(value = "") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 0-教职工部门,1-家校部门 + */ + @ApiModelProperty(value = "0-教职工部门,1-家校部门") + @TableField("user_type") + private Integer userType; + + /** + * + */ + @ApiModelProperty(value = "") + @TableField("rule_id") + private Long ruleId; + + /** + * + */ + @ApiModelProperty(value = "") + @TableField("dept_id") + private Long deptId; + + /** + * + */ + @ApiModelProperty(value = "") + @TableField("dept_name") + private String deptName; + + /** + * 父级部门id,逗号连接 + */ + @ApiModelProperty(value = "父级部门id,逗号连接") + @TableField("parent_dept_id") + private String parentDeptId; + +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/attendance/AttendanceRuleObjUser.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/attendance/AttendanceRuleObjUser.java new file mode 100644 index 0000000..d7f4e95 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/attendance/AttendanceRuleObjUser.java @@ -0,0 +1,59 @@ +package com.yida.data.common.core.entity.attendance.attendance; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 规则适用部门人员 Entity + */ +@Data +@TableName("attendance_rule_obj_user") +public class AttendanceRuleObjUser { + + /** + * + */ + @ApiModelProperty(value = "") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 0-教职工部门,1-家校部门 + */ + @ApiModelProperty(value = "0-教职工部门,1-家校部门") + @TableField("user_type") + private Integer userType; + + /** + * + */ + @ApiModelProperty(value = "") + @TableField("rule_id") + private Long ruleId; + + /** + * + */ + @ApiModelProperty(value = "") + @TableField("dept_id") + private Long deptId; + + /** + * + */ + @ApiModelProperty(value = "") + @TableField("user_id") + private Long userId; + + /** + * 父级部门id,逗号连接 + */ + @ApiModelProperty(value = "") + @TableField("user_name") + private String userName; + +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/attendance/AttendanceRuleRemind.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/attendance/AttendanceRuleRemind.java new file mode 100644 index 0000000..7e6add7 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/attendance/AttendanceRuleRemind.java @@ -0,0 +1,77 @@ +package com.yida.data.common.core.entity.attendance.attendance; + +import lombok.Data; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; + +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; +import java.time.LocalDate; +import java.time.LocalTime; + +/** + * 考勤-打卡提醒 Entity + * + * @date 2023-08-09 11:37:25 + */ +@Data +@TableName("attendance_rule_remind") +public class AttendanceRuleRemind { + + /** + * + */ + @ApiModelProperty(value = "") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 规则id + */ + @ApiModelProperty(value = "规则id") + @TableField("rule_id") + private Long ruleId; + + /** + * 类型=规则usertype + */ + @ApiModelProperty(value = "类型=规则usertype") + @TableField("user_type") + private Integer userType; + + /** + * 0-上班提醒,1-下班提醒 + */ + @ApiModelProperty(value = "0-上班提醒,1-下班提醒") + @TableField("type") + private Integer type; + + /** + * 提醒的提前分钟数 + */ + @ApiModelProperty(value = "提醒的提前分钟数") + @TableField("minute") + private Integer minute; + + /** + * 提醒文本 + */ + @ApiModelProperty(value = "提醒文本") + @TableField("message") + private String message; + + /** + * 1-添加接收人姓名,0-不添加接收人姓名 + */ + @ApiModelProperty(value = "1-添加接收人姓名,0-不添加接收人姓名") + @TableField("include_receiver") + private Integer includeReceiver; + +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/attendance/AttendanceRuleSpecialDate.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/attendance/AttendanceRuleSpecialDate.java new file mode 100644 index 0000000..115bdfd --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/attendance/AttendanceRuleSpecialDate.java @@ -0,0 +1,76 @@ +package com.yida.data.common.core.entity.attendance.attendance; + +import java.util.Date; +import lombok.Data; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; + +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; +import java.time.LocalDate; +import java.time.LocalTime; + +/** + * 考勤-特殊日期 Entity + * + * @date 2023-08-09 11:37:25 + */ +@Data +@TableName("attendance_rule_special_date") +public class AttendanceRuleSpecialDate { + + /** + * + */ + @ApiModelProperty(value = "") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 规则id + */ + @ApiModelProperty(value = "规则id") + @TableField("rule_id") + private Long ruleId; + + /** + * 0-不用打卡,1-必须打卡 + */ + @ApiModelProperty(value = "0-不用打卡,1-必须打卡") + @TableField("type") + private Long type; + + /** + * 开始日期 + */ + @ApiModelProperty(value = "开始日期") + @TableField("start_date") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") + private LocalDate startDate; + + + /** + * 结束日期 + */ + @ApiModelProperty(value = "结束日期") + @TableField("end_date") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") + private LocalDate endDate; + + /** + * 事由 + */ + @ApiModelProperty(value = "事由") + @TableField("reason") + private String reason; + +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/attendance/AttendanceRuleTime.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/attendance/AttendanceRuleTime.java new file mode 100644 index 0000000..473e7e5 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/attendance/AttendanceRuleTime.java @@ -0,0 +1,161 @@ +package com.yida.data.common.core.entity.attendance.attendance; + +import java.util.Date; +import lombok.Data; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; + +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; +import java.time.LocalDate; +import java.time.LocalTime; + +/** + * 考勤-打卡时段 Entity + * + * @date 2023-08-09 11:37:25 + */ +@Data +@TableName("attendance_rule_time") +public class AttendanceRuleTime { + + /** + * + */ + @ApiModelProperty(value = "") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * + */ + @ApiModelProperty(value = "") + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + /** + * + */ + @ApiModelProperty(value = "") + @TableField(value = "create_id", fill = FieldFill.INSERT) + private Long createId; + + /** + * + */ + @ApiModelProperty(value = "") + @TableField(value = "update_date", fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateDate; + + /** + * + */ + @ApiModelProperty(value = "") + @TableField(value = "update_id", fill = FieldFill.UPDATE) + private Long updateId; + + /** + * 考勤规则id + */ + @ApiModelProperty(value = "考勤规则id") + @TableField("rule_id") + private Long ruleId; + + /** + * 上班时间 + */ + @ApiModelProperty(value = "上班时间") + @TableField("start_time") + @DateTimeFormat(pattern = "HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "HH:mm:ss") + private LocalTime startTime; + + /** + * 下班时间 + */ + @ApiModelProperty(value = "下班时间") + @TableField("end_time") + @DateTimeFormat(pattern = "HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "HH:mm:ss") + private LocalTime endTime; + + /** + * 最晚时间-针对宿舍考勤晚归情况 + */ + @ApiModelProperty(value = "最晚时间-针对宿舍考勤晚归情况") + @TableField("last_time") + @DateTimeFormat(pattern = "HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "HH:mm:ss") + private LocalTime lastTime; + + + /** + * 结束时间是否为次日,1=是,0=否 + */ + @ApiModelProperty(value = "结束时间是否为次日,1=是,0=否") + @TableField("end_next_day") + private Integer endNextDay; + + + /** + * 上班打卡时段启用状态. 0-不启用, 1-启用 + */ + @ApiModelProperty(value = "上班打卡时段启用状态. 0-不启用, 1-启用") + @TableField("start_effective_status") + private Integer startEffectiveStatus; + + /** + * 上班打卡时段开始时间 + */ + @ApiModelProperty(value = "上班打卡时段开始时间") + @TableField("start_effective_start_time") + @DateTimeFormat(pattern = "HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "HH:mm:ss") + private LocalTime startEffectiveStartTime; + + /** + * 上班打卡时段结束时间 + */ + @ApiModelProperty(value = "上班打卡时段结束时间") + @TableField("start_effective_end_time") + @DateTimeFormat(pattern = "HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "HH:mm:ss") + private LocalTime startEffectiveEndTime; + + /** + * 下班打卡时段启用状态. 0-不启用, 1-启用 + */ + @ApiModelProperty(value = "下班打卡时段启用状态. 0-不启用, 1-启用") + @TableField("end_effective_status") + private Integer endEffectiveStatus; + + /** + * 下班打卡时段开始时间 + */ + @ApiModelProperty(value = "下班打卡时段开始时间") + @TableField("end_effective_start_time") + @DateTimeFormat(pattern = "HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "HH:mm:ss") + private LocalTime endEffectiveStartTime; + + /** + * 下班打卡时段结束时间 + */ + @ApiModelProperty(value = "下班打卡时段结束时间") + @TableField("end_effective_end_time") + @DateTimeFormat(pattern = "HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "HH:mm:ss") + private LocalTime endEffectiveEndTime; + +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/attendance/AttendanceRuleWhiteList.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/attendance/AttendanceRuleWhiteList.java new file mode 100644 index 0000000..9b581fa --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/attendance/AttendanceRuleWhiteList.java @@ -0,0 +1,98 @@ +package com.yida.data.common.core.entity.attendance.attendance; + +import java.util.Date; +import lombok.Data; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; + +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; +import java.time.LocalDate; +import java.time.LocalTime; + +/** + * 考勤-白名单 Entity + * + * @date 2023-08-09 11:37:25 + */ +@Data +@TableName("attendance_rule_white_list") +public class AttendanceRuleWhiteList { + + /** + * + */ + @ApiModelProperty(value = "") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * + */ + @ApiModelProperty(value = "") + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + /** + * + */ + @ApiModelProperty(value = "") + @TableField(value = "create_id", fill = FieldFill.INSERT) + private Long createId; + + /** + * + */ + @ApiModelProperty(value = "") + @TableField(value = "update_date", fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateDate; + + /** + * + */ + @ApiModelProperty(value = "") + @TableField(value = "update_id", fill = FieldFill.UPDATE) + private Long updateId; + + /** + * + */ + @ApiModelProperty(value = "") + @TableField("del_flag") + @TableLogic(value = "0", delval = "1") + private Integer delFlag; + + /** + * 0-教职工ID,1-学生ID + */ + @ApiModelProperty(value = "0-教职工ID,1-学生ID") + @TableField("user_type") + private Integer userType; + + /** + * 规则id + */ + @ApiModelProperty(value = "规则id") + @TableField("rule_id") + private Long ruleId; + + + /** + * 人员IDid + */ + @ApiModelProperty(value = "教职工id") + @TableField("user_id") + private Long userId; + +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/attendance/AttendanceRuleWifi.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/attendance/AttendanceRuleWifi.java new file mode 100644 index 0000000..f9f4265 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/attendance/attendance/AttendanceRuleWifi.java @@ -0,0 +1,87 @@ +package com.yida.data.common.core.entity.attendance.attendance; + +import java.util.Date; +import lombok.Data; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; + +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; +import java.time.LocalDate; +import java.time.LocalTime; + +/** + * 考勤规则关联wifi Entity + * + * @date 2023-08-09 11:37:25 + */ +@Data +@TableName("attendance_rule_wifi") +public class AttendanceRuleWifi { + + /** + * + */ + @ApiModelProperty(value = "") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * + */ + @ApiModelProperty(value = "") + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + /** + * + */ + @ApiModelProperty(value = "") + @TableField(value = "create_id", fill = FieldFill.INSERT) + private Long createId; + + /** + * + */ + @ApiModelProperty(value = "") + @TableField(value = "create_name", fill = FieldFill.INSERT) + private String createName; + + /** + * 规则ID + */ + @ApiModelProperty(value = "规则ID") + @TableField("rule_id") + private Long ruleId; + + /** + * wifi名称 + */ + @ApiModelProperty(value = "wifi名称") + @TableField("wifi_name") + private String wifiName; + + /** + * BSSID + */ + @ApiModelProperty(value = "BSSID") + @TableField("wifi_bssid") + private String wifiBssid; + + /** + * BSSID + */ + @ApiModelProperty(value = "ip") + @TableField("ip") + private String ip; + +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/classCall/EduClassCall.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/classCall/EduClassCall.java new file mode 100644 index 0000000..3dcb969 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/classCall/EduClassCall.java @@ -0,0 +1,134 @@ +package com.yida.data.common.core.entity.classCall; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.yida.data.common.core.entity.classschedule.EduClassScheduleTime; +import io.swagger.annotations.ApiModelProperty; +import java.time.LocalDateTime; +import java.util.List; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * 点名系统 + */ +@Data +@TableName("edu_class_call") +public class EduClassCall { + + + @ApiModelProperty(value = "") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 班级ID + */ + @ApiModelProperty(value = "课程ID") + @TableField("class_id") + private Long classId; + + /** + * 班级名称 + */ + @ApiModelProperty(value = "课程名称") + @TableField("class_name") + private String className; + + + /** + * 课程名称 + */ + @ApiModelProperty(value = "课程名称") + @TableField("subject_name") + private String subjectName; + + + /** + * 学生总人数 + */ + @ApiModelProperty(value = "学生总人数") + @TableField("student_num") + private Integer studentNum; + + + /** + * 学生异常人数 + */ + @ApiModelProperty(value = "学生异常人数") + @TableField("abnormal_number") + private Integer abnormalNumber; + + /** + * 点名教师id + */ + @ApiModelProperty(value = "点名教师id") + @TableField("teacher_id") + private Long teacherId; + + /** + * 点名教师名字 + */ + @ApiModelProperty(value = "点名教师名字") + @TableField("teacher_name") + private String teacherName; + + + /** + * 所属学校主键ID + */ + @ApiModelProperty(value = "所属学校主键ID") + @TableField("school_id") + private Long schoolId; + + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间") + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + /** + * 更新时间 + */ + @ApiModelProperty(value = "更新时间") + @TableField(value = "update_date", fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateDate; + + /** + * 创建者 + */ + @ApiModelProperty(value = "创建者") + @TableField(value = "create_id", fill = FieldFill.INSERT) + private Long createId; + + /** + * 修改者 + */ + @ApiModelProperty(value = "修改者") + @TableField(value = "update_id", fill = FieldFill.UPDATE) + private Long updateId; + + /** + * 删除标识 + */ + @ApiModelProperty(value = "删除标识") + @TableField("del_flag") + @TableLogic(value = "0", delval = "1") + private Integer delFlag; + + @ApiModelProperty(value = "点名记录") + @TableField(exist = false) + private List studentRecordList; + +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/classCall/EduClassCallPushConfig.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/classCall/EduClassCallPushConfig.java new file mode 100644 index 0000000..86d3e88 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/classCall/EduClassCallPushConfig.java @@ -0,0 +1,110 @@ +package com.yida.data.common.core.entity.classCall; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * 点名系统 消息推送配置 + */ +@Data +@TableName("edu_class_call_push_config") +public class EduClassCallPushConfig { + + + @ApiModelProperty(value = "") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 所属学校主键ID + */ + @ApiModelProperty(value = "所属学校主键ID") + @TableField("school_id") + private Long schoolId; + + /** + * 流程名称 + */ + @ApiModelProperty(value = "流程名称") + @TableField("title") + private String title; + + + /** + * 有效开始时间 + */ + @ApiModelProperty(value = "有效开始时间") + @TableField(value = "start_date") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") + private LocalDate startDate; + + + /** + * 有效结束时间 + */ + @ApiModelProperty(value = "有效结束时间") + @TableField(value = "end_date") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") + private LocalDate endDate; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间") + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + /** + * 更新时间 + */ + @ApiModelProperty(value = "更新时间") + @TableField(value = "update_date", fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateDate; + + /** + * 创建者 + */ + @ApiModelProperty(value = "创建者") + @TableField(value = "create_id", fill = FieldFill.INSERT) + private Long createId; + + /** + * 修改者 + */ + @ApiModelProperty(value = "修改者") + @TableField(value = "update_id", fill = FieldFill.UPDATE) + private Long updateId; + + /** + * 删除标识 + */ + @ApiModelProperty(value = "删除标识") + @TableField("del_flag") + @TableLogic(value = "0", delval = "1") + private Integer delFlag; + + /** + * 发送人员集合 + */ + @ApiModelProperty(value = "发送人员集合") + @TableField(exist = false) + private List staffList; + +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/classCall/EduClassCallPushConfigProcess.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/classCall/EduClassCallPushConfigProcess.java new file mode 100644 index 0000000..a668d43 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/classCall/EduClassCallPushConfigProcess.java @@ -0,0 +1,90 @@ +package com.yida.data.common.core.entity.classCall; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import java.time.LocalDate; +import java.time.LocalDateTime; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * 点名系统 消息推送配置 流程 + */ +@Data +@TableName("edu_class_call_push_config_process") +public class EduClassCallPushConfigProcess { + + + @ApiModelProperty(value = "") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 配置ID + */ + @ApiModelProperty(value = "配置ID") + @TableField("config_id") + private Long configId; + + /** + * 排序 + */ + @ApiModelProperty(value = "排序") + @TableField("sort") + private Integer sort; + + /** + * 0指定角色,1指定人员 + */ + @ApiModelProperty(value = "0指定角色,1指定人员") + @TableField("type") + private Integer type; + + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间") + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + /** + * 更新时间 + */ + @ApiModelProperty(value = "更新时间") + @TableField(value = "update_date", fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateDate; + + /** + * 创建者 + */ + @ApiModelProperty(value = "创建者") + @TableField(value = "create_id", fill = FieldFill.INSERT) + private Long createId; + + /** + * 修改者 + */ + @ApiModelProperty(value = "修改者") + @TableField(value = "update_id", fill = FieldFill.UPDATE) + private Long updateId; + + /** + * 删除标识 + */ + @ApiModelProperty(value = "删除标识") + @TableField("del_flag") + @TableLogic(value = "0", delval = "1") + private Integer delFlag; + +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/classCall/EduClassCallPushConfigProcessStaff.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/classCall/EduClassCallPushConfigProcessStaff.java new file mode 100644 index 0000000..c1c0176 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/classCall/EduClassCallPushConfigProcessStaff.java @@ -0,0 +1,91 @@ +package com.yida.data.common.core.entity.classCall; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import java.time.LocalDateTime; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * 点名系统 消息推送配置 流程 对应人员 + */ +@Data +@TableName("edu_class_call_push_config_process_staff") +public class EduClassCallPushConfigProcessStaff { + + + @ApiModelProperty(value = "") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 配置ID + */ + @ApiModelProperty(value = "配置ID") + @TableField("config_id") + private Long configId; + + + /** + * 0指定角色,1指定人员 + */ + @ApiModelProperty(value = "0指定角色,1指定人员") + @TableField("type") + private Integer type; + + + /** + * 指定角色时,0=班主任,1=系主任;指定人员时,具体职工ID + */ + @ApiModelProperty(value = "指定角色时,0=班主任,1=系主任;指定人员时,具体职工ID") + @TableField("user_id") + private Long userId; + + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间") + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + /** + * 更新时间 + */ + @ApiModelProperty(value = "更新时间") + @TableField(value = "update_date", fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateDate; + + /** + * 创建者 + */ + @ApiModelProperty(value = "创建者") + @TableField(value = "create_id", fill = FieldFill.INSERT) + private Long createId; + + /** + * 修改者 + */ + @ApiModelProperty(value = "修改者") + @TableField(value = "update_id", fill = FieldFill.UPDATE) + private Long updateId; + + /** + * 删除标识 + */ + @ApiModelProperty(value = "删除标识") + @TableField("del_flag") + @TableLogic(value = "0", delval = "1") + private Integer delFlag; + +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/classCall/EduClassCallStudentRecord.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/classCall/EduClassCallStudentRecord.java new file mode 100644 index 0000000..18769a9 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/classCall/EduClassCallStudentRecord.java @@ -0,0 +1,176 @@ +package com.yida.data.common.core.entity.classCall; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import java.time.LocalDateTime; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * 点名系统-学生记录 + */ +@Data +@TableName("edu_class_call_student_record") +public class EduClassCallStudentRecord { + + + @ApiModelProperty(value = "") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 点名ID + */ + @ApiModelProperty(value = "点名ID") + @TableField("call_id") + private Long callId; + + /** + * 学生ID + */ + @ApiModelProperty(value = "学生ID") + @TableField("student_id") + private Long studentId; + + /** + * 性别 + */ + @ApiModelProperty(value = "性别(0男,1女,2或者null = 其他)") + @TableField("gender") + private Integer gender; + + + /** + * 头像 + */ + @ApiModelProperty(value = "头像") + @TableField("avatar") + private String avatar; + + + /** + * 学生姓名 + */ + @ApiModelProperty(value = "学生姓名") + @TableField("student_name") + private String studentName; + + + /** + * 点名状态:0异常。1正常 + */ + @ApiModelProperty(value = "点名状态:0异常。1正常") + @TableField("status") + private Integer status; + + + /** + * 班级Id + */ + @ApiModelProperty(value = "班级Id") + @TableField("class_id") + private Long classId; + /** + * 班级名称 + */ + @ApiModelProperty(value = "课程名称") + @TableField("class_name") + private String className; + + + /** + * 学区ID + */ + @ApiModelProperty(value = "学区ID") + @TableField("campus_id") + private Long campusId; + /** + * 学区名称 + */ + @ApiModelProperty(value = "学区名称") + @TableField("campus_name") + private String campusName; + + + /** + * 学段ID + */ + @ApiModelProperty(value = "学段ID") + @TableField("section_id") + private Long sectionId; + /** + * 学段名称 + */ + @ApiModelProperty(value = "学段名称") + @TableField("section_name") + private String sectionName; + + + /** + * 年级ID + */ + @ApiModelProperty(value = "年级ID") + @TableField("grade_id") + private Long gradeId; + /** + * 年级名称 + */ + @ApiModelProperty(value = "年级名称") + @TableField("grade_name") + private String gradeName; + + /** + * 所属学校主键ID + */ + @ApiModelProperty(value = "所属学校主键ID") + @TableField("school_id") + private Long schoolId; + + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间") + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + /** + * 更新时间 + */ + @ApiModelProperty(value = "更新时间") + @TableField(value = "update_date", fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateDate; + + /** + * 创建者 + */ + @ApiModelProperty(value = "创建者") + @TableField(value = "create_id", fill = FieldFill.INSERT) + private Long createId; + + /** + * 修改者 + */ + @ApiModelProperty(value = "修改者") + @TableField(value = "update_id", fill = FieldFill.UPDATE) + private Long updateId; + + /** + * 删除标识 + */ + @ApiModelProperty(value = "删除标识") + @TableField("del_flag") + @TableLogic(value = "0", delval = "1") + private Integer delFlag; + +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/constant/AppConstant.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/constant/AppConstant.java index b96f950..a9b57e3 100644 --- a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/constant/AppConstant.java +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/constant/AppConstant.java @@ -3,9 +3,18 @@ package com.yida.data.common.core.entity.constant; public interface AppConstant { /** - * 通讯录 + * 通讯录(用于操作) https://developer.work.weixin.qq.com/document/path/96078 */ String CONTACT = "通讯录"; + + /** + * 通讯录(用于查询) 职工端智慧迎新 + */ + String CONTACT_SELECT = "contact_resources"; + + /** + * 家校沟通 + */ String CONTACT_SCHOOL = "家校沟通"; /** @@ -80,8 +89,28 @@ public interface AppConstant { */ String TEACHER_LEAVE_REQUEST = "teacher_leave_request"; + /** + * 请假家长端 + */ + String STUDENT_LEAVE_REQUEST = "student_leave_request"; + /** * 访客教师端 */ String VISITOR_STAFF = "visitor_staff"; + + /** + * 微官网 家长端智慧迎新 + */ + String INDEX_PARENT = "index_parent"; + + /** + * 查寝 + */ + String DORM_ATTENDANCE_STAFF = "dorm_attendance_staff"; + + /** + * 智慧迎新职工端 + */ + String SMART_WELCOME_STAFF = "smart_welcome_staff"; } diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/constant/CachePrefixConstant.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/constant/CachePrefixConstant.java index b1a0676..6d1c750 100644 --- a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/constant/CachePrefixConstant.java +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/constant/CachePrefixConstant.java @@ -2,11 +2,31 @@ package com.yida.data.common.core.entity.constant; public interface CachePrefixConstant { + /** + * 企业微信服务商缓存前缀 + */ + String SYS_SERVICE_PROVIDER = "sys:service:provider."; + /** * 企业微信应用缓存前缀 */ String SYS_APP = "sys:app."; + /** + * 系统白名单信息 + */ + String SYS_WHITE_LIST = "sys:white:list."; + + /** + * 部门对应的第三方系统功能 + */ + String SYS_DEPT_FUNCTION = "sys:dept:function."; + + /** + * 企业微信应用模板缓存前缀 + */ + String SYS_APP_TEMPLATE = "sys:app.template."; + /** * 部门公众号 */ @@ -61,6 +81,18 @@ public interface CachePrefixConstant { String IMPORT_STUDENT_KEY = "import.student."; String IMPORT_STUDENT_FILE = "import.student.file."; + String IMPORT_STUDENT_CARD_NUMBER_KEY = "import.student.cardNo"; + + /** + * 学生导出信息 + */ + String EXPORT_STUDENT_DATA = "student:data:export."; + + /** + * 学生宿舍导出信息 + */ + String EXPORT_STUDENT_DORM_DATA = "student:dorm:data:export."; + /** * 登录用户将要登录的部门id */ @@ -107,6 +139,31 @@ public interface CachePrefixConstant { */ String UNION_PAY_CONFIG = "sys:union.pay.config"; + /** + * 建行支付配置信息 + */ + String CONSTRUCTION_PAY_CONFIG = "sys:construction.pay.config"; + + /** + * 收钱吧支付配置信息 + */ + String U_PAY_CONFIG = "sys:u.pay.config"; + + /** + * 百度api配置信息 + */ + String BAI_DU_API_CONFIG = "baidu:api.config"; + + /** + * 学校收钱吧终端信息 + */ + String DEPT_CONSUME_TERMINAL = "dept:consume:terminal."; + + /** + * 学校消费机服务器信息 + */ + String CONSUME_CONFIG = "sys:consume.config"; + //------------------学校------------------- /** * 导入寝室 进度信息 @@ -126,11 +183,20 @@ public interface CachePrefixConstant { //------------------用户------------------- String STUDENT_DATA = "user:student.data"; + //------------------用户------------------- + String STUDENT_BASE_DATA = "user:student.base.data"; + + /** * 导入住宿学生 进度信息 */ String IMPORT_STUDENT_DORM = "user:studentDorm.import"; + /** + * 导入学生类型 进度信息 + */ + String IMPORT_STUDENT_TYPE = "user:studentType.import"; + /** * 学生在校离校,在寝不在寝状态 */ @@ -163,6 +229,11 @@ public interface CachePrefixConstant { */ String ISSUE_FACE_ERROR_MSG = "user:face:issue.error.msg."; + /** + * 设备组人脸下发成功数量 + */ + String ISSUE_GROUP_USER_FACE_SUCCESS = "group.user.face.success."; + /** * 大华code与人员id对应 */ @@ -185,6 +256,11 @@ public interface CachePrefixConstant { */ String DEVICE_DATA = "attendance:device:data"; + /** + * 设备数据 + */ + String DEVICE_DATA_BY_ID = "attendance:device:id:data"; + /** * 最新考勤记录时间 */ @@ -200,11 +276,31 @@ public interface CachePrefixConstant { */ String ISSUE_FACE_GROUP_DEVICE = "attendance:device:face-group."; + /** + * 设备下发的人脸组鼠标数量 + */ + String ISSUE_FACE_GROUP_DEVICE_NUMBER = "attendance:device:face-group.number."; + /** * 海清设备批量编辑列表 */ String HQ_EDIT_BATCH = "hq.edit.batch."; + /** + * 海清人脸新增信息 + */ + String HQ_BATCH_ADD = "hq.batch.add."; + + /** + * 海清人脸新编辑信息 + */ + String HQ_BATCH_EDIT = "hq.batch.edit."; + + /** + * 接收的认证消息缓存 + */ + String HQ_RECEIVE_INFO = "hq.receive.info."; + //--------------商品订单------------------ /** @@ -340,6 +436,13 @@ public interface CachePrefixConstant { * 宿舍信息 */ String FACILITY_DORM_ROOM = "facility:dorm:room"; + + // --------------------宿舍数据----------------- + /** + * 宿舍信息 + */ + String FACILITY_DORM_MASTER = "facility:dorm:master."; + // --------------------第二课堂---------------- /** * 菜单配置 @@ -366,7 +469,7 @@ public interface CachePrefixConstant { String BILL_ORDER = "bill.order."; /** - * 账单订单调起支付所需参数,微信jsapi为prepay_id,微信h5为回调地址,银联支付为支付地址 + * 账单订单调起支付所需参数,微信jsapi为prepay_id,微信h5为支付地址,银联支付为支付地址 */ String BILL_ORDER_FLAG = "bill.order.flag."; @@ -405,6 +508,27 @@ public interface CachePrefixConstant { */ String BILL_PAY_DETAIL_EXPORT_URL = "bill:pay:detail:export:url:"; + // --------------------消费充值---------------- + /** + * 学生消费订单缓存 + */ + String CONSUME_ORDER_STUDENT = "consume.order.student."; + + /** + * 消费订单信息 + */ + String CONSUME_ORDER = "consume.order."; + + /** + * 消费订单调起支付所需参数,微信jsapi为prepay_id,微信h5为支付地址,银联支付为支付地址,收钱吧为支付地址 + */ + String CONSUME_ORDER_FLAG = "consume.order.flag."; + + /** + * 商品描述 + */ + String CONSUME_ORDER_DESC = "充值缴费"; + // -----------摄像头------------------------- /** * 摄像头 @@ -418,6 +542,41 @@ public interface CachePrefixConstant { */ String USER_PIC_DOWNLOAD = "user:pic:downLoad."; + + /** + * 职工通行记录下载 + */ + String STAFF_ATTENDANCE_RECORD_DOWNLOAD = "staff:attendance:record:downLoad."; + + /** + * 职工考勤记录下载 + */ + String STAFF_ATTENDANCE_RESULT_DOWNLOAD = "staff:attendance:result:downLoad."; + + + /** + * 学生宿舍考勤下载 + */ + String STUDENT_DORM_ATTENDANCE_RESULT_DOWNLOAD = "student:dorm:attendance:result:downLoad."; + + + /** + * 通行记录下载 + */ + String ATTENDANCE_RECORD_DOWNLOAD = "attendance:record:download."; + + + /** + * 考勤日报下载 + */ + String ATTENDANCE_DAY_REPORT_DOWNLOAD = "attendance:day:report:download."; + + + /** + * 商品购买情况下载 + */ + String PRODUCT_BUY_DATA_DOWNLOAD = "product:buy:data:downLoad."; + /** * 下载学生照片 */ @@ -431,7 +590,7 @@ public interface CachePrefixConstant { /** * 学校对应关键功能点配置 */ - String SCHOOL_FUNCATION_CODE = "school:funcation:code."; + String SCHOOL_FUNCATION_CODE = "school:funcation:code:"; String ATTENDANCE_DORMITORY_CLASS = "attendance:Dormitory:class."; @@ -440,6 +599,9 @@ public interface CachePrefixConstant { String STAFF_MANGE_DEPT = "staff:mange:dept."; + String STAFF_MANGE_CLASS = "staff:mange:class."; + + /** * 对应设备策略id(人脸组id)缓存 */ @@ -479,6 +641,165 @@ public interface CachePrefixConstant { String ADD_MANUSCRIPT_PROGRESS = "add:manuscript:progress"; // --------------------智慧迎新----------------- + /** + * 花名册下载缓存 + */ String GUIDE_ROSTER_DATA_DOWNLOAD = "guide:roster:data:download."; + /** + * 花名册身份证、通知书下载图片缓存 + */ + String GUIDE_ROSTER_PIC_DATA_DOWNLOAD = "guide:roster:pic:data:download."; + + // --------------------智慧迎新----------------- + /** + * 新生迎新步骤信息 + */ + String GUIDE_ROSTER_STEP_DATA = "guide:roster:step:data."; + + /** + * 花名册人员迎新订单缓存 + */ + String GUIDE_STEP_ORDER_ROSTER = "guide.step.order.roster."; + + /** + * 迎新步骤订单缓存 + */ + String GUIDE_STEP_ORDER = "guide.step.order."; + + /** + * 迎新订单调起支付所需参数,微信jsapi为prepay_id,微信h5为支付地址,银联支付为支付地址,建行为支付地址 + */ + String GUIDE_STEP_ORDER_FLAG = "guide.step.order.flag."; + + + /** + * 智慧迎新导入学生人脸 + */ + String IMPORT_GUIDE_AVATAR_KEY = "guide:avatar:import.key."; + + + /** + * 智慧迎新导入花名册 + */ + String IMPORT_GUIDE_ROSTER_KEY = "guide:roster:import.key."; + + /** + * 智慧迎新系部专业数据 + */ + String WELCOME_DEPARTMENT_DATA = "welcome:department:data."; + + /** + * 智慧迎新预分班级数据 + */ + String WELCOME_CLASS_DATA = "welcome:class:data."; + + /** + * 智慧迎新班级对应人员数量 + */ + String WELCOME_CLASS_STUDENT_NUMBER = "welcome:class:student:number:"; + + /** + * 智慧迎新预分宿舍数据 + */ + String WELCOME_DORM_DATA = "welcome:dorm:data."; + + + /** + * 智慧迎新宿舍对应人员数量 + */ + String WELCOME_DROM_STUDENT_NUMBER = "welcome:dorm:student:number:"; + + + /** + * 智慧迎新宿舍对应人员数量 + */ + String WELCOME_DROM_STUDENT_NUMBER_BUDING = "welcome:dorm:student:number:buding"; + + + /** + * 智慧迎新预分班级导入进度 + */ + String WELCOME_CLASS_IMPOST_PROGRESS = "welcome:class:import:progress:"; + + /** + * 智慧迎新预分宿舍导入进度 + */ + String WELCOME_DORM_IMPOST_PROGRESS = "welcome:dorm:import:progress:"; + + /** + * 智慧迎新花名册信息 + */ + String WELCOME_ROSTER = "welcome:roster"; + + + /** + * 学生考勤结果 每月记录 + */ + String ATTENDANCE_DATE_STATUS = "attendance:date:status."; + + + /** + * 管理员查看 每月记录 + */ + String ATTENDANCE_MANAGE_DATE_STATUS = "attendance:manage:date:status."; + + + /** + * 学生考勤结果 每日记录 + */ + String ATTENDANCE_STATUS_DAY_STUDENT = "attendance:status:day:student:"; + + + /** + * 教职工考勤结果 每日记录 + */ + String ATTENDANCE_STATUS_DAY_STAFF = "attendance:status:day:staff:"; + + /** + * 考勤管理管理部门树 + */ + String ATTENDANCE_USER_MANAGE_TREE = "attendance:user:manage:tree:"; + + /** + * 考勤管理管理部门树 + */ + String ATTENDANCE_STAFF_IDENTITY = "attendance:staff:identity:"; + + /** + * 职工管理规则 + */ + String ATTENDANCE_STAFF_MANAGE_RULE = "attendance:staff:manage:rule"; + + /** + * 用户打卡记录 + */ + String ATTENDANCE_USER_RECORD = "attendance:user:record"; + + /** + * 学生匹配的考勤规则 + */ + String ATTENDANCE_STUDENT_RULE = "attendance:student:rule"; + + /** + * 校园主页信息 + */ + String SCHOOL_HOME_INFO = "school:home:info"; + + /** + * 学校小程序信息 + */ + String DEPT_HOME_APP_INFO = "dept:home:app:info"; + + + /** + * 用户对应微信小程序 + */ + String USER_GENERATE_URL_LINK = "user:generate:url:link:"; + + + /** + * 考勤规则 + */ + String ATTENDANCE_RULE_DATA = "attendance:rule"; } diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/constant/ConstructionPayConstant.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/constant/ConstructionPayConstant.java new file mode 100644 index 0000000..72b137d --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/constant/ConstructionPayConstant.java @@ -0,0 +1,71 @@ +package com.yida.data.common.core.entity.constant; + +/** + * 建行支付常量 + * + * @author ZYJ + * @date 2023/6/19 + */ +public interface ConstructionPayConstant { + + /** + * 接口地址 + */ + String URL = "https://ibsbjstar.ccb.com.cn/CCBIS/ccbMain"; + + /** + * 二维码下单接口地址 + */ + String QR_PAY_URL = URL + "?CCB_IBSVersion=V6"; + + /** + * 二维码支付交易码 + */ + String QR_PAY_CODE = "530550"; + + /** + * 订单查询交易码 + */ + String QUERY_ORDER_CODE = "410408"; + + /** + * 业务状态码字段 + */ + String SUCCESS_KEY = "SUCCESS"; + + /** + * 业务成功状态码 + */ + String SUCCESS_CODE = "true"; + + /** + * 建行二维码下单返回地址 + * 用于获取二维码下单实际支付地址 + */ + String PAY_URL = "PAYURL"; + + /** + * 建行二维码支付实际地址 + */ + String QR_URL = "QRURL"; + + /** + * 订单查询返回码字段名称 + */ + String RETURN_CODE_NAME = "RETURN_CODE"; + + /** + * 订单查询返回消息段名称 + */ + String RETURN_MSG = "RETURN_MSG"; + + /** + * 订单查询返回码成功状态 + */ + String RETURN_SUCCESS_CODE = "000000"; + + /** + * 流水不存在状态码 + */ + String NO_ORDER_CODE = "YDCA02910001"; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/constant/ConsumeConstant.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/constant/ConsumeConstant.java new file mode 100644 index 0000000..8079315 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/constant/ConsumeConstant.java @@ -0,0 +1,50 @@ +package com.yida.data.common.core.entity.constant; + +/** + * 消费机常量 + * + * @author ZYJ + * @date 2023/4/4 + */ +public interface ConsumeConstant { + + /** + * 接口错误信息字段名称 + */ + String ERROR_CONTENT_NAME = "error"; + + /** + * 接口错误状态码名称 + */ + String ERROR_CODE_NAME = "errorCode"; + + /** + * 接口错误信息名称 + */ + String ERROR_MESSAGE_NAME = "errorMessage"; + + /** + * 获取人员信息 + */ + String GET_PERSON_INFO = "/hpt/v2/Accounts/Get"; + + /** + * 挂失卡片 + */ + String LOCK_CARD = "/hpt/v2/Accounts/LockCard"; + + /** + * 解挂卡片 + */ + String UN_LOCK_CARD = "/hpt/v2/Accounts/UnLockCard"; + + /** + * 充值 + */ + String RECHARGE = "/hpt/v2/Accounts/Recharge"; + + /** + * 充值撤销 + */ + String UNDO_RECHARGE = "/hpt/v2/Accounts/UndoRecharge"; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/constant/FebsConstant.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/constant/FebsConstant.java index 09cf148..b1816c7 100644 --- a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/constant/FebsConstant.java +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/constant/FebsConstant.java @@ -79,10 +79,20 @@ public interface FebsConstant { String TP_TOKEN = "tupu.token."; /** - * 微信公众号 token key前缀 + * 微信公众号 token key前缀 7200s */ String WX_PUBLIC_ACCESS_TOKEN = "wx.public:access.token."; + /** + * 微信 JS-SDK jsapi_ticket key前缀 7200s + */ + String WX_PUBLIC_JS_API_TICKET = "wx.public:jsapi.ticket."; + + /** + * 企业微信 JS-SDK jsapi_ticket key前缀 7200s + */ + String QYWX_WX_JS_API_TICKET = "qywx.wx:jsapi.ticket."; + /** * 几米 access_token key前缀 */ diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/constant/LockPrefixConstant.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/constant/LockPrefixConstant.java index f9d3c4c..c3b7b77 100644 --- a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/constant/LockPrefixConstant.java +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/constant/LockPrefixConstant.java @@ -43,7 +43,12 @@ public interface LockPrefixConstant { String CARD_CMD_LOCK = "device:card:cmd-lock"; /** - * 学生账单订单锁 + * 设备下发处理返回数据锁 */ - String STUDENT_BILL_ORDER_LOCK = "student.bill.order.lock."; + String ISSUE_FACE_DEVICE_LOCK = "user:face:issue.device.lock."; + + /** + * 设备组下发处理人脸数据锁 + */ + String ISSUE_FACE_GROUP_LOCK = "user:face:group.lock."; } diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/constant/NoticeTypeConstant.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/constant/NoticeTypeConstant.java new file mode 100644 index 0000000..a2fe981 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/constant/NoticeTypeConstant.java @@ -0,0 +1,27 @@ +package com.yida.data.common.core.entity.constant; + +public interface NoticeTypeConstant { + + String NOTICE_MSG_TEMPLATE_TYPE = "template_card"; + + /** + * 文本展示型卡片 + */ + String TEMPLATE_NOTICE_TYPE_TEXT = "text_notice"; + + /** + * 图文展示型卡片 + */ + String TEMPLATE_NOTICE_TYPE_NEWS = "news_notice"; + + /** + * 按钮交付型卡片 + */ + String TEMPLATE_NOTICE_TYPE_BUTTON = "button_interaction"; + + /** + * 投票选择型卡片 + */ + String TEMPLATE_NOTICE_TYPE_VOTE = "vote_interaction"; + +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/constant/QywxConstant.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/constant/QywxConstant.java index 6557e70..40661e4 100644 --- a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/constant/QywxConstant.java +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/constant/QywxConstant.java @@ -38,11 +38,21 @@ public interface QywxConstant { */ String USER_DETAIL_URL = "https://qyapi.weixin.qq.com/cgi-bin/user/get"; + /** + * 获取访问用户敏感信息 post https://qyapi.weixin.qq.com/cgi-bin/auth/getuserdetail?access_token=ACCESS_TOKEN + */ + String USER_SENSITIVE_INFO_URL = "https://qyapi.weixin.qq.com/cgi-bin/auth/getuserdetail?access_token="; + /** * 查询部门成员详情 get https://qyapi.weixin.qq.com/cgi-bin/user/list?access_token=ACCESS_TOKEN&department_id=DEPARTMENT_ID&fetch_child=FETCH_CHILD */ String USER_DETAIL_LIST_URL = "https://qyapi.weixin.qq.com/cgi-bin/user/list"; + /** + * 获取成员ID列表 POST https://qyapi.weixin.qq.com/cgi-bin/user/list_id?access_token=ACCESS_TOKEN + */ + String USER_ID_LIST_URL = "https://qyapi.weixin.qq.com/cgi-bin/user/list_id?access_token="; + /** * 创建部门 POST https://qyapi.weixin.qq.com/cgi-bin/department/create?access_token=ACCESS_TOKEN */ @@ -63,6 +73,16 @@ public interface QywxConstant { */ String DEPT_LIST_URL = "https://qyapi.weixin.qq.com/cgi-bin/department/list"; + /** + * 获取子部门ID列表 GET https://qyapi.weixin.qq.com/cgi-bin/department/simplelist?access_token=ACCESS_TOKEN&id=ID + */ + String SIMPLE_DEPT_LIST_URL = "https://qyapi.weixin.qq.com/cgi-bin/department/simplelist"; + + /** + * 获取单个部门详情 GET https://qyapi.weixin.qq.com/cgi-bin/department/get?access_token=ACCESS_TOKEN&id=ID + */ + String DEPT_INFO_URL = "https://qyapi.weixin.qq.com/cgi-bin/department/get"; + /** * 创建部门(家校沟通) POST https://qyapi.weixin.qq.com/cgi-bin/school/department/create?access_token=ACCESS_TOKEN */ @@ -205,16 +225,39 @@ public interface QywxConstant { */ String CONTACT_EVENT = "change_contact"; + /** + * 创建部门 + */ String DEPT_CREATE_TYPE = "create_party"; + /** + * 更新部门 + */ String DEPT_UPDATE_TYPE = "update_party"; + /** + * 删除部门 + */ String DEPT_DELETE_TYPE = "delete_party"; + /** + * 创建成员 + */ String USER_CREATE_TYPE = "create_user"; + /** + * 更新成员 + */ String USER_UPDATE_TYPE = "update_user"; + /** + * 删除成员 + */ String USER_DELETE_TYPE = "delete_user"; + /** + * 获取企业微信的jsapi_ticket + * https://developer.work.weixin.qq.com/document/path/96909 + */ + String GET_JS_API_TICKET_URL = "https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket"; } diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/constant/QywxServiceProviderConstant.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/constant/QywxServiceProviderConstant.java new file mode 100644 index 0000000..358b40f --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/constant/QywxServiceProviderConstant.java @@ -0,0 +1,110 @@ +package com.yida.data.common.core.entity.constant; + +/** + * 企业微信服务商常量 + * + * @author ZYJ + * @date 2022/11/3 + */ +public interface QywxServiceProviderConstant { + + //------------------企业微信服务商接口地址-------------------- + /** + * 获取服务商凭证 + */ + String GET_PROVIDER_TOKEN_URL = "https://qyapi.weixin.qq.com/cgi-bin/service/get_provider_token"; + + /** + * 获取第三方应用凭证(suite_access_token) + */ + String GET_SUITE_TOKEN_URL = "https://qyapi.weixin.qq.com/cgi-bin/service/get_suite_token"; + + /** + * 获取企业凭证 + */ + String GET_CORP_TOKEN_URL = "https://qyapi.weixin.qq.com/cgi-bin/service/get_corp_token?suite_access_token="; + + /** + * 获取企业永久授权码 + */ + String GET_PERMANENT_CODE_URL = "https://qyapi.weixin.qq.com/cgi-bin/service/get_permanent_code?suite_access_token="; + + /** + * 获取企业授权信息 + */ + String GET_AUTH_INFO_URL = "https://qyapi.weixin.qq.com/cgi-bin/service/get_auth_info?suite_access_token="; + + /** + * corpid转换 + */ + String CONVERT_CORP_ID_URL = "https://qyapi.weixin.qq.com/cgi-bin/service/corpid_to_opencorpid?provider_access_token="; + + /** + * userid的转换 + * 将企业主体下的明文userid转换为服务商主体下的密文userid + */ + String CONVERT_USER_ID_TO_SECRET_URL = "https://qyapi.weixin.qq.com/cgi-bin/batch/userid_to_openuserid?access_token="; + + /** + * userid的转换 + * 将代开发应用或第三方应用获取的密文open_userid转换为明文userid + */ + String CONVERT_USER_ID_TO_PLAIN_URL = "https://qyapi.weixin.qq.com/cgi-bin/batch/openuserid_to_userid?access_token="; + + /** + * 手机号获取userid + */ + String GET_USER_ID_BY_MOBILE_URL = "https://qyapi.weixin.qq.com/cgi-bin/user/getuserid?access_token="; + + //------------------企业微信服务商redis key-------------------- + /** + * 代开发应用模板ticket + */ + String SERVICE_SUITE_TICKET = "service:suite:ticket:"; + + /** + * 企业微信 corp_token key前缀 + */ + String CORP_TOKEN = "corp:token."; + + /** + * 企业微信服务商 provider_token key前缀 + */ + String PROVIDER_TOKEN = "provider:token."; + + /** + * 企业微信服务商 suite_access_token key前缀 + */ + String SUITE_ACCESS_TOKEN = "suite:access.token."; + + /** + * 服务商对应学校加密corpId数据(加密值为key) + */ + String PROVIDER_SCHOOL_CORP_DATA = "provider:school:corp:data"; + + /** + * 服务商对应学校加密corpId数据(原始值为key) + */ + String PROVIDER_SCHOOL_CORP_ORIGINAL_DATA = "provider:school:corp:original:data"; + + //------------------企业微信服务商InfoType-------------------- + /** + * 授权安装待开发应用回调 + */ + String SERVICE_CREATE_AUTH = "create_auth"; + + /** + * 客户删除应用 + */ + String SERVICE_CANCEL_AUTH = "cancel_auth"; + + /** + * 代开发应用重置secret(即permanent_code) + */ + String RESET_PERMANENT_CODE = "reset_permanent_code"; + + /** + * 待开发应用模板suite_ticket + */ + String TEMPLATE_SUITE_TICKET = "suite_ticket"; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/constant/UPayConstant.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/constant/UPayConstant.java new file mode 100644 index 0000000..dcbc523 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/constant/UPayConstant.java @@ -0,0 +1,134 @@ +package com.yida.data.common.core.entity.constant; + +/** + * 收钱吧常量 + * + * @author ZYJ + * @date 2023/3/20 + */ +public interface UPayConstant { + + /** + * 订单时间 5分钟 + */ + long ORDER_TIME = 5 * 60L; + + /** + * 收钱吧支付回调地址 + */ + String NOTIFY_URL = "device/in/consume/uPayNotify"; + + /** + * 收钱吧支付后返回页面地址 + */ + String RETURN_URL = ""; + + /** + * 接口状态码名称 + */ + String RESULT_CODE_NAME = "result_code"; + + /** + * 返回信息主题 + */ + String BIZ_RESPONSE = "biz_response"; + + /** + * bizResponse接口状态码名称 + */ + String BIZ_CODE_NAME = "result_code"; + + /** + * 错误状态码名称 + * 。当result_code不等于200的时候才会出现error_code和error_message + */ + String ERROR_CODE_NAME = "error_code"; + + /** + * 错误信息名称 + * 。当result_code不等于200的时候才会出现error_code和error_message + */ + String ERROR_MESSAGE_NAME = "error_message"; + + /** + * 接口成功状态码 + */ + String RESULT_SUCCESS_CODE = "200"; + + /** + * bizResponse接口成功状态码 + */ + String BIZ_SUCCESS_CODE = "SUCCESS"; + + /** + * 无法找到指定的订单 状态码 + * 此类型订单需要直接关闭订单 + */ + String NO_ORDER_CODE = "UPAY_ORDER_NOT_EXISTS"; + + /** + * 交易不存在 + * 此类型订单需要直接关闭订单 + */ + String TRADE_NOT_EXIST = "TRADE_NOT_EXIST"; + + /** + * 撤单bizResponse接口成功状态码 + */ + String CANCEL_SUCCESS_CODE = "CANCEL_SUCCESS"; + + /** + * 撤单操作试图终止进行中的支付流程并且成功状态码 + */ + String CANCEL_ABORT_SUCCESS_CODE = "CANCEL_ABORT_SUCCESS"; + + /** + * 已经撤单 + */ + String CANCEL_ORDER_NOOP_CODE = "UPAY_CANCEL_ORDER_NOOP"; + + /** + * 退款bizResponse接口成功状态码 + */ + String REFUND_SUCCESS_CODE = "REFUND_SUCCESS"; + + /** + * 接口地址 + */ + String URL = "https://vsi-api.shouqianba.com"; + + /** + * 激活 + * post application/json + */ + String ACTIVATE = URL + "/terminal/activate"; + + /** + * 订单查询 + * post application/json + */ + String QUERY_ORDER = URL + "/upay/v2/query"; + + /** + * 撤单 + * post application/json + */ + String CLOSE_ORDER = URL + "/upay/v2/cancel"; + + /** + * 退款 + * post application/json + * 三个月以内都可以进行退款 + */ + String REFUND_ORDER = URL + "/upay/v2/refund"; + + /** + * 跳转支付接口 + */ + String TO_PAY_URL = "https://qr.shouqianba.com/gateway"; + + /** + * 品牌名称+支付场景 + */ + String ACTIVE_DEVICE_NAME = "zbz-consume-pay"; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/constant/WxPublicConstant.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/constant/WxPublicConstant.java index 9fe334b..9f7e084 100644 --- a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/constant/WxPublicConstant.java +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/constant/WxPublicConstant.java @@ -61,4 +61,10 @@ public interface WxPublicConstant { * 获取微信小程序 URL Link */ String GENERATE_URL_LINK = "https://api.weixin.qq.com/wxa/generate_urllink"; + + /** + * 获取JS-SDK jsapi_ticket + * https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html#62 + */ + String GET_JS_API_TICKET_URL = "https://api.weixin.qq.com/cgi-bin/ticket/getticket"; } diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/constant/hq/HaiqingCallbackCodeConstant.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/constant/hq/HaiqingCallbackCodeConstant.java new file mode 100644 index 0000000..0206a3a --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/constant/hq/HaiqingCallbackCodeConstant.java @@ -0,0 +1,40 @@ +package com.yida.data.common.core.entity.constant.hq; + +/** + * 海清回调code和errorCode常量类 + * + * @author ZYJ + * @date 2023/9/27 + */ +public interface HaiqingCallbackCodeConstant { + + /** + * 接口正忙,上一个批量指令还未完成 + */ + String DEVICE_BUSY = "410"; + + /** + * 单包数据超过1M + */ + String DATA_OUT_OF_RANGE = "460"; + + /** + * customId(人脸id)已经存在 + */ + String ADD_PERSON_EXIST = "461"; + + /** + * customId(人脸id)不存在,不存在此名单 + */ + String EDIT_PERSON_NOT_EXIST = "462"; + + /** + * 操作成功, ok + */ + String PUSH_RETURN_SUCCESS_RESULT = "ok"; + + /** + * 操作失败, fail + */ + String PUSH_RETURN_FAIL_RESULT = "fail"; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/constant/hq/HaiqingConstant.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/constant/hq/HaiqingConstant.java new file mode 100644 index 0000000..427be90 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/constant/hq/HaiqingConstant.java @@ -0,0 +1,128 @@ +package com.yida.data.common.core.entity.constant.hq; + +/** + * 海清方法与回调方法常量类 + * + * @author ZYJ + * @date 2023-9-27 + */ +public interface HaiqingConstant { + + /** + * 增改人员消息回调返回类型 + */ + String EDIT_PERSON_CALL = "EditPerson-Ack"; + + /** + * 批量增加人员 + */ + String ADD_PERSONS_BATCH = "AddPersons"; + + /** + * 批量增加人员返回 + */ + String ADD_PERSON_BATCH_CALL = "AddPersons-Ack"; + + /** + * 批量修改人员 + */ + String EDIT_PERSONS_BATCH = "EditPersons"; + + /** + * 批量修改人员返回 + */ + String UPDATE_PERSON_BATCH_CALL = "EditPersons-Ack"; + + /** + * 批量删除人员 + */ + String DELETE_PERSONS_BATCH = "DeletePersons"; + + /** + * 删除人员回调信息 + */ + String DELETE_PERSON_CALL = "DelPerson-Ack"; + + /** + * 批量删除人员信息回调 + */ + String DELETE_PERSON_BATCH_CALL = "DeletePersons-Ack"; + + /** + * 接收认证人员信息 + */ + String REC_PERSON = "RecPush"; + + /** + * 心跳消息 + */ + String HEARTBEAT = "HeartBeat"; + /** + * 远程开门返回信息 + */ + String UNLOCK_ACK = "Unlock-Ack"; + /** + * 设置系统时间 + */ + String SET_SYS_TIME_ACK = "SetSysTime-Ack"; + + /** + * 设备上线通知 + */ + String ONLINE = "Online"; + + /** + * 添加/修改通行策略 + */ + String ADD_ACCESS_STRATEGY = "AddAccessStrategy"; + + /** + * 添加/修改通行策略返回 + */ + String ADD_ACCESS_STRATEGY_CALL = "AddAccessStrategy-Ack"; + + /** + * 删除通行策略 + */ + String DEL_ACCESS_STRATEGY = "DelAccessStrategy"; + + /** + * 删除通行策略返回 + */ + String DEL_ACCESS_STRATEGY_CALL = "DelAccessStrategy-Ack"; + + /** + * 人员绑定通行策略 + */ + String PERSONS_BIND_STRATEGY = "PersonsBindStrategyID"; + + /** + * 人员绑定通行策略返回 + */ + String PERSONS_BIND_STRATEGY_CALL = "PersonsBindStrategyID-Ack"; + + /** + * 人员解绑通行策略 + */ + String PERSONS_UNBIND_STRATEGY = "PersonsUnbindStrategyID"; + + /** + * 人员解绑通行策略返回 + */ + String PERSONS_UNBIND_STRATEGY_CALL = "PersonsUnbindStrategyID-Ack"; + + /** + * 设置开门条件 + */ + String UP_DOOR_CONFIG = "UpDoorconfig"; + + /** + * 接收认证消息推送方法 + */ + String PUSH_MESSAGE = "PushAck"; + + /** + * 接收认证消息推送方法返回 + */ + String PUSH_MESSAGE_ACK = "PushAck-Ack"; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/consume/DeptConsumeTerminalCache.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/consume/DeptConsumeTerminalCache.java new file mode 100644 index 0000000..4df4c8c --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/consume/DeptConsumeTerminalCache.java @@ -0,0 +1,38 @@ +package com.yida.data.common.core.entity.consume; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 学校收钱吧终端信息缓存类 + * + * @author ZYJ + * @date 2023/4/3 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DeptConsumeTerminalCache implements Serializable { + + private static final long serialVersionUID = 2616403279476013295L; + + /** + * 部门id + */ + private Long deptId; + + /** + * 终端序列号 + */ + private String terminalSn; + + /** + * 终端密钥 + */ + private String terminalKey; +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/consume/EduConsumeConfig.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/consume/EduConsumeConfig.java new file mode 100644 index 0000000..2434b38 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/consume/EduConsumeConfig.java @@ -0,0 +1,45 @@ +package com.yida.data.common.core.entity.consume; + +import com.baomidou.mybatisplus.annotation.*; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 学校消费机服务器信息Entity + * + * @author ZYJ + * @date 2023-04-06 17:25:47 + */ +@Data +@TableName("edu_consume_config") +public class EduConsumeConfig { + + /** + * 主键id + */ + @ApiModelProperty(value = "主键id") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 是否删除,1删除0未删除,默认0 + */ + @ApiModelProperty(value = "是否删除,1删除0未删除,默认0") + @TableField("del_flag") + @TableLogic(value = "0", delval = "1") + private Integer delFlag; + + /** + * 对应部门id + */ + @ApiModelProperty(value = "对应部门id") + @TableField("dept_id") + private Long deptId; + + /** + * 服务器访问地址 + */ + @ApiModelProperty(value = "服务器访问地址") + @TableField("service_ip") + private String serviceIp; +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/consume/EduConsumeDevice.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/consume/EduConsumeDevice.java new file mode 100644 index 0000000..18e3fee --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/consume/EduConsumeDevice.java @@ -0,0 +1,73 @@ +package com.yida.data.common.core.entity.consume; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * 消费机设备Entity + * + * @author ZYJ + * @date 2023-03-14 17:55:59 + */ +@Data +@TableName("edu_consume_device") +public class EduConsumeDevice implements Serializable { + + private static final long serialVersionUID = 3799180102688755329L; + + @ApiModelProperty(value = "id") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @ApiModelProperty(value = "创建时间") + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + @ApiModelProperty(value = "修改时间") + @TableField(value = "update_date", fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateDate; + + @ApiModelProperty(value = "是否删除,1删除0未删除,默认0") + @TableField("del_flag") + @TableLogic(value = "0", delval = "1") + private Integer delFlag; + + @ApiModelProperty(value = "设备名称") + @TableField("name") + private String name; + + @ApiModelProperty(value = "设备编号") + @TableField("sn") + private String sn; + + @ApiModelProperty(value = "mac地址") + @TableField("mac_address") + private String macAddress; + + @ApiModelProperty(value = "设备厂商类型") + @TableField("device_type") + private String deviceType; + + @ApiModelProperty(value = "ip地址") + @TableField("ip") + private String ip; + + @ApiModelProperty(value = "学校id") + @TableField("school_id") + private Long schoolId; + + @ApiModelProperty(value = "设备在线状态,0-在线,1-未在线") + @TableField("state") + private Integer state; + +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/consume/EduConsumeOrder.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/consume/EduConsumeOrder.java new file mode 100644 index 0000000..eb5acd0 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/consume/EduConsumeOrder.java @@ -0,0 +1,174 @@ +package com.yida.data.common.core.entity.consume; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.yida.data.common.core.enums.PayWay; +import com.yida.data.common.core.enums.RefundStatusEnum; +import com.yida.data.common.core.enums.UnionPayTypeEnum; +import com.yida.data.common.core.enums.WxPayTypeEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 消费订单(充值记录)Entity + * + * @author ZYJ + * @date 2023/3/23 + */ +@Data +@TableName("edu_consume_order") +public class EduConsumeOrder implements Serializable { + + private static final long serialVersionUID = -1900073075734150028L; + + @TableId(value = "order_id", type = IdType.AUTO) + private Long orderId; + + /** + * 订单编号:NOT NULL,不可重复,加索引,生成规则参照:snowflake算法原理生成 + */ + @ApiModelProperty(value = "订单编号:NOT NULL,不可重复,加索引,生成规则参照:snowflake算法原理生成") + @TableField("order_code") + private String orderCode; + + /** + * 流水号生成规则: + * 第一位:一位数前缀 + * 第2-10位:学校ID,缺少的以0在前补位 + * 第11-20位:商品编码code,缺少的以0在前补位, + * 第21-28位:购买日期(年月日), + * 第29-36位:8位随机数 + */ + @ApiModelProperty(value = "流水号生成规则: 第一位:Z 第2-10位:学校ID,缺少的以0在前补位 第11-20位:商品编码code,缺少的以0在前补位, 第21-28位:购买日期(年月日), 第29-36位:8位随机数") + @TableField("transaction_number") + private String transactionNumber; + + @ApiModelProperty(value = "学生id") + private Long studentId; + + @ApiModelProperty(value = "订单总金额") + private BigDecimal totalMoney; + + /** + * 实际支付金额 + */ + @ApiModelProperty(value = "实际支付金额") + @TableField("practical_money") + private BigDecimal practicalMoney; + + /** + * 支付人手机号(家长手机) + */ + @ApiModelProperty(value = "支付人手机号(家长手机)") + @TableField("phone") + private String phone; + + /** + * 支付时间 + */ + @ApiModelProperty(value = "支付时间") + @TableField("pay_date") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime payDate; + + /** + * 订单状态:0:待付款 + * 1:付款中 + * 2:交易完成(正常支付成功) + * 3:待退款 + * 4:交易关闭(a:超时未支付,b:退款成功 + */ + @ApiModelProperty(value = "订单状态:0:待付款 1:付款中 2:交易完成(正常支付成功) 3:待退款 4:交易关闭(a:超时未支付,b:退款成功") + @TableField("order_status") + private String orderStatus; + + /** + * 支付状态:0:未支付(默认) + * 1:已支付 + * 2:已退款 + * 3:已取消 + */ + @ApiModelProperty(value = "支付状态:0:未支付(默认) 1:已支付 2:已退款 3:已取消") + @TableField("pay_status") + private String payStatus; + + /** + * 支付方式:1:微信,2:支付宝,3:银联,4:收钱吧 {@link PayWay} + */ + @ApiModelProperty(value = "支付方式:1:微信,2:支付宝,3:银联,4:收钱吧") + @TableField("pay_way") + private String payWay; + + /** + * 具体支付类型 + * 银联云闪付: {@link UnionPayTypeEnum} + * 微信类型: {@link WxPayTypeEnum} + */ + @ApiModelProperty("具体支付类型") + private Integer payType; + + /** + * 是否退款: + * 0:否(默认) + * 1:是 + * {@link RefundStatusEnum} + */ + @ApiModelProperty(value = "是否退款:0:否(默认) 1:是") + @TableField("is_refund") + private String isRefund; + + /** + * 学校id + */ + @ApiModelProperty(value = "学校id") + @TableField("dept_id") + private Long deptId; + + /** + * 是否删除:1删除 + * 0未删除 默认0 + */ + @ApiModelProperty(value = "是否删除:1删除 0未删除 默认0") + @TableField("del_flag") + @TableLogic(value = "0", delval = "1") + private Integer delFlag; + + /** + * 创建时间(下单时间) + */ + @ApiModelProperty(value = "创建时间(下单时间)") + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + /** + * 创建人id + */ + @ApiModelProperty(value = "创建人id") + @TableField(value = "create_id", fill = FieldFill.INSERT) + private Long createId; + + /** + * 修改时间 + */ + @ApiModelProperty(value = "修改时间") + @TableField(value = "update_date", fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateDate; + + /** + * 修改人id + */ + @ApiModelProperty(value = "修改人id") + @TableField(value = "update_id", fill = FieldFill.UPDATE) + private Long updateId; + +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/consume/EduConsumeOrderRefund.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/consume/EduConsumeOrderRefund.java new file mode 100644 index 0000000..f27b633 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/consume/EduConsumeOrderRefund.java @@ -0,0 +1,99 @@ +package com.yida.data.common.core.entity.consume; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * 消费订单退款信息Entity + * + * @author ZYJ + * @date 2023-04-03 16:12:35 + */ +@Data +@TableName("edu_consume_order_refund") +public class EduConsumeOrderRefund implements Serializable { + + private static final long serialVersionUID = -8611143615152970476L; + + /** + * 主键id + */ + @ApiModelProperty(value = "主键id") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 订单编号 + */ + @ApiModelProperty(value = "订单编号") + @TableField("order_code") + private String orderCode; + + /** + * 退款编号 R+订单编号 + */ + @ApiModelProperty(value = "退款编号 R+订单编号") + @TableField("refund_code") + private String refundCode; + + /** + * 退款流水号 替换订单流水号首字母为R + */ + @ApiModelProperty(value = "退款流水号 替换订单流水号首字母为R") + @TableField("refund_serial_number") + private String refundSerialNumber; + + /** + * 实际退款时间 + */ + @ApiModelProperty(value = "实际退款时间") + @TableField("refund_time") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime refundTime; + + /** + * 退款理由 + */ + @ApiModelProperty(value = "退款理由") + @TableField("refund_reason") + private String refundReason; + + /** + * 创建时间(退款申请时间) + */ + @ApiModelProperty(value = "创建时间(退款申请时间)") + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + /** + * 创建人id(退款操作人)关联user表 + */ + @ApiModelProperty(value = "创建人id(退款操作人)关联user表") + @TableField(value = "create_id", fill = FieldFill.INSERT) + private Long createId; + + /** + * 修改时间 + */ + @ApiModelProperty(value = "修改时间") + @TableField(value = "update_date", fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateDate; + + /** + * 修改人id + */ + @ApiModelProperty(value = "修改人id") + @TableField(value = "update_id", fill = FieldFill.UPDATE) + private Long updateId; +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/consume/EduConsumeOrderStudent.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/consume/EduConsumeOrderStudent.java new file mode 100644 index 0000000..26059e7 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/consume/EduConsumeOrderStudent.java @@ -0,0 +1,174 @@ +package com.yida.data.common.core.entity.consume; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * 消费订单(充值)学生详细信息Entity + * + * @author ZYJ + * @date 2023/3/23 + */ +@Data +@TableName("edu_consume_order_student") +public class EduConsumeOrderStudent implements Serializable { + + private static final long serialVersionUID = -2027376385019025656L; + + @ApiModelProperty(value = "主键") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 账单订单主键ID + */ + @ApiModelProperty(value = "账单订单主键ID") + @TableField("order_id") + private Long orderId; + + /** + * 支付学生主键ID + */ + @ApiModelProperty(value = "支付学生主键ID") + @TableField("student_id") + private Long studentId; + + /** + * 支付学生姓名 + */ + @ApiModelProperty(value = "支付学生姓名") + @TableField("student_name") + private String studentName; + + /** + * 支付学生学号 + */ + @ApiModelProperty(value = "支付学生学号") + @TableField("student_number") + private String studentNumber; + + /** + * 支付学生校园卡号 + */ + @ApiModelProperty(value = "支付学生校园卡号") + @TableField("stu_card_number") + private String stuCardNumber; + + /** + * 支付学生家庭类型 关联字典表t_dict的value值, + */ + @ApiModelProperty(value = "支付学生家庭类型.关联字典表t_dict的value值") + @TableField("student_family_type") + private String studentFamilyType; + + /** + * 支付学生与家长关系 + */ + @ApiModelProperty(value = "支付学生与家长关系") + @TableField("student_parent_type") + private String studentParentType; + + /** + * 省ID + */ + @ApiModelProperty(value = "省ID") + @TableField("province_id") + private Long provinceId; + + /** + * 市ID + */ + @ApiModelProperty(value = "市ID") + @TableField("city_id") + private Long cityId; + + /** + * 县ID + */ + @ApiModelProperty(value = "县ID") + @TableField("county_id") + private Long countyId; + + /** + * 乡镇ID + */ + @ApiModelProperty(value = "乡镇ID") + @TableField("town_id") + private Long townId; + + /** + * 学校主键ID + */ + @ApiModelProperty(value = "学校主键ID") + @TableField("school_id") + private Long schoolId; + + /** + * 学校名称 + */ + @ApiModelProperty(value = "学校名称") + @TableField("school_name") + private String schoolName; + + /** + * 学区主键ID + */ + @ApiModelProperty(value = "学区主键ID") + @TableField("campus_id") + private Long campusId; + + /** + * 学区名称 + */ + @ApiModelProperty(value = "学区名称") + @TableField("campus_name") + private String campusName; + + /** + * 学段主键ID + */ + @ApiModelProperty(value = "学段主键ID") + @TableField("section_id") + private Long sectionId; + + /** + * 学段名称 + */ + @ApiModelProperty(value = "学段名称") + @TableField("section_name") + private String sectionName; + + /** + * 年级主键ID + */ + @ApiModelProperty(value = "年级主键ID") + @TableField("grade_id") + private Long gradeId; + + /** + * 年级名称 + */ + @ApiModelProperty(value = "年级名称") + @TableField("grade_name") + private String gradeName; + + /** + * 班级主键ID + */ + @ApiModelProperty(value = "班级主键ID") + @TableField("class_id") + private Long classId; + + /** + * 班级名称 + */ + @ApiModelProperty(value = "班级名称") + @TableField("class_name") + private String className; +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/consume/EduConsumeRecord.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/consume/EduConsumeRecord.java new file mode 100644 index 0000000..c18240a --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/consume/EduConsumeRecord.java @@ -0,0 +1,157 @@ +package com.yida.data.common.core.entity.consume; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 消费机学生消费记录Entity + * + * @author ZYJ + * @date 2023-03-24 16:16:49 + */ +@Data +@TableName("edu_consume_record") +public class EduConsumeRecord implements Serializable { + + private static final long serialVersionUID = 7445355621973217547L; + + @ApiModelProperty(value = "主键") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 创建时间(下单时间) + */ + @ApiModelProperty(value = "创建时间(下单时间)") + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + /** + * 订单号 + */ + @ApiModelProperty(value = "订单号") + @TableField("order_no") + private Long orderNo; + + /** + * 消费机设备编号 + */ + @ApiModelProperty(value = "消费机设备编号") + @TableField("device_no") + private String deviceNo; + + /** + * 学生主键ID + */ + @ApiModelProperty(value = "学生主键ID") + @TableField("student_id") + private Long studentId; + + /** + * 学生姓名 + */ + @ApiModelProperty(value = "学生姓名") + @TableField("student_name") + private String studentName; + + /** + * 校园卡号 + */ + @ApiModelProperty(value = "校园卡号") + @TableField("stu_card_number") + private String stuCardNumber; + + /** + * 消费金额. 单位: 元 + */ + @ApiModelProperty(value = "消费金额. 单位: 元") + @TableField("transaction_amount") + private BigDecimal transactionAmount; + /** + * 消费时间 + */ + @ApiModelProperty(value = "消费时间") + @TableField("transaction_time") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime transactionTime; + + /** + * 学校主键ID + */ + @ApiModelProperty(value = "学校主键ID") + @TableField("school_id") + private Long schoolId; + + /** + * 学校名称 + */ + @ApiModelProperty(value = "学校名称") + @TableField("school_name") + private String schoolName; + + /** + * 学区主键ID + */ + @ApiModelProperty(value = "学区主键ID") + @TableField("campus_id") + private Long campusId; + + /** + * 学区名称 + */ + @ApiModelProperty(value = "学区名称") + @TableField("campus_name") + private String campusName; + + /** + * 学段主键ID + */ + @ApiModelProperty(value = "学段主键ID") + @TableField("section_id") + private Long sectionId; + + /** + * 学段名称 + */ + @ApiModelProperty(value = "学段名称") + @TableField("section_name") + private String sectionName; + + /** + * 年级主键ID + */ + @ApiModelProperty(value = "年级主键ID") + @TableField("grade_id") + private Long gradeId; + + /** + * 年级名称 + */ + @ApiModelProperty(value = "年级名称") + @TableField("grade_name") + private String gradeName; + + /** + * 班级主键ID + */ + @ApiModelProperty(value = "班级主键ID") + @TableField("class_id") + private Long classId; + + /** + * 班级名称 + */ + @ApiModelProperty(value = "班级名称") + @TableField("class_name") + private String className; +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/consume/EduStudentConsumeCard.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/consume/EduStudentConsumeCard.java new file mode 100644 index 0000000..1574802 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/consume/EduStudentConsumeCard.java @@ -0,0 +1,77 @@ +package com.yida.data.common.core.entity.consume; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 学生消费机信息管理Entity + * + * @author ZYJ + * @date 2023/3/20 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@TableName("edu_student_consume_card") +public class EduStudentConsumeCard implements Serializable { + + private static final long serialVersionUID = 1854565947440756892L; + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @ApiModelProperty(value = "创建人id") + @TableField(value = "create_id", fill = FieldFill.INSERT) + private Long createId; + + @ApiModelProperty(value = "创建时间") + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + @ApiModelProperty(value = "修改人id") + @TableField(value = "update_id", fill = FieldFill.UPDATE) + private Long updateId; + + @ApiModelProperty(value = "修改时间") + @TableField(value = "update_date", fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateDate; + + @ApiModelProperty(value = "删除标识") + @TableField("del_flag") + @TableLogic(value = "0", delval = "1") + private Integer delFlag; + + @ApiModelProperty(value = "学校id") + @TableField("dept_id") + private Long deptId; + + @ApiModelProperty(value = "学生id") + @TableField("student_id") + private Long studentId; + + @ApiModelProperty(value = "余额") + @TableField("balance") + private BigDecimal balance; + + @ApiModelProperty(value = "卡片状态(1:正常卡 2:挂失卡)") + @TableField("card_status") + private Integer cardStatus; + + public static final Integer NORMAL_CARD = 1; + public static final Integer LOSS_CARD = 2; +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/consume/Recharge.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/consume/Recharge.java new file mode 100644 index 0000000..0d3312b --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/consume/Recharge.java @@ -0,0 +1,82 @@ +package com.yida.data.common.core.entity.consume; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 消费机充值类 + * + * @author ZYJ + * @date 2023/4/6 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class Recharge implements Serializable { + + private static final long serialVersionUID = 6448914388280845022L; + + /** + * 金额 + */ + private String amount; + + /** + * 校园卡号 + */ + private String accountNo; + + /** + * 增减方式. true:充值, false:提取 + */ + private boolean increase; + + /** + * 充值钱包类型. 1:现金, 2:补贴 + */ + private Integer walletType; + + /** + * 流水号 + */ + private String transactionNumber; + + /** + * PaymentModel类 + */ + private PaymentModel paymentModel; + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class PaymentModel implements Serializable { + + private static final long serialVersionUID = -7667143304803691806L; + + /** + * 支付方式. 0:现金 1:微信 2:支付宝 4:银行卡 8:其他APP + */ + private Integer payType; + + /** + * 第三方支付时间(格式:yyyy-MM-dd HH:mm:ss) + */ + private String payTime; + + /** + * 终端向第三方发起交易请求的订单号 + */ + private String orderNumber; + + /** + * 第三方返回给终端的支付交易号 + */ + private String innerOrderNumber; + } +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/dashboard/EduSchoolDashboardData.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/dashboard/EduSchoolDashboardData.java new file mode 100644 index 0000000..2eca1e8 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/dashboard/EduSchoolDashboardData.java @@ -0,0 +1,126 @@ +package com.yida.data.common.core.entity.dashboard; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.yida.data.common.core.entity.classschedule.EduClassScheduleTime; +import io.swagger.annotations.ApiModelProperty; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * 校园仪表盘基础数据 实体 + */ +@Data +@TableName("edu_school_dashboard_data") +public class EduSchoolDashboardData { + + /** + * + */ + @ApiModelProperty(value = "") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间") + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + /** + * 更新时间 + */ + @ApiModelProperty(value = "更新时间") + @TableField(value = "update_date", fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateDate; + + /** + * 创建者 + */ + @ApiModelProperty(value = "创建者") + @TableField(value = "create_id", fill = FieldFill.INSERT) + private Long createId; + + /** + * 修改者 + */ + @ApiModelProperty(value = "修改者") + @TableField(value = "update_id", fill = FieldFill.UPDATE) + private Long updateId; + + /** + * 删除标识 + */ + @ApiModelProperty(value = "删除标识") + @TableField("del_flag") + @TableLogic(value = "0", delval = "1") + private Integer delFlag; + + @ApiModelProperty(value = "所属学校主键ID") + @TableField("school_id") + private Long schoolId; + + @ApiModelProperty(value = "仪表盘标题") + @TableField("title") + private String title; + + @ApiModelProperty(value = "头部logo地址") + @TableField("header_url") + private String headerUrl; + + @ApiModelProperty(value = "模板类型1:单页,2双页,3.。。") + @TableField("mode_type") + private Integer modeType; + + @ApiModelProperty(value = "地址") + @TableField("address") + private String address; + + @ApiModelProperty(value = "学校创建时间") + @TableField(value = "school_create_date") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") + private LocalDate schoolCreateDate; + + @ApiModelProperty(value = "学校占地面积") + @TableField("school_area") + private Integer schoolArea; + + @ApiModelProperty(value = "办学类型") + @TableField("edu_type") + private String eduType; + + @ApiModelProperty(value = "院校特色") + @TableField("edu_feature") + private String eduFeature; + + @ApiModelProperty(value = "院校类型") + @TableField("institution_type") + private String institutionType; + + @ApiModelProperty(value = "硕士点") + @TableField("master_num") + private Integer masterNum; + + @ApiModelProperty(value = "博士点") + @TableField("doctor_num") + private Integer doctorNum; + + @ApiModelProperty(value = "博士点") + @TableField("key_disciplines_num") + private Integer keyDisciplinesNum; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/notice/app/AppNotice.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/notice/app/AppNotice.java index 63dd832..d74a5f8 100644 --- a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/notice/app/AppNotice.java +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/notice/app/AppNotice.java @@ -15,11 +15,6 @@ public class AppNotice { */ private List userIds; - /** - * 用户id - */ - private List userIdList; - /** * 订阅号 消息内容 */ diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/notice/app/inside/PushMessage.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/notice/app/inside/PushMessage.java index 781c407..8f3ca95 100644 --- a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/notice/app/inside/PushMessage.java +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/notice/app/inside/PushMessage.java @@ -63,5 +63,4 @@ public class PushMessage { public static final String AUDIO = "audio"; public static final String NORMAL = "NORMAL"; public static final String ACCOUNT = "MSG_ACCOUNT_MSG"; - public static final String H5_SUB_MSG_TYPE = "NEWSEDUCATION"; } diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/notice/qywx/TemplateCardStaffNotice.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/notice/qywx/TemplateCardStaffNotice.java new file mode 100644 index 0000000..ad4a41e --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/notice/qywx/TemplateCardStaffNotice.java @@ -0,0 +1,24 @@ +package com.yida.data.common.core.entity.notice.qywx; + +import cn.hutool.json.JSONObject; +import com.yida.data.common.core.entity.constant.NoticeTypeConstant; +import com.yida.data.common.core.entity.notice.qywx.inside.News; +import com.yida.data.common.core.entity.notice.qywx.inside.TemplateCardNotice; +import com.yida.data.common.core.entity.notice.qywx.inside.templateCard.textNotice; +import java.io.Serializable; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 职工模板卡片消息 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class TemplateCardStaffNotice extends BaseStaffNotice implements Serializable { + + private static final long serialVersionUID = -7273948565592163788L; + private String msgtype = NoticeTypeConstant.NOTICE_MSG_TEMPLATE_TYPE; + private TemplateCardNotice template_card; +} + + diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/notice/qywx/TextCardStaffNotice.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/notice/qywx/TextCardStaffNotice.java new file mode 100644 index 0000000..db1b6f7 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/notice/qywx/TextCardStaffNotice.java @@ -0,0 +1,19 @@ +package com.yida.data.common.core.entity.notice.qywx; + +import com.yida.data.common.core.entity.notice.qywx.inside.Text; +import com.yida.data.common.core.entity.notice.qywx.inside.TextCard; +import java.io.Serializable; +import lombok.Data; + +/** + * 文本卡片消息 + */ +@Data +public class TextCardStaffNotice extends BaseStaffNotice implements Serializable { + + private static final long serialVersionUID = -5252303643753456126L; + private String msgtype = "textcard"; + private TextCard textcard; + + +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/notice/qywx/inside/TemplateCardNotice.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/notice/qywx/inside/TemplateCardNotice.java new file mode 100644 index 0000000..58d8ae7 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/notice/qywx/inside/TemplateCardNotice.java @@ -0,0 +1,37 @@ +package com.yida.data.common.core.entity.notice.qywx.inside; + +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; +import com.yida.data.common.core.entity.notice.qywx.inside.templateCard.CardAction; +import com.yida.data.common.core.entity.notice.qywx.inside.templateCard.HorizontalContent; +import com.yida.data.common.core.entity.notice.qywx.inside.templateCard.Jump; +import com.yida.data.common.core.entity.notice.qywx.inside.templateCard.MainTitle; +import java.util.List; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class TemplateCardNotice { + + //模板卡片类型,文本通知型卡片填写 "text_notice" + private String card_type; + //一级标题 + private MainTitle main_title; + + //二级普通文本,建议不超过160个字,(支持id转译) + private String sub_title_text; + + //二级标题+文本列表 + private List horizontal_content_list; + + //整体卡片的点击跳转事件,text_notice必填本字段 + private CardAction card_action; + + //跳转指引样式的列表,该字段可为空数组,但有数据的话需确认对应字段是否必填,列表长度不超过3 + private List jump_list; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/notice/qywx/inside/TextCard.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/notice/qywx/inside/TextCard.java new file mode 100644 index 0000000..3d6cfbd --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/notice/qywx/inside/TextCard.java @@ -0,0 +1,29 @@ +package com.yida.data.common.core.entity.notice.qywx.inside; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class TextCard { + + /** + * 描述,不超过512个字节,超过会自动截断(支持id转译) + */ + private String description; + /** + * 点击后跳转的链接。最长2048字节,请确保包含了协议头(http/https) + */ + private String url; + /** + * 标题,不超过128个字节,超过会自动截断(支持id转译) + */ + private String title; + + /** + * 按钮文字。 默认为“详情”, 不超过4个文字,超过自动截断。 + */ + private String btntxt = "查看详情"; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/notice/qywx/inside/templateCard/CardAction.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/notice/qywx/inside/templateCard/CardAction.java new file mode 100644 index 0000000..7ab6406 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/notice/qywx/inside/templateCard/CardAction.java @@ -0,0 +1,24 @@ +package com.yida.data.common.core.entity.notice.qywx.inside.templateCard; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class CardAction { + + //跳转事件类型,1 代表跳转url,2 代表打开小程序。text_notice卡片模版中该字段取值范围为[1,2] + private Integer type; + // 跳转事件的小程序的appid,必须是与当前应用关联的小程序,card_action.type是2时必填 + private String appid; + + // 跳转事件的小程序的pagepath,card_action.type是2时选填 + private String pagepath; + + // 跳转事件的url,card_action.type是1时必填 + private String url; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/notice/qywx/inside/templateCard/HorizontalContent.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/notice/qywx/inside/templateCard/HorizontalContent.java new file mode 100644 index 0000000..3e3e875 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/notice/qywx/inside/templateCard/HorizontalContent.java @@ -0,0 +1,25 @@ +package com.yida.data.common.core.entity.notice.qywx.inside.templateCard; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class HorizontalContent { + + //链接类型,0或不填代表不是链接,1 代表跳转url,2 代表下载附件,3 代表点击跳转成员详情 + private Integer type; + + // 二级标题,建议不超过5个字 + private String keyname; + + //二级文本,如果horizontal_content_list.type是2,该字段代表文件名称(要包含文件类型),建议不超过30个字,(支持id转译) + private String value; + + //链接跳转的url,horizontal_content_list.type是1时必填 + private String url; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/notice/qywx/inside/templateCard/Jump.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/notice/qywx/inside/templateCard/Jump.java new file mode 100644 index 0000000..a21d9b7 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/notice/qywx/inside/templateCard/Jump.java @@ -0,0 +1,27 @@ +package com.yida.data.common.core.entity.notice.qywx.inside.templateCard; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class Jump { + + /** + * 跳转链接类型,0或不填代表不是链接,1 代表跳转url,2 代表跳转小程序 + */ + private Integer type; + /** + * 跳转链接样式的文案内容,建议不超过18个字 + */ + private String title; + /** + * 跳转链接的url,jump_list.type是1时必填 + */ + private String url; + +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/notice/qywx/inside/templateCard/MainTitle.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/notice/qywx/inside/templateCard/MainTitle.java new file mode 100644 index 0000000..0926145 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/notice/qywx/inside/templateCard/MainTitle.java @@ -0,0 +1,18 @@ +package com.yida.data.common.core.entity.notice.qywx.inside.templateCard; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MainTitle { + + //一级标题,建议不超过36个字,文本通知型卡片本字段非必填,但不可本字段和sub_title_text都不填,(支持id转译) + private String title; + //标题辅助信息,建议不超过44个字,(支持id转译) + private String desc; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/notice/qywx/inside/templateCard/textNotice.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/notice/qywx/inside/templateCard/textNotice.java new file mode 100644 index 0000000..a01bee0 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/notice/qywx/inside/templateCard/textNotice.java @@ -0,0 +1,25 @@ +package com.yida.data.common.core.entity.notice.qywx.inside.templateCard; + +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class textNotice { + + private String card_type = "text_notice"; + + private JSONObject main_title; + + private String sub_title_text; + + private JSONArray horizontal_content_list; + + private String jump_list; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/pay/ConstructionPayOrder.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/pay/ConstructionPayOrder.java new file mode 100644 index 0000000..9f4e907 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/pay/ConstructionPayOrder.java @@ -0,0 +1,35 @@ +package com.yida.data.common.core.entity.pay; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 建行支付订单类 + * + * @author ZYJ + * @date 2023/6/20 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ConstructionPayOrder implements Serializable { + + private static final long serialVersionUID = -7383648143242078954L; + + @ApiModelProperty("订单号. 由商户提供,最长 30 位。建议按以下规则生成订单号:商户代码后9位, 自定义字符串(不超 21位)") + private String orderNo; + + @ApiModelProperty("实际支付金额. 单位元") + private BigDecimal payMoney; + + @ApiModelProperty("下单时间") + private Date orderTime; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/pay/UPayOrder.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/pay/UPayOrder.java new file mode 100644 index 0000000..b73cc94 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/pay/UPayOrder.java @@ -0,0 +1,49 @@ +package com.yida.data.common.core.entity.pay; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 收钱吧支付订单类 + * + * @author ZYJ + * @date 2023/3/21 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class UPayOrder implements Serializable { + + private static final long serialVersionUID = -5046106957542699001L; + + @ApiModelProperty("商户系统订单号. 唯一, 且长度不超过32字节") + private String clientSn; + + @ApiModelProperty("实际支付金额. 单位元") + private BigDecimal totalAmount; + + @ApiModelProperty("本次交易的概述") + private String subject; + + @ApiModelProperty("支付方式. 不传默认选择当前环境支持的支付方式") + private String payWay; + + @ApiModelProperty("发起本次交易的操作员") + private String operator; + + @ApiModelProperty("扩展参数集合") + private String extended; + + @ApiModelProperty("支付结果通知地址. 如果支付成功通知时间间隔为1s,5s,30s,600s") + private String notifyUrl; + + @ApiModelProperty("网页跳转地址") + private String returnUrl; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/pay/URefund.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/pay/URefund.java new file mode 100644 index 0000000..5f66ace --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/pay/URefund.java @@ -0,0 +1,37 @@ +package com.yida.data.common.core.entity.pay; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 收钱吧退款类 + * + * @author ZYJ + * @date 2023/3/21 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class URefund implements Serializable { + + private static final long serialVersionUID = 110140312726486743L; + + @ApiModelProperty("商户系统订单号. 唯一, 且长度不超过32字节") + private String clientSn; + + @ApiModelProperty("退款序列号") + private String refundRequestNo; + + @ApiModelProperty("执行本次退款的操作员") + private String operator; + + @ApiModelProperty("退款金额. 单位元") + private BigDecimal refundAmount; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/pay/UnionPayOrder.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/pay/UnionPayOrder.java index 7cbf25e..fd9d486 100644 --- a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/pay/UnionPayOrder.java +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/pay/UnionPayOrder.java @@ -23,7 +23,7 @@ import java.math.BigDecimal; @AllArgsConstructor public class UnionPayOrder implements Serializable { - private static final long serialVersionUID = -1548806861180880702L; + private static final long serialVersionUID = -1580486861180880702L; @ApiModelProperty("银联云闪付支付类型") private Integer unionPayType; diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/school/EduDeptHomeApp.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/school/EduDeptHomeApp.java new file mode 100644 index 0000000..3fd62c1 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/school/EduDeptHomeApp.java @@ -0,0 +1,155 @@ +package com.yida.data.common.core.entity.school; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.yida.data.common.core.enums.AppTypeEnum; +import com.yida.data.common.core.enums.EnableStatusEnum; +import com.yida.data.common.core.enums.UserTypeEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +/** + * 部门微官网应用配置 Entity + * + * @author ZYJ + * @date 2023-06-28 15:24:25 + */ +@Data +@TableName("edu_dept_home_app") +public class EduDeptHomeApp { + + /** + * 主键 + */ + @ApiModelProperty(value = "主键") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 是否删除,1删除0未删除,默认0 + */ + @ApiModelProperty(value = "是否删除,1删除0未删除,默认0") + @TableField("del_flag") + @TableLogic(value = "0", delval = "1") + private Integer delFlag; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间") + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + /** + * 创建人id + */ + @ApiModelProperty(value = "创建人id") + @TableField(value = "create_id", fill = FieldFill.INSERT) + private Long createId; + + /** + * 最后修改时间 + */ + @ApiModelProperty(value = "最后修改时间") + @TableField(value = "update_date", fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateDate; + + /** + * 最后修改人id + */ + @ApiModelProperty(value = "最后修改人id") + @TableField(value = "update_id", fill = FieldFill.UPDATE) + private Long updateId; + + /** + * 部门id + */ + @ApiModelProperty(value = "部门id") + @TableField("dept_id") + private Long deptId; + + /** + * 应用类型. 0:系统应用, 1:第三方应用 {@link AppTypeEnum} + */ + @ApiModelProperty(value = "应用类型. 0:系统应用, 1:第三方应用,2:微信小程序") + @TableField("app_type") + private Integer appType; + + /** + * 类型. 0:教职工, 1:家长 {@link UserTypeEnum} + */ + @ApiModelProperty(value = "类型. 0:教职工, 1:家长") + @TableField("user_type") + private Integer userType; + + /** + * 基础应用id + */ + @ApiModelProperty(value = "基础应用id") + @TableField("base_app_id") + private Long baseAppId; + + /** + * 应用名称 + */ + @ApiModelProperty(value = "应用名称") + @TableField("name") + private String name; + + /** + * 应用代码 + */ + @ApiModelProperty(value = "应用代码") + @TableField("code") + private String code; + + /** + * 应用logo + */ + @ApiModelProperty(value = "应用logo") + @TableField("logo") + private String logo; + + /** + * 应用地址 + */ + @ApiModelProperty(value = "应用地址") + @TableField("app_src") + private String appSrc; + + /** + * 启用状态. 0:未启用,1:已启用 {@link EnableStatusEnum} + */ + @ApiModelProperty(value = "启用状态. 0:未启用,1:已启用") + @TableField("enable_status") + private Integer enableStatus; + + /** + * 排序 + */ + @ApiModelProperty(value = "排序") + @TableField("sort") + private Integer sort; + + /** + * 微信小程序appid + */ + @ApiModelProperty(value = "微信小程序appid") + @TableField("app_id") + private String appId; + + /** + * 微信小程序secret + */ + @ApiModelProperty(value = "微信小程序secret") + @TableField("app_secret") + private String appSecret; + +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/school/EduSchoolFunctionConfig.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/school/EduSchoolFunctionConfig.java new file mode 100644 index 0000000..ff0f30c --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/school/EduSchoolFunctionConfig.java @@ -0,0 +1,43 @@ +package com.yida.data.common.core.entity.school; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.yida.data.common.core.entity.user.EduStaff; +import io.swagger.annotations.ApiModelProperty; +import java.time.LocalDateTime; +import java.util.List; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * 学校功能关键点配置 + * + * @author wjm + * @date 2021-09-14 17:42:11 + */ +@Data +@TableName("edu_school_function_config") +public class EduSchoolFunctionConfig { + + @ApiModelProperty(value = "主键") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @ApiModelProperty(value = "学校主键") + @TableField(value = "school_id") + private Long schoolId; + + @ApiModelProperty(value = "关键功能点code") + @TableField(value = "function_code") + private String functionCode; + + @ApiModelProperty(value = "是否启用1启用,其他未启用") + @TableField(value = "state") + private Integer state; + +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/school/EduSchoolManuscript.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/school/EduSchoolManuscript.java index 1e6b15a..a464048 100644 --- a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/school/EduSchoolManuscript.java +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/school/EduSchoolManuscript.java @@ -89,7 +89,7 @@ public class EduSchoolManuscript { @TableField("author_id") private Long authorId; - @ApiModelProperty("发布位置,0-城市书房, 1-第二课堂(精彩推荐),2-微信公众号,多个用逗号分割,3-首页") + @ApiModelProperty("发布位置,0-城市书房, 1-第二课堂(精彩推荐),2-微信公众号,多个用逗号分割") @TableField("publish_path") private String publishPath; @@ -132,7 +132,7 @@ public class EduSchoolManuscript { private transient String authorName; // 新闻区 - public static final String NEWS_PATH = "3"; + public static final String NEWS_PATH = "0"; // 第二课堂 public static final String SECOND_CLASS_PATH = "1"; // 公众号 diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/screen/EduSchoolDashboardData.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/screen/EduSchoolDashboardData.java new file mode 100644 index 0000000..03ce9e6 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/screen/EduSchoolDashboardData.java @@ -0,0 +1,269 @@ +package com.yida.data.common.core.entity.screen; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalDate; +import java.time.LocalDateTime; + +/** + * 校园大数据仪表盘数据中心Entity + * + * @author ZYJ + * @date 2023-04-19 16:42:57 + */ +@Data +@TableName("edu_school_dashboard_data") +public class EduSchoolDashboardData implements Serializable { + + private static final long serialVersionUID = -5320543865040629256L; + + /** + * 主键 + */ + @ApiModelProperty(value = "主键") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 创建人id + */ + @ApiModelProperty(value = "创建人id") + @TableField(value = "create_id", fill = FieldFill.INSERT) + private Long createId; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间") + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + /** + * 最后修改人id + */ + @ApiModelProperty(value = "最后修改人id") + @TableField(value = "update_id", fill = FieldFill.UPDATE) + private Long updateId; + + /** + * 最后修改时间 + */ + @ApiModelProperty(value = "最后修改时间") + @TableField(value = "update_date", fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateDate; + + /** + * 删除标识. 0: 未删除, 1: 已删除 + */ + @ApiModelProperty(value = "删除标识. 0: 未删除, 1: 已删除") + @TableField("del_flag") + @TableLogic(value = "0", delval = "1") + private Integer delFlag; + + /** + * 学校id + */ + @ApiModelProperty(value = "学校id") + @TableField("school_id") + private Long schoolId; + + /** + * 大屏名称 + */ + @ApiModelProperty(value = "大屏名称") + @TableField("title") + private String title; + + /** + * 学校logo地址 + */ + @ApiModelProperty(value = "学校logo地址") + @TableField("header_url") + private String headerUrl; + + /** + * 模板类型1:单页,2双页,3.。。 + */ + @ApiModelProperty(value = "模板类型1:单页,2双页,3.。。") + @TableField("mode_type") + private Integer modeType; + + /** + * 所属区域 + */ + @ApiModelProperty(value = "所属区域") + @TableField("area") + private String area; + + /** + * 详细地址 + */ + @ApiModelProperty(value = "详细地址") + @TableField("address") + private String address; + + /** + * 学校创建时间 + */ + @ApiModelProperty(value = "学校创建时间") + @TableField("school_create_date") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") + private LocalDate schoolCreateDate; + + /** + * 学校占地面积 + */ + @ApiModelProperty(value = "学校占地面积") + @TableField("school_area") + private Integer schoolArea; + + /** + * 主管部门 + */ + @ApiModelProperty(value = "主管部门") + @TableField("competent_department") + private String competentDepartment; + + /** + * 办学类型 + */ + @ApiModelProperty(value = "办学类型") + @TableField("edu_type") + private String eduType; + + /** + * 院校特色 + */ + @ApiModelProperty(value = "院校特色") + @TableField("edu_feature") + private String eduFeature; + + /** + * 院校类型 + */ + @ApiModelProperty(value = "院校类型") + @TableField("institution_type") + private String institutionType; + + /** + * 硕士点 + */ + @ApiModelProperty(value = "硕士点") + @TableField("master_num") + private Integer masterNum; + + /** + * 博士点 + */ + @ApiModelProperty(value = "博士点") + @TableField("doctor_num") + private Integer doctorNum; + + /** + * 重点学科数 + */ + @ApiModelProperty(value = "重点学科数") + @TableField("key_disciplines_num") + private Integer keyDisciplinesNum; + + /** + * 科研项目数 + */ + @ApiModelProperty(value = "科研项目数") + @TableField("research_project_num") + private Integer researchProjectNum; + + /** + * 学校简介 + */ + @ApiModelProperty(value = "学校简介") + @TableField("edu_introduction") + private String eduIntroduction; + + /** + * 办学理念 + */ + @ApiModelProperty(value = "办学理念") + @TableField("edu_philosophy") + private String eduPhilosophy; + + /** + * 办学使命 + */ + @ApiModelProperty(value = "办学使命") + @TableField("edu_mission") + private String eduMission; + + /** + * 办学校训 + */ + @ApiModelProperty(value = "办学校训") + @TableField("edu_motto") + private String eduMotto; + + /** + * 校园风采 + */ + @ApiModelProperty(value = "校园风采") + @TableField("campus_style") + private String campusStyle; + + /** + * 官方电话 + */ + @ApiModelProperty(value = "官方电话") + @TableField("telephone") + private String telephone; + + /** + * 教师人数 + */ + @ApiModelProperty(value = "教师人数") + @TableField("teacher_num") + private Integer teacherNum; + + /** + * 院系数量 + */ + @ApiModelProperty(value = "院系数量") + @TableField("department_num") + private Integer departmentNum; + + /** + * 一级学科数量 + */ + @ApiModelProperty(value = "一级学科数量") + @TableField("first_level_discipline_num") + private Integer firstLevelDisciplineNum; + + /** + * 二级学科数量 + */ + @ApiModelProperty(value = "二级学科数量") + @TableField("secondary_discipline_num") + private Integer secondaryDisciplineNum; + + /** + * 班级数 + */ + @ApiModelProperty(value = "班级数") + @TableField("class_num") + private Integer classNum; + + /** + * 学生人数 + */ + @ApiModelProperty(value = "学生人数") + @TableField("student_num") + private Integer studentNum; +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/screen/EduSchoolDashboardDataBase.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/screen/EduSchoolDashboardDataBase.java new file mode 100644 index 0000000..b49b265 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/screen/EduSchoolDashboardDataBase.java @@ -0,0 +1,98 @@ +package com.yida.data.common.core.entity.screen; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * 校园大数据仪表盘数据中心-基础建设Entity + * + * @author ZYJ + * @date 2023-04-19 16:52:15 + */ +@Data +@TableName("edu_school_dashboard_data_base") +public class EduSchoolDashboardDataBase implements Serializable { + + private static final long serialVersionUID = 4012887985974912015L; + + /** + * 主键 + */ + @ApiModelProperty(value = "主键") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 创建人id + */ + @ApiModelProperty(value = "创建人id") + @TableField(value = "create_id", fill = FieldFill.INSERT) + private Long createId; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间") + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + /** + * 最后修改人id + */ + @ApiModelProperty(value = "最后修改人id") + @TableField(value = "update_id", fill = FieldFill.UPDATE) + private Long updateId; + + /** + * 最后修改时间 + */ + @ApiModelProperty(value = "最后修改时间") + @TableField(value = "update_date", fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateDate; + + /** + * 删除标识. 0: 未删除, 1: 已删除 + */ + @ApiModelProperty(value = "删除标识. 0: 未删除, 1: 已删除") + @TableField("del_flag") + @TableLogic(value = "0", delval = "1") + private Integer delFlag; + + /** + * 数据中心id + */ + @ApiModelProperty(value = "数据中心id") + private Long dataId; + + /** + * 标题 + */ + @ApiModelProperty(value = "标题") + @TableField("label") + private String label; + + /** + * 数量+单位 + */ + @ApiModelProperty(value = "数量+单位") + @TableField("unit") + private String unit; + + /** + * 图标 + */ + @ApiModelProperty(value = "图标") + @TableField("icon") + private String icon; + +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/screen/EduSchoolDashboardDataTeacher.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/screen/EduSchoolDashboardDataTeacher.java new file mode 100644 index 0000000..f3a8f81 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/screen/EduSchoolDashboardDataTeacher.java @@ -0,0 +1,91 @@ +package com.yida.data.common.core.entity.screen; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * 校园大数据仪表盘数据中心-师资力量Entity + * + * @author ZYJ + * @date 2023-04-19 16:58:48 + */ +@Data +@TableName("edu_school_dashboard_data_teacher") +public class EduSchoolDashboardDataTeacher implements Serializable { + + private static final long serialVersionUID = -8358393920496356887L; + + /** + * 主键 + */ + @ApiModelProperty(value = "主键") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 创建人id + */ + @ApiModelProperty(value = "创建人id") + @TableField(value = "create_id", fill = FieldFill.INSERT) + private Long createId; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间") + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + /** + * 最后修改人id + */ + @ApiModelProperty(value = "最后修改人id") + @TableField(value = "update_id", fill = FieldFill.UPDATE) + private Long updateId; + + /** + * 最后修改时间 + */ + @ApiModelProperty(value = "最后修改时间") + @TableField(value = "update_date", fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateDate; + + /** + * 删除标识. 0: 未删除, 1: 已删除 + */ + @ApiModelProperty(value = "删除标识. 0: 未删除, 1: 已删除") + @TableField("del_flag") + @TableLogic(value = "0", delval = "1") + private Integer delFlag; + + /** + * 数据中心id + */ + @ApiModelProperty(value = "数据中心id") + private Long dataId; + + /** + * 标题 + */ + @ApiModelProperty(value = "标题") + @TableField("title") + private String title; + + /** + * 数量 + */ + @ApiModelProperty(value = "数量") + @TableField("num") + private Integer num; + +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/ConstructionPayNotifyDTO.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/ConstructionPayNotifyDTO.java new file mode 100644 index 0000000..a612f15 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/ConstructionPayNotifyDTO.java @@ -0,0 +1,86 @@ +package com.yida.data.common.core.entity.smart; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 建行支付通知结果回调接收类 + * + * @author ZYJ + * @date 2023/6/22 1:06 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ConstructionPayNotifyDTO implements Serializable { + + private static final long serialVersionUID = 2742657904325141306L; + + /** + * 商户柜台代码 + */ + private String POSID; + + /** + * 分行代码 + */ + private String BRANCHID; + + /** + * 订单号 + */ + private String ORDERID; + + /** + * 付款金额 + */ + private String PAYMENT; + + /** + * 币种 + */ + private String CURCODE; + + /** + * 备注1 + */ + private String REMARK1; + + /** + * 备注2 + */ + private String REMARK2; + + /** + * 账户类型 + */ + private String ACC_TYPE; + + /** + * 成功标志. 成功-Y,失败-N + */ + private String SUCCESS; + + /** + * 接口类型 + */ + private String TYPE; + + /** + * Referer 信息 + */ + private String REFERER; + + /** + * 客户端ip + */ + private String CLIENTIP; + + /** + * 签名 + */ + private String SIGN; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/EduGuideStepOrder.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/EduGuideStepOrder.java new file mode 100644 index 0000000..6304e18 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/EduGuideStepOrder.java @@ -0,0 +1,195 @@ +package com.yida.data.common.core.entity.smart; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.yida.data.common.core.enums.UnionPayTypeEnum; +import com.yida.data.common.core.enums.WxPayTypeEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 指南步骤订单表 Entity + * + * @author ZYJ + * @date 2023-06-20 16:48:14 + */ +@Data +@TableName("edu_guide_step_order") +public class EduGuideStepOrder { + + /** + * + */ + @ApiModelProperty(value = "") + @TableId(value = "order_id", type = IdType.AUTO) + private Long orderId; + + /** + * 订单编号:NOT NULL,不可重复,加索引,生成规则参照:snowflake算法原理生成 + */ + @ApiModelProperty(value = "订单编号:NOT NULL,不可重复,加索引,生成规则参照:snowflake算法原理生成") + @TableField("order_code") + private String orderCode; + + /** + * 流水号生成规则: + * 第一位:一位数前缀 + * 第2-10位:学校ID,缺少的以0在前补位 + * 第11-20位:商品编码code,缺少的以0在前补位, + * 第21-28位:购买日期(年月日), + * 第29-36位:8位随机数 + */ + @ApiModelProperty(value = "流水号生成规则: 第一位:Z 第2-10位:学校ID,缺少的以0在前补位 第11-20位:商品编码code,缺少的以0在前补位, 第21-28位:购买日期(年月日), 第29-36位:8位随机数") + @TableField("transaction_number") + private String transactionNumber; + + /** + * 指南id + */ + @ApiModelProperty(value = "指南id") + @TableField("guide_id") + private Long guideId; + + /** + * 指南步骤id + */ + @ApiModelProperty(value = "指南步骤id") + @TableField("step_id") + private Long stepId; + + /** + * 花名册id + */ + @ApiModelProperty(value = "花名册id") + @TableField("roster_id") + private Long rosterId; + + /** + * 关联关系id + */ + @ApiModelProperty(value = "关联关系id") + @TableField("relation_id") + private Long relationId; + + /** + * 订单总金额 + */ + @ApiModelProperty(value = "订单总金额") + @TableField("total_money") + private BigDecimal totalMoney; + /** + * 实际支付金额 + */ + @ApiModelProperty(value = "实际支付金额") + @TableField("practical_money") + private BigDecimal practicalMoney; + /** + * 支付人手机号(家长手机) + */ + @ApiModelProperty(value = "支付人手机号(家长手机)") + @TableField("phone") + private String phone; + + /** + * 支付时间 + */ + @ApiModelProperty(value = "支付时间") + @TableField("pay_date") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime payDate; + + /** + * 订单状态:0:待付款 + * 1:付款中 + * 2:交易完成(正常支付成功) + * 3:待退款 + * 4:交易关闭(a:超时未支付,b:退款成功 + */ + @ApiModelProperty(value = "订单状态:0:待付款 1:付款中 2:交易完成(正常支付成功) 3:待退款 4:交易关闭(a:超时未支付,b:退款成功") + @TableField("order_status") + private String orderStatus; + + /** + * 支付状态:0:未支付(默认) + * 1:已支付 + * 2:已退款 + * 3:已取消 + */ + @ApiModelProperty(value = "支付状态:0:未支付(默认) 1:已支付 2:已退款 3:已取消") + @TableField("pay_status") + private String payStatus; + + /** + * 支付方式:1:微信,2:支付宝,3:银联,4:收钱吧,5:建行 + */ + @ApiModelProperty(value = "支付方式:1:微信,2:支付宝,3:银联,4:收钱吧,5:建行") + @TableField("pay_way") + private String payWay; + + /** + * 具体的支持类型, 需要参考对应支付类型的枚举类 + *

+ * 银联云闪付: UnionPayTypeEnum + * 微信类型: WxPayTypeEnum + */ + /** + * 具体支付类型 + * 银联云闪付: {@link UnionPayTypeEnum} + * 微信类型: {@link WxPayTypeEnum} + */ + @ApiModelProperty("具体支付类型") + private Integer payType; + + /** + * 学校id + */ + @ApiModelProperty(value = "学校id") + @TableField("dept_id") + private Long deptId; + + /** + * 是否删除:0-未删除, 1-删除 默认0 + */ + @ApiModelProperty(value = "是否删除:0-未删除, 1-删除 默认0") + @TableField("del_flag") + @TableLogic(value = "0", delval = "1") + private Integer delFlag; + + /** + * 创建时间(下单时间) + */ + @ApiModelProperty(value = "创建时间(下单时间)") + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + /** + * 创建人id + */ + @ApiModelProperty(value = "创建人id") + @TableField(value = "create_id", fill = FieldFill.INSERT) + private Long createId; + + /** + * 修改时间 + */ + @ApiModelProperty(value = "修改时间") + @TableField(value = "update_date", fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateDate; + + /** + * 修改人id + */ + @ApiModelProperty(value = "修改人id") + @TableField(value = "update_id", fill = FieldFill.UPDATE) + private Long updateId; + +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/EduSmartWelcomeCampus.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/EduSmartWelcomeCampus.java new file mode 100644 index 0000000..f27c6d9 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/EduSmartWelcomeCampus.java @@ -0,0 +1,84 @@ +package com.yida.data.common.core.entity.smart; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +@Data +@TableName("edu_smart_welcome_campus") +public class EduSmartWelcomeCampus implements Serializable { + + + private static final long serialVersionUID = -9112087834472560029L; + /** + * 主键id + */ + @ApiModelProperty(value = "主键id") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 是否删除,1删除0未删除,默认0 + */ + @ApiModelProperty(value = "是否删除,1删除0未删除,默认0") + @TableField("del_flag") + @TableLogic(value = "0", delval = "1") + private Integer delFlag; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间") + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + /** + * 创建人id + */ + @ApiModelProperty(value = "创建人id") + @TableField(value = "create_id", fill = FieldFill.INSERT) + private Long createId; + + /** + * 最后修改时间 + */ + @ApiModelProperty(value = "最后修改时间") + @TableField(value = "update_date", fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateDate; + + /** + * 最后修改人id + */ + @ApiModelProperty(value = "最后修改人id") + @TableField(value = "update_id", fill = FieldFill.UPDATE) + private Long updateId; + + /** + * 部门id + */ + @ApiModelProperty(value = "部门id") + @TableField("dept_id") + private Long deptId; + + + /** + * 学区名称 + */ + @ApiModelProperty(value = "学区名称") + @TableField("campus_name") + private String campusName; +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/EduSmartWelcomeDepartment.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/EduSmartWelcomeDepartment.java new file mode 100644 index 0000000..8d8cfcb --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/EduSmartWelcomeDepartment.java @@ -0,0 +1,105 @@ +package com.yida.data.common.core.entity.smart; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * 智慧迎新-关联系部 + * + * @author ZYJ + * @date 2023-05-15 15:33:18 + */ +@Data +@TableName("edu_smart_welcome_department") +public class EduSmartWelcomeDepartment implements Serializable { + + + private static final long serialVersionUID = -4187107044078844446L; + /** + * 主键id + */ + @ApiModelProperty(value = "主键id") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 父级ID + */ + @ApiModelProperty(value = "父级ID") + @TableField("parent_id") + private Integer parentId; + + /** + * 是否删除,1删除0未删除,默认0 + */ + @ApiModelProperty(value = "是否删除,1删除0未删除,默认0") + @TableField("del_flag") + @TableLogic(value = "0", delval = "1") + private Integer delFlag; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间") + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + /** + * 创建人id + */ + @ApiModelProperty(value = "创建人id") + @TableField(value = "create_id", fill = FieldFill.INSERT) + private Long createId; + + /** + * 最后修改时间 + */ + @ApiModelProperty(value = "最后修改时间") + @TableField(value = "update_date", fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateDate; + + /** + * 最后修改人id + */ + @ApiModelProperty(value = "最后修改人id") + @TableField(value = "update_id", fill = FieldFill.UPDATE) + private Long updateId; + + /** + * 部门id + */ + @ApiModelProperty(value = "部门id") + @TableField("dept_id") + private Long deptId; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称") + @TableField("name") + private String name; + + /** + * 0=系部,1=专业 + */ + @ApiModelProperty(value = "0=系部,1=专业") + @TableField("type") + private Integer type; + + private transient List childrenList; +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/EduSmartWelcomeGuide.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/EduSmartWelcomeGuide.java new file mode 100644 index 0000000..bf46a58 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/EduSmartWelcomeGuide.java @@ -0,0 +1,147 @@ +package com.yida.data.common.core.entity.smart; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +import lombok.Data; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; + +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; +import java.time.LocalDate; +import java.time.LocalTime; + +/** + * 智慧迎新指南表Entity + * + * @author ZYJ + * @date 2023-05-15 15:33:18 + */ +@Data +@TableName("edu_smart_welcome_guide") +public class EduSmartWelcomeGuide implements Serializable { + + private static final long serialVersionUID = -2989601716189955125L; + + /** + * 主键id + */ + @ApiModelProperty(value = "主键id") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 是否删除,1删除0未删除,默认0 + */ + @ApiModelProperty(value = "是否删除,1删除0未删除,默认0") + @TableField("del_flag") + @TableLogic(value = "0", delval = "1") + private Integer delFlag; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间") + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + /** + * 创建人id + */ + @ApiModelProperty(value = "创建人id") + @TableField(value = "create_id", fill = FieldFill.INSERT) + private Long createId; + + /** + * 最后修改时间 + */ + @ApiModelProperty(value = "最后修改时间") + @TableField(value = "update_date", fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateDate; + + /** + * 最后修改人id + */ + @ApiModelProperty(value = "最后修改人id") + @TableField(value = "update_id", fill = FieldFill.UPDATE) + private Long updateId; + + /** + * 部门id + */ + @ApiModelProperty(value = "部门id") + @TableField("dept_id") + private Long deptId; + + + /** + * 学区id + */ + @ApiModelProperty(value = "学区id") + @TableField("campus_id") + private Long campusId; + + /** + * 指南标题 + */ + @ApiModelProperty(value = "指南标题") + @TableField("guide_title") + private String guideTitle; + + /** + * 指南前言 + */ + @ApiModelProperty(value = "指南前言") + @TableField("guide_foreword") + private String guideForeword; + + @ApiModelProperty(value = "资料上报字段,多个以英文逗号分隔") + @TableField("form_field") + private String formField; + + + @ApiModelProperty(value = "缴费金额") + @TableField("money") + private BigDecimal money; + + @ApiModelProperty(value = "是否启用二维码缴费. 0未启用,1启用") + @TableField("money_status") + private Integer moneyStatus; + + /** + * 启用状态(一个学校只能有一个启用的指南). 0:未启用,1:已启用 启用后无法删除和编辑 + */ + @ApiModelProperty(value = "启用状态(一个学校只能有一个启用的指南). 0:未启用,1:已启用") + @TableField("enable_status") + private Integer enableStatus; + + /** + * 最后一次启用时间 + */ + @ApiModelProperty(value = "最后一次启用时间") + @TableField("last_enable_date") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime lastEnableDate; + + @ApiModelProperty(value = "是否启用自动生成二维码状态. 0:未启用,1:已启用") + @TableField("qr_code_enable_status") + private Integer qrCodeEnableStatus; + + @ApiModelProperty(value = "没有二维码时的提示") + @TableField("qr_code_notice_message") + private String qrCodeNoticeMessage; +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/EduSmartWelcomeGuideClassRecord.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/EduSmartWelcomeGuideClassRecord.java new file mode 100644 index 0000000..0826b55 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/EduSmartWelcomeGuideClassRecord.java @@ -0,0 +1,155 @@ +package com.yida.data.common.core.entity.smart; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import java.io.Serializable; +import java.time.LocalDateTime; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * 智慧迎新班级记录Entity + */ +@Data +@TableName("edu_smart_welcome_guide_class_record") +public class EduSmartWelcomeGuideClassRecord implements Serializable { + + private static final long serialVersionUID = -5793682408605743520L; + /** + * 主键id + */ + @ApiModelProperty(value = "主键id") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 是否删除,1删除0未删除,默认0 + */ + @ApiModelProperty(value = "是否删除,1删除0未删除,默认0") + @TableField("del_flag") + @TableLogic(value = "0", delval = "1") + private Integer delFlag; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间") + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + /** + * 创建人id + */ + @ApiModelProperty(value = "创建人id") + @TableField(value = "create_id", fill = FieldFill.INSERT) + private Long createId; + + /** + * 最后修改时间 + */ + @ApiModelProperty(value = "最后修改时间") + @TableField(value = "update_date", fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateDate; + + /** + * 最后修改人id + */ + @ApiModelProperty(value = "最后修改人id") + @TableField(value = "update_id", fill = FieldFill.UPDATE) + private Long updateId; + + /** + * 部门id + */ + @ApiModelProperty(value = "部门id") + @TableField("dept_id") + private Long deptId; + + + /** + * 指南id + */ + @ApiModelProperty(value = "指南id") + @TableField("guide_id") + private Long guideId; + + + /** + * 迎新花名册人员Id + */ + @ApiModelProperty(value = "迎新花名册人员Id") + @TableField("roster_id") + private Long rosterId; + + /** + * 学校id + */ + @ApiModelProperty(value = "学校id") + @TableField("school_id") + private Long schoolId; + /** + * 学区id + */ + @ApiModelProperty(value = "学区id") + @TableField("campus_id") + private Long campusId; + + + /** + * 学区 + */ + @ApiModelProperty(value = "学区") + @TableField("campus_name") + private String campusName; + + /** + * 学段id + */ + @ApiModelProperty(value = "学段id") + @TableField("section_id") + private Long sectionId; + + + /** + * 年级id + */ + @ApiModelProperty(value = "年级id") + @TableField("grade_id") + private Long gradeId; + + + /** + * 年级 + */ + @ApiModelProperty(value = "年级") + @TableField("grade_name") + private String gradeName; + + + /** + * 班级id + */ + @ApiModelProperty(value = "班级id") + @TableField("class_id") + private Long classId; + + + /** + * 班级 + */ + @ApiModelProperty(value = "班级") + @TableField("class_name") + private String className; + + +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/EduSmartWelcomeGuideDormRecord.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/EduSmartWelcomeGuideDormRecord.java new file mode 100644 index 0000000..31da618 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/EduSmartWelcomeGuideDormRecord.java @@ -0,0 +1,128 @@ +package com.yida.data.common.core.entity.smart; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import java.io.Serializable; +import java.time.LocalDateTime; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * 智慧迎新宿舍分配实际记录Entity + */ +@Data +@TableName("edu_smart_welcome_guide_dorm_record") +public class EduSmartWelcomeGuideDormRecord implements Serializable { + + private static final long serialVersionUID = 6882830727621880838L; + /** + * 主键id + */ + @ApiModelProperty(value = "主键id") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 是否删除,1删除0未删除,默认0 + */ + @ApiModelProperty(value = "是否删除,1删除0未删除,默认0") + @TableField("del_flag") + @TableLogic(value = "0", delval = "1") + private Integer delFlag; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间") + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + /** + * 创建人id + */ + @ApiModelProperty(value = "创建人id") + @TableField(value = "create_id", fill = FieldFill.INSERT) + private Long createId; + + /** + * 最后修改时间 + */ + @ApiModelProperty(value = "最后修改时间") + @TableField(value = "update_date", fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateDate; + + /** + * 最后修改人id + */ + @ApiModelProperty(value = "最后修改人id") + @TableField(value = "update_id", fill = FieldFill.UPDATE) + private Long updateId; + + /** + * 部门id + */ + @ApiModelProperty(value = "部门id") + @TableField("dept_id") + private Long deptId; + + + /** + * 指南id + */ + @ApiModelProperty(value = "指南id") + @TableField("guide_id") + private Long guideId; + + + /** + * 迎新花名册人员Id + */ + @ApiModelProperty(value = "迎新花名册人员Id") + @TableField("roster_id") + private Long rosterId; + + /** + * 学校id + */ + @ApiModelProperty(value = "学校id") + @TableField("school_id") + private Long schoolId; + /** + * 宿舍ID + */ + @ApiModelProperty(value = "宿舍ID") + @TableField("dorm_id") + private Long dormId; + + /** + * 宿舍 + */ + @ApiModelProperty(value = "宿舍") + @TableField("dorm_name") + private Long dormName; + + /** + * 宿舍房间ID + */ + @ApiModelProperty(value = "宿舍房间ID") + @TableField("dorm_room_id") + private Long dormRoomId; + + /** + * 宿舍房间 + */ + @ApiModelProperty(value = "宿舍房间") + @TableField("dorm_room_name") + private String dormRoomName; + +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/EduSmartWelcomeGuideRoster.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/EduSmartWelcomeGuideRoster.java new file mode 100644 index 0000000..88ba71d --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/EduSmartWelcomeGuideRoster.java @@ -0,0 +1,291 @@ +package com.yida.data.common.core.entity.smart; + +import java.io.Serializable; +import java.util.Date; + +import com.yida.data.common.core.enums.RegistrationStatusEnum; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; +import java.time.LocalDate; +import java.time.LocalTime; + +/** + * 智慧迎新指南花名册表Entity + * + * @author ZYJ + * @date 2023-05-16 15:06:19 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@TableName("edu_smart_welcome_guide_roster") +public class EduSmartWelcomeGuideRoster implements Serializable { + + private static final long serialVersionUID = 1885471695813947514L; + + /** + * 主键id + */ + @ApiModelProperty(value = "主键id") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 是否删除,1删除0未删除,默认0 + */ + @ApiModelProperty(value = "是否删除,1删除0未删除,默认0") + @TableField("del_flag") + @TableLogic(value = "0", delval = "1") + private Integer delFlag; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间") + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + /** + * 创建人id + */ + @ApiModelProperty(value = "创建人id") + @TableField(value = "create_id", fill = FieldFill.INSERT) + private Long createId; + + /** + * 最后修改时间 + */ + @ApiModelProperty(value = "最后修改时间") + @TableField(value = "update_date", fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateDate; + + /** + * 最后修改人id + */ + @ApiModelProperty(value = "最后修改人id") + @TableField(value = "update_id", fill = FieldFill.UPDATE) + private Long updateId; + + /** + * 部门id + */ + @ApiModelProperty(value = "部门id") + @TableField("dept_id") + private Long deptId; + + /** + * 指南id + */ + @ApiModelProperty(value = "指南id") + @TableField("guide_id") + private Long guideId; + + /** + * 毕业院校 + */ + @ApiModelProperty(value = "毕业院校") + @TableField("graduate_school") + private String graduateSchool; + + /** + * 姓名 + */ + @ApiModelProperty(value = "姓名") + @TableField("full_name") + private String fullName; + + /** + * 身份证号码 + */ + @ApiModelProperty(value = "身份证号码") + @TableField("id_number") + private String idNumber; + + /** + * 性别:0男1女 + */ + @ApiModelProperty(value = "性别:0男1女") + @TableField("gender") + private Integer gender; + + + /** + * 人脸寸照URL地址 + */ + @ApiModelProperty(value = "人脸寸照URL地址") + @TableField("avatar") + private String avatar; + + /** + * 录取专业 + */ + @ApiModelProperty(value = "录取专业") + @TableField("admitted_major") + private String admittedMajor; + + /** + * 手机号码 + */ + @ApiModelProperty(value = "手机号码") + @TableField("mobile") + private String mobile; + + /** + * 二维码地址 + */ + @ApiModelProperty(value = "二维码地址") + @TableField("qr_code_url") + private String qrCodeUrl; + + @ApiModelProperty(value = "录取专业ID") + @TableField("admitted_major_id") + private Long admittedMajorId; + + @ApiModelProperty(value = "录取系部") + @TableField("admitted_department") + private String admittedDepartment; + + @ApiModelProperty(value = "录取系部ID") + @TableField("admitted_department_id") + private Long admittedDepartmentId; + + @ApiModelProperty(value = "身份证正面照片") + @TableField("id_card_right") + private String idCardRight; + + @ApiModelProperty(value = "身份证反面照片") + @TableField("id_card_reverse") + private String idCardReverse; + + @ApiModelProperty(value = "录取通知书照片") + @TableField("admission_letter") + private String admissionLetter; + + @ApiModelProperty(value = "没有二维码时的提示") + private transient String qrCodeNoticeMessage; + + @ApiModelProperty(value = "是否完成支付:1=是,0=否") + @TableField("pay_status") + private Integer payStatus; + + /** + * {@link RegistrationStatusEnum} + */ + @ApiModelProperty(value = "报到状态. 0-未报到,1-报到成功(全部步骤通过)") + @TableField("registration_status") + private Integer registrationStatus; + + + /** + * 学区id + */ + @ApiModelProperty(value = "学区id") + @TableField("campus_id") + private Long campusId; + + + /** + * 学区 + */ + @ApiModelProperty(value = "学区") + @TableField("campus_name") + private String campusName; + + /** + * 学段id + */ + @ApiModelProperty(value = "学段id") + @TableField("section_id") + private Long sectionId; + + + /** + * 学段 + */ + @ApiModelProperty(value = "学段") + @TableField("section_name") + private String sectionName; + + + /** + * 年级id + */ + @ApiModelProperty(value = "年级id") + @TableField("grade_id") + private Long gradeId; + + + /** + * 年级 + */ + @ApiModelProperty(value = "年级") + @TableField("grade_name") + private String gradeName; + + + /** + * 班级id + */ + @ApiModelProperty(value = "班级id") + @TableField("class_id") + private Long classId; + + + /** + * 班级 + */ + @ApiModelProperty(value = "班级") + @TableField("class_name") + private String className; + + /** + * 宿舍楼ID + */ + @ApiModelProperty(value = "宿舍楼ID") + @TableField("dormitory_id") + private Long dormitoryId; + + + /** + * 宿舍楼名称 + */ + @ApiModelProperty(value = "宿舍楼名称") + @TableField("dormitory") + private String dormitory; + + + /** + * 寝室号ID + */ + @ApiModelProperty(value = "寝室号ID") + @TableField("dormitory_room_id") + private Long dormitoryRoomId; + + + /** + * 寝室名称 + */ + @ApiModelProperty(value = "寝室名称") + @TableField("dormitory_room") + private String dormitoryRoom; + +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/EduSmartWelcomeGuideRosterRelation.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/EduSmartWelcomeGuideRosterRelation.java new file mode 100644 index 0000000..ce3c4e0 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/EduSmartWelcomeGuideRosterRelation.java @@ -0,0 +1,131 @@ +package com.yida.data.common.core.entity.smart; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; + +/** + * 智慧迎新指南花名册-微信用户绑定关系表Entity + * + * @author ZYJ + * @date 2023-05-17 13:53:18 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@TableName("edu_smart_welcome_guide_roster_relation") +public class EduSmartWelcomeGuideRosterRelation implements Serializable { + + private static final long serialVersionUID = 8690951904136481894L; + + /** + * 主键id + */ + @ApiModelProperty(value = "主键id") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 是否删除,1删除0未删除,默认0 + */ + @ApiModelProperty(value = "是否删除,1删除0未删除,默认0") + @TableField("del_flag") + @TableLogic(value = "0", delval = "1") + private Integer delFlag; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间") + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + /** + * 创建人id + */ + @ApiModelProperty(value = "创建人id") + @TableField(value = "create_id", fill = FieldFill.INSERT) + private Long createId; + + /** + * 最后修改时间 + */ + @ApiModelProperty(value = "最后修改时间") + @TableField(value = "update_date", fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateDate; + + /** + * 最后修改人id + */ + @ApiModelProperty(value = "最后修改人id") + @TableField(value = "update_id", fill = FieldFill.UPDATE) + private Long updateId; + + /** + * 部门id + */ + @ApiModelProperty(value = "部门id") + @TableField("dept_id") + private Long deptId; + + /** + * 学区id + */ + @ApiModelProperty(value = "学区id") + @TableField("campus_id") + private Long campusId; + + /** + * 指南id + */ + @ApiModelProperty(value = "指南id") + @TableField("guide_id") + private Long guideId; + + /** + * 花名册id + */ + @ApiModelProperty(value = "花名册id") + @TableField("roster_id") + private Long rosterId; + + /** + * 微信openId + */ + @ApiModelProperty(value = "微信openId") + @TableField("open_id") + private String openId; + + /** + * 登录用户id + */ + @ApiModelProperty(value = "登录用户id") + @TableField("user_id") + private Long userId; + + @ApiModelProperty(value = "头像") + private String avatar; + + @ApiModelProperty(value = "性别. 0-男,1-女") + private Integer sex; + + @ApiModelProperty("人员基础信息") + private transient EduSmartWelcomeGuideRoster guideRoster; + + @ApiModelProperty("人员步骤信息") + private transient List stepList; +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/EduSmartWelcomeGuideRosterRelationStep.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/EduSmartWelcomeGuideRosterRelationStep.java new file mode 100644 index 0000000..589839b --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/EduSmartWelcomeGuideRosterRelationStep.java @@ -0,0 +1,160 @@ +package com.yida.data.common.core.entity.smart; + +import java.io.Serializable; +import java.util.Date; + +import lombok.Data; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; + +import com.fasterxml.jackson.annotation.JsonFormat; +import org.apache.bcel.generic.LineNumberGen; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; +import java.time.LocalDate; +import java.time.LocalTime; + +/** + * 智慧迎新指南花名册-微信用户绑定关系-执行步骤表 Entity + * + * @author ZYJ + * @date 2023-05-19 14:37:43 + */ +@Data +@TableName("edu_smart_welcome_guide_roster_relation_step") +public class EduSmartWelcomeGuideRosterRelationStep implements Serializable { + + private static final long serialVersionUID = 107937172597095304L; + + /** + * 主键id + */ + @ApiModelProperty(value = "主键id") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 是否删除,1删除0未删除,默认0 + */ + @ApiModelProperty(value = "是否删除,1删除0未删除,默认0") + @TableField("del_flag") + @TableLogic(value = "0", delval = "1") + private Integer delFlag; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间") + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + /** + * 创建人id + */ + @ApiModelProperty(value = "创建人id") + @TableField(value = "create_id", fill = FieldFill.INSERT) + private Long createId; + + /** + * 最后修改时间 + */ + @ApiModelProperty(value = "最后修改时间") + @TableField(value = "update_date", fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateDate; + + /** + * 最后修改人id + */ + @ApiModelProperty(value = "最后修改人id") + @TableField(value = "update_id", fill = FieldFill.UPDATE) + private Long updateId; + + /** + * 部门id + */ + @ApiModelProperty(value = "部门id") + @TableField("dept_id") + private Long deptId; + + /** + * 指南id + */ + @ApiModelProperty(value = "指南id") + @TableField("guide_id") + private Long guideId; + + /** + * 花名册id + */ + @ApiModelProperty(value = "花名册id") + @TableField("roster_id") + private Long rosterId; + + /** + * 关系id + */ + @ApiModelProperty(value = "关系id") + @TableField("relation_id") + private Long relationId; + + /** + * 执行步骤id + */ + @ApiModelProperty(value = "执行步骤id") + @TableField("step_id") + private Long stepId; + + /** + * 执行状态.0: 通过, 1: 未执行, 2: 未通过 + */ + @ApiModelProperty(value = "执行状态.0: 通过, 1: 未执行, 2: 未通过") + @TableField("status") + private Integer status; + + /** + * 审核评语 + */ + @ApiModelProperty(value = "审核评语") + @TableField("comment_content") + private String commentContent; + + /** + * 操作时间 + */ + @ApiModelProperty(value = "操作时间") + @TableField("operate_time") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime operateTime; + + /** + * 审核人员id + */ + @ApiModelProperty(value = "审核人员id") + @TableField("staff_id") + private Long staffId; + + /** + * 上传附件地址:多个以英文逗号分隔 + */ + @ApiModelProperty(value = "上传附件地址:多个以英文逗号分隔") + @TableField("upload_file_url") + private String uploadFileUrl; + + /** + * 上缴费状态:0=未缴,1=已交 + */ + @ApiModelProperty(value = "缴费状态:0=未缴,1=已交") + @TableField("pay_status") + private String payStatus; +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/EduSmartWelcomeGuideStep.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/EduSmartWelcomeGuideStep.java new file mode 100644 index 0000000..072caa2 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/EduSmartWelcomeGuideStep.java @@ -0,0 +1,180 @@ +package com.yida.data.common.core.entity.smart; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import java.math.BigDecimal; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; + +/** + * 智慧迎新指南步骤表Entity + * + * @author ZYJ + * @date 2023-05-15 15:33:18 + */ +@Data +@TableName("edu_smart_welcome_guide_step") +public class EduSmartWelcomeGuideStep implements Serializable { + + private static final long serialVersionUID = 8292306932801252867L; + + /** + * 主键id + */ + @ApiModelProperty(value = "主键id") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 是否删除,1删除0未删除,默认0 + */ + @ApiModelProperty(value = "是否删除,1删除0未删除,默认0") + @TableField("del_flag") + @TableLogic(value = "0", delval = "1") + private Integer delFlag; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间") + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + /** + * 创建人id + */ + @ApiModelProperty(value = "创建人id") + @TableField(value = "create_id", fill = FieldFill.INSERT) + private Long createId; + + /** + * 最后修改时间 + */ + @ApiModelProperty(value = "最后修改时间") + @TableField(value = "update_date", fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateDate; + + /** + * 最后修改人id + */ + @ApiModelProperty(value = "最后修改人id") + @TableField(value = "update_id", fill = FieldFill.UPDATE) + private Long updateId; + + /** + * 部门id + */ + @ApiModelProperty(value = "部门id") + @TableField("dept_id") + private Long deptId; + + /** + * 指南id + */ + @ApiModelProperty(value = "指南id") + @TableField("guide_id") + private Long guideId; + + /** + * 步骤类型 + */ + @ApiModelProperty(value = "步骤类型") + @TableField("step_type") + private Integer stepType; + + /** + * 步骤名称 + */ + @ApiModelProperty(value = "步骤名称") + @TableField("step_name") + private String stepName; + + + @ApiModelProperty(value = "缴费金额") + @TableField("money") + private BigDecimal money; + + /** + * 唯一id + */ + @ApiModelProperty(value = "唯一id") + @TableField("unique_id") + private String uniqueId; + + /** + * 前提步骤id + */ + @ApiModelProperty(value = "前提步骤id") + @TableField("premise_step_id") + private Long premiseStepId; + + /** + * 前提步骤唯一id + */ + @ApiModelProperty(value = "前提步骤唯一id") + @TableField("premise_step_unique_id") + private String premiseStepUniqueId; + + /** + * 步骤说明 + */ + @ApiModelProperty(value = "步骤说明") + @TableField("step_description") + private String stepDescription; + + @ApiModelProperty(value = "审核是否需要评语,0否,1是") + @TableField("is_comment") + private Integer isComment; + + + @ApiModelProperty("步骤审核人员职工id列表信息") + private transient List staffIdList; + + @ApiModelProperty("导入预选班级数据") + private transient List classList; + + @ApiModelProperty("导入固定班级数据") + private transient List classFixList; + + @ApiModelProperty("导入预选宿舍数据") + private transient List dormList; + + @ApiModelProperty("导入预选宿舍数据") + private transient List dormFixList; + + @ApiModelProperty("步骤审核人员职工姓名字符串") + private transient String staffNameStr; + + @ApiModelProperty(value = "执行状态. -1:未执行, 0:通过") + private transient Integer status; + + + @ApiModelProperty(value = "操作时间. 执行状态为通过时存在") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private transient LocalDateTime operateTime; + + @ApiModelProperty("审核人员名称. 执行状态为通过时存在") + private transient String staffName; + + @ApiModelProperty("按钮状态. 0-代表显示通过按钮,1-代表不显示通过按钮") + private transient Integer buttonStatus; + + @ApiModelProperty("上传附件地址") + private transient String uploadFileUrl; + + @ApiModelProperty("评语内容") + private transient String commentContent; + + @ApiModelProperty("花名册人员信息") + private transient EduSmartWelcomeGuideRoster roster; +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/EduSmartWelcomeGuideStepClass.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/EduSmartWelcomeGuideStepClass.java new file mode 100644 index 0000000..d144b68 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/EduSmartWelcomeGuideStepClass.java @@ -0,0 +1,207 @@ +package com.yida.data.common.core.entity.smart; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * 智慧迎新班级预分表Entity + */ +@Data +@TableName("edu_smart_welcome_guide_step_class") +public class EduSmartWelcomeGuideStepClass implements Serializable { + + + private static final long serialVersionUID = 2227499769143173816L; + /** + * 主键id + */ + @ApiModelProperty(value = "主键id") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 是否删除,1删除0未删除,默认0 + */ + @ApiModelProperty(value = "是否删除,1删除0未删除,默认0") + @TableField("del_flag") + @TableLogic(value = "0", delval = "1") + private Integer delFlag; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间") + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + /** + * 创建人id + */ + @ApiModelProperty(value = "创建人id") + @TableField(value = "create_id", fill = FieldFill.INSERT) + private Long createId; + + /** + * 最后修改时间 + */ + @ApiModelProperty(value = "最后修改时间") + @TableField(value = "update_date", fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateDate; + + /** + * 最后修改人id + */ + @ApiModelProperty(value = "最后修改人id") + @TableField(value = "update_id", fill = FieldFill.UPDATE) + private Long updateId; + + /** + * 部门id + */ + @ApiModelProperty(value = "部门id") + @TableField("dept_id") + private Long deptId; + + + /** + * 指南id + */ + @ApiModelProperty(value = "指南id") + @TableField("guide_id") + private Long guideId; + + + /** + * 步骤id + */ + @ApiModelProperty(value = "步骤id") + @TableField("step_id") + private Long stepId; + + /** + * 学校id + */ + @ApiModelProperty(value = "学校id") + @TableField("school_id") + private Long schoolId; + /** + * 学区id + */ + @ApiModelProperty(value = "学区id") + @TableField("campus_id") + private Long campusId; + + /** + * 学段id + */ + @ApiModelProperty(value = "学段id") + @TableField("section_id") + private Long sectionId; + + + /** + * 年级id + */ + @ApiModelProperty(value = "年级id") + @TableField("grade_id") + private Long gradeId; + + + /** + * 班级id + */ + @ApiModelProperty(value = "班级id") + @TableField("class_id") + private Long classId; + + + /** + * 计划班级人数 + */ + @ApiModelProperty(value = "计划班级人数") + @TableField("number") + private Integer number; + + /** + * 男性人数 + */ + @ApiModelProperty(value = "男性人数") + @TableField("male_number") + private Integer maleNumber; + + /** + * 实际男生人数 + */ + @ApiModelProperty(value = "实际男生人数") + @TableField("real_male_number") + private Integer realMaleNumber; + + /** + * 男性占比 + */ + @ApiModelProperty(value = "男性占比") + @TableField("male") + private Integer male; + + /** + * 女性人数 + */ + @ApiModelProperty(value = "女性人数") + @TableField("female_number") + private Integer femaleNumber; + /** + * 实际女生人数 + */ + @ApiModelProperty(value = "实际女生人数") + @TableField("real_female_number") + private Integer realFemaleNumber; + + /** + * 女性占比 + */ + @ApiModelProperty(value = "女性占比") + @TableField("female") + private Integer female; + + /** + * 系部ID + */ + @ApiModelProperty(value = "系部ID") + @TableField("department_id") + private Long departmentId; + + /** + * 系部名称 + */ + @ApiModelProperty(value = "系部名称") + @TableField("department_name") + private String departmentName; + /** + * 专业ID + */ + @ApiModelProperty(value = "专业ID") + @TableField("major_id") + private Long majorId; + + /** + * 专业名称 + */ + @ApiModelProperty(value = "专业名称") + @TableField("major_name") + private String majorName; +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/EduSmartWelcomeGuideStepClassFix.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/EduSmartWelcomeGuideStepClassFix.java new file mode 100644 index 0000000..a63a931 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/EduSmartWelcomeGuideStepClassFix.java @@ -0,0 +1,176 @@ +package com.yida.data.common.core.entity.smart; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import java.io.Serializable; +import java.time.LocalDateTime; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * 智慧迎新固定班级人员Entity + */ +@Data +@TableName("edu_smart_welcome_guide_step_class_fix") +public class EduSmartWelcomeGuideStepClassFix implements Serializable { + + private static final long serialVersionUID = 5992449372638558018L; + /** + * 主键id + */ + @ApiModelProperty(value = "主键id") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 是否删除,1删除0未删除,默认0 + */ + @ApiModelProperty(value = "是否删除,1删除0未删除,默认0") + @TableField("del_flag") + @TableLogic(value = "0", delval = "1") + private Integer delFlag; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间") + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + /** + * 创建人id + */ + @ApiModelProperty(value = "创建人id") + @TableField(value = "create_id", fill = FieldFill.INSERT) + private Long createId; + + /** + * 最后修改时间 + */ + @ApiModelProperty(value = "最后修改时间") + @TableField(value = "update_date", fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateDate; + + /** + * 最后修改人id + */ + @ApiModelProperty(value = "最后修改人id") + @TableField(value = "update_id", fill = FieldFill.UPDATE) + private Long updateId; + + /** + * 部门id + */ + @ApiModelProperty(value = "部门id") + @TableField("dept_id") + private Long deptId; + + + /** + * 指南id + */ + @ApiModelProperty(value = "指南id") + @TableField("guide_id") + private Long guideId; + + + /** + * 步骤id + */ + @ApiModelProperty(value = "步骤id") + @TableField("step_id") + private Long stepId; + + /** + * 学校id + */ + @ApiModelProperty(value = "学校id") + @TableField("school_id") + private Long schoolId; + /** + * 学区id + */ + @ApiModelProperty(value = "学区id") + @TableField("campus_id") + private Long campusId; + + /** + * 学区id + */ + @ApiModelProperty(value = "学区id") + @TableField("campus_name") + private String campusName; + + /** + * 学段id + */ + @ApiModelProperty(value = "学段id") + @TableField("section_id") + private Long sectionId; + + /** + * 学段id + */ + @ApiModelProperty(value = "学段id") + @TableField("section_name") + private String sectionName; + + /** + * 年级id + */ + @ApiModelProperty(value = "年级id") + @TableField("grade_id") + private Long gradeId; + + /** + * 年级id + */ + @ApiModelProperty(value = "年级id") + @TableField("grade_name") + private String gradeName; + + + /** + * 班级id + */ + @ApiModelProperty(value = "班级id") + @TableField("class_id") + private Long classId; + + /** + * 班级id + */ + @ApiModelProperty(value = "班级id") + @TableField("class_name") + private String className; + + + /** + * 迎新花名册人员ID + */ + @ApiModelProperty(value = "迎新花名册人员ID") + @TableField("roster_id") + private Long rosterId; + + /** + * 迎新花名册人员ID + */ + @ApiModelProperty(value = "迎新花名册人员姓名") + @TableField("roster_name") + private String rosterName; + + @ApiModelProperty(value = "迎新花名册人员身份证号") + @TableField("id_number") + private String idNumber; + +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/EduSmartWelcomeGuideStepDorm.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/EduSmartWelcomeGuideStepDorm.java new file mode 100644 index 0000000..e7f3012 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/EduSmartWelcomeGuideStepDorm.java @@ -0,0 +1,178 @@ +package com.yida.data.common.core.entity.smart; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import java.io.Serializable; +import java.time.LocalDateTime; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * 智慧迎新宿舍预分表Entity + */ +@Data +@TableName("edu_smart_welcome_guide_step_dorm") +public class EduSmartWelcomeGuideStepDorm implements Serializable { + + private static final long serialVersionUID = 2811817125778676867L; + /** + * 主键id + */ + @ApiModelProperty(value = "主键id") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 是否删除,1删除0未删除,默认0 + */ + @ApiModelProperty(value = "是否删除,1删除0未删除,默认0") + @TableField("del_flag") + @TableLogic(value = "0", delval = "1") + private Integer delFlag; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间") + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + /** + * 创建人id + */ + @ApiModelProperty(value = "创建人id") + @TableField(value = "create_id", fill = FieldFill.INSERT) + private Long createId; + + /** + * 最后修改时间 + */ + @ApiModelProperty(value = "最后修改时间") + @TableField(value = "update_date", fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateDate; + + /** + * 最后修改人id + */ + @ApiModelProperty(value = "最后修改人id") + @TableField(value = "update_id", fill = FieldFill.UPDATE) + private Long updateId; + + /** + * 部门id + */ + @ApiModelProperty(value = "部门id") + @TableField("dept_id") + private Long deptId; + + + /** + * 指南id + */ + @ApiModelProperty(value = "指南id") + @TableField("guide_id") + private Long guideId; + + /** + * 步骤id + */ + @ApiModelProperty(value = "步骤id") + @TableField("step_id") + private Long stepId; + + /** + * 学校id + */ + @ApiModelProperty(value = "学校id") + @TableField("school_id") + private Long schoolId; + /** + * 宿舍id + */ + @ApiModelProperty(value = "宿舍id") + @TableField("dorm_id") + private Long dormId; + + + /** + * 宿舍id + */ + @ApiModelProperty(value = "宿舍") + @TableField("dorm_name") + private String dormName; + + + /** + * 宿舍房间id + */ + @ApiModelProperty(value = "宿舍房间id") + @TableField("dorm_room_id") + private Long dormRoomId; + + + /** + * 宿舍房间id + */ + @ApiModelProperty(value = "宿舍房间") + @TableField("dorm_room_name") + private String dormRoomName; + + + /** + * 宿舍类型:0=女性宿舍,1=男生宿舍 + */ + @ApiModelProperty(value = "宿舍类型:0=男性宿舍,1=女生宿舍") + @TableField("gender") + private Integer gender; + + @ApiModelProperty(value = "宿舍人数") + @TableField("number") + private Integer number; + + @ApiModelProperty(value = "实际人数") + @TableField("real_number") + private Integer realNumber; + + /** + * 校区ID + */ + @ApiModelProperty(value = "校区ID") + @TableField("campus_id") + private Long campusId; + /** + * 系部ID + */ + @ApiModelProperty(value = "系部ID") + @TableField("department_id") + private Long departmentId; + + /** + * 系部ID + */ + @ApiModelProperty(value = "系部") + @TableField("department_name") + private String departmentName; + /** + * 专业ID + */ + @ApiModelProperty(value = "专业ID") + @TableField("major_id") + private Long majorId; + + /** + * 专业ID + */ + @ApiModelProperty(value = "专业") + @TableField("major_name") + private String majorName; +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/EduSmartWelcomeGuideStepDormFix.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/EduSmartWelcomeGuideStepDormFix.java new file mode 100644 index 0000000..090dad2 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/EduSmartWelcomeGuideStepDormFix.java @@ -0,0 +1,150 @@ +package com.yida.data.common.core.entity.smart; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import java.io.Serializable; +import java.time.LocalDateTime; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * 智慧迎新固定班级人员Entity + */ +@Data +@TableName("edu_smart_welcome_guide_step_dorm_fix") +public class EduSmartWelcomeGuideStepDormFix implements Serializable { + + /** + * 主键id + */ + @ApiModelProperty(value = "主键id") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 是否删除,1删除0未删除,默认0 + */ + @ApiModelProperty(value = "是否删除,1删除0未删除,默认0") + @TableField("del_flag") + @TableLogic(value = "0", delval = "1") + private Integer delFlag; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间") + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + /** + * 创建人id + */ + @ApiModelProperty(value = "创建人id") + @TableField(value = "create_id", fill = FieldFill.INSERT) + private Long createId; + + /** + * 最后修改时间 + */ + @ApiModelProperty(value = "最后修改时间") + @TableField(value = "update_date", fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateDate; + + /** + * 最后修改人id + */ + @ApiModelProperty(value = "最后修改人id") + @TableField(value = "update_id", fill = FieldFill.UPDATE) + private Long updateId; + + /** + * 部门id + */ + @ApiModelProperty(value = "部门id") + @TableField("dept_id") + private Long deptId; + + /** + * 指南id + */ + @ApiModelProperty(value = "指南id") + @TableField("guide_id") + private Long guideId; + + /** + * 步骤id + */ + @ApiModelProperty(value = "步骤id") + @TableField("step_id") + private Long stepId; + + /** + * 学校id + */ + @ApiModelProperty(value = "学校id") + @TableField("school_id") + private Long schoolId; + + /** + * 宿舍 + */ + @ApiModelProperty(value = "宿舍") + @TableField("dorm_id") + private Long dormId; + + + /** + * 宿舍 + */ + @ApiModelProperty(value = "宿舍") + @TableField("dorm_name") + private String dormName; + + + /** + * 寝室号id + */ + @ApiModelProperty(value = "寝室号id") + @TableField("dorm_room_id") + private Long dormRoomId; + + /** + * 寝室号id + */ + @ApiModelProperty(value = "寝室号id") + @TableField("dorm_room_name") + private String dormRoomName; + + /** + * 迎新花名册人员ID + */ + @ApiModelProperty(value = "迎新花名册人员ID") + @TableField("roster_id") + private Long rosterId; + + /** + * 迎新花名册人员ID + */ + @ApiModelProperty(value = "迎新花名册人员姓名") + @TableField("roster_name") + private String rosterName; + + /** + * 迎新花名册人员ID + */ + @ApiModelProperty(value = "身份证") + @TableField("id_number") + private String idNumber; + + +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/EduSmartWelcomeGuideStepStaff.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/EduSmartWelcomeGuideStepStaff.java new file mode 100644 index 0000000..c4f78e7 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/smart/EduSmartWelcomeGuideStepStaff.java @@ -0,0 +1,108 @@ +package com.yida.data.common.core.entity.smart; + +import java.io.Serializable; +import java.util.Date; + +import lombok.Data; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; + +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; +import java.time.LocalDate; +import java.time.LocalTime; + +/** + * 智慧迎新指南步骤-审核人员表Entity + * + * @author ZYJ + * @date 2023-05-15 15:33:18 + */ +@Data +@TableName("edu_smart_welcome_guide_step_staff") +public class EduSmartWelcomeGuideStepStaff implements Serializable { + + private static final long serialVersionUID = 4677189987292839132L; + + /** + * 主键id + */ + @ApiModelProperty(value = "主键id") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 是否删除,1删除0未删除,默认0 + */ + @ApiModelProperty(value = "是否删除,1删除0未删除,默认0") + @TableField("del_flag") + @TableLogic(value = "0", delval = "1") + private Integer delFlag; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间") + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + /** + * 创建人id + */ + @ApiModelProperty(value = "创建人id") + @TableField(value = "create_id", fill = FieldFill.INSERT) + private Long createId; + + /** + * 最后修改时间 + */ + @ApiModelProperty(value = "最后修改时间") + @TableField(value = "update_date", fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateDate; + + /** + * 最后修改人id + */ + @ApiModelProperty(value = "最后修改人id") + @TableField(value = "update_id", fill = FieldFill.UPDATE) + private Long updateId; + + /** + * 部门id + */ + @ApiModelProperty(value = "部门id") + @TableField("dept_id") + private Long deptId; + + /** + * 指南id + */ + @ApiModelProperty(value = "指南id") + @TableField("guide_id") + private Long guideId; + + /** + * 步骤id + */ + @ApiModelProperty(value = "步骤id") + @TableField("step_id") + private Long stepId; + + /** + * 职工id + */ + @ApiModelProperty(value = "职工id") + @TableField("staff_id") + private Long staffId; +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/BaiduApiConfig.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/BaiduApiConfig.java new file mode 100644 index 0000000..5c02235 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/BaiduApiConfig.java @@ -0,0 +1,73 @@ +package com.yida.data.common.core.entity.system; + +import lombok.Data; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; + +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.time.LocalDate; +import java.time.LocalTime; + +/** + * 百度api配置信息 Entity + * + * @author ZYJ + * @date 2023-06-20 20:42:47 + */ +@Data +@TableName("baidu_api_config") +public class BaiduApiConfig implements Serializable { + + private static final long serialVersionUID = -6393970562092146041L; + + /** + * 主键id + */ + @ApiModelProperty(value = "主键id") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 学校id + */ + @ApiModelProperty(value = "学校id") + @TableField("school_id") + private Long schoolId; + + /** + * 模块名称 + */ + @ApiModelProperty(value = "模块名称") + @TableField("module_name") + private String moduleName; + + /** + * 应用appId + */ + @ApiModelProperty(value = "应用appId") + @TableField("app_id") + private String appId; + + /** + * 应用API Key + */ + @ApiModelProperty(value = "应用API Key") + @TableField("api_key") + private String apiKey; + + /** + * 应用Secret Key + */ + @ApiModelProperty(value = "应用Secret Key") + @TableField("secret_key") + private String secretKey; +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/ConstructionPayConfig.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/ConstructionPayConfig.java new file mode 100644 index 0000000..cf72485 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/ConstructionPayConfig.java @@ -0,0 +1,75 @@ +package com.yida.data.common.core.entity.system; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 建行学校信息配置 Entity + * + * @author ZYJ + * @date 2023-06-19 16:30:18 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@TableName("construction_pay_config") +public class ConstructionPayConfig implements Serializable { + + private static final long serialVersionUID = 8107846780600318858L; + + /** + * 主键id + */ + @ApiModelProperty(value = "主键id") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 对应部门id + */ + @ApiModelProperty(value = "对应部门id") + @TableField("dept_id") + private Long deptId; + + /** + * 商户代码 + */ + @ApiModelProperty(value = "商户代码") + @TableField("merchant_id") + private String merchantId; + + /** + * 商户柜台代码 + */ + @ApiModelProperty(value = "商户柜台代码") + @TableField("pos_id") + private String posId; + + /** + * 分行代码 + */ + @ApiModelProperty(value = "分行代码") + @TableField("branch_id") + private String branchId; + + /** + * 商户公钥串 + */ + @ApiModelProperty(value = "商户公钥串") + @TableField("public_key") + private String publicKey; + + @ApiModelProperty(value = "密码") + @TableField("private_code") + private String privateCode; +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/Dept.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/Dept.java index df601ba..db9a6ad 100644 --- a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/Dept.java +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/Dept.java @@ -54,8 +54,7 @@ public class Dept implements Serializable { @ApiModelProperty("部门简称") private String deptAbbreviation; /** - * 部门类型,0表示学校,5公司,6部门, 7教育局, 8代理商 - * {@link DeptTypeEnum} + * 部门类型,0表示学校,5公司,6部门, 7教育局, 8代理商 {@link DeptTypeEnum} */ @ApiModelProperty("部门类型,0表示学校,5公司,6部门, 7教育局, 8代理商") private Integer deptType; @@ -71,6 +70,11 @@ public class Dept implements Serializable { private String wxAesKey; @ApiModelProperty("学校关联类型类型,0-企业微信,1-易达app,2-大华平台 多类型使用','连接") private String schoolType; + + @ApiModelProperty("学校性质:0小学,1中学,2九年一贯,3十二年一贯,4:高校") + @TableField(value = "school_nature") + private Integer schoolNature; + private Long wxId; private Long parentWxId; /** diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/EduApp.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/EduApp.java index 716b393..4519a69 100644 --- a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/EduApp.java +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/EduApp.java @@ -45,4 +45,12 @@ public class EduApp { @ApiModelProperty("应用地址") private String appSrc; + @ApiModelProperty("应用类型。0-自建应用, 1-服务商代开发应用") + private Integer appType; + + @ApiModelProperty("应用模板id") + private String templateId; + + @ApiModelProperty("服务商企业微信corpId") + private String serviceCorpId; } diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/EduAppTemplate.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/EduAppTemplate.java new file mode 100644 index 0000000..78c791c --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/EduAppTemplate.java @@ -0,0 +1,38 @@ +package com.yida.data.common.core.entity.system; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * 企业微信服务商代开发应用模板表 + * + * @author ZYJ + * @date 2022/11/3 + */ +@Data +public class EduAppTemplate implements Serializable { + + private static final long serialVersionUID = 5143956082215782989L; + + @TableId(type = IdType.AUTO) + private Long id; + + @ApiModelProperty("应用模板名称") + private String templateName; + + @ApiModelProperty("应用模板id") + private String templateId; + + @ApiModelProperty("应用模板secret") + private String templateSecret; + + @ApiModelProperty("应用模板code") + private String templateCode; + + @ApiModelProperty("服务商企业微信corpId") + private String serviceCorpId; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/EduBaseApp.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/EduBaseApp.java new file mode 100644 index 0000000..fe9242a --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/EduBaseApp.java @@ -0,0 +1,63 @@ +package com.yida.data.common.core.entity.system; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.yida.data.common.core.enums.UserTypeEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 基础应用信息(本地配置) Entity + * + * @author ZYJ + * @date 2023-06-28 14:57:58 + */ +@Data +@TableName("edu_base_app") +public class EduBaseApp { + + /** + * 主键 + */ + @ApiModelProperty(value = "主键") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 应用名称 + */ + @ApiModelProperty(value = "应用名称") + @TableField("name") + private String name; + + /** + * 应用代码 + */ + @ApiModelProperty(value = "应用代码") + @TableField("code") + private String code; + + /** + * 应用logo + */ + @ApiModelProperty(value = "应用logo") + @TableField("logo") + private String logo; + + /** + * 应用地址 + */ + @ApiModelProperty(value = "应用地址") + @TableField("app_src") + private String appSrc; + + /** + * 类型. 0:教职工, 1:家长 + * {@link UserTypeEnum} + */ + @ApiModelProperty(value = "类型. 0:教职工, 1:家长") + @TableField("user_type") + private Integer userType; +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/EduDeptFunction.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/EduDeptFunction.java new file mode 100644 index 0000000..4742ead --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/EduDeptFunction.java @@ -0,0 +1,40 @@ +package com.yida.data.common.core.entity.system; + +import com.baomidou.mybatisplus.annotation.*; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * 部门对应的第三方系统功能Entity + * + * @author ZYJ + * @date 2023-02-20 15:29:05 + */ +@Data +@TableName("edu_dept_function") +public class EduDeptFunction implements Serializable { + + private static final long serialVersionUID = 1818514125422193304L; + + @ApiModelProperty(value = "主键ID(唯一)") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + + @ApiModelProperty(value = "是否删除,1删除0未删除默认0") + @TableField("del_flag") + @TableLogic(value = "0", delval = "1") + private Integer delFlag; + + + @ApiModelProperty(value = "部门id") + @TableField("dept_id") + private Long deptId; + + + @ApiModelProperty(value = "功能名称(自定义的功能, 具体的支持功能对应枚举类SysFunctionEnum)") + @TableField("function_name") + private String functionName; +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/EduQywxServiceProvider.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/EduQywxServiceProvider.java new file mode 100644 index 0000000..400459e --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/EduQywxServiceProvider.java @@ -0,0 +1,43 @@ +package com.yida.data.common.core.entity.system; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * 企业微信服务商信息表 + * + * @author ZYJ + * @date 2022/11/3 + */ +@Data +public class EduQywxServiceProvider implements Serializable { + + private static final long serialVersionUID = 600170148188322117L; + + @TableId(type = IdType.AUTO) + private Long id; + + @ApiModelProperty(value = "是否删除,1删除0未删除,默认0") + @TableLogic(value = "0", delval = "1") + private Integer delFlag; + + @ApiModelProperty("服务商名称") + private String serviceProviderName; + + @ApiModelProperty("服务商secret") + private String serviceProviderSecret; + + @ApiModelProperty("服务商corpId") + private String corpId; + + @ApiModelProperty("微信回调token") + private String wxCallToken; + + @ApiModelProperty("微信回调编码aesKey") + private String wxAesKey; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/EduQywxServiceProviderSchool.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/EduQywxServiceProviderSchool.java new file mode 100644 index 0000000..477b2ab --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/EduQywxServiceProviderSchool.java @@ -0,0 +1,38 @@ +package com.yida.data.common.core.entity.system; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * 企业微信服务商-学校密文corpId对照表 + * 同一服务商的所有应用获取的corpId一致;不同服务商获取的corpId不同。 + * + * @author ZYJ + * @date 2022/11/9 + */ +@Data +public class EduQywxServiceProviderSchool implements Serializable { + + private static final long serialVersionUID = -1501554930464457126L; + + @TableId(type = IdType.AUTO) + private Long id; + + @ApiModelProperty(value = "是否删除,1删除0未删除,默认0") + @TableLogic(value = "0", delval = "1") + private Integer delFlag; + + @ApiModelProperty("服务商corpId") + private String providerCorpId; + + @ApiModelProperty("部门原始corpId") + private String deptOriginalCorpId; + + @ApiModelProperty("部门加密corpId") + private String deptEncryptionCorpId; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/Menu.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/Menu.java index eedb9b3..a1af709 100644 --- a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/Menu.java +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/Menu.java @@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; import java.io.Serializable; import java.time.LocalDateTime; @@ -105,5 +106,7 @@ public class Menu implements Serializable { private transient String createTimeFrom; private transient String createTimeTo; - + + @ApiModelProperty("菜单类型(0-合并, 1-剔除)") + private transient Integer userMenuType; } \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/SystemUser.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/SystemUser.java index bd0bfcf..78b4267 100644 --- a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/SystemUser.java +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/SystemUser.java @@ -244,4 +244,9 @@ public class SystemUser implements Serializable { private String mainRolePerms; private transient EduUserLogo userLogo; + + /** + * 学校性质:0幼儿园,1小学,2中学,3九年一贯,4十二年一贯,5:高校 + */ + private transient Integer schoolNature; } diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/SystemUserMenu.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/SystemUserMenu.java index 4465e57..00eec42 100644 --- a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/SystemUserMenu.java +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/SystemUserMenu.java @@ -25,4 +25,13 @@ public class SystemUserMenu { @ApiModelProperty("菜单id") @TableField("menu_id") private Long menuId; + + + @ApiModelProperty("菜单类型(0-合并, 1-剔除)") + private Integer type; + + /** + * 权限串 + */ + private transient String perms; } diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/UPayConfig.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/UPayConfig.java new file mode 100644 index 0000000..9376b5b --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/UPayConfig.java @@ -0,0 +1,46 @@ +package com.yida.data.common.core.entity.system; + +import com.baomidou.mybatisplus.annotation.*; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * 收钱吧学校信息配置Entity + * + * @author ZYJ + * @date 2023/3/20 + */ +@Data +@TableName("u_pay_config") +public class UPayConfig implements Serializable { + + private static final long serialVersionUID = 4708925018349787447L; + + @ApiModelProperty(value = "主键id") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @ApiModelProperty(value = "是否删除,1删除0未删除,默认0") + @TableLogic(value = "0", delval = "1") + private Integer delFlag; + + @ApiModelProperty("对应部门id") + private Long deptId; + + @ApiModelProperty("开发者序列号") + private String vendorSn; + + @ApiModelProperty("开发者密钥") + private String vendorKey; + + @ApiModelProperty("wap支付应用id") + private String wapAppId; + + @ApiModelProperty("激活码内容") + private String code; + + @ApiModelProperty("公钥") + private String publicKey; +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/WhiteList.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/WhiteList.java new file mode 100644 index 0000000..bfc46fe --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/WhiteList.java @@ -0,0 +1,42 @@ +package com.yida.data.common.core.entity.system; + +import com.baomidou.mybatisplus.annotation.*; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * 白名单Entity + * + * @author ZYJ + * @date 2023-02-20 14:15:49 + */ +@Data +@TableName("t_white_list") +public class WhiteList implements Serializable { + + private static final long serialVersionUID = -1590863122390062997L; + + @ApiModelProperty(value = "主键ID(唯一)") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @ApiModelProperty(value = "是否删除,1删除0未删除默认0") + @TableField("del_flag") + @TableLogic(value = "0", delval = "1") + private Integer delFlag; + + @ApiModelProperty(value = "功能名称(自定义的功能, 具体的支持功能对应枚举类SysFunctionEnum)") + @TableField("function_name") + private String functionName; + + @ApiModelProperty(value = "ip地址(多个地址用英文逗号隔开)") + @TableField("request_ip") + private String requestIp; + + @ApiModelProperty(value = "接口调用频率(空或者0代表无限制)") + @TableField("frequency") + private Integer frequency; + +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/enums/RoleEnum.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/enums/RoleEnum.java index 37da08e..d28ced0 100644 --- a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/enums/RoleEnum.java +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/enums/RoleEnum.java @@ -27,7 +27,9 @@ public enum RoleEnum { ROLE_CLASS_PRINCIPAL("role:class:principal", "班主任", 9, 5), - ROLE_EDUCATION_PRINCIPAL("role:education:principal", "教育局负责人", 8, 2); + ROLE_EDUCATION_PRINCIPAL("role:education:principal", "教育局负责人", 8, 2), + + ROLE_TEACHER("role:teacher", "教师基础角色", 10, 8); /** * 角色标识值 diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/enums/SchoolNatureEnum.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/enums/SchoolNatureEnum.java new file mode 100644 index 0000000..0f777d9 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/enums/SchoolNatureEnum.java @@ -0,0 +1,27 @@ +package com.yida.data.common.core.entity.system.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 学校性质枚举 + */ +@Getter +@AllArgsConstructor +public enum SchoolNatureEnum { + KINDER_TYPE(0, "幼儿园"), + PRI_TYPE(1, "小学"), + MID_TYPE(2, "中学"), + NINE_TYPE(3, "九年一贯"), + TWE_TYPE(4, "十二年一贯"), + VOC_TYPE(5, "中高职"), + UNI_TYPE(6, "高校"); + /** + * 性质 + */ + private final Integer value; + /** + * 性质名称 + */ + private final String name; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/enums/SysFunctionEnum.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/enums/SysFunctionEnum.java new file mode 100644 index 0000000..ad594aa --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/system/enums/SysFunctionEnum.java @@ -0,0 +1,30 @@ +package com.yida.data.common.core.entity.system.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 系统功能枚举 + * + * @author ZYJ + * @date 2023/2/19 + */ +@Getter +@AllArgsConstructor +public enum SysFunctionEnum { + + /** + * 系统功能枚举 + */ + HAI_PU_TIAN("hai_pu_tian", "海普天消费机"); + + /** + * 功能名称 + */ + private final String value; + + /** + * 说明 + */ + private final String message; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/user/EduFaceGroupStrategy.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/user/EduFaceGroupStrategy.java new file mode 100644 index 0000000..6f8b379 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/user/EduFaceGroupStrategy.java @@ -0,0 +1,150 @@ +package com.yida.data.common.core.entity.user; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * 人脸组-策略Entity + * + * @author ZYJ + * @date 2022-12-12 11:04:39 + */ +@Data +@TableName("edu_face_group_strategy") +public class EduFaceGroupStrategy { + + @ApiModelProperty(value = "主键") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @ApiModelProperty(value = "创建时间") + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + @ApiModelProperty(value = "创建人id") + @TableField(value = "create_id", fill = FieldFill.INSERT) + private Long createId; + + @ApiModelProperty(value = "最后修改时间") + @TableField(value = "update_date", fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateDate; + + @ApiModelProperty(value = "最后修改人id") + @TableField(value = "update_id", fill = FieldFill.UPDATE) + private Long updateId; + + /** + * 删除标识,0-未删除,1-已删除 + */ + @ApiModelProperty(value = "删除标识,0-未删除,1-已删除") + @TableField("del_flag") + @TableLogic(value = "0", delval = "1") + private Integer delFlag; + + /** + * 人脸组id + */ + @ApiModelProperty(value = "人脸组id") + @TableField("face_group_id") + private Long faceGroupId; + + /** + * 策略生效时间 + */ + @ApiModelProperty(value = "策略生效时间") + @TableField("strategy_start_date") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime strategyStartDate; + + /** + * 策略失效时间 + */ + @ApiModelProperty(value = "策略失效时间") + @TableField("strategy_end_date") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime strategyEndDate; + + /** + * 星期一通行计划id + */ + @ApiModelProperty(value = "星期一通行计划id") + @TableField("monday_plan_id") + private Long mondayPlanId; + + /** + * 星期二通行计划id + */ + @ApiModelProperty(value = "星期二通行计划id") + @TableField("tuesday_plan_id") + private Long tuesdayPlanId; + + /** + * 星期三通行计划id + */ + @ApiModelProperty(value = "星期三通行计划id") + @TableField("wednesday_plan_id") + private Long wednesdayPlanId; + + /** + * 星期四通行计划id + */ + @ApiModelProperty(value = "星期四通行计划id") + @TableField("thursday_plan_id") + private Long thursdayPlanId; + + /** + * 星期五通行计划id + */ + @ApiModelProperty(value = "星期五通行计划id") + @TableField("friday_plan_id") + private Long fridayPlanId; + + /** + * 星期六通行计划id + */ + @ApiModelProperty(value = "星期六通行计划id") + @TableField("saturday_plan_id") + private Long saturdayPlanId; + + /** + * 星期天通行计划id + */ + @ApiModelProperty(value = "星期天通行计划id") + @TableField("sunday_plan_id") + private Long sundayPlanId; + + private transient List mondayTimeList; + private transient List tuesdayTimeList; + private transient List wednesdayTimeList; + private transient List thursdayTimeList; + private transient List fridayTimeList; + private transient List saturdayTimeList; + private transient List sundayTimeList; + + /** + * 特殊日期集合 + */ + private transient List specialDateList; + + /** + * 关联的设备组信息 + */ + private transient List groupDeviceList; + + /** + * 关联的人员信息 + */ + private transient List groupUserList; +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/user/EduFaceGroupStrategyPlan.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/user/EduFaceGroupStrategyPlan.java new file mode 100644 index 0000000..76394d2 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/user/EduFaceGroupStrategyPlan.java @@ -0,0 +1,69 @@ +package com.yida.data.common.core.entity.user; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +/** + * 人脸组-策略-通行计划Entity + * + * @author ZYJ + * @date 2022-12-12 11:36:19 + */ +@Data +@TableName("edu_face_group_strategy_plan") +public class EduFaceGroupStrategyPlan { + + @ApiModelProperty(value = "主键") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @ApiModelProperty(value = "创建时间") + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + @ApiModelProperty(value = "创建人id") + @TableField(value = "create_id", fill = FieldFill.INSERT) + private Long createId; + + @ApiModelProperty(value = "最后修改时间") + @TableField(value = "update_date", fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateDate; + + @ApiModelProperty(value = "最后修改人id") + @TableField(value = "update_id", fill = FieldFill.UPDATE) + private Long updateId; + + /** + * 删除标识,0-未删除,1-已删除 + */ + @ApiModelProperty(value = "删除标识,0-未删除,1-已删除") + @TableField("del_flag") + @TableLogic(value = "0", delval = "1") + private Integer delFlag; + + /** + * 人脸组id + */ + @ApiModelProperty(value = "人脸组id") + @TableField("face_group_id") + private Long faceGroupId; + + /** + * 人脸组-策略id + */ + @ApiModelProperty(value = "人脸组-策略id") + @TableField("face_group_strategy_id") + private Long faceGroupStrategyId; + + @ApiModelProperty("通行计划唯一编码") + private String uniqueCode; +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/user/EduFaceGroupStrategyPlanTime.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/user/EduFaceGroupStrategyPlanTime.java new file mode 100644 index 0000000..c04f0a3 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/user/EduFaceGroupStrategyPlanTime.java @@ -0,0 +1,93 @@ +package com.yida.data.common.core.entity.user; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; +import java.time.LocalTime; + +/** + * 人脸组-策略-通行计划-时间Entity + * + * @author ZYJ + * @date 2022-12-12 11:36:19 + */ +@Data +@TableName("edu_face_group_strategy_plan_time") +public class EduFaceGroupStrategyPlanTime { + + @ApiModelProperty(value = "主键") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @ApiModelProperty(value = "创建时间") + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + @ApiModelProperty(value = "创建人id") + @TableField(value = "create_id", fill = FieldFill.INSERT) + private Long createId; + + @ApiModelProperty(value = "最后修改时间") + @TableField(value = "update_date", fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateDate; + + @ApiModelProperty(value = "最后修改人id") + @TableField(value = "update_id", fill = FieldFill.UPDATE) + private Long updateId; + + /** + * 删除标识,0-未删除,1-已删除 + */ + @ApiModelProperty(value = "删除标识,0-未删除,1-已删除") + @TableField("del_flag") + @TableLogic(value = "0", delval = "1") + private Integer delFlag; + + /** + * 人脸组id + */ + @ApiModelProperty(value = "人脸组id") + @TableField("face_group_id") + private Long faceGroupId; + + /** + * 人脸组-策略-通行计划id + */ + @ApiModelProperty(value = "人脸组-策略-通行计划id") + @TableField("face_group_strategy_id") + private Long faceGroupStrategyId; + + /** + * 人脸组-策略id + */ + @ApiModelProperty(value = "人脸组-策略id") + @TableField("face_group_strategy_plan_id") + private Long faceGroupStrategyPlanId; + + /** + * 开始时间 + */ + @ApiModelProperty(value = "开始时间") + @TableField("plan_start_time") + @DateTimeFormat(pattern = "HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "HH:mm:ss") + private LocalTime planStartTime; + + /** + * 结束时间 + */ + @ApiModelProperty(value = "结束时间") + @TableField("plan_end_time") + @DateTimeFormat(pattern = "HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "HH:mm:ss") + private LocalTime planEndTime; + +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/user/EduFaceGroupStrategySpecialDate.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/user/EduFaceGroupStrategySpecialDate.java new file mode 100644 index 0000000..a0f2ac2 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/user/EduFaceGroupStrategySpecialDate.java @@ -0,0 +1,89 @@ +package com.yida.data.common.core.entity.user; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; + +/** + * 人脸组-策略-特殊日期Entity + * + * @author ZYJ + * @date 2022-12-26 13:57:32 + */ +@Data +@TableName("edu_face_group_strategy_special_date") +public class EduFaceGroupStrategySpecialDate implements Serializable { + + private static final long serialVersionUID = 8045410029465939747L; + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + @TableField(value = "create_id", fill = FieldFill.INSERT) + private Long createId; + + @TableField(value = "update_date", fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateDate; + + @TableField(value = "update_id", fill = FieldFill.UPDATE) + private Long updateId; + + /** + * 删除标识,0-未删除,1-已删除 + */ + @ApiModelProperty(value = "删除标识,0-未删除,1-已删除") + @TableField("del_flag") + @TableLogic(value = "0", delval = "1") + private Integer delFlag; + + /** + * 人脸组id + */ + @ApiModelProperty(value = "人脸组id") + @TableField("face_group_id") + private Long faceGroupId; + + /** + * 人脸组-策略id + */ + @ApiModelProperty(value = "人脸组-策略id") + @TableField("face_group_strategy_id") + private Long faceGroupStrategyId; + + /** + * 特殊日期开始日期 + */ + @ApiModelProperty(value = "特殊日期开始日期") + @TableField("special_start_date") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") + private LocalDate specialStartDate; + + /** + * 特殊日期结束日期 + */ + @ApiModelProperty(value = "特殊日期结束日期") + @TableField("special_end_date") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") + private LocalDate specialEndDate; + + /** + * 特殊时间集合 + */ + private transient List specialTimeList; +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/user/EduFaceGroupStrategySpecialTime.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/user/EduFaceGroupStrategySpecialTime.java new file mode 100644 index 0000000..4607c4b --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/user/EduFaceGroupStrategySpecialTime.java @@ -0,0 +1,91 @@ +package com.yida.data.common.core.entity.user; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.time.LocalTime; + +/** + * 人脸组-策略-特殊日期-时间Entity + * + * @author ZYJ + * @date 2022-12-26 13:57:32 + */ +@Data +@TableName("edu_face_group_strategy_special_time") +public class EduFaceGroupStrategySpecialTime implements Serializable { + + private static final long serialVersionUID = 7774597210860207565L; + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + @TableField(value = "create_id", fill = FieldFill.INSERT) + private Long createId; + + @TableField(value = "update_date", fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateDate; + + @TableField(value = "update_id", fill = FieldFill.UPDATE) + private Long updateId; + + /** + * 删除标识,0-未删除,1-已删除 + */ + @ApiModelProperty(value = "删除标识,0-未删除,1-已删除") + @TableField("del_flag") + @TableLogic(value = "0", delval = "1") + private Integer delFlag; + + /** + * 人脸组id + */ + @ApiModelProperty(value = "人脸组id") + @TableField("face_group_id") + private Long faceGroupId; + + /** + * 人脸组-策略id + */ + @ApiModelProperty(value = "人脸组-策略id") + @TableField("face_group_strategy_id") + private Long faceGroupStrategyId; + + /** + * 人脸组-策略-特殊日期id + */ + @ApiModelProperty(value = "人脸组-策略-特殊日期id") + @TableField("face_group_strategy_special_date_id") + private Long faceGroupStrategySpecialDateId; + + /** + * 开始时间 + */ + @ApiModelProperty(value = "开始时间") + @TableField("special_start_time") + @DateTimeFormat(pattern = "HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "HH:mm:ss") + private LocalTime specialStartTime; + + /** + * 结束时间 + */ + @ApiModelProperty(value = "结束时间") + @TableField("special_end_time") + @DateTimeFormat(pattern = "HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "HH:mm:ss") + private LocalTime specialEndTime; + +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/user/EduStaffDept.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/user/EduStaffDept.java index 63e7555..9b10dea 100644 --- a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/user/EduStaffDept.java +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/user/EduStaffDept.java @@ -49,6 +49,9 @@ public class EduStaffDept { @ApiModelProperty(value = "") private String staffName; + @ApiModelProperty(value = "z职工用户头像") + private String avatar; + /** * 部门id */ diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/user/EduStudent.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/user/EduStudent.java index 9ceaaee..5267d5d 100644 --- a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/user/EduStudent.java +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/user/EduStudent.java @@ -51,6 +51,42 @@ public class EduStudent implements Serializable { @ApiModelProperty("学生姓名") private String stuName; + @ApiModelProperty("曾用名") + private String formerName; + + @ApiModelProperty("考生号") + private String stuExamNumber; + + @ApiModelProperty("银行卡号") + private String creditCardNumbers; + + @ApiModelProperty("民族") + private String nation; + + @ApiModelProperty("QQ号") + private String qqCode; + + @ApiModelProperty("微信号") + private String wxCode; + + @ApiModelProperty("邮箱") + private String email; + + @ApiModelProperty("入学年级") + private String startGrade; + + @ApiModelProperty("政治面貌") + private String politicsStatus; + + @ApiModelProperty("邮政编码") + private String postalCode; + + @ApiModelProperty("籍贯") + private String nativePlace; + + @ApiModelProperty("现住址") + private String presentAddress; + @ApiModelProperty("学生头像url") private String avatar; @@ -100,6 +136,9 @@ public class EduStudent implements Serializable { @ApiModelProperty("学生当前状态,0=在校/在寝,1=离校/离寝") private Integer status; + @ApiModelProperty("学籍状态:关联字典表") + private String studentStatus; + @ApiModelProperty("学生在寝状态,0-在寝,1-离寝") private Integer dormStatus; diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/user/EduStudentApply.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/user/EduStudentApply.java new file mode 100644 index 0000000..cd50438 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/user/EduStudentApply.java @@ -0,0 +1,77 @@ +package com.yida.data.common.core.entity.user; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import java.time.LocalDateTime; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +@Data +public class EduStudentApply { + + @TableId(type = IdType.AUTO) + private Long id; + + @TableField("del_flag") + @TableLogic(value = "0", delval = "1") + private Integer delFlag; + /** + * 创建时间 + */ + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + @TableField(value = "update_date", fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateDate; + + private Long studentId; + + private String studentName; + private String studentNumber; + + @ApiModelProperty("应用编码") + private String applyCode; + + @ApiModelProperty("应用名称") + private String applyName; + + @ApiModelProperty("有效期开始时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime startTime; + + @ApiModelProperty("有效期结束时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime endTime; + + @ApiModelProperty("学校ID") + private Long schoolId; + @ApiModelProperty("学校名称") + private String schoolName; + @ApiModelProperty("学区ID") + private Long campusId; + @ApiModelProperty("学区名称") + private String campusName; + @ApiModelProperty("学段ID") + private Long sectionId; + @ApiModelProperty("学段名称") + private String sectionName; + @ApiModelProperty("年级ID") + private Long gradeId; + @ApiModelProperty("年级名称") + private String gradeName; + @ApiModelProperty("班级ID") + private Long classId; + @ApiModelProperty("班级名称") + private String className; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/user/EduStudentApplyFor.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/user/EduStudentApplyFor.java new file mode 100644 index 0000000..98b82d5 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/user/EduStudentApplyFor.java @@ -0,0 +1,79 @@ +package com.yida.data.common.core.entity.user; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import java.time.LocalDateTime; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +@Data +public class EduStudentApplyFor { + + @TableId(type = IdType.AUTO) + private Long id; + + @TableField("del_flag") + @TableLogic(value = "0", delval = "1") + private Integer delFlag; + /** + * 创建时间 + */ + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + @TableField(value = "update_date", fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateDate; + + private Long studentId; + + private String studentName; + + private String studentNumber; + + private String studentMobile; + + @ApiModelProperty("应用编码") + private String applyCode; + + @ApiModelProperty("应用名称") + private String applyName; + + @ApiModelProperty("处理人ID") + private Long dealStaffId; + + @ApiModelProperty("处理人姓名") + private String dealStaffName; + + @ApiModelProperty("状态:0待处理,1已处理") + private Integer status; + + @ApiModelProperty("学校ID") + private Long schoolId; + @ApiModelProperty("学校名称") + private String schoolName; + @ApiModelProperty("学区ID") + private Long campusId; + @ApiModelProperty("学区名称") + private String campusName; + @ApiModelProperty("学段ID") + private Long sectionId; + @ApiModelProperty("学段名称") + private String sectionName; + @ApiModelProperty("年级ID") + private Long gradeId; + @ApiModelProperty("年级名称") + private String gradeName; + @ApiModelProperty("班级ID") + private Long classId; + @ApiModelProperty("班级名称") + private String className; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/user/EduUserFace.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/user/EduUserFace.java index 9e1ce37..0ddba20 100644 --- a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/user/EduUserFace.java +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/user/EduUserFace.java @@ -9,13 +9,11 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; - +import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; import java.time.LocalDateTime; -import lombok.Data; - /** * 用户人脸图像 Entity * @@ -84,7 +82,30 @@ public class EduUserFace { private String picPath; /** - * 人脸与人脸组的关联id + * 人脸组id */ private transient Long faceGroupUserId; + + /** + * 学生对应卡号 + */ + private transient String rfidCard; + + /** + * 是否为会员 1=是,0=否(针对学生,教师全是会员) + */ + private transient Integer notes; + /** + * 会员开始时间 + */ + private transient String cardValidBegin; + /** + * 会员结束时间 + */ + private transient String cardValidEnd; + + /** + * 下发的设备名称 + */ + private transient String deviceName; } \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/user/enums/StudentStatusEnum.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/user/enums/StudentStatusEnum.java new file mode 100644 index 0000000..e28a25a --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/user/enums/StudentStatusEnum.java @@ -0,0 +1,41 @@ +package com.yida.data.common.core.entity.user.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 学生学籍状态枚举 + */ +@Getter +@AllArgsConstructor +public enum StudentStatusEnum { + + ZAIDU("zaidu", "在读"), + BIYE("biye", "毕业"), + TUIXUE("tuixue", "退学"), + XIUXUE("xiuxue", "休学"), + TINGXUE("tingxue", "停学"), + FUXUE("fuxue", "复学"), + LIUSHI("liushi", "流失"), + JIEYE("jieye", "结业"), + YIYE("yiye", "肄业"), + ZHUANXUE("zhuanxue", "转学(转出)"), + SIWANG("siwang", "死亡"), + BAOLIURUXUEZIGE("baoliuruxuezige", "保留入学资格"), + GONGPAICHUGUO("gongpaichuguo", "公派出国"), + KAICHU("kaichu", "开除"), + XIALUOBUMING("xialuobuming", "下落不明"), + CANJUN("canjun", "保留学籍(参军)"), + WEIBAODAO("weibaodao", "未报到"), + QITA("qita", "其他"); + + /** + * 家校部门类型 + */ + private final String status; + + /** + * 家校类型名称 + */ + private final String name; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/user/enums/StudentTypeEnum.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/user/enums/StudentTypeEnum.java new file mode 100644 index 0000000..90ce4fe --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/user/enums/StudentTypeEnum.java @@ -0,0 +1,28 @@ +package com.yida.data.common.core.entity.user.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 学生住宿类型枚举 + */ +@Getter +@AllArgsConstructor +public enum StudentTypeEnum { + + /** + * 家校部门类型枚举 + */ + SCHOOL_TYPE(0, "走读"), + DORM_TYPE(1, "住宿"); + + /** + * 家校部门类型 + */ + private final Integer value; + + /** + * 家校类型名称 + */ + private final String name; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/userLeave/EduLeaveRequestProcessConfig.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/userLeave/EduLeaveRequestProcessConfig.java new file mode 100644 index 0000000..e6ea4e0 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/userLeave/EduLeaveRequestProcessConfig.java @@ -0,0 +1,126 @@ +package com.yida.data.common.core.entity.userLeave; + +import java.util.Date; +import lombok.Data; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; + +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; +import java.time.LocalDate; +import java.time.LocalTime; + +/** + * Entity + * + * @author wjm + * @date 2022-12-01 10:45:56 + */ +@Data +@TableName("edu_leave_request_process_config") +public class EduLeaveRequestProcessConfig { + + /** + * + */ + @ApiModelProperty(value = "") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 学生id + */ + @ApiModelProperty(value = "学生id") + @TableField("process_name") + private String processName; + + /** + * 流程类型:0=教师,1=学生 + */ + @ApiModelProperty(value = "流程类型:0=教师,1=学生") + @TableField("process_type") + private Integer processType; + + /** + * 最小天数 + */ + @ApiModelProperty(value = "最小天数") + @TableField("min_days") + private Integer minDays; + + /** + * 最大天数 + */ + @ApiModelProperty(value = "最大天数") + @TableField("max_days") + private Integer maxDays; + + + /** + * 是否小于半天 + */ + @ApiModelProperty(value = "是否小于半天1=是,0=否") + private Integer lessHalfDay; + + + /** + * 基于less_half_day 定义半天是几小时 + */ + @ApiModelProperty(value = "基于less_half_day 定义半天是几小时") + private Integer hours; + + /** + * 学校id + */ + @ApiModelProperty(value = "学校id") + @TableField("school_id") + private Long schoolId; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间") + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + /** + * 创建人 + */ + @ApiModelProperty(value = "创建人") + @TableField(value = "create_id", fill = FieldFill.INSERT) + private Long createId; + + /** + * 修改时间 + */ + @ApiModelProperty(value = "修改时间") + @TableField(value = "update_date", fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateDate; + + /** + * 修改人 + */ + @ApiModelProperty(value = "修改人") + @TableField(value = "update_id", fill = FieldFill.UPDATE) + private Long updateId; + + /** + * 0为未删除,1为已删除 + */ + @ApiModelProperty(value = "0为未删除,1为已删除") + @TableField("del_flag") + @TableLogic(value = "0", delval = "1") + private Integer delFlag; + +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/userLeave/EduLeaveRequestProcessConfigApplicableDepartments.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/userLeave/EduLeaveRequestProcessConfigApplicableDepartments.java new file mode 100644 index 0000000..12199a5 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/userLeave/EduLeaveRequestProcessConfigApplicableDepartments.java @@ -0,0 +1,57 @@ +package com.yida.data.common.core.entity.userLeave; + +import lombok.Data; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; + +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; +import java.time.LocalDate; +import java.time.LocalTime; + +/** + * Entity + * + * @author wjm + * @date 2022-12-01 10:45:56 + */ +@Data +@TableName("edu_leave_request_process_config_applicable_departments") +public class EduLeaveRequestProcessConfigApplicableDepartments { + + /** + * + */ + @ApiModelProperty(value = "") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 流程ID + */ + @ApiModelProperty(value = "流程ID") + @TableField("process_id") + private Long processId; + + /** + * 指定部门 + */ + @ApiModelProperty(value = "指定部门") + @TableField("user_dept_id") + private Long userDeptId; + + /** + * 指定部门父ID,用于数据回显 + */ + @ApiModelProperty(value = "指定部门父ID,用于数据回显") + @TableField("user_parent_dept_id") + private String userParentDeptId; + +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/userLeave/EduLeaveRequestProcessConfigApprovalUser.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/userLeave/EduLeaveRequestProcessConfigApprovalUser.java new file mode 100644 index 0000000..1f1081e --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/userLeave/EduLeaveRequestProcessConfigApprovalUser.java @@ -0,0 +1,63 @@ +package com.yida.data.common.core.entity.userLeave; + +import lombok.Data; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; + +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; +import java.time.LocalDate; +import java.time.LocalTime; + +/** + * Entity + * + * @author wjm + * @date 2022-12-01 10:45:56 + */ +@Data +@TableName("edu_leave_request_process_config_approval_user") +public class EduLeaveRequestProcessConfigApprovalUser { + + /** + * + */ + @ApiModelProperty(value = "") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 流程ID + */ + @ApiModelProperty(value = "流程ID") + @TableField("process_id") + private Long processId; + + /** + * 指定人员ID + */ + @ApiModelProperty(value = "指定人员ID") + @TableField("staff_id") + private Long staffId; + + /** + * 指定角色ID,这里指的是班主任、系主任 + */ + @ApiModelProperty(value = "指定角色ID,这里指的是班主任、系主任") + @TableField("staff_role_id") + private Integer staffRoleId; + + /** + * 流程ID + */ + @ApiModelProperty(value = "所属第几审核阶段ID") + @TableField("view_id") + private Long viewId; +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/userLeave/EduLeaveRequestProcessConfigView.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/userLeave/EduLeaveRequestProcessConfigView.java new file mode 100644 index 0000000..31294ef --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/userLeave/EduLeaveRequestProcessConfigView.java @@ -0,0 +1,65 @@ +package com.yida.data.common.core.entity.userLeave; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import java.time.LocalDateTime; +import java.util.List; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * Entity + * + * @author wjm + * @date 2022-12-01 10:45:56 + */ +@Data +@TableName("edu_leave_request_process_config_view") +public class EduLeaveRequestProcessConfigView { + + /** + * + */ + @ApiModelProperty(value = "") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 流程ID + */ + @ApiModelProperty(value = "流程ID") + @TableField("process_id") + private Long processId; + + + /** + * 审批人员类型:0指定角色,1指定人员 + */ + @ApiModelProperty(value = "审批人员类型:0指定角色,1指定人员") + @TableField("approval_user_type") + private Integer approvalUserType; + + /** + * 审批方式:0会审,1或审 + */ + @ApiModelProperty(value = "审批方式:0会审,1或审") + @TableField("approval_type") + private Integer approvalType; + + /** + * 排序 + */ + @ApiModelProperty(value = "审批方式:0会审,1或审") + @TableField("sort") + private Integer sort; + + @ApiModelProperty(value = "审核人员") + private transient List eduLeaveRequestProcessConfigApprovalUserList; + +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/userLeave/EduLeaveRequestProcessRecord.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/userLeave/EduLeaveRequestProcessRecord.java new file mode 100644 index 0000000..002e1c9 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/userLeave/EduLeaveRequestProcessRecord.java @@ -0,0 +1,148 @@ +package com.yida.data.common.core.entity.userLeave; + +import com.yida.data.common.core.entity.user.EduStaff; +import java.util.Date; +import lombok.Data; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; + +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; +import java.time.LocalDate; +import java.time.LocalTime; + +/** + * Entity + * + * @author wjm + * @date 2022-12-01 10:45:56 + */ +@Data +@TableName("edu_leave_request_process_record") +public class EduLeaveRequestProcessRecord { + + /** + * + */ + @ApiModelProperty(value = "") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 流程ID + */ + @ApiModelProperty(value = "流程ID") + @TableField("process_id") + private Long processId; + + /** + * 请假主体ID + */ + @ApiModelProperty(value = "请假主体ID") + @TableField("request_id") + private Long requestId; + + /** + * 审核人ID + */ + @ApiModelProperty(value = "审核人ID") + @TableField("approval_id") + private Long approvalId; + + /** + * 审核人姓名,记录方便展示 + */ + @ApiModelProperty(value = "审核人姓名,记录方便展示") + @TableField("approval_name") + private String approvalName; + + /** + * 审核人ID + */ + @ApiModelProperty(value = "审核人信息") + private transient EduStaff approvaler; + + /** + * 审核结果:2=审核不通过,1=通过,0=待审核,默认0 + */ + @ApiModelProperty(value = "审核结果:2=审核不通过,1=通过,0=待审核,默认0") + @TableField("approval_result") + private Integer approvalResult; + + /** + * 审核不通过的原因 + */ + @ApiModelProperty(value = "审核不通过的原因") + @TableField("approval_reason") + private String approvalReason; + + /** + * 学校id + */ + @ApiModelProperty(value = "学校id") + @TableField("school_id") + private Long schoolId; + + /** + * 审核顺序 + */ + @ApiModelProperty(value = "审核顺序") + @TableField("sort") + private Integer sort; + + + /** + * 审核顺序 + */ + @ApiModelProperty(value = "审核第几流程ID") + @TableField("view_id") + private Long viewId; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间") + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + /** + * 创建人 + */ + @ApiModelProperty(value = "创建人") + @TableField(value = "create_id", fill = FieldFill.INSERT) + private Long createId; + + /** + * 修改时间 + */ + @ApiModelProperty(value = "修改时间") + @TableField(value = "update_date", fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateDate; + + /** + * 修改人 + */ + @ApiModelProperty(value = "修改人") + @TableField(value = "update_id", fill = FieldFill.UPDATE) + private Long updateId; + + /** + * 0为未删除,1为已删除 + */ + @ApiModelProperty(value = "0为未删除,1为已删除") + @TableField("del_flag") + @TableLogic(value = "0", delval = "1") + private Integer delFlag; + +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/userLeave/EduLeaveRequestUser.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/userLeave/EduLeaveRequestUser.java new file mode 100644 index 0000000..e58cea3 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/userLeave/EduLeaveRequestUser.java @@ -0,0 +1,200 @@ +package com.yida.data.common.core.entity.userLeave; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import java.util.List; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +/** + * Entity + * + * @author wjm + * @date 2022-12-01 10:51:19 + */ +@Data +@TableName("edu_leave_request_user") +public class EduLeaveRequestUser { + + /** + * + */ + @ApiModelProperty(value = "") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 请假人ID + */ + @ApiModelProperty(value = "请假人ID") + @TableField("user_id") + private Long userId; + + /** + * 请假人姓名 + */ + @ApiModelProperty(value = "请假人姓名") + @TableField("user_name") + private String userName; + + + /** + * 请假人图像 + */ + @ApiModelProperty(value = "请假人图像") + private transient String userPicUrl; + + /** + * 请假人所属部门 + */ + @ApiModelProperty(value = "请假人所属部门") + private transient String userDeptName; + + + /** + * 1:病假,2:事假,0:其他,3年假,4调休假,5婚嫁,6产假,7陪产假 + */ + @ApiModelProperty(value = "1:病假,2:事假,0:其他,3年假,4调休假,5婚嫁,6产假,7陪产假") + @TableField("type") + private Integer type; + + /** + * 0教师请假,1学生请假 + */ + @ApiModelProperty(value = "0教师请假,1学生请假") + @TableField("request_type") + private Integer requestType; + + /** + * 请假理由 + */ + @ApiModelProperty(value = "请假理由") + @TableField("request_reason") + private String requestReason; + /** + * 请假去向 + */ + @ApiModelProperty(value = "请假去向") + @TableField("request_for") + private String requestFor; + + /** + * 审核不通过原因 + */ + @ApiModelProperty(value = "审核不通过原因") + @TableField("refuse_reason") + private String refuseReason; + + /** + * 开始时间 + */ + @ApiModelProperty(value = "开始时间") + @TableField("start_time") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime startTime; + + /** + * 结束时间 + */ + @ApiModelProperty(value = "结束时间") + @TableField("end_time") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime endTime; + + /** + * 审核状态:审核状态:默认0待审核审核,1已通过,2已拒绝,3审核中 + */ + @ApiModelProperty(value = "审核状态:默认0待审核审核,1已通过,2已拒绝,3审核中") + @TableField("status") + private Integer status; + + /** + * 审核时间 + */ + @ApiModelProperty(value = "审核时间") + @TableField(value = "audit_time") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime auditTime; + /** + * 图片路径,用逗号分割 + */ + @ApiModelProperty(value = "图片路径,用逗号分割") + @TableField("pic_url") + private String picUrl; + + /** + * 学校id + */ + @ApiModelProperty(value = "学校id") + @TableField("school_id") + private Long schoolId; + + + /** + * + */ + @ApiModelProperty(value = "") + @TableField(value = "create_date", fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + /** + * + */ + @ApiModelProperty(value = "") + @TableField(value = "create_id", fill = FieldFill.INSERT) + private Long createId; + + /** + * + */ + @ApiModelProperty(value = "") + @TableField(value = "update_date", fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateDate; + + /** + * + */ + @ApiModelProperty(value = "") + @TableField(value = "update_id", fill = FieldFill.UPDATE) + private Long updateId; + + /** + * 0为未删除,1为已删除 + */ + @ApiModelProperty(value = "0为未删除,1为已删除") + @TableField("del_flag") + @TableLogic(value = "0", delval = "1") + private Integer delFlag; + + /** + * 审核状态:审核状态:默认0待审核审核,1已通过,2已拒绝,3审核中 + */ + @ApiModelProperty(value = "审核状态:默认0待审核审核,1已通过,2已拒绝") + private transient Integer currentUserStatus; + + @ApiModelProperty("策略id") + private Long strategyId; + + @ApiModelProperty("当前请假审核到第几级,从0开始") + @TableField(value = "view_sort") + private Integer viewSort; + + @ApiModelProperty("下级审核人员ids") + @TableField(value = "next_app_user_ids") + private String nextAppUserIds; + + + @ApiModelProperty("下一步审核人信息") + private transient List eduLeaveRequestProcessRecordList; + +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/userLeave/EduLeaveRequestUserView.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/userLeave/EduLeaveRequestUserView.java new file mode 100644 index 0000000..b0e20a8 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/entity/userLeave/EduLeaveRequestUserView.java @@ -0,0 +1,87 @@ +package com.yida.data.common.core.entity.userLeave; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import java.time.LocalDateTime; +import java.util.List; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * Entity + * + * @author wjm + * @date 2022-12-01 10:45:56 + */ +@Data +@TableName("edu_leave_request_user_view") +public class EduLeaveRequestUserView { + + /** + * + */ + @ApiModelProperty(value = "") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 流程ID + */ + @ApiModelProperty(value = "流程ID") + @TableField("process_id") + private Long processId; + + /** + * 请假主体ID + */ + @ApiModelProperty(value = "请假主体ID") + @TableField("request_id") + private Long requestId; + + + /** + * 排序 + */ + @ApiModelProperty(value = "排序") + @TableField("sort") + private Integer sort; + + /** + * 审批人员类型:0指定角色,1指定人员 + */ + @ApiModelProperty(value = "审批人员类型:0指定角色,1指定人员") + @TableField("approval_user_type") + private Integer approvalUserType; + + /** + * 审批方式:0会审,1或审 + */ + @ApiModelProperty(value = "审批方式:0会审,1或审") + @TableField("approval_type") + private Integer approvalType; + + + /** + * 创建时间 + */ + @ApiModelProperty(value = "审核时间") + @TableField(value = "audit_time") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime auditTime; + + /** + * 审核状态:0待审核,1已通过,2已拒绝 + */ + @ApiModelProperty(value = "审核状态:0待审核,1已通过,2已拒绝") + @TableField("status") + private Integer status; + + @ApiModelProperty(value = "审核记录") + private transient List eduLeaveRequestProcessRecordList; +} \ No newline at end of file diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/AppTypeEnum.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/AppTypeEnum.java new file mode 100644 index 0000000..7fbae27 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/AppTypeEnum.java @@ -0,0 +1,31 @@ +package com.yida.data.common.core.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 应用类型枚举 + * + * @author ZYJ + * @date 2023/6/28 + */ +@Getter +@AllArgsConstructor +public enum AppTypeEnum { + + /** + * 应用类型枚举 + */ + SYSTEM_APPLICATION_TYPE(0, "系统应用"), + THIRD_PARTY_APPLICATION_TYPE(1, "第三方应用"); + + /** + * 类型 + */ + private final Integer type; + + /** + * 描述 + */ + private final String message; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/ApprovalRoleTypeEnum.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/ApprovalRoleTypeEnum.java new file mode 100644 index 0000000..46b15cb --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/ApprovalRoleTypeEnum.java @@ -0,0 +1,32 @@ +package com.yida.data.common.core.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 审核角色类型枚举 + * + * @author ZYJ + * @date 2023/11/24 + */ +@Getter +@AllArgsConstructor +public enum ApprovalRoleTypeEnum { + + /** + * 审核角色类型枚举 + * 1、班主任,2、系主任 + */ + CLASS_TEACHER_TYPE(1, "班主任"), + DEAN_TYPE(2, "系主任"); + + /** + * 类型 + */ + private final Integer type; + + /** + * 描述 + */ + private final String message; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/AttendanceResult.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/AttendanceResult.java index 2247454..d022fd5 100644 --- a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/AttendanceResult.java +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/AttendanceResult.java @@ -14,6 +14,11 @@ public enum AttendanceResult { */ NORMAL(100, "正常"), + /** + * 异常状态 + */ + ABNORMAL(999, "异常"), + /** * 上学未在打卡有效时间段 */ @@ -40,10 +45,33 @@ public enum AttendanceResult { * 走读-旷课 */ STU_NOTARRIVE(204, "旷课"), + /** * 走读-请假 */ STU_REQUEST(205, "请假"), + /** + * 上班未打卡|下班正常 + */ + STU_NOSTART_AND_END_NORMAL(206, "上班未打卡|下班正常"), + + /** + * 上班未打卡|下班正常 + */ + STU_NOSTART_AND_END_LATE(207, "上班未打卡|下班早退"), + /** + * 上班未打卡|下班正常 + */ + STU_NOSTART_AND_END_NOTIN(208, "上班未打卡|下班未在有效打卡时间段内"), + /** + * 上班未在有效打卡时间段内|下班早退 + */ + STU_NOSTARTIN_AND_END_LEAVE(209, "上班未在有效打卡时间段内|下班早退"), + + /** + * 上班迟到|下班未打卡 + */ + STU_NOSTARTIN_AND_END_NO(210, "上班迟到|下班未打卡"), /** * 住宿-晚归 */ diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/AuditStatusEnum.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/AuditStatusEnum.java new file mode 100644 index 0000000..668fcb7 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/AuditStatusEnum.java @@ -0,0 +1,29 @@ +package com.yida.data.common.core.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 审核状态 枚举 + */ +@Getter +@AllArgsConstructor +public enum AuditStatusEnum { + + /** + * 审核状态枚举 + */ + PASS_STATUS(0, "审核通过"), + NO_DO_STATUS(1, "未执行"), + NOT_PASS_STATUS(2, "审核未通过"); + + /** + * 审核状态 + */ + private final Integer status; + + /** + * 审核状态描述 + */ + private final String message; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/BaiDuModuleEnum.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/BaiDuModuleEnum.java new file mode 100644 index 0000000..c1b1227 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/BaiDuModuleEnum.java @@ -0,0 +1,30 @@ +package com.yida.data.common.core.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 百度api模块枚举 + * + * @author ZYJ + * @date 2023/6/20 + */ +@Getter +@AllArgsConstructor +public enum BaiDuModuleEnum { + + /** + * 百度api模块枚举 + */ + FACE_DETECT("face_detect", "人脸识别"); + + /** + * 类型 + */ + private final String value; + + /** + * 描述 + */ + private final String message; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/ConstructionTradeStateEnum.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/ConstructionTradeStateEnum.java new file mode 100644 index 0000000..52459a2 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/ConstructionTradeStateEnum.java @@ -0,0 +1,41 @@ +package com.yida.data.common.core.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 建行交易状态枚举 + * + * @author ZYJ + * @date 2023/6/20 + */ +@Getter +@AllArgsConstructor +public enum ConstructionTradeStateEnum { + + /** + * 建行交易状态枚举 + * 0  STATUS:失败 + * 1  STATUS:成功 + * 2  STATUS:待银行确认 + * 3  STATUS:已部分退款 + * 4  STATUS:已全额退款 + * 5  STATUS:待银行确认 + */ + TRADE_FAIL("0", "失败"), + TRADE_SUCCESS("1", "成功"), + WAIT_BANK_CONFIRM("2", "待银行确认"), + PARTIAL_REFUNDED("3", "已部分退款"), + REFUNDED("4", "已全额退款"), + WAIT_BANK_CONFIRM_OTHER("5", "待银行确认"); + + /** + * 状态值 + */ + private final String status; + + /** + * 描述 + */ + private final String message; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/FileDealStatusEnum.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/FileDealStatusEnum.java new file mode 100644 index 0000000..494fbaf --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/FileDealStatusEnum.java @@ -0,0 +1,32 @@ +package com.yida.data.common.core.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 文件处理状态枚举 + * + * @author ZYJ + * @date 2023/8/26 14:37 + */ +@Getter +@AllArgsConstructor +public enum FileDealStatusEnum { + + /** + * excel处理状态枚举 + */ + DEALING(0, "处理中"), + DEAL_SUCCESS(1, "处理成功"), + DEAL_FAIL(2, "处理失败"); + + /** + * 状态 + */ + private final Integer status; + + /** + * 描述 + */ + private final String message; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/GuideStepTypeEnum.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/GuideStepTypeEnum.java new file mode 100644 index 0000000..612d313 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/GuideStepTypeEnum.java @@ -0,0 +1,41 @@ +package com.yida.data.common.core.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 指南步骤类型枚举 + * + * @author ZYJ + * @date 2023/6/20 19:07 + */ +@Getter +@AllArgsConstructor +public enum GuideStepTypeEnum { + + /** + * 指南步骤类型枚举 + */ + EXAMINE_TYPE(2, "审核", true), + UPLOAD_FILE_TYPE(0, "上传文件", true), + PAY_TYPE(1, "缴费", false), + MATCH_FACE(3, "人脸对比", true), + NOTICE(4, "提示", false), + CLASS(5, "班级预分", true), + DORM(6, "宿舍预分", true); + + /** + * 类型 + */ + private final Integer type; + + /** + * 描述 + */ + private final String message; + + /** + * 是否需要审核 + */ + private final boolean examineFlag; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/IssuedTypeEnum.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/IssuedTypeEnum.java new file mode 100644 index 0000000..85a12e9 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/IssuedTypeEnum.java @@ -0,0 +1,31 @@ +package com.yida.data.common.core.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 人脸下发类型枚举 + * + * @author ZYJ + * @date 2023/9/28 11:17 + */ +@Getter +@AllArgsConstructor +public enum IssuedTypeEnum { + + /** + * 人脸下发类型枚举 + */ + FACE_GROUP(0, "人脸组下发"), + LEAVE_REQUEST(1, "请假下发"); + + /** + * 下发类型 + */ + private final Integer type; + + /** + * 下发描述 + */ + private final String message; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/MsgChannel.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/MsgChannel.java index 138ed4e..7766998 100644 --- a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/MsgChannel.java +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/MsgChannel.java @@ -6,8 +6,10 @@ import lombok.Getter; @Getter @AllArgsConstructor public enum MsgChannel { + MQTT("mqtt","mqtt(人脸设备)"), - ACTIVE("activeMq","active(人脸设备)"); + ACTIVE("activeMq","active(人脸设备)"), + WIFI("WIFI", "WIFI打卡"); private String value; private String name; diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/PayWay.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/PayWay.java index 8bb1995..57ea57b 100644 --- a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/PayWay.java +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/PayWay.java @@ -16,9 +16,11 @@ public enum PayWay { /** * 支付方式枚举 */ - WEIXIN("1", "微信"), + WEI_XIN("1", "微信"), ALIPAY("2", "支付宝"), - UNION("3", "银联"); + UNION("3", "银联"), + U_PAY("4", "收钱吧"), + CONSTRUCTION_PAY("5", "建行"); /** * 类型 diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/QywxAppTypeEnum.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/QywxAppTypeEnum.java new file mode 100644 index 0000000..fc311e5 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/QywxAppTypeEnum.java @@ -0,0 +1,31 @@ +package com.yida.data.common.core.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 企业微信应用类型枚举 + * + * @author ZYJ + * @date 2022/11/10 + */ +@Getter +@AllArgsConstructor +public enum QywxAppTypeEnum { + + /** + * 应用类型枚举 + */ + SELF_BUILT_APPLICATION_TYPE(0, "自建应用"), + SERVICE_PROVIDER_APPLICATION_TYPE(1, "服务商代开发应用"); + + /** + * 类型 + */ + private final Integer type; + + /** + * 描述 + */ + private final String message; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/QywxCallbackTypeEnum.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/QywxCallbackTypeEnum.java new file mode 100644 index 0000000..0a2d114 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/QywxCallbackTypeEnum.java @@ -0,0 +1,27 @@ +package com.yida.data.common.core.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 企业微信回调类型枚举 + * + * @author ZYJ + * @date 2023/10/27 16:33 + */ +@Getter +@AllArgsConstructor +public enum QywxCallbackTypeEnum { + + /** + * 企业微信回调类型枚举 + */ + POST("自开发回调"), + POST_NORMAL("代开发应用模板回调"), + POST_EVENT("代开发应用回调"); + + /** + * 描述 + */ + private final String message; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/RecordTypeEnum.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/RecordTypeEnum.java new file mode 100644 index 0000000..3327efd --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/RecordTypeEnum.java @@ -0,0 +1,24 @@ +package com.yida.data.common.core.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 通行记录类型枚举 + * + * @author ZYJ + * @date 2023/11/1 15:10 + */ +@Getter +@AllArgsConstructor +public enum RecordTypeEnum { + + /** + * 通行记录类型枚举 + */ + PANEL_MACHINE("0", "面板机"), + WIFI("1", "WIFI打卡"); + + private final String type; + private final String name; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/RegistrationStatusEnum.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/RegistrationStatusEnum.java new file mode 100644 index 0000000..e9d8838 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/RegistrationStatusEnum.java @@ -0,0 +1,31 @@ +package com.yida.data.common.core.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 报到状态 + * + * @author ZYJ + * @date 2023/8/28 11:16 + */ +@Getter +@AllArgsConstructor +public enum RegistrationStatusEnum { + + /** + * 报到状态 + */ + NOT_REGISTRATION(0, "未报到"), + REGISTRATION_SUCCESS(1, "报到成功(全部步骤通过)"); + + /** + * 状态 + */ + private final Integer status; + + /** + * 描述 + */ + private final String message; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/SchoolFunctionCode.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/SchoolFunctionCode.java new file mode 100644 index 0000000..03ecd6a --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/SchoolFunctionCode.java @@ -0,0 +1,36 @@ +package com.yida.data.common.core.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 考勤结果状态类别 + */ +@Getter +@AllArgsConstructor +public enum SchoolFunctionCode { + + + /** + * 教师考勤 + */ + ATTENDANCE_TEACHER("attendance_teacher"), + + /** + * 上学考勤 + */ + ATTENDANCE_CLASS("attendance_class"), + + /** + * 宿舍考勤 + */ + ATTENDANCE_DORMITORY("attendance_dormitory"), + + /** + * 门禁 + */ + ACCESS("Access"); + + + private final String name; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/StaffAttendanceResultEnum.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/StaffAttendanceResultEnum.java new file mode 100644 index 0000000..2b1a16e --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/StaffAttendanceResultEnum.java @@ -0,0 +1,65 @@ +package com.yida.data.common.core.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 考勤结果状态类别 + */ +@Getter +@AllArgsConstructor +public enum StaffAttendanceResultEnum { + //考勤结果,0-正常,1-迟到,2-早退,3-旷工,4-迟到早退,5-上班未在打卡时间段,6-下班未在打卡时间段,7-上班未在打卡时间段|早退,8-上班迟到|下班未打卡" + /** + * 正常状态 + */ + NORMAL(0, "正常"), + + /** + * 异常状态 + */ + LATE(1, "迟到"), + + /** + * 走读-早退 + */ + LEAVE(2, "早退"), + + /** + * 旷工 + */ + NOTARRIVE(3, "旷工"), + + /** + * 旷工 + */ + LATE_LEAVE(4, "迟到早退"), + + /** + * 上班未在打卡时间段 + */ + START_NOT_IN(5, "上班未打卡"), + + /** + * 上班未在打卡时间段 + */ + END_NOT_IN(6, "下班未打卡"), + + /** + * 上班未在打卡时间段|早退 + */ + START_NOT_IN_LEAVE(7, "上班未打卡|下班早退"), + + /** + * 上班未在打卡时间段|早退 + */ + LATE_START_NOT(8, "上班迟到|下班未打卡"), + + /** + * 未打卡|早退 + */ + NOT_ATTENDANCE(9, "未打卡"); + + private final Integer value; + private final String name; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/UPayNotifyResultEnum.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/UPayNotifyResultEnum.java new file mode 100644 index 0000000..44b61c3 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/UPayNotifyResultEnum.java @@ -0,0 +1,31 @@ +package com.yida.data.common.core.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 收钱吧通知返回结果枚举 + * + * @author ZYJ + * @date 2023/3/31 + */ +@Getter +@AllArgsConstructor +public enum UPayNotifyResultEnum { + + /** + * 收钱吧通知返回结果枚举 + */ + SUCCESS_STATUS("success", "处理成功"), + FAILED_STATUS("failed", "处理失败"); + + /** + * 值 + */ + private final String value; + + /** + * 描述 + */ + private final String message; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/UPayTradeStateEnum.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/UPayTradeStateEnum.java new file mode 100644 index 0000000..4e9110d --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/UPayTradeStateEnum.java @@ -0,0 +1,53 @@ +package com.yida.data.common.core.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 收钱吧交易状态枚举 + * + * @author ZYJ + * @date 2023/3/24 + */ +@Getter +@AllArgsConstructor +public enum UPayTradeStateEnum { + + /** + * 收钱吧交易状态枚举 + * CREATED 订单已创建/支付中 + * PAID 订单支付成功 + * PAY_CANCELED 支付失败并且已经成功充正 + * PAY_ERROR 支付异常,不确定是否已经成功充正,请联系收钱吧客服确认是否支付成功 + * REFUNDED 已成功全额退款 + * PARTIAL_REFUNDED 已成功部分退款 + * REFUND_INPROGRESS 退款进行中 + * REFUND_ERROR 退款异常并且不确定第三方支付通道的最终退款状态 + * CANCELED 客户端发起的撤单已成功 + * CANCEL_ERROR 客户端发起的撤单异常并且不确定第三方支付通道的最终状态 + * CANCEL_INPROGRESS 撤单进行中 + * INVALID_STATUS_CODE 无效的状态码 + */ + CREATED("CREATED", "订单已创建/支付中"), + PAID("PAID", "订单支付成功"), + PAY_CANCELED("PAY_CANCELED", "支付失败并且已经成功充正"), + PAY_ERROR("PAY_ERROR", "支付异常,不确定是否已经成功充正,请联系收钱吧客服确认是否支付成功"), + REFUNDED("REFUNDED", "已成功全额退款"), + PARTIAL_REFUNDED("PARTIAL_REFUNDED", "已成功部分退款"), + REFUND_IN_PROGRESS("REFUND_INPROGRESS", "退款进行中"), + REFUND_ERROR("REFUND_ERROR", "退款异常并且不确定第三方支付通道的最终退款状态"), + CANCELED("CANCELED", "客户端发起的撤单已成功"), + CANCEL_ERROR("CANCEL_ERROR", "客户端发起的撤单异常并且不确定第三方支付通道的最终状态"), + CANCEL_IN_PROGRESS("CANCEL_INPROGRESS", "撤单进行中"), + INVALID_STATUS_CODE("INVALID_STATUS_CODE", "无效的状态码"),; + + /** + * 状态值 + */ + private final String status; + + /** + * 描述 + */ + private final String message; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/UnionPayTypeEnum.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/UnionPayTypeEnum.java index 2ad88e7..1d149c3 100644 --- a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/UnionPayTypeEnum.java +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/UnionPayTypeEnum.java @@ -17,7 +17,7 @@ public enum UnionPayTypeEnum { /** * 银联云闪付支付类型枚举 */ - WX_H5_TYPE(0, "微信H5", UnionPayConstant.WX_H5_PAY), + WX_H5_TYPE(0, "微信H5", UnionPayConstant.UNION_H5_PAY), WX_TO_MINI_H5_TYPE(1, "微信H5转小程序", UnionPayConstant.WX_TO_MINI_H5_PAY), ALI_H5_TYPE(2, "支付宝H5", UnionPayConstant.ALI_H5_PAY), UNION_H5_TYPE(3, "银联H5", UnionPayConstant.UNION_H5_PAY); diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/UserTypeEnum.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/UserTypeEnum.java new file mode 100644 index 0000000..3c256f9 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/UserTypeEnum.java @@ -0,0 +1,31 @@ +package com.yida.data.common.core.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 用户类型枚举 + * + * @author ZYJ + * @date 2023/6/28 + */ +@Getter +@AllArgsConstructor +public enum UserTypeEnum { + + /** + * 用户类型枚举 + */ + STAFF_USER_TYPE(0, "教职工"), + PARENT_USER_TYPE(1, "家长"); + + /** + * 类型 + */ + private final Integer type; + + /** + * 描述 + */ + private final String message; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/attendance/AttendanceModeTypeEnum.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/attendance/AttendanceModeTypeEnum.java new file mode 100644 index 0000000..49b1841 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/attendance/AttendanceModeTypeEnum.java @@ -0,0 +1,24 @@ +package com.yida.data.common.core.enums.attendance; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 考勤结果状态类别 + */ +@Getter +@AllArgsConstructor +public enum AttendanceModeTypeEnum { + /** + * 固定上下班时间模式 + */ + FIX(0, "固定上下班时间模式"), + + /** + * 自由打卡模式 + */ + FREE(1, "自由打卡模式"); + + private final Integer value; + private final String name; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/attendance/AttendanceNextDayEnum.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/attendance/AttendanceNextDayEnum.java new file mode 100644 index 0000000..860421c --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/attendance/AttendanceNextDayEnum.java @@ -0,0 +1,24 @@ +package com.yida.data.common.core.enums.attendance; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 考勤结果状态类别 + */ +@Getter +@AllArgsConstructor +public enum AttendanceNextDayEnum { + /** + * 正常状态 + */ + YES(1, "是"), + + /** + * 异常状态 + */ + NO(0, "否"); + + private final Integer value; + private final String name; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/attendance/AttendanceReportTypeEnum.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/attendance/AttendanceReportTypeEnum.java new file mode 100644 index 0000000..7234beb --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/attendance/AttendanceReportTypeEnum.java @@ -0,0 +1,24 @@ +package com.yida.data.common.core.enums.attendance; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 考勤报告类别 + */ +@Getter +@AllArgsConstructor +public enum AttendanceReportTypeEnum { + /** + * 日报 + */ + DAY_REPORT(1, "日报"), + + /** + * 自由打卡模式 + */ + LATE_REPORT(2, "迟到提醒"); + + private final Integer value; + private final String name; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/attendance/AttendanceResultEnum.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/attendance/AttendanceResultEnum.java new file mode 100644 index 0000000..20f3a09 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/attendance/AttendanceResultEnum.java @@ -0,0 +1,45 @@ +package com.yida.data.common.core.enums.attendance; + +import cn.hutool.core.util.ObjectUtil; +import com.yida.data.common.core.enums.leave.LeaveRequestTypeEnum; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 考勤结果状态类别 + */ +@Getter +@AllArgsConstructor +public enum AttendanceResultEnum { + /** + * 正常状态 + */ + NORMAL(0, "正常"), + + /** + * 异常状态 + */ + ABNORMAL(1, "异常"), + + LATE(2, "迟到"), + LEAVE(3, "早退"), + LATE_LEAVE(4, "迟到+早退"), + OUT(5, "旷工"), + MISS(6, "缺卡"), + LATE_DORM(7, "晚归"), + AB_LATE_DORM(8, "异常晚归"); + + private final Integer value; + private final String name; + + + public static String getName(Integer type) { + for (AttendanceResultEnum typeEnum : AttendanceResultEnum.values()) { + if (ObjectUtil.equals(typeEnum.value, type)) { + return typeEnum.name; + } + } + return null; + } + +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/attendance/AttendanceStrategyTypeEnum.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/attendance/AttendanceStrategyTypeEnum.java new file mode 100644 index 0000000..97e4c9e --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/attendance/AttendanceStrategyTypeEnum.java @@ -0,0 +1,17 @@ +package com.yida.data.common.core.enums.attendance; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 考勤推送类型 + */ +@Getter +@AllArgsConstructor +public enum AttendanceStrategyTypeEnum { + STAFF_STAFF(0, "教职工考勤推送"), + STUDENT_STAFF(1, "学生考勤推送"), + STUDENT_PARENT(2, "家长提醒"); + private final Integer value; + private final String name; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/attendance/AttendanceTypeEnum.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/attendance/AttendanceTypeEnum.java new file mode 100644 index 0000000..5dbc29f --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/attendance/AttendanceTypeEnum.java @@ -0,0 +1,24 @@ +package com.yida.data.common.core.enums.attendance; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 考勤结果状态类别 + */ +@Getter +@AllArgsConstructor +public enum AttendanceTypeEnum { + /** + * 上班 + */ + WORK_ON(0, "上班"), + + /** + * 下班 + */ + WORK_OFF(1, "下班"); + + private final Integer value; + private final String name; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/attendance/AttendanceUserTypeEnum.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/attendance/AttendanceUserTypeEnum.java new file mode 100644 index 0000000..835c705 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/attendance/AttendanceUserTypeEnum.java @@ -0,0 +1,29 @@ +package com.yida.data.common.core.enums.attendance; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 考勤规则类型 + */ +@Getter +@AllArgsConstructor +public enum AttendanceUserTypeEnum { + /** + * 教职工打卡 + */ + STAFF(0, "教职工打卡"), + + /** + * 学生上学考勤 + */ + STUDENT_TO_SCHOOL(1, "学生上学考勤"), + + /** + * 学生宿舍考勤 + */ + STUDENT_TO_DORM(2, "学生宿舍考勤"); + + private final Integer value; + private final String name; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/attendance/AttendanceWifiStatusEnum.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/attendance/AttendanceWifiStatusEnum.java new file mode 100644 index 0000000..854326c --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/attendance/AttendanceWifiStatusEnum.java @@ -0,0 +1,23 @@ +package com.yida.data.common.core.enums.attendance; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 考勤结果状态类别 + */ +@Getter +@AllArgsConstructor +public enum AttendanceWifiStatusEnum { + + WORK_ON(1, "签到"), + WORK_OFF(2, "签退"), + REST(3, "休息不用打卡"), + TIME_OUT(4, "不在打卡时间段内"), + RULE_NO(5, "无打卡规则"), + RANGE_OUT(6, "不在打卡范围内"), + NON_MEMBER(7, "无权限,非智慧校园用户"); + + private final Integer value; + private final String name; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/leave/ApprovalResultEnum.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/leave/ApprovalResultEnum.java new file mode 100644 index 0000000..8e25060 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/leave/ApprovalResultEnum.java @@ -0,0 +1,44 @@ +package com.yida.data.common.core.enums.leave; + +import cn.hutool.core.util.ObjectUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 审核结果枚举 + * + * @author ZYJ + * @date 2023/11/28 + */ +@Getter +@AllArgsConstructor +public enum ApprovalResultEnum { + + /** + * 0-待审核,1-审核通过,2-审核不通过,3-审核中 + */ + AUDIT(0, "待审核"), + AUDIT_PASS(1, "审核通过"), + AUDIT_NO(2, "审核不通过"), + AUDIT_ING(3, "审核中"); + + /** + * 类型 + */ + private final Integer result; + + /** + * 描述 + */ + private final String dec; + + + public static String getDec(Integer type) { + for (ApprovalResultEnum typeEnum : ApprovalResultEnum.values()) { + if (ObjectUtil.equals(typeEnum.result, type)) { + return typeEnum.dec; + } + } + return null; + } +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/leave/AuditModeEnum.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/leave/AuditModeEnum.java new file mode 100644 index 0000000..b4f2183 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/leave/AuditModeEnum.java @@ -0,0 +1,42 @@ +package com.yida.data.common.core.enums.leave; + +import cn.hutool.core.util.ObjectUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 审核类型枚举 + * + * @author ZYJ + * @date 2023/11/30 14:43 + */ +@Getter +@AllArgsConstructor +public enum AuditModeEnum { + + /** + * 0会审,1或审 + */ + OR_AUDIT(1, "或审"), + AND_AUDIT(0, "会审"); + + /** + * 类型 + */ + private final Integer mode; + + /** + * 描述 + */ + private final String value; + + + public static String getName(Integer type) { + for (AuditModeEnum typeEnum : AuditModeEnum.values()) { + if (ObjectUtil.equals(typeEnum.mode, type)) { + return typeEnum.value; + } + } + return null; + } +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/leave/LeaveRequestTypeEnum.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/leave/LeaveRequestTypeEnum.java new file mode 100644 index 0000000..84e3cae --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/leave/LeaveRequestTypeEnum.java @@ -0,0 +1,41 @@ +package com.yida.data.common.core.enums.leave; + +import cn.hutool.core.util.ObjectUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum LeaveRequestTypeEnum { + /** + * 1:病假,2:事假,0:其他,3年假,4调休假,5婚嫁,6产假,7陪产假 + */ + OTHER(1, "其他"), + SICK(1, "病假"), + ABSENCE(2, "事假"), + YEAR(3, "年假"), + COMP(4, "调休假"), + MAR(5, "婚嫁"), + MATER(6, "产假"), + PATER(7, "陪产假"); + + /** + * 类型 + */ + private final Integer type; + + /** + * 描述 + */ + private final String name; + + + public static String getName(Integer type) { + for (LeaveRequestTypeEnum typeEnum : LeaveRequestTypeEnum.values()) { + if (ObjectUtil.equals(typeEnum.type, type)) { + return typeEnum.name; + } + } + return null; + } +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/school/DeptAppTypeEnum.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/school/DeptAppTypeEnum.java new file mode 100644 index 0000000..a743a43 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/school/DeptAppTypeEnum.java @@ -0,0 +1,22 @@ +package com.yida.data.common.core.enums.school; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 主页小程序类型枚举 + */ +@Getter +@AllArgsConstructor +public enum DeptAppTypeEnum { + + SYS(0, "系统应用"), + + OTHER(1, "第三方应用"), + + WX(2, "微信小程序"); + + private final Integer type; + + private final String name; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/school/FunctionConfigCode.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/school/FunctionConfigCode.java new file mode 100644 index 0000000..51d8eab --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/school/FunctionConfigCode.java @@ -0,0 +1,24 @@ +package com.yida.data.common.core.enums.school; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 差异化功能点编码枚举 + */ +@Getter +@AllArgsConstructor +public enum FunctionConfigCode { + + /** + * WiFi打卡,会员使用 + */ + ATTENDANCE_WIFI("attendance_wifi", "wifi打卡"), + + /** + * 门禁进去推送记录,会员使用 + */ + ATTENDANCE_ACCESS("attendance_access", "门禁"); + private final String code; + private final String name; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/system/MenuShowType.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/system/MenuShowType.java new file mode 100644 index 0000000..31d686b --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/enums/system/MenuShowType.java @@ -0,0 +1,28 @@ +package com.yida.data.common.core.enums.system; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 菜单显示类型枚举 + */ +@Getter +@AllArgsConstructor +public enum MenuShowType { + + /** + * 菜单显示类型枚举 + */ + ADD_TYPE(0, "合并"), + REMOVE_TYPE(1, "删除"); + + /** + * 类型 + */ + private final Integer type; + + /** + * 描述 + */ + private final String message; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/file/IExportExcelClient.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/file/IExportExcelClient.java new file mode 100644 index 0000000..48b63fd --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/file/IExportExcelClient.java @@ -0,0 +1,31 @@ +package com.yida.data.common.core.file; + +import com.yida.data.common.core.file.common.export.SelectExportData; + +/** + * 导出excel默认interface + * + * @author ZYJ + * @date 2023/12/11 + */ +public interface IExportExcelClient { + + /** + * 导出excel数据 + * + * @param t 导出文件查询类 + * @author ZYJ + * @date 2023/12/11 11:10 + */ + void exportExcelData(T t); + + /** + * 查询导出进度 + * + * @param key 导出唯一标识 + * @return java.lang.Object + * @author ZYJ + * @date 2023/12/12 14:06 + */ + Object selectExportInfo(String key); +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/file/IExportLargeClient.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/file/IExportLargeClient.java new file mode 100644 index 0000000..e62eb96 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/file/IExportLargeClient.java @@ -0,0 +1,46 @@ +package com.yida.data.common.core.file; + +import com.yida.data.common.core.file.common.DownloadFileChunk; +import com.yida.data.common.core.file.common.export.SelectExportData; + +import javax.servlet.http.HttpServletResponse; + +/** + * 导出大文件默认interface + * 进度条类型 + * zip文件 + * + * @author ZYJ + * @date 2023/10/18 15:56 + */ +public interface IExportLargeClient { + + /** + * 导出大文件数据 + * + * @param t 导出文件查询类 + * @author ZYJ + * @date 2023/10/20 11:10 + */ + void exportLargeData(T t); + + /** + * 查询导出进度 + * + * @param key 导出唯一标识 + * @return java.lang.Object + * @author ZYJ + * @date 2023/12/12 14:06 + */ + Object selectExportInfo(String key); + + /** + * 分片下载 + * + * @param dto 分片下载请求类 + * @param response response返回流信息 + * @author ZYJ + * @date 2023/10/19 16:41 + */ + void downLoadChunk(DownloadFileChunk dto, HttpServletResponse response); +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/file/common/DownloadFileChunk.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/file/common/DownloadFileChunk.java new file mode 100644 index 0000000..cb46266 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/file/common/DownloadFileChunk.java @@ -0,0 +1,36 @@ +package com.yida.data.common.core.file.common; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 分片下载请求类 + * + * @author ZYJ + * @date 2023-06-12 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DownloadFileChunk implements Serializable { + + private static final long serialVersionUID = -7770973043532024287L; + + @ApiModelProperty("本次操作标识") + private String key; + + @ApiModelProperty("分片下标(下载的第几块)") + private Integer index; + + @ApiModelProperty("总分片数") + private Integer chunkTotal; + + @ApiModelProperty("分片大小") + private Integer chunkSize; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/file/common/export/ExportExcelData.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/file/common/export/ExportExcelData.java new file mode 100644 index 0000000..65711b1 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/file/common/export/ExportExcelData.java @@ -0,0 +1,47 @@ +package com.yida.data.common.core.file.common.export; + +import com.yida.data.common.core.enums.FileDealStatusEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 导出excel进度信息实体类 + * 普通下载(小文件下载) + * + * @author ZYJ + * @date 2023-06-12 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ExportExcelData implements Serializable { + + private static final long serialVersionUID = 3576934413070680889L; + + @ApiModelProperty("本次操作标识") + private String key; + + /** + * {@link FileDealStatusEnum} + */ + @ApiModelProperty("导出状态") + private Integer exportStatus; + + @ApiModelProperty("文件名称") + private String fileName; + + @ApiModelProperty("处理的总数量") + private Integer total; + + @ApiModelProperty("完成的数量") + private Integer finish; + + @ApiModelProperty("excel文件路径") + private String filePath; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/file/common/export/ExportLargeData.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/file/common/export/ExportLargeData.java new file mode 100644 index 0000000..3d5e756 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/file/common/export/ExportLargeData.java @@ -0,0 +1,53 @@ +package com.yida.data.common.core.file.common.export; + +import com.yida.data.common.core.enums.FileDealStatusEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 导出zip文件进度信息实体类 + * 分片下载(大文件下载) + * + * @author ZYJ + * @date 2023/10/20 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ExportLargeData implements Serializable { + + private static final long serialVersionUID = 2826753566888775932L; + + @ApiModelProperty("本次操作标识") + private String key; + + /** + * {@link FileDealStatusEnum} + */ + @ApiModelProperty("导出状态") + private Integer exportStatus; + + @ApiModelProperty("文件名称") + private String fileName; + + @ApiModelProperty("文件大小. 单位:bytes") + private Long fileSize; + + @ApiModelProperty("处理的总数量") + private Integer total; + + @ApiModelProperty("完成的数量") + private Integer finish; + + @ApiModelProperty("失败的数量") + private Integer error; + + @ApiModelProperty("信息导出失败的文件地址") + private String errorFilePath; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/file/common/export/SelectExportData.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/file/common/export/SelectExportData.java new file mode 100644 index 0000000..c2bf50b --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/file/common/export/SelectExportData.java @@ -0,0 +1,30 @@ +package com.yida.data.common.core.file.common.export; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +import java.io.Serializable; + +/** + * 导出文件查询类 + * + * @author ZYJ + * @date 2023/10/19 + */ +@Data +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +public class SelectExportData implements Serializable { + + private static final long serialVersionUID = 3164964446820550103L; + + @ApiModelProperty("本次操作标识") + private String key; + + @ApiModelProperty("本次操作模块名称") + private String functionName; +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/handler/BaseExceptionHandler.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/handler/BaseExceptionHandler.java index 1f0d75f..cc5752b 100644 --- a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/handler/BaseExceptionHandler.java +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/handler/BaseExceptionHandler.java @@ -5,7 +5,8 @@ import com.yida.data.common.core.entity.constant.StringConstant; import com.yida.data.common.core.exception.FebsException; import com.yida.data.common.core.exception.FileDownloadException; import com.yida.data.common.core.utils.FebsUtil; - +import feign.FeignException; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.http.HttpStatus; import org.springframework.security.access.AccessDeniedException; @@ -18,15 +19,11 @@ import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestControllerAdvice; -import java.util.List; -import java.util.Set; - import javax.validation.ConstraintViolation; import javax.validation.ConstraintViolationException; import javax.validation.Path; - -import feign.FeignException; -import lombok.extern.slf4j.Slf4j; +import java.util.List; +import java.util.Set; /** * @author MrBird @@ -138,7 +135,7 @@ public class BaseExceptionHandler { @ExceptionHandler(value = HttpRequestMethodNotSupportedException.class) @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) public FebsResponse handleHttpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException e) { - log.error("error:{},{}", e.getMessage(), e.getStackTrace()); + log.error("error: ", e); String message = "该方法不支持" + StringUtils.substringBetween(e.getMessage(), "'", "'") + "请求方法"; log.error(message); return new FebsResponse().message(message); diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/AppUtil.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/AppUtil.java index 2e9e8b7..7dc3de6 100644 --- a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/AppUtil.java +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/AppUtil.java @@ -178,55 +178,25 @@ public class AppUtil { } } - /** - * 推送app消息 - * - * @param appNotice 消息配置类 - * @param app app信息 - * @author ZYJ - * @date 2023/7/14 16:04 - */ - public static void sendPushMsg(AppNotice appNotice, EduYidaApp app) { - StringBuilder url = new StringBuilder(); - AppNotice appNotice1 = new AppNotice(); - BeanUtils.copyProperties(appNotice, appNotice1); - appNotice1.setMsgList(null); - url.append(app.getAppUrl()).append(YidaAppConstant.JIGUANG_SEND_MSG); -// url.append("http://10.143.132.192:8082/push/sendMulti").append(YidaAppConstant.JIGUANG_SEND_MSG); - String body = JSONUtil.toJsonStr(appNotice1); - // 1s后超时 不保证收到推送 - try { - String res = HttpUtil.post(url.toString(), body, 1000); - log.info("app消息推送,res:[{}],params:[{}]", res, body); - } catch (Exception e) { - log.error("app消息推送超时,url:[{}],params:[{}]", url, body); - } - } /** * 发送稿件 */ public static String publishManuscript(EduSchoolManuscript manuscript, EduYidaApp yidaApp, String columnId, String yidaUserId) { - JSONObject body = JSONUtil.createObj() - .set("title", manuscript.getTitle()) - .set("fileType", manuscript.getCoverType()) - .set("type", 1) - .set("isPush", 1) - .set("isSub", 1) - .set("isPublish", 1) - .set("from", 2) - .set("isTop", 0) - .set("titleFilePath", manuscript.getCoverUrl()) - .set("areaId", yidaApp.getAppAreaId()) - .set("createById", yidaUserId); - // 判断稿件id - if (StrUtil.isNotBlank(manuscript.getYidaAppMunascriptId())) { - body.set("id", manuscript.getYidaAppMunascriptId()); - body.set("isNewRecord", false); - } else { - body.set("isNewRecord", true); - } + JSONObject body = new JSONObject() {{ + set("title", manuscript.getTitle()); + set("fileType", manuscript.getCoverType()); + set("type", 1); + set("isPush", 1); + set("isSub", 1); + set("isPublish", 1); + set("from", 2); + set("isTop", 0); + set("titleFilePath", manuscript.getCoverUrl()); + set("areaId", yidaApp.getAppAreaId()); + set("createById", yidaUserId); + }}; // 是否发布到栏目 if (StrUtil.isNotBlank(columnId)) { body.set("columnId", columnId); @@ -237,9 +207,9 @@ public class AppUtil { if (StrUtil.isNotBlank(manuscript.getContentUrl())) { body.set("contenUrl", manuscript.getContentUrl()); } -// if (StrUtil.isNotBlank(manuscript.getYidaAppMunascriptId())) { -// body.set("id", manuscript.getYidaAppMunascriptId()); -// } + if (StrUtil.isNotBlank(manuscript.getYidaAppMunascriptId())) { + body.set("id", manuscript.getYidaAppMunascriptId()); + } String res = HttpUtil.post(yidaApp.getAppUrl() + YidaAppConstant.MANUSCRIPT_SAVE, body); JSONObject resJson = JSONUtil.parseObj(res); log.info("易达发送稿件,res:[{}],params:[{}]", res, body); @@ -288,16 +258,10 @@ public class AppUtil { /** * 删除稿件 */ - public static void manuscriptDel(List ids, EduYidaApp yidaApp, String userId) { - if (CollUtil.isEmpty(ids)) { - log.info("易达删除稿件IDS为空"); - return; - } + public static void manuscriptDel(List ids, EduYidaApp yidaApp) { JSONObject body = new JSONObject() {{ set("ids", CollUtil.join(ids, ",")); - set("operateUserId", userId); }}; - log.info("易达删除稿件:params:{}", body); HttpUtil.post(yidaApp.getAppUrl() + YidaAppConstant.MANUSCRIPT_DEL, body); } diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/BaiDuUtil.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/BaiDuUtil.java new file mode 100644 index 0000000..5f46390 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/BaiDuUtil.java @@ -0,0 +1,131 @@ +package com.yida.data.common.core.utils; + +import cn.hutool.core.util.CharsetUtil; +import cn.hutool.core.util.NumberUtil; +import cn.hutool.json.JSONUtil; +import com.baidu.aip.face.AipFace; +import com.baidu.aip.face.MatchRequest; +import com.yida.data.common.core.entity.system.BaiduApiConfig; +import com.yida.data.common.core.exception.FebsException; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.json.JSONException; +import org.json.JSONObject; + +import java.math.BigDecimal; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +/** + * 百度api + * + * @author ZYJ + * @date 2023/6/20 19:31 + */ +@Slf4j +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class BaiDuUtil { + + /** + * 百度api返回码 + */ + public static final String ERR_CODE = "error_code"; + + /** + * 百度api对返回码的文本描述内容 + */ + public static final String ERR_MESSAGE = "error_msg"; + + /** + * 百度api接口成功状态码 + */ + public static final String SUCCESS_CODE = "0"; + + /** + * 人脸对比 返回人脸相似度分数 + * + * @param config 百度api配置信息 + * @param url 原始图片url + * @param base64 对比图片base64 + * @return java.lang.String + * @author ZYJ + * @date 2023/6/21 10:31 + */ + public static String faceMatch(BaiduApiConfig config, String url, String base64) { + // 初始化一个AipFace + AipFace client = new AipFace(config.getAppId(), config.getApiKey(), config.getSecretKey()); + // 原始图片url + MatchRequest originalRequest = new MatchRequest(url, "URL"); + /* + 活体检测控制 + NONE: 不进行控制 + LOW:较低的活体要求(高通过率 低攻击拒绝率) + NORMAL: 一般的活体要求(平衡的攻击拒绝率, 通过率) + HIGH: 较高的活体要求(高攻击拒绝率 低通过率) + */ + originalRequest.setLivenessControl("NONE"); + // 对比图片base64 + MatchRequest contrastRequest = new MatchRequest(new String(base64.getBytes(), StandardCharsets.UTF_8), "BASE64"); + contrastRequest.setLivenessControl("NONE"); + ArrayList requests = new ArrayList<>(); + requests.add(originalRequest); + requests.add(contrastRequest); + JSONObject result = client.match(requests); + log.info("人脸对比信息, 返回值: {}", result.toString()); + cn.hutool.json.JSONObject response = JSONUtil.parseObj(result.toString()); + log.info("人脸对比信息: {}", response); + + if (!SUCCESS_CODE.equals(response.containsKey(ERR_CODE) ? response.get(ERR_CODE).toString() : null)) { + log.error("人脸对比失败,code:{},msg:{},params:{}", response.get(ERR_CODE), response.get(ERR_MESSAGE), url); + throw new FebsException("人脸对比失败"); + } + return response.getJSONObject("result").getStr("score"); + } + + + public static String faceMatchURl(BaiduApiConfig config, String url, String url2) { + // 初始化一个AipFace + AipFace client = new AipFace(config.getAppId(), config.getApiKey(), config.getSecretKey()); + // 原始图片url + MatchRequest originalRequest = new MatchRequest(url, "URL"); + /* + 活体检测控制 + NONE: 不进行控制 + LOW:较低的活体要求(高通过率 低攻击拒绝率) + NORMAL: 一般的活体要求(平衡的攻击拒绝率, 通过率) + HIGH: 较高的活体要求(高攻击拒绝率 低通过率) + */ + originalRequest.setLivenessControl("NONE"); + // 对比图片base64 + MatchRequest contrastRequest = new MatchRequest(url2, "URL"); + contrastRequest.setLivenessControl("NONE"); + ArrayList requests = new ArrayList<>(); + requests.add(originalRequest); + requests.add(contrastRequest); + JSONObject result = client.match(requests); + log.info("人脸对比信息, 返回值: {}", result.toString()); + cn.hutool.json.JSONObject response = JSONUtil.parseObj(result.toString()); + log.info("人脸对比信息: {}", response); + + if (!SUCCESS_CODE.equals(response.containsKey(ERR_CODE) ? response.get(ERR_CODE).toString() : null)) { + log.error("人脸对比失败,code:{},msg:{},params:{}", response.get(ERR_CODE), response.get(ERR_MESSAGE), url); + throw new FebsException("人脸对比失败"); + } + return response.getJSONObject("result").getStr("score"); + } + + public static void main(String[] args) { + BaiduApiConfig config = new BaiduApiConfig(); + config.setAppId("35081632"); + config.setApiKey("BjKb3C1UbOfFq7Mhd7xfZi6I"); + config.setSecretKey("L7XCtinZl1o3CeX7xBb2of8DnhVhjvfo"); + + String url = "http://zbz.yd-data.com:8864/pic/other/20231118/b12b0da7cde14459b1244d1b7406afa4.jpg"; + String url2 = "http://zbz.yd-data.com:8864/pic/other/20231130/8feab7e881544d25892a3b049a0a2387.jpg"; + + faceMatchURl(config, url, url2); + } +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/ConstructionPayUtil.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/ConstructionPayUtil.java new file mode 100644 index 0000000..644b774 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/ConstructionPayUtil.java @@ -0,0 +1,322 @@ +package com.yida.data.common.core.utils; + +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.net.URLDecoder; +import cn.hutool.core.util.CharsetUtil; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.core.util.XmlUtil; +import cn.hutool.crypto.digest.DigestUtil; +import cn.hutool.http.HttpUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.google.common.base.Joiner; +import com.google.common.collect.Maps; +import com.yida.data.common.core.common.ResultMsgType; +import com.yida.data.common.core.entity.constant.ConstructionPayConstant; +import com.yida.data.common.core.entity.pay.ConstructionPayOrder; +import com.yida.data.common.core.entity.smart.ConstructionPayNotifyDTO; +import com.yida.data.common.core.entity.system.ConstructionPayConfig; +import com.yida.data.common.core.exception.FebsException; +import com.yida.data.common.core.utils.construction.RSASig; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import java.io.UnsupportedEncodingException; +import java.math.BigDecimal; +import java.util.Date; +import java.util.Map; + +/** + * 建设银行二维码支付工具类 + * + * @author ZYJ + * @date 2023/6/19 15:10 + */ +@Slf4j +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class ConstructionPayUtil { + + /** + * 二维码下单 + * + * @param config 建行学校信息配置 + * @param payOrder 建行支付订单类 + * @return java.lang.String + * @author ZYJ + * @date 2023/6/20 11:18 + */ + public static String getQrPayUrl(ConstructionPayConfig config, ConstructionPayOrder payOrder) { + // 封装参数 + Map map = Maps.newLinkedHashMap(); + // 商户代码 + map.put("MERCHANTID", config.getMerchantId()); + // 商户柜台代码 + map.put("POSID", config.getPosId()); + // 分行代码 + map.put("BRANCHID", config.getBranchId()); + // 订单号 + map.put("ORDERID", payOrder.getOrderNo()); + // 支付金额. 单位: 元 + map.put("PAYMENT", payOrder.getPayMoney()); + // 币种. 缺省为 01-人民币(只支持人民币支付) + map.put("CURCODE", "01"); + // 交易码 + map.put("TXCODE", ConstructionPayConstant.QR_PAY_CODE); + map.put("REMARK1", ""); + map.put("REMARK2", ""); + // H5支付 + map.put("RETURNTYPE", "3"); + // 订单超时时间. yyyyMMddHHmmss + map.put("TIMEOUT", DateUtil.format(DateUtil.offsetMinute(payOrder.getOrderTime(), 15), DatePattern.PURE_DATETIME_PATTERN)); + // 加密串 + String paramsStr = Joiner.on("&").withKeyValueSeparator("=").join(map); + String md5Str = paramsStr + "&PUB=" + config.getPublicKey().substring(config.getPublicKey().length() - 30); + log.info("加密串: {}", md5Str); + // MD5加密 + String md5 = DigestUtil.md5Hex(md5Str.getBytes()); + paramsStr = paramsStr + "&MAC=" + md5; + + String s = HttpUtil.get(ConstructionPayConstant.QR_PAY_URL + "&" + paramsStr); + log.info("H5接口返回值: {}", s); + // 接口 + JSONObject response = JSONUtil.parseObj(s); + log.info("建行二维码下单请求参数: {}, 返回值: {}", map, response); + if (!response.containsKey(ConstructionPayConstant.SUCCESS_KEY) || + !ConstructionPayConstant.SUCCESS_CODE.equals(response.getStr(ConstructionPayConstant.SUCCESS_KEY))) { + log.error("建行二维码下单失败"); + throw new FebsException(ResultMsgType.ORDER_FAIL.getValue()); + } + // 获取真实支付地址 + JSONObject realResponse = JSONUtil.parseObj(HttpUtil.get(response.getStr(ConstructionPayConstant.PAY_URL))); + log.info("获取建行二维码支付实际地址返回值: {}", realResponse); + if (!realResponse.containsKey(ConstructionPayConstant.SUCCESS_KEY) || + !ConstructionPayConstant.SUCCESS_CODE.equals(realResponse.getStr(ConstructionPayConstant.SUCCESS_KEY))) { + log.error("获取建行二维码支付实际地址失败"); + throw new FebsException(ResultMsgType.ORDER_FAIL.getValue()); + } + return URLDecoder.decode(realResponse.getStr(ConstructionPayConstant.QR_URL), CharsetUtil.CHARSET_UTF_8); + } + + /** + * 订单查询接口 + * + * @param config 建行学校信息配置 + * @param orderNo 订单号 + * @return cn.hutool.json.JSONObject + * @author ZYJ + * @date 2023/6/20 16:03 + */ + public static JSONObject queryOrder(ConstructionPayConfig config, String orderNo) { + try { + // 封装参数 + Map map = Maps.newLinkedHashMap(); + // 商户代码 + map.put("MERCHANTID", config.getMerchantId()); + // 分行代码 + map.put("BRANCHID", config.getBranchId()); + // 商户柜台代码 + map.put("POSID", config.getPosId()); + // 订单日期 + map.put("ORDERDATE", ""); + // 开始时间 + map.put("BEGORDERTIME", ""); + // 截止时间 + map.put("ENDORDERTIME", ""); + // 订单号 + map.put("ORDERID", orderNo); + // 密码. 参与加密但不赋值, 加密完成后赋值 + map.put("QUPWD", ""); + // 交易码 + map.put("TXCODE", ConstructionPayConstant.QUERY_ORDER_CODE); + // 流水类型. 0-支付流水, 1-退款流水 + map.put("TYPE", "0"); + // 流水状态. 0-未结算流水, 1-已结算流水 + map.put("KIND", "0"); + // 交易状态. 0-失败, 1-成功, 2-不确定, 3-全部(已结算流水查询不支持全部) + map.put("STATUS", "1"); + // 查询方式s 1-页面形式, 2-文件返回形式 (提供 TXT 和 XML 格式文件的下载), 3-XML页面形式 + map.put("SEL_TYPE", "3"); + // 页码 + map.put("PAGE", "1"); + // 操作员 + map.put("OPERATOR", ""); + // 预留字段 + map.put("CHANNEL", ""); + // 加密串 + String paramsStr = Joiner.on("&").withKeyValueSeparator("=").join(map); + log.info("加密串: {}", paramsStr); + // MD5加密 + String md5 = DigestUtil.md5Hex(paramsStr.getBytes()); + map.put("QUPWD", config.getPrivateCode()); + map.put("MAC", md5); + // 接口 + String xmlStr = HttpUtil.get(ConstructionPayConstant.URL, map); + log.info("建行查询订单接口xmlStr: {}", xmlStr); + // xml转json + JSONObject response = xmlToJson(xmlStr); + log.info("建行查询订单接口请求参数: {}, 返回值: {}", map, response); + + if (response.containsKey(ConstructionPayConstant.RETURN_CODE_NAME) + && !ConstructionPayConstant.RETURN_SUCCESS_CODE.equals(response.getStr(ConstructionPayConstant.RETURN_CODE_NAME)) + && !ConstructionPayConstant.NO_ORDER_CODE.equals(response.getStr(ConstructionPayConstant.RETURN_CODE_NAME)) + ) { + log.error("建行查询订单接口失败,code:{},msg:{},params:{}", response.get(ConstructionPayConstant.RETURN_CODE_NAME), + response.get(ConstructionPayConstant.RETURN_MSG), JSONUtil.toJsonStr(map)); + throw new FebsException(ResultMsgType.ORDER_QUERY_FAIL.getValue()); + } + + return response; + } catch (Exception e) { + log.error("建行查询订单接口失败", e); + throw new FebsException(ResultMsgType.ORDER_QUERY_FAIL.getValue()); + } + } + + /** + * 生成订单号 + * 规则: 最长30位, {商户代码后9位}{时间(yyyyMMddmmHHssSSS)(17位)}{4位随机数} + * + * @param merchantId 商户代码 + * @return java.lang.String + * @author ZYJ + * @date 2022/6/16 14:32 + */ + public static String getOrderNumber(String merchantId) { + return merchantId.substring(merchantId.length() - 9) + + DateUtil.format(new Date(), DatePattern.PURE_DATETIME_MS_PATTERN) + RandomUtil.randomNumbers(4); + } + + /** + * xml字符串转json + * + * @param xmlStr xml字符串 + * @return cn.hutool.json.JSONObject + * @author ZYJ + * @date 2023/6/20 14:40 + */ + public static JSONObject xmlToJson(String xmlStr) { + JSONObject jsonObject = JSONUtil.createObj(); + if (StrUtil.isEmpty(xmlStr)) { + throw new IllegalArgumentException("xml is empty"); + } else { + // 去除xml无效字符 + xmlStr = cleanXml(xmlStr); + Document document = XmlUtil.parseXml(xmlStr); + Element element = document.getDocumentElement(); + if (element != null) { + NodeList nodeList = element.getChildNodes(); + for (int i = 0; i < nodeList.getLength(); i++) { + Node node = nodeList.item(i); + getChildNodesInfo(node, jsonObject); + } + } + } + return jsonObject; + } + + /** + * 递归查询所有子节点信息 + * + * @param rootNode 根节点 + * @param jsonObject 返回的json数据 + * @author ZYJ + * @date 2023/6/20 15:55 + */ + public static void getChildNodesInfo(Node rootNode, JSONObject jsonObject) { + NodeList nodeList = rootNode.getChildNodes(); + int length = nodeList.getLength(); + if (length <= 1) { + String nodeName = rootNode.getNodeName(); + // 去除无效字符 + if ("#text".equalsIgnoreCase(nodeName)) { + return; + } + String nodeText = rootNode.getTextContent(); + jsonObject.set(nodeName, nodeText); + } else { + JSONObject childObject = JSONUtil.createObj(); + for (int i = 0; i < nodeList.getLength(); i++) { + Node node = nodeList.item(i); + getChildNodesInfo(node, childObject); + } + jsonObject.set(rootNode.getNodeName(), childObject); + } + } + + /** + * 去除xml无效字符 + * + * @param xmlStr xml字符串 + * @return java.lang.String + * @author ZYJ + * @date 2023/6/20 14:36 + */ + public static String cleanXml(String xmlStr) { + return XmlUtil.cleanInvalid(xmlStr.trim() + .replaceAll("\n\t", "") + .replaceAll("\n", "") + .replaceAll("\t", "") + .replaceAll("\t\t", "") + ); + } + + public static boolean validateSign(ConstructionPayNotifyDTO dto, String sign, String publicKey) { + try { + // 封装验签参数 + Map map = Maps.newLinkedHashMap(); + map.put("POSID", dto.getPOSID()); + map.put("BRANCHID", dto.getBRANCHID()); + map.put("ORDERID", dto.getORDERID()); + map.put("PAYMENT", dto.getPAYMENT()); + map.put("CURCODE", dto.getCURCODE()); + map.put("REMARK1", dto.getREMARK1()); + map.put("REMARK2", dto.getREMARK2()); + map.put("ACC_TYPE", dto.getACC_TYPE()); + map.put("SUCCESS", dto.getSUCCESS()); + map.put("TYPE", dto.getTYPE()); + map.put("REFERER", dto.getREFERER()); + map.put("CLIENTIP", dto.getCLIENTIP()); + String paramsStr = Joiner.on("&").withKeyValueSeparator("=").join(map); + // TODO 2023/7/28 添加第三方包后可验签成功, 此处需要处理spring-cloud项目如何添加本地jar包 + RSASig rsaSig = new RSASig(); + rsaSig.setPublicKey(publicKey); + return rsaSig.verifySignature(sign, paramsStr); + } catch (Exception e) { + log.error("验签失败", e); + return false; + } + } + + public static void main(String[] args) throws UnsupportedEncodingException { + ConstructionPayConfig config = ConstructionPayConfig.builder() + .merchantId("105000348168188") + .posId("078024457") + .branchId("430000000") + .publicKey("30819c300d06092a864886f70d010101050003818a003081860281804e9b9f299771a0c16f2e5d66e0dee653b172ab9cad1ce32053ed1db1af4249cd4475ac5a2e4a92baf8d015e56a8fa7e3df6432a0c952af8cb79d4a0171bef382468dcdf0f149e3a6a1c72aabad028c8c6a2d9e0fd85cadd908a1ce5ba5047d3dd40c49115a4833194086574f74ce1f106eed451e41c10cdec7bb69c90294ecf5020111") + .privateCode("Jh123456") + .build(); + ConstructionPayOrder order = ConstructionPayOrder.builder() + .orderNo("2023072814460000001") + .payMoney(new BigDecimal("0.01")) + .orderTime(new Date()) + .build(); + System.out.println(getQrPayUrl(config, order)); +// queryOrder(config, "9823740924298749823742"); +// String sign = "2275646a3c214e250fd03fc21c50f9c50b22b43fcf74c22db0946647ae70ed7950fdad20d172cd411999bddccb70f25d7d4104c4e8b8c372b900e842a8c6d688cfc77362e9261154b473b6b621b15f4770f48a5fcd8f0776ac335a522e5c830d3d5002c9969aca2810c2664df3d1b90539095247c5bcd05dbaa710bb4b7fbdd0"; +// String paramStr = "POSID=075570790&BRANCHID=430000000&ORDERID=2023072814460000001&PAYMENT=0.01&CURCODE=01&REMARK1=&REMARK2=&ACC_TYPE=WX&SUCCESS=Y&TYPE=1&REFERER=&CLIENTIP=11.168.99.30"; +// String publicKey = "30819c300d06092a864886f70d010101050003818a003081860281804e9b9f299771a0c16f2e5d66e0dee653b172ab9cad1ce32053ed1db1af4249cd4475ac5a2e4a92baf8d015e56a8fa7e3df6432a0c952af8cb79d4a0171bef382468dcdf0f149e3a6a1c72aabad028c8c6a2d9e0fd85cadd908a1ce5ba5047d3dd40c49115a4833194086574f74ce1f106eed451e41c10cdec7bb69c90294ecf5020111"; +// +// +// RSASig rsaSig = new RSASig(); +//// rsaSig.setPublicKey(publicKey.substring(publicKey.length() - 30)); +// rsaSig.setPublicKey(publicKey); +// System.out.println(rsaSig.verifySignature(sign, paramStr)); + } +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/ConsumeUtil.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/ConsumeUtil.java new file mode 100644 index 0000000..50b405d --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/ConsumeUtil.java @@ -0,0 +1,183 @@ +package com.yida.data.common.core.utils; + +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.yida.data.common.core.entity.constant.ConsumeConstant; +import com.yida.data.common.core.entity.consume.EduConsumeConfig; +import com.yida.data.common.core.entity.consume.Recharge; +import com.yida.data.common.core.exception.FebsException; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +/** + * 消费机工具类 + * + * @author ZYJ + * @date 2023/4/4 + */ +@Slf4j +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class ConsumeUtil { + + public static final String DEFAULT_CLIENT_TYPE = "4"; + + /** + * 获取人员信息 + * + * @param config 学校消费机服务器信息 + * @param accountNo 校园卡号 + * @return cn.hutool.json.JSONObject + * @author ZYJ + * @date 2023/4/6 11:16 + */ + public static JSONObject getPersonInfo(EduConsumeConfig config, String accountNo) { + // 封装请求参数 + JSONObject params = JSONUtil.createObj() + // 人员编号 + .set("accountno", accountNo); + HttpResponse httpResponse = HttpRequest.get(config.getServiceIp() + ConsumeConstant.GET_PERSON_INFO) + .form(params) + .execute(); + // 返回数据 + log.info("获取消费机人员信息接口返回数据: {}", httpResponse.body()); + JSONObject jsonObject = JSONUtil.parseObj(httpResponse.body()); + if (jsonObject.containsKey(ConsumeConstant.ERROR_CONTENT_NAME)) { + JSONObject errorContent = jsonObject.getJSONObject(ConsumeConstant.ERROR_CONTENT_NAME); + log.error("获取人员信息失败, param: {}, code: {}, msg: {}", params, errorContent.getStr(ConsumeConstant.ERROR_CODE_NAME), + errorContent.getStr(ConsumeConstant.ERROR_MESSAGE_NAME)); + throw new FebsException("获取人员信息失败"); + } + return jsonObject; + } + + /** + * 挂失卡片 + * + * @param config 学校消费机服务器信息 + * @param cardId 卡片唯一标识 + * @return cn.hutool.json.JSONObject + * @author ZYJ + * @date 2023/4/6 14:11 + */ + public static JSONObject lockCard(EduConsumeConfig config, String cardId) { + // 封装请求参数 + JSONObject params = JSONUtil.createObj() + // 卡片唯一标识 + .set("cardID", cardId); + HttpResponse httpResponse = HttpRequest.post(config.getServiceIp() + ConsumeConstant.LOCK_CARD + "?client-type=" + DEFAULT_CLIENT_TYPE) + .body(params.toString()) + .execute(); + // 返回数据 + log.info("挂失卡片接口返回数据: {}", httpResponse.body()); + JSONObject jsonObject = JSONUtil.parseObj(httpResponse.body()); + if (jsonObject.containsKey(ConsumeConstant.ERROR_CONTENT_NAME)) { + JSONObject errorContent = jsonObject.getJSONObject(ConsumeConstant.ERROR_CONTENT_NAME); + log.error("挂失卡片失败, param: {}, code: {}, msg: {}", params, errorContent.getStr(ConsumeConstant.ERROR_CODE_NAME), + errorContent.getStr(ConsumeConstant.ERROR_MESSAGE_NAME)); + throw new FebsException("挂失卡片失败"); + } + return jsonObject; + } + + /** + * 解挂卡片 + * + * @param config 学校消费机服务器信息 + * @param cardId 卡片唯一标识 + * @return cn.hutool.json.JSONObject + * @author ZYJ + * @date 2023/4/6 14:26 + */ + public static JSONObject unLockCard(EduConsumeConfig config, String cardId) { + // 封装请求参数 + JSONObject params = JSONUtil.createObj() + // 卡片唯一标识 + .set("cardID", cardId); + HttpResponse httpResponse = HttpRequest.post(config.getServiceIp() + ConsumeConstant.UN_LOCK_CARD + "?client-type=" + DEFAULT_CLIENT_TYPE) + .body(params.toString()) + .execute(); + // 返回数据 + log.info("解挂卡片接口返回数据: {}", httpResponse.body()); + JSONObject jsonObject = JSONUtil.parseObj(httpResponse.body()); + if (jsonObject.containsKey(ConsumeConstant.ERROR_CONTENT_NAME)) { + JSONObject errorContent = jsonObject.getJSONObject(ConsumeConstant.ERROR_CONTENT_NAME); + log.error("解挂卡片失败, param: {}, code: {}, msg: {}", params, errorContent.getStr(ConsumeConstant.ERROR_CODE_NAME), + errorContent.getStr(ConsumeConstant.ERROR_MESSAGE_NAME)); + throw new FebsException("解挂卡片失败"); + } + return jsonObject; + } + + /** + * 充值 + * + * @param config 学校消费机服务器信息 + * @param recharge 消费机充值类 + * @return cn.hutool.json.JSONObject + * @author ZYJ + * @date 2023/4/6 16:56 + */ + public static JSONObject recharge(EduConsumeConfig config, Recharge recharge) { + // 封装请求参数 + JSONObject params = JSONUtil.createObj() + .set("amount", recharge.getAmount()) + .set("accountNo", recharge.getAccountNo()) + .set("increase", recharge.isIncrease()) + .set("walletType", recharge.getWalletType()) + .set("transactionNumber", recharge.getTransactionNumber()) + .set("payment", JSONUtil.createObj() + .set("payType", recharge.getPaymentModel().getPayType()) + .set("payTime", recharge.getPaymentModel().getPayTime()) + .set("orderNumber", recharge.getPaymentModel().getOrderNumber()) + .set("innerOrderNumber", recharge.getPaymentModel().getInnerOrderNumber()) + ); + HttpResponse httpResponse = HttpRequest.post(config.getServiceIp() + ConsumeConstant.RECHARGE + "?client-type=" + DEFAULT_CLIENT_TYPE) + .body(params.toString()) + .execute(); + // 返回数据 + log.info("充值接口返回数据: {}", httpResponse.body()); + JSONObject jsonObject = JSONUtil.parseObj(httpResponse.body()); + if (jsonObject.containsKey(ConsumeConstant.ERROR_CONTENT_NAME)) { + JSONObject errorContent = jsonObject.getJSONObject(ConsumeConstant.ERROR_CONTENT_NAME); + log.error("充值失败, param: {}, code: {}, msg: {}", params, errorContent.getStr(ConsumeConstant.ERROR_CODE_NAME), + errorContent.getStr(ConsumeConstant.ERROR_MESSAGE_NAME)); + throw new FebsException("充值失败"); + } + return jsonObject; + } + + /** + * 充值撤销 + * + * @param config 学校消费机服务器信息 + * @param accountNo 校园卡号 + * @param walletType 充值钱包类型. 1:现金, 2:补贴 + * @param transactionNumber 流水号 + * @return cn.hutool.json.JSONObject + * @author ZYJ + * @date 2023/4/6 17:15 + */ + public static JSONObject undoRecharge(EduConsumeConfig config, String accountNo, Integer walletType, String transactionNumber) { + // 封装请求参数 + JSONObject params = JSONUtil.createObj() + .set("accountNo", accountNo) + .set("walletType", walletType) + .set("transactionNumber", transactionNumber); + HttpResponse httpResponse = HttpRequest.post(config.getServiceIp() + ConsumeConstant.UNDO_RECHARGE + "?client-type=" + DEFAULT_CLIENT_TYPE) + .body(params.toString()) + .execute(); + // 返回数据 + log.info("充充值撤销接口返回数据: {}", httpResponse.body()); + JSONObject jsonObject = JSONUtil.parseObj(httpResponse.body()); + if (jsonObject.containsKey(ConsumeConstant.ERROR_CONTENT_NAME)) { + JSONObject errorContent = jsonObject.getJSONObject(ConsumeConstant.ERROR_CONTENT_NAME); + log.error("充值撤销失败, param: {}, code: {}, msg: {}", params, errorContent.getStr(ConsumeConstant.ERROR_CODE_NAME), + errorContent.getStr(ConsumeConstant.ERROR_MESSAGE_NAME)); + throw new FebsException("充值撤销失败"); + } + return jsonObject; + } +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/DateUtil.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/DateUtil.java index bdceddf..fb59258 100644 --- a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/DateUtil.java +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/DateUtil.java @@ -1,14 +1,19 @@ package com.yida.data.common.core.utils; +import cn.hutool.core.date.DateUnit; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.Instant; +import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; +import java.util.Calendar; import java.util.Date; +import java.util.HashMap; import java.util.Locale; +import java.util.Map; /** * 时间工具类 @@ -94,4 +99,115 @@ public abstract class DateUtil { LocalTime now = LocalTime.now(); return now.isAfter(from) && now.isBefore(to); } + + + /** + * 计算两个时间点相差的天数 + * + * @param + * @return + */ + public static Long daysBetween(Date beginDate, Date endDate) { + return cn.hutool.core.date.DateUtil.between(beginDate, endDate, DateUnit.DAY); + } + + + /** + * 获取指定年指定月的开始天数和结束天数 + * + * @param yearMonth + * @return + */ + public static Map getFirstDayAndLastDayOfTheSpecifiedMonth(String yearMonth) { + + int year = Integer.parseInt(yearMonth.split("-")[0]); + int month = Integer.parseInt(yearMonth.split("-")[1]); + // 获取当前分区的日历信息(这里可以使用参数指定时区) + Calendar calendar = Calendar.getInstance(); + // 设置年 + calendar.set(Calendar.YEAR, year); + // 设置月,月份从0开始 + calendar.set(Calendar.MONTH, month - 1); + // 设置为指定月的第一天 + calendar.set(Calendar.DAY_OF_MONTH, 1); + // 获取指定月第一天的时间 + Date start = calendar.getTime(); + // 设置日历天数为当前月实际天数的最大值,即指定月份的最后一天 + calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DATE)); + // 获取最后一天的时间 + Date end = calendar.getTime(); + // 设置返回信息,返回样式根据需求自行格式化 + Map dateMap = new HashMap<>(); + dateMap.put("start", start); + dateMap.put("end", end); + return dateMap; + } + + + /** + * 查询日期间有几天一周中的某一天 日期格式 yyyy-MM-dd yyyy-MM-dd 1-7(表示周一到周日) + * + * @param startDate 准备查询的起始日期 + * @param endDate 准备查询的结束日期 + * @param dayOfWeek 准备查的一周中的某一天(准备查周几?) + * @return 包含所查周几的天数 + * @throws ParseException 不支持跨年查询、不支持结束日期早于起始日期、周几输入错误等 + */ + public static Integer getMondayNumber(LocalDate startDate, LocalDate endDate, int dayOfWeek) throws ParseException { + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + int differenceDay = 0; + //实例化起始和结束Calendar对象 + Calendar startCalendar = Calendar.getInstance(); + Calendar endCalendar = Calendar.getInstance(); + //分别设置Calendar对象的时间 + ZoneId zone = ZoneId.systemDefault(); + Instant instantStartDate = startDate.atStartOfDay().atZone(zone).toInstant(); + Instant instantEndDate = endDate.atStartOfDay().atZone(zone).toInstant(); + startCalendar.setTime(Date.from(instantStartDate)); + endCalendar.setTime(Date.from(instantEndDate)); + + //定义起始日期和结束日期分别属于第几周 + int startWeek = startCalendar.get(Calendar.WEEK_OF_YEAR); + int endWeek = endCalendar.get(Calendar.WEEK_OF_YEAR); + + //拿到起始日期是星期几 + int startDayOfWeek = startCalendar.get(Calendar.DAY_OF_WEEK); + if (startDayOfWeek == 1) { + startDayOfWeek = 7; + startWeek--; + } else { + startDayOfWeek--; + } + + //拿到结束日期是星期几 + int endDayOfWeek = endCalendar.get(Calendar.DAY_OF_WEEK); + if (endDayOfWeek == 1) { + endDayOfWeek = 7; + endWeek--; + } else { + endDayOfWeek--; + } + + //计算相差的周数 + int differenceWeek = endWeek - startWeek; + + //开始计算 + if (startDayOfWeek <= dayOfWeek) { + if (endDayOfWeek >= dayOfWeek) { + differenceDay = differenceWeek + 1; + } + } else if (startDayOfWeek > dayOfWeek) { + if (endDayOfWeek < dayOfWeek) { + differenceDay = differenceWeek - 1; + } + } else { + differenceDay = differenceWeek; + } + return differenceDay; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } } diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/FebsUtil.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/FebsUtil.java index d794edf..e256c57 100644 --- a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/FebsUtil.java +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/FebsUtil.java @@ -9,8 +9,10 @@ import com.yida.data.common.core.entity.constant.PageConstant; import com.yida.data.common.core.entity.constant.RegexpConstant; import com.yida.data.common.core.entity.constant.StringConstant; import com.yida.data.common.core.exception.FebsException; +import java.time.LocalDate; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.omg.CORBA.UNKNOWN; import org.springframework.core.env.Environment; import org.springframework.core.io.buffer.DataBuffer; import org.springframework.core.io.buffer.DataBufferUtils; @@ -47,6 +49,7 @@ import java.util.stream.IntStream; public abstract class FebsUtil { private static final String UNKNOW = "unknown"; + private static final String UNKNOWN = "unknown"; /** * 驼峰转下划线 @@ -213,13 +216,18 @@ public abstract class FebsUtil { public static String getHttpServletRequestIpAddress() { HttpServletRequest request = getHttpServletRequest(); String ip = request.getHeader("x-forwarded-for"); - if (ip == null || ip.length() == 0 || UNKNOW.equalsIgnoreCase(ip)) { + if (ip != null && ip.length() != 0 && !UNKNOWN.equalsIgnoreCase(ip)) { + if (ip.contains(StringConstant.COMMA)) { + ip = ip.split(StringConstant.COMMA)[0]; + } + } + if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } - if (ip == null || ip.length() == 0 || UNKNOW.equalsIgnoreCase(ip)) { + if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } - if (ip == null || ip.length() == 0 || UNKNOW.equalsIgnoreCase(ip)) { + if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : ip; @@ -401,11 +409,91 @@ public abstract class FebsUtil { res = "星期六"; break; case 7: - res = "星期天"; + res = "星期日"; break; default: } } return res; } + + public static boolean isWeek(String weekStr, Integer week) { + boolean flag = false; + switch (week) { + case 1: + if (weekStr.contains("星期一")) { + flag = true; + } + break; + case 2: + if (weekStr.contains("星期二")) { + flag = true; + } + break; + case 3: + if (weekStr.contains("星期三")) { + flag = true; + } + break; + case 4: + if (weekStr.contains("星期四")) { + flag = true; + } + break; + case 5: + if (weekStr.contains("星期五")) { + flag = true; + } + break; + case 6: + if (weekStr.contains("星期六")) { + flag = true; + } + break; + case 7: + if (weekStr.contains("星期日")) { + flag = true; + } + break; + default: + break; + } + return flag; + } + + + /** + * 通过身份证号码获取性别(sex) + * + * @param idCardNo 身份证号码 + * @return 性别格式:1:女,0:男 + */ + public static Integer getSexByIdCardNo(String idCardNo) { + Integer sexCode = null; + char[] number = idCardNo.toCharArray(); + boolean flag = true; + if (number.length == 15) { + for (int x = 0; x < number.length; x++) { + if (!flag) { + return null; + } + flag = Character.isDigit(number[x]); + } + } else if (number.length == 18) { + for (int x = 0; x < number.length - 1; x++) { + if (!flag) { + return null; + } + flag = Character.isDigit(number[x]); + } + } + if (flag && idCardNo.length() == 15) { + sexCode = Integer.parseInt(idCardNo.substring(idCardNo.length() - 3, idCardNo.length())) % 2 == 0 ? 1 : 0; + } else if (flag && idCardNo.length() == 18) { + sexCode = Integer.parseInt(idCardNo.substring(idCardNo.length() - 4, idCardNo.length() - 1)) % 2 == 0 ? 1 : 0; + } + + return sexCode; + } + } diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/FileUtil.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/FileUtil.java index f736310..bde3fc5 100644 --- a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/FileUtil.java +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/FileUtil.java @@ -111,7 +111,7 @@ public abstract class FileUtil { put("source", 50); } }); - log.info("上传响应,[{}]", resp); +// log.info("上传响应,[{}]", resp); JSONObject respJson = JSONUtil.parseObj(resp); if (!"200".equals(respJson.get("status").toString())) { throw new FebsException(respJson.getStr("message")); @@ -261,6 +261,14 @@ public abstract class FileUtil { public static String downloadToLocal(String url) { LocalDateTime now = LocalDateTime.now(); String path = TEMP_DIR + now.getYear() + "/" + now.getMonthValue() + "/" + now.getDayOfMonth() + "/"; +// String filename = cn.hutool.core.io.FileUtil.getName(url); +// if (filename.contains(".jpg") || filename.contains(".png")) { +// if (filename.contains("?")) { +// filename = filename.split("\\?")[0]; +// } +// } else { +// filename = UUID.randomUUID() + ".jpg"; +// } String filename = UUID.randomUUID() + ".jpg"; try { HttpUtil.downloadFile(url, path + filename); diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/ThreadPoolUtil.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/ThreadPoolUtil.java new file mode 100644 index 0000000..2c35c7b --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/ThreadPoolUtil.java @@ -0,0 +1,30 @@ +package com.yida.data.common.core.utils; + +import cn.hutool.core.thread.ThreadUtil; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +import java.util.concurrent.*; + +/** + * 线程池工具类 + * + * @author ZYJ + * @date 2022/4/14 + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class ThreadPoolUtil { + + /** + * 生成线程池 + * + * @return java.util.concurrent.ExecutorService + * @author ZYJ + * @date 2022/4/14 10:10 + */ + public static ExecutorService getThreadPool(String threadName) { + ThreadFactory threadFactory = ThreadUtil.newNamedThreadFactory(threadName, false); + return new ThreadPoolExecutor(3, 6, 1, + TimeUnit.MINUTES, new LinkedBlockingQueue<>(), threadFactory); + } +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/UPayUtil.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/UPayUtil.java new file mode 100644 index 0000000..1233f51 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/UPayUtil.java @@ -0,0 +1,440 @@ +package com.yida.data.common.core.utils; + +import cn.hutool.core.codec.Base64; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.CharsetUtil; +import cn.hutool.core.util.NumberUtil; +import cn.hutool.crypto.digest.DigestUtil; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.google.common.base.Joiner; +import com.yida.data.common.core.common.ResultMsgType; +import com.yida.data.common.core.entity.constant.StringConstant; +import com.yida.data.common.core.entity.constant.UPayConstant; +import com.yida.data.common.core.entity.consume.DeptConsumeTerminalCache; +import com.yida.data.common.core.entity.pay.UPayOrder; +import com.yida.data.common.core.entity.pay.URefund; +import com.yida.data.common.core.entity.system.UPayConfig; +import com.yida.data.common.core.exception.FebsException; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.math.BigDecimal; +import java.net.URLEncoder; +import java.security.KeyFactory; +import java.security.PublicKey; +import java.security.Signature; +import java.security.spec.X509EncodedKeySpec; +import java.util.TreeMap; + +/** + * 收钱吧支付工具类 + * + * @author ZYJ + * @date 2023/3/20 + */ +@Slf4j +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class UPayUtil { + + private static final String KEY_ALGORITHM = "RSA"; + private static final String SIGNATURE_ALGORITHM = "SHA256withRSA"; + + /** + * 跳转支付接口 + * + * @param order 收钱吧支付订单类 + * @param terminalSn 终端序列号 + * @param terminalKey 终端密钥 + * @return java.lang.String + * @author ZYJ + * @date 2023/3/21 17:06 + */ + public static String placeOrder(UPayOrder order, String terminalSn, String terminalKey) { + try { + JSONObject jsonObject = JSONUtil.createObj() + .set("terminal_sn", terminalSn) + .set("client_sn", order.getClientSn()) + .set("total_amount", String.valueOf(NumberUtil.mul(order.getTotalAmount(), new BigDecimal(100)).intValue())) + .set("subject", StringUtils.isNotBlank(order.getSubject()) ? order.getSubject() : "充值缴费") + .set("operator", URLEncoder.encode(order.getOperator(), CharsetUtil.UTF_8)) + .set("return_url", order.getReturnUrl()) + .set("notify_url", order.getNotifyUrl()); + TreeMap paramMap = MapUtil.sort(jsonObject); + // 处理请求参数 + String paramsStr = Joiner.on("&").withKeyValueSeparator("=").join(paramMap); + // 签名 + String sign = getPayUrlSign(paramsStr, terminalKey); + // 生成支付地址 + String url = UPayConstant.TO_PAY_URL + StringConstant.QUESTION_MARK + paramsStr + "&sign=" + sign; + log.info("收钱吧支付地址: {}", url); + return url; + } catch (Exception e) { + log.error("生成收钱吧支付地址失败", e); + throw new FebsException(ResultMsgType.ORDER_FAIL.getValue()); + } + } + + /** + * 激活 + * + * @param uPayConfig 收钱吧学校信息配置 + * @param deviceId 同一个app_id下唯一. 例:品牌名称+支付场景 + * @return com.yida.data.common.core.entity.consume.DeptConsumeTerminalCache + * @author ZYJ + * @date 2023/4/3 14:43 + */ + public static DeptConsumeTerminalCache active(UPayConfig uPayConfig, String deviceId) { + // 封装请求参数 + JSONObject params = JSONUtil.createObj() + // wap支付应用id + .set("app_id", uPayConfig.getWapAppId()) + // 激活码内容 + .set("code", uPayConfig.getCode()) + // 设备唯一编号 + .set("device_id", deviceId); + HttpResponse httpResponse = HttpRequest.post(UPayConstant.ACTIVATE) + .header("Authorization", setSignHeader(uPayConfig.getVendorSn(), getSign(params.toString(), uPayConfig.getVendorKey()))) + .body(params.toString()) + .execute(); + // 返回数据 + log.info("激活接口返回数据: {}", httpResponse.body()); + JSONObject jsonObject = JSONUtil.parseObj(httpResponse.body()); + JSONObject bizResponse; + // 激活接口返回数据: {"result_code":"200","biz_response":{"terminal_sn":"100053610028601010","terminal_key":"50f76a2c11121f22bd4d62e8350ec0f6","merchant_sn":"18956397746","merchant_name":"半夜鸡叫","store_sn":"00010101001200200046406","store_name":"半夜鸡叫"}} + if (jsonObject.containsKey(UPayConstant.RESULT_CODE_NAME) + && !UPayConstant.RESULT_SUCCESS_CODE.equals(jsonObject.getStr(UPayConstant.RESULT_CODE_NAME))) { + log.error("激活设备失败, param : {}, resultCode: {}, errorCode: {}, msg: {}", params, + jsonObject.getStr(UPayConstant.RESULT_CODE_NAME), jsonObject.getStr(UPayConstant.ERROR_CODE_NAME), + jsonObject.getStr(UPayConstant.ERROR_MESSAGE_NAME)); + throw new FebsException("激活设备失败"); + } else { + bizResponse = jsonObject.getJSONObject(UPayConstant.BIZ_RESPONSE); + if (bizResponse.containsKey(UPayConstant.BIZ_CODE_NAME) + && !UPayConstant.BIZ_SUCCESS_CODE.equals(bizResponse.getStr(UPayConstant.BIZ_CODE_NAME))) { + log.error("激活设备失败, param : {}, resultCode: {}, errorCode: {}, msg: {}", params, + bizResponse.getStr(UPayConstant.BIZ_CODE_NAME), bizResponse.getStr(UPayConstant.ERROR_CODE_NAME), + bizResponse.getStr(UPayConstant.ERROR_MESSAGE_NAME)); + throw new FebsException("激活设备失败"); + } + } + return DeptConsumeTerminalCache.builder() + .terminalSn(bizResponse.getStr("terminal_sn")) + .terminalKey(bizResponse.getStr("terminal_key")) + .build(); + } + + /** + * 订单查询 + * + * @param clientSn 商户订单号 + * @param terminalSn 终端序列号 + * @param terminalKey 终端密钥 + * @return cn.hutool.json.JSONObject + * @author ZYJ + * @date 2023/3/21 17:10 + */ + public static JSONObject queryOrder(String clientSn, String terminalSn, String terminalKey) { + // 封装请求参数 + JSONObject params = JSONUtil.createObj() + // 终端序列号 + .set("terminal_sn", terminalSn) + // 商户订单号 + .set("client_sn", clientSn); + HttpResponse httpResponse = HttpRequest.post(UPayConstant.QUERY_ORDER) + .header("Authorization", setSignHeader(terminalSn, getSign(params.toString(), terminalKey))) + .body(params.toString()) + .execute(); + // 返回数据 + log.info("订单查询接口返回数据: {}", httpResponse.body()); + JSONObject jsonObject = JSONUtil.parseObj(httpResponse.body()); + if (jsonObject.containsKey(UPayConstant.RESULT_CODE_NAME) + && !UPayConstant.RESULT_SUCCESS_CODE.equals(jsonObject.getStr(UPayConstant.RESULT_CODE_NAME))) { + log.error("订单查询接口失败, param : {}, resultCode: {}, errorCode: {}, msg: {}", params, + jsonObject.getStr(UPayConstant.RESULT_CODE_NAME), jsonObject.getStr(UPayConstant.ERROR_CODE_NAME), + jsonObject.getStr(UPayConstant.ERROR_MESSAGE_NAME)); + throw new FebsException(ResultMsgType.ORDER_QUERY_FAIL.getValue()); + } else { + JSONObject bizResponse = jsonObject.getJSONObject(UPayConstant.BIZ_RESPONSE); + if (bizResponse.containsKey(UPayConstant.BIZ_CODE_NAME) + && !UPayConstant.BIZ_SUCCESS_CODE.equals(bizResponse.getStr(UPayConstant.BIZ_CODE_NAME)) + && !UPayConstant.NO_ORDER_CODE.equals(bizResponse.getStr(UPayConstant.ERROR_CODE_NAME)) + && !UPayConstant.TRADE_NOT_EXIST.equals(bizResponse.getStr(UPayConstant.ERROR_CODE_NAME)) + ) { + log.error("订单查询接口失败, param : {}, resultCode: {}, errorCode: {}, msg: {}", params, + bizResponse.getStr(UPayConstant.BIZ_CODE_NAME), bizResponse.getStr(UPayConstant.ERROR_CODE_NAME), + bizResponse.getStr(UPayConstant.ERROR_MESSAGE_NAME)); + throw new FebsException(ResultMsgType.ORDER_QUERY_FAIL.getValue()); + } + } + return jsonObject; + } + + /** + * 退款订单查询 + * + * @param clientSn 商户订单号 + * @param refundRequestNo 退款序列号 + * @param terminalSn 终端序列号 + * @param terminalKey 终端密钥 + * @return cn.hutool.json.JSONObject + * @author ZYJ + * @date 2023/4/15 15:48 + */ + public static JSONObject queryRefundOrder(String clientSn, String refundRequestNo, String terminalSn, String terminalKey) { + // 封装请求参数 + JSONObject params = JSONUtil.createObj() + // 终端序列号 + .set("terminal_sn", terminalSn) + // 商户订单号 + .set("client_sn", clientSn) + // 退款序列号 + .set("refund_request_no", refundRequestNo); + HttpResponse httpResponse = HttpRequest.post(UPayConstant.QUERY_ORDER) + .header("Authorization", setSignHeader(terminalSn, getSign(params.toString(), terminalKey))) + .body(params.toString()) + .execute(); + // 返回数据 + log.info("退款查询接口返回数据: {}", httpResponse.body()); + JSONObject jsonObject = JSONUtil.parseObj(httpResponse.body()); + if (jsonObject.containsKey(UPayConstant.RESULT_CODE_NAME) + && !UPayConstant.RESULT_SUCCESS_CODE.equals(jsonObject.getStr(UPayConstant.RESULT_CODE_NAME))) { + log.error("退款查询接口失败, param : {}, resultCode: {}, errorCode: {}, msg: {}", params, + jsonObject.getStr(UPayConstant.RESULT_CODE_NAME), jsonObject.getStr(UPayConstant.ERROR_CODE_NAME), + jsonObject.getStr(UPayConstant.ERROR_MESSAGE_NAME)); + throw new FebsException(ResultMsgType.REFUND_QUERY_FAIL.getValue()); + } else { + JSONObject bizResponse = jsonObject.getJSONObject(UPayConstant.BIZ_RESPONSE); + if (bizResponse.containsKey(UPayConstant.BIZ_CODE_NAME) + && !UPayConstant.BIZ_SUCCESS_CODE.equals(bizResponse.getStr(UPayConstant.BIZ_CODE_NAME))) { + log.error("退款查询接口失败, param : {}, resultCode: {}, errorCode: {}, msg: {}", params, + bizResponse.getStr(UPayConstant.BIZ_CODE_NAME), bizResponse.getStr(UPayConstant.ERROR_CODE_NAME), + bizResponse.getStr(UPayConstant.ERROR_MESSAGE_NAME)); + throw new FebsException(ResultMsgType.REFUND_QUERY_FAIL.getValue()); + } + } + return jsonObject; + } + + /** + * 退款 + * TODO 2023/4/3 需要验证返回结果 + * + * @param refund 收钱吧退款类 + * @param terminalSn 终端序列号 + * @param terminalKey 终端密钥 + * @return cn.hutool.json.JSONObject + * @author ZYJ + * @date 2023/3/21 17:50 + */ + public static JSONObject refund(URefund refund, String terminalSn, String terminalKey) { + // 封装请求参数 + JSONObject params = JSONUtil.createObj() + // 终端序列号 + .set("terminal_sn", terminalSn) + // 商户订单号 + .set("client_sn", refund.getClientSn()) + // 退款金额 + .set("refund_amount", String.valueOf(NumberUtil.mul(refund.getRefundAmount(), new BigDecimal("100")).intValue())) + // 退款序列号 + .set("refund_request_no", refund.getRefundRequestNo()) + // 执行本次退款的操作员 + .set("operator", refund.getOperator()); + log.info(params.toString()); + HttpResponse httpResponse = HttpRequest.post(UPayConstant.REFUND_ORDER) + .header("Authorization", setSignHeader(terminalSn, getSign(params.toString(), terminalKey))) + .body(params.toString()) + .execute(); + // 返回数据 + log.info("订单退款接口返回数据: {}", httpResponse.body()); + JSONObject jsonObject = JSONUtil.parseObj(httpResponse.body()); + if (jsonObject.containsKey(UPayConstant.RESULT_CODE_NAME) + && !UPayConstant.RESULT_SUCCESS_CODE.equals(jsonObject.getStr(UPayConstant.RESULT_CODE_NAME))) { + log.error("订单退款接口失败, param : {}, resultCode: {}, errorCode: {}, msg: {}", params, + jsonObject.getStr(UPayConstant.RESULT_CODE_NAME), jsonObject.getStr(UPayConstant.ERROR_CODE_NAME), + jsonObject.getStr(UPayConstant.ERROR_MESSAGE_NAME)); + throw new FebsException(ResultMsgType.ORDER_REFUND_FAIL.getValue()); + } else { + JSONObject bizResponse = jsonObject.getJSONObject(UPayConstant.BIZ_RESPONSE); + if (bizResponse.containsKey(UPayConstant.BIZ_CODE_NAME) + && !UPayConstant.REFUND_SUCCESS_CODE.equals(bizResponse.getStr(UPayConstant.BIZ_CODE_NAME)) + && !UPayConstant.NO_ORDER_CODE.equals(bizResponse.getStr(UPayConstant.ERROR_CODE_NAME)) + && !UPayConstant.TRADE_NOT_EXIST.equals(bizResponse.getStr(UPayConstant.ERROR_CODE_NAME))) { + log.error("订单退款接口失败, param : {}, resultCode: {}, errorCode: {}, msg: {}", params, + bizResponse.getStr(UPayConstant.BIZ_CODE_NAME), bizResponse.getStr(UPayConstant.ERROR_CODE_NAME), + bizResponse.getStr(UPayConstant.ERROR_MESSAGE_NAME)); + throw new FebsException(ResultMsgType.ORDER_REFUND_FAIL.getValue()); + } + } + return jsonObject; + } + + /** + * 撤单 + * + * @param clientSn 商户订单号 + * @param terminalSn 终端序列号 + * @param terminalKey 终端密钥 + * @return cn.hutool.json.JSONObject + * @author ZYJ + * @date 2023/3/21 17:52 + */ + public static JSONObject closeOrder(String clientSn, String terminalSn, String terminalKey) { + // 封装请求参数 + JSONObject params = JSONUtil.createObj() + // 终端序列号 + .set("terminal_sn", terminalSn) + // 商户订单号 + .set("client_sn", clientSn); + + HttpResponse httpResponse = HttpRequest.post(UPayConstant.CLOSE_ORDER) + .header("Authorization", setSignHeader(terminalSn, getSign(params.toString(), terminalKey))) + .body(params.toString()) + .execute(); + // 返回数据 + log.info("撤单接口返回数据: {}", httpResponse.body()); + JSONObject jsonObject = JSONUtil.parseObj(httpResponse.body()); + if (jsonObject.containsKey(UPayConstant.RESULT_CODE_NAME) + && !UPayConstant.RESULT_SUCCESS_CODE.equals(jsonObject.getStr(UPayConstant.RESULT_CODE_NAME))) { + log.error("撤单接口失败, param : {}, resultCode: {}, errorCode: {}, msg: {}", params, + jsonObject.getStr(UPayConstant.RESULT_CODE_NAME), jsonObject.getStr(UPayConstant.ERROR_CODE_NAME), + jsonObject.getStr(UPayConstant.ERROR_MESSAGE_NAME)); + throw new FebsException(ResultMsgType.ORDER_CLOSE_FAIL.getValue()); + } else { + JSONObject bizResponse = jsonObject.getJSONObject(UPayConstant.BIZ_RESPONSE); + if (bizResponse.containsKey(UPayConstant.BIZ_CODE_NAME) + && !UPayConstant.CANCEL_SUCCESS_CODE.equals(bizResponse.getStr(UPayConstant.BIZ_CODE_NAME)) + && !UPayConstant.CANCEL_ABORT_SUCCESS_CODE.equals(bizResponse.getStr(UPayConstant.BIZ_CODE_NAME)) + && !UPayConstant.CANCEL_ORDER_NOOP_CODE.equals(bizResponse.getStr(UPayConstant.ERROR_CODE_NAME)) + && !UPayConstant.NO_ORDER_CODE.equals(bizResponse.getStr(UPayConstant.ERROR_CODE_NAME)) + && !UPayConstant.TRADE_NOT_EXIST.equals(bizResponse.getStr(UPayConstant.ERROR_CODE_NAME))) { + log.error("撤单接口失败, param : {}, resultCode: {}, errorCode: {}, msg: {}", params, + bizResponse.getStr(UPayConstant.BIZ_CODE_NAME), bizResponse.getStr(UPayConstant.ERROR_CODE_NAME), + bizResponse.getStr(UPayConstant.ERROR_MESSAGE_NAME)); + throw new FebsException(ResultMsgType.ORDER_CLOSE_FAIL.getValue()); + } + } + return jsonObject; + } + + /** + * 跳转支付接口签名 + * 排序: 将筛选的参数按照第一个字符的键值ASCII码递增排序(字母升序排序),如果遇到相同字符则按照第二个字符的键值ASCII码递增排序,以此类推。 + * 拼接: 组合成“参数=参数值”的格式,并且把这些参数用&字符连接起来,此时生成的字符串为待签名字符串;将key参数拼接在字符串后面,形式为:“&key=key值”;调用MD5算法生成sign,将sign转换成大写。 + * + * @param paramStr 请求参数字符串 + * @param key 密钥 + * @return java.lang.String + * @author ZYJ + * @date 2023/3/21 14:59 + */ + private static String getPayUrlSign(String paramStr, String key) { + String signStr = paramStr + "&key=" + key; + log.info(signStr); + return DigestUtil.md5Hex(signStr.getBytes()).toUpperCase(); + } + + /** + * 获取签名 + * MD5( CONCAT( body + key ) ) + * + * @param params 请求参数 + * @param key 密钥. vendor_Key(激活接口)或terminal_key(其它接口) + * @return java.lang.String + * @author ZYJ + * @date 2023/3/21 11:19 + */ + private static String getSign(String params, String key) { + String md5Params = params + key; + return DigestUtil.md5Hex(md5Params.getBytes()); + } + + /** + * 封装请求头 + * + * @param sn 签名序列号. vendor_sn(激活接口)或terminal_sn(其它接口) + * @param sign 签名值. 签名算法: sign = MD5( CONCAT( body + key ) ) + * @return java.lang.String + * @author ZYJ + * @date 2023/3/20 17:07 + */ + private static String setSignHeader(String sn, String sign) { + return sn + " " + sign; + } + + /** + * 收钱吧回调验签 + * + * @param data 回调值 + * @param sign 签名 + * @param publicKey 公钥 + * @return boolean + * @author ZYJ + * @date 2023/3/31 14:52 + */ + public static boolean validateSign(String data, String sign, String publicKey) { + try { + Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM); + PublicKey localPublicKey = getPublicKeyFromX509(KEY_ALGORITHM, publicKey); + signature.initVerify(localPublicKey); + signature.update(data.getBytes()); + byte[] bytesSign = Base64.decode(sign); + return signature.verify(bytesSign); + } catch (Exception e) { + log.error("验签失败", e); + return false; + } + } + + private static PublicKey getPublicKeyFromX509(String algorithm, String publicKey) throws Exception { + KeyFactory keyFactory = KeyFactory.getInstance(algorithm); + return keyFactory.generatePublic(new X509EncodedKeySpec(Base64.decode(publicKey))); + } + + + // public static void main(String[] args) { +// // 激活 +// UPayConfig uPayConfig = new UPayConfig(); +// uPayConfig.setVendorSn("91801724"); +// uPayConfig.setVendorKey("80ecee91936004490496304e29b1fe5c"); +// uPayConfig.setWapAppId("2023032000005361"); +// uPayConfig.setCode("18531985"); +// JSONObject jsonObject = active(uPayConfig, "zbz-consume-pay-1"); +// log.info("返回数据: {}", jsonObject); +// } +// public static void main(String[] args) { +// // 下单 +// String url = "http://zbztest.yd-data.com"; +// UPayOrder order = UPayOrder.builder() +// .clientSn("3E32124asda211213") +// .totalAmount(new BigDecimal("0.01")) +// .operator("zbz") +// .notifyUrl(url) +// .returnUrl(url) +// .build(); +// String result = placeOrder(order, "100053610028601010", "50f76a2c11121f22bd4d62e8350ec0f6"); +// log.info(result); +// } +// public static void main(String[] args) { +// // 订单查询 +// queryOrder("1642812693868056576", "11111", "100053610028601010", "50f76a2c11121f22bd4d62e8350ec0f6"); +// } +// public static void main(String[] args) { +// // 订单退款 +// refund(URefund.builder() +// .clientSn("1642812693868056576") +// .refundRequestNo("11111") +// .operator("zbz") +// .refundAmount(new BigDecimal("0.01")) +// .build(), +// "100053610028601010", "50f76a2c11121f22bd4d62e8350ec0f6"); +// } +// public static void main(String[] args) { +// // 撤单 +// closeOrder("3E32124asda211213", "100053610028601010", "50f76a2c11121f22bd4d62e8350ec0f6"); +// } +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/WxPublicUtil.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/WxPublicUtil.java index c06f34b..6d327ff 100644 --- a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/WxPublicUtil.java +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/WxPublicUtil.java @@ -106,7 +106,7 @@ public class WxPublicUtil { public String getAccessToken(String appId, String secret) { String accessToken = - String.valueOf(redisService.get(FebsConstant.WX_PUBLIC_ACCESS_TOKEN + appId + "." + secret)); + String.valueOf(redisService.get(FebsConstant.WX_PUBLIC_ACCESS_TOKEN + appId + "." + secret)); if ("null".equals(accessToken)) { Map params = new HashMap<>(); params.put("grant_type", "client_credential"); @@ -117,7 +117,7 @@ public class WxPublicUtil { JSONObject token = JSONUtil.parseObj(response); if (token.containsKey("errcode") && !"0".equals(token.get("errcode").toString())) { log.error("请求微信公众号access token失败,code:{},msg:{}", token.get("errcode").toString(), - token.get("errmsg").toString()); + token.get("errmsg").toString()); throw new FebsException("验证失败"); } accessToken = token.get("access_token").toString(); @@ -138,7 +138,7 @@ public class WxPublicUtil { JSONObject token = JSONUtil.parseObj(response); if (token.containsKey("errcode") && !"0".equals(token.get("errcode"))) { log.error("请微信求access token失败,code:{},msg:{}", token.get("errcode"), - token.get("errmsg")); + token.get("errmsg")); throw new FebsException("验证失败"); } return token.getStr("openid"); @@ -151,10 +151,10 @@ public class WxPublicUtil { Map body = new HashMap<>(); body.put("media", img); JSONObject response = JSONUtil.parseObj( - post(WxPublicConstant.UPLOAD_NEWS_IMG + "?access_token=" + token, body)); + post(WxPublicConstant.UPLOAD_NEWS_IMG + "?access_token=" + token, body)); if (response.containsKey("errcode") && !"0".equals(response.get("errcode").toString())) { log.error("上传图片失败,code:{},msg:{}", response.get("errcode"), - response.get("errmsg")); + response.get("errmsg")); throw new FebsException("上传图片失败"); } return response.getStr("url"); @@ -166,10 +166,10 @@ public class WxPublicUtil { public String uploadNews(News news, String token) { String body = JSONUtil.toJsonPrettyStr(news); JSONObject response = JSONUtil.parseObj( - post(WxPublicConstant.UPLOAD_NEWS + "?access_token=" + token, body)); + post(WxPublicConstant.UPLOAD_NEWS + "?access_token=" + token, body)); if (response.containsKey("errcode") && !"0".equals(response.get("errcode").toString())) { log.error("上传图文素材失败,code:{},msg:{}", response.get("errcode"), - response.get("errmsg")); + response.get("errmsg")); throw new FebsException("上传图文素材失败"); } return response.getStr("media_id"); @@ -190,10 +190,10 @@ public class WxPublicUtil { put("send_ignore_reprint", 1); }}; JSONObject response = JSONUtil.parseObj( - post(WxPublicConstant.SEND_MSG + "?access_token=" + token, JSONUtil.toJsonStr(body))); + post(WxPublicConstant.SEND_MSG + "?access_token=" + token, JSONUtil.toJsonStr(body))); if (response.containsKey("errcode") && !"0".equals(response.get("errcode").toString())) { log.error("群发图文消息失败,code:{},msg:{}", response.get("errcode"), - response.get("errmsg")); + response.get("errmsg")); throw new FebsException("群发图文消息失败"); } return response.getStr("msg_data_id"); @@ -213,10 +213,10 @@ public class WxPublicUtil { set("msgtype", "text"); }}; JSONObject response = JSONUtil.parseObj( - post(WxPublicConstant.SEND_MSG + "?access_token=" + token, body)); + post(WxPublicConstant.SEND_MSG + "?access_token=" + token, body)); if (response.containsKey("errcode") && !"0".equals(response.get("errcode").toString())) { log.error("群发文本消息失败,code:{},msg:{}", response.get("errcode"), - response.get("errmsg")); + response.get("errmsg")); throw new FebsException("群发文本消息失败"); } return response.getStr("msg_data_id"); @@ -236,10 +236,10 @@ public class WxPublicUtil { set("msgtype", "voice"); }}; JSONObject response = JSONUtil.parseObj( - post(WxPublicConstant.SEND_MSG + "?access_token=" + token, body)); + post(WxPublicConstant.SEND_MSG + "?access_token=" + token, body)); if (response.containsKey("errcode") && !"0".equals(response.get("errcode").toString())) { log.error("群发音频消息失败,code:{},msg:{}", response.get("errcode"), - response.get("errmsg")); + response.get("errmsg")); throw new FebsException("群发音频消息失败"); } return response.getStr("msg_data_id"); @@ -259,10 +259,10 @@ public class WxPublicUtil { set("msgtype", "image"); }}; JSONObject response = JSONUtil.parseObj( - post(WxPublicConstant.SEND_MSG + "?access_token=" + token, body)); + post(WxPublicConstant.SEND_MSG + "?access_token=" + token, body)); if (response.containsKey("errcode") && !"0".equals(response.get("errcode").toString())) { log.error("群发音频消息失败,code:{},msg:{}", response.get("errcode"), - response.get("errmsg")); + response.get("errmsg")); throw new FebsException("群发音频消息失败"); } return response.getStr("msg_data_id"); @@ -282,10 +282,10 @@ public class WxPublicUtil { set("msgtype", "mpvideo"); }}; JSONObject response = JSONUtil.parseObj( - post(WxPublicConstant.SEND_MSG + "?access_token=" + token, body)); + post(WxPublicConstant.SEND_MSG + "?access_token=" + token, body)); if (response.containsKey("errcode") && !"0".equals(response.get("errcode").toString())) { log.error("群发音频消息失败,code:{},msg:{}", response.get("errcode"), - response.get("errmsg")); + response.get("errmsg")); throw new FebsException("群发音频消息失败"); } return response.getStr("msg_data_id"); @@ -305,10 +305,10 @@ public class WxPublicUtil { }})); } JSONObject response = JSONUtil.parseObj( - post(WxPublicConstant.UPLOAD_MATERIAL + "?access_token=" + token + "&type=" + type, body)); + post(WxPublicConstant.UPLOAD_MATERIAL + "?access_token=" + token + "&type=" + type, body)); if (response.containsKey("errcode") && !"0".equals(response.get("errcode").toString())) { log.error("上传永久素材失败,code:{},msg:{}", response.get("errcode"), - response.get("errmsg")); + response.get("errmsg")); throw new FebsException("上传永久素材失败"); } return response.getStr("media_id"); @@ -322,10 +322,10 @@ public class WxPublicUtil { put("media_id", mediaId); }}; JSONObject response = JSONUtil.parseObj( - post(WxPublicConstant.DELETE_MATERIAL + "?access_token=" + token, JSONUtil.toJsonStr(body))); + post(WxPublicConstant.DELETE_MATERIAL + "?access_token=" + token, JSONUtil.toJsonStr(body))); if (response.containsKey("errcode") && !"0".equals(response.get("errcode").toString())) { log.error("删除永久素材失败,code:{},msg:{}", response.get("errcode"), - response.get("errmsg")); + response.get("errmsg")); throw new FebsException("删除永久素材失败"); } } @@ -334,15 +334,15 @@ public class WxPublicUtil { * 上传临时素材 图片(image)、语音(voice)、视频(video)和缩略图(thumb) */ public String uploadTempMaterial(String type, File file, - String token) { + String token) { Map body = new HashMap() {{ put("media", file); }}; JSONObject response = JSONUtil.parseObj( - HttpUtil.post(WxPublicConstant.UPLOAD_TEMP_MATERIAL + "?access_token=" + token + "&type=" + type, body)); + HttpUtil.post(WxPublicConstant.UPLOAD_TEMP_MATERIAL + "?access_token=" + token + "&type=" + type, body)); if (response.containsKey("errcode") && !"0".equals(response.get("errcode").toString())) { log.error("上传临时素材失败,code:{},msg:{}", response.get("errcode"), - response.get("errmsg")); + response.get("errmsg")); throw new FebsException("上传临时素材失败"); } if ("thumb".equals(type)) { @@ -364,7 +364,7 @@ public class WxPublicUtil { return null; } String url = new StringBuilder(WxPublicConstant.QR_CODE).append("?access_token=").append(accessToken) - .toString(); + .toString(); JSONObject body = new JSONObject() {{ if (expire != null) { set("expire_seconds", expire); @@ -408,13 +408,13 @@ public class WxPublicUtil { }}); }}; String post = HttpUtil.post( - new StringBuilder(WxPublicConstant.PUSH_CUSTOM_MSG).append("?access_token=").append(accessToken).toString(), - body.toString()); + new StringBuilder(WxPublicConstant.PUSH_CUSTOM_MSG).append("?access_token=").append(accessToken).toString(), + body.toString()); log.info("发送客户消息,res:[{}],body:[{}]", post, body); } public void publishTemplateMsg(String accessToken, String openUserId, String templateId, String url, - JSONObject data) { + JSONObject data) { JSONObject body = new JSONObject() {{ set("touser", openUserId); if (StrUtil.isNotBlank(url)) { @@ -424,13 +424,12 @@ public class WxPublicUtil { set("data", data); }}; String post = HttpUtil.post(new StringBuilder(WxPublicConstant.PUSH_TEMPLATE_MSG).append( - "?access_token=").append(accessToken).toString(), body.toString()); + "?access_token=").append(accessToken).toString(), body.toString()); log.info("发送模板消息,res:[{}],body:[{}]", post, body); } /** - * 获取小程序URL Link - * https + post + * 获取小程序URL Link https + post * * @param accessToken token值 * @param generateUrlLink 获取小程序URL Link请求类 @@ -441,30 +440,62 @@ public class WxPublicUtil { public String generateUrlLink(String accessToken, GenerateUrlLink generateUrlLink) { // 封装参数 JSONObject body = JSONUtil.createObj() - .set("path", generateUrlLink.getPath()) - .set("query", generateUrlLink.getQuery()) - .set("env_version", generateUrlLink.getEnvVersion()) - .set("expire_type", generateUrlLink.getExpireType()) - .set("expire_interval", 30); + .set("path", generateUrlLink.getPath()) + .set("query", generateUrlLink.getQuery()) + .set("env_version", generateUrlLink.getEnvVersion()) + .set("expire_type", generateUrlLink.getExpireType()) + .set("expire_interval", 30); if (Objects.nonNull(generateUrlLink.getCloudBase())) { GenerateUrlLink.CloudBase cloudBase = generateUrlLink.getCloudBase(); body.set("cloud_base", JSONUtil.createObj() - .set("env", cloudBase.getEnv()) - .set("domain", cloudBase.getDomain()) - .set("path", cloudBase.getPath()) - .set("query", cloudBase.getQuery()) - .set("resource_appid", cloudBase.getResourceAppId()) + .set("env", cloudBase.getEnv()) + .set("domain", cloudBase.getDomain()) + .set("path", cloudBase.getPath()) + .set("query", cloudBase.getQuery()) + .set("resource_appid", cloudBase.getResourceAppId()) ); } // 请求接口 String result = HttpUtil.post(WxPublicConstant.GENERATE_URL_LINK + "?access_token=" + accessToken, body.toString()); - log.info("获取小程序URL Link接口, result: [{}], body: [{}]", result, body); +// log.info("获取小程序URL Link接口, result: [{}], body: [{}]", result, body); JSONObject response = JSONUtil.parseObj(result); if (response.containsKey("errcode") && !"0".equals(response.getStr("errcode"))) { log.error("获取小程序URL Link接口失败,code:{},msg:{}", response.get("errcode"), - response.get("errmsg")); + response.get("errmsg")); throw new FebsException("获取小程序URL Link接口失败"); } return response.getStr("url_link"); } + + /** + * 微信获取JS-SDK jsapi_ticket + * + * @param appId 微信appId + * @param secret 微信secret + * @return java.lang.String + * @author ZYJ + * @date 2023/6/5 14:50 + */ + public String getJsApiTicket(String appId, String secret) { + String jsApiTicket = + String.valueOf(redisService.get(FebsConstant.WX_PUBLIC_JS_API_TICKET + appId + "." + secret)); + if ("null".equals(jsApiTicket)) { + + Map params = new HashMap<>(); + params.put("access_token", getAccessToken(appId, secret)); + params.put("type", "jsapi"); + // 获取JS-SDK jsapi_ticket + String response = get(WxPublicConstant.GET_JS_API_TICKET_URL, params); + JSONObject token = JSONUtil.parseObj(response); + if (token.containsKey("errcode") && !"0".equals(token.get("errcode").toString())) { + log.error("获取JS-SDK jsapi_ticket失败,code:{},msg:{}", token.get("errcode").toString(), + token.get("errmsg").toString()); + throw new FebsException("验证失败"); + } + jsApiTicket = token.get("ticket").toString(); + // 缓存accessToken两小时 + redisService.set(FebsConstant.WX_PUBLIC_JS_API_TICKET + appId + "." + secret, jsApiTicket, 7200L); + } + return jsApiTicket; + } } diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/WxServiceProviderUtil.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/WxServiceProviderUtil.java new file mode 100644 index 0000000..20c7cef --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/WxServiceProviderUtil.java @@ -0,0 +1,407 @@ +package com.yida.data.common.core.utils; + +import cc.mrbird.febs.common.redis.service.RedisService; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HttpUtil; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.yida.data.common.core.entity.constant.QywxServiceProviderConstant; +import com.yida.data.common.core.exception.FebsException; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Map; + +/** + * 企业微信服务商工具类 + * + * @author ZYJ + * @date 2022/11/3 + */ +@Slf4j +@Component +public class WxServiceProviderUtil { + + /** + * 企业微信返回码 + */ + public static final String ERR_CODE = "errcode"; + + /** + * 企业微信对返回码的文本描述内容 + */ + public static final String ERR_MESSAGE = "errmsg"; + + /** + * 企业微信接口成功状态码 + */ + public static final String SUCCESS_CODE = "0"; + + public static final String ACCESS_TOKEN = "access_token"; + + public static final String SUITE_ACCESS_TOKEN = "suite_access_token"; + + public static final String PERMANENT_CODE = "permanent_code"; + + public static final String PROVIDER_ACCESS_TOKEN = "provider_access_token"; + + @Autowired + private RedisService redisService; + + private static String post(String url, String body) { + return post(1, url, body); + } + + private static String post(String url, Map body) { + return post(1, url, body); + } + + private static String post(Integer count, String url, String body) { + if (count <= 3) { + String res = null; + try { + res = HttpUtil.post(url, body); + } catch (Exception e) { + log.error("调用企业微信服务商接口异常: {}", e.getMessage(), e); + if (StrUtil.isNotBlank(e.getMessage()) && e.getMessage().contains("UnknownHostException")) { + try { + Thread.sleep(500L); + } catch (InterruptedException interruptedException) { + interruptedException.printStackTrace(); + } + res = post(++count, url, body); + } + } + return res; + } + return null; + } + + private static String post(Integer count, String url, Map body) { + if (count <= 3) { + String res = null; + try { + res = HttpUtil.post(url, body); + } catch (Exception e) { + log.error("调用企业微信服务商接口异常: {}", e.getMessage(), e); + if (StrUtil.isNotBlank(e.getMessage()) && e.getMessage().contains("UnknownHostException")) { + try { + Thread.sleep(500L); + } catch (InterruptedException interruptedException) { + interruptedException.printStackTrace(); + } + res = post(++count, url, body); + } + } + return res; + } + return null; + } + + private static String get(String url, Map params) { + return get(1, url, params); + } + + private static String get(Integer count, String url, Map params) { + if (count <= 3) { + String res = null; + try { + res = HttpUtil.get(url, params); + } catch (Exception e) { + log.error("调用企业微信服务商接口异常: {}", e.getMessage(), e); + if (StrUtil.isNotBlank(e.getMessage()) && e.getMessage().contains("UnknownHostException")) { + try { + Thread.sleep(500L); + } catch (InterruptedException interruptedException) { + interruptedException.printStackTrace(); + } + res = get(++count, url, params); + } + } + return res; + } else { + return null; + } + } + + /** + * 获取服务商凭证 + * + * @param corpId 服务商的corpid + * @param providerSecret 服务商的secret + * @return java.lang.String + * @author ZYJ + * @date 2022/11/9 13:50 + */ + public String getProviderToken(String corpId, String providerSecret) { + String providerToken = String.valueOf(redisService.get(QywxServiceProviderConstant.PROVIDER_TOKEN + corpId + "." + providerSecret)); + if ("null".equals(providerToken)) { + // 封装请求参数 + JSONObject jsonObject = JSONUtil.createObj() + .set("corpid", corpId) + .set("provider_secret", providerSecret); + // 获取服务商凭证 + String response = post(QywxServiceProviderConstant.GET_PROVIDER_TOKEN_URL, jsonObject.toString()); + JSONObject token = JSONUtil.parseObj(response); + log.info("企业微信服务商请求provider_token请求参数: {}, 返回值: {}", jsonObject, token); + if (!token.containsKey(PROVIDER_ACCESS_TOKEN)) { + throw new FebsException("企业微信服务商请求provider_token失败"); + } + providerToken = token.get(PROVIDER_ACCESS_TOKEN).toString(); + // 缓存accessToken两小时 + redisService.set(QywxServiceProviderConstant.PROVIDER_TOKEN + corpId + "." + providerSecret, providerToken, 7200L); + } + return providerToken; + } + + /** + * 获取企业凭证 + * + * @param authCorpId 授权方corpId + * @param permanentCode 永久授权码 + * @param suiteAccessToken 第三方应用凭证 + * @return java.lang.String + * @author ZYJ + * @date 2022/11/21 17:23 + */ + public String getCorpToken(String authCorpId, String permanentCode, String suiteAccessToken) { + String corpToken = String.valueOf(redisService.get(QywxServiceProviderConstant.CORP_TOKEN + authCorpId + "." + permanentCode)); + if ("null".equals(corpToken)) { + // 封装请求参数 + JSONObject jsonObject = JSONUtil.createObj() + .set("auth_corpid", authCorpId) + .set("permanent_code", permanentCode); + // 获取企业凭证 + String response = post(QywxServiceProviderConstant.GET_CORP_TOKEN_URL + suiteAccessToken, jsonObject.toString()); + JSONObject token = JSONUtil.parseObj(response); + log.info("企业微信请求corp_token请求参数: {}, 返回值: {}", jsonObject, token); + if (!token.containsKey(ACCESS_TOKEN)) { + throw new FebsException("企业微信请求corp_token失败"); + } + corpToken = token.get(ACCESS_TOKEN).toString(); + // 缓存accessToken两小时 + redisService.set(QywxServiceProviderConstant.CORP_TOKEN + authCorpId + "." + permanentCode, corpToken, 7200L); + } + return corpToken; + } + + /** + * 获取第三方应用凭证 + * + * @param suiteId 第三方应用id或者代开发应用模板id + * @param suiteSecret 第三方应用secret 或者代开发应用模板secret + * @param suiteTicket 企业微信后台推送的ticket + * @return java.lang.String + * @author ZYJ + * @date 2022/11/3 15:53 + */ + public String getSuiteAccessToken(String suiteId, String suiteSecret, String suiteTicket) { + String accessToken = String.valueOf(redisService.get(QywxServiceProviderConstant.SUITE_ACCESS_TOKEN + suiteId + "." + suiteSecret)); + if ("null".equals(accessToken)) { + // 封装请求参数 + JSONObject jsonObject = JSONUtil.createObj() + .set("suite_id", suiteId) + .set("suite_secret", suiteSecret) + .set("suite_ticket", suiteTicket); + // 请求微信access token + String response = post(QywxServiceProviderConstant.GET_SUITE_TOKEN_URL, jsonObject.toString()); + JSONObject token = JSONUtil.parseObj(response); + log.info("企业微信服务商请求suite_access_token请求参数: {}, 返回值: {}", jsonObject, token); + if (!token.containsKey(SUITE_ACCESS_TOKEN)) { + throw new FebsException("企业微信服务商请求suite_access_token失败"); + } + accessToken = token.get(SUITE_ACCESS_TOKEN).toString(); + // 缓存accessToken两小时 + redisService.set(QywxServiceProviderConstant.SUITE_ACCESS_TOKEN + suiteId + "." + suiteSecret, accessToken, 7200L); + } + return accessToken; + } + + /** + * 获取企业永久授权码 + * + * @param suiteAccessToken 第三方应用凭证 + * @param authCode 临时授权码 + * @return cn.hutool.json.JSONObject + * @author ZYJ + * @date 2022/11/3 17:55 + */ + public JSONObject getPermanentCode(String suiteAccessToken, String authCode) { + // 封装请求参数 + JSONObject jsonObject = JSONUtil.createObj().set("auth_code", authCode); + + JSONObject response = JSONUtil.parseObj(post(QywxServiceProviderConstant.GET_PERMANENT_CODE_URL + suiteAccessToken, + jsonObject.toString())); + log.info("获取企业服务商永久授权码请求参数: {}, 返回值: {}", jsonObject, response); + if (!response.containsKey(PERMANENT_CODE)) { + throw new FebsException("获取企业服务商永久授权码失败"); + } + return response; + } + + /** + * 获取企业授权信息 + * + * @param suiteAccessToken 第三方应用凭证 + * @param authCorpId 授权方corpid + * @param permanentCode 永久授权码 + * @return cn.hutool.json.JSONObject + * @author ZYJ + * @date 2022/11/7 14:02 + */ + public JSONObject getAuthInfo(String suiteAccessToken, String authCorpId, String permanentCode) { + // 封装请求参数 + JSONObject jsonObject = JSONUtil.createObj() + .set("auth_corpid", authCorpId) + .set("permanent_code", permanentCode); + + JSONObject response = JSONUtil.parseObj(post(QywxServiceProviderConstant.GET_AUTH_INFO_URL + suiteAccessToken, + jsonObject.toString())); + log.info("获取企业授权信息请求参数: {}, 返回值: {}", jsonObject, response); + if (!response.containsKey(PERMANENT_CODE)) { + throw new FebsException("获取企业授权信息失败"); + } + return response; + } + + /** + * 获取企业授权信息 + * + * @param suiteAccessToken 第三方应用凭证 + * @param authCode 临时授权码 + * @return cn.hutool.json.JSONObject + * @author ZYJ + * @date 2022/11/7 15:11 + */ + public JSONObject getAuthInfoDetail(String suiteAccessToken, String authCode) { + // 获取企业永久授权码 + JSONObject jsonObject = getPermanentCode(suiteAccessToken, authCode); + String permanentCode = jsonObject.getStr(PERMANENT_CODE); + String authCorpId = jsonObject.getJSONObject("auth_corp_info").getStr("corpid"); + + return getAuthInfo(suiteAccessToken, authCorpId, permanentCode); + } + + /** + * corpId转换 + * + * @param providerAccessToken 服务商凭证 + * @param corpId 企业ID + * @return java.lang.String + * @author ZYJ + * @date 2022/11/10 9:52 + */ + public String convertCorpId(String providerAccessToken, String corpId) { + // 封装请求参数 + JSONObject jsonObject = JSONUtil.createObj() + .set("corpid", corpId); + JSONObject response = JSONUtil.parseObj(post(QywxServiceProviderConstant.CONVERT_CORP_ID_URL + providerAccessToken, + jsonObject.toString())); + log.info("corpId转换请求参数: {}, 返回值: {}", jsonObject, response); + if (!SUCCESS_CODE.equals(response.containsKey(ERR_CODE) ? response.get(ERR_CODE).toString() : null)) { + log.error("corpId转换失败,code:{},msg:{},params:{}", response.get(ERR_CODE), + response.get(ERR_MESSAGE), jsonObject); + throw new FebsException("corpId转换失败"); + } + return response.getStr("open_corpid"); + } + + /** + * userId转换(单个用户id转换) + * 将企业主体下的明文userid转换为服务商主体下的密文userid + * + * @param accessToken 应用access_token + * @param userId 成员ID + * @return java.lang.String + * @author ZYJ + * @date 2022/12/1 10:33 + */ + public String convertUserIdToSecret(String accessToken, String userId) { + JSONArray array = JSONUtil.createArray(); + array.add(userId); + // 封装请求参数 + JSONObject jsonObject = JSONUtil.createObj() + .set("userid_list", array); + JSONObject response = JSONUtil.parseObj(post(QywxServiceProviderConstant.CONVERT_USER_ID_TO_SECRET_URL + accessToken, + jsonObject.toString())); + log.info("明文userId转换密文userId请求参数: {}, 返回值: {}", jsonObject, response); + if (!SUCCESS_CODE.equals(response.containsKey(ERR_CODE) ? response.get(ERR_CODE).toString() : null)) { + log.error("明文userId转换密文userId失败,code:{},msg:{},params:{}", response.get(ERR_CODE), + response.get(ERR_MESSAGE), jsonObject); + throw new FebsException("明文userId转换密文userId失败"); + } + // 返回的转换用户id信息 + JSONArray userArray = response.getJSONArray("open_userid_list"); + if (CollUtil.isEmpty(userArray)) { + log.error("明文userId转换密文userId失败"); + throw new FebsException("明文userId转换密文userId失败"); + } + Object object = userArray.get(0); + JSONObject obj = JSONUtil.parseObj(object); + return obj.getStr("open_userid"); + } + + /** + * userId的转换 + * 将代开发应用或第三方应用获取的密文open_userid转换为明文userid + * + * @param accessToken 企业自建应用或基础应用的调用接口凭证 + * @param userId 成员ID + * @param agentId 企业授权的代开发自建应用或第三方应用的agentid + * @return java.lang.String + * @author ZYJ + * @date 2023/2/2 10:31 + */ + public String convertUserIdToPlain(String accessToken, String userId, String agentId) { + JSONArray array = JSONUtil.createArray(); + array.add(userId); + // 封装请求参数 + JSONObject jsonObject = JSONUtil.createObj() + .set("open_userid_list", array) + .set("source_agentid", agentId); + JSONObject response = JSONUtil.parseObj(post(QywxServiceProviderConstant.CONVERT_USER_ID_TO_PLAIN_URL + accessToken, + jsonObject.toString())); + log.info("密文userId转换明文userId请求参数: {}, 返回值: {}", jsonObject, response); + if (!SUCCESS_CODE.equals(response.containsKey(ERR_CODE) ? response.get(ERR_CODE).toString() : null)) { + log.error("密文userId转换明文userId失败,code:{},msg:{},params:{}", response.get(ERR_CODE), + response.get(ERR_MESSAGE), jsonObject); + throw new FebsException("密文userId转换明文userId失败"); + } + // 返回的转换用户id信息 + JSONArray userArray = response.getJSONArray("userid_list"); + if (CollUtil.isEmpty(userArray)) { + log.error("密文userId转换明文userId失败"); + throw new FebsException("密文userId转换明文userId失败"); + } + Object object = userArray.get(0); + JSONObject obj = JSONUtil.parseObj(object); + return obj.getStr("userid"); + } + + /** + * 手机号获取userId + * + * @param corpAccessToken 企业token + * @param mobile 手机号 + * @return java.lang.String + * @author ZYJ + * @date 2023/2/2 10:25 + */ + public String getUserIdByMobile(String corpAccessToken, String mobile) { + // 封装请求参数 + JSONObject jsonObject = JSONUtil.createObj() + .set("mobile", mobile); + JSONObject response = JSONUtil.parseObj(post(QywxServiceProviderConstant.GET_USER_ID_BY_MOBILE_URL + corpAccessToken, + jsonObject.toString())); + log.info("手机号获取userId请求参数: {}, 返回值: {}", jsonObject, response); + if (!SUCCESS_CODE.equals(response.containsKey(ERR_CODE) ? response.get(ERR_CODE).toString() : null)) { + log.error("手机号获取userId失败,code:{},msg:{},params:{}", response.get(ERR_CODE), + response.get(ERR_MESSAGE), jsonObject); + throw new FebsException("手机号获取userId失败"); + } + return ""; + } +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/WxUtil.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/WxUtil.java index 99248a8..3eab974 100644 --- a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/WxUtil.java +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/WxUtil.java @@ -9,28 +9,20 @@ import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.yida.data.common.core.entity.constant.FebsConstant; import com.yida.data.common.core.entity.constant.QywxConstant; +import com.yida.data.common.core.entity.constant.WxPublicConstant; import com.yida.data.common.core.entity.notice.qywx.BaseSchoolNotice; import com.yida.data.common.core.entity.notice.qywx.BaseStaffNotice; import com.yida.data.common.core.entity.system.Dept; -import com.yida.data.common.core.entity.user.EduParent; -import com.yida.data.common.core.entity.user.EduStaff; -import com.yida.data.common.core.entity.user.EduStaffDept; -import com.yida.data.common.core.entity.user.EduStudent; -import com.yida.data.common.core.entity.user.EduTeacherDept; -import com.yida.data.common.core.entity.user.EduUserDept; +import com.yida.data.common.core.entity.user.*; import com.yida.data.common.core.exception.FebsException; -import java.io.File; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import java.io.File; +import java.util.*; +import java.util.stream.Collectors; + @Component @Slf4j public class WxUtil { @@ -176,7 +168,7 @@ public class WxUtil { public Boolean pushSchoolNotice(String token, BaseSchoolNotice notice) { JSONObject resp = JSONUtil.parseObj(post(QywxConstant.PUSH_SCHOOL_NOTICE_URL + token, JSONUtil.toJsonStr(notice).replace("\\n", "\n"))); - log.info("打印学校消息推送信息: {}", JSONUtil.toJsonStr(notice).replace("\\n", "\n")); +// log.info("打印学校消息推送信息: {}", JSONUtil.toJsonStr(notice).replace("\\n", "\n")); if (!"0".equals(resp.containsKey("errcode") ? resp.get("errcode").toString() : null)) { log.error("微信通知发送失败,msg:{},notice:{}", resp, notice); return false; @@ -184,12 +176,14 @@ public class WxUtil { return true; } + public Boolean pushStaffNotice(String token, BaseStaffNotice notice) { +// log.info("打印学校消息推送信息: {}", JSONUtil.toJsonStr(notice).replace("\\n", "\n")); JSONObject resp = JSONUtil.parseObj(post(QywxConstant.PUSH_STAFF_NOTICE_URL + token, JSONUtil.toJsonStr(notice).replace("\\n", "\n"))); - log.info("打印学校消息推送信息: {}", JSONUtil.toJsonStr(notice).replace("\\n", "\n")); +// log.info("打印学校消息推送信息返回信息: {}", resp); if (!"0".equals(resp.containsKey("errcode") ? resp.get("errcode").toString() : null)) { - log.error("微信通知发送失败,msg:{},notice:{}", resp.get("errmsg"), notice); + log.error("微信通知发送失败,msg:{},notice:{}", resp.get("errmsg"), JSONUtil.toJsonStr(notice).replace("\\n", "\n")); return false; } return true; @@ -226,6 +220,41 @@ public class WxUtil { return user.getJSONArray("userlist"); } + /** + * 获取成员ID列表 + * + * @param accessToken 调用接口凭证 + * @param cursor 用于分页查询的游标,字符串类型,由上一次调用返回,首次调用不填 + * @param limit 分页,预期请求的数据量,取值范围 1 ~ 10000 + * @return cn.hutool.json.JSONArray + * @author ZYJ + * @date 2022/12/6 17:35 + */ + public JSONArray getUserIdList(String accessToken, String cursor, String limit, JSONArray jsonArray) { + // 封装请求参数 + JSONObject params = JSONUtil.createObj() + .set("limit", limit); + if (StrUtil.isNotBlank(cursor)) { + params.set("cursor", cursor); + } + String response = post(QywxConstant.USER_ID_LIST_URL + accessToken, params.toString()); + JSONObject jsonObject = JSONUtil.parseObj(response); + log.info("企业微信获取成员ID列表请求参数: {}, 返回值: {}", params, jsonObject); + if (!SUCCESS_CODE.equals(jsonObject.containsKey(ERR_CODE) ? jsonObject.get(ERR_CODE).toString() : null)) { + log.error("企业微信获取获取成员ID列表失败,code:{},msg:{}", jsonObject.get(ERR_CODE), jsonObject.get(ERR_MESSAGE)); + throw new FebsException("企业微信获取获取成员ID列表失败"); + } + // 获取成员列表id数据 + JSONArray deptUser = jsonObject.getJSONArray("dept_user"); + jsonArray.addAll(deptUser); + // 获取分页游标 + String nextCursor = jsonObject.getStr("next_cursor"); + if (StrUtil.isNotBlank(nextCursor)) { + getUserIdList(accessToken, nextCursor, limit, jsonArray); + } + return jsonArray; + } + /** * 使用授权登陆code,获取成员信息,通讯录成员返回UserId,家长返回parent_userid */ @@ -236,14 +265,17 @@ public class WxUtil { params.put("code", code); String response = get(QywxConstant.USER_INFO_URL, params); JSONObject user = JSONUtil.parseObj(response); - if (!"0".equals(user.containsKey("errcode") ? user.get("errcode").toString() : null)) { - log.error("请求微信用户信息失败,code:{},msg:{}", user.get("errcode"), - user.get("errmsg")); + if (!SUCCESS_CODE.equals(user.containsKey(ERR_CODE) ? user.get(ERR_CODE).toString() : null)) { + log.error("请求微信用户信息失败,code:{},msg:{}", user.get(ERR_CODE), + user.get(ERR_MESSAGE)); throw new FebsException("获取用户信息失败"); } return user; } + /** + * 查询用户详细信息 + */ public JSONObject getUserDetail(String accessToken, String userId) { // 查询用户微信userid Map params = new HashMap<>(); @@ -251,10 +283,34 @@ public class WxUtil { params.put("userid", userId); String userDetailResponse = get(QywxConstant.USER_DETAIL_URL, params); JSONObject userDetail = JSONUtil.parseObj(userDetailResponse); - if (!"0".equals(userDetail.containsKey("errcode") ? userDetail.get("errcode").toString() : null)) { - log.error("请求微信用户详细信息失败,code:{},msg:{}", userDetail.get("errcode"), - userDetail.get("errmsg")); - throw new FebsException("获取用户信息失败"); + log.info("请求企业微信用户详细信息请求参数: {}, 返回值: {}", params, userDetail); + if (!SUCCESS_CODE.equals(userDetail.containsKey(ERR_CODE) ? userDetail.get(ERR_CODE).toString() : null)) { + log.error("请求企业微信用户详细信息失败,code:{},msg:{}", userDetail.get(ERR_CODE), + userDetail.get(ERR_MESSAGE)); + throw new FebsException("请求企业微信用户详细信息失败"); + } + return userDetail; + } + + /** + * 查询用户敏感信息 + * + * @param accessToken 调用接口凭证 + * @param userTicket 成员票据 + * @return cn.hutool.json.JSONObject + * @author ZYJ + * @date 2022/11/28 15:35 + */ + public JSONObject getUserSensitiveInfo(String accessToken, String userTicket) { + JSONObject params = JSONUtil.createObj() + .set("user_ticket", userTicket); + String userDetailResponse = post(QywxConstant.USER_SENSITIVE_INFO_URL + accessToken, params.toString()); + JSONObject userDetail = JSONUtil.parseObj(userDetailResponse); + log.info("查询用户敏感信息请求参数: {}, 返回值: {}", params, userDetail); + if (!SUCCESS_CODE.equals(userDetail.containsKey(ERR_CODE) ? userDetail.get(ERR_CODE).toString() : null)) { + log.error("查询用户敏感信息失败,code:{}, msg:{}", userDetail.get(ERR_CODE), + userDetail.get(ERR_MESSAGE)); + throw new FebsException("查询用户敏感信息失败"); } return userDetail; } @@ -328,9 +384,9 @@ public class WxUtil { if (deptId != null) { params.put("id", deptId); } - JSONObject response = JSONUtil.parseObj( get(QywxConstant.DEPT_LIST_URL, params)); + log.info("获取企业微信部门列表请求参数: {}, 返回值: {}", params, response); if (!"0".equals(response.containsKey("errcode") ? response.get("errcode").toString() : null)) { log.error("获取企业微信部门列表失败,code:{},msg:{},params:{}", response.get("errcode"), response.get("errmsg"), params); @@ -340,6 +396,50 @@ public class WxUtil { return response.getJSONArray("department").toList(Map.class); } + /** + * 获取子部门ID列表 + * + * @param accessToken 调用接口凭证 + * @param deptId 部门id。获取指定部门及其下的子部门(以及子部门的子部门等等,递归)。 如果不填,默认获取全量组织架构 + * @return java.util.List + * @author ZYJ + * @date 2023/4/24 10:46 + */ + public List listSimpleDept(String accessToken, Long deptId) { + Map params = new HashMap<>(); + params.put("access_token", accessToken); + if (deptId != null) { + params.put("id", deptId); + } + JSONObject response = JSONUtil.parseObj(get(QywxConstant.SIMPLE_DEPT_LIST_URL, params)); + log.info("获取企业微信子部门ID列表请求参数: {}, 返回值: {}", params, response); + if (!SUCCESS_CODE.equals(response.containsKey(ERR_CODE) ? response.get(ERR_CODE).toString() : null)) { + log.error("获取企业微信子部门ID列表失败,code:{},msg:{},params:{}", response.get(ERR_CODE), + response.get(ERR_MESSAGE), params); + throw new FebsException("获取企业微信子部门ID列表失败"); + } + return response.getJSONArray("department_id").toList(Map.class); + } + + /** + * 获取单个部门详情 + */ + public JSONObject getDeptInfo(String accessToken, String deptId) { + Map params = new HashMap<>(); + params.put("access_token", accessToken); + if (deptId != null) { + params.put("id", deptId); + } + JSONObject response = JSONUtil.parseObj(get(QywxConstant.DEPT_INFO_URL, params)); + log.info("获取企业单个部门详情请求参数: {}, 返回值: {}", params, response); + if (!SUCCESS_CODE.equals(response.containsKey(ERR_CODE) ? response.get(ERR_CODE).toString() : null)) { + log.error("获取企业单个部门详情失败,code:{},msg:{},params:{}", response.get(ERR_CODE), + response.get(ERR_MESSAGE), params); + throw new FebsException("获取企业单个部门详情失败"); + } + return response.getJSONObject("department"); + } + /** * 创建企业微信部门(家校沟通) */ @@ -407,10 +507,10 @@ public class WxUtil { JSONObject response = JSONUtil.parseObj( post(QywxConstant.SCHOOL_DEPT_UPDATE_URL + "?access_token=" + accessToken, JSONUtil.toJsonStr(body))); - log.info("删除部门,params:[{}],res:[{}]", body, response); - if (!"0".equals(response.containsKey("errcode") ? response.get("errcode").toString() : null)) { - log.error("企业微信删除部门(家校)管理员失败,code:{},msg:{}", response.get("errcode"), - response.get("errmsg")); + log.info("删除部门管理员接口,params:[{}],res:[{}]", body, response); + if (!SUCCESS_CODE.equals(response.containsKey(ERR_CODE) ? response.get(ERR_CODE).toString() : null)) { + log.error("企业微信删除部门(家校)管理员失败,code:{},msg:{}", response.get(ERR_CODE), + response.get(ERR_MESSAGE)); throw new FebsException("删除部门(家校)管理员失败"); } } @@ -444,9 +544,10 @@ public class WxUtil { } JSONObject response = JSONUtil.parseObj( get(QywxConstant.SCHOOL_DEPT_LIST_URL, params)); - if (!"0".equals(response.containsKey("errcode") ? response.get("errcode").toString() : null)) { - log.error("获取企业微信部门(家校)列表失败,code:{},msg:{},params:{}", response.get("errcode"), - response.get("errmsg"), params); + log.info("获取家校沟通部门列表请求参数: {}, 返回值: {}", params, response); + if (!SUCCESS_CODE.equals(response.containsKey(ERR_CODE) ? response.get(ERR_CODE).toString() : null)) { + log.error("获取企业微信部门(家校)列表失败,code:{},msg:{},params:{}", response.get(ERR_CODE), + response.get(ERR_MESSAGE), params); throw new FebsException("获取企业微信部门(家校)列表失败"); } @@ -489,6 +590,9 @@ public class WxUtil { if (StrUtil.isNotBlank(staff.getLandLine())) { body.put("telephone", staff.getLandLine()); } + if (StrUtil.isNotBlank(staff.getAddress())) { + body.put("address", staff.getAddress()); + } log.info(JSONUtil.toJsonStr(body)); JSONObject response = JSONUtil.parseObj( post(QywxConstant.USER_CREATE_URL + "?access_token=" + accessToken, @@ -564,12 +668,15 @@ public class WxUtil { if (StrUtil.isNotBlank(staff.getLandLine())) { body.put("telephone", staff.getLandLine()); } + if (StrUtil.isNotBlank(staff.getAddress())) { + body.put("address", staff.getAddress()); + } log.info(JSONUtil.toJsonStr(body)); JSONObject response = JSONUtil.parseObj( post(QywxConstant.USER_UPDATE_URL + "?access_token=" + accessToken, JSONUtil.toJsonStr(body))); if (!"0".equals(response.containsKey("errcode") ? response.get("errcode").toString() : null)) { - log.error("企业微信新增用户失败,code:{},msg:{}", response.get("errcode"), + log.error("企业微信修改用户失败,code:{},msg:{}", response.get("errcode"), response.get("errmsg")); throw new FebsException("更新职工失败"); } @@ -584,6 +691,7 @@ public class WxUtil { JSONObject response = JSONUtil.parseObj( post(QywxConstant.USER_DELETE_URL + "?access_token=" + accessToken, JSONUtil.toJsonStr(body))); + log.info("企业微信删除用户请求参数: {}, 返回值: {}", body, response); if (!"0".equals(response.containsKey("errcode") ? response.get("errcode").toString() : null)) { log.error("企业微信删除用户失败,code:{},msg:{}", response.get("errcode"), response.get("errmsg")); @@ -719,6 +827,7 @@ public class WxUtil { JSONObject response = JSONUtil.parseObj( post(QywxConstant.PARENT_CREATE_URL + "?access_token=" + accessToken, JSONUtil.toJsonStr(body))); + log.info("企业微信新增家长,res:[{}],params:[{}]", response, body); if (!"0".equals(response.containsKey("errcode") ? response.get("errcode").toString() : null)) { log.error("企业微信新增家长失败,code:{},msg:{},result_list:{}", response.get("errcode"), response.get("errmsg"), response.get("result_list")); @@ -874,10 +983,43 @@ public class WxUtil { JSONObject response = JSONUtil.parseObj( get(QywxConstant.SCHOOL_DEPT_DELETE_URL, params)); - if (!SUCCESS_CODE.equals(response.containsKey(ERR_CODE) ? response.get(ERR_CODE).toString() : null)) { + String code = response.containsKey(ERR_CODE) ? response.get(ERR_CODE).toString() : null; + // 60003代表企业微信部门不存在 + if (!SUCCESS_CODE.equals(code) && !"60003".equals(code)) { log.error("企业微信删除家校部门失败,code:{},msg:{},params:{}", response.get(ERR_CODE), response.get(ERR_MESSAGE), params); throw new FebsException("删除家校部门失败,请检查是否包含成员或子部门"); } } + + /** + * 获取企业微信JS-SDK jsapi_ticket + * + * @param accessToken 应用token + * @param deptId 部门id + * @return java.lang.String + * @author ZYJ + * @date 2023/6/5 14:50 + */ + public String getJsApiTicket(String accessToken, Long deptId) { + String jsApiTicket = + String.valueOf(redisService.get(FebsConstant.QYWX_WX_JS_API_TICKET + deptId)); + if ("null".equals(jsApiTicket)) { + + Map params = new HashMap<>(); + params.put("access_token", accessToken); + // 获取JS-SDK jsapi_ticket + String response = get(QywxConstant.GET_JS_API_TICKET_URL, params); + JSONObject token = JSONUtil.parseObj(response); + if (token.containsKey("errcode") && !"0".equals(token.get("errcode").toString())) { + log.error("获取JS-SDK jsapi_ticket失败,code:{},msg:{}", token.get("errcode").toString(), + token.get("errmsg").toString()); + throw new FebsException("验证失败"); + } + jsApiTicket = token.get("ticket").toString(); + // 缓存accessToken两小时 + redisService.set(FebsConstant.QYWX_WX_JS_API_TICKET + deptId, jsApiTicket, 7200L); + } + return jsApiTicket; + } } diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/construction/ABAProvider.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/construction/ABAProvider.java new file mode 100644 index 0000000..4d9b54c --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/construction/ABAProvider.java @@ -0,0 +1,64 @@ +package com.yida.data.common.core.utils.construction; + +import java.security.Provider; + +/** + * ABAProvider类 + * + * @author ZYJ + * @date 2023/6/22 2:24 + */ +public class ABAProvider extends Provider { + + private static String info = "ABA Security Provider v1.1, SHA, MD5 message Digests, and Crypto algorithms."; + + public ABAProvider() { + super("ABA", 1.1, info); + this.put("MessageDigest.MD5", "netpay.merchant.crypto.MD5"); + this.put("MessageDigest.SHA-1", "netpay.merchant.crypto.SHA1"); + this.put("Alg.Alias.MessageDigest.SHA1", "SHA-1"); + this.put("Alg.Alias.MessageDigest.SHA", "SHA-1"); + this.put("MessageDigest.SHA-0", "netpay.merchant.crypto.SHA0"); + this.put("MessageDigest.CRC16", "netpay.merchant.crypto.CRC16"); + this.put("Cipher.RSA", "netpay.merchant.crypto.RSA"); + this.put("Alg.Alias.Cipher.OID.1.2.840.113549.1.1.1", "RSA"); + this.put("Cipher.RC4", "netpay.merchant.crypto.RC4"); + this.put("Cipher.DES", "netpay.merchant.crypto.DES"); + this.put("Cipher.DESede", "netpay.merchant.crypto.DESede"); + this.put("Cipher.IDEA", "netpay.merchant.crypto.IDEA"); + this.put("Cipher.Blowfish", "netpay.merchant.crypto.Blowfish"); + this.put("Cipher.Twofish", "netpay.merchant.crypto.Twofish"); + this.put("Cipher.PBEWithMD5AndDES", "netpay.merchant.crypto.PBEWithMD5AndDES"); + this.put("Cipher.PBEWithSHA1And128BitRC4", "netpay.merchant.crypto.PBEWithSHA1And128BitRC4"); + this.put("Mac.DESMac", "netpay.merchant.crypto.DESMac"); + this.put("Alg.Alias.Mac.DES-MAC", "DESMac"); + this.put("KeyPairGenerator.RSA", "netpay.merchant.crypto.RSAKeyPairGenerator"); + this.put("Alg.Alias.KeyPairGenerator.OID.1.2.840.113549.1.1.1", "RSA"); + this.put("Alg.Alias.KeyPairGenerator.1.2.840.113549.1.1.1", "RSA"); + this.put("KeyGenerator.RC4", "netpay.merchant.crypto.RC4KeyGenerator"); + this.put("KeyGenerator.DES", "netpay.merchant.crypto.DESKeyGenerator"); + this.put("KeyGenerator.DESede", "netpay.merchant.crypto.DESedeKeyGenerator"); + this.put("KeyGenerator.IDEA", "netpay.merchant.crypto.IDEAKeyGenerator"); + this.put("KeyGenerator.Blowfish", "netpay.merchant.crypto.BlowfishKeyGenerator"); + this.put("KeyGenerator.Twofish", "netpay.merchant.crypto.TwofishKeyGenerator"); + this.put("KeyFactory.RSA", "netpay.merchant.crypto.RSAKeyFactory"); + this.put("Alg.Alias.KeyFactory.1.2.840.113549.1.1.1", "RSA"); + this.put("SecretKeyFactory.DES", "netpay.merchant.crypto.DESKeyFactory"); + this.put("SecretKeyFactory.DESede", "netpay.merchant.crypto.DESedeKeyFactory"); + this.put("SecretKeyFactory.RC4", "netpay.merchant.crypto.RC4KeyFactory"); + this.put("SecretKeyFactory.IDEA", "netpay.merchant.crypto.IDEAKeyFactory"); + this.put("SecretKeyFactory.Blowfish", "netpay.merchant.crypto.BlowfishKeyFactory"); + this.put("SecretKeyFactory.Twofish", "netpay.merchant.crypto.TwofishKeyFactory"); + this.put("SecretKeyFactory.PBEWithMD5AndDES", "netpay.merchant.crypto.PBEKeyFactory"); + this.put("SecretKeyFactory.PBEWithSHA1And128BitRC4", "netpay.merchant.crypto.PBEKeyFactory"); + this.put("KeyStore.ABA", "netpay.merchant.crypto.KeyStore"); + this.put("Signature.MD5withRSA", "netpay.merchant.crypto.MD5withRSA"); + this.put("Alg.Alias.Signature.MD5/RSA", "MD5withRSA"); + this.put("Alg.Alias.Signature.OID.1.2.840.113549.1.1.4", "MD5withRSA"); + this.put("Alg.Alias.Signature.1.2.840.113549.1.1.4", "MD5withRSA"); + this.put("Alg.Alias.Signature.1.3.14.3.2.25", "MD5withRSA"); + this.put("CertificateFactory.X509", "au.net.aba.cert.ABAX509CertFactory"); + this.put("Alg.Alias.CertificateFactory.X.509", "X509"); + } + +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/construction/DER.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/construction/DER.java new file mode 100644 index 0000000..f3f98d2 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/construction/DER.java @@ -0,0 +1,96 @@ +package com.yida.data.common.core.utils.construction; + +import java.io.DataInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.BigInteger; + +/** + * DER类 + * + * @author ZYJ + * @date 2023/6/22 2:26 + */ +public class DER { + + static int INTEGER = 2; + static int BIT_STRING = 3; + static int OCTET_STRING = 4; + static int SEQUENCE = 16; + static int CONSTRUCTED = 32; + static byte[] version = new byte[]{2, 1, 0}; + static byte[] rsaEncryptionAlgorithmIdentifier = new byte[]{48, 13, 6, 9, 42, -122, 72, -122, -9, 13, 1, 1, 1, 5, 0}; + + DER() { + } + + static BigInteger readDERint(InputStream inputstream) throws IOException { + DataInputStream datainputstream = new DataInputStream(inputstream); + int i = readTag(datainputstream); + int j = readLen(datainputstream); + if (i != INTEGER) { + throw new RuntimeException("Expecting tag[0x02] got " + Integer.toHexString(i)); + } else if (j > 5096) { + throw new RuntimeException("Length value seems a little big " + Integer.toHexString(j)); + } else { + byte[] abyte0 = new byte[j]; + datainputstream.readFully(abyte0); + return new BigInteger(abyte0); + } + } + + static int readLen(InputStream inputstream) throws IOException { + int i = inputstream.read(); + if (i > 127) { + int j = 0; + i ^= 128; + + for(int k = 0; k < i; ++k) { + j = j * 256 + inputstream.read(); + } + + i = j; + } + + return i; + } + + static int readTag(InputStream inputstream) throws IOException { + return inputstream.read(); + } + + static int writeDERint(OutputStream outputstream, BigInteger biginteger) throws IOException { + byte[] abyte0 = biginteger.toByteArray(); + int i = abyte0.length + 1; + outputstream.write(INTEGER); + i += writeDERlen(outputstream, abyte0.length); + outputstream.write(abyte0); + return i; + } + + static int writeDERlen(OutputStream outputstream, int i) throws IOException { + if (i <= 127) { + outputstream.write((byte)i); + return 1; + } else { + byte byte0 = 1; + if (i >= 256) { + byte0 = 2; + } else if (i >= 65536) { + byte0 = 3; + } else if (i >= 16777216) { + byte0 = 4; + } + + outputstream.write((byte)(byte0 | 128)); + + for(int j = (byte0 - 1) * 8; j >= 0; j -= 8) { + int k = i >> j; + outputstream.write((byte)k); + } + + return byte0; + } + } +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/construction/RSAPubKey.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/construction/RSAPubKey.java new file mode 100644 index 0000000..bb71b39 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/construction/RSAPubKey.java @@ -0,0 +1,111 @@ +package com.yida.data.common.core.utils.construction; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.math.BigInteger; +import java.security.interfaces.RSAPublicKey; + +/** + * RSAPubKey类 + * + * @author ZYJ + * @date 2023/6/22 2:25 + */ +public class RSAPubKey implements RSAPublicKey { + + protected BigInteger exponent; + protected BigInteger modulus; + + public RSAPubKey() { + } + + public RSAPubKey(BigInteger biginteger, BigInteger biginteger1) { + this.modulus = biginteger; + this.exponent = biginteger1; + } + + public RSAPubKey(byte[] abyte0) { + this.x509Decode(abyte0); + } + + @Override + public String getAlgorithm() { + return "RSA"; + } + + @Override + public byte[] getEncoded() { + return this.x509Encode(); + } + + @Override + public String getFormat() { + return "X.509"; + } + + @Override + public BigInteger getModulus() { + return this.modulus; + } + + @Override + public BigInteger getPublicExponent() { + return this.exponent; + } + + @Override + public String toString() { + return this.modulus.toString(16) + "." + this.exponent.toString(16); + } + + private void x509Decode(byte[] abyte0) { + ByteArrayInputStream bytearrayinputstream = new ByteArrayInputStream(abyte0); + + try { + DER.readTag(bytearrayinputstream); + DER.readLen(bytearrayinputstream); + bytearrayinputstream.skip((long)DER.rsaEncryptionAlgorithmIdentifier.length); + DER.readTag(bytearrayinputstream); + DER.readLen(bytearrayinputstream); + bytearrayinputstream.skip(1L); + DER.readTag(bytearrayinputstream); + DER.readLen(bytearrayinputstream); + this.modulus = DER.readDERint(bytearrayinputstream); + this.exponent = DER.readDERint(bytearrayinputstream); + } catch (IOException var4) { + var4.printStackTrace(); + throw new ExceptionInInitializerError(var4); + } + } + + private byte[] x509Encode() { + try { + ByteArrayOutputStream bytearrayoutputstream = new ByteArrayOutputStream(); + DER.writeDERint(bytearrayoutputstream, this.modulus); + DER.writeDERint(bytearrayoutputstream, this.exponent); + byte[] abyte0 = bytearrayoutputstream.toByteArray(); + bytearrayoutputstream = new ByteArrayOutputStream(); + bytearrayoutputstream.write(DER.SEQUENCE | DER.CONSTRUCTED); + DER.writeDERlen(bytearrayoutputstream, abyte0.length); + bytearrayoutputstream.write(abyte0); + byte[] abyte1 = bytearrayoutputstream.toByteArray(); + bytearrayoutputstream = new ByteArrayOutputStream(); + bytearrayoutputstream.write(DER.BIT_STRING); + DER.writeDERlen(bytearrayoutputstream, abyte1.length + 1); + bytearrayoutputstream.write(0); + bytearrayoutputstream.write(abyte1); + byte[] abyte2 = bytearrayoutputstream.toByteArray(); + bytearrayoutputstream = new ByteArrayOutputStream(); + bytearrayoutputstream.write(DER.SEQUENCE | DER.CONSTRUCTED); + DER.writeDERlen(bytearrayoutputstream, DER.rsaEncryptionAlgorithmIdentifier.length + abyte2.length); + bytearrayoutputstream.write(DER.rsaEncryptionAlgorithmIdentifier); + bytearrayoutputstream.write(abyte2); + return bytearrayoutputstream.toByteArray(); + } catch (IOException var5) { + var5.printStackTrace(); + throw new ExceptionInInitializerError(var5); + } + } + +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/construction/RSASig.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/construction/RSASig.java new file mode 100644 index 0000000..32bf1c3 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/construction/RSASig.java @@ -0,0 +1,62 @@ +package com.yida.data.common.core.utils.construction; + +import java.security.*; + +/** + * RSASig类 + * + * @author ZYJ + * @date 2023/6/22 2:22 + */ +public class RSASig { + + private String pubKey; + private static final char[] bcdLookup = new char[]{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; + + public RSASig() { + } + + public String getPublicKey() { + return this.pubKey; + } + + public void setPublicKey(String pkey) { + this.pubKey = pkey; + } + + public boolean verifySignature(String sign, String src) { + try { + Security.addProvider(new ABAProvider()); + Signature sigEng = Signature.getInstance("MD5withRSA", "ABA"); + byte[] pubByte = hexStrToBytes(this.pubKey.trim()); + sigEng.initVerify(new RSAPubKey(pubByte)); + sigEng.update(src.getBytes()); + byte[] sign1 = hexStrToBytes(sign); + return sigEng.verify(sign1); + } catch (Exception var6) { + return false; + } + } + + public static final String bytesToHexStr(byte[] bcd) { + StringBuffer s = new StringBuffer(bcd.length * 2); + + for(int i = 0; i < bcd.length; ++i) { + s.append(bcdLookup[bcd[i] >>> 4 & 15]); + s.append(bcdLookup[bcd[i] & 15]); + } + + return s.toString(); + } + + public static final byte[] hexStrToBytes(String s) { + byte[] bytes = new byte[s.length() / 2]; + + for(int i = 0; i < bytes.length; ++i) { + bytes[i] = (byte)Integer.parseInt(s.substring(2 * i, 2 * i + 2), 16); + } + + return bytes; + } + +} diff --git a/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/file/ChunkUtil.java b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/file/ChunkUtil.java new file mode 100644 index 0000000..58c89c4 --- /dev/null +++ b/febs-common/febs-common-core/src/main/java/com/yida/data/common/core/utils/file/ChunkUtil.java @@ -0,0 +1,33 @@ +package com.yida.data.common.core.utils.file; + +import com.yida.data.common.core.exception.FebsException; +import lombok.extern.slf4j.Slf4j; + +import java.io.RandomAccessFile; + +/** + * 分片工具类 + * + * @author ZYJ + * @date 2023/10/20 10:35 + */ +@Slf4j +public class ChunkUtil { + + /** + * 获取分片字节信息 + */ + public static byte[] getChunk(Integer index, Integer chunkSize, String resultFileName, long offset) { + try (RandomAccessFile randomAccessFile = new RandomAccessFile(resultFileName, "r")) { + // 定位到该分片的偏移量 + randomAccessFile.seek(offset); + //读取 + byte[] buffer = new byte[chunkSize]; + randomAccessFile.read(buffer); + return buffer; + } catch (Exception e) { + log.error("获取分片信息失败"); + throw new FebsException("获取分片信息失败"); + } + } +} diff --git a/febs-common/febs-common-core/src/main/resources/META-INF/spring.factories b/febs-common/febs-common-core/src/main/resources/META-INF/spring.factories index 4e32f5b..9568df0 100644 --- a/febs-common/febs-common-core/src/main/resources/META-INF/spring.factories +++ b/febs-common/febs-common-core/src/main/resources/META-INF/spring.factories @@ -5,4 +5,5 @@ com.yida.data.common.core.utils.WxUtil,\ com.yida.data.common.core.utils.WxPublicUtil,\ com.yida.data.common.core.utils.UnionPayPublicUtil,\ com.yida.data.common.core.configure.AsyncPollConfigure,\ -com.yida.data.common.core.handler.BaseExceptionHandler \ No newline at end of file +com.yida.data.common.core.handler.BaseExceptionHandler,\ +com.yida.data.common.core.utils.WxServiceProviderUtil \ No newline at end of file diff --git a/febs-common/febs-common-log-starter/src/main/java/com/yida/data/log/aspect/OperationLogAspect.java b/febs-common/febs-common-log-starter/src/main/java/com/yida/data/log/aspect/OperationLogAspect.java index 337dcff..1dfc2e9 100644 --- a/febs-common/febs-common-log-starter/src/main/java/com/yida/data/log/aspect/OperationLogAspect.java +++ b/febs-common/febs-common-log-starter/src/main/java/com/yida/data/log/aspect/OperationLogAspect.java @@ -3,6 +3,7 @@ package com.yida.data.log.aspect; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.yida.data.common.core.entity.CurrentUser; import com.yida.data.common.core.exception.FebsException; import com.yida.data.common.core.utils.FebsUtil; import com.yida.data.log.service.LogService; @@ -60,13 +61,24 @@ public class OperationLogAspect { public Object insertOperationLog(ProceedingJoinPoint joinPoint) throws Throwable { //返回结果 Object result; - HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest(); + HttpServletRequest request = ((ServletRequestAttributes) Objects + .requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest(); //请求参数 String params = getRequestParams(joinPoint, request); //执行接口 result = joinPoint.proceed(); //异步保存日志 - logService.saveOperationLog(joinPoint, FebsUtil.getHttpServletRequestIpAddress(), params, result); + Long createId = null; + String createName = null; + if (FebsUtil.isLogin()) { + CurrentUser currentUser = FebsUtil.getCurrentUser(); + if (currentUser != null) { + createId = currentUser.getUserId(); + createName = currentUser.getUsername(); + } + } + logService.saveOperationLog(joinPoint, FebsUtil.getHttpServletRequestIpAddress(), params, result, createId, + createName); return result; } diff --git a/febs-common/febs-common-log-starter/src/main/java/com/yida/data/log/service/LogService.java b/febs-common/febs-common-log-starter/src/main/java/com/yida/data/log/service/LogService.java index 2afa0a0..9d70bd7 100644 --- a/febs-common/febs-common-log-starter/src/main/java/com/yida/data/log/service/LogService.java +++ b/febs-common/febs-common-log-starter/src/main/java/com/yida/data/log/service/LogService.java @@ -15,6 +15,7 @@ import com.yida.data.log.annotation.OperationLog; import org.apache.commons.lang3.StringUtils; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import java.lang.reflect.Method; @@ -49,21 +50,23 @@ public class LogService { * @author ZYJ * @date 2021/1/8 16:30 */ - //@Async - public void saveOperationLog(JoinPoint joinPoint, String ip, String params, Object result) { + @Async + public void saveOperationLog(JoinPoint joinPoint, String ip, String params, Object result, Long createId, String createName) { MethodSignature signature = (MethodSignature) joinPoint.getSignature(); Method method = signature.getMethod(); OperationLog opLog = method.getAnnotation(OperationLog.class); //ip地址 Log systemLogInfo = new Log(); + systemLogInfo.setCreateId(createId); + systemLogInfo.setCreateName(createName); // 创建人 - if (FebsUtil.isLogin()) { - CurrentUser currentUser = FebsUtil.getCurrentUser(); - if (currentUser != null) { - systemLogInfo.setCreateId(currentUser.getUserId()); - systemLogInfo.setCreateName(currentUser.getUsername()); - } - } +// if (FebsUtil.isLogin()) { +// CurrentUser currentUser = FebsUtil.getCurrentUser(); +// if (currentUser != null) { +// systemLogInfo.setCreateId(currentUser.getUserId()); +// systemLogInfo.setCreateName(currentUser.getUsername()); +// } +// } systemLogInfo.setIp(ip); //设置开始时间 systemLogInfo.setStartTime(LocalDateTime.now()); @@ -84,8 +87,8 @@ public class LogService { systemLogInfo.setResult(JSON.toJSONString(result)); //将返回值转换为对象 ResultBean logResult = JSON.parseObject(JSON.toJSONString(result), - new TypeReference>() { - }); + new TypeReference>() { + }); int successStatus = 200; if (logResult != null) { if (logResult.getStatus() == successStatus) { @@ -109,7 +112,7 @@ public class LogService { systemLogInfo.setEndTime(LocalDateTime.now()); //操作时长 systemLogInfo.setOperationTime(LocalDateTimeUtil.between(systemLogInfo.getStartTime(), - systemLogInfo.getEndTime(), ChronoUnit.MILLIS)); + systemLogInfo.getEndTime(), ChronoUnit.MILLIS)); //保存数据到redis list数据 redisService.lSet(CachePrefixConstant.OPERATION_LOG_LIST, systemLogInfo); } diff --git a/febs-common/rabbitmq-starter/src/main/java/com/yida/data/rabbit/constant/RabbitConstant.java b/febs-common/rabbitmq-starter/src/main/java/com/yida/data/rabbit/constant/RabbitConstant.java index 616b618..29e6054 100644 --- a/febs-common/rabbitmq-starter/src/main/java/com/yida/data/rabbit/constant/RabbitConstant.java +++ b/febs-common/rabbitmq-starter/src/main/java/com/yida/data/rabbit/constant/RabbitConstant.java @@ -104,4 +104,19 @@ public interface RabbitConstant { * websocket推送队列与交换机绑定key */ String MSG_WEBSOCKET_KEY = "msg_websocket_key"; + + /** + * 企业微信处理交换机 + */ + String QYWX_HANDLE_EXCHANGE = "qywx_handle_exchange"; + + /** + * 企业微信处理队列 + */ + String QYWX_HANDLE_QUEUE = "qywx_handle_queue"; + + /** + * 企业微信处理绑定key值 + */ + String QYWX_HANDLE_KEY = "qywx_handle_key"; } diff --git a/febs-server/attendance/attendance-api/pom.xml b/febs-server/attendance/attendance-api/pom.xml new file mode 100644 index 0000000..36b87a3 --- /dev/null +++ b/febs-server/attendance/attendance-api/pom.xml @@ -0,0 +1,19 @@ + + + + attendance + com.yida.data.attendance + 2.2-RELEASE + + 4.0.0 + + attendance-api + jar + + 8 + 8 + + + \ No newline at end of file diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AddAttendanceRecordDTO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AddAttendanceRecordDTO.java new file mode 100644 index 0000000..09813ef --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AddAttendanceRecordDTO.java @@ -0,0 +1,105 @@ +package com.yida.data.attendance.dto; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.yida.data.common.core.enums.MsgChannel; +import io.swagger.annotations.ApiModelProperty; +import java.time.LocalDateTime; +import java.time.LocalTime; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * @date 2023-08-09 11:37:25 + */ +@Data +@TableName("attendance_record") +public class AddAttendanceRecordDTO { + + @ApiModelProperty(value = "考勤规则ID") + private Long ruleId; + + @ApiModelProperty(value = "考勤时段ID") + private Long ruleTimeId; + /** + * + */ + @ApiModelProperty(value = "0教师,1学生") + private Integer userType; + + /** + * + */ + @ApiModelProperty(value = "") + private Long userId; + + /** + * 学校id + */ + @ApiModelProperty(value = "学校id") + private Long schoolId; + + /** + * 考勤设备id + */ + @ApiModelProperty(value = "考勤设备id") + private Long deviceId; + + /** + * 考勤设备编号 + */ + @ApiModelProperty(value = "考勤设备编号") + private String deviceSn; + + /** + * 考勤wifiid + */ + @ApiModelProperty(value = "考勤wifiid") + private Long wifiId; + + + /** + * 考勤范围ID + */ + @ApiModelProperty(value = "考勤范围ID") + private Long addressId; + + + /** + * 闸机识别图片地址 + */ + @ApiModelProperty(value = "闸机识别图片地址或者人脸识别比对图片地址") + private String picUrl; + + @ApiModelProperty(value = "wifi名称") + private String wifiName; + + @ApiModelProperty(value = "wifi BSSID") + private String wifiBssid; + + @ApiModelProperty(value = "打卡时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; + + private MsgChannel msgChannel; + + /** + * 名称 + */ + private String name; + + /** + * es记录id + */ + private String esRecordId; + + /** + * 设备侧元数据ID + */ + private String originalRecordId; +} \ No newline at end of file diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AddAttendanceReportStrategyDTO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AddAttendanceReportStrategyDTO.java new file mode 100644 index 0000000..3260c25 --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AddAttendanceReportStrategyDTO.java @@ -0,0 +1,161 @@ +package com.yida.data.attendance.dto; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import java.time.LocalDateTime; +import java.time.LocalTime; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * @date 2023-08-09 11:37:25 + */ +@Data +public class AddAttendanceReportStrategyDTO { + + /** + * + */ + @ApiModelProperty(value = "") + private Long id; + + /** + * + */ + @ApiModelProperty(value = "") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + /** + * + */ + @ApiModelProperty(value = "") + private Long createId; + + /** + * + */ + @ApiModelProperty(value = "") + private String createName; + + /** + * + */ + @ApiModelProperty(value = "") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateDate; + + /** + * + */ + @ApiModelProperty(value = "") + private Long updateId; + + /** + * + */ + @ApiModelProperty(value = "") + private Integer delFlag; + + /** + * 学校id + */ + @ApiModelProperty(value = "学校id") + private Long schoolId; + + /** + * 0-教职工考勤推送,1学生考勤推送,2家长提醒 + */ + @ApiModelProperty(value = "0-教职工考勤推送,1学生考勤推送,2家长提醒") + private Integer type; + + /** + * 是否推送周报0-否,1是 + */ + @ApiModelProperty(value = "是否推送周报0-否,1是,默认0") + private Integer weekReport = 0; + + + @ApiModelProperty(value = "周报推送推送日期:小于周三,推送上月周。大于周三推送本周") + private Integer weekReportDate; + + /** + * 周报推送时间:每周一XX点 + */ + @ApiModelProperty(value = "周报推送时间:每周一XX点") + @DateTimeFormat(pattern = "HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "HH:mm:ss") + private LocalTime weekReportTime; + + + /** + * 是否推送月报0-否,1是 + */ + @ApiModelProperty(value = "是否推送月报0-否,1是,默认0") + private Integer monthReport = 0; + + @ApiModelProperty(value = "月报推送推送日期:小于5号,推送上月。大于5号推送本月") + @TableField("month_report_date") + private Integer monthReportDate = 0; + + /** + * 月报推送时间:每月1号XX点 + */ + @ApiModelProperty(value = "月报推送时间:每月1号XX点") + @DateTimeFormat(pattern = "HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "HH:mm:ss") + private LocalTime monthReportTime; + + /** + * 是否推送迟到报告 0-否,1是 + */ + @ApiModelProperty(value = "是否推送迟到报告 0-否,1是,默认0") + private Integer lateReport = 0; + + /** + * 迟到报告推送时间:超过考勤开始时间XXX分钟 + */ + @ApiModelProperty(value = "迟到报告推送时间:超过考勤开始时间XXX分钟") + private Integer lateReportTime; + + + /** + * 是否推送缺勤报告 0-否,1是 + */ + @ApiModelProperty(value = "是否推送缺勤报告 0-否,1是,默认0") + private Integer missReport = 0; + + /** + * 缺勤报告推送时间:超过考勤结束时间XXX分钟 + */ + @ApiModelProperty(value = "缺勤报告推送时间:超过考勤结束时间XXX分钟") + private Integer missReportTime; + + + /** + * 考勤管理员是否推送报告,1是,0否 + */ + @ApiModelProperty(value = "考勤管理员是否推送报告,1是,0否,默认0") + private Integer objManager = 0; + + + /** + * 指定人员:职工ID集合,逗号分隔 + */ + @ApiModelProperty(value = "指定人员:职工ID集合,逗号分隔") + private String objStaffIds; + + /** + * 家长入校/离校提醒:0否,1是 + */ + @ApiModelProperty(value = "家长入校/离校提醒:0否,1是,默认0") + private Integer parentEnrollReport = 0; +} \ No newline at end of file diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AddAttendanceRuleAddressDTO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AddAttendanceRuleAddressDTO.java new file mode 100644 index 0000000..e44d3d7 --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AddAttendanceRuleAddressDTO.java @@ -0,0 +1,55 @@ +package com.yida.data.attendance.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 考勤规则关联地点 Entity + * + * @date 2023-08-09 11:37:25 + */ +@Builder +@Data +@AllArgsConstructor +@NoArgsConstructor +public class AddAttendanceRuleAddressDTO { + + /** + * + */ + @ApiModelProperty(value = "") + private Long id; + /** + * 规则ID + */ + @ApiModelProperty(value = "规则ID") + private Long ruleId; + + /** + * 地点名称 + */ + @ApiModelProperty(value = "地点名称") + private Long addressName; + + /** + * 地点纬度 + */ + @ApiModelProperty(value = "地点纬度") + private String addressLat; + + /** + * 地点经度 + */ + @ApiModelProperty(value = "地点经度") + private String addressLon; + + /** + * 范围,米 + */ + @ApiModelProperty(value = "范围,米") + private Integer range; + +} \ No newline at end of file diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AddAttendanceRuleAdminDTO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AddAttendanceRuleAdminDTO.java new file mode 100644 index 0000000..ea6772d --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AddAttendanceRuleAdminDTO.java @@ -0,0 +1,56 @@ +package com.yida.data.attendance.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 考勤-规则管理员 Entity + * + * @date 2023-08-09 11:37:25 + */ +@Builder +@Data +@AllArgsConstructor +@NoArgsConstructor +public class AddAttendanceRuleAdminDTO { + + /** + * + */ + @ApiModelProperty(value = "") + private Long id; + + /** + * + */ + @ApiModelProperty(value = "") + private Long schoolId; + + /** + * + */ + @ApiModelProperty(value = "") + private Long ruleId; + + /** + * + */ + @ApiModelProperty(value = "") + private Long userType; + + /** + * + */ + @ApiModelProperty(value = "") + private Long deptId; + + /** + * + */ + @ApiModelProperty(value = "") + private Long staffId; + +} \ No newline at end of file diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AddAttendanceRuleDTO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AddAttendanceRuleDTO.java new file mode 100644 index 0000000..9c97631 --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AddAttendanceRuleDTO.java @@ -0,0 +1,174 @@ +package com.yida.data.attendance.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRuleRemind; +import io.swagger.annotations.ApiModelProperty; +import java.time.LocalDate; +import java.util.List; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +@Builder +@Data +@AllArgsConstructor +@NoArgsConstructor +public class AddAttendanceRuleDTO { + + @ApiModelProperty(value = "主键id") + private Long id; + + /** + * 学校id + */ + @ApiModelProperty(value = "学校id") + private Long schoolId; + + /** + * 考勤规则名称 + */ + @NotBlank + @ApiModelProperty(value = "考勤规则名称") + private String name; + + /** + * 0-教职工打卡,1学生上学考勤,2学生宿舍考勤 + */ + @ApiModelProperty(value = "0-教职工打卡,1学生上学考勤,2学生宿舍考勤") + @NotNull + private Integer userType; + + /** + * 0-固定上下班时间模式,1自由打卡模式 + */ + @ApiModelProperty(value = "0-固定上下班时间模式,1自由打卡模式") + @NotNull + private Integer type; + + /** + * 打卡日期,1-周一,2-周二....多个用','连接 + */ + @ApiModelProperty(value = "打卡日期,1-周一,2-周二....多个用','连接") + @NotBlank + private String week; + + /** + * 法定节假日是否打卡,0-是,1-否 + */ + @ApiModelProperty(value = "法定节假日是否打卡,0-是,1-否") + @NotNull + private Integer holidayAttendance; + + /** + * 管理员打卡规则内容权限,0-无,1-有 + */ + @ApiModelProperty(value = "管理员打卡规则内容权限,0-无,1-有") + private Integer roleRule; + + /** + * 管理员打卡人员与白名单权限,0-无,1-有 + */ + @ApiModelProperty(value = "管理员打卡人员与白名单权限,0-无,1-有") + private Integer roleUser; + + /** + * 管理员节假日与特殊日期权限,0-无,1-有 + */ + @ApiModelProperty(value = "管理员节假日与特殊日期权限,0-无,1-有") + private Integer roleDate; + + /** + * 管理员打卡提醒权限,0-无,1-有 + */ + @ApiModelProperty(value = "管理员打卡提醒权限,0-无,1-有") + private Integer roleRemind; + + /** + * 打卡是必须拍照 0-无,1-必须 + */ + @ApiModelProperty(value = "打卡是必须拍照 0-无,1-必须") + private Integer photoTake; + + /** + * 打卡时必须人脸识别0-无,1-必须 + */ + @ApiModelProperty(value = "打卡时必须人脸识别0-无,1-必须") + private Integer faceTake; + + /** + * 填写备注时必须拍照0-无,1-必须 + */ + @ApiModelProperty(value = "填写备注时必须拍照0-无,1-必须") + private Integer photoRemark; + + /** + * 异常打卡可以提交申请,审批后可修正打卡状态 + */ + @ApiModelProperty(value = "异常打卡可以提交申请,审批后可修正打卡状态") + private Integer applyAmendment; + + /** + * 每月补卡次数 + */ + @ApiModelProperty(value = "每月补卡次数") + private Integer reissueNum; + + /** + * 每月补卡截止日期 + */ + @ApiModelProperty(value = "每月补卡截止日期") + private Integer reissueEndDate; + + /** + * 启用状态:0-未启用,1-已启用 + */ + @ApiModelProperty(value = "启用状态:0-未启用,1-已启用,默认0") + private Integer status = 0; + + /** + * 有效开始时间 + */ + @ApiModelProperty(value = "有效开始时间") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") + @NotNull + private LocalDate startDate; + + + /** + * 有效结束时间 + */ + @ApiModelProperty(value = "有效结束时间") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") + @NotNull + private LocalDate endDate; + + @ApiModelProperty(value = "打卡提醒") + private List remindDTOList; + + @ApiModelProperty(value = "打卡对象") + @NotEmpty + private List attendanceRuleObjList; + @ApiModelProperty(value = "特殊日期") + private List specialDateDTOList; + @ApiModelProperty(value = "白名单") + private List whiteListDTOList; + @ApiModelProperty(value = "打卡设备") + private List deviceDTOList; + @ApiModelProperty(value = "打卡wifi") + private List wifiDTOList; + @ApiModelProperty(value = "打卡地点") + private List addressDTOList; + @ApiModelProperty(value = "打卡时间段") + @NotEmpty + private List timeDTOList; + @ApiModelProperty(value = "管理员") + @NotEmpty + private List adminDTOList; +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AddAttendanceRuleDeviceDTO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AddAttendanceRuleDeviceDTO.java new file mode 100644 index 0000000..1d70827 --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AddAttendanceRuleDeviceDTO.java @@ -0,0 +1,43 @@ +package com.yida.data.attendance.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 考勤规则关联设备表 Entity + * + * @date 2023-08-09 11:37:25 + */ +@Builder +@Data +@AllArgsConstructor +@NoArgsConstructor +public class AddAttendanceRuleDeviceDTO { + + /** + * + */ + @ApiModelProperty(value = "") + private Long id; + /** + * 设备类型 + */ + @ApiModelProperty(value = "设备类型") + private Integer deviceType; + + /** + * 设备ID + */ + @ApiModelProperty(value = "设备ID") + private Long deviceId; + + /** + * 设备编号 + */ + @ApiModelProperty(value = "设备编号") + private String deviceSn; + +} \ No newline at end of file diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AddAttendanceRuleObjDTO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AddAttendanceRuleObjDTO.java new file mode 100644 index 0000000..89f131b --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AddAttendanceRuleObjDTO.java @@ -0,0 +1,40 @@ +package com.yida.data.attendance.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Builder +@Data +@AllArgsConstructor +@NoArgsConstructor +public class AddAttendanceRuleObjDTO { + + + /** + * + */ + @ApiModelProperty(value = "") + private Long id; + + /** + * + */ + @ApiModelProperty(value = "") + private Long deptId; + + /** + * + */ + @ApiModelProperty(value = "") + private String deptName; + + /** + * 父级部门id,逗号连接 + */ + @ApiModelProperty(value = "父级部门id,逗号连接") + private String parentDeptId; + +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AddAttendanceRuleRemindDTO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AddAttendanceRuleRemindDTO.java new file mode 100644 index 0000000..d7ada31 --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AddAttendanceRuleRemindDTO.java @@ -0,0 +1,49 @@ +package com.yida.data.attendance.dto; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 考勤-打卡提醒 Entity + * + * @date 2023-08-09 11:37:25 + */ +@Data +public class AddAttendanceRuleRemindDTO { + + + /** + * 类型=规则usertype + */ + @ApiModelProperty(value = "类型=规则usertype") + private Integer userType; + + /** + * 0-上班提醒,1-下班提醒 + */ + @ApiModelProperty(value = "0-上班提醒,1-下班提醒") + private Integer type; + + /** + * 提醒的提前分钟数 + */ + @ApiModelProperty(value = "提醒的提前分钟数") + private Integer minute; + + /** + * 提醒文本 + */ + @ApiModelProperty(value = "提醒文本") + private String message; + + /** + * 1-添加接收人姓名,0-不添加接收人姓名 + */ + @ApiModelProperty(value = "1-添加接收人姓名,0-不添加接收人姓名") + private Integer includeReceiver; + +} \ No newline at end of file diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AddAttendanceRuleSpecialDateDTO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AddAttendanceRuleSpecialDateDTO.java new file mode 100644 index 0000000..1f7e423 --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AddAttendanceRuleSpecialDateDTO.java @@ -0,0 +1,63 @@ +package com.yida.data.attendance.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import java.time.LocalDate; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * 考勤-特殊日期 Entity + * + * @date 2023-08-09 11:37:25 + */ +@Builder +@Data +@AllArgsConstructor +@NoArgsConstructor +public class AddAttendanceRuleSpecialDateDTO { + + /** + * + */ + @ApiModelProperty(value = "") + private Long id; + + /** + * 规则id + */ + @ApiModelProperty(value = "规则id") + private Long ruleId; + + /** + * 0-不用打卡,1-必须打卡 + */ + @ApiModelProperty(value = "0-不用打卡,1-必须打卡") + private Long type; + + /** + * 开始日期 + */ + @ApiModelProperty(value = "开始日期") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") + private LocalDate startDate; + + /** + * 结束日期 + */ + @ApiModelProperty(value = "结束日期") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") + private LocalDate endDate; + + /** + * 事由 + */ + @ApiModelProperty(value = "事由") + private String reason; + +} \ No newline at end of file diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AddAttendanceRuleTimeDTO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AddAttendanceRuleTimeDTO.java new file mode 100644 index 0000000..0b58e66 --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AddAttendanceRuleTimeDTO.java @@ -0,0 +1,102 @@ +package com.yida.data.attendance.dto; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import java.time.LocalDateTime; +import java.time.LocalTime; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * 考勤-打卡时段 Entity + * + * @date 2023-08-09 11:37:25 + */ +@Builder +@Data +@AllArgsConstructor +@NoArgsConstructor +public class AddAttendanceRuleTimeDTO { + + /** + * + */ + @ApiModelProperty(value = "") + private Long id; + /** + * 考勤规则id + */ + @ApiModelProperty(value = "考勤规则id") + private Long ruleId; + + /** + * 上班时间 + */ + @ApiModelProperty(value = "上班时间") + @DateTimeFormat(pattern = "HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "HH:mm:ss") + private LocalTime startTime; + + /** + * 下班时间 + */ + @ApiModelProperty(value = "下班时间") + @DateTimeFormat(pattern = "HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "HH:mm:ss") + private LocalTime endTime; + + /** + * 最晚时间-针对宿舍考勤晚归情况 + */ + @ApiModelProperty(value = "最晚时间-针对宿舍考勤晚归情况") + @DateTimeFormat(pattern = "HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "HH:mm:ss") + private LocalTime lastTime; + + /** + * 上班打卡时段开始时间 + */ + @ApiModelProperty(value = "上班打卡时段开始时间") + @DateTimeFormat(pattern = "HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "HH:mm:ss") + private LocalTime startEffectiveStartTime; + + /** + * 上班打卡时段结束时间 + */ + @ApiModelProperty(value = "上班打卡时段结束时间") + @DateTimeFormat(pattern = "HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "HH:mm:ss") + private LocalTime startEffectiveEndTime; + + /** + * 下班打卡时段开始时间 + */ + @ApiModelProperty(value = "下班打卡时段开始时间") + @DateTimeFormat(pattern = "HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "HH:mm:ss") + private LocalTime endEffectiveStartTime; + + /** + * 下班打卡时段结束时间 + */ + @ApiModelProperty(value = "下班打卡时段结束时间") + @DateTimeFormat(pattern = "HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "HH:mm:ss") + private LocalTime endEffectiveEndTime; + + + /** + * 结束时间是否为次日,1=是,0=否 + */ + @ApiModelProperty(value = "结束时间是否为次日,1=是,0=否") + private Integer endNextDay; +} \ No newline at end of file diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AddAttendanceRuleWhiteListDTO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AddAttendanceRuleWhiteListDTO.java new file mode 100644 index 0000000..86293a5 --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AddAttendanceRuleWhiteListDTO.java @@ -0,0 +1,31 @@ +package com.yida.data.attendance.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Builder +@Data +@AllArgsConstructor +@NoArgsConstructor +public class AddAttendanceRuleWhiteListDTO { + + /** + * + */ + @ApiModelProperty(value = "") + private Long id; + + /** + * + */ + @ApiModelProperty(value = "") + private Integer userType; + /** + * 人员id + */ + @ApiModelProperty(value = "人员id") + private Long userId; +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AddAttendanceRuleWifiDTO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AddAttendanceRuleWifiDTO.java new file mode 100644 index 0000000..657c0c7 --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AddAttendanceRuleWifiDTO.java @@ -0,0 +1,47 @@ +package com.yida.data.attendance.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 考勤规则关联wifi Entity + * + * @date 2023-08-09 11:37:25 + */ +@Builder +@Data +@AllArgsConstructor +@NoArgsConstructor +public class AddAttendanceRuleWifiDTO { + + /** + * + */ + @ApiModelProperty(value = "") + private Long id; + /** + * 规则ID + */ + @ApiModelProperty(value = "规则ID") + private Long ruleId; + + /** + * wifi名称 + */ + @ApiModelProperty(value = "wifi名称") + private String wifiName; + + /** + * BSSID + */ + @ApiModelProperty(value = "BSSID") + private String wifiBssid; + + + @ApiModelProperty(value = "ip") + private String ip; + +} \ No newline at end of file diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AddLeaveRequestStrategyDTO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AddLeaveRequestStrategyDTO.java new file mode 100644 index 0000000..60f5ce2 --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AddLeaveRequestStrategyDTO.java @@ -0,0 +1,51 @@ +package com.yida.data.attendance.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import java.io.Serializable; +import java.time.LocalDateTime; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * 添加请假类型短策略请求类 + * + * @author ZYJ + * @date 2023/2/2 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class AddLeaveRequestStrategyDTO implements Serializable { + + private static final long serialVersionUID = -1438414521101194453L; + + @ApiModelProperty("请假ID") + private Long requestId; + + @ApiModelProperty("请假人ID") + private Long userId; + + @ApiModelProperty("策略id") + private Long strategyId; + + @ApiModelProperty("0教师请假,1学生请假") + private Integer requestType; + + @ApiModelProperty("学校id") + private Long schoolId; + + @ApiModelProperty("开始时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime startTime; + + @ApiModelProperty("结束时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime endTime; +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AttendanceCountPageDTO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AttendanceCountPageDTO.java new file mode 100644 index 0000000..29a77cc --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AttendanceCountPageDTO.java @@ -0,0 +1,51 @@ +package com.yida.data.attendance.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.yida.data.common.core.common.BaseDTO; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceResult; +import io.swagger.annotations.ApiModelProperty; +import io.swagger.models.auth.In; +import java.time.LocalDate; +import java.util.List; +import javax.validation.constraints.NotNull; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +@Data +public class AttendanceCountPageDTO extends BaseDTO { + + @ApiModelProperty("开始日期") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") + private LocalDate startDate; + + @ApiModelProperty("结束日期") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") + private LocalDate endDate; + + @ApiModelProperty("状态") + private Integer status; + @ApiModelProperty("学校") + private Long schoolId; + @ApiModelProperty("考勤规则") + private Long ruleId; + @ApiModelProperty("所属部门,职能部门") + private Long deptId; + @ApiModelProperty("所属部门,学区") + private Long campusId; + @ApiModelProperty("所属部门,学段") + private Long sectionId; + @ApiModelProperty("所属部门,年级") + private Long gradeId; + @ApiModelProperty("所属部门,班级") + private Long classId; + @ApiModelProperty("学生姓名或者学号/职工姓名或者手机号:支持模糊匹配") + private String nameOrNumber; + @ApiModelProperty("统计类型:0=教职工考勤,1=学生考勤") + @NotNull + private Integer type; + @ApiModelProperty("用户ID集合") + private List userIdList; + +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AttendanceDayReportDTO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AttendanceDayReportDTO.java new file mode 100644 index 0000000..95e3b0f --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AttendanceDayReportDTO.java @@ -0,0 +1,37 @@ +package com.yida.data.attendance.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.yida.data.common.core.common.BaseDTO; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceResult; +import io.swagger.annotations.ApiModelProperty; +import java.time.LocalDate; +import java.util.List; +import javax.validation.constraints.NotNull; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +@Data +public class AttendanceDayReportDTO extends BaseDTO { + + @ApiModelProperty("开始日期") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") + private LocalDate attendanceDate; + + @ApiModelProperty("开始日期") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") + private LocalDate startAttendanceDate; + + @ApiModelProperty("结束日期") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") + private LocalDate endAttendanceDate; + + @ApiModelProperty("用户类型:0教师,1学生") + private Integer userType; + @ApiModelProperty("学校") + private Long schoolId; + + private List userIdList; +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AttendanceFaceMatchDTO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AttendanceFaceMatchDTO.java new file mode 100644 index 0000000..cc020b9 --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AttendanceFaceMatchDTO.java @@ -0,0 +1,39 @@ +package com.yida.data.attendance.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.io.Serializable; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 考勤人脸对比请求类 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "RosterFaceMatchDTO", description = "考勤人脸对比请求类") +public class AttendanceFaceMatchDTO implements Serializable { + + private static final long serialVersionUID = 1474013091202762132L; + + @ApiModelProperty("学校ID") + private Long schoolId; + + @ApiModelProperty("用户ID") + @NotNull + private Long userId; + + @ApiModelProperty("人员类型 0教职工,1学生") + @NotNull + private Integer userType; + + @ApiModelProperty("base64图片信息") + @NotBlank + private String base64; +} \ No newline at end of file diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AttendanceResultByDayDTO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AttendanceResultByDayDTO.java new file mode 100644 index 0000000..461bab0 --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AttendanceResultByDayDTO.java @@ -0,0 +1,34 @@ +package com.yida.data.attendance.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.time.LocalDate; +import javax.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@ApiModel("获取某日用户考勤记录请求类") +public class AttendanceResultByDayDTO { + + @ApiModelProperty("用户ID") + @NotNull + private Long userId; + + @ApiModelProperty("用户类型:0教职工,1学生") + @NotNull + private Integer userType; + + @ApiModelProperty("考勤日期") + @NotNull + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") + private LocalDate attendanceDate; +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AttendanceResultByStartAndEndTimeDTO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AttendanceResultByStartAndEndTimeDTO.java new file mode 100644 index 0000000..2cb7092 --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AttendanceResultByStartAndEndTimeDTO.java @@ -0,0 +1,40 @@ +package com.yida.data.attendance.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.time.LocalDate; +import javax.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@ApiModel("获取某时间段内用户考勤记录请求类") +public class AttendanceResultByStartAndEndTimeDTO { + + @ApiModelProperty("用户ID") + @NotNull + private Long userId; + + @ApiModelProperty("用户类型:0教职工,1学生") + @NotNull + private Integer userType; + + @ApiModelProperty("考勤开始日期") + @NotNull + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") + private LocalDate attendanceStartDate; + + @ApiModelProperty("考勤结束日期") + @NotNull + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") + private LocalDate attendanceEndDate; +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AttendanceRuleAdminUserAddDTO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AttendanceRuleAdminUserAddDTO.java new file mode 100644 index 0000000..7b8e445 --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AttendanceRuleAdminUserAddDTO.java @@ -0,0 +1,17 @@ +package com.yida.data.attendance.dto; + +import com.yida.data.common.core.common.BaseDTO; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class AttendanceRuleAdminUserAddDTO extends BaseDTO { + + private Long Id; + private Long ruleId; + private Long deptId; + private Long staffId; +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AttendanceRuleAdminUserPageDTO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AttendanceRuleAdminUserPageDTO.java new file mode 100644 index 0000000..785fc7c --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AttendanceRuleAdminUserPageDTO.java @@ -0,0 +1,39 @@ +package com.yida.data.attendance.dto; + +import com.yida.data.common.core.common.BaseDTO; +import io.swagger.annotations.ApiModelProperty; +import java.util.List; +import javax.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class AttendanceRuleAdminUserPageDTO extends BaseDTO { + + /** + * 考勤规则名称 + */ + @ApiModelProperty(value = "管理员名称") + private String staffName; + /** + * 考勤人员名称 + */ + @ApiModelProperty(value = "管理员Id") + private String staffId; + + @ApiModelProperty(value = "规则Id") + @NotNull + private Long ruleId; + + private Long campusId; + private Long sectionId; + private Long gradeId; + private Long classId; + private Long deptId; + + private List deptIdList; + private List staffIdList; +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AttendanceRuleUserAddDTO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AttendanceRuleUserAddDTO.java new file mode 100644 index 0000000..05569b6 --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AttendanceRuleUserAddDTO.java @@ -0,0 +1,25 @@ +package com.yida.data.attendance.dto; + +import com.yida.data.common.core.common.BaseDTO; +import io.swagger.annotations.ApiModelProperty; +import java.util.List; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class AttendanceRuleUserAddDTO extends BaseDTO { + + /** + * 0-教职工打卡,1学生上学考勤,2学生宿舍考勤 + */ + @ApiModelProperty(value = "0-教职工,1学生") + private Integer userType; + private Long ruleId; + private Long deptId; + private Long userId; + +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AttendanceRuleUserPageDTO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AttendanceRuleUserPageDTO.java new file mode 100644 index 0000000..01f70b9 --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AttendanceRuleUserPageDTO.java @@ -0,0 +1,34 @@ +package com.yida.data.attendance.dto; + +import com.yida.data.common.core.common.BaseDTO; +import io.swagger.annotations.ApiModelProperty; +import java.util.List; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class AttendanceRuleUserPageDTO extends BaseDTO { + + /** + * 0-教职工打卡,1学生上学考勤,2学生宿舍考勤 + */ + @ApiModelProperty(value = "0-教职工打卡,1学生上学考勤") + private Integer userType; + /** + * 考勤规则名称 + */ + @ApiModelProperty(value = "考勤人员名称") + private String userName; + private Long ruleId; + private Long schoolId; + private Long campusId; + private Long sectionId; + private Long gradeId; + private Long classId; + private Long deptId; + private List userIdList; +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AttendanceStatusByMonthDTO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AttendanceStatusByMonthDTO.java new file mode 100644 index 0000000..4a99eaf --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AttendanceStatusByMonthDTO.java @@ -0,0 +1,41 @@ +package com.yida.data.attendance.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.time.LocalDate; +import javax.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import net.sf.cglib.core.Local; +import org.springframework.format.annotation.DateTimeFormat; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@ApiModel("查询当前月份考勤状态请求类") +public class AttendanceStatusByMonthDTO { + + @ApiModelProperty("用户ID") + @NotNull + private Long userId; + + @ApiModelProperty("用户类型:0教职工,1学生") + @NotNull + private Integer userType; + + @ApiModelProperty("考勤开始日期") + @NotNull + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") + private LocalDate attendanceStartDate; + + @ApiModelProperty("考勤结束日期") + @NotNull + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") + private LocalDate attendanceEndDate; +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AttendanceUserCheckInDTO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AttendanceUserCheckInDTO.java new file mode 100644 index 0000000..a7ab105 --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/AttendanceUserCheckInDTO.java @@ -0,0 +1,47 @@ +package com.yida.data.attendance.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.time.LocalDateTime; +import javax.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +@Builder +@Data +@AllArgsConstructor +@NoArgsConstructor +@ApiModel(value = "AttendanceUserCheckInDTO", description = "wifi打卡请求类") +public class AttendanceUserCheckInDTO { + + @ApiModelProperty(value = "学校ID") + private Long schoolId; + + @ApiModelProperty(value = "打卡用户ID") + private Long userId; + + @ApiModelProperty(value = "打卡用户类型:0教职工,1学生") + private Integer userType; + + @ApiModelProperty(value = "打卡规则ID") + private Long ruleId; + + @ApiModelProperty(value = "打卡时段ID") + private Long ruleTimeId; + + @ApiModelProperty(value = "wifi的BSSID") + private String wifiBssid; + + @ApiModelProperty(value = "当前打卡时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @NotNull + private LocalDateTime currentDateTime; + + @ApiModelProperty(value = "人脸认证图片地址") + private String avatar; +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/BssidImportDTO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/BssidImportDTO.java new file mode 100644 index 0000000..74f57ec --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/BssidImportDTO.java @@ -0,0 +1,30 @@ +package com.yida.data.attendance.dto; + +import com.alibaba.excel.annotation.ExcelProperty; +import java.io.Serializable; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class BssidImportDTO implements Serializable { + + private static final long serialVersionUID = 3552156436496408092L; + + /** + * 名称 + */ + @ExcelProperty(index = 0) + private String wifiName; + + /** + * bssid + */ + @ExcelProperty(index = 1) + private String wifiBssid; + +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/DayReportDataDTO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/DayReportDataDTO.java new file mode 100644 index 0000000..44ec013 --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/DayReportDataDTO.java @@ -0,0 +1,19 @@ +package com.yida.data.attendance.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Builder +@Data +@AllArgsConstructor +@NoArgsConstructor +public class DayReportDataDTO { + + private String deptName; + private Integer totalNum; + private Integer normalNum; + private Integer abNum; + private Integer requestNum; +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/DealRecordDTO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/DealRecordDTO.java new file mode 100644 index 0000000..93a6e1f --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/DealRecordDTO.java @@ -0,0 +1,36 @@ +package com.yida.data.attendance.dto; + +import lombok.Data; + +@Data +public class DealRecordDTO { + /** + * 设备sn号 + */ + private String sn; + + /** + * 考勤时间 + */ + private String date; + + /** + * 考勤用户id + */ + private Long userId; + + /** + * 用户类型,0-学生,1-教职工 + */ + private Integer userType; + + /** + * 设备方用户唯一标识 + */ + private String userFlag; + + /** + * 考勤图片 + */ + private String picUrl; +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/DevicePage.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/DevicePage.java new file mode 100644 index 0000000..fef594e --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/DevicePage.java @@ -0,0 +1,16 @@ +package com.yida.data.attendance.dto; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.Data; + +@Data +public class DevicePage extends Page { + + public DevicePage(Integer pageNum, Integer pageSize) { + super(pageNum, pageSize); + } + + private Integer onlineNumber; + + private Integer offlineNumber; +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/H5AttendanceRuleWifiDTO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/H5AttendanceRuleWifiDTO.java new file mode 100644 index 0000000..7c6e750 --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/H5AttendanceRuleWifiDTO.java @@ -0,0 +1,58 @@ +package com.yida.data.attendance.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +@Builder +@Data +@AllArgsConstructor +@NoArgsConstructor +public class H5AttendanceRuleWifiDTO { + + + @ApiModelProperty(value = "学校ID") + @NotNull + private Long schoolId; + + @ApiModelProperty(value = "用户主键id") + @NotNull + private Long userId; + + + @ApiModelProperty(value = "0-教职工,1学生") + @NotNull + private Integer userType; + + /** + * BSSID + */ + @ApiModelProperty(value = "BSSID") + @NotNull + private String wifiBssid; + + + /** + * ip + */ + @ApiModelProperty(value = "ip") + private String ip; + + + @ApiModelProperty(value = "当前打卡时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @NotNull + private LocalDateTime currentDateTime; + +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/IssuedFaceDTO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/IssuedFaceDTO.java new file mode 100644 index 0000000..e0f544a --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/IssuedFaceDTO.java @@ -0,0 +1,40 @@ +package com.yida.data.attendance.dto; + +import com.yida.data.common.core.entity.user.EduFaceGroupStrategy; +import com.yida.data.common.core.entity.user.EduUserFace; +import com.yida.data.common.core.enums.IssuedTypeEnum; +import io.swagger.annotations.ApiModelProperty; +import java.util.List; +import lombok.Data; + +@Data +public class IssuedFaceDTO { + + /** + * 人脸列表 + */ + private List userFaceList; + + /** + * 设备id列表 + */ + private List deviceList; + + @ApiModelProperty("下发类型,0-添加,1-修改") + private Integer type; + + /** + * 人脸组id + */ + private Long groupId; + + /** + * 策略信息 + */ + private EduFaceGroupStrategy groupStrategy; + + /** + * 下发类型 + */ + private IssuedTypeEnum issuedTypeEnum; +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/ListErrorRecordDTO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/ListErrorRecordDTO.java new file mode 100644 index 0000000..11f2600 --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/ListErrorRecordDTO.java @@ -0,0 +1,42 @@ +package com.yida.data.attendance.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.yida.data.common.core.common.BaseDTO; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; + +/** + * 分页查询通行记录错误记录请求类 + * + * @author ZYJ + * @date 2023/11/1 17:29 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class ListErrorRecordDTO extends BaseDTO implements Serializable { + + private static final long serialVersionUID = -4152682288872419619L; + + @ApiModelProperty(value = "姓名") + private String name; + + @ApiModelProperty(value = "开始时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime startDateTime; + + @ApiModelProperty(value = "结束时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime endDateTime; +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/ManageListUserDTO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/ManageListUserDTO.java new file mode 100644 index 0000000..a6bd844 --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/ManageListUserDTO.java @@ -0,0 +1,50 @@ +package com.yida.data.attendance.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.yida.data.common.core.common.BaseDTO; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.time.LocalDate; +import java.util.List; +import javax.validation.constraints.NotNull; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +@Data +@ApiModel("教师端管理员查询学生/教师考勤统计请求类") +public class ManageListUserDTO extends BaseDTO { + + + @ApiModelProperty(value = "当前用户ID--职工ID") + private Long userId; + + @ApiModelProperty(value = "查询用户类型:0教师,1学生") + private Integer searchUserType; + + @ApiModelProperty("考勤开始日期") + @NotNull + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") + private LocalDate attendanceStartDate; + + @ApiModelProperty("考勤结束日期") + @NotNull + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") + private LocalDate attendanceEndDate; + + @ApiModelProperty("考勤状态:-1全部,0正常,1,迟到,2早退,3缺卡,7晚归,8异常晚归") + private Integer attendanceStatus; + + @ApiModelProperty("考勤规则ID") + private Long ruleId; + + @ApiModelProperty("家校部门ID") + private Long deptId; + + @ApiModelProperty("部门类型") + private Integer deptType; + + private List userIdList; + +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/PageAttendanceRecordDTO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/PageAttendanceRecordDTO.java new file mode 100644 index 0000000..aba9cc0 --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/PageAttendanceRecordDTO.java @@ -0,0 +1,52 @@ +package com.yida.data.attendance.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.yida.data.common.core.common.BaseDTO; +import io.swagger.annotations.ApiModelProperty; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class PageAttendanceRecordDTO extends BaseDTO { + + @ApiModelProperty(value = "打卡类型,0-面板机,1wifi") + private Integer type; + + @ApiModelProperty(value = "用户ID") + private Long userId; + + @ApiModelProperty(value = "姓名") + private String studentName; + + + @ApiModelProperty(value = "人员类型,0-教职工,1学生") + private Integer userType; + + + @ApiModelProperty(value = "开始时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime startDateTime; + + + @ApiModelProperty(value = "结束时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime endDateTime; + + private Long schoolId; + private Long campusId; + private Long sectionId; + private Long gradeId; + private Long classId; + private List classIdList; + + List userIdList; +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/PageAttendanceRuleDTO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/PageAttendanceRuleDTO.java new file mode 100644 index 0000000..9bdea64 --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/PageAttendanceRuleDTO.java @@ -0,0 +1,46 @@ +package com.yida.data.attendance.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.yida.data.common.core.common.BaseDTO; +import io.swagger.annotations.ApiModelProperty; +import java.time.LocalDate; +import java.time.LocalDateTime; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class PageAttendanceRuleDTO extends BaseDTO { + + /** + * + */ + @ApiModelProperty(value = "规则名称") + private String ruleName; + + /** + * + */ + @ApiModelProperty(value = "规则类型,0-固定上下班时间模式,1自由打卡模式") + private Integer type; + + /** + * + */ + @ApiModelProperty(value = "规则类型,0-教职工打卡,1学生上学考勤,2学生宿舍考勤") + private Integer userType; + + + /** + * + */ + @ApiModelProperty(value = "启用状态:0-未启用,1-已启用") + private Integer status; + + + private Long schoolId; +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/RemoveFaceDTO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/RemoveFaceDTO.java new file mode 100644 index 0000000..1f14894 --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/RemoveFaceDTO.java @@ -0,0 +1,11 @@ +package com.yida.data.attendance.dto; + +import java.util.List; +import lombok.Data; + +@Data +public class RemoveFaceDTO { + private List deviceFactoryUserId; + + private List deviceList; +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/UpdateAttendanceRuleStatusDTO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/UpdateAttendanceRuleStatusDTO.java new file mode 100644 index 0000000..287e836 --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/dto/UpdateAttendanceRuleStatusDTO.java @@ -0,0 +1,32 @@ +package com.yida.data.attendance.dto; + +import com.yida.data.common.core.common.BaseDTO; +import io.swagger.annotations.ApiModelProperty; +import javax.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Builder +@Data +@AllArgsConstructor +@NoArgsConstructor +public class UpdateAttendanceRuleStatusDTO { + + /** + * + */ + @ApiModelProperty(value = "规则Id") + @NotNull + private Long id; + + + /** + * + */ + @ApiModelProperty(value = "启用状态:0-未启用,1-已启用") + @NotNull + private Integer status; + +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/fallback/RemoteAttendanceDeviceServiceFallback.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/fallback/RemoteAttendanceDeviceServiceFallback.java new file mode 100644 index 0000000..0491054 --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/fallback/RemoteAttendanceDeviceServiceFallback.java @@ -0,0 +1,107 @@ +package com.yida.data.attendance.fallback; + +import com.yida.data.attendance.dto.IssuedFaceDTO; +import com.yida.data.attendance.dto.RemoveFaceDTO; +import com.yida.data.attendance.feign.RemoteAttendanceDeviceService; +import com.yida.data.common.core.annotation.Fallback; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.attendance.EduAttendanceDevice; +import com.yida.data.common.core.entity.attendance.EduAttendanceDeviceGroup; +import feign.hystrix.FallbackFactory; +import java.util.List; +import lombok.extern.slf4j.Slf4j; + +/** + * RemoteAttendanceDeviceService fallback处理类 + * + * @author ZYJ + * @date 2022/8/26 + */ +@Slf4j +@Fallback +public class RemoteAttendanceDeviceServiceFallback implements FallbackFactory { + + @Override + public RemoteAttendanceDeviceService create(Throwable throwable) { + log.error("RemoteAttendanceDeviceService fallback reason:{}", throwable.getMessage()); + + return new RemoteAttendanceDeviceService() { + @Override + public ResultBean> listDeviceBySchool(Long schoolId) { + return null; + } + + @Override + public ResultBean> listDeviceByType(String type) { + return null; + } + + /** + * 下发人脸到设备 + * + * @param dto + */ + @Override + public ResultBean issuedFace(IssuedFaceDTO dto) { + return null; + } + + /** + * 删除设备中的人脸 + * + * @param dto + */ + @Override + public ResultBean removeFace(RemoveFaceDTO dto) { + return null; + } + + /** + * 查询设备组中的设备 + * + * @param groupIds + */ + @Override + public ResultBean> listDeviceByGroup(Long[] groupIds) { + return null; + } + + /** + * 根据id查询设备 + * + * @param ids + */ + @Override + public ResultBean> listDeviceById(Long[] ids) { + return null; + } + + /** + * 根据id查询设备组 + * + * @param ids + * @return + */ + @Override + public ResultBean> listDeviceGroupById(Long[] ids) { + return null; + } + + /** + * 更新设备在线状态 + */ + @Override + public ResultBean updateDeviceStatus() { + return null; + } + + /** + * 校时所有设备 + */ + @Override + public ResultBean timingAllDevice() { + return null; + } + }; + } +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/fallback/RemoteAttendanceResultServiceFallback.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/fallback/RemoteAttendanceResultServiceFallback.java new file mode 100644 index 0000000..eab8b63 --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/fallback/RemoteAttendanceResultServiceFallback.java @@ -0,0 +1,33 @@ +package com.yida.data.attendance.fallback; + +import com.yida.data.attendance.feign.RemoteAttendanceResultService; +import com.yida.data.common.core.annotation.Fallback; +import com.yida.data.common.core.common.ResultBean; +import feign.hystrix.FallbackFactory; +import lombok.extern.slf4j.Slf4j; + +/** + * RemoteAttendanceResultService fallback处理类 + */ +@Slf4j +@Fallback +public class RemoteAttendanceResultServiceFallback implements FallbackFactory { + + @Override + public RemoteAttendanceResultService create(Throwable throwable) { + log.error("RemoteAttendanceResultService fallback reason:{}", throwable.getMessage()); + + return new RemoteAttendanceResultService() { + + @Override + public ResultBean initAttendanceResult() { + return null; + } + + @Override + public ResultBean attendanceNotice() { + return null; + } + }; + } +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/fallback/RemoteAttendanceStrategyServiceFallback.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/fallback/RemoteAttendanceStrategyServiceFallback.java new file mode 100644 index 0000000..5ce7c5c --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/fallback/RemoteAttendanceStrategyServiceFallback.java @@ -0,0 +1,106 @@ +package com.yida.data.attendance.fallback; + +import com.yida.data.attendance.dto.AddLeaveRequestStrategyDTO; +import com.yida.data.attendance.feign.RemoteAttendanceStrategyService; +import com.yida.data.common.core.annotation.Fallback; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.user.EduFaceGroupStrategy; +import feign.hystrix.FallbackFactory; +import lombok.extern.slf4j.Slf4j; + +/** + * RemoteAttendanceStrategyService fallback处理类 + * + * @author ZYJ + * @date 2022/8/26 + */ +@Slf4j +@Fallback +public class RemoteAttendanceStrategyServiceFallback implements FallbackFactory { + + @Override + public RemoteAttendanceStrategyService create(Throwable throwable) { + log.error("RemoteAttendanceStrategyService fallback reason:{}", throwable.getMessage()); + + return new RemoteAttendanceStrategyService() { + + /** + * 保存策略并绑定人员信息 + * + * @param eduFaceGroupStrategy 人脸组-策略信息 + * @return com.yida.data.common.core.common.ResultBean + * @author ZYJ + * @date 2022/12/13 10:51 + */ + @Override + public ResultBean saveStrategyAndUser(EduFaceGroupStrategy eduFaceGroupStrategy) { + return null; + } + + /** + * 删除策略 + * + * @param eduFaceGroupStrategy 人脸策略信息 + * @return com.yida.data.common.core.common.ResultBean + * @author ZYJ + * @date 2022/12/21 15:44 + */ + @Override + public ResultBean deleteStrategy(EduFaceGroupStrategy eduFaceGroupStrategy) { + return null; + } + + /** + * 绑定对应的人员-策略信息 + * + * @param eduFaceGroupStrategy 人脸策略信息 + * @return com.yida.data.common.core.common.ResultBean + * @author ZYJ + * @date 2022/12/22 16:25 + */ + @Override + public ResultBean bindUserStrategy(EduFaceGroupStrategy eduFaceGroupStrategy) { + return null; + } + + /** + * 解绑对应的人员-策略信息 + * + * @param eduFaceGroupStrategy 人脸策略信息 + * @return com.yida.data.common.core.common.ResultBean + * @author ZYJ + * @date 2022/12/26 10:16 + */ + @Override + public ResultBean unBindUserStrategy(EduFaceGroupStrategy eduFaceGroupStrategy) { + return null; + } + + /** + * 删除并保存策略 + * + * @param eduFaceGroupStrategy 人脸策略信息 + * @return com.yida.data.common.core.common.ResultBean + * @author ZYJ + * @date 2023/1/9 15:12 + */ + @Override + public ResultBean deleteAndSaveStrategy(EduFaceGroupStrategy eduFaceGroupStrategy) { + return null; + } + + /** + * 添加请假类型短策略 + * + * @param dto 添加请假类型短策略请求类 + * @return com.yida.data.common.core.common.ResultBean + * @author ZYJ + * @date 2023/2/2 16:00 + */ + @Override + public ResultBean addLeaveRequestStrategy(AddLeaveRequestStrategyDTO dto) { + return null; + } + }; + } +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/fallback/RemoteUserStrategyServiceFallback.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/fallback/RemoteUserStrategyServiceFallback.java new file mode 100644 index 0000000..382aa58 --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/fallback/RemoteUserStrategyServiceFallback.java @@ -0,0 +1,28 @@ +package com.yida.data.attendance.fallback; + +import com.yida.data.attendance.feign.RemoteUserStrategyService; +import com.yida.data.common.core.annotation.Fallback; +import com.yida.data.common.core.common.ResultBean; +import feign.hystrix.FallbackFactory; +import lombok.extern.slf4j.Slf4j; + +/** + * RemoteUserStrategyService fallback处理类 + */ +@Slf4j +@Fallback +public class RemoteUserStrategyServiceFallback implements FallbackFactory { + + @Override + public RemoteUserStrategyService create(Throwable throwable) { + log.error("RemoteUserStrategyService fallback reason:{}", throwable.getMessage()); + + return new RemoteUserStrategyService() { + + @Override + public ResultBean checkOverTimeUserStrategy() { + return null; + } + }; + } +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/feign/RemoteAttendanceDeviceService.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/feign/RemoteAttendanceDeviceService.java new file mode 100644 index 0000000..b65c576 --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/feign/RemoteAttendanceDeviceService.java @@ -0,0 +1,71 @@ +package com.yida.data.attendance.feign; + +import com.yida.data.attendance.dto.IssuedFaceDTO; +import com.yida.data.attendance.dto.RemoveFaceDTO; +import com.yida.data.attendance.fallback.RemoteAttendanceDeviceServiceFallback; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.attendance.EduAttendanceDevice; +import com.yida.data.common.core.entity.attendance.EduAttendanceDeviceGroup; +import com.yida.data.common.core.entity.constant.FebsServerConstant; +import java.util.List; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; + +@FeignClient(value = FebsServerConstant.EDU_ATTENDANCE, contextId = "attendanceDeviceServiceClient", + fallbackFactory = RemoteAttendanceDeviceServiceFallback.class) +public interface RemoteAttendanceDeviceService { + + @GetMapping("/device/listDeviceBySchool") + ResultBean> listDeviceBySchool(@RequestParam("schoolId") Long schoolId); + + @GetMapping("/in/device/listDeviceByType") + ResultBean> listDeviceByType(@RequestParam("type") String type); + + /** + * 下发人脸到设备 + */ + @PostMapping("/device/issuedFace") + ResultBean issuedFace(@RequestBody IssuedFaceDTO dto); + + /** + * 删除设备中的人脸 + */ + @PostMapping("/device/removeFace") + ResultBean removeFace(@RequestBody RemoveFaceDTO dto); + + /** + * 查询设备组中的设备 + */ + @GetMapping("/deviceGroup/listDeviceByGroup") + ResultBean> listDeviceByGroup(@RequestParam("groupIds") Long[] groupIds); + + /** + * 根据id查询设备 + */ + @GetMapping("/device/listDeviceById") + ResultBean> listDeviceById(@RequestParam("ids") Long[] ids); + + /** + * 根据id查询设备组 + * + * @return + */ + @GetMapping("/deviceGroup/listDeviceGroupById") + ResultBean> listDeviceGroupById(@RequestParam("ids") Long[] ids); + + /** + * 更新设备在线状态 + */ + @GetMapping("/in/device/updateDeviceStatus") + ResultBean updateDeviceStatus(); + + /**aaaaaa + * 校时所有设备 + */ + @GetMapping("/in/device/timingAllDevice") + ResultBean timingAllDevice(); + +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/feign/RemoteAttendanceResultService.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/feign/RemoteAttendanceResultService.java new file mode 100644 index 0000000..4d741d6 --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/feign/RemoteAttendanceResultService.java @@ -0,0 +1,19 @@ +package com.yida.data.attendance.feign; + +import com.yida.data.attendance.fallback.RemoteAttendanceResultServiceFallback; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.constant.FebsServerConstant; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; + +@FeignClient(value = FebsServerConstant.EDU_ATTENDANCE, contextId = "attendanceResultClient", + fallbackFactory = RemoteAttendanceResultServiceFallback.class) +public interface RemoteAttendanceResultService { + + + @GetMapping("/in/attendanceResult/initAttendanceResult") + ResultBean initAttendanceResult(); + + @GetMapping("/in/attendanceResult/attendanceNotice") + ResultBean attendanceNotice(); +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/feign/RemoteAttendanceStrategyService.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/feign/RemoteAttendanceStrategyService.java new file mode 100644 index 0000000..062f252 --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/feign/RemoteAttendanceStrategyService.java @@ -0,0 +1,81 @@ +package com.yida.data.attendance.feign; + +import com.yida.data.attendance.dto.AddLeaveRequestStrategyDTO; +import com.yida.data.attendance.fallback.RemoteAttendanceDeviceServiceFallback; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.constant.FebsServerConstant; +import com.yida.data.common.core.entity.user.EduFaceGroupStrategy; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +@FeignClient(value = FebsServerConstant.EDU_ATTENDANCE, contextId = "attendanceStrategyServiceClient", + fallbackFactory = RemoteAttendanceDeviceServiceFallback.class) +public interface RemoteAttendanceStrategyService { + + /** + * 保存策略并绑定人员信息 + * + * @param eduFaceGroupStrategy 人脸组-策略信息 + * @return com.yida.data.common.core.common.ResultBean + * @author ZYJ + * @date 2022/12/13 10:51 + */ + @PostMapping("/in/deviceStrategy/saveStrategyAndUser") + ResultBean saveStrategyAndUser(@RequestBody EduFaceGroupStrategy eduFaceGroupStrategy); + + /** + * 删除策略 + * + * @param eduFaceGroupStrategy 人脸策略信息 + * @return com.yida.data.common.core.common.ResultBean + * @author ZYJ + * @date 2022/12/21 15:44 + */ + @PostMapping("/in/deviceStrategy/deleteStrategy") + ResultBean deleteStrategy(@RequestBody EduFaceGroupStrategy eduFaceGroupStrategy); + + /** + * 绑定对应的人员-策略信息 + * + * @param eduFaceGroupStrategy 人脸策略信息 + * @return com.yida.data.common.core.common.ResultBean + * @author ZYJ + * @date 2022/12/22 16:25 + */ + @PostMapping("/in/deviceStrategy/bindUserStrategy") + ResultBean bindUserStrategy(@RequestBody EduFaceGroupStrategy eduFaceGroupStrategy); + + /** + * 解绑对应的人员-策略信息 + * + * @param eduFaceGroupStrategy 人脸策略信息 + * @return com.yida.data.common.core.common.ResultBean + * @author ZYJ + * @date 2022/12/26 10:16 + */ + @PostMapping("/in/deviceStrategy/unBindUserStrategy") + ResultBean unBindUserStrategy(@RequestBody EduFaceGroupStrategy eduFaceGroupStrategy); + + /** + * 删除并保存策略(包含人员信息) + * + * @param eduFaceGroupStrategy 人脸策略信息 + * @return com.yida.data.common.core.common.ResultBean + * @author ZYJ + * @date 2023/1/9 15:12 + */ + @PostMapping("/in/deviceStrategy/deleteAndSaveStrategy") + ResultBean deleteAndSaveStrategy(@RequestBody EduFaceGroupStrategy eduFaceGroupStrategy); + + /** + * 添加请假类型短策略 + * + * @param dto 添加请假类型短策略请求类 + * @return com.yida.data.common.core.common.ResultBean + * @author ZYJ + * @date 2023/2/2 16:00 + */ + @PostMapping("/in/deviceStrategy/addLeaveRequestStrategy") + ResultBean addLeaveRequestStrategy(@RequestBody AddLeaveRequestStrategyDTO dto); +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/feign/RemoteUserStrategyService.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/feign/RemoteUserStrategyService.java new file mode 100644 index 0000000..8202148 --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/feign/RemoteUserStrategyService.java @@ -0,0 +1,15 @@ +package com.yida.data.attendance.feign; + +import com.yida.data.attendance.fallback.RemoteUserStrategyServiceFallback; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.constant.FebsServerConstant; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; + +@FeignClient(value = FebsServerConstant.EDU_ATTENDANCE, contextId = "remoteUserStrategyServiceClient", + fallbackFactory = RemoteUserStrategyServiceFallback.class) +public interface RemoteUserStrategyService { + + @GetMapping("/in/eduUserStrategy/checkOverTimeUserStrategy") + ResultBean checkOverTimeUserStrategy(); +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/AttdanceResultDetailVO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/AttdanceResultDetailVO.java new file mode 100644 index 0000000..f1c6b9e --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/AttdanceResultDetailVO.java @@ -0,0 +1,59 @@ +package com.yida.data.attendance.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import java.time.LocalDate; +import java.time.LocalTime; +import java.util.List; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +@Data +public class AttdanceResultDetailVO { + + @ApiModelProperty("主键ID") + private Long id; + @ApiModelProperty("用户主键ID") + private Long userId; + @ApiModelProperty("姓名") + private String name; + @ApiModelProperty("学号/手机号") + private String number; + @ApiModelProperty("部门名称") + private String deptName; + @ApiModelProperty("打卡规则") + private String ruleName; + @ApiModelProperty("打卡规则ID") + private Long ruleId; + @ApiModelProperty("打卡规则时段ID") + private Long ruleTimeId; + @ApiModelProperty("打卡规则时段名称") + private String ruleTimeName; + // @ApiModelProperty("打卡明细") +// List detailVOList; + @ApiModelProperty("日期") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") + private LocalDate attendanceDate; + + @ApiModelProperty("星期") + private Integer week; + + @ApiModelProperty("上班打卡状态;0正常,1异常") + private Integer startStatus; + + @ApiModelProperty("上班打卡时间") + private LocalTime startRealTime; + + @ApiModelProperty("下班打卡状态:0正常,1异常") + private Integer endStatus; + + @ApiModelProperty("下班打卡时间") + private LocalTime endRealTime; + + @ApiModelProperty("是否需要打卡考勤,0是,1否") + private Integer needAttendance; + + @ApiModelProperty("打卡类型:0=需要上下班打卡,1=只需要打卡一次(取上班打卡时间与状态)") + private Integer modelType; +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/AttdanceResultTotalVO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/AttdanceResultTotalVO.java new file mode 100644 index 0000000..5b6964c --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/AttdanceResultTotalVO.java @@ -0,0 +1,30 @@ +package com.yida.data.attendance.vo; + +import io.swagger.annotations.ApiModelProperty; +import java.time.LocalDate; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class AttdanceResultTotalVO { + + @ApiModelProperty("请假人数") + private Integer leaveNumber; + + @ApiModelProperty("正常人数") + private Integer normalNumber; + + @ApiModelProperty("晚归人数") + private Integer lateNumber; + + @ApiModelProperty("异常晚归人数") + private Integer abLateNumber; + + @ApiModelProperty("缺卡人数") + private Integer missNumber; +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/AttdanceResultVO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/AttdanceResultVO.java new file mode 100644 index 0000000..0fb126d --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/AttdanceResultVO.java @@ -0,0 +1,58 @@ +package com.yida.data.attendance.vo; + +import io.swagger.annotations.ApiModelProperty; +import java.time.LocalDate; +import lombok.Data; + +@Data +public class AttdanceResultVO { + + @ApiModelProperty("主键ID") + private Long id; + @ApiModelProperty("用户主键ID") + private Long userId; + @ApiModelProperty("开始日期") + private LocalDate startDate; + @ApiModelProperty("结束日期") + private LocalDate endDate; + @ApiModelProperty("开始星期") + private String startWeek; + @ApiModelProperty("结束星期") + private String endWeek; + @ApiModelProperty("姓名") + private String name; + @ApiModelProperty("学号/手机号") + private String number; + @ApiModelProperty("部门名称") + private String deptName; + @ApiModelProperty("打卡规则") + private String ruleName; + @ApiModelProperty("打卡规则ID") + private Long ruleId; + @ApiModelProperty("打卡规则时段") + private String ruleTimeName; + @ApiModelProperty("打卡规则时段ID") + private Long ruleTimeId; + @ApiModelProperty("应打卡天数") + private Integer needDays; + @ApiModelProperty("实际打卡天数") + private Integer realDays; + @ApiModelProperty("正常天数") + private Integer normalDays; + @ApiModelProperty("异常天数") + private Integer abnormalDays; + @ApiModelProperty("异常次数") + private Integer abnormalNumber; + @ApiModelProperty("迟到次数") + private Integer lateNumber; + @ApiModelProperty("迟到时长:单位分") + private Integer lateTime; + @ApiModelProperty("早退次数") + private Integer leaveNumber; + @ApiModelProperty("早退时长:单位分") + private Integer leaveTime; + @ApiModelProperty("旷工次数") + private Integer outNumber; + @ApiModelProperty("缺卡次数") + private Integer missNumber; +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/AttendanceFaceMatchVO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/AttendanceFaceMatchVO.java new file mode 100644 index 0000000..bff21f7 --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/AttendanceFaceMatchVO.java @@ -0,0 +1,31 @@ +package com.yida.data.attendance.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.io.Serializable; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 考勤人脸对比返回类 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "RosterFaceMatchVO", description = "考勤人脸对比返回类") +public class AttendanceFaceMatchVO implements Serializable { + + private static final long serialVersionUID = 1474013091202762132L; + + @ApiModelProperty("0-对比成功,1-对比不成功") + private Integer valid; + + @ApiModelProperty("对比分数") + private String score; + + @ApiModelProperty("对比成功的图片") + private String url; +} \ No newline at end of file diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/AttendanceRecordExcelVO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/AttendanceRecordExcelVO.java new file mode 100644 index 0000000..56e2e77 --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/AttendanceRecordExcelVO.java @@ -0,0 +1,50 @@ +package com.yida.data.attendance.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@ApiModel("通行记录导出实体对象") +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class AttendanceRecordExcelVO { + + @ApiModelProperty("姓名") + @ExcelProperty(order = 0, value = "姓名") + private String studentName; + + @ApiModelProperty("学号/手机号") + @ExcelProperty(order = 1, value = "学号/手机号") + private String studentNumber; + + @ApiModelProperty("校区") + @ExcelProperty(order = 2, value = "校区") + private String campusName; + + @ApiModelProperty("学段") + @ExcelProperty(order = 3, value = "学段") + private String sectionName; + + @ApiModelProperty("年级") + @ExcelProperty(order = 4, value = "年级") + private String gradeName; + + @ApiModelProperty("班级") + @ExcelProperty(order = 5, value = "班级") + private String className; + + @ApiModelProperty("通行时间") + @ExcelProperty(order = 6, value = "通行时间") + private String attendanceTime; + + @ApiModelProperty("通行位置") + @ExcelProperty(order = 7, value = "通行位置") + private String attendanceDevice; + +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/AttendanceRuleAdminUserVO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/AttendanceRuleAdminUserVO.java new file mode 100644 index 0000000..5f58223 --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/AttendanceRuleAdminUserVO.java @@ -0,0 +1,49 @@ +package com.yida.data.attendance.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Builder +@Data +@AllArgsConstructor +@NoArgsConstructor +public class AttendanceRuleAdminUserVO { + + @ApiModelProperty(value = "主键id") + private Long id; + + /** + * 0-教职工,1学生 + */ + @ApiModelProperty(value = "0-教职工,1学生") + private Integer userType; + + /** + * 管理部门ID + */ + @ApiModelProperty(value = "管理部门ID") + private Long deptId; + + + /** + * 学校id + */ + @ApiModelProperty(value = "学校id") + private String deptName; + + /** + * 考勤规则名称 + */ + @ApiModelProperty(value = "考勤人员Id") + private Long staffId; + + /** + * 考勤规则名称 + */ + @ApiModelProperty(value = "考勤人员名称") + private String staffName; + +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/AttendanceRuleUserVO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/AttendanceRuleUserVO.java new file mode 100644 index 0000000..9143b6a --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/AttendanceRuleUserVO.java @@ -0,0 +1,56 @@ +package com.yida.data.attendance.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.yida.data.attendance.dto.AddAttendanceRuleAddressDTO; +import com.yida.data.attendance.dto.AddAttendanceRuleAdminDTO; +import com.yida.data.attendance.dto.AddAttendanceRuleDeviceDTO; +import com.yida.data.attendance.dto.AddAttendanceRuleObjDTO; +import com.yida.data.attendance.dto.AddAttendanceRuleRemindDTO; +import com.yida.data.attendance.dto.AddAttendanceRuleSpecialDateDTO; +import com.yida.data.attendance.dto.AddAttendanceRuleTimeDTO; +import com.yida.data.attendance.dto.AddAttendanceRuleWhiteListDTO; +import com.yida.data.attendance.dto.AddAttendanceRuleWifiDTO; +import io.swagger.annotations.ApiModelProperty; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +@Builder +@Data +@AllArgsConstructor +@NoArgsConstructor +public class AttendanceRuleUserVO { + + @ApiModelProperty(value = "主键id") + private Long id; + + /** + * 0-教职工打卡,1学生上学考勤,2学生宿舍考勤 + */ + @ApiModelProperty(value = "0-教职工打卡,1学生上学考勤") + private Integer userType; + + /** + * 学校id + */ + @ApiModelProperty(value = "学校id") + private String deptName; + + /** + * 考勤规则名称 + */ + @ApiModelProperty(value = "考勤人员Id") + private Long userId; + + /** + * 考勤规则名称 + */ + @ApiModelProperty(value = "考勤人员名称") + private String userName; + +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/AttendanceRuleVO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/AttendanceRuleVO.java new file mode 100644 index 0000000..29365be --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/AttendanceRuleVO.java @@ -0,0 +1,203 @@ +package com.yida.data.attendance.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.yida.data.attendance.dto.AddAttendanceRuleAddressDTO; +import com.yida.data.attendance.dto.AddAttendanceRuleAdminDTO; +import com.yida.data.attendance.dto.AddAttendanceRuleDeviceDTO; +import com.yida.data.attendance.dto.AddAttendanceRuleObjDTO; +import com.yida.data.attendance.dto.AddAttendanceRuleRemindDTO; +import com.yida.data.attendance.dto.AddAttendanceRuleSpecialDateDTO; +import com.yida.data.attendance.dto.AddAttendanceRuleTimeDTO; +import com.yida.data.attendance.dto.AddAttendanceRuleWhiteListDTO; +import com.yida.data.attendance.dto.AddAttendanceRuleWifiDTO; +import io.swagger.annotations.ApiModelProperty; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +@Builder +@Data +@AllArgsConstructor +@NoArgsConstructor +public class AttendanceRuleVO { + + @ApiModelProperty(value = "主键id") + private Long id; + + /** + * + */ + @ApiModelProperty(value = "") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + /** + * + */ + @ApiModelProperty(value = "") + private Long createId; + + /** + * + */ + @ApiModelProperty(value = "") + private String createName; + + /** + * + */ + @ApiModelProperty(value = "") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateDate; + + /** + * + */ + @ApiModelProperty(value = "") + private Long updateId; + + /** + * + */ + @ApiModelProperty(value = "") + private Integer delFlag; + + + /** + * 学校id + */ + @ApiModelProperty(value = "学校id") + private Long schoolId; + + /** + * 考勤规则名称 + */ + @ApiModelProperty(value = "考勤规则名称") + private String name; + + /** + * 0-教职工打卡,1学生上学考勤,2学生宿舍考勤 + */ + @ApiModelProperty(value = "0-教职工打卡,1学生上学考勤,2学生宿舍考勤") + private Integer userType; + + /** + * 0-固定上下班时间模式,1自由打卡模式 + */ + @ApiModelProperty(value = "0-固定上下班时间模式,1自由打卡模式") + private Integer type; + + /** + * 打卡日期,1-周一,2-周二....多个用','连接 + */ + @ApiModelProperty(value = "打卡日期,1-周一,2-周二....多个用','连接") + private String week; + + /** + * 法定节假日是否打卡,0-是,1-否 + */ + @ApiModelProperty(value = "法定节假日是否打卡,0-是,1-否") + private Integer holidayAttendance; + + /** + * 管理员打卡规则内容权限,0-无,1-有 + */ + @ApiModelProperty(value = "管理员打卡规则内容权限,0-无,1-有") + private Integer roleRule; + + /** + * 管理员打卡人员与白名单权限,0-无,1-有 + */ + @ApiModelProperty(value = "管理员打卡人员与白名单权限,0-无,1-有") + private Integer roleUser; + + /** + * 管理员节假日与特殊日期权限,0-无,1-有 + */ + @ApiModelProperty(value = "管理员节假日与特殊日期权限,0-无,1-有") + private Integer roleDate; + + /** + * 管理员打卡提醒权限,0-无,1-有 + */ + @ApiModelProperty(value = "管理员打卡提醒权限,0-无,1-有") + private Integer roleRemind; + + /** + * 打卡是必须拍照 0-无,1-必须 + */ + @ApiModelProperty(value = "打卡是必须拍照 0-无,1-必须") + private Integer photoTake; + + /** + * 打卡时必须人脸识别0-无,1-必须 + */ + @ApiModelProperty(value = "打卡时必须人脸识别0-无,1-必须") + private Integer faceTake; + + /** + * 填写备注时必须拍照0-无,1-必须 + */ + @ApiModelProperty(value = "填写备注时必须拍照0-无,1-必须") + private Integer photoRemark; + + /** + * 异常打卡可以提交申请,审批后可修正打卡状态 + */ + @ApiModelProperty(value = "异常打卡可以提交申请,审批后可修正打卡状态") + private Integer applyAmendment; + + /** + * 每月补卡次数 + */ + @ApiModelProperty(value = "每月补卡次数") + private Integer reissueNum; + + /** + * 启用状态:0-未启用,1-已启用 + */ + @ApiModelProperty(value = "启用状态:0-未启用,1-已启用") + private Integer status; + + /** + * 每月补卡截止日期 + */ + @ApiModelProperty(value = "每月补卡截止日期") + private Integer reissueEndDate; + + @ApiModelProperty(value = "有效开始时间") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") + private LocalDate startDate; + + @ApiModelProperty(value = "有效结束时间") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") + private LocalDate endDate; + + @ApiModelProperty(value = "打卡提醒") + private List remindDTOList; + @ApiModelProperty(value = "打卡对象") + private List attendanceRuleObjList; + @ApiModelProperty(value = "特殊日期") + private List specialDateDTOList; + @ApiModelProperty(value = "白名单") + private List whiteListDTOList; + @ApiModelProperty(value = "打卡设备") + private List deviceDTOList; + @ApiModelProperty(value = "打卡wifi") + private List wifiDTOList; + @ApiModelProperty(value = "打卡地点") + private List addressDTOList; + @ApiModelProperty(value = "打卡时间段") + private List timeDTOList; + @ApiModelProperty(value = "管理员") + private List adminDTOList; +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/AttendanceStatusByMonthVO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/AttendanceStatusByMonthVO.java new file mode 100644 index 0000000..2baaaf0 --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/AttendanceStatusByMonthVO.java @@ -0,0 +1,39 @@ +package com.yida.data.attendance.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.time.LocalDate; +import javax.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@ApiModel("查询当前月份考勤状态返回结果类") +public class AttendanceStatusByMonthVO { + + @ApiModelProperty("打卡规则ID") + private Long ruleId; + + @ApiModelProperty("打卡时间段ID") + private Long ruleTimeId; + + @ApiModelProperty("日期") + private LocalDate date; + + @ApiModelProperty("上班考勤状态:0正常,1异常") + private Integer startStatus; + + @ApiModelProperty("下班考勤状态:0正常,1异常") + private Integer endStatus; + + @ApiModelProperty("总考勤状态:0正常,1异常,2请假,3休假,4无") + private Integer Status; + + @ApiModelProperty("考勤类型:0-固定上下班时间模式,1自由打卡模式") + private Integer attType; +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/AttendanceUserCheckInVO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/AttendanceUserCheckInVO.java new file mode 100644 index 0000000..68b66bd --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/AttendanceUserCheckInVO.java @@ -0,0 +1,32 @@ +package com.yida.data.attendance.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.time.LocalDateTime; +import java.time.LocalTime; +import javax.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +@Builder +@Data +@AllArgsConstructor +@NoArgsConstructor +@ApiModel(value = "AttendanceUserCheckInVO", description = "wifi打卡返回类") +public class AttendanceUserCheckInVO { + + @ApiModelProperty(value = "打卡状态:0正常,2迟到,3早退,7晚归,8异常晚归") + private Integer status; + + @ApiModelProperty(value = "当前打卡时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime checkInDateTime; + + @ApiModelProperty(value = "人脸认证图片地址") + private String avatar; +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/AttendanceWifiVO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/AttendanceWifiVO.java new file mode 100644 index 0000000..87c5c62 --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/AttendanceWifiVO.java @@ -0,0 +1,132 @@ +package com.yida.data.attendance.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.yida.data.attendance.dto.AddAttendanceRuleAddressDTO; +import com.yida.data.attendance.dto.AddAttendanceRuleAdminDTO; +import com.yida.data.attendance.dto.AddAttendanceRuleDeviceDTO; +import com.yida.data.attendance.dto.AddAttendanceRuleObjDTO; +import com.yida.data.attendance.dto.AddAttendanceRuleRemindDTO; +import com.yida.data.attendance.dto.AddAttendanceRuleSpecialDateDTO; +import com.yida.data.attendance.dto.AddAttendanceRuleTimeDTO; +import com.yida.data.attendance.dto.AddAttendanceRuleWhiteListDTO; +import com.yida.data.attendance.dto.AddAttendanceRuleWifiDTO; +import io.swagger.annotations.ApiModelProperty; +import java.time.LocalDate; +import java.time.LocalTime; +import java.util.List; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +@Builder +@Data +@AllArgsConstructor +@NoArgsConstructor +public class AttendanceWifiVO { + + @ApiModelProperty(value = "打卡规则ID") + private Long ruleId; + + @ApiModelProperty(value = "打卡规则类型,0-固定上下班时间模式,1自由打卡模式") + private Integer ruleType; + + @ApiModelProperty(value = "打卡时段ID") + private Long ruleTimeId; + + @ApiModelProperty(value = "打卡规则名称") + private String ruleName; + + @ApiModelProperty(value = "打卡是必须拍照人脸识别 0-无,1-必须") + private Integer ruleFaceTake; + + /** + * 是否WiFi打卡范围 0否,1是 + */ + @ApiModelProperty(value = "是否WiFi打卡范围 0否,1是") + private Integer wifiRange; + + /** + * wifi名称 + */ + @ApiModelProperty(value = "wifi名称") + private String wifiName; + + /** + * BSSID + */ + @ApiModelProperty(value = "BSSID") + private String wifiBssid; + + /** + * 上班时间 + */ + @ApiModelProperty(value = "上班时间") + @DateTimeFormat(pattern = "HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "HH:mm:ss") + private LocalTime startTime; + + + /** + * 实际上班时间 + */ + @ApiModelProperty(value = "实际上班时间") + @DateTimeFormat(pattern = "HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "HH:mm:ss") + private LocalTime startRealTime; + + + /** + * 上班考勤状态:0-正常,1-异常 + */ + @ApiModelProperty(value = "上班考勤状态:0-正常,1-异常") + private Integer startStatus; + + + /** + * 上班打卡照片 + */ + @ApiModelProperty(value = "上班打卡照片") + private String startImg; + + + /** + * 下班时间 + */ + @ApiModelProperty(value = "下班时间") + @DateTimeFormat(pattern = "HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "HH:mm:ss") + private LocalTime endTime; + + + /** + * 实际下班时间 + */ + @ApiModelProperty(value = "实际下班时间") + @DateTimeFormat(pattern = "HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "HH:mm:ss") + private LocalTime endRealTime; + + + /** + * 下班考勤状态:0-正常,1-异常 + */ + @ApiModelProperty(value = "下班考勤状态:0-正常,1-异常") + private Integer endStatus; + + /** + * 下班打卡照片 + */ + @ApiModelProperty(value = "下班打卡照片") + private String endImg; + + + /** + * 本次打卡所属:1签到,2签退 + */ + @ApiModelProperty(value = "本次打卡所属:1签到,2签退,3休息不用打卡,4,不在打卡时间段内,5无打卡规则,6不在范围内,7无权限,非智慧校园用户") + private Integer status; + + +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/ConflictRuleVO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/ConflictRuleVO.java new file mode 100644 index 0000000..cff74a2 --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/ConflictRuleVO.java @@ -0,0 +1,19 @@ +package com.yida.data.attendance.vo; + + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel("冲突规则") +public class ConflictRuleVO { + @ApiModelProperty("规则Id") + private Long ruleId; + @ApiModelProperty("规则名称") + private String ruleName; + @ApiModelProperty("部门id") + private Long deptId; + @ApiModelProperty("部门名称") + private String deptName; +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/DateStatusVO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/DateStatusVO.java new file mode 100644 index 0000000..e3bedc6 --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/DateStatusVO.java @@ -0,0 +1,18 @@ +package com.yida.data.attendance.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.time.LocalDate; +import lombok.Data; + +@Data +@ApiModel("查询管理员管理用户统计状态-用于日历展示") +public class DateStatusVO { + + @ApiModelProperty("日期") + private LocalDate date; + + @ApiModelProperty("总考勤状态:0正常,1异常,2请假,3休假,4无") + private Integer Status; + +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/DayReportDataVO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/DayReportDataVO.java new file mode 100644 index 0000000..7fa479d --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/DayReportDataVO.java @@ -0,0 +1,25 @@ +package com.yida.data.attendance.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import java.time.LocalDate; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +@Builder +@Data +@AllArgsConstructor +@NoArgsConstructor +public class DayReportDataVO { + + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") + private LocalDate date; + private String deptName; + private Integer totalNum; + private Integer abNum; + private String score; + private Integer requestNum; +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/DetailVO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/DetailVO.java new file mode 100644 index 0000000..d030502 --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/DetailVO.java @@ -0,0 +1,35 @@ +package com.yida.data.attendance.vo; + +import io.swagger.annotations.ApiModelProperty; +import java.time.LocalDate; +import java.time.LocalTime; +import lombok.Data; + +@Data +public class DetailVO { + + @ApiModelProperty("日期") + private LocalDate date; + + @ApiModelProperty("星期") + private Integer week; + + @ApiModelProperty("上班打卡状态;0正常,1异常") + private Integer startStatus; + + @ApiModelProperty("上班打卡时间") + private LocalTime startRealTime; + + @ApiModelProperty("下班打卡状态:0正常,1异常") + private Integer endStatus; + + @ApiModelProperty("下班打卡时间") + private LocalTime endRealTime; + + @ApiModelProperty("是否需要打卡考勤,0是,1否") + private Integer needAttendance; + + @ApiModelProperty("打卡类型:0=需要上下班打卡,1=只需要打卡一次(取上班打卡时间与状态)") + private Integer modelType; + +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/DeviceNumberVO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/DeviceNumberVO.java new file mode 100644 index 0000000..a34b45b --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/DeviceNumberVO.java @@ -0,0 +1,34 @@ +package com.yida.data.attendance.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.io.Serializable; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 设备数量统计返回类 + * + * @author ZYJ + * @date 2021/10/8 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "DeviceNumberVO", description = "设备数量统计返回类") +public class DeviceNumberVO implements Serializable { + + private static final long serialVersionUID = -7261215589760191372L; + + @ApiModelProperty(value = "设备总数量") + private Long totalNumber; + + @ApiModelProperty(value = "在线设备数量") + private Long onlineNumber; + + @ApiModelProperty(value = "离线设备数量") + private Long offlineNumber; +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/DeviceOrDeviceGroupVO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/DeviceOrDeviceGroupVO.java new file mode 100644 index 0000000..a83716e --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/DeviceOrDeviceGroupVO.java @@ -0,0 +1,14 @@ +package com.yida.data.attendance.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class DeviceOrDeviceGroupVO { + private Long id; + + @ApiModelProperty("0-设备,1-设备组") + private Integer type; + + private String name; +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/DeviceVO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/DeviceVO.java new file mode 100644 index 0000000..3a6ff0f --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/DeviceVO.java @@ -0,0 +1,52 @@ +package com.yida.data.attendance.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.time.LocalDateTime; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +@ApiModel("设备信息") +@Data +public class DeviceVO { + + private Long id; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + @ApiModelProperty("设备名称") + private String name; + + @ApiModelProperty("设备编号") + private String sn; + + @ApiModelProperty("设备mac地址") + private String macAddress; + + @ApiModelProperty("设备厂商") + private String deviceType; + + @ApiModelProperty("ip") + private String ip; + + @ApiModelProperty("学校id") + private Long schoolId; + + @ApiModelProperty("学校名称") + private String schoolName; + + @ApiModelProperty("区域类型,0-进门,1-出门") + private Integer zoneScope; + + @ApiModelProperty("0-校门,1-宿舍") + private Integer type; + + @ApiModelProperty("设备在线状态,0-在线,1-未在线") + private Integer state; + + @ApiModelProperty("分组名称") + private String groupName; +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/DownLoadAttendanceResultVO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/DownLoadAttendanceResultVO.java new file mode 100644 index 0000000..4c55ed9 --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/DownLoadAttendanceResultVO.java @@ -0,0 +1,35 @@ +package com.yida.data.attendance.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class DownLoadAttendanceResultVO { + + @ApiModelProperty("操作标识") + private String key; + + @ApiModelProperty("文件名称") + private String fileName; + + @ApiModelProperty("进度 0-100") + private Integer percent; + + @ApiModelProperty("是否下载完成,0-否,1-是") + private Integer finish; + + @ApiModelProperty("下载总数") + private Integer totalNum; + + @ApiModelProperty("当前下载到第几个") + private Integer currentNum; + + @ApiModelProperty("文件路径") + private String filePath; +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/ImportBssidDataVO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/ImportBssidDataVO.java new file mode 100644 index 0000000..2c03c16 --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/ImportBssidDataVO.java @@ -0,0 +1,30 @@ +package com.yida.data.attendance.vo; + +import io.swagger.annotations.ApiModelProperty; +import java.io.Serializable; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class ImportBssidDataVO implements Serializable { + + private static final long serialVersionUID = 6853343450276063448L; + + + @ApiModelProperty("本次操作标识") + private String wifiName; + + @ApiModelProperty("进度 0-100") + private Integer percent; + + @ApiModelProperty("是否下载完成,0-否,1-是") + private Integer finish; + + @ApiModelProperty("错误文件路径") + private String filePath; +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/ManageListUserAttendanceDetailTotalVO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/ManageListUserAttendanceDetailTotalVO.java new file mode 100644 index 0000000..f0ca2a7 --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/ManageListUserAttendanceDetailTotalVO.java @@ -0,0 +1,18 @@ +package com.yida.data.attendance.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import io.swagger.models.auth.In; +import lombok.Data; + +@Data +@ApiModel("打卡明细-统计-返回类") +public class ManageListUserAttendanceDetailTotalVO { + + @ApiModelProperty("总数") + private Integer totalNum; + + @ApiModelProperty("异常人数") + private Integer abNormalNum; + +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/ManageListUserAttendanceDetailVO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/ManageListUserAttendanceDetailVO.java new file mode 100644 index 0000000..0b1c18e --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/ManageListUserAttendanceDetailVO.java @@ -0,0 +1,69 @@ +package com.yida.data.attendance.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel("打卡明细-返回类") +public class ManageListUserAttendanceDetailVO { + + @ApiModelProperty("用户Id") + private Long userId; + + @ApiModelProperty("用户姓名") + private String userName; + + @ApiModelProperty("用户姓名") + private String deptName; + + @ApiModelProperty("宿舍") + private String dormName; + + @ApiModelProperty("用户头像") + private String avatar; + + @ApiModelProperty("学生类型,0-走读,1-住宿") + private Integer studentType; + + @ApiModelProperty("用户类型:0职工,1学生") + private Integer userType; + + @ApiModelProperty("打卡规则Id") + private Long ruleId; + + @ApiModelProperty("打卡规则") + private String ruleName; + + @ApiModelProperty("迟到次数") + private Integer lateNum; + + @ApiModelProperty("晚归次数") + private Integer lateDormNum; + + @ApiModelProperty("晚归分钟数") + private Integer lateDormMinute; + + @ApiModelProperty("异常晚归次数") + private Integer aBLateDormNum; + + @ApiModelProperty("异常晚归分钟数") + private Integer aBLateDormMinute; + + @ApiModelProperty("早退次数") + private Integer leaveNum; + + @ApiModelProperty("缺卡次数") + private Integer missNum; + + @ApiModelProperty("请假次数") + private Integer requestNum; + + @ApiModelProperty("迟到分钟数") + private Integer lateMinute; + + @ApiModelProperty("早退分钟数") + private Integer leaveMinute; + + +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/ManageListUserVO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/ManageListUserVO.java new file mode 100644 index 0000000..e00fa6d --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/ManageListUserVO.java @@ -0,0 +1,41 @@ +package com.yida.data.attendance.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.util.List; +import lombok.Data; + +@Data +@ApiModel("管理员管理用户考勤统计-返回类") +public class ManageListUserVO { + + @ApiModelProperty("管理部门名称") + private Long deptId; + + @ApiModelProperty("管理部门名称") + private Integer deptType; + + @ApiModelProperty("管理部门名称") + private String deptName; + + @ApiModelProperty("正常打卡人数") + private Integer normalNum; + + @ApiModelProperty("异常打卡人数") + private Integer abNormalNum; + + @ApiModelProperty("总打卡人数") + private Integer totalNum; + + @ApiModelProperty("迟到人数") + private Integer lateUserNum; + + @ApiModelProperty("早退次数") + private Integer leaveUserNum; + + @ApiModelProperty("缺卡人数") + private Integer missUserNum; + + @ApiModelProperty("请假人数") + private Integer requestUserNum; +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/OnlineCountVO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/OnlineCountVO.java new file mode 100644 index 0000000..7cf4c43 --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/OnlineCountVO.java @@ -0,0 +1,11 @@ +package com.yida.data.attendance.vo; + +import lombok.Data; + +@Data +public class OnlineCountVO { + + private Integer onlineNum; + + private Integer offlineNum; +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/StaRecordCountVO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/StaRecordCountVO.java new file mode 100644 index 0000000..7f1fef7 --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/StaRecordCountVO.java @@ -0,0 +1,23 @@ +package com.yida.data.attendance.vo; + +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@ApiModel("各类型考勤状态数量") +@Data +public class StaRecordCountVO { + + private Integer studentNormal; + + private Integer studentLate; + + private Integer studentNotArrive; + + private Integer studentRequest; + + private Integer staffNormal; + + private Integer staffLate; + + private Integer staffNotArrive; +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/StaffIdentityVO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/StaffIdentityVO.java new file mode 100644 index 0000000..8fd0bac --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/StaffIdentityVO.java @@ -0,0 +1,13 @@ +package com.yida.data.attendance.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class StaffIdentityVO { + + @ApiModelProperty("学生管理员") + private boolean manageStudent; + @ApiModelProperty("职工管理员") + private boolean manageStaff; +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/StudentDormAttendanceDayReportExcelVO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/StudentDormAttendanceDayReportExcelVO.java new file mode 100644 index 0000000..7c4ef33 --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/StudentDormAttendanceDayReportExcelVO.java @@ -0,0 +1,98 @@ +package com.yida.data.attendance.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@ApiModel("学生宿舍考勤日报/周报/月报导出实体对象") +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class StudentDormAttendanceDayReportExcelVO { + + @ApiModelProperty("考勤日期") + @ExcelProperty(order = 1, value = "考勤日期") + private String attendanceTime; + + @ApiModelProperty("校区") + @ExcelProperty(order = 2, value = "校区") + private String campusName; + + @ApiModelProperty("学段") + @ExcelProperty(order = 3, value = "学段") + private String sectionName; + + @ApiModelProperty("年级") + @ExcelProperty(order = 4, value = "年级") + private String gradeName; + + @ApiModelProperty("班级") + @ExcelProperty(order = 5, value = "班级") + private String className; + + @ApiModelProperty("应打卡人数") + @ExcelProperty(order = 6, value = "应打卡人数") + private String needNum; + + @ApiModelProperty("实际打卡人数") + @ExcelProperty(order = 7, value = "实际打卡人数") + private String realNum; + + @ApiModelProperty("请假人数") + @ExcelProperty(order = 8, value = "请假人数") + private String requestNum; + + @ApiModelProperty("正常打卡人数") + @ExcelProperty(order = 9, value = "正常打卡人数") + private String normalNum; + + @ApiModelProperty("旷宿人数") + @ExcelProperty(order = 10, value = "旷宿人数") + private String missNum; + + @ApiModelProperty("晚归打卡人数") + @ExcelProperty(order = 11, value = "晚归打卡人数") + private String lateNum; + + @ApiModelProperty("异常晚归打卡人数") + @ExcelProperty(order = 12, value = "异常晚归打卡人数") + private String abLateNum; + + + @ApiModelProperty("出勤率") + @ExcelProperty(order = 13, value = "出勤率") + private String attendanceRate; + +// @ApiModelProperty("应打卡次数") +// @ExcelProperty(order = 13, value = "应打卡次数") +// private String needDay; +// +// @ApiModelProperty("实际打卡次数") +// @ExcelProperty(order = 14, value = "实际打卡次数") +// private String realDay; +// +// @ApiModelProperty("正常打卡次数") +// @ExcelProperty(order = 15, value = "正常打卡次数") +// private String normalDay; +// +// @ApiModelProperty("旷宿次数") +// @ExcelProperty(order = 16, value = "旷宿次数") +// private String missDay; +// +// @ApiModelProperty("晚归打卡次数") +// @ExcelProperty(order = 17, value = "晚归打卡次数") +// private String lateDay; +// +// @ApiModelProperty("异常晚归打卡次数") +// @ExcelProperty(order = 18, value = "异常晚归打卡次数") +// private String abLateDay; +// +// @ApiModelProperty("打卡率") +// @ExcelProperty(order = 19, value = "打卡率") +// private String checkRate; +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/StudentDormAttendanceResultExcelVO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/StudentDormAttendanceResultExcelVO.java new file mode 100644 index 0000000..9b29eca --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/StudentDormAttendanceResultExcelVO.java @@ -0,0 +1,68 @@ +package com.yida.data.attendance.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.yida.data.common.core.converter.LocalDateConverter; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.time.LocalDate; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@ApiModel("学生宿舍考勤结果导出实体对象") +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class StudentDormAttendanceResultExcelVO { + + @ApiModelProperty("姓名") + @ExcelProperty(order = 0, value = "姓名") + private String studentName; + + @ApiModelProperty("学号") + @ExcelProperty(order = 1, value = "学号") + private String studentNumber; + + @ApiModelProperty("校区") + @ExcelProperty(order = 2, value = "校区") + private String campusName; + + @ApiModelProperty("学段") + @ExcelProperty(order = 3, value = "学段") + private String sectionName; + + @ApiModelProperty("年级") + @ExcelProperty(order = 4, value = "年级") + private String gradeName; + + @ApiModelProperty("班级") + @ExcelProperty(order = 5, value = "班级") + private String className; + + @ApiModelProperty("考勤规则") + @ExcelProperty(order = 6, value = "考勤规则") + private String ruleName; + + @ApiModelProperty("考勤日期") + @ExcelProperty(order = 7, value = "考勤日期") + private String attendanceDate; + + @ApiModelProperty("星期") + @ExcelProperty(order = 8, value = "星期") + private String attendanceWeek; + + @ApiModelProperty("考勤时段") + @ExcelProperty(order = 9, value = "考勤时段") + private String attendanceTime; + + @ApiModelProperty("考勤结果") + @ExcelProperty(order = 10, value = "考勤结果") + private String status; + + @ApiModelProperty("打卡时间") + @ExcelProperty(order = 11, value = "打卡时间") + private String attendanceRealTime; + +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/StudentDormAttendanceResultTotalExcelVO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/StudentDormAttendanceResultTotalExcelVO.java new file mode 100644 index 0000000..cdb905c --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/StudentDormAttendanceResultTotalExcelVO.java @@ -0,0 +1,66 @@ +package com.yida.data.attendance.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@ApiModel("学生宿舍考勤结果导出实体对象") +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class StudentDormAttendanceResultTotalExcelVO { + + @ApiModelProperty("姓名") + @ExcelProperty(order = 0, value = "姓名") + private String studentName; + + @ApiModelProperty("学号") + @ExcelProperty(order = 1, value = "学号") + private String studentNumber; + + @ApiModelProperty("校区") + @ExcelProperty(order = 2, value = "校区") + private String campusName; + + @ApiModelProperty("学段") + @ExcelProperty(order = 3, value = "学段") + private String sectionName; + + @ApiModelProperty("年级") + @ExcelProperty(order = 4, value = "年级") + private String gradeName; + + @ApiModelProperty("班级") + @ExcelProperty(order = 5, value = "班级") + private String className; + + @ApiModelProperty("应打卡次数") + @ExcelProperty(order = 6, value = "应打卡次数") + private String needDay; + + @ApiModelProperty("实际打卡次数") + @ExcelProperty(order = 7, value = "实际打卡次数") + private String realDay; + + @ApiModelProperty("正常打卡次数") + @ExcelProperty(order = 8, value = "正常打卡次数") + private String normalDay; + + @ApiModelProperty("旷宿次数") + @ExcelProperty(order = 9, value = "旷宿次数") + private String missDay; + + @ApiModelProperty("晚归打卡次数") + @ExcelProperty(order = 10, value = "晚归打卡次数") + private String lateDay; + + @ApiModelProperty("异常晚归打卡次数") + @ExcelProperty(order = 11, value = "异常晚归打卡次数") + private String abLateDay; + +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/UserAttendanceResultByDayVO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/UserAttendanceResultByDayVO.java new file mode 100644 index 0000000..682d184 --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/UserAttendanceResultByDayVO.java @@ -0,0 +1,24 @@ +package com.yida.data.attendance.vo; + +import com.carrotsearch.hppc.LongDeque; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceResult; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRule; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.util.List; +import lombok.Data; + +@Data +@ApiModel("获取某日用户考勤记录返回类") +public class UserAttendanceResultByDayVO { + + @ApiModelProperty("打卡规则") + private AttendanceRuleVO rule; + + @ApiModelProperty("累计打卡时长,单位分钟") + private Long attendanceTime; + + @ApiModelProperty("打卡结果") + private List result; + +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/UserAttendanceResultByTimeSlotVO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/UserAttendanceResultByTimeSlotVO.java new file mode 100644 index 0000000..60ad780 --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/UserAttendanceResultByTimeSlotVO.java @@ -0,0 +1,55 @@ +package com.yida.data.attendance.vo; + +import com.yida.data.common.core.entity.attendance.attendance.AttendanceResult; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.util.List; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@ApiModel("获取某时间段内用户考勤结果返回类") +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class UserAttendanceResultByTimeSlotVO { + + @ApiModelProperty("正常打卡天数") + private Integer normalDays; + + @ApiModelProperty("异常打卡天数") + private Integer abNormalDays; + + @ApiModelProperty("总打卡天数") + private Integer totalDays; + + @ApiModelProperty("迟到次数") + private Integer lateTimes; + + @ApiModelProperty("早退次数") + private Integer leaveTimes; + + @ApiModelProperty("缺卡次数") + private Integer missTimes; + +// @ApiModelProperty("旷课次数") +// private Integer outTimes; + + @ApiModelProperty("请假次数") + private Integer requestTimes; + + @ApiModelProperty("打卡结果-迟到") + private List lateList; + + @ApiModelProperty("打卡结果-早退") + private List leaveList; + + @ApiModelProperty("打卡结果-缺卡") + private List missList; + +// @ApiModelProperty("打卡结果-旷课") +// private List outList; + +} diff --git a/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/UserAttendanceResultDayAndNumVO.java b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/UserAttendanceResultDayAndNumVO.java new file mode 100644 index 0000000..5850fb7 --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/java/com/yida/data/attendance/vo/UserAttendanceResultDayAndNumVO.java @@ -0,0 +1,27 @@ +package com.yida.data.attendance.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.time.LocalDate; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +@Data +@ApiModel("获取某时间段内用户考勤结果-日期对应次数返回类") +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class UserAttendanceResultDayAndNumVO { + + @ApiModelProperty("日期") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") + private LocalDate attendanceDate; + + @ApiModelProperty("次数") + private Integer num; +} diff --git a/febs-server/attendance/attendance-api/src/main/resources/META-INF/spring.factories b/febs-server/attendance/attendance-api/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..317b197 --- /dev/null +++ b/febs-server/attendance/attendance-api/src/main/resources/META-INF/spring.factories @@ -0,0 +1,6 @@ +# Auto Configure +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ +com.yida.data.attendance.fallback.RemoteAttendanceDeviceServiceFallback,\ +com.yida.data.attendance.fallback.RemoteAttendanceStrategyServiceFallback,\ +com.yida.data.attendance.fallback.RemoteAttendanceResultServiceFallback,\ +com.yida.data.attendance.fallback.RemoteUserStrategyServiceFallback diff --git a/febs-server/attendance/attendance-biz/pom.xml b/febs-server/attendance/attendance-biz/pom.xml new file mode 100644 index 0000000..593fe8f --- /dev/null +++ b/febs-server/attendance/attendance-biz/pom.xml @@ -0,0 +1,86 @@ + + + + attendance + com.yida.data.attendance + 2.2-RELEASE + + 4.0.0 + + attendance-biz + + + 8 + 8 + + + + + + org.eclipse.paho + org.eclipse.paho.client.mqttv3 + ${paho.mqttv3.version} + + + com.yida.data.system + febs-server-system-api + ${febs-cloud.version} + compile + + + com.yida.data.user + edu-user-api + ${febs-cloud.version} + compile + + + com.yida.data.school + edu-school-api + ${febs-cloud.version} + compile + + + + com.yida.data.common + edu-common + ${febs-cloud.version} + compile + + + com.yida.data.job + febs-server-job-api + ${febs-cloud.version} + compile + + + com.yida.data.attendance + attendance-api + ${febs-cloud.version} + compile + + + + org.springframework.boot + spring-boot-starter-activemq + + + com.yida.data.server + edu-card-server-api + 2.2-RELEASE + compile + + + + + + org.springframework.boot + spring-boot-maven-plugin + + ../../../febs-jar + + + + + \ No newline at end of file diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/AttendanceApplication.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/AttendanceApplication.java new file mode 100644 index 0000000..88c3f88 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/AttendanceApplication.java @@ -0,0 +1,29 @@ +package com.yida.data.attendance; + + +import cc.mrbird.febs.common.security.starter.annotation.EnableFebsCloudResourceServer; +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.WebApplicationType; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.cloud.openfeign.EnableFeignClients; +import org.springframework.jms.annotation.EnableJms; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; + +@EnableAsync +@EnableScheduling +@EnableFebsCloudResourceServer +@EnableFeignClients(basePackages = "com.yida.data") +@MapperScan("com.yida.data.attendance.mapper") +@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) +@EnableJms +public class AttendanceApplication { + + public static void main(String[] args) { + new SpringApplicationBuilder(AttendanceApplication.class) + .web(WebApplicationType.SERVLET) + .run(args); + } +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/configure/ActiveMqConfigure.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/configure/ActiveMqConfigure.java new file mode 100644 index 0000000..81f7360 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/configure/ActiveMqConfigure.java @@ -0,0 +1,147 @@ +package com.yida.data.attendance.configure; + +import cc.mrbird.febs.common.redis.service.RedisService; +import cn.hutool.core.date.LocalDateTimeUtil; +import cn.hutool.core.lang.Snowflake; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.yida.data.attendance.dto.AddAttendanceRecordDTO; +import com.yida.data.attendance.service.AttendanceRecordService; +import com.yida.data.attendance.service.EduAttendanceDeviceService; +import com.yida.data.attendance.service.ErrorRecordMsgService; +import com.yida.data.common.core.entity.ErrorRecordMsg; +import com.yida.data.common.core.entity.ReceiveMsg; +import com.yida.data.common.core.entity.attendance.EduAttendanceDevice; +import com.yida.data.common.core.entity.constant.CachePrefixConstant; +import com.yida.data.common.core.entity.user.EduStaff; +import com.yida.data.common.core.entity.user.EduStudent; +import com.yida.data.common.core.enums.MsgChannel; +import com.yida.data.common.core.enums.RecordTypeEnum; +import com.yida.data.user.feign.RemoteStaffService; +import com.yida.data.user.feign.RemoteStudentService; + +import java.time.LocalDateTime; +import java.util.Objects; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Configuration; +import org.springframework.jms.annotation.JmsListener; + +@RequiredArgsConstructor +@Slf4j +@Configuration +public class ActiveMqConfigure { + + private final AttendanceRecordService attendanceRecordService; + private final RemoteStaffService remoteStaffService; + private final RemoteStudentService remoteStudentService; + private final RedisService redisService; + private final ErrorRecordMsgService errorRecordMsgService; + private final EduAttendanceDeviceService eduAttendanceDeviceService; + + public static final String TOPIC = "mq.bfms.client.msg.topic"; + + private static final Snowflake SNOWFLAKE; + + static { + SNOWFLAKE = new Snowflake(1L, 1L); + } + + @JmsListener(destination = "mq.bfms.client.msg.topic") + public void consumeAttendance(String text) { + AddAttendanceRecordDTO dto = new AddAttendanceRecordDTO(); + Long schoolId = null; + try { + // 保存接收消息到es + ReceiveMsg receiveMsg = new ReceiveMsg(); + receiveMsg.setTopic(TOPIC); + receiveMsg.setMsg(text); + receiveMsg.setId(SNOWFLAKE.nextId()); + receiveMsg.setChannel(MsgChannel.ACTIVE.getValue()); + receiveMsg.setCreateDate(LocalDateTime.now()); + redisService.lSet(CachePrefixConstant.RECEIVE_MSG, receiveMsg); + + // 处理业务 + JSONObject json = JSONUtil.parseObj(text); + String method = json.getStr("method"); + if ("bfms.notifyFaceInfo".equals(method)) { + JSONObject data = json.getJSONObject("info"); + + // 设备号 + String sn = data.getStr("channelId"); + // 查询设备信息 + EduAttendanceDevice attendanceDevice = eduAttendanceDeviceService.getOne(Wrappers.lambdaQuery(new EduAttendanceDevice()) + .eq(EduAttendanceDevice::getSn, sn)); + if (Objects.isNull(attendanceDevice)) { + log.error("设备信息不存在: {}", sn); + return; + } + schoolId = attendanceDevice.getSchoolId(); + dto.setSchoolId(attendanceDevice.getSchoolId()); + JSONArray jsonArray = data.getJSONArray("similarFaces"); + if (Objects.isNull(jsonArray)) { + return; + } + JSONObject personData = (JSONObject) jsonArray.get(0); + String personId = personData.getStr("personId"); + Integer personType = personData.getInt("personTypeId"); +// DealRecordDTO dto = new DealRecordDTO(); + + String pictureUrl = data.getStr("pictureUrl"); + String[] pictureUrls = pictureUrl.split("\\|"); + if (pictureUrls.length < 2) { + // 图片未上传 不处理该数据 + return; + } + dto.setPicUrl(pictureUrls[1]); + dto.setCreateTime(LocalDateTimeUtil.of(data.getLong("beginTime") * 1000)); + dto.setDeviceSn(sn); + Object userId = redisService.hget(CachePrefixConstant.USER_DAHUA_USER, personId); + // 查询用户 + if (personType == 2) { + if (userId == null) { + EduStaff staff = remoteStaffService.getStaffByDahuaNoPermission(personId).getData(); + if (staff != null) { + dto.setUserId(staff.getId()); + redisService.hset(CachePrefixConstant.USER_DAHUA_USER, personId, dto.getUserId()); + } + } else { + dto.setUserId(Long.valueOf(userId.toString())); + } + dto.setUserType(0); + } else if (personType == 1) { + if (userId == null) { + EduStudent student = remoteStudentService.getStudentByDahuaNoPermission(personId).getData(); + if (student != null) { + dto.setUserId(student.getId()); + redisService.hset(CachePrefixConstant.USER_DAHUA_USER, personId, dto.getUserId()); + } + } else { + dto.setUserId(Long.valueOf(userId.toString())); + } + dto.setUserType(1); + } + dto.setMsgChannel(MsgChannel.ACTIVE); + if (dto.getUserId() != null) { + log.info("大华人脸识别信息:[{}]", dto); + attendanceRecordService.addRecord(dto); + } + } + } catch (Exception e) { + log.error("处理大华人脸推送错误,接收消息:[{}]", text, e); + errorRecordMsgService.saveMsg(ErrorRecordMsg.builder() +// .id(SNOWFLAKE.nextId()) + .createDate(LocalDateTime.now()) + .schoolId(schoolId) + .msg(JSONUtil.toJsonStr(dto)) + .topic(TOPIC) + .channel(MsgChannel.ACTIVE.getValue()) + .recordType(RecordTypeEnum.PANEL_MACHINE.getType()) + .build() + ); + } + } +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/configure/ThreadPollConfigure.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/configure/ThreadPollConfigure.java new file mode 100644 index 0000000..f550fdd --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/configure/ThreadPollConfigure.java @@ -0,0 +1,26 @@ +package com.yida.data.attendance.configure; + +import java.util.concurrent.ThreadPoolExecutor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +@Configuration +public class ThreadPollConfigure { + + public static final String POLL_NAME = "attendance_thread_pool"; + + @Bean(POLL_NAME) + public ThreadPoolTaskExecutor asyncThreadPoolTaskExecutor() { + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setCorePoolSize(5); + executor.setMaxPoolSize(20); + executor.setKeepAliveSeconds(30); + executor.setThreadNamePrefix("attendance-thread"); + executor.setWaitForTasksToCompleteOnShutdown(true); + executor.setAwaitTerminationSeconds(60); + executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + executor.initialize(); + return executor; + } +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/constant/MqttConstant.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/constant/MqttConstant.java new file mode 100644 index 0000000..5c7dbe6 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/constant/MqttConstant.java @@ -0,0 +1,16 @@ +package com.yida.data.attendance.constant; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import lombok.Data; + +@Data +@Component +@ConfigurationProperties(prefix = "febs.mqtt") +public class MqttConstant { + + private String url; + private String username; + private String password; +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/controller/AttendanceDeviceController.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/controller/AttendanceDeviceController.java new file mode 100644 index 0000000..16736e7 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/controller/AttendanceDeviceController.java @@ -0,0 +1,175 @@ +package com.yida.data.attendance.controller; + +import cn.hutool.core.util.ArrayUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.yida.data.attendance.dto.DevicePage; +import com.yida.data.attendance.dto.IssuedFaceDTO; +import com.yida.data.attendance.dto.RemoveFaceDTO; +import com.yida.data.attendance.service.EduAttendanceDeviceService; +import com.yida.data.attendance.vo.DeviceNumberVO; +import com.yida.data.attendance.vo.DeviceVO; +import com.yida.data.attendance.vo.OnlineCountVO; +import com.yida.data.common.core.annotation.ControllerLog; +import com.yida.data.common.core.common.ModuleName; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.attendance.EduAttendanceDevice; +import com.yida.data.common.core.entity.system.Dept; +import com.yida.data.common.core.entity.system.enums.OperationLogTypeEnum; +import com.yida.data.common.core.utils.FebsUtil; +import com.yida.data.log.annotation.OperationLog; +import com.yida.data.system.feign.RemoteDeptService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; +import lombok.RequiredArgsConstructor; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@Api(tags = "考勤-设备", value = "考勤") +@RestController +@RequestMapping("/device") +@RequiredArgsConstructor +public class AttendanceDeviceController { + + private final EduAttendanceDeviceService eduAttendanceDeviceService; + private final RemoteDeptService remoteDeptService; + + + @ApiOperation("考勤设备列表分页查询") + @GetMapping("/listDevicePage") + @PreAuthorize("hasAuthority('attendance:device:view')") + public ResultBean> listDevicePage(@ApiParam("学校名称") String schoolName, + @ApiParam("设备编号或名称") String number, + @ApiParam("进出类型,0-进门,1-出门") Integer scope, + @ApiParam("区域类型,0-校门,1-宿舍") Integer type, + @ApiParam("设备状态,0-在线,1-离线") Integer state, + @ApiParam("当前页码") @RequestParam(defaultValue = "1") Integer pageNum, + @ApiParam("页面大小") @RequestParam(defaultValue = "10") Integer pageSize + ) { + return ResultBean.buildSuccess(eduAttendanceDeviceService.listDevicePage(new DevicePage(pageNum, + pageSize), schoolName, number, scope, type, state, FebsUtil.getCurrentUser())); + } + + /** + * 考勤设备数量统计 + * + * @return com.yida.data.common.core.common.ResultBean + * @author ZYJ + * @date 2021/10/8 16:57 + */ + @ApiOperation("考勤设备数量统计") + @GetMapping("/findDeviceNumber") + public ResultBean findDeviceNumber() throws NoSuchMethodException { + return eduAttendanceDeviceService.findDeviceNumber(); + } + + @ApiOperation("新增、修改设备") + @PostMapping("/saveDevice") + @OperationLog(module = ModuleName.ATTENDANCE, methods = "新增、修改考勤设备", type = OperationLogTypeEnum.SAVE) + @PreAuthorize("hasAuthority('attendance:device:edit')") + public ResultBean saveDevice(@RequestBody EduAttendanceDevice device) { + return ResultBean.buildSuccess(eduAttendanceDeviceService.saveDevice(device)); + } + + @ApiOperation("删除考勤设备") + @PostMapping("/delDevice") + @OperationLog(module = ModuleName.ATTENDANCE, methods = "删除考勤设备", type = OperationLogTypeEnum.DELETE) + @PreAuthorize("hasAuthority('attendance:device:delete')") + public ResultBean delDevice(@RequestBody List ids) { + eduAttendanceDeviceService.delDevice(ids); + // 更新缓存 + return ResultBean.buildSuccess(); + } + + @ApiOperation("根据学校和区域查询设备列表") + @GetMapping("/listDeviceBySchool") + public ResultBean> listDeviceBySchool( + @ApiParam("学校id") Long schoolId, + @ApiParam("区域类型,0-进门,1-出门") @RequestParam(required = false) Integer scope, + @ApiParam("类型,0-校门,1-宿舍") @RequestParam(required = false) Integer type) { + LambdaQueryWrapper condition = Wrappers.lambdaQuery(new EduAttendanceDevice()) + .eq(EduAttendanceDevice::getSchoolId, schoolId); + if (scope != null) { + condition.eq(EduAttendanceDevice::getZoneScope, scope); + } + if (type != null) { + condition.eq(EduAttendanceDevice::getType, type); + } + return ResultBean.buildSuccess(eduAttendanceDeviceService.list(condition)); + } + + @ApiOperation("根据id查询设备列表") + @GetMapping("/listDeviceById") + ResultBean> listDeviceById(@RequestParam("ids") Long[] ids) { + return ResultBean.buildSuccess( + ArrayUtil.isNotEmpty(ids) ? eduAttendanceDeviceService.listByIds(Arrays.asList(ids)) + : Collections.EMPTY_LIST); + } + + @ApiOperation("根据id开门") + @GetMapping("/openDoor") + public ResultBean openDoor(@ApiParam("设备id") @RequestParam String eduAttendanceDevice) { + eduAttendanceDeviceService.openDoor(eduAttendanceDevice); + return ResultBean.buildSuccess(); + } + + @ApiOperation("根据id设置时间") + @GetMapping("/setSysTime") + @OperationLog(module = ModuleName.ATTENDANCE, methods = "根据id设置设备时间", type = OperationLogTypeEnum.UPDATE) + public ResultBean setSysTime(@ApiParam("设备id") @RequestParam String id) { + eduAttendanceDeviceService.setSysTime(id); + return ResultBean.buildSuccess(); + } + + @ApiOperation("批量设置时间") + @PostMapping("/setAllTime") + @OperationLog(module = ModuleName.ATTENDANCE, methods = "批量设置设备时间", type = OperationLogTypeEnum.UPDATE) + public ResultBean setAllTime(@RequestBody List list) { + + eduAttendanceDeviceService.setAllTime(list); + return ResultBean.buildSuccess(); + } + + @ApiOperation("批量开门") + @PostMapping("/openAllDoor") + @OperationLog(module = ModuleName.ATTENDANCE, methods = "批量开门设备", type = OperationLogTypeEnum.UPDATE) + public ResultBean openAllDoor(@RequestBody List list) { + + eduAttendanceDeviceService.openAllDoor(list); + return ResultBean.buildSuccess(); + } + + @ApiOperation("下发人脸(下发设备需为同一厂商设备)") + @PostMapping("/issuedFace") + @OperationLog(module = ModuleName.ATTENDANCE, methods = "下发人脸", type = OperationLogTypeEnum.SELECT) + public ResultBean issuedFace(@RequestBody IssuedFaceDTO dto) { + eduAttendanceDeviceService.issuedFace(dto); + return ResultBean.buildSuccess(); + } + + @ApiOperation("删除设备中的人脸") + @PostMapping("/removeFace") + @OperationLog(module = ModuleName.ATTENDANCE, methods = "删除设备中的人脸", type = OperationLogTypeEnum.DELETE) + public ResultBean removeFace(@RequestBody RemoveFaceDTO dto) { + eduAttendanceDeviceService.removeFace(dto); + return ResultBean.buildSuccess(); + } + + @ApiOperation("获取面板机状态分布") + @GetMapping("/getOnlineDistrib") + public ResultBean getOnlineDistrib() { + List schoolIds = remoteDeptService.getSchoolByArea(null, null).getData().stream().map(Dept::getDeptId) + .collect(Collectors.toList()); + return ResultBean.buildSuccess(eduAttendanceDeviceService.getOnlineDistrib(schoolIds)); + } +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/controller/AttendanceDeviceGroupController.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/controller/AttendanceDeviceGroupController.java new file mode 100644 index 0000000..e28bfc8 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/controller/AttendanceDeviceGroupController.java @@ -0,0 +1,122 @@ +package com.yida.data.attendance.controller; + +import cn.hutool.core.util.ArrayUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.yida.data.attendance.service.EduAttendanceDeviceGroupService; +import com.yida.data.attendance.service.EduDeviceGroupService; +import com.yida.data.attendance.vo.DeviceOrDeviceGroupVO; +import com.yida.data.common.core.common.ModuleName; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.CurrentUser; +import com.yida.data.common.core.entity.attendance.EduAttendanceDevice; +import com.yida.data.common.core.entity.attendance.EduAttendanceDeviceGroup; +import com.yida.data.common.core.entity.attendance.EduDeviceGroup; +import com.yida.data.common.core.entity.system.enums.OperationLogTypeEnum; +import com.yida.data.common.core.utils.FebsUtil; +import com.yida.data.log.annotation.OperationLog; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +/** + * 设备分组表 Controller + * + * @author zhanghaijun + * @date 2021-06-16 15:27:11 + */ + +@Api(tags = "考勤-设备分组") +@Slf4j +@Validated +@RestController +@RequestMapping("/deviceGroup") +@RequiredArgsConstructor +public class AttendanceDeviceGroupController { + + private final EduAttendanceDeviceGroupService eduAttendanceDeviceGroupService; + private final EduDeviceGroupService eduDeviceGroupService; + + + @ApiOperation("根据name分页查询分组") + @GetMapping("/listDevicePage") + public ResultBean> listDeviceGroupPage(@ApiParam("分组名称") @RequestParam String name, + @ApiParam("当前页码") @RequestParam(defaultValue = "1") Long current, + @ApiParam("页面大小") @RequestParam(defaultValue = "10") Long size, + @ApiParam("学校id") @RequestParam(required = false) Long schoolId) throws NoSuchMethodException { + + return ResultBean.buildSuccess(eduAttendanceDeviceGroupService.selectGroup(name, current, size, schoolId)); + } + + + @ApiOperation("全部查询") + @GetMapping("/listDevice") + public ResultBean> listDeviceGroup() { + + return ResultBean.buildSuccess(eduAttendanceDeviceGroupService.selectGroupAll()); + } + + + @ApiOperation("新增或修改分组") + @PostMapping("/insertGroup") + @OperationLog(module = ModuleName.DEVICE, methods = "新增分组", type = OperationLogTypeEnum.SAVE) + public ResultBean insertGroup(@ApiParam("分组详细") @RequestBody EduAttendanceDeviceGroup eduAttendanceDeviceGroup) { + + eduAttendanceDeviceGroupService.saveOrUpdate(eduAttendanceDeviceGroup); + return ResultBean.buildSuccess(); + } + + + @ApiOperation("删除分组") + @GetMapping("/delGroup") + @OperationLog(module = ModuleName.DEVICE, methods = "删除分组", type = OperationLogTypeEnum.DELETE) + public ResultBean delGroup(@RequestParam Long id) { + eduAttendanceDeviceGroupService.delGroup(id); + return ResultBean.buildSuccess(); + } + + + @ApiOperation("查询设备与设备组列表") + @GetMapping("/listDeviceAndDeviceGroup") + public ResultBean> listDeviceAndDevice(String keyword) { + CurrentUser currentUser = FebsUtil.getCurrentUser(); + Long schoolId = null; + if (currentUser.getDeptType() == 0) { + schoolId = currentUser.getDeptId(); + } + return ResultBean.buildSuccess(eduAttendanceDeviceGroupService.listDeviceAndDevice(keyword, schoolId)); + } + + @ApiOperation("根据设备组查询设备") + @GetMapping("/listDeviceByGroup") + public ResultBean> listDeviceByGroup(Long[] groupIds) { + return ResultBean.buildSuccess(eduAttendanceDeviceGroupService.listDeviceByGroup(Arrays.asList(groupIds))); + } + + @ApiOperation("查询设备组列表") + @GetMapping("/listDeviceGroupById") + public ResultBean> listDeviceGroupById(Long[] ids) { + return ResultBean.buildSuccess(ArrayUtil.isNotEmpty(ids) ? eduAttendanceDeviceGroupService.listByIds(Arrays.asList(ids)) : + Collections.EMPTY_LIST); + } + + @ApiOperation("批量分组") + @PostMapping("/batchGroup") + @OperationLog(module = ModuleName.DEVICE, methods = "批量分组", type = OperationLogTypeEnum.UPDATE) + public ResultBean batchGroup(@ApiParam("批量分组") @RequestBody List list) { + eduDeviceGroupService.insertGroup(list); + return ResultBean.buildSuccess(); + } + +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/controller/AttendanceRecordController.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/controller/AttendanceRecordController.java new file mode 100644 index 0000000..1a9d219 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/controller/AttendanceRecordController.java @@ -0,0 +1,96 @@ +package com.yida.data.attendance.controller; + +import cc.mrbird.febs.common.redis.service.RedisService; +import cn.hutool.core.lang.UUID; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.yida.data.attendance.dto.AddAttendanceRecordDTO; +import com.yida.data.attendance.dto.AttendanceCountPageDTO; +import com.yida.data.attendance.dto.ListErrorRecordDTO; +import com.yida.data.attendance.dto.PageAttendanceRecordDTO; +import com.yida.data.attendance.service.AttendanceRecordService; +import com.yida.data.attendance.service.ErrorRecordMsgService; +import com.yida.data.attendance.vo.DownLoadAttendanceResultVO; +import com.yida.data.common.core.common.ModuleName; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.ErrorRecordMsg; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRecord; +import com.yida.data.common.core.entity.constant.CachePrefixConstant; +import com.yida.data.common.core.entity.system.enums.OperationLogTypeEnum; +import com.yida.data.log.annotation.OperationLog; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Page; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 进出记录 Controller + * + * @date 2023-08-09 11:37:25 + */ +@Slf4j +@Validated +@RestController +@RequestMapping("/attendanceRecord") +@RequiredArgsConstructor +@Api(tags = "考勤-记录", value = "考勤记录") +public class AttendanceRecordController { + + private final ErrorRecordMsgService errorRecordMsgService; + private final AttendanceRecordService attendanceRecordService; + private final RedisService redisService; + + @ApiOperation("增加考勤记录") + @PostMapping("/saveRecord") + @OperationLog(module = ModuleName.ATTENDANCE, methods = "增加考勤记录", type = OperationLogTypeEnum.INSERT) + public ResultBean addRecord(@RequestBody AddAttendanceRecordDTO dto) { + attendanceRecordService.addRecord(dto); + return ResultBean.buildSuccess(); + } + + + @ApiOperation("分页查询通讯记录") + @PostMapping("/pageListRecord") + public ResultBean> pageListRecord(@RequestBody PageAttendanceRecordDTO dto) { + return ResultBean.buildSuccess(attendanceRecordService.listRecordPage(dto)); + } + + @ApiOperation("分页查询通行记录错误记录") + @PostMapping("/listErrorRecord") + public ResultBean> listErrorRecord(@RequestBody ListErrorRecordDTO dto) { + return ResultBean.buildSuccess(errorRecordMsgService.listErrorRecord(dto)); + } + + @ApiOperation("批量删除通行记录错误记录") + @PostMapping("/batchDeleteErrorRecord") + @OperationLog(module = ModuleName.ATTENDANCE, methods = "批量删除通行记录错误记录", type = OperationLogTypeEnum.DELETE) + public ResultBean batchDeleteErrorRecord(@RequestBody String[] recordIds) { + errorRecordMsgService.batchDeleteErrorRecord(recordIds); + return ResultBean.buildSuccess(); + } + + @ApiOperation("通行记录导出") + @PostMapping("/downloadAttendanceRecord") + public ResultBean downloadAttendanceRecord(@RequestBody PageAttendanceRecordDTO dto) { + String uuid = UUID.fastUUID().toString(); + attendanceRecordService.downloadAttendanceRecord(dto, uuid); + return ResultBean.buildSuccess(DownLoadAttendanceResultVO.builder() + .key(uuid) + .finish(0) + .totalNum(100) + .currentNum(1).build()); + } + + @ApiOperation("获取通行记录导出进度") + @GetMapping("/getDownloadAttendanceRecordProcess") + public ResultBean getDownloadAttendanceRecordProcess(String key) { + return ResultBean.buildSuccess( + (DownLoadAttendanceResultVO) redisService.hget(CachePrefixConstant.ATTENDANCE_RECORD_DOWNLOAD, key)); + } +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/controller/AttendanceReportStrategyController.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/controller/AttendanceReportStrategyController.java new file mode 100644 index 0000000..01a2df9 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/controller/AttendanceReportStrategyController.java @@ -0,0 +1,51 @@ +package com.yida.data.attendance.controller; + +import com.yida.data.attendance.dto.AddAttendanceReportStrategyDTO; +import com.yida.data.attendance.service.AttendanceReportStrategyService; +import com.yida.data.common.core.common.ModuleName; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceReportStrategy; +import com.yida.data.common.core.entity.system.enums.OperationLogTypeEnum; +import com.yida.data.log.annotation.OperationLog; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import java.util.List; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 进出记录 Controller + * + * @date 2023-08-09 11:37:25 + */ +@Slf4j +@Validated +@RestController +@RequestMapping("/attendanceReportStrategy") +@RequiredArgsConstructor +@Api(tags = "考勤-推送策略", value = "推送策略") +public class AttendanceReportStrategyController { + + private final AttendanceReportStrategyService attendanceReportStrategyService; + + + @ApiOperation("获取推送策略详情") + @GetMapping("/get") + public ResultBean> getStrategy() { + return ResultBean.buildSuccess(attendanceReportStrategyService.getList()); + } + + @ApiOperation("新增/编辑推送策略") + @PostMapping("/save") + @OperationLog(module = ModuleName.ATTENDANCE, methods = "新增/编辑推送策略", type = OperationLogTypeEnum.SAVE) + public ResultBean saveStrategy(@RequestBody List strategyList) { + attendanceReportStrategyService.saveStrategy(strategyList); + return ResultBean.buildSuccess(); + } +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/controller/AttendanceResultController.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/controller/AttendanceResultController.java new file mode 100644 index 0000000..9861219 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/controller/AttendanceResultController.java @@ -0,0 +1,119 @@ +package com.yida.data.attendance.controller; + +import cc.mrbird.febs.common.redis.service.RedisService; +import cn.hutool.core.lang.UUID; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.yida.data.attendance.dto.AttendanceCountPageDTO; +import com.yida.data.attendance.dto.AttendanceDayReportDTO; +import com.yida.data.attendance.service.AttendanceResultService; +import com.yida.data.attendance.vo.AttdanceResultDetailVO; +import com.yida.data.attendance.vo.AttdanceResultTotalVO; +import com.yida.data.attendance.vo.AttdanceResultVO; +import com.yida.data.attendance.vo.DownLoadAttendanceResultVO; +import com.yida.data.attendance.vo.StaRecordCountVO; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.constant.CachePrefixConstant; +import com.yida.data.common.core.entity.system.Dept; +import com.yida.data.system.feign.RemoteDeptService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import java.time.LocalDate; +import java.util.List; +import java.util.stream.Collectors; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 考勤-考勤结果 Controller + * + * @date 2023-08-09 11:37:25 + */ +@Slf4j +@RestController +@RequestMapping("/attendanceResult") +@RequiredArgsConstructor +@Api(tags = "考勤-结果", value = "考勤结果") +public class AttendanceResultController { + + private final AttendanceResultService attendanceResultService; + + private final RemoteDeptService remoteDeptService; + + private final RedisService redisService; + + @ApiOperation("考勤-概况统计") + @PostMapping("/overview/sta") + public ResultBean> listResultPage(@RequestBody @Validated AttendanceCountPageDTO dto) { + return ResultBean.buildSuccess(attendanceResultService.listResultPage(dto)); + } + + @ApiOperation("考勤-概况统计") + @PostMapping("/overview/total") + public ResultBean total(@RequestBody @Validated AttendanceCountPageDTO dto) { + return ResultBean.buildSuccess(attendanceResultService.total(dto)); + } + + + @ApiOperation("考勤-明细") + @PostMapping("/detail") + public ResultBean> listResultDetail(@RequestBody AttendanceCountPageDTO dto) { + return ResultBean.buildSuccess(attendanceResultService.listResultDetailPage(dto)); + } + + @ApiOperation("dashboard-考勤概况") + @GetMapping("/staRecordCount") + public ResultBean staRecordCount(@ApiParam("yyyy-MM-dd") String startDate, + @ApiParam("yyyy-MM-dd") String endDate) { + List schoolIds = remoteDeptService.getSchoolByArea(null, null).getData().stream().map(Dept::getDeptId) + .collect(Collectors.toList()); + return ResultBean.buildSuccess( + attendanceResultService.staRecordCount(LocalDate.parse(startDate), LocalDate.parse(endDate), schoolIds)); + } + + @ApiOperation("考勤结果导出") + @PostMapping("/downloadAttendanceResult") + public ResultBean downLocalAttendanceResult(@RequestBody AttendanceCountPageDTO dto) { + String uuid = UUID.fastUUID().toString(); + attendanceResultService.downLocalAttendanceResult(dto, uuid); + return ResultBean.buildSuccess(DownLoadAttendanceResultVO.builder() + .key(uuid) + .finish(0) + .totalNum(100) + .currentNum(0).build()); + } + + + @ApiOperation("获取考勤结果导出进度") + @GetMapping("/getDownloadAttendanceResultProcess") + public ResultBean getDownLocalAttendanceResultProcess(String key) { + return ResultBean.buildSuccess( + (DownLoadAttendanceResultVO) redisService.hget(CachePrefixConstant.STUDENT_DORM_ATTENDANCE_RESULT_DOWNLOAD, key)); + } + + @ApiOperation("考勤日报导出") + @PostMapping("/downloadAttendanceDayReport") + public ResultBean downloadAttendanceDayReport(@RequestBody AttendanceDayReportDTO dto) { + String uuid = UUID.fastUUID().toString(); + attendanceResultService.downLocalAttendanceDayReport(dto, uuid); + return ResultBean.buildSuccess(DownLoadAttendanceResultVO.builder() + .key(uuid) + .finish(0) + .totalNum(100) + .currentNum(0).build()); + } + + @ApiOperation("获取考勤日报导出进度") + @GetMapping("/getDownloadAttendanceDayReportProcess") + public ResultBean getDownloadAttendanceDayReportProcess(String key) { + return ResultBean.buildSuccess( + (DownLoadAttendanceResultVO) redisService.hget(CachePrefixConstant.ATTENDANCE_DAY_REPORT_DOWNLOAD, key)); + } + +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/controller/AttendanceRuleController.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/controller/AttendanceRuleController.java new file mode 100644 index 0000000..502d03b --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/controller/AttendanceRuleController.java @@ -0,0 +1,163 @@ +package com.yida.data.attendance.controller; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.yida.data.attendance.dto.AddAttendanceRuleDTO; +import com.yida.data.attendance.dto.AttendanceRuleAdminUserAddDTO; +import com.yida.data.attendance.dto.AttendanceRuleAdminUserPageDTO; +import com.yida.data.attendance.dto.AttendanceRuleUserAddDTO; +import com.yida.data.attendance.dto.AttendanceRuleUserPageDTO; +import com.yida.data.attendance.dto.PageAttendanceRuleDTO; +import com.yida.data.attendance.dto.UpdateAttendanceRuleStatusDTO; +import com.yida.data.attendance.service.AttendanceRuleService; +import com.yida.data.attendance.service.AttendanceRuleWifiService; +import com.yida.data.attendance.vo.AttendanceRuleAdminUserVO; +import com.yida.data.attendance.vo.AttendanceRuleUserVO; +import com.yida.data.attendance.vo.AttendanceRuleVO; +import com.yida.data.common.core.common.ModuleName; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.common.ResultMsgType; +import com.yida.data.common.core.entity.CurrentUser; +import com.yida.data.common.core.entity.constant.FebsConstant; +import com.yida.data.common.core.entity.system.enums.OperationLogTypeEnum; +import com.yida.data.common.core.utils.FebsUtil; +import com.yida.data.common.core.utils.FileUtil; +import com.yida.data.log.annotation.OperationLog; +import com.yida.data.school.vo.smart.ImportRosterDataVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import java.util.List; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.MediaType; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +/** + * 教职工考勤规则 Controller + * + * @date 2023-08-09 11:37:25 + */ +@Slf4j +@RestController +@RequestMapping("attendanceRule") +@RequiredArgsConstructor +@Api(tags = "考勤-规则", value = "考勤规则") +public class AttendanceRuleController { + + private final AttendanceRuleService attendanceRuleService; + + private final AttendanceRuleWifiService attendanceRuleWifiService; + + @ApiOperation("查询规则列表") + @PostMapping("/listRule") + public ResultBean> listRule(@RequestBody PageAttendanceRuleDTO dto) { + dto.setSchoolId(FebsUtil.getTopDeptId()); + return ResultBean + .buildSuccess(attendanceRuleService.listRulePage(dto)); + } + + @ApiOperation("新增、修改规则") + @PostMapping("/saveRule") + @OperationLog(module = ModuleName.ATTENDANCE, methods = "新增、修改考勤规则", type = OperationLogTypeEnum.SAVE) + public ResultBean saveRule(@RequestBody @Validated AddAttendanceRuleDTO dto) { + attendanceRuleService.addAttendanceRule(dto); + return ResultBean.buildSuccess(); + } + + @ApiOperation("获取规则") + @GetMapping("/getRule") + public ResultBean getRule(Long ruleId) { + return ResultBean + .buildSuccess(attendanceRuleService.getRule(ruleId)); + } + + @ApiOperation("删除规则") + @PostMapping("/delRule") + @OperationLog(module = ModuleName.ATTENDANCE, methods = "删除考勤规则", type = OperationLogTypeEnum.DELETE) + public ResultBean delRule(@RequestBody List ruleIds) { + attendanceRuleService.deleteRule(ruleIds); + return ResultBean.buildSuccess(); + } + + @ApiOperation("更改规则状态") + @PostMapping("/updateRuleStatus") + @OperationLog(module = ModuleName.ATTENDANCE, methods = "更改规则状态", type = OperationLogTypeEnum.UPDATE) + public ResultBean updateRuleStatus(@RequestBody UpdateAttendanceRuleStatusDTO dto) { + attendanceRuleService.updateRuleStatus(dto); + return ResultBean.buildSuccess(); + } + + @ApiOperation("导入BSSID") + @PostMapping(value = "/importBssid", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + public ResultBean importBssid( + @ApiParam(value = "导入的excel文件", required = true) @RequestParam("file") MultipartFile file, + @ApiParam(value = "规则ID", required = true) @RequestParam("ruleId") Long ruleId) { + // 验证文件类型 + if (!FileUtil.checkMultipartFile(file, FebsConstant.EXCEL_FILE_TYPE)) { + return ResultBean.buildError(ResultMsgType.FILE_TYPE_ERROR.getValue()); + } + String uuid = StrUtil.uuid(); + // 当前登录用户信息 + CurrentUser currentUser = FebsUtil.getCurrentUser(); + String fileUrl = FileUtil.uploadMultipartFile(file); + // 导入花名册数据 + attendanceRuleWifiService.ImportBssid(fileUrl, ruleId); + return ResultBean + .buildSuccess(ImportRosterDataVO.builder().percent(0).finish(0).key(uuid).build()); + } + + + @ApiOperation("查询打卡人员列表") + @PostMapping("/listRuleAttendanceUser") + public ResultBean> listRuleAttendanceUser(@RequestBody AttendanceRuleUserPageDTO dto) { + dto.setSchoolId(FebsUtil.getTopDeptId()); + return ResultBean + .buildSuccess(attendanceRuleService.listRuleAttendanceUser(dto)); + } + + + @ApiOperation("批量删除打卡人员") + @PostMapping("/deleteRuleAttendanceUser") + @OperationLog(module = ModuleName.ATTENDANCE, methods = "批量删除打卡人员", type = OperationLogTypeEnum.DELETE) + public ResultBean deleteRuleAttendanceUser(@RequestBody List ids) { + attendanceRuleService.deleteRuleAttendanceUser(ids); + return ResultBean.buildSuccess(); + } + + @ApiOperation("增加打卡人员") + @PostMapping("/addRuleAttendanceUser") + @OperationLog(module = ModuleName.ATTENDANCE, methods = "增加打卡人员", type = OperationLogTypeEnum.INSERT) + public ResultBean addRuleAttendanceUser(@RequestBody AttendanceRuleUserAddDTO dto) { + attendanceRuleService.addRuleAttendanceUser(dto); + return ResultBean.buildSuccess(); + } + + @ApiOperation("查询规则管理员列表") + @PostMapping("/listRuleAttendanceAdminUser") + public ResultBean> listRuleAttendanceUser(@RequestBody AttendanceRuleAdminUserPageDTO dto) { + return ResultBean.buildSuccess(attendanceRuleService.listRuleAttendanceAdminUser(dto)); + } + + @ApiOperation("批量删除管理员人员") + @PostMapping("/deleteRuleAttendanceAdminUser") + @OperationLog(module = ModuleName.ATTENDANCE, methods = "批量删除管理员人员", type = OperationLogTypeEnum.DELETE) + public ResultBean deleteRuleAttendanceAdminUser(@RequestBody List ids) { + attendanceRuleService.deleteRuleAttendanceAdminUser(ids); + return ResultBean.buildSuccess(); + } + + @ApiOperation("增加管理员人员") + @PostMapping("/addRuleAttendanceAdminUser") + public ResultBean addRuleAttendanceAdminUser(@RequestBody AttendanceRuleAdminUserAddDTO dto) { + attendanceRuleService.addAttendanceAdminUser(dto); + return ResultBean.buildSuccess(); + } +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/controller/EduAttendanceStrategyController.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/controller/EduAttendanceStrategyController.java new file mode 100644 index 0000000..558310c --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/controller/EduAttendanceStrategyController.java @@ -0,0 +1,71 @@ +package com.yida.data.attendance.controller; + +import com.yida.data.attendance.dto.AddLeaveRequestStrategyDTO; +import com.yida.data.attendance.service.EduAttendanceStrategyService; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.user.EduFaceGroupStrategy; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 设备策略Controller + * 未鉴权 + * + * @author ZYJ + * @date 2022-12-13 11:04:39 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/in/deviceStrategy") +@Api(tags = "考勤-设备-策略", value = "考勤") +public class EduAttendanceStrategyController { + + private final EduAttendanceStrategyService eduAttendanceStrategyService; + + @PostMapping("saveStrategyAndUser") + @ApiOperation("保存策略并绑定人员信息") + public ResultBean saveStrategyAndUser(@RequestBody EduFaceGroupStrategy eduFaceGroupStrategy) { + eduAttendanceStrategyService.saveStrategyAndUser(eduFaceGroupStrategy); + return ResultBean.buildSuccess(); + } + + @PostMapping("deleteStrategy") + @ApiOperation("删除策略") + public ResultBean deleteStrategy(@RequestBody EduFaceGroupStrategy eduFaceGroupStrategy) { + eduAttendanceStrategyService.deleteStrategy(eduFaceGroupStrategy); + return ResultBean.buildSuccess(); + } + + @PostMapping("bindUserStrategy") + @ApiOperation("绑定对应的人员-策略信息") + public ResultBean bindUserStrategy(@RequestBody EduFaceGroupStrategy eduFaceGroupStrategy) { + eduAttendanceStrategyService.bindUserStrategy(eduFaceGroupStrategy); + return ResultBean.buildSuccess(); + } + + @PostMapping("unBindUserStrategy") + @ApiOperation("解绑对应的人员-策略信息") + public ResultBean unBindUserStrategy(@RequestBody EduFaceGroupStrategy eduFaceGroupStrategy) { + eduAttendanceStrategyService.unBindUserStrategy(eduFaceGroupStrategy); + return ResultBean.buildSuccess(); + } + + @PostMapping("deleteAndSaveStrategy") + @ApiOperation("删除并保存策略(包含人员信息)") + public ResultBean deleteAndSaveStrategy(@RequestBody EduFaceGroupStrategy eduFaceGroupStrategy) { + eduAttendanceStrategyService.deleteAndSaveStrategy(eduFaceGroupStrategy); + return ResultBean.buildSuccess(); + } + + @PostMapping("addLeaveRequestStrategy") + @ApiOperation("添加请假类型短策略") + public ResultBean addLeaveRequestStrategy(@RequestBody AddLeaveRequestStrategyDTO dto) { + eduAttendanceStrategyService.addLeaveRequestStrategy(dto); + return ResultBean.buildSuccess(); + } +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/controller/H5/H5AttendanceRecordController.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/controller/H5/H5AttendanceRecordController.java new file mode 100644 index 0000000..b361e68 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/controller/H5/H5AttendanceRecordController.java @@ -0,0 +1,38 @@ +package com.yida.data.attendance.controller.H5; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.yida.data.attendance.dto.PageAttendanceRecordDTO; +import com.yida.data.attendance.service.AttendanceRecordService; +import com.yida.data.common.core.annotation.ControllerLog; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRecord; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 教职工考勤规则 Controller + * + * @date 2023-08-09 11:37:25 + */ +@Slf4j +@RestController +@RequestMapping("H5/attendanceRecord") +@RequiredArgsConstructor +@Api(tags = "移动端-打卡记录", value = "移动端-打卡记录") +public class H5AttendanceRecordController { + + private final AttendanceRecordService attendanceRecordService; + + @ApiOperation("分页查看打卡记录") + @PostMapping("/listRecord") + public ResultBean> listRule(@RequestBody PageAttendanceRecordDTO dto) { + return ResultBean + .buildSuccess(attendanceRecordService.listRecordPage(dto)); + } +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/controller/H5/H5AttendanceRuleController.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/controller/H5/H5AttendanceRuleController.java new file mode 100644 index 0000000..4eb49c9 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/controller/H5/H5AttendanceRuleController.java @@ -0,0 +1,154 @@ +package com.yida.data.attendance.controller.H5; + +import cn.hutool.json.JSONObject; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.yida.data.attendance.dto.AttendanceFaceMatchDTO; +import com.yida.data.attendance.dto.AttendanceResultByDayDTO; +import com.yida.data.attendance.dto.AttendanceResultByStartAndEndTimeDTO; +import com.yida.data.attendance.dto.AttendanceStatusByMonthDTO; +import com.yida.data.attendance.dto.AttendanceUserCheckInDTO; +import com.yida.data.attendance.dto.H5AttendanceRuleWifiDTO; +import com.yida.data.attendance.dto.ManageListUserDTO; +import com.yida.data.attendance.service.AttendanceCheckInService; +import com.yida.data.attendance.service.AttendanceResultService; +import com.yida.data.attendance.service.AttendanceRuleService; +import com.yida.data.attendance.vo.AttendanceFaceMatchVO; +import com.yida.data.attendance.vo.AttendanceRuleVO; +import com.yida.data.attendance.vo.AttendanceStatusByMonthVO; +import com.yida.data.attendance.vo.AttendanceUserCheckInVO; +import com.yida.data.attendance.vo.AttendanceWifiVO; +import com.yida.data.attendance.vo.DateStatusVO; +import com.yida.data.attendance.vo.DayReportDataVO; +import com.yida.data.attendance.vo.ManageListUserAttendanceDetailVO; +import com.yida.data.attendance.vo.ManageListUserVO; +import com.yida.data.attendance.vo.StaffIdentityVO; +import com.yida.data.attendance.vo.UserAttendanceResultByDayVO; +import com.yida.data.attendance.vo.UserAttendanceResultByTimeSlotVO; +import com.yida.data.common.core.annotation.ControllerLog; +import com.yida.data.common.core.common.ModuleName; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.constant.CachePrefixConstant; +import com.yida.data.common.core.entity.system.enums.OperationLogTypeEnum; +import com.yida.data.log.annotation.OperationLog; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import java.util.List; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +/** + * 教职工考勤规则 Controller + * + * @date 2023-08-09 11:37:25 + */ +@Slf4j +@RestController +@RequestMapping("H5/attendanceRule") +@RequiredArgsConstructor +@Api(tags = "移动端-考勤-打卡", value = "移动端-考勤-打卡") +public class H5AttendanceRuleController { + + private final AttendanceRuleService attendanceRuleService; + private final AttendanceResultService attendanceResultService; + private final AttendanceCheckInService attendanceCheckInService; + + @ApiOperation("查询用户当前时间的打卡规则") + @PostMapping("/findRuleByUserAndDate") + public ResultBean findRuleByUserAndDate(@RequestBody H5AttendanceRuleWifiDTO dto) { + return ResultBean.buildSuccess(attendanceCheckInService.findByUserIdAndDateTime(dto)); + } + + @ApiOperation("签到打卡") + @PostMapping("/userCheckIn") + @OperationLog(module = ModuleName.ATTENDANCE, methods = "签到打卡", type = OperationLogTypeEnum.INSERT) + public ResultBean userCheckIn(@RequestBody AttendanceUserCheckInDTO dto) { + return ResultBean.buildSuccess(attendanceCheckInService.userCheckIn(dto)); + } + + @ApiOperation("签到人脸比对") + @PostMapping("/rosterFaceMatch") + @OperationLog(module = ModuleName.ATTENDANCE, methods = "签到人脸比对", type = OperationLogTypeEnum.SELECT) + public ResultBean rosterFaceMatch(@RequestBody AttendanceFaceMatchDTO dto) { + return ResultBean.buildSuccess(attendanceRuleService.AttendanceFaceMatch(dto)); + } + + + @ApiOperation("家长端/教师我的考勤-获取当前月份用户考勤状态汇总") + @PostMapping("/getUserAttendanceStatusByMonth") + public ResultBean> getUserAttendanceStatusByMonth( + @Validated @RequestBody AttendanceStatusByMonthDTO dto) { + return ResultBean.buildSuccess(attendanceResultService.getUserAttendanceStatusByMonth(dto)); + } + + @ApiOperation("家长端/教师我的考勤-获取某日用户考勤结果") + @PostMapping("/getUserAttendanceResultByDay") + public ResultBean> getUserAttendanceRecordByDay( + @Validated @RequestBody AttendanceResultByDayDTO dto) { + return ResultBean.buildSuccess(attendanceResultService.getUserAttendanceResultByDay(dto)); + } + + @ApiOperation("家长端/教师我的考勤(周和月)-获取某时间段内用户考勤结果统计") + @PostMapping("/getUserAttendanceResultByTimeSlot") + public ResultBean getUserAttendanceResultByTimeSlot( + @Validated @RequestBody AttendanceResultByStartAndEndTimeDTO dto) { + return ResultBean.buildSuccess(attendanceResultService.getUserAttendanceResultByTimeSlot(dto)); + } + + @ApiOperation("教师端-管理人员考勤状态-日历显示") + @PostMapping("/findTotalUserStatus") + public ResultBean> findTotalUserStatus( + @Validated @RequestBody ManageListUserDTO dto) { + return ResultBean.buildSuccess(attendanceResultService.findTotalUserStatus(dto)); + } + + @ApiOperation("教师端-管理人员考勤统计") + @PostMapping("/findManageListUserVO") + public ResultBean> findManageListUserVO( + @Validated @RequestBody ManageListUserDTO dto) { + return ResultBean.buildSuccess(attendanceResultService.findManageListUserVO(dto)); + } + + @ApiOperation("教师端-查看明细") + @PostMapping("/findManageListUserDetailVO") + public ResultBean findManageListUserDetailVO( + @Validated @RequestBody ManageListUserDTO dto) { + return ResultBean.buildSuccess(attendanceResultService.findManageListUserDetailVO(dto)); + } + + @ApiOperation("教师端-用户管理的家校部门树") + @GetMapping("/findManageUserDeptTree") + @Cacheable(value = CachePrefixConstant.ATTENDANCE_USER_MANAGE_TREE, key = "#userId+''+#searchUserType") + public ResultBean findManageUserDeptTree(@RequestParam Long userId, @RequestParam Integer searchUserType) { + return ResultBean.buildSuccess(attendanceResultService.findManageUserDeptTree(userId, searchUserType)); + } + + @ApiOperation("教师端-职工身份") + @GetMapping("/findStaffIdentity") + @Cacheable(value = CachePrefixConstant.ATTENDANCE_STAFF_IDENTITY, key = "#userId") + public ResultBean findStaffIdentity(@RequestParam Long userId) { + return ResultBean.buildSuccess(attendanceResultService.findStaffIdentity(userId)); + } + + @ApiOperation("教师端-查询用户管理规则") + @GetMapping("/findUserManageRuleList") + @Cacheable(value = CachePrefixConstant.ATTENDANCE_STAFF_MANAGE_RULE, key = "#userId + '' + #userType") + public ResultBean> findUserManageRuleList(@RequestParam Long userId, @RequestParam Integer userType) { + return ResultBean.buildSuccess(attendanceRuleService.findUserManageRuleList(userId, userType)); + } + + + @ApiOperation("教师端-获取日报详情") + @GetMapping("/getDayReport") + public ResultBean> getDayReport(@RequestParam Long staffId, @RequestParam Integer searchUserType, + @RequestParam Long ruleId, @RequestParam String attendanceDateStr) { + return ResultBean.buildSuccess(attendanceRuleService.getDayReport(staffId, searchUserType, ruleId, attendanceDateStr)); + } +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/controller/in/InAttendanceResultController.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/controller/in/InAttendanceResultController.java new file mode 100644 index 0000000..9413ca1 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/controller/in/InAttendanceResultController.java @@ -0,0 +1,89 @@ +package com.yida.data.attendance.controller.in; + +import com.yida.data.attendance.dto.DayReportDataDTO; +import com.yida.data.attendance.service.AttendanceRecordService; +import com.yida.data.attendance.service.AttendanceReportStrategyService; +import com.yida.data.attendance.service.AttendanceResultService; +import com.yida.data.attendance.service.AttendanceRuleService; +import com.yida.data.attendance.service.NoticeService; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRule; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.w3c.dom.stylesheets.LinkStyle; + +@Slf4j +@RestController +@RequestMapping("in/attendanceResult") +@RequiredArgsConstructor +public class InAttendanceResultController { + + private final AttendanceResultService attendanceResultService; + private final AttendanceRecordService attendanceRecordService; + private final AttendanceReportStrategyService attendanceReportStrategyService; + private final NoticeService noticeService; + private final AttendanceRuleService attendanceRuleService; + + /** + * 每日凌晨先初始化考勤结果 + */ + @GetMapping("/initAttendanceResult") + public void initAttendanceResult() { + attendanceResultService.initUserAttendance(); + } + + + /** + * 策略推送消息 + */ + @GetMapping("/attendanceNotice") + public void notice() { + attendanceReportStrategyService.sendNotice(); + } + + + /** + * 同步老数据 + * + * @param schoolId + * @param startDateTime + */ + @GetMapping("/resetOldData") + public void resetOldData(Long schoolId, String startDateTime, Integer userType) { + attendanceRecordService + .resetOldData(schoolId, + LocalDateTime.parse(startDateTime, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")), userType); + } + + + /** + * 同步老数据 + */ + @GetMapping("/testPushDayReport") + public void testPushDayReport(Long staffId, Long ruleId) { + List dtoList = new ArrayList<>(); + dtoList.add(DayReportDataDTO.builder().deptName("经济管理系").totalNum(1234).abNum(456).requestNum(15).build()); + dtoList.add(DayReportDataDTO.builder().deptName("基础部").totalNum(2563).abNum(652).requestNum(95).build()); + dtoList.add(DayReportDataDTO.builder().deptName("机电工程系").totalNum(859).abNum(15).requestNum(3).build()); + dtoList.add(DayReportDataDTO.builder().deptName("建筑工程系").totalNum(1596).abNum(325).requestNum(35).build()); + dtoList.add(DayReportDataDTO.builder().deptName("计算机信息工程系").totalNum(1846).abNum(15).requestNum(105).build()); + noticeService.sendAttendanceDayReportToStaff(staffId, dtoList, attendanceRuleService.getById(ruleId), 1, true); + } + + + /** + * 每日/每周/每月考勤数据 + */ + @GetMapping("/initAttendanceReport") + public void initAttendanceReport() { + attendanceReportStrategyService.sendNotice(); + } + + +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/controller/in/InEduAttendanceDeviceController.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/controller/in/InEduAttendanceDeviceController.java new file mode 100644 index 0000000..3bf72d3 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/controller/in/InEduAttendanceDeviceController.java @@ -0,0 +1,42 @@ +package com.yida.data.attendance.controller.in; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.yida.data.attendance.service.EduAttendanceDeviceService; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.attendance.EduAttendanceDevice; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import java.util.List; +import javax.annotation.Resource; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@Api(tags = "考勤-设备(不鉴权)") +@RestController +@RequestMapping("/in/device") +public class InEduAttendanceDeviceController { + + @Resource + private EduAttendanceDeviceService eduAttendanceDeviceService; + + @GetMapping("/listDeviceByType") + public ResultBean> listDeviceByType(String type) { + return ResultBean.buildSuccess(eduAttendanceDeviceService.list( + Wrappers.lambdaQuery(new EduAttendanceDevice()).eq(EduAttendanceDevice::getDeviceType, type))); + } + + @ApiOperation("更新设备在线状态") + @GetMapping("/updateDeviceStatus") + public ResultBean updateDeviceStatus() { + eduAttendanceDeviceService.updateDeviceStatus(); + return ResultBean.buildSuccess(); + } + + @ApiOperation("校时所有设备") + @GetMapping("/timingAllDevice") + public ResultBean timingAllDevice() { + eduAttendanceDeviceService.timingAllDevice(); + return ResultBean.buildSuccess(); + } +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/controller/in/InEduUserStrategyController.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/controller/in/InEduUserStrategyController.java new file mode 100644 index 0000000..13ff0f3 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/controller/in/InEduUserStrategyController.java @@ -0,0 +1,32 @@ +package com.yida.data.attendance.controller.in; + +import com.yida.data.attendance.service.AttendanceResultService; +import com.yida.data.attendance.service.EduUserStrategyService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 人员策略信息 controller (不鉴权) + * + * @author ZYJ + * @date 2023/11/7 19:38 + */ +@Slf4j +@RestController +@RequiredArgsConstructor +@RequestMapping("in/eduUserStrategy") +public class InEduUserStrategyController { + + private final EduUserStrategyService eduUserStrategyService; + + /** + * 处理超时用户策略 + */ + @GetMapping("/checkOverTimeUserStrategy") + public void checkOverTimeUserStrategy() { + eduUserStrategyService.checkOverTimeUserStrategy(); + } +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/controller/in/InH5AttendanceRuleController.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/controller/in/InH5AttendanceRuleController.java new file mode 100644 index 0000000..06fd3ed --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/controller/in/InH5AttendanceRuleController.java @@ -0,0 +1,61 @@ +package com.yida.data.attendance.controller.in; + +import com.yida.data.attendance.dto.AttendanceFaceMatchDTO; +import com.yida.data.attendance.dto.AttendanceUserCheckInDTO; +import com.yida.data.attendance.dto.H5AttendanceRuleWifiDTO; +import com.yida.data.attendance.service.AttendanceCheckInService; +import com.yida.data.attendance.service.AttendanceRuleService; +import com.yida.data.attendance.vo.AttendanceFaceMatchVO; +import com.yida.data.attendance.vo.AttendanceUserCheckInVO; +import com.yida.data.attendance.vo.AttendanceWifiVO; +import com.yida.data.common.core.annotation.ControllerLog; +import com.yida.data.common.core.common.ModuleName; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.system.enums.OperationLogTypeEnum; +import com.yida.data.log.annotation.OperationLog; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 教职工考勤规则 Controller + * + * @date 2023-08-09 11:37:25 + */ +@Slf4j +@RestController +@RequestMapping("in/H5/attendanceRule") +@RequiredArgsConstructor +@Api(tags = "移动端-考勤-打卡-非鉴权", value = "移动端-考勤-打卡-非鉴权") +public class InH5AttendanceRuleController { + + private final AttendanceRuleService attendanceRuleService; + private final AttendanceCheckInService attendanceCheckInService; + + @ApiOperation("查询用户当前时间的打卡规则") + @PostMapping("/findRuleByUserAndDate") + public ResultBean findRuleByUserAndDate(@Validated @RequestBody H5AttendanceRuleWifiDTO dto) { + return ResultBean.buildSuccess(attendanceCheckInService.findByUserIdAndDateTime(dto)); + } + + @ApiOperation("签到打卡") + @PostMapping("/userCheckIn") + @OperationLog(module = ModuleName.ATTENDANCE, methods = "签到打卡", type = OperationLogTypeEnum.INSERT) + public ResultBean userCheckIn(@RequestBody AttendanceUserCheckInDTO dto) { + return ResultBean.buildSuccess(attendanceCheckInService.userCheckIn(dto)); + } + + @ApiOperation("签到人脸比对") + @PostMapping("/rosterFaceMatch") + @OperationLog(module = ModuleName.ATTENDANCE, methods = "签到人脸比对", type = OperationLogTypeEnum.SELECT) + public ResultBean rosterFaceMatch(@RequestBody AttendanceFaceMatchDTO dto) { + return ResultBean.buildSuccess(attendanceRuleService.AttendanceFaceMatch(dto)); + } + +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/excel/BssidExcelListener.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/excel/BssidExcelListener.java new file mode 100644 index 0000000..972f8b2 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/excel/BssidExcelListener.java @@ -0,0 +1,93 @@ +package com.yida.data.attendance.excel; + +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; +import com.alibaba.fastjson.JSON; +import com.yida.data.attendance.dto.BssidImportDTO; +import com.yida.data.attendance.service.AttendanceRuleWifiService; +import com.yida.data.common.core.entity.CurrentUser; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRule; +import com.yida.data.school.dto.smart.GuideRosterErrorExportDTO; +import com.yida.data.school.dto.smart.GuideRosterImportDTO; +import java.util.List; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.ehcache.impl.internal.concurrent.ConcurrentHashMap; + + +@Slf4j +@RequiredArgsConstructor +public class BssidExcelListener extends AnalysisEventListener { + + private final AttendanceRuleWifiService attendanceRuleWifiService; + + /** + * 当前导入数据唯一标识 + */ + private final Long ruleId; + + /** + * 每次存储条数 每隔5条存储数据库, 实际使用中可以3000条, 然后清理list, 方便内存回收 + */ + private static final int BATCH_COUNT = 3000; + + /** + * 需要保存的数据集合 + */ + ConcurrentHashMap concurrentHashMap = new ConcurrentHashMap<>(); + + /** + * excel总数量 + */ + private static Integer totalCount = 0; + + /** + * 处理次数 + */ + private static Integer handleNumber = 0; + + /** + * 解析成功一条数据调用一次 + */ + @Override + public void invoke(BssidImportDTO dto, AnalysisContext analysisContext) { + totalCount = analysisContext.readSheetHolder().getApproximateTotalRowNumber() - 1; + // 获取读取的第几条数据 + Integer i = analysisContext.readRowHolder().getRowIndex(); + log.info("解析到第: {}条数据: {}", i, JSON.toJSONString(dto)); + concurrentHashMap.put(i, dto); + // 达到BATCH_COUNT了, 需要去存储一次数据库, 防止数据几万条数据在内存, 容易OOM + if (concurrentHashMap.size() >= BATCH_COUNT) { + handleNumber += 1; + saveData(); + // 存储完成清理集合 + concurrentHashMap.clear(); + } + } + + /** + * 所有数据解析完成调用 + * + * @param analysisContext analysisContext类 + * @author ZYJ + * @date 2021/8/23 16:18 + */ + @Override + public void doAfterAllAnalysed(AnalysisContext analysisContext) { + // 这里也要保存数据, 确保最后遗留的数据也存储到数据库 + saveData(); + + } + + /** + * 保存导入数据 + * + * @author ZYJ + * @date 2021/8/23 16:20 + */ + private void saveData() { + log.info("{}条数据,开始存储数据库!", concurrentHashMap.size()); + attendanceRuleWifiService.addBssidList(concurrentHashMap, ruleId); + log.info("存储数据库成功!"); + } +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/AttendanceRecordMapper.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/AttendanceRecordMapper.java new file mode 100644 index 0000000..df3e589 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/AttendanceRecordMapper.java @@ -0,0 +1,32 @@ +package com.yida.data.attendance.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yida.data.attendance.dto.PageAttendanceRecordDTO; +import com.yida.data.attendance.vo.AttendanceRuleVO; +import com.yida.data.common.core.entity.attendance.EduAttendanceRecord; +import com.yida.data.common.core.entity.attendance.EduAttendanceStaffRecord; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRecord; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; +import org.apache.ibatis.annotations.Param; + +/** + * 进出记录 Mapper + * + * @date 2023-08-09 11:37:25 + */ +public interface AttendanceRecordMapper extends BaseMapper { + + IPage listOldDataPage(@Param("page") Page page, @Param("schoolId") Long schoolId, @Param("startDateTime") + LocalDateTime startDateTime); + + IPage listStaffOldDataPage(@Param("page") Page page, @Param("schoolId") Long schoolId, + @Param("startDateTime") LocalDateTime startDateTime); + + + IPage listRecordPage(Page page, @Param("dto") PageAttendanceRecordDTO dto); + +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/AttendanceReportPushRecordMapper.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/AttendanceReportPushRecordMapper.java new file mode 100644 index 0000000..f30e320 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/AttendanceReportPushRecordMapper.java @@ -0,0 +1,10 @@ +package com.yida.data.attendance.mapper; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceReportPushRecord; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceReportStrategy; + +public interface AttendanceReportPushRecordMapper extends BaseMapper { + +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/AttendanceReportStrategyMapper.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/AttendanceReportStrategyMapper.java new file mode 100644 index 0000000..21f6644 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/AttendanceReportStrategyMapper.java @@ -0,0 +1,15 @@ +package com.yida.data.attendance.mapper; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceReportStrategy; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRuleWifi; + +/** + * 考勤推送策略关联wifi Mapper + * + * @date 2023-08-09 11:37:25 + */ +public interface AttendanceReportStrategyMapper extends BaseMapper { + +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/AttendanceResultMapper.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/AttendanceResultMapper.java new file mode 100644 index 0000000..12d54e3 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/AttendanceResultMapper.java @@ -0,0 +1,44 @@ +package com.yida.data.attendance.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yida.data.attendance.dto.AttendanceCountPageDTO; +import com.yida.data.attendance.dto.ManageListUserDTO; +import com.yida.data.attendance.vo.AttdanceResultDetailVO; +import com.yida.data.attendance.vo.AttdanceResultTotalVO; +import com.yida.data.attendance.vo.AttdanceResultVO; +import com.yida.data.attendance.vo.AttendanceStatusByMonthVO; +import com.yida.data.attendance.vo.ManageListUserAttendanceDetailVO; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceResult; +import java.time.LocalDate; +import java.util.List; +import org.apache.ibatis.annotations.Param; + +/** + * 考勤-考勤结果 Mapper + * + * @date 2023-08-09 11:37:25 + */ +public interface AttendanceResultMapper extends BaseMapper { + + IPage listResultPage(@Param("page") Page page, @Param("dto") AttendanceCountPageDTO dto); + + List findAttandanceTotal(@Param("dto") AttendanceCountPageDTO dto); + + List listResultDetailPage(@Param("dto") AttendanceCountPageDTO dto); + + IPage listUserPage(@Param("page") Page page, @Param("dto") AttendanceCountPageDTO dto); + + List findAttendanceStatus(@Param("userType") Integer userType, + @Param("userIdList") List userIdList, + @Param("startDate") LocalDate startDate, + @Param("endDate") LocalDate endDate); + + IPage findManageListUserDetailVO(@Param("page") Page page, + @Param("dto") ManageListUserDTO dto); + + Integer findManageListUserDetailVOErrorNum(@Param("dto") ManageListUserDTO dto); + + +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/AttendanceRuleAddressMapper.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/AttendanceRuleAddressMapper.java new file mode 100644 index 0000000..b60fd5a --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/AttendanceRuleAddressMapper.java @@ -0,0 +1,13 @@ +package com.yida.data.attendance.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRuleAddress; + +/** + * 考勤规则关联地点 Mapper + * + * @date 2023-08-09 11:37:25 + */ +public interface AttendanceRuleAddressMapper extends BaseMapper { + +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/AttendanceRuleAdminMapper.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/AttendanceRuleAdminMapper.java new file mode 100644 index 0000000..21406a2 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/AttendanceRuleAdminMapper.java @@ -0,0 +1,15 @@ +package com.yida.data.attendance.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRuleAdmin; +import java.util.List; + +/** + * 考勤-规则管理员 Mapper + * + * @date 2023-08-09 11:37:25 + */ +public interface AttendanceRuleAdminMapper extends BaseMapper { + + List findList(AttendanceRuleAdmin admin); +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/AttendanceRuleDeviceMapper.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/AttendanceRuleDeviceMapper.java new file mode 100644 index 0000000..34f3782 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/AttendanceRuleDeviceMapper.java @@ -0,0 +1,14 @@ +package com.yida.data.attendance.mapper; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRuleDevice; + +/** + * 考勤规则关联设备表 Mapper + * + * @date 2023-08-09 11:37:25 + */ +public interface AttendanceRuleDeviceMapper extends BaseMapper { + +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/AttendanceRuleMapper.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/AttendanceRuleMapper.java new file mode 100644 index 0000000..337ee60 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/AttendanceRuleMapper.java @@ -0,0 +1,89 @@ +package com.yida.data.attendance.mapper; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yida.data.attendance.dto.AttendanceRuleAdminUserPageDTO; +import com.yida.data.attendance.dto.AttendanceRuleUserPageDTO; +import com.yida.data.attendance.vo.AttdanceResultVO; +import com.yida.data.attendance.vo.AttendanceRuleAdminUserVO; +import com.yida.data.attendance.vo.AttendanceRuleUserVO; +import com.yida.data.attendance.vo.AttendanceRuleVO; +import com.yida.data.attendance.vo.ConflictRuleVO; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRule; +import java.time.LocalDate; +import java.util.List; +import org.apache.ibatis.annotations.Param; + +/** + * 教职工考勤规则 Mapper + * + * @date 2023-08-09 11:37:25 + */ +public interface AttendanceRuleMapper extends BaseMapper { + + AttendanceRuleVO getRule(Long id); + + IPage listRulePage(Page page, + @Param("schoolId") Long schoolId, + @Param("ruleName") String ruleName, + @Param("type") Integer type, + @Param("userType") Integer userType, + @Param("status") Integer status); + + List listRule(@Param("schoolId") Long schoolId, + @Param("ruleName") String ruleName, + @Param("type") Integer type, + @Param("userType") Integer userType, + @Param("status") Integer status); + + IPage listRuleAttendanceUser(Page page, @Param("dto") AttendanceRuleUserPageDTO dto); + + IPage listRuleAttendanceAdminUser(Page page, @Param("dto") AttendanceRuleAdminUserPageDTO dto); + + List checkNormalRule(@Param("deptIds") List deptIds, + @Param("startDate") LocalDate startDate, + @Param("endDate") LocalDate endDate, + @Param("userType") Integer userType, + @Param("ruleId") Long ruleId, + @Param("week") String week); + + List findUserMatchRuleByDevice( + @Param("userType") Integer userType, + @Param("deptIdList") List deptIdList, + @Param("deviceSn") String deviceSn, + @Param("currentDate") LocalDate currentDate, + @Param("dayOfWeek") Integer dayOfWeek, + @Param("schoolId") Long schoolId); + + List findUserMatchRuleByWifi( + @Param("userType") Integer userType, + @Param("deptIdList") List deptIdList, + @Param("wifiName") String wifiName, + @Param("wifiBssid") String wifiBssid, + @Param("ip") String ip, + @Param("currentDate") LocalDate currentDate, + @Param("dayOfWeek") Integer dayOfWeek, + @Param("schoolId") Long schoolId); + + + List findUserMatchRuleByUserId( + @Param("userType") Integer userType, + @Param("userId") Long userId); + + + List findByUserDeptListAndUserType(@Param("deptIdList") List deptIdList, + @Param("userType") Integer userType, + @Param("schoolId") Long schoolId); + + List findByUserIdAndUserType(@Param("userId") Long userId, + @Param("userType") Integer userType); + + List findUserManageRuleList(@Param("userId") Long userId, @Param("userType") Integer userType); + + + List getSchoolIdList(); + +// List listByWifi(@Param("schoolId") Long schoolId); +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/AttendanceRuleObjMapper.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/AttendanceRuleObjMapper.java new file mode 100644 index 0000000..be68a7e --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/AttendanceRuleObjMapper.java @@ -0,0 +1,17 @@ +package com.yida.data.attendance.mapper; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRuleObj; +import java.util.List; +import org.apache.ibatis.annotations.Param; + +/** + * 规则适用部门 Mapper + * + * @date 2023-08-09 11:37:25 + */ +public interface AttendanceRuleObjMapper extends BaseMapper { + + List findList(@Param("deptId") Long deptId, @Param("ruleId") Long ruleId); +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/AttendanceRuleObjUserMapper.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/AttendanceRuleObjUserMapper.java new file mode 100644 index 0000000..82da80c --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/AttendanceRuleObjUserMapper.java @@ -0,0 +1,14 @@ +package com.yida.data.attendance.mapper; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRuleObjUser; + +/** + * 规则适用部门 Mapper + * + * @date 2023-08-09 11:37:25 + */ +public interface AttendanceRuleObjUserMapper extends BaseMapper { + +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/AttendanceRuleRemindMapper.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/AttendanceRuleRemindMapper.java new file mode 100644 index 0000000..42183c6 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/AttendanceRuleRemindMapper.java @@ -0,0 +1,14 @@ +package com.yida.data.attendance.mapper; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRuleRemind; + +/** + * 考勤-打卡提醒 Mapper + * + * @date 2023-08-09 11:37:25 + */ +public interface AttendanceRuleRemindMapper extends BaseMapper { + +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/AttendanceRuleSpecialDateMapper.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/AttendanceRuleSpecialDateMapper.java new file mode 100644 index 0000000..34aa9dc --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/AttendanceRuleSpecialDateMapper.java @@ -0,0 +1,14 @@ +package com.yida.data.attendance.mapper; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRuleSpecialDate; + +/** + * 考勤-特殊日期 Mapper + * + * @date 2023-08-09 11:37:25 + */ +public interface AttendanceRuleSpecialDateMapper extends BaseMapper { + +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/AttendanceRuleTimeMapper.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/AttendanceRuleTimeMapper.java new file mode 100644 index 0000000..099f621 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/AttendanceRuleTimeMapper.java @@ -0,0 +1,14 @@ +package com.yida.data.attendance.mapper; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRuleTime; + +/** + * 考勤-打卡时段 Mapper + * + * @date 2023-08-09 11:37:25 + */ +public interface AttendanceRuleTimeMapper extends BaseMapper { + +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/AttendanceRuleWhiteListMapper.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/AttendanceRuleWhiteListMapper.java new file mode 100644 index 0000000..fbbec3a --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/AttendanceRuleWhiteListMapper.java @@ -0,0 +1,14 @@ +package com.yida.data.attendance.mapper; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRuleWhiteList; + +/** + * 考勤-白名单 Mapper + * + * @date 2023-08-09 11:37:25 + */ +public interface AttendanceRuleWhiteListMapper extends BaseMapper { + +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/AttendanceRuleWifiMapper.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/AttendanceRuleWifiMapper.java new file mode 100644 index 0000000..703639e --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/AttendanceRuleWifiMapper.java @@ -0,0 +1,17 @@ +package com.yida.data.attendance.mapper; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRuleWifi; +import java.util.List; +import org.apache.ibatis.annotations.Param; + +/** + * 考勤规则关联wifi Mapper + * + * @date 2023-08-09 11:37:25 + */ +public interface AttendanceRuleWifiMapper extends BaseMapper { + + List listRuleWifi(@Param("ruleId") Long ruleId, @Param("bssid") String bssid); +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/EduAttendanceDeviceGroupMapper.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/EduAttendanceDeviceGroupMapper.java new file mode 100644 index 0000000..99823e0 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/EduAttendanceDeviceGroupMapper.java @@ -0,0 +1,28 @@ +package com.yida.data.attendance.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yida.data.attendance.vo.DeviceOrDeviceGroupVO; +import com.yida.data.common.core.entity.attendance.EduAttendanceDevice; +import com.yida.data.common.core.entity.attendance.EduAttendanceDeviceGroup; +import java.util.List; +import org.apache.ibatis.annotations.Param; + +/** + * 设备分组表 Mapper + * + * @author zhanghaijun + * @date 2021-06-16 15:27:11 + */ +public interface EduAttendanceDeviceGroupMapper extends BaseMapper { + + List listDeviceAndGroup(@Param("keyword") String keyword, + @Param("schoolId") Long schoolId); + + List listDeviceByGroup(@Param("groupIds") List groupIds); + + IPage selectGroup(Page page, + @Param("name") String name, + @Param("schoolIds") List schoolId); +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/EduAttendanceDeviceMapper.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/EduAttendanceDeviceMapper.java new file mode 100644 index 0000000..8ec802f --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/EduAttendanceDeviceMapper.java @@ -0,0 +1,47 @@ +package com.yida.data.attendance.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yida.data.attendance.dto.DevicePage; +import com.yida.data.attendance.vo.DeviceVO; +import com.yida.data.common.core.entity.attendance.EduAttendanceDevice; + +import java.util.List; +import java.util.Set; + +import org.apache.ibatis.annotations.Param; + +public interface EduAttendanceDeviceMapper extends BaseMapper { + + DevicePage listDevicePage(@Param("page") Page page, + @Param("schoolIds") List schoolIds, + @Param("number") String number, + @Param("scope") Integer scope, + @Param("type") Integer type, + @Param("state") Integer state); + + void updateDevice(@Param("operation") Integer operation, + @Param("type") String type, + @Param("aliveDeviceSn") Set aliveDeviceSn); + + /** + * 根据学校id和状态查询考勤设备数量统计 + * + * @param schoolIds 学校id集合 + * @param state 考勤设备状态 + * @return java.lang.Long + * @author ZYJ + * @date 2021/10/9 13:36 + */ + Long findDeviceNumber(@Param("schoolIds") List schoolIds, @Param("state") Integer state); + + /** + * 判断设备编号是否重复 + * + * @param device 设备信息 + * @return com.yida.data.common.core.entity.attendance.EduAttendanceDevice + * @author ZYJ + * @date 2023/10/23 15:02 + */ + EduAttendanceDevice checkSn(@Param("device") EduAttendanceDevice device); +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/EduDeviceGroupMapper.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/EduDeviceGroupMapper.java new file mode 100644 index 0000000..90b6953 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/EduDeviceGroupMapper.java @@ -0,0 +1,14 @@ +package com.yida.data.attendance.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.attendance.EduDeviceGroup; + +/** + * 设备对应分组关系表 Mapper + * + * @author zhanghaijun + * @date 2021-06-16 15:29:10 + */ +public interface EduDeviceGroupMapper extends BaseMapper { + +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/EduUserStrategyMapper.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/EduUserStrategyMapper.java new file mode 100644 index 0000000..9f9b900 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/mapper/EduUserStrategyMapper.java @@ -0,0 +1,14 @@ +package com.yida.data.attendance.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.attendance.EduUserStrategy; + +/** + * 人员策略信息 Mapper + * + * @author ZYJ + * @date 2023-11-07 11:40:58 + */ +public interface EduUserStrategyMapper extends BaseMapper { + +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/repository/ErrorRecordMsgRepository.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/repository/ErrorRecordMsgRepository.java new file mode 100644 index 0000000..215c644 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/repository/ErrorRecordMsgRepository.java @@ -0,0 +1,18 @@ +package com.yida.data.attendance.repository; + +import com.yida.data.common.core.entity.ErrorRecordMsg; +import com.yida.data.common.core.entity.ReceiveMsg; +import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; +import org.springframework.stereotype.Repository; + +/** + * 通行记录错误信息es处理Repository + * + * @author ZYJ + * @date 2023/11/1 16:00 + */ +@Repository +public interface ErrorRecordMsgRepository extends ElasticsearchRepository { + + +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/repository/ReceiveMsgRepository.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/repository/ReceiveMsgRepository.java new file mode 100644 index 0000000..ad22b53 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/repository/ReceiveMsgRepository.java @@ -0,0 +1,9 @@ +package com.yida.data.attendance.repository; + +import com.yida.data.common.core.entity.ReceiveMsg; +import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface ReceiveMsgRepository extends ElasticsearchRepository { +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceCheckInService.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceCheckInService.java new file mode 100644 index 0000000..f9bbab4 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceCheckInService.java @@ -0,0 +1,24 @@ +package com.yida.data.attendance.service; + +import com.yida.data.attendance.dto.AttendanceUserCheckInDTO; +import com.yida.data.attendance.dto.H5AttendanceRuleWifiDTO; +import com.yida.data.attendance.vo.AttendanceUserCheckInVO; +import com.yida.data.attendance.vo.AttendanceWifiVO; + +public interface AttendanceCheckInService { + + /** + * 查询用户当前时间的打卡规则 + * + * @param dto + * @return + */ + AttendanceWifiVO findByUserIdAndDateTime(H5AttendanceRuleWifiDTO dto); + + /** + * 用户打卡 + * + * @param dto + */ + AttendanceUserCheckInVO userCheckIn(AttendanceUserCheckInDTO dto); +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceRecordService.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceRecordService.java new file mode 100644 index 0000000..89144ba --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceRecordService.java @@ -0,0 +1,53 @@ +package com.yida.data.attendance.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.attendance.dto.AddAttendanceRecordDTO; +import com.yida.data.attendance.dto.AddAttendanceRuleTimeDTO; +import com.yida.data.attendance.dto.PageAttendanceRecordDTO; +import com.yida.data.attendance.dto.PageAttendanceRuleDTO; +import com.yida.data.attendance.vo.AttendanceRuleVO; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRecord; +import java.time.LocalDateTime; +import java.util.List; +import org.springframework.scheduling.annotation.Async; + +/** + * 进出记录 Service接口 + * + * @date 2023-08-09 11:37:25 + */ +public interface AttendanceRecordService extends IService { + + /** + * 生成考勤记录 + * + * @param dto + */ + AttendanceRecord addRecord(AddAttendanceRecordDTO dto); + + + /** + * 分页查询通行记录 + */ + IPage listRecordPage(PageAttendanceRecordDTO dto); + + + AddAttendanceRuleTimeDTO MatchAttendanceTime(List timeDTOList, LocalDateTime createTime, + Integer attendanceType, Long userId, Integer userType, Integer attendanceUserType); + + /** + * 通行记录导出 + * + * @param dto + */ + void downloadAttendanceRecord(PageAttendanceRecordDTO dto, String uuid); + + /** + * 同步老考勤系统数据 + * + * @param schoolId + */ + @Async + void resetOldData(Long schoolId, LocalDateTime startDateTime, Integer userType); +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceReportPushRecordService.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceReportPushRecordService.java new file mode 100644 index 0000000..e99a687 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceReportPushRecordService.java @@ -0,0 +1,8 @@ +package com.yida.data.attendance.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceReportPushRecord; + +public interface AttendanceReportPushRecordService extends IService { + +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceReportStrategyService.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceReportStrategyService.java new file mode 100644 index 0000000..ce52a89 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceReportStrategyService.java @@ -0,0 +1,22 @@ +package com.yida.data.attendance.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.attendance.dto.AddAttendanceReportStrategyDTO; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceReportStrategy; +import java.util.List; +import org.springframework.scheduling.annotation.Async; + +/** + * 考勤-考勤推送策略 Service接口 + * + * @date 2023-08-09 11:37:25 + */ +public interface AttendanceReportStrategyService extends IService { + + void saveStrategy(List dtoList); + + List getList(); + + @Async + void sendNotice(); +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceResultService.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceResultService.java new file mode 100644 index 0000000..ff440f2 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceResultService.java @@ -0,0 +1,205 @@ +package com.yida.data.attendance.service; + +import cn.hutool.json.JSONObject; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.attendance.dto.AttendanceCountPageDTO; +import com.yida.data.attendance.dto.AttendanceDayReportDTO; +import com.yida.data.attendance.dto.AttendanceResultByDayDTO; +import com.yida.data.attendance.dto.AttendanceResultByStartAndEndTimeDTO; +import com.yida.data.attendance.dto.AttendanceStatusByMonthDTO; +import com.yida.data.attendance.dto.ManageListUserDTO; +import com.yida.data.attendance.vo.AttdanceResultDetailVO; +import com.yida.data.attendance.vo.AttdanceResultTotalVO; +import com.yida.data.attendance.vo.AttdanceResultVO; +import com.yida.data.attendance.vo.AttendanceRuleVO; +import com.yida.data.attendance.vo.AttendanceStatusByMonthVO; +import com.yida.data.attendance.vo.DateStatusVO; +import com.yida.data.attendance.vo.DownLoadAttendanceResultVO; +import com.yida.data.attendance.vo.ManageListUserAttendanceDetailTotalVO; +import com.yida.data.attendance.vo.ManageListUserAttendanceDetailVO; +import com.yida.data.attendance.vo.ManageListUserVO; +import com.yida.data.attendance.vo.StaRecordCountVO; +import com.yida.data.attendance.vo.StaffIdentityVO; +import com.yida.data.attendance.vo.UserAttendanceResultByDayVO; +import com.yida.data.attendance.vo.UserAttendanceResultByTimeSlotVO; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRecord; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceResult; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRule; +import com.yida.data.user.vo.DownLoadPicVO; +import java.time.LocalDate; +import java.util.List; +import java.util.Map; +import org.springframework.scheduling.annotation.Async; +import org.springframework.web.bind.annotation.RequestParam; + +/** + * 考勤-考勤结果 Service接口 + * + * @date 2023-08-09 11:37:25 + */ +public interface AttendanceResultService extends IService { + + /** + * 计算保存考勤结果 + * + * @param record + */ + @Async + void addResult(AttendanceRecord record); + + /** + * 学生考勤-概况统计 + * + * @param dto + * @return + */ + IPage listResultPage(AttendanceCountPageDTO dto); + + AttdanceResultTotalVO total(AttendanceCountPageDTO dto); + + + void downLocalAttendanceResult(AttendanceCountPageDTO dto, String uuid); + + + /** + * 下载考勤日报 + * + * @param dto + * @param uuid + */ + void downLocalAttendanceDayReport(AttendanceDayReportDTO dto, String uuid); + + + /** + * 学生考勤-明细 + * + * @param dto + * @return + */ + IPage listResultDetailPage(AttendanceCountPageDTO dto); + + /** + * 获取当前月份用户考勤状态汇总--个人 + * + * @param dto + * @return + */ + List getUserAttendanceStatusByMonth(AttendanceStatusByMonthDTO dto); + + /** + * 获取某日用户考勤结果 + * + * @param attendanceResultByDayDTO + * @return + */ + List getUserAttendanceResultByDay(AttendanceResultByDayDTO attendanceResultByDayDTO); + + /** + * 获取某时间段内用户考勤结果统计 + * + * @param dto + * @return + */ + UserAttendanceResultByTimeSlotVO getUserAttendanceResultByTimeSlot(AttendanceResultByStartAndEndTimeDTO dto); + + + /** + * 查询管理员日历展示状态 + * + * @param dto + * @return + */ + List findTotalUserStatus(ManageListUserDTO dto); + + + /** + * 查询管理员管理考勤统计 + * + * @param dto + * @return + */ + List findManageListUserVO(ManageListUserDTO dto); + + /** + * 职工查看管理考勤明细 + * + * @param dto + * @return + */ + JSONObject findManageListUserDetailVO(ManageListUserDTO dto); + + + /** + * 职工查看管理考勤明细-汇总 + * + * @param dto + * @return + */ + ManageListUserAttendanceDetailTotalVO findManageListUserDetailTotalVO(ManageListUserDTO dto); + + /** + * 职工管理员获取部门树 + * + * @param userId + * @param searchUserType + * @return + */ + List findManageUserDeptTree(Long userId, Integer searchUserType); + + + /** + * 查询职工身份信息 + * + * @param staffId + * @return + */ + StaffIdentityVO findStaffIdentity(Long staffId); + + + /** + * 每日凌晨先初始化考勤结果 + */ + @Async + void initUserAttendance(); + + + /** + * 每日/每周/每月考勤数据 以便于下载 + */ + @Async + void initAttendanceReport(Long schoolId, LocalDate currentDate); + + + /** + * 发送迟到提醒 + * + * @param mode 0=推动至教职工,1=推送至学生家长 + * @param userType 0=职工,1=学生 + * @param ruleId + * @param ruleTimeId + * @param staffIds 推送职工ID集合 + * @param isManager 是否推送管理员1=是,0=否 + */ + void lateReport(Integer mode, Integer userType, Long ruleId, Long ruleTimeId, List staffIds, Integer isManager); + + + /** + * @param mode 0=推动至教职工,1=推送至学生家长 + * @param userType 0=职工,1=学生 + * @param ruleId + */ + void dayReport(Integer mode, Integer userType, Long ruleId); + + + /** + * 系统首页考勤概况统计 + * + * @param startDate + * @param endDate + * @param schoolIds + * @return + */ + StaRecordCountVO staRecordCount(LocalDate startDate, LocalDate endDate, List schoolIds); + +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceRuleAddressService.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceRuleAddressService.java new file mode 100644 index 0000000..57b2c73 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceRuleAddressService.java @@ -0,0 +1,12 @@ +package com.yida.data.attendance.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRuleAddress; + +/** +* 考勤规则关联地点 Service接口 +* +* @date 2023-08-09 11:37:25 +*/ +public interface AttendanceRuleAddressService extends IService { +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceRuleAdminService.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceRuleAdminService.java new file mode 100644 index 0000000..443f276 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceRuleAdminService.java @@ -0,0 +1,15 @@ +package com.yida.data.attendance.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRuleAdmin; +import java.util.List; + +/** + * 考勤-规则管理员 Service接口 + * + * @date 2023-08-09 11:37:25 + */ +public interface AttendanceRuleAdminService extends IService { + + List findList(AttendanceRuleAdmin admin); +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceRuleDeviceService.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceRuleDeviceService.java new file mode 100644 index 0000000..8376627 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceRuleDeviceService.java @@ -0,0 +1,13 @@ +package com.yida.data.attendance.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRuleDevice; + +/** + * 考勤规则关联设备表 Service接口 + * + * @date 2023-08-09 11:37:25 + */ +public interface AttendanceRuleDeviceService extends IService { + +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceRuleObjService.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceRuleObjService.java new file mode 100644 index 0000000..0c28aed --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceRuleObjService.java @@ -0,0 +1,15 @@ +package com.yida.data.attendance.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRuleObj; +import java.util.List; + +/** + * 规则适用部门 Service接口 + * + * @date 2023-08-09 11:37:25 + */ +public interface AttendanceRuleObjService extends IService { + + List findList(Long deptId, Long ruleId); +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceRuleObjUserService.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceRuleObjUserService.java new file mode 100644 index 0000000..93e05db --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceRuleObjUserService.java @@ -0,0 +1,18 @@ +package com.yida.data.attendance.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRuleObj; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRuleObjUser; +import java.util.List; +import org.springframework.scheduling.annotation.Async; + +/** + * 规则适用部门 Service接口 + * + * @date 2023-08-09 11:37:25 + */ +public interface AttendanceRuleObjUserService extends IService { + + @Async + void addRuleUser(List ruleObjList, Long schoolId, Integer ruleType); +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceRuleRemindService.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceRuleRemindService.java new file mode 100644 index 0000000..a475fbe --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceRuleRemindService.java @@ -0,0 +1,12 @@ +package com.yida.data.attendance.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRuleRemind; + +/** +* 考勤-打卡提醒 Service接口 +* +* @date 2023-08-09 11:37:25 +*/ +public interface AttendanceRuleRemindService extends IService { +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceRuleService.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceRuleService.java new file mode 100644 index 0000000..c1cd486 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceRuleService.java @@ -0,0 +1,156 @@ +package com.yida.data.attendance.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.attendance.dto.AddAttendanceRuleDTO; +import com.yida.data.attendance.dto.AttendanceRuleAdminUserAddDTO; +import com.yida.data.attendance.dto.AttendanceRuleAdminUserPageDTO; +import com.yida.data.attendance.dto.AttendanceRuleUserAddDTO; +import com.yida.data.attendance.dto.AttendanceRuleUserPageDTO; +import com.yida.data.attendance.dto.AttendanceStatusByMonthDTO; +import com.yida.data.attendance.dto.AttendanceUserCheckInDTO; +import com.yida.data.attendance.dto.H5AttendanceRuleWifiDTO; +import com.yida.data.attendance.dto.PageAttendanceRuleDTO; +import com.yida.data.attendance.dto.AttendanceFaceMatchDTO; +import com.yida.data.attendance.dto.UpdateAttendanceRuleStatusDTO; +import com.yida.data.attendance.vo.AttendanceRuleAdminUserVO; +import com.yida.data.attendance.vo.AttendanceRuleUserVO; +import com.yida.data.attendance.vo.AttendanceRuleVO; +import com.yida.data.attendance.vo.AttendanceStatusByMonthVO; +import com.yida.data.attendance.vo.AttendanceUserCheckInVO; +import com.yida.data.attendance.vo.AttendanceWifiVO; +import com.yida.data.attendance.vo.AttendanceFaceMatchVO; +import com.yida.data.attendance.vo.DayReportDataVO; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRule; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRuleAdmin; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRuleObj; +import java.time.LocalDate; +import java.util.List; +import org.springframework.scheduling.annotation.Async; + +/** + * 教职工考勤规则 Service接口 + * + * @date 2023-08-09 11:37:25 + */ +public interface AttendanceRuleService extends IService { + + /** + * 添加规则 + */ + void addAttendanceRule(AddAttendanceRuleDTO dto); + + + /** + * 获取规则详情 + * + * @param id + * @return + */ + AttendanceRuleVO getRule(Long id); + + + /** + * 删除规则 + * + * @return + */ + void deleteRule(List idList); + + + /** + * 分页查询规则 + */ + IPage listRulePage(PageAttendanceRuleDTO dto); + + /** + * 分页查询规则 + */ + List listRule(PageAttendanceRuleDTO dto); + + /** + * 分页查询打卡人员 + */ + IPage listRuleAttendanceUser(AttendanceRuleUserPageDTO dto); + + /** + * 删除打卡人员 + */ + void deleteRuleAttendanceUser(List ids); + + + /** + * add打卡人员 + */ + void addRuleAttendanceUser(AttendanceRuleUserAddDTO dto); + + + /** + * 变更规则启用状态 + * + * @param dto + */ + void updateRuleStatus(UpdateAttendanceRuleStatusDTO dto); + + + /** + * 查询用户匹配规则 + * + * @return + */ + AttendanceRuleVO findUserMatchRule(Integer userType, Long userId, String deviceSn, String wifiName, String wifiBssid, + LocalDate currentDate, Long schoolId); + + + /** + * 考勤人脸比对 + * + * @param dto + * @return + */ + AttendanceFaceMatchVO AttendanceFaceMatch(AttendanceFaceMatchDTO dto); + + + /** + * 查询用户对应考勤规则 + * + * @return + */ + List findByUserIdAndUserType(Long userId, Integer userType); + + /** + * 查询用户管理规则 + * + * @param userId + * @param searchUserType + * @return + */ + List findUserManageRuleList(Long userId, Integer searchUserType); + + /** + * 查询学校信息 + * + * @return + */ + List getSchoolIdList(); + + + /** + * 分页查询管理员人员 + */ + IPage listRuleAttendanceAdminUser(AttendanceRuleAdminUserPageDTO dto); + + + /** + * 增加管理人员 + */ + void addAttendanceAdminUser(AttendanceRuleAdminUserAddDTO dto); + + /** + * 删除管理人员 + */ + void deleteRuleAttendanceAdminUser(List ids); + + + List getDayReport(Long staffId, Integer userType, Long ruleId,String attendanceDateStr); +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceRuleSpecialDateService.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceRuleSpecialDateService.java new file mode 100644 index 0000000..2cb1328 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceRuleSpecialDateService.java @@ -0,0 +1,12 @@ +package com.yida.data.attendance.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRuleSpecialDate; + +/** +* 考勤-特殊日期 Service接口 +* +* @date 2023-08-09 11:37:25 +*/ +public interface AttendanceRuleSpecialDateService extends IService { +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceRuleTimeService.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceRuleTimeService.java new file mode 100644 index 0000000..98cf627 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceRuleTimeService.java @@ -0,0 +1,15 @@ +package com.yida.data.attendance.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.attendance.dto.AddAttendanceRuleTimeDTO; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRuleTime; + +/** +* 考勤-打卡时段 Service接口 +* +* @date 2023-08-09 11:37:25 +*/ +public interface AttendanceRuleTimeService extends IService { + + AddAttendanceRuleTimeDTO get(Long id); +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceRuleWhiteListService.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceRuleWhiteListService.java new file mode 100644 index 0000000..e073dcc --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceRuleWhiteListService.java @@ -0,0 +1,12 @@ +package com.yida.data.attendance.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRuleWhiteList; + +/** +* 考勤-白名单 Service接口 +* +* @date 2023-08-09 11:37:25 +*/ +public interface AttendanceRuleWhiteListService extends IService { +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceRuleWifiService.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceRuleWifiService.java new file mode 100644 index 0000000..0a26d4b --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/AttendanceRuleWifiService.java @@ -0,0 +1,28 @@ +package com.yida.data.attendance.service; + + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.attendance.dto.AttendanceUserCheckInDTO; +import com.yida.data.attendance.dto.BssidImportDTO; +import com.yida.data.attendance.dto.H5AttendanceRuleWifiDTO; +import com.yida.data.attendance.vo.AttendanceUserCheckInVO; +import com.yida.data.attendance.vo.AttendanceWifiVO; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRuleWifi; +import com.yida.data.school.dto.smart.GuideRosterImportDTO; +import java.util.List; +import org.ehcache.impl.internal.concurrent.ConcurrentHashMap; +import org.springframework.scheduling.annotation.Async; + +/** + * 考勤规则关联wifi Service接口 + * + * @date 2023-08-09 11:37:25 + */ +public interface AttendanceRuleWifiService extends IService { + + @Async + void ImportBssid(String fileUrl, Long ruleId); + + void addBssidList(ConcurrentHashMap concurrentHashMap, Long ruleId); + +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/EduAttendanceDeviceGroupService.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/EduAttendanceDeviceGroupService.java new file mode 100644 index 0000000..6f3cc48 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/EduAttendanceDeviceGroupService.java @@ -0,0 +1,61 @@ +package com.yida.data.attendance.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.attendance.vo.DeviceOrDeviceGroupVO; +import com.yida.data.common.core.entity.attendance.EduAttendanceDevice; +import com.yida.data.common.core.entity.attendance.EduAttendanceDeviceGroup; +import java.util.List; + + +/** + * 设备分组表 Service接口 + * + * @author zhanghaijun + * @date 2021-06-16 15:27:11 + */ +public interface EduAttendanceDeviceGroupService extends IService { + + /** + * 分页模糊查询分组 + * + * @param current + * @param size + * @return + */ + IPage selectGroup(String name, Long current, Long size, Long schoolId) throws NoSuchMethodException; + + /** + * 查询全部 + * + * @param + * @return + */ + List selectGroupAll(); + + /** + * 新增 + * + * @param eduAttendanceDeviceGroup + */ + void insertGroup(EduAttendanceDeviceGroup eduAttendanceDeviceGroup); + + /** + * 修改 + * + * @param eduAttendanceDeviceGroup + */ + void updateGroup(EduAttendanceDeviceGroup eduAttendanceDeviceGroup); + + /** + * 删除 + */ + void delGroup(Long id); + + List listDeviceAndDevice(String keyword, Long schoolId); + + /** + * 根据设备组id查询设备 + */ + List listDeviceByGroup(List groupIds); +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/EduAttendanceDeviceService.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/EduAttendanceDeviceService.java new file mode 100644 index 0000000..688890c --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/EduAttendanceDeviceService.java @@ -0,0 +1,103 @@ +package com.yida.data.attendance.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.attendance.dto.DevicePage; +import com.yida.data.attendance.dto.IssuedFaceDTO; +import com.yida.data.attendance.dto.RemoveFaceDTO; +import com.yida.data.attendance.vo.DeviceNumberVO; +import com.yida.data.attendance.vo.DeviceVO; +import com.yida.data.attendance.vo.OnlineCountVO; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.CurrentUser; +import com.yida.data.common.core.entity.attendance.EduAttendanceDevice; +import com.yida.data.common.core.entity.constant.FebsConstant; + +import java.util.List; + +import org.springframework.scheduling.annotation.Async; + +public interface EduAttendanceDeviceService extends IService { + + DevicePage listDevicePage(DevicePage page, String schoolName, String number, + Integer scope, Integer type, Integer state, CurrentUser currentUser); + + EduAttendanceDevice saveDevice(EduAttendanceDevice device); + + /** + * 批量开门 + * + * @param list + */ + + void openAllDoor(List list); + + /** + * 批量设置时间 + * + * @param list + */ + + void setAllTime(List list); + + /** + * 远程开门 + * + * @param id + */ + void openDoor(String id); + + /** + * 设置时间 + * + * @param id + */ + void setSysTime(String id); + + /** + * 下发人脸,异步调用 防止超时 + */ + @Async(FebsConstant.ASYNC_POOL) + void issuedFace(IssuedFaceDTO dto); + + /** + * 删除设备中的人脸 + */ + @Async(FebsConstant.ASYNC_POOL) + void removeFace(RemoveFaceDTO dto); + + /** + * 检测在线设备 + */ + void updateDeviceStatus(); + + /** + * 考勤设备数量统计 + * + * @return com.yida.data.common.core.common.ResultBean + * @author ZYJ + * @date 2021/10/8 17:14 + */ + ResultBean findDeviceNumber() throws NoSuchMethodException; + + /** + * 校时所有设备 + */ + @Async(FebsConstant.ASYNC_POOL) + void timingAllDevice(); + + /** + * 获取面板机状态分布 + * + * @return + */ + OnlineCountVO getOnlineDistrib(List schoolIds); + + /** + * 删除设备信息 + * + * @param ids 设备id集合 + * @author ZYJ + * @date 2023/10/23 15:34 + */ + void delDevice(List ids); +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/EduAttendanceStrategyService.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/EduAttendanceStrategyService.java new file mode 100644 index 0000000..0a6dc7d --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/EduAttendanceStrategyService.java @@ -0,0 +1,72 @@ +package com.yida.data.attendance.service; + +import com.yida.data.attendance.dto.AddLeaveRequestStrategyDTO; +import com.yida.data.common.core.entity.constant.FebsConstant; +import com.yida.data.common.core.entity.user.EduFaceGroupStrategy; +import org.springframework.scheduling.annotation.Async; + +/** + * 设备策略service + * + * @author ZYJ + * @date 2022/12/13 + */ +public interface EduAttendanceStrategyService { + + /** + * 保存策略并绑定人员信息 + * + * @param eduFaceGroupStrategy 策略信息 + * @author ZYJ + * @date 2022/12/13 10:59 + */ + @Async(FebsConstant.ASYNC_POOL) + void saveStrategyAndUser(EduFaceGroupStrategy eduFaceGroupStrategy); + + /** + * 删除策略 + * + * @param eduFaceGroupStrategy 策略信息 + * @author ZYJ + * @date 2022/12/21 15:59 + */ + void deleteStrategy(EduFaceGroupStrategy eduFaceGroupStrategy); + + /** + * 绑定对应的人员-策略信息 + * + * @param eduFaceGroupStrategy 策略信息 + * @author ZYJ + * @date 2022/12/22 16:32 + */ + void bindUserStrategy(EduFaceGroupStrategy eduFaceGroupStrategy); + + /** + * 解绑对应的人员-策略信息 + * + * @param eduFaceGroupStrategy 策略信息 + * @author ZYJ + * @date 2022/12/26 10:19 + */ + void unBindUserStrategy(EduFaceGroupStrategy eduFaceGroupStrategy); + + /** + * 删除并保存策略(包含人员信息) + * + * @param eduFaceGroupStrategy 策略信息 + * @author ZYJ + * @date 2023/1/9 15:35 + */ + @Async(FebsConstant.ASYNC_POOL) + void deleteAndSaveStrategy(EduFaceGroupStrategy eduFaceGroupStrategy); + + /** + * 添加请假类型短策略 + * + * @param dto 添加请假类型短策略请求类 + * @author ZYJ + * @date 2023/2/2 16:20 + */ + @Async(FebsConstant.ASYNC_POOL) + void addLeaveRequestStrategy(AddLeaveRequestStrategyDTO dto); +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/EduDeviceGroupService.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/EduDeviceGroupService.java new file mode 100644 index 0000000..f521df6 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/EduDeviceGroupService.java @@ -0,0 +1,23 @@ +package com.yida.data.attendance.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.attendance.EduDeviceGroup; +import java.util.List; + +/** + * 设备对应分组关系表 Service接口 + * + * @author zhanghaijun + * @date 2021-06-16 15:29:10 + */ +public interface EduDeviceGroupService extends IService { + + /** + * 批量分组 + * + * @param list + */ + void insertGroup(List list); + + +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/EduUserStrategyService.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/EduUserStrategyService.java new file mode 100644 index 0000000..1880eca --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/EduUserStrategyService.java @@ -0,0 +1,22 @@ +package com.yida.data.attendance.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.attendance.EduUserStrategy; + +/** + * 人员策略信息 Service接口 + * + * @author ZYJ + * @date 2023-11-07 11:40:58 + */ +public interface EduUserStrategyService extends IService { + + + /** + * 处理超时用户策略 + * + * @author ZYJ + * @date 2023/11/7 19:39 + */ + void checkOverTimeUserStrategy(); +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/ErrorRecordMsgService.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/ErrorRecordMsgService.java new file mode 100644 index 0000000..120c852 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/ErrorRecordMsgService.java @@ -0,0 +1,44 @@ +package com.yida.data.attendance.service; + +import com.yida.data.attendance.dto.ListErrorRecordDTO; +import com.yida.data.common.core.entity.ErrorRecordMsg; +import org.springframework.data.domain.Page; +import org.springframework.scheduling.annotation.Async; + +/** + * 通行记录错误信息es处理service + * + * @author ZYJ + * @date 2023/11/1 16:07 + */ +public interface ErrorRecordMsgService { + + /** + * 添加数据到es + * + * @param errorRecordMsg 通行记录错误信息 + * @author ZYJ + * @date 2023/11/1 16:12 + */ + @Async + void saveMsg(ErrorRecordMsg errorRecordMsg); + + /** + * 分页查询通行记录错误记录 + * + * @param dto 分页查询通行记录错误记录请求类 + * @return org.springframework.data.domain.Page + * @author ZYJ + * @date 2023/11/1 17:48 + */ + Page listErrorRecord(ListErrorRecordDTO dto); + + /** + * 批量删除通行记录错误记录 + * + * @param recordIds 记录ids + * @author ZYJ + * @date 2023/11/1 19:41 + */ + void batchDeleteErrorRecord(String[] recordIds); +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/NoticeService.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/NoticeService.java new file mode 100644 index 0000000..8bd4d8a --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/NoticeService.java @@ -0,0 +1,52 @@ +package com.yida.data.attendance.service; + + +import com.yida.data.attendance.dto.DayReportDataDTO; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRecord; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceResult; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRule; +import java.util.List; +import org.springframework.scheduling.annotation.Async; + +public interface NoticeService { + + /** + * 发送考勤进出通知 + * + * @param record + */ + @Async + void sendAttendanceNotice(AttendanceRecord record); + + /** + * 重新采集人脸通知 + * + * @param picUrl + * @param userId + * @param type + */ + void sendCollectFailNotice(String picUrl, Long userId, Integer type); + + + /** + * 向家长发送迟到提醒 + * + * @param result + */ + void sendLateNoticeToParent(AttendanceResult result); + + + /** + * 发送学生迟到报告给职工 + * + * @param + */ + @Async + void sendStudentAttendanceLateReportToStaff(List resultList, Long staffId, AttendanceRule rule, + Long lateMinute); + + + @Async + void sendAttendanceDayReportToStaff(Long staffId, List dtoList, AttendanceRule rule, Integer userType, + Boolean isLeader); +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceCheckInServiceImpl.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceCheckInServiceImpl.java new file mode 100644 index 0000000..4cb1300 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceCheckInServiceImpl.java @@ -0,0 +1,237 @@ +package com.yida.data.attendance.service.impl; + +import cc.mrbird.febs.common.redis.service.RedisService; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Snowflake; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.yida.data.attendance.dto.AddAttendanceRecordDTO; +import com.yida.data.attendance.dto.AddAttendanceRuleWifiDTO; +import com.yida.data.attendance.dto.AttendanceUserCheckInDTO; +import com.yida.data.attendance.dto.H5AttendanceRuleWifiDTO; +import com.yida.data.attendance.mapper.AttendanceRuleMapper; +import com.yida.data.attendance.service.AttendanceCheckInService; +import com.yida.data.attendance.service.AttendanceRecordService; +import com.yida.data.attendance.service.AttendanceResultService; +import com.yida.data.attendance.service.ErrorRecordMsgService; +import com.yida.data.attendance.vo.AttendanceRuleVO; +import com.yida.data.attendance.vo.AttendanceUserCheckInVO; +import com.yida.data.attendance.vo.AttendanceWifiVO; +import com.yida.data.common.core.entity.ErrorRecordMsg; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRecord; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceResult; +import com.yida.data.common.core.entity.constant.CachePrefixConstant; +import com.yida.data.common.core.entity.user.EduStaff; +import com.yida.data.common.core.entity.user.EduStudent; +import com.yida.data.common.core.enums.MsgChannel; +import com.yida.data.common.core.enums.RecordTypeEnum; +import com.yida.data.common.core.enums.UserTypeEnum; +import com.yida.data.common.core.enums.attendance.AttendanceModeTypeEnum; +import com.yida.data.common.core.enums.attendance.AttendanceResultEnum; +import com.yida.data.common.core.enums.attendance.AttendanceWifiStatusEnum; +import com.yida.data.common.core.exception.FebsException; +import com.yida.data.common.service.CommonService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * WIFI打卡service + * + * @author ZYJ + * @date 2023/11/1 16:44 + */ +@Slf4j +@Service +@RequiredArgsConstructor +@Transactional(propagation = Propagation.SUPPORTS) +public class AttendanceCheckInServiceImpl implements AttendanceCheckInService { + + private final RedisService redisService; + private final CommonService commonService; + + private final AttendanceRecordService attendanceRecordService; + private final AttendanceResultService attendanceResultService; + private final AttendanceRuleMapper attendanceRuleMapper; + + @Override + public AttendanceWifiVO findByUserIdAndDateTime(H5AttendanceRuleWifiDTO dto) { + AttendanceWifiVO vo = new AttendanceWifiVO(); + AttendanceRuleVO attendanceRuleVO = new AttendanceRuleVO(); + //查询学校是否开启会员使用WiFi打卡 +// Boolean isWifiOpen = remoteEduSchoolFuncationConfigService +// .checkSchoolFunctionCode(dto.getSchoolId(), FunctionConfigCode.ATTENDANCE_WIFI.getCode()).getData(); +// if (isWifiOpen) { +// //查询会员 +// if (!remoteStudentApplyService.hasApply(dto.getUserId(), FunctionConfigCode.ATTENDANCE_WIFI.getCode()).getData()) { +// vo.setStatus(AttendanceWifiStatusEnum.NON_MEMBER.getValue()); +// return vo; +// } +// } + + List ruleVOList = new ArrayList<>(); + + //缓存用户匹配的考勤规则 + if (redisService.hHasKey(CachePrefixConstant.ATTENDANCE_STUDENT_RULE, String.valueOf(dto.getUserId()))) { + String ruleVOListStr = (String) redisService + .hget(CachePrefixConstant.ATTENDANCE_STUDENT_RULE, String.valueOf(dto.getUserId())); + ruleVOList = JSONUtil.toList(ruleVOListStr, AttendanceRuleVO.class); + } else { + Long userId = dto.getUserId(); + if (UserTypeEnum.STAFF_USER_TYPE.getType().equals(dto.getUserType())) { + //教职工 + EduStaff staff = commonService.getStaffById(userId); + if (Objects.isNull(staff)) { + log.error("职工不存在,id:[{}]", userId); + throw new FebsException("职工信息不存在:【{" + userId + "}】"); + } + } else { + EduStudent student = commonService.getStudentById(userId); + if (ObjectUtil.isNull(student)) { + log.error("学生信息不存在,id:[{}]", userId); + throw new FebsException("学生信息不存在:【{" + userId + "}】"); + } + //用户匹配规则 + ruleVOList = attendanceRuleMapper + .findUserMatchRuleByUserId(dto.getUserType(), dto.getUserId()); + if (CollUtil.isNotEmpty(ruleVOList)) { + redisService + .hset(CachePrefixConstant.ATTENDANCE_STUDENT_RULE, String.valueOf(dto.getUserId()), + JSONUtil.toJsonStr(ruleVOList)); + } + } + } + + //wifi匹配的规则 + List matchList = new ArrayList<>(); + + if (CollUtil.isEmpty(ruleVOList)) { + vo.setStatus(AttendanceWifiStatusEnum.RULE_NO.getValue()); + return vo; + } else { + //查询所有WiFi打卡的规则 + //匹配对应的考勤规则 根据BSSID判断 + for (AttendanceRuleVO ruleVO : ruleVOList) { + boolean contains = ruleVO.getWifiDTOList().stream().map(AddAttendanceRuleWifiDTO::getWifiBssid) + .collect(Collectors.toList()).contains(dto.getWifiBssid()); + if (contains) { + matchList.add(ruleVO); + } + } + } + + if (CollUtil.isEmpty(matchList)) { + vo.setStatus(AttendanceWifiStatusEnum.RANGE_OUT.getValue()); + return vo; + } else { + for (AttendanceRuleVO ruleVO : matchList) { + if (ruleVO.getWeek().contains(String.valueOf(dto.getCurrentDateTime().getDayOfWeek().getValue()))) { + attendanceRuleVO = ruleVO; + Map> wifiMap = ruleVO.getWifiDTOList().stream() + .collect(Collectors.groupingBy(AddAttendanceRuleWifiDTO::getWifiBssid)); + vo.setWifiName(wifiMap.get(dto.getWifiBssid()).get(0).getWifiName()); + break; + } + } + } + + if (ObjectUtil.isNull(attendanceRuleVO)) { + vo.setStatus(AttendanceWifiStatusEnum.REST.getValue()); + return vo; + } else { + vo.setRuleType(attendanceRuleVO.getType()); + vo.setRuleId(attendanceRuleVO.getId()); + vo.setRuleName(attendanceRuleVO.getName()); + vo.setRuleFaceTake(attendanceRuleVO.getFaceTake()); + //默认一个考勤时段 + vo.setRuleTimeId(attendanceRuleVO.getTimeDTOList().get(0).getId()); + vo.setStartTime(attendanceRuleVO.getTimeDTOList().get(0).getStartTime()); + vo.setEndTime(attendanceRuleVO.getTimeDTOList().get(0).getEndTime()); + + //判断是否在打卡时段 + if (LocalTime.now().isBefore(attendanceRuleVO.getTimeDTOList().get(0).getStartEffectiveStartTime()) || LocalTime.now() + .isAfter(attendanceRuleVO.getTimeDTOList().get(0).getEndEffectiveEndTime())) { + vo.setStatus(AttendanceWifiStatusEnum.TIME_OUT.getValue()); + } else { + AttendanceResult result = attendanceResultService.getOne(Wrappers.lambdaQuery(new AttendanceResult()) + .eq(AttendanceResult::getRuleId, attendanceRuleVO.getId()) + .eq(AttendanceResult::getRuleTimeId, attendanceRuleVO.getTimeDTOList().get(0).getId()) + .eq(AttendanceResult::getUserId, dto.getUserId()) + .eq(AttendanceResult::getAttendanceDate, dto.getCurrentDateTime().toLocalDate())); + + if (ObjectUtil.isNotNull(result)) { + vo.setStartRealTime(result.getStartRealTime()); + vo.setStartStatus(result.getStartStatus()); + vo.setEndRealTime(result.getEndRealTime()); + vo.setEndStatus(result.getEndStatus()); + vo.setStartImg(result.getStartPicUrl()); + vo.setEndImg(result.getEndPicUrl()); + } + //判断是上班还是下班打卡 + if (ObjectUtil.equals(AttendanceModeTypeEnum.FREE.getValue(), attendanceRuleVO.getType())) { + //自由打卡 + vo.setStatus(AttendanceWifiStatusEnum.WORK_ON.getValue()); + } else { + if (dto.getCurrentDateTime().toLocalTime() + .isAfter(attendanceRuleVO.getTimeDTOList().get(0).getStartEffectiveStartTime()) && dto + .getCurrentDateTime().toLocalTime() + .isBefore(attendanceRuleVO.getTimeDTOList().get(0).getStartEffectiveEndTime())) { + if (ObjectUtil.isNotNull(result) && ObjectUtil.isNotNull(result.getStartStatus())) { + vo.setStatus(AttendanceWifiStatusEnum.WORK_OFF.getValue()); + } else { + vo.setStatus(AttendanceWifiStatusEnum.WORK_ON.getValue()); + } + } else if (dto.getCurrentDateTime().toLocalTime() + .isAfter(attendanceRuleVO.getTimeDTOList().get(0).getEndEffectiveStartTime())) { + vo.setStatus(AttendanceWifiStatusEnum.WORK_OFF.getValue()); + } + } + } + } + return vo; + } + + @Override + public AttendanceUserCheckInVO userCheckIn(AttendanceUserCheckInDTO dto) { + AddAttendanceRecordDTO param = new AddAttendanceRecordDTO(); + param.setUserId(dto.getUserId()); + param.setUserType(dto.getUserType()); + param.setSchoolId(dto.getSchoolId()); + param.setWifiBssid(dto.getWifiBssid()); + param.setCreateTime(dto.getCurrentDateTime()); + param.setPicUrl(dto.getAvatar()); + param.setRuleId(dto.getRuleId()); + param.setRuleTimeId(dto.getRuleTimeId()); + AttendanceRecord record = attendanceRecordService.addRecord(param); + AttendanceUserCheckInVO vo = new AttendanceUserCheckInVO(); + if (record.getRuleTimeType() == 0) { + //上班打卡 + if (record.getStatus().equals(AttendanceResultEnum.ABNORMAL.getValue())) { + vo.setStatus(AttendanceResultEnum.LATE.getValue()); + } else { + vo.setStatus(record.getStatus()); + } + } else { + //下班打卡 + if (record.getStatus().equals(AttendanceResultEnum.ABNORMAL.getValue())) { + vo.setStatus(AttendanceResultEnum.LEAVE.getValue()); + } else { + vo.setStatus(AttendanceResultEnum.NORMAL.getValue()); + } + } + vo.setCheckInDateTime(dto.getCurrentDateTime()); + vo.setAvatar(dto.getAvatar()); + return vo; + } +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceRecordServiceImpl.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceRecordServiceImpl.java new file mode 100644 index 0000000..b7f0986 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceRecordServiceImpl.java @@ -0,0 +1,654 @@ +package com.yida.data.attendance.service.impl; + +import cc.mrbird.febs.common.redis.service.RedisService; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.LocalDateTimeUtil; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.support.ExcelTypeEnum; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.attendance.dto.AddAttendanceRecordDTO; +import com.yida.data.attendance.dto.AddAttendanceRuleTimeDTO; +import com.yida.data.attendance.dto.PageAttendanceRecordDTO; +import com.yida.data.attendance.dto.RemoveFaceDTO; +import com.yida.data.attendance.mapper.AttendanceRecordMapper; +import com.yida.data.attendance.mapper.AttendanceRuleWifiMapper; +import com.yida.data.attendance.service.*; +import com.yida.data.attendance.vo.AttendanceRecordExcelVO; +import com.yida.data.attendance.vo.AttendanceRuleVO; +import com.yida.data.attendance.vo.DownLoadAttendanceResultVO; +import com.yida.data.attendance.vo.StudentDormAttendanceResultExcelVO; +import com.yida.data.common.core.entity.CurrentUser; +import com.yida.data.common.core.entity.attendance.EduAttendanceDevice; +import com.yida.data.common.core.entity.attendance.EduAttendanceRecord; +import com.yida.data.common.core.entity.attendance.EduAttendanceStaffRecord; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRecord; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceResult; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRuleAddress; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRuleWifi; +import com.yida.data.common.core.entity.constant.CachePrefixConstant; +import com.yida.data.common.core.entity.system.enums.RoleEnum; +import com.yida.data.common.core.entity.user.EduStaff; +import com.yida.data.common.core.entity.user.EduStudent; +import com.yida.data.common.core.enums.MsgChannel; +import com.yida.data.common.core.enums.UserTypeEnum; +import com.yida.data.common.core.enums.attendance.AttendanceModeTypeEnum; +import com.yida.data.common.core.enums.attendance.AttendanceNextDayEnum; +import com.yida.data.common.core.enums.attendance.AttendanceResultEnum; +import com.yida.data.common.core.enums.attendance.AttendanceTypeEnum; +import com.yida.data.common.core.enums.attendance.AttendanceUserTypeEnum; +import com.yida.data.common.core.utils.FebsUtil; +import com.yida.data.common.core.utils.FileUtil; +import com.yida.data.common.service.CommonService; +import com.yida.data.user.dto.ListStudentDTO; +import com.yida.data.user.feign.RemoteStaffService; +import com.yida.data.user.feign.RemoteStudentService; + +import java.io.File; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import java.util.stream.Collectors; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.regexp.RE; +import org.apache.tomcat.jni.User; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.ApplicationContext; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StopWatch; + +/** + * 进出记录 Service实现 + * + * @date 2023-08-09 11:37:25 + */ +@Slf4j +@Service +@RequiredArgsConstructor +@Transactional(propagation = Propagation.SUPPORTS, readOnly = true) +public class AttendanceRecordServiceImpl extends ServiceImpl + implements AttendanceRecordService { + + private final RedisService redisService; + private final AttendanceRuleService attendanceRuleService; + private final EduAttendanceDeviceService eduAttendanceDeviceService; + private final RemoteStudentService remoteStudentService; + private final AttendanceRuleWifiMapper attendanceRuleWifiMapper; + private final AttendanceRuleAddressService attendanceRuleAddressService; + private final AttendanceResultService attendanceResultService; + private final AttendanceRuleTimeService attendanceRuleTimeService; + private final CommonService commonService; + private final NoticeService noticeService; + private final ErrorRecordMsgService errorRecordMsgService; + private final RemoteStaffService remoteStaffService; + @Value("${febs.uploadUrl}") + private String uploadUrl; + + @Autowired + ApplicationContext applicationContext; + + @Override + @Transactional(rollbackFor = Exception.class) + public AttendanceRecord addRecord(AddAttendanceRecordDTO dto) { + AttendanceRecord erecord = getOne(Wrappers.lambdaQuery(new AttendanceRecord()) + .eq(AttendanceRecord::getUserId, dto.getUserId()) + .eq(AttendanceRecord::getUserType, dto.getUserType()) + .eq(AttendanceRecord::getCreateTime, dto.getCreateTime())); + if (ObjectUtil.isNotNull(erecord)) { + log.error("用户:{},类型:{},通行时间数据:{}已存在,不加入数据库", dto.getUserType(), dto.getUserId(), dto.getCreateTime()); + return null; + } + + LocalTime now = dto.getCreateTime().toLocalTime(); + AttendanceRecord record = new AttendanceRecord(); + BeanUtils.copyProperties(dto, record); + EduStaff staff = null; + EduStudent student = null; + EduAttendanceDevice device = null; + //查设备 + if (ObjectUtil.isNotEmpty(dto.getDeviceSn())) { + device = (EduAttendanceDevice) redisService + .hget(CachePrefixConstant.DEVICE_DATA, dto.getDeviceSn()); + if (ObjectUtil.isNull(device)) { + device = eduAttendanceDeviceService.getOne(Wrappers.lambdaQuery(new EduAttendanceDevice()) + .eq(EduAttendanceDevice::getSn, dto.getDeviceSn())); + } + if (ObjectUtil.isNull(device)) { + return null; + } else { + redisService.hset(CachePrefixConstant.DEVICE_DATA, dto.getDeviceSn(), device); + } + } + + //判断记录数据是否已存在 +// if (ObjectUtil.isNotNull(dto.getOriginalRecordId())) { +// if (MsgChannel.MQTT.equals(dto.getMsgChannel())) { +// AttendanceRecord erecord = getOne(Wrappers.lambdaQuery(new AttendanceRecord()) +// .eq(AttendanceRecord::getOriginalRecordId, dto.getOriginalRecordId()) +// .eq(AttendanceRecord::getDeviceId,device.getId())); +// if (ObjectUtil.isNotNull(erecord)) { +// log.error("通行数据:【{}】已存在,不加入数据库", dto.getOriginalRecordId()); +// return null; +// } +// } +// } + + if (ObjectUtil.equals(AttendanceUserTypeEnum.STAFF.getValue(), dto.getUserType())) { + staff = commonService.getStaffById(dto.getUserId()); + if (ObjectUtil.isNull(staff)) { + //反向删除人脸机数据 + if (!MsgChannel.ACTIVE.equals(dto.getMsgChannel()) && ObjectUtil.isNotNull(device)) { + log.error("教职工{}数据为空,删除面板机{}消息", dto.getUserId(), device.getId()); + RemoveFaceDTO removeFaceDTO = new RemoveFaceDTO(); + removeFaceDTO + .setDeviceFactoryUserId( + Collections.singletonList(dto.getUserId() + "1")); + removeFaceDTO.setDeviceList(Collections.singletonList(device.getId())); + eduAttendanceDeviceService.removeFace(removeFaceDTO); + } + return null; + } + } else { + student = commonService.getStudentById(dto.getUserId()); + if (ObjectUtil.isNull(student)) { + //反向删除人脸机数据t + if (!MsgChannel.ACTIVE.equals(dto.getMsgChannel()) && ObjectUtil.isNotNull(device)) { + log.error("学生{}数据为空,删除面板机{}消息", dto.getUserId(), device.getId()); + RemoveFaceDTO removeFaceDTO = new RemoveFaceDTO(); + removeFaceDTO + .setDeviceFactoryUserId( + Collections.singletonList(dto.getUserId() + "0")); + removeFaceDTO.setDeviceList(Collections.singletonList(device.getId())); + eduAttendanceDeviceService.removeFace(removeFaceDTO); + } + return null; + } + } + + //查看匹配的考勤规则 + AttendanceRuleVO userMatchRule = new AttendanceRuleVO(); + if (ObjectUtil.isNotEmpty(dto.getRuleId())) { + userMatchRule = (AttendanceRuleVO) redisService + .hget(CachePrefixConstant.ATTENDANCE_RULE_DATA, String.valueOf(dto.getRuleId())); + if (ObjectUtil.isNull(userMatchRule)) { + userMatchRule = attendanceRuleService.getRule(dto.getRuleId()); + if (ObjectUtil.isNotNull(userMatchRule)) { + redisService.hset(CachePrefixConstant.ATTENDANCE_RULE_DATA, String.valueOf(dto.getRuleId()), userMatchRule); + } + } + } else { + userMatchRule = attendanceRuleService + .findUserMatchRule(dto.getUserType(), dto.getUserId(), dto.getDeviceSn(), dto.getWifiName(), dto.getWifiBssid(), + dto.getCreateTime().toLocalDate(), dto.getSchoolId()); + } + + if (ObjectUtil.isNotNull(userMatchRule)) { + //匹配考勤时段 + AddAttendanceRuleTimeDTO addAttendanceRuleTimeDTO = new AddAttendanceRuleTimeDTO(); + if (ObjectUtil.isNotEmpty(dto.getRuleTimeId())) { +// addAttendanceRuleTimeDTO = attendanceRuleTimeService.get(dto.getRuleTimeId()); + addAttendanceRuleTimeDTO = userMatchRule.getTimeDTOList().stream().filter(t -> t.getId() + .equals(dto.getRuleTimeId())) + .collect(Collectors.toList()).get(0); + } else { + addAttendanceRuleTimeDTO = MatchAttendanceTime(userMatchRule.getTimeDTOList(), + dto.getCreateTime(), userMatchRule.getType(), dto.getUserId(), dto.getUserType(), + userMatchRule.getUserType()); + } + + record.setRuleId(userMatchRule.getId()); + if (ObjectUtil.isNotNull(addAttendanceRuleTimeDTO)) { + record.setRuleTimeId(addAttendanceRuleTimeDTO.getId()); + if (ObjectUtil.equals(AttendanceModeTypeEnum.FREE.getValue(), userMatchRule.getType())) { + if (ObjectUtil.equals(AttendanceUserTypeEnum.STUDENT_TO_DORM.getValue(), userMatchRule.getUserType())) { + //宿舍考勤 + if (dto.getCreateTime().toLocalTime().isAfter(addAttendanceRuleTimeDTO.getStartTime()) && + dto.getCreateTime().toLocalTime().isBefore(addAttendanceRuleTimeDTO.getEndTime())) { + record.setStatus(AttendanceResultEnum.NORMAL.getValue()); + } else if (dto.getCreateTime().toLocalTime().isAfter(addAttendanceRuleTimeDTO.getEndTime()) && + dto.getCreateTime().toLocalTime().isBefore(addAttendanceRuleTimeDTO.getLastTime())) { + record.setStatus(AttendanceResultEnum.LATE_DORM.getValue()); + } else if (dto.getCreateTime().toLocalTime().isAfter(addAttendanceRuleTimeDTO.getLastTime()) && + dto.getCreateTime().toLocalTime().isBefore(addAttendanceRuleTimeDTO.getEndEffectiveEndTime())) { + record.setStatus(AttendanceResultEnum.AB_LATE_DORM.getValue()); + } else { + record.setStatus(AttendanceResultEnum.ABNORMAL.getValue()); + } + } else { + if (dto.getCreateTime().toLocalTime().isAfter(addAttendanceRuleTimeDTO.getStartTime()) && + dto.getCreateTime().toLocalTime().isBefore(addAttendanceRuleTimeDTO.getEndTime())) { + record.setStatus(AttendanceResultEnum.NORMAL.getValue()); + } else { + record.setStatus(AttendanceResultEnum.ABNORMAL.getValue()); + } + } + record.setRuleTimeType(AttendanceTypeEnum.WORK_ON.getValue()); + record.setStiTime(addAttendanceRuleTimeDTO.getStartTime()); + } else { + //固定时间段打卡模式 + //判断是上班打卡还是下班打卡 + if (now.isAfter(addAttendanceRuleTimeDTO.getStartEffectiveStartTime()) && now + .isBefore(addAttendanceRuleTimeDTO.getStartEffectiveEndTime())) { + //在上班打卡时间段,并且上班未打卡,表示此次打卡未 + List recordList = this.list(Wrappers.lambdaQuery(new AttendanceRecord()) + .eq(AttendanceRecord::getUserId, dto.getUserId()) + .eq(AttendanceRecord::getRuleId, userMatchRule.getId()) + .eq(AttendanceRecord::getRuleTimeId, addAttendanceRuleTimeDTO.getId()) + .eq(AttendanceRecord::getRuleTimeType, 0)); + if (CollUtil.isNotEmpty(recordList)) { + record.setStiTime(addAttendanceRuleTimeDTO.getEndTime()); + record.setRuleTimeType(AttendanceTypeEnum.WORK_OFF.getValue()); + //下班打卡,计算考勤结果 + if (now.isBefore(addAttendanceRuleTimeDTO.getEndTime())) { + record.setStatus(AttendanceResultEnum.ABNORMAL.getValue()); + } else { + record.setStatus(AttendanceResultEnum.NORMAL.getValue()); + } + } else { + record.setStiTime(addAttendanceRuleTimeDTO.getStartTime()); + record.setRuleTimeType(AttendanceTypeEnum.WORK_ON.getValue()); + //上班打卡,计算考勤结果 + if (now.isBefore(addAttendanceRuleTimeDTO.getStartTime())) { + record.setStatus(AttendanceResultEnum.NORMAL.getValue()); + } else { + record.setStatus(AttendanceResultEnum.ABNORMAL.getValue()); + } + } + } else if (now.isAfter(addAttendanceRuleTimeDTO.getEndEffectiveStartTime())) { + record.setRuleTimeType(AttendanceTypeEnum.WORK_OFF.getValue()); + LocalDateTime endDateTime = null; + //大于下班 开始打卡时间 + record.setStiTime(addAttendanceRuleTimeDTO.getEndTime()); + if (dto.getCreateTime() + .isAfter(dto.getCreateTime().toLocalDate().atTime(addAttendanceRuleTimeDTO.getEndTime())) && + dto.getCreateTime().isBefore( + dto.getCreateTime().toLocalDate().atTime(addAttendanceRuleTimeDTO.getEndEffectiveEndTime()))) { + //正常 + record.setStatus(AttendanceResultEnum.NORMAL.getValue()); + } else { + record.setStatus(AttendanceResultEnum.ABNORMAL.getValue()); + } + } + } + } + } + //增加辅助字段 + + if (ObjectUtil.isNotEmpty(dto.getPicUrl())) { + record.setPicUrl(dto.getPicUrl()); + } + if (ObjectUtil.isNotEmpty(dto.getDeviceSn())) { + if (ObjectUtil.isNotNull(device)) { + record.setScope(device.getZoneScope()); + record.setDeviceName(device.getName()); + record.setZone(device.getType()); + record.setDeviceId(device.getId()); + } + } + if (ObjectUtil.isNotEmpty(dto.getWifiId())) { + AttendanceRuleWifi wifi = attendanceRuleWifiMapper.selectById(dto.getWifiId()); + if (ObjectUtil.isNotNull(wifi)) { + record.setWifiName(wifi.getWifiName()); + } + } + + if (ObjectUtil.isNotEmpty(dto.getWifiBssid())) { + List wifiList = attendanceRuleWifiMapper.listRuleWifi(dto.getRuleId(), dto.getWifiBssid()); + AttendanceRuleWifi wifi = wifiList.get(0); + if (ObjectUtil.isNotNull(wifi)) { + record.setWifiName(wifi.getWifiName()); + record.setWifiId(wifi.getId()); + } + } + if (ObjectUtil.isNotEmpty(dto.getAddressId())) { + AttendanceRuleAddress address = attendanceRuleAddressService.getById(dto.getAddressId()); + if (ObjectUtil.isNotNull(address)) { + record.setAddressName(address.getAddressName()); + } + } + if (ObjectUtil.equals(AttendanceUserTypeEnum.STAFF.getValue(), dto.getUserType())) { + //TODO 教职工 辅助信息 + if (ObjectUtil.isNotNull(staff)) { + record.setSchoolId(staff.getSchoolId()); + if (CollUtil.isNotEmpty(staff.getStaffDept())) { + record.setCampusId(staff.getStaffDept().get(0).getId()); + record.setCampusName(staff.getStaffDept().get(0).getDeptName()); + } + record.setUserName(staff.getName()); + } + + } else if (ObjectUtil.equals(AttendanceUserTypeEnum.STUDENT_TO_SCHOOL.getValue(), dto.getUserType())) { + if (ObjectUtil.isNotNull(student)) { + record.setSchoolId(student.getSchoolId()); + record.setUserName(student.getStuName()); + record.setCampusId(student.getCampusId()); + record.setCampusName(student.getCampusName()); + record.setSectionId(student.getSectionId()); + record.setSectionName(student.getSectionName()); + record.setGradeId(student.getGradeId()); + record.setGradeName(student.getGradeName()); + record.setClassId(student.getClassId()); + record.setClassName(student.getClassName()); + } + } else { + if (ObjectUtil.isNotNull(student)) { + record.setUserName(student.getStuName()); + record.setCampusId(student.getCampusId()); + record.setCampusName(student.getCampusName()); + record.setSectionId(student.getSectionId()); + record.setSectionName(student.getSectionName()); + record.setGradeId(student.getGradeId()); + record.setGradeName(student.getGradeName()); + record.setClassId(student.getClassId()); + record.setClassName(student.getClassName()); + record.setDormId(student.getDormId()); + record.setDormName(student.getDormName()); + record.setDormRoomId(student.getDormRoomId()); + record.setDormRoomName(student.getDormRoomName()); + record.setSchoolId(student.getSchoolId()); + } + } + + //保存记录 + save(record); + //生成结果 + if (ObjectUtil.isNotEmpty(record.getStatus())) { + attendanceResultService.addResult(record); + } + //TODO 推送通行记录 + noticeService.sendAttendanceNotice(record); + + if (StrUtil.isNotBlank(dto.getEsRecordId())) { + errorRecordMsgService.batchDeleteErrorRecord(new String[]{dto.getEsRecordId()}); + } + return record; + } + + @Override + public IPage listRecordPage(PageAttendanceRecordDTO dto) { + // 先查询出人员 + List userIdList = new ArrayList<>(); + if (ObjectUtil.equals(UserTypeEnum.PARENT_USER_TYPE.getType(), dto.getUserType())) { + ListStudentDTO listStudentDTO = new ListStudentDTO(); + if (ObjectUtil.isNotNull(dto.getStudentName())) { + listStudentDTO.setStuName(dto.getStudentName()); + } + if (ObjectUtil.isNotNull(dto.getSectionId()) && ObjectUtil.isNull(dto.getClassId())) { + listStudentDTO.setSectionId(dto.getSectionId()); + } + if (ObjectUtil.isNotNull(listStudentDTO.getStuName()) || ObjectUtil.isNotNull(listStudentDTO.getSectionId())) { + userIdList = remoteStudentService.listStudent(listStudentDTO).getData().stream().map(EduStudent::getId).collect( + Collectors.toList()); + } + dto.setUserIdList(userIdList); + String rolePerms = FebsUtil.getCurrentUser().getRolePerms(); + //学校管理员 + if (rolePerms.contains(RoleEnum.ROLE_SCHOOL_PRINCIPAL.getValue())) { + dto.setSchoolId(FebsUtil.getTopDeptId()); + } else { + if (ObjectUtil.isNull(dto.getClassId())) { + dto.setClassIdList(remoteStaffService.listClassIdByStaffId().getData()); + } else { + dto.setClassIdList(Collections.singletonList(dto.getClassId())); + } + } + } + return baseMapper + .listRecordPage(dto.toPage(), dto); + } + + /** + * 匹配考勤时段 + * + * @param timeDTOList + * @param createTime 打卡时间 + * @return + */ + @Override + public AddAttendanceRuleTimeDTO MatchAttendanceTime(List timeDTOList, LocalDateTime createTime, + Integer attendanceType, Long userId, Integer userType, Integer attendanceUserType) { + //根据当前打卡时间与打卡时间段对应打卡时间。 + LocalDateTime now = createTime; + LocalDate nowDate = createTime.toLocalDate(); + if (ObjectUtil.equals(AttendanceModeTypeEnum.FREE.getValue(), attendanceType)) { + //自由打卡模式 + for (AddAttendanceRuleTimeDTO addAttendanceRuleTimeDTO : timeDTOList) { + if (now.toLocalTime().isAfter(addAttendanceRuleTimeDTO.getStartEffectiveStartTime()) && now.toLocalTime() + .isBefore(addAttendanceRuleTimeDTO.getEndEffectiveEndTime())) { + return addAttendanceRuleTimeDTO; + } + } + } else { + for (AddAttendanceRuleTimeDTO addAttendanceRuleTimeDTO : timeDTOList) { + + AttendanceResult result = attendanceResultService.getOne(Wrappers.lambdaQuery(new AttendanceResult()) + .eq(AttendanceResult::getRuleId, addAttendanceRuleTimeDTO.getRuleId()) + .eq(AttendanceResult::getRuleTimeId, addAttendanceRuleTimeDTO.getId()) + .eq(AttendanceResult::getUserId, userId) + .eq(AttendanceResult::getUserType, userType) + .eq(AttendanceResult::getAttendanceDate, createTime.toLocalDate())); + + if (ObjectUtil.isNotNull(result) && ObjectUtil.isNotNull(result.getStartStatus())) { + if (now.isAfter(nowDate.atTime(addAttendanceRuleTimeDTO.getEndEffectiveStartTime())) && now + .isBefore(nowDate.atTime(addAttendanceRuleTimeDTO.getEndEffectiveEndTime()))) { + return addAttendanceRuleTimeDTO; + } + } else { + if (now.isAfter(nowDate.atTime(addAttendanceRuleTimeDTO.getStartEffectiveStartTime())) && now + .isBefore(nowDate.atTime(addAttendanceRuleTimeDTO.getStartEffectiveEndTime()))) { + return addAttendanceRuleTimeDTO; + } + if (now.isAfter(nowDate.atTime(addAttendanceRuleTimeDTO.getEndEffectiveStartTime())) && now + .isBefore(nowDate.atTime(addAttendanceRuleTimeDTO.getEndEffectiveEndTime()))) { + return addAttendanceRuleTimeDTO; + } + } + } + } + return null; + } + + @Override + public void downloadAttendanceRecord(PageAttendanceRecordDTO dto, String uuid) { + // 先查询出人员 + List userIdList = new ArrayList<>(); + if (ObjectUtil.equals(UserTypeEnum.PARENT_USER_TYPE.getType(), dto.getUserType())) { + ListStudentDTO listStudentDTO = new ListStudentDTO(); + if (ObjectUtil.isNotNull(dto.getStudentName())) { + listStudentDTO.setStuName(dto.getStudentName()); + } + if (ObjectUtil.isNotNull(dto.getSectionId()) && ObjectUtil.isNull(dto.getClassId())) { + listStudentDTO.setSectionId(dto.getSectionId()); + } + if (ObjectUtil.isNotNull(listStudentDTO.getStuName()) || ObjectUtil.isNotNull(listStudentDTO.getSectionId())) { + userIdList = remoteStudentService.listStudent(listStudentDTO).getData().stream().map(EduStudent::getId).collect( + Collectors.toList()); + } + dto.setUserIdList(userIdList); + String rolePerms = FebsUtil.getCurrentUser().getRolePerms(); + //学校管理员 + if (rolePerms.contains(RoleEnum.ROLE_SCHOOL_PRINCIPAL.getValue())) { + dto.setSchoolId(FebsUtil.getTopDeptId()); + } else { + if (ObjectUtil.isNull(dto.getClassId())) { + dto.setClassIdList(remoteStaffService.listClassIdByStaffId().getData()); + } else { + dto.setClassIdList(Collections.singletonList(dto.getClassId())); + } + } + } + AttendanceRecordServiceImpl bean = applicationContext + .getBean(AttendanceRecordServiceImpl.class); + bean.dealDownRecordData(dto, uuid); + } + + + @Async + void dealDownRecordData(PageAttendanceRecordDTO dto, String uuid) { + String fileName = FileUtil.getLocalUploadAddress() + uuid + ".xls"; + File file = new File(fileName); + try { + log.info("开始处理下载通行数据"); + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); + IPage attendanceRecordIPage = baseMapper.listRecordPage(new Page(1, -1), dto); + List records = attendanceRecordIPage.getRecords(); + List> exportDataList = new ArrayList<>(); + for (int i = 0; i < records.size(); i++) { + AttendanceRecord record = records.get(i); + //更新进度缓存 + redisService + .hset(CachePrefixConstant.ATTENDANCE_RECORD_DOWNLOAD, uuid, + DownLoadAttendanceResultVO.builder() + .key(uuid) + .finish(0) + .totalNum(records.size()) + .currentNum(i + 1).build()); + //封装单行数据 + List singleDataList = new ArrayList<>(); + singleDataList.add(record.getUserName()); + if (ObjectUtil.equals(UserTypeEnum.PARENT_USER_TYPE.getType(), dto.getUserType())) { + EduStudent student = commonService.getStudentById(record.getUserId()); + if (ObjectUtil.isNotNull(student)) { + singleDataList.add(student.getStuNumber()); + } else { + singleDataList.add(""); + } + } else { + EduStaff staff = commonService.getStaffById(record.getUserId()); + if (ObjectUtil.isNotNull(staff)) { + singleDataList.add(staff.getMobile()); + } else { + singleDataList.add(""); + } + } + singleDataList.add(record.getCampusName()); + singleDataList.add(record.getSectionName()); + singleDataList.add(record.getGradeName()); + singleDataList.add(record.getClassName()); + singleDataList.add(LocalDateTimeUtil.format(record.getCreateTime(), "yyyy-MM-dd HH:mm:ss")); + singleDataList.add(record.getDeviceName()); + exportDataList.add(singleDataList); + } + EasyExcel.write(file) + .excelType(ExcelTypeEnum.XLSX) + // 这里放入动态头 + .head(AttendanceRecordExcelVO.class).sheet("通行记录") + // 当然这里数据也可以用 List> 去传入 + .doWrite(exportDataList); + + // 上传文件到媒资 + String fileUrl = com.yida.data.common.core.utils.FileUtil.uploadFileToMediaServer(uploadUrl, file); + redisService + .hset(CachePrefixConstant.ATTENDANCE_RECORD_DOWNLOAD, uuid, DownLoadAttendanceResultVO.builder() + .key(uuid) + .finish(1) + .filePath(fileUrl) + .totalNum(CollUtil.isEmpty(records) ? 100 : records.size()) + .currentNum(CollUtil.isEmpty(records) ? 100 : records.size()).build()); + } catch (Exception e) { + e.printStackTrace(); + } finally { + //删除本地文件 + if (cn.hutool.core.io.FileUtil.exist(file)) { + cn.hutool.core.io.FileUtil.del(file); + } + } + } + + @Override + public void resetOldData(Long schoolId, LocalDateTime startDateTime, Integer userType) { + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); + + Boolean isEnd = false; + Integer pageNum = 1; + while (!isEnd) { + log.info("开始处理第【{}】页数据", pageNum); + //每次查询1000调数据 + //学生数据 + List addRecordList = new ArrayList<>(); + List addResultList = new ArrayList<>(); + + if (!isEnd) { + if (ObjectUtil.equals(UserTypeEnum.STAFF_USER_TYPE.getType(), userType)) { + List staffRecords = baseMapper + .listStaffOldDataPage(new Page(pageNum, 1000), schoolId, startDateTime).getRecords(); + for (EduAttendanceStaffRecord record : staffRecords) { + //判断记录是否存在 + List list = list(Wrappers.lambdaQuery(new AttendanceRecord()) + .eq(AttendanceRecord::getCreateTime, record.getCreateTime()) + .eq(AttendanceRecord::getUserId, record.getStaffId()) + .eq(AttendanceRecord::getUserType, UserTypeEnum.STAFF_USER_TYPE.getType())); + if (CollUtil.isEmpty(list)) { + EduStaff staff = commonService.getStaffById(record.getStaffId()); + AttendanceRecord attendanceRecord = new AttendanceRecord(); + attendanceRecord.setDeviceId(record.getDeviceId()); + attendanceRecord.setCreateTime(record.getCreateTime()); + attendanceRecord.setUserId(record.getStaffId()); + attendanceRecord.setUserType(0); + attendanceRecord.setPicUrl(record.getPicUrl()); + attendanceRecord.setUserName(commonService.getStaffById(record.getStaffId()).getName()); + attendanceRecord.setSchoolId(record.getSchoolId()); + attendanceRecord.setCampusId(staff.getStaffDept().get(0).getId()); + attendanceRecord.setCampusName(staff.getStaffDept().get(0).getDeptName()); + addRecordList.add(attendanceRecord); + + //考勤结果 + + } + } + if (staffRecords.size() < 1000) { + isEnd = true; + } + } else { + List records = baseMapper + .listOldDataPage(new Page(pageNum, 1000), schoolId, startDateTime) + .getRecords(); + for (EduAttendanceRecord record : records) { + List list = list(Wrappers.lambdaQuery(new AttendanceRecord()) + .eq(AttendanceRecord::getCreateTime, record.getCreateTime()) + .eq(AttendanceRecord::getUserId, record.getStudentId()) + .eq(AttendanceRecord::getUserType, UserTypeEnum.PARENT_USER_TYPE.getType())); + + if (CollUtil.isEmpty(list)) { + EduAttendanceDevice device = eduAttendanceDeviceService.getById(record.getDeviceId()); + AddAttendanceRecordDTO dto = new AddAttendanceRecordDTO(); + dto.setDeviceSn(device.getSn()); + dto.setCreateTime(record.getCreateTime()); + dto.setUserId(record.getStudentId()); + dto.setUserType(1); + dto.setPicUrl(record.getPicUrl()); + addRecord(dto); + } + } + if (records.size() < 1000) { + isEnd = true; + } + } + } + pageNum++; + } + + stopWatch.stop(); + log.info("迁移结束,总共耗时:[{}]", stopWatch.getTotalTimeSeconds() + "秒"); + } + +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceReportPushRecordServiceImpl.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceReportPushRecordServiceImpl.java new file mode 100644 index 0000000..294490f --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceReportPushRecordServiceImpl.java @@ -0,0 +1,21 @@ +package com.yida.data.attendance.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.attendance.mapper.AttendanceReportPushRecordMapper; +import com.yida.data.attendance.service.AttendanceReportPushRecordService; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceReportPushRecord; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + + +@Service +@RequiredArgsConstructor +@Transactional(propagation = Propagation.SUPPORTS, readOnly = true) +@Slf4j +public class AttendanceReportPushRecordServiceImpl extends ServiceImpl + implements AttendanceReportPushRecordService { + +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceReportStrategyServiceImpl.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceReportStrategyServiceImpl.java new file mode 100644 index 0000000..1a62a1d --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceReportStrategyServiceImpl.java @@ -0,0 +1,339 @@ +package com.yida.data.attendance.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.attendance.dto.AddAttendanceReportStrategyDTO; +import com.yida.data.attendance.dto.AddAttendanceRuleTimeDTO; +import com.yida.data.attendance.dto.PageAttendanceRuleDTO; +import com.yida.data.attendance.mapper.AttendanceReportStrategyMapper; +import com.yida.data.attendance.mapper.AttendanceRuleTimeMapper; +import com.yida.data.attendance.service.AttendanceReportPushRecordService; +import com.yida.data.attendance.service.AttendanceReportStrategyService; +import com.yida.data.attendance.service.AttendanceResultService; +import com.yida.data.attendance.service.AttendanceRuleService; +import com.yida.data.attendance.service.AttendanceRuleTimeService; +import com.yida.data.attendance.vo.AttendanceRuleVO; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceReportPushRecord; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceReportStrategy; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRule; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRuleTime; +import com.yida.data.common.core.enums.EnableStatusEnum; +import com.yida.data.common.core.enums.UserTypeEnum; +import com.yida.data.common.core.enums.attendance.AttendanceModeTypeEnum; +import com.yida.data.common.core.enums.attendance.AttendanceReportTypeEnum; +import com.yida.data.common.core.enums.attendance.AttendanceStrategyTypeEnum; +import com.yida.data.common.core.enums.attendance.AttendanceUserTypeEnum; +import com.yida.data.common.core.utils.FebsUtil; +import java.time.LocalDate; +import java.time.LocalTime; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StopWatch; + +/** + * 考勤-推送策略 Service实现 + * + * @date 2023-08-09 11:37:25 + */ +@Service +@RequiredArgsConstructor +@Transactional(propagation = Propagation.SUPPORTS, readOnly = true) +@Slf4j +public class AttendanceReportStrategyServiceImpl extends ServiceImpl + implements AttendanceReportStrategyService { + + private final AttendanceRuleService attendanceRuleService; + private final AttendanceResultService attendanceResultService; + private final AttendanceReportPushRecordService attendanceReportPushRecordService; + + @Override + public void saveStrategy(List dtoList) { + for (AddAttendanceReportStrategyDTO dto : dtoList) { + AttendanceReportStrategy attendanceReportStrategy = new AttendanceReportStrategy(); + BeanUtils.copyProperties(dto, attendanceReportStrategy); + saveOrUpdate(attendanceReportStrategy); + } + } + + @Override + public List getList() { + List list = list(Wrappers.lambdaQuery(new AttendanceReportStrategy()) + .eq(AttendanceReportStrategy::getSchoolId, FebsUtil.getTopDeptId())); + if (CollUtil.isEmpty(list)) { + AttendanceReportStrategy attendanceReportStrategy = new AttendanceReportStrategy(); + attendanceReportStrategy.setType(0); + attendanceReportStrategy.setSchoolId(FebsUtil.getTopDeptId()); + save(attendanceReportStrategy); + AttendanceReportStrategy attendanceReportStrategyStu = new AttendanceReportStrategy(); + attendanceReportStrategyStu.setType(1); + attendanceReportStrategyStu.setSchoolId(FebsUtil.getTopDeptId()); + save(attendanceReportStrategyStu); + AttendanceReportStrategy attendanceReportStrategyPar = new AttendanceReportStrategy(); + attendanceReportStrategyPar.setType(2); + attendanceReportStrategyPar.setSchoolId(FebsUtil.getTopDeptId()); + save(attendanceReportStrategyPar); + list.add(attendanceReportStrategy); + list.add(attendanceReportStrategyStu); + list.add(attendanceReportStrategyPar); + } + return list; + } + + @Override + public void sendNotice() { + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); + //查询具有考勤规则的学校 + PageAttendanceRuleDTO dto = new PageAttendanceRuleDTO(); + dto.setStatus(EnableStatusEnum.ENABLE_STATUS.getStatus()); + List ruleVOList = attendanceRuleService.listRule(dto); + //循环规则 + for (AttendanceRuleVO attendanceRuleVO : ruleVOList) { + //判断规则今日是否有效 + if (LocalDate.now().isBefore(attendanceRuleVO.getStartDate()) || LocalDate.now() + .isAfter(attendanceRuleVO.getEndDate()) || !attendanceRuleVO.getWeek() + .contains(String.valueOf(LocalDate.now().getDayOfWeek().getValue()))) { + continue; + } +// log.info("处理【{}】学校,规则【{}】的考勤推送消息", attendanceRuleVO.getSchoolId(), attendanceRuleVO.getName()); + if (ObjectUtil.equals(AttendanceUserTypeEnum.STAFF.getValue(), attendanceRuleVO.getUserType())) { + //教职工考勤 + //1:职工考勤推送 + AttendanceReportStrategy staffStrategy = getOne(Wrappers.lambdaQuery(new AttendanceReportStrategy()) + .eq(AttendanceReportStrategy::getSchoolId, attendanceRuleVO.getSchoolId()) + .eq(AttendanceReportStrategy::getType, AttendanceStrategyTypeEnum.STAFF_STAFF.getValue())); + + //日报 + if (ObjectUtil.equals(EnableStatusEnum.ENABLE_STATUS.getStatus(), staffStrategy.getDayReport())) { + //TODO 发送管理员职工日报 + List timeDTOList = attendanceRuleVO.getTimeDTOList(); + List ruleTimeDTOList = timeDTOList.stream() + .sorted(Comparator.comparing(AddAttendanceRuleTimeDTO::getEndTime).reversed()) + .collect(Collectors.toList()); + LocalTime endTime = ruleTimeDTOList.get(0).getEndTime(); + if (LocalTime.now().isAfter(endTime.plusMinutes(staffStrategy.getDayReportTime()))) { + //判断是否已发布 + AttendanceReportPushRecord reportPushRecord = attendanceReportPushRecordService + .getOne(Wrappers.lambdaQuery(new AttendanceReportPushRecord()) + .eq(AttendanceReportPushRecord::getPushDate, LocalDate.now()) + .eq(AttendanceReportPushRecord::getReportType, AttendanceReportTypeEnum.DAY_REPORT.getValue()) + .eq(AttendanceReportPushRecord::getSchoolId, attendanceRuleVO.getSchoolId()) + .eq(AttendanceReportPushRecord::getRuleId, attendanceRuleVO.getId()) + .eq(AttendanceReportPushRecord::getType, UserTypeEnum.STAFF_USER_TYPE.getType())); + + if (ObjectUtil.isNull(reportPushRecord)) { + //大于结束时间10分钟 + attendanceResultService + .dayReport(0, UserTypeEnum.STAFF_USER_TYPE.getType(), attendanceRuleVO.getId()); + //增加推送记录 + AttendanceReportPushRecord pushRecord = new AttendanceReportPushRecord(); + pushRecord.setPushDate(LocalDate.now()); + pushRecord.setSchoolId(attendanceRuleVO.getSchoolId()); + pushRecord.setRuleId(attendanceRuleVO.getId()); + pushRecord.setReportType(AttendanceReportTypeEnum.DAY_REPORT.getValue()); + pushRecord.setType(UserTypeEnum.STAFF_USER_TYPE.getType()); + attendanceReportPushRecordService.save(pushRecord); + } + } + } + + //周报 + if (ObjectUtil.equals(EnableStatusEnum.ENABLE_STATUS.getStatus(), staffStrategy.getWeekReport()) && + ObjectUtil.equals(staffStrategy.getWeekReportDate(), LocalDate.now().getDayOfWeek().getValue()) && + staffStrategy.getWeekReportTime().isAfter(LocalTime.now())) { + + //TODO 发送管理员职工周报 + + } + //月报 + if (ObjectUtil.equals(EnableStatusEnum.ENABLE_STATUS.getStatus(), staffStrategy.getMonthReport())) { + if (ObjectUtil.equals(staffStrategy.getMonthReportDate(), LocalDate.now().getDayOfMonth())) { + if (staffStrategy.getMonthReportTime().isAfter(LocalTime.now())) { + //TODO 发送管理员职工月报 + } + } + } + //迟到提醒 + if (ObjectUtil.equals(EnableStatusEnum.ENABLE_STATUS.getStatus(), staffStrategy.getLateReport())) { + if (ObjectUtil.equals(AttendanceModeTypeEnum.FREE.getValue(), attendanceRuleVO.getType())) { + //固定打卡模式 + List timeDTOList = attendanceRuleVO.getTimeDTOList(); + if (CollUtil.isNotEmpty(timeDTOList)) { + for (AddAttendanceRuleTimeDTO ruleTimeDTO : timeDTOList) { + if (LocalTime.now() + .isAfter(ruleTimeDTO.getStartTime().plusMinutes(staffStrategy.getLateReportTime()))) { + //TODO 发送职工迟到提醒 + } + } + } + } + } + + //缺卡提醒 + if (ObjectUtil.equals(EnableStatusEnum.ENABLE_STATUS.getStatus(), staffStrategy.getMissReport())) { + //固定打卡模式 + List timeDTOList = attendanceRuleVO.getTimeDTOList(); + if (CollUtil.isNotEmpty(timeDTOList)) { + for (AddAttendanceRuleTimeDTO ruleTimeDTO : timeDTOList) { + if (LocalTime.now() + .isAfter(ruleTimeDTO.getEndTime().plusMinutes(staffStrategy.getMissReportTime()))) { + //TODO 发送职工缺卡提醒 + } + } + } + } + } else { + //学生考勤 + //1:学生考勤推送 + AttendanceReportStrategy staffStrategy = getOne(Wrappers.lambdaQuery(new AttendanceReportStrategy()) + .eq(AttendanceReportStrategy::getSchoolId, attendanceRuleVO.getSchoolId()) + .eq(AttendanceReportStrategy::getType, AttendanceStrategyTypeEnum.STUDENT_STAFF.getValue())); + List staffList = new ArrayList<>(); + if (ObjectUtil.isNotNull(staffStrategy.getObjStaffIds())) { + staffList = Arrays.stream(staffStrategy.getObjStaffIds().split(",")) + .map(s -> Long.parseLong(s.trim())) + .collect(Collectors.toList()); + } + + //日报 + if (ObjectUtil.equals(EnableStatusEnum.ENABLE_STATUS.getStatus(), staffStrategy.getDayReport())) { + //TODO 发送管理员职工日报 + List timeDTOList = attendanceRuleVO.getTimeDTOList(); + List ruleTimeDTOList = timeDTOList.stream() + .sorted(Comparator.comparing(AddAttendanceRuleTimeDTO::getEndTime).reversed()) + .collect(Collectors.toList()); + LocalTime endTime = ruleTimeDTOList.get(0).getEndTime(); + if (LocalTime.now().isAfter(endTime.plusMinutes(staffStrategy.getDayReportTime()))) { + + //判断是否已发布 + AttendanceReportPushRecord reportPushRecord = attendanceReportPushRecordService + .getOne(Wrappers.lambdaQuery(new AttendanceReportPushRecord()) + .eq(AttendanceReportPushRecord::getPushDate, LocalDate.now()) + .eq(AttendanceReportPushRecord::getReportType, AttendanceReportTypeEnum.DAY_REPORT.getValue()) + .eq(AttendanceReportPushRecord::getSchoolId, attendanceRuleVO.getSchoolId()) + .eq(AttendanceReportPushRecord::getRuleId, attendanceRuleVO.getId()) + .eq(AttendanceReportPushRecord::getType, UserTypeEnum.PARENT_USER_TYPE.getType())); + + if (ObjectUtil.isNull(reportPushRecord)) { + //大于结束时间10分钟 + attendanceResultService + .dayReport(0, UserTypeEnum.PARENT_USER_TYPE.getType(), attendanceRuleVO.getId()); + //增加推送记录 + AttendanceReportPushRecord pushRecord = new AttendanceReportPushRecord(); + pushRecord.setPushDate(LocalDate.now()); + pushRecord.setSchoolId(attendanceRuleVO.getSchoolId()); + pushRecord.setRuleId(attendanceRuleVO.getId()); + pushRecord.setReportType(AttendanceReportTypeEnum.DAY_REPORT.getValue()); + pushRecord.setType(UserTypeEnum.PARENT_USER_TYPE.getType()); + attendanceReportPushRecordService.save(pushRecord); + } + } + } + //周报 + if (ObjectUtil.equals(EnableStatusEnum.ENABLE_STATUS.getStatus(), staffStrategy.getWeekReport()) + && ObjectUtil.equals(staffStrategy.getWeekReportDate(), LocalDate.now().getDayOfWeek().getValue()) + && staffStrategy.getWeekReportTime().isAfter(LocalTime.now())) { + //TODO 发送管理员学生周报 + + } + //月报 + if (ObjectUtil.equals(EnableStatusEnum.ENABLE_STATUS.getStatus(), staffStrategy.getMonthReport()) && + ObjectUtil.equals(staffStrategy.getMonthReportDate(), LocalDate.now().getDayOfMonth()) && + staffStrategy.getMonthReportTime().isAfter(LocalTime.now())) { + //TODO 发送管理员学生月报 + + } + //迟到提醒 + if (ObjectUtil.equals(EnableStatusEnum.ENABLE_STATUS.getStatus(), staffStrategy.getLateReport())) { + List timeDTOList = attendanceRuleVO.getTimeDTOList(); + if (CollUtil.isNotEmpty(timeDTOList)) { + for (AddAttendanceRuleTimeDTO ruleTimeDTO : timeDTOList) { + if (ObjectUtil + .equals(AttendanceUserTypeEnum.STUDENT_TO_DORM.getValue(), attendanceRuleVO.getUserType())) { + //宿舍考勤 + if (LocalTime.now() + .isAfter(ruleTimeDTO.getEndTime().plusMinutes(staffStrategy.getLateReportTime()))) { + //TODO 发送职工学生提醒 + attendanceResultService + .lateReport(0, 1, attendanceRuleVO.getId(), ruleTimeDTO.getId(), staffList, + staffStrategy.getObjManager()); + } + } else { + if (LocalTime.now() + .isAfter(ruleTimeDTO.getStartTime().plusMinutes(staffStrategy.getLateReportTime()))) { + //TODO 发送职工学生提醒 + attendanceResultService + .lateReport(0, 1, attendanceRuleVO.getId(), ruleTimeDTO.getId(), staffList, + staffStrategy.getObjManager()); + } + } + } + } + } + + //缺卡提醒 + if (ObjectUtil.equals(EnableStatusEnum.ENABLE_STATUS.getStatus(), staffStrategy.getMissReport())) { + List timeDTOList = attendanceRuleVO.getTimeDTOList(); + if (CollUtil.isNotEmpty(timeDTOList)) { + for (AddAttendanceRuleTimeDTO ruleTimeDTO : timeDTOList) { + if (LocalTime.now() + .isAfter(ruleTimeDTO.getEndEffectiveEndTime().plusMinutes(staffStrategy.getMissReportTime()))) { + //TODO 发送职工学生提醒 + + } + } + } + } + + //家长提醒 + AttendanceReportStrategy staffStrategyParent = getOne(Wrappers.lambdaQuery(new AttendanceReportStrategy()) + .eq(AttendanceReportStrategy::getSchoolId, attendanceRuleVO.getSchoolId()) + .eq(AttendanceReportStrategy::getType, AttendanceStrategyTypeEnum.STUDENT_PARENT.getValue())); + + //迟到提醒 + if (ObjectUtil.equals(1, staffStrategyParent.getLateReport())) { + if (ObjectUtil.equals(AttendanceModeTypeEnum.FREE.getValue(), attendanceRuleVO.getType())) { + //固定打卡模式 + List timeDTOList = attendanceRuleVO.getTimeDTOList(); + if (CollUtil.isNotEmpty(timeDTOList)) { + for (AddAttendanceRuleTimeDTO ruleTimeDTO : timeDTOList) { + if (LocalTime.now() + .isAfter(ruleTimeDTO.getStartTime().plusMinutes(staffStrategy.getLateReportTime()))) { + //TODO 发送家长学生提醒 + } + } + } + } + } + + //缺卡提醒 + if (ObjectUtil.equals(1, staffStrategyParent.getMissReport())) { + List timeDTOList = attendanceRuleVO.getTimeDTOList(); + if (CollUtil.isNotEmpty(timeDTOList)) { + for (AddAttendanceRuleTimeDTO ruleTimeDTO : timeDTOList) { + if (LocalTime.now() + .isAfter(ruleTimeDTO.getEndTime().plusMinutes(staffStrategy.getMissReportTime()))) { + //TODO 发送家长学生提醒 + } + } + } + } + + } + } + + stopWatch.stop(); + log.info("推送报告结束,总共耗时:[{}]", stopWatch.getTotalTimeSeconds() + "秒"); + } +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceResultServiceImpl.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceResultServiceImpl.java new file mode 100644 index 0000000..32d6a51 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceResultServiceImpl.java @@ -0,0 +1,2363 @@ +package com.yida.data.attendance.service.impl; + +import cc.mrbird.febs.common.redis.service.RedisService; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.LocalDateTimeUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.support.ExcelTypeEnum; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.google.common.base.Joiner; +import com.yida.data.attendance.dto.AddAttendanceRuleObjDTO; +import com.yida.data.attendance.dto.AddAttendanceRuleTimeDTO; +import com.yida.data.attendance.dto.AttendanceCountPageDTO; +import com.yida.data.attendance.dto.AttendanceDayReportDTO; +import com.yida.data.attendance.dto.AttendanceResultByDayDTO; +import com.yida.data.attendance.dto.AttendanceResultByStartAndEndTimeDTO; +import com.yida.data.attendance.dto.AttendanceStatusByMonthDTO; +import com.yida.data.attendance.dto.DayReportDataDTO; +import com.yida.data.attendance.dto.ManageListUserDTO; +import com.yida.data.attendance.dto.PageAttendanceRuleDTO; +import com.yida.data.attendance.mapper.AttendanceResultMapper; +import com.yida.data.attendance.service.AttendanceResultService; +import com.yida.data.attendance.service.AttendanceRuleAdminService; +import com.yida.data.attendance.service.AttendanceRuleObjService; +import com.yida.data.attendance.service.AttendanceRuleObjUserService; +import com.yida.data.attendance.service.AttendanceRuleService; +import com.yida.data.attendance.service.AttendanceRuleSpecialDateService; +import com.yida.data.attendance.service.AttendanceRuleTimeService; +import com.yida.data.attendance.service.NoticeService; +import com.yida.data.attendance.vo.AttdanceResultDetailVO; +import com.yida.data.attendance.vo.AttdanceResultTotalVO; +import com.yida.data.attendance.vo.AttdanceResultVO; +import com.yida.data.attendance.vo.AttendanceRuleVO; +import com.yida.data.attendance.vo.AttendanceStatusByMonthVO; +import com.yida.data.attendance.vo.DateStatusVO; +import com.yida.data.attendance.vo.DownLoadAttendanceResultVO; +import com.yida.data.attendance.vo.ManageListUserAttendanceDetailTotalVO; +import com.yida.data.attendance.vo.ManageListUserAttendanceDetailVO; +import com.yida.data.attendance.vo.ManageListUserVO; +import com.yida.data.attendance.vo.StaRecordCountVO; +import com.yida.data.attendance.vo.StaffIdentityVO; +import com.yida.data.attendance.vo.StudentDormAttendanceDayReportExcelVO; +import com.yida.data.attendance.vo.StudentDormAttendanceResultExcelVO; +import com.yida.data.attendance.vo.StudentDormAttendanceResultTotalExcelVO; +import com.yida.data.attendance.vo.UserAttendanceResultByDayVO; +import com.yida.data.attendance.vo.UserAttendanceResultByTimeSlotVO; +import com.yida.data.attendance.vo.UserAttendanceResultDayAndNumVO; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRecord; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceResult; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRule; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRuleAdmin; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRuleObj; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRuleObjUser; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRuleSpecialDate; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRuleTime; +import com.yida.data.common.core.entity.constant.CachePrefixConstant; +import com.yida.data.common.core.entity.system.Dept; +import com.yida.data.common.core.entity.system.enums.RoleEnum; +import com.yida.data.common.core.entity.user.EduStaff; +import com.yida.data.common.core.entity.user.EduStaffDept; +import com.yida.data.common.core.entity.user.EduStudent; +import com.yida.data.common.core.entity.user.EduUserDept; +import com.yida.data.common.core.entity.user.enums.StudentStatusEnum; +import com.yida.data.common.core.entity.user.enums.UserDeptTypeEnum; +import com.yida.data.common.core.enums.EnableStatusEnum; +import com.yida.data.common.core.enums.UserTypeEnum; +import com.yida.data.common.core.enums.attendance.AttendanceModeTypeEnum; +import com.yida.data.common.core.enums.attendance.AttendanceResultEnum; +import com.yida.data.common.core.enums.attendance.AttendanceTypeEnum; +import com.yida.data.common.core.enums.attendance.AttendanceUserTypeEnum; +import com.yida.data.common.core.utils.FebsUtil; +import com.yida.data.common.core.utils.FileUtil; +import com.yida.data.common.service.CommonService; +import com.yida.data.school.dto.userLeave.ListUserRequestDTO; +import com.yida.data.school.feign.leave.RemoteLeaveRequestService; +import com.yida.data.school.vo.userLeave.EduLeaveRequestUserVO; +import com.yida.data.system.feign.RemoteDeptService; +import com.yida.data.user.dto.ListStaffDTO; +import com.yida.data.user.dto.ListStudentDTO; +import com.yida.data.user.feign.RemoteStaffService; +import com.yida.data.user.feign.RemoteStudentService; +import com.yida.data.user.feign.RemoteUserDeptService; + +import com.yida.data.user.vo.DownLoadStaffAttendanceRecordVO; +import java.io.File; +import java.time.Duration; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Objects; +import java.util.concurrent.atomic.AtomicReference; +import java.util.stream.Collectors; + +import java.util.stream.Stream; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.ApplicationContext; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StopWatch; + +/** + * 考勤-考勤结果 Service实现 + * + * @date 2023-08-09 11:37:25 + */ +@Slf4j +@Service +@RequiredArgsConstructor +@Transactional(propagation = Propagation.SUPPORTS, readOnly = true) +public class AttendanceResultServiceImpl extends ServiceImpl + implements AttendanceResultService { + + private final AttendanceRuleService attendanceRuleService; + private final AttendanceRuleTimeService attendanceRuleTimeService; + private final AttendanceRuleSpecialDateService attendanceRuleSpecialDateService; + private final AttendanceRuleAdminService attendanceRuleAdminService; + private final AttendanceRuleObjService attendanceRuleObjService; + private final AttendanceRuleObjUserService attendanceRuleObjUserService; + + private final RemoteStudentService remoteStudentService; + private final RemoteStaffService remoteStaffService; + private final RemoteLeaveRequestService remoteLeaveRequestService; + private final RemoteUserDeptService remoteUserDeptService; + private final RemoteDeptService remoteDeptService; + private final CommonService commonService; + private final RedisService redisService; + private final NoticeService noticeService; + + @Value("${febs.uploadUrl}") + private String uploadUrl; + + @Autowired + ApplicationContext applicationContext; + + @Override + public void addResult(AttendanceRecord record) { + AttendanceResult result = getOne(Wrappers.lambdaQuery(new AttendanceResult()) + .eq(AttendanceResult::getRuleId, record.getRuleId()) + .eq(AttendanceResult::getRuleTimeId, record.getRuleTimeId()) + .eq(AttendanceResult::getUserId, record.getUserId()) + .eq(AttendanceResult::getUserType, record.getUserType()) + .eq(AttendanceResult::getAttendanceDate, record.getCreateTime().toLocalDate())); + + if (ObjectUtil.isNull(result)) { + result = new AttendanceResult(); + AttendanceRuleVO rule = attendanceRuleService.getRule(record.getRuleId()); + AttendanceRuleTime ruleTime = attendanceRuleTimeService.getById(record.getRuleTimeId()); + + result.setSchoolId(record.getSchoolId()); + result.setAttType(rule.getType()); + result.setUserType(record.getUserType()); + result.setUserId(record.getUserId()); + result.setRuleId(record.getRuleId()); + result.setRuleTimeId(record.getRuleTimeId()); + result.setAttendanceDate(record.getCreateTime().toLocalDate()); + result.setStartStiTime(ruleTime.getStartTime()); + result.setEndStiTime(ruleTime.getEndTime()); + } + + if (ObjectUtil.equals(record.getRuleTimeType(), AttendanceTypeEnum.WORK_ON.getValue())) { + //如果是自由打卡模式,已打卡状态为正常,此次为正常则更新记录,不正常则不记录 + if (ObjectUtil.equals(result.getAttType(), AttendanceModeTypeEnum.FREE.getValue()) && ObjectUtil + .equals(result.getStartStatus(), + AttendanceResultEnum.NORMAL.getValue())) { + if (ObjectUtil.equals(record.getStatus(), AttendanceResultEnum.NORMAL.getValue())) { + result.setStartRealTime(record.getCreateTime().toLocalTime()); + result.setStartStatus(record.getStatus()); + result.setStartPicUrl(record.getPicUrl()); + } + } else { + result.setStartRealTime(record.getCreateTime().toLocalTime()); + result.setStartStatus(record.getStatus()); + result.setStartPicUrl(record.getPicUrl()); + } + if (!ObjectUtil.equals(AttendanceResultEnum.NORMAL.getValue(), result.getStartStatus())) { + //计算迟到分钟数 + result.setStartLateTime(Duration.between(result.getStartStiTime(), result.getStartRealTime()).toMinutes()); + } + } + if (ObjectUtil.equals(record.getRuleTimeType(), AttendanceTypeEnum.WORK_OFF.getValue())) { + result.setEndRealTime(record.getCreateTime().toLocalTime()); + result.setEndStatus(record.getStatus()); + result.setEndPicUrl(record.getPicUrl()); + if (ObjectUtil.equals(AttendanceResultEnum.ABNORMAL.getValue(), result.getEndStatus())) { + //计算迟到分钟数 + result.setEndLeaveTime(Duration.between(result.getEndRealTime(), result.getEndStiTime()).toMinutes()); + } + } + + saveOrUpdate(result); + } + + @Override + public IPage listResultPage(AttendanceCountPageDTO dto) { + Long topDeptId = FebsUtil.getTopDeptId(); + + Map> staffMap = new HashMap<>(); + Map> studentMap = new HashMap<>(); + + List userIdList = new ArrayList<>(); + //先查找出学生或者教职工 + if (ObjectUtil.equals(dto.getType(), AttendanceUserTypeEnum.STAFF.getValue())) { + ListStaffDTO param = new ListStaffDTO(); + param.setSchoolId(topDeptId); + param.setMobile(dto.getNameOrNumber()); + param.setDeptId(dto.getDeptId()); + List staffList = remoteStaffService.listStaff(param).getData(); + param.setMobile(null); + param.setName(dto.getNameOrNumber()); + List staffListOth = remoteStaffService.listStaff(param).getData(); + staffList.addAll(staffListOth); + if (CollUtil.isNotEmpty(staffList)) { + staffMap = staffList.stream().collect(Collectors.groupingBy(EduStaff::getId)); + userIdList = staffList.stream().map(EduStaff::getId) + .collect(Collectors.toList()); + } else { + return new Page<>(); + } + } else { + //查询权限对应的班级的学生 + List studentList = new ArrayList<>(); + String rolePerms = FebsUtil.getCurrentUser().getRolePerms(); + if (rolePerms.contains(RoleEnum.ROLE_SCHOOL_PRINCIPAL.getValue())) { + ListStudentDTO param = new ListStudentDTO(); + param.setSchoolId(topDeptId); + param.setCampusId(dto.getCampusId()); + param.setSectionId(dto.getSectionId()); + param.setGradeId(dto.getGradeId()); + param.setClassId(dto.getClassId()); + param.setStuName(dto.getNameOrNumber()); + param.setIsQueryParent(false); + param.setIsQuerySchoolName(false); + studentList = remoteStudentService.listStudent(param).getData(); + } else { + if (ObjectUtil.isNull(dto.getCampusId()) && ObjectUtil.isNull(dto.getSectionId()) && ObjectUtil + .isNull(dto.getGradeId()) && ObjectUtil.isNull(dto.getClassId())) { + List classIdList = remoteStaffService.listClassIdByStaffId().getData(); + ListStudentDTO param = new ListStudentDTO(); + param.setClassIds(classIdList); + param.setIsQueryParent(false); + param.setIsQuerySchoolName(false); + param.setStuName(dto.getNameOrNumber()); + studentList = remoteStudentService.listStudent(param).getData(); + } else { + ListStudentDTO param = new ListStudentDTO(); + param.setSchoolId(topDeptId); + param.setCampusId(dto.getCampusId()); + param.setSectionId(dto.getSectionId()); + param.setGradeId(dto.getGradeId()); + param.setClassId(dto.getClassId()); + param.setStuName(dto.getNameOrNumber()); + param.setIsQueryParent(false); + param.setIsQuerySchoolName(false); + studentList = remoteStudentService.listStudent(param).getData(); + } + } + if (CollUtil.isNotEmpty(studentList)) { + studentMap = studentList.stream().collect(Collectors.groupingBy(EduStudent::getId)); + userIdList = studentList.stream().map(EduStudent::getId) + .collect(Collectors.toList()); + } else { + return new Page<>(); + } + } + + dto.setUserIdList(userIdList); + IPage attdanceResultVOIPage = baseMapper.listResultPage(dto.toPage(), dto); + List records = attdanceResultVOIPage.getRecords(); + for (AttdanceResultVO attdanceResultVO : records) { + if (ObjectUtil.equals(dto.getType(), AttendanceUserTypeEnum.STAFF.getValue())) { + //教职工 + List staffList = staffMap.get(attdanceResultVO.getUserId()); + attdanceResultVO.setName(staffList.get(0).getName()); + attdanceResultVO.setNumber(staffList.get(0).getMobile()); + List staffDept = commonService.getStaffById(attdanceResultVO.getUserId()).getStaffDept(); + attdanceResultVO + .setDeptName( + CollUtil.isEmpty(staffDept) ? commonService.getStaffById(attdanceResultVO.getUserId()).getSchoolName() + : staffDept.get(0).getDeptName()); + } else { + //学生 + attdanceResultVO.setName(studentMap.get(attdanceResultVO.getUserId()).get(0).getStuName()); + attdanceResultVO.setNumber(studentMap.get(attdanceResultVO.getUserId()).get(0).getStuNumber()); + attdanceResultVO.setDeptName( + studentMap.get(attdanceResultVO.getUserId()).get(0).getCampusName() + "-" + studentMap + .get(attdanceResultVO.getUserId()).get(0).getGradeName() + "-" + studentMap + .get(attdanceResultVO.getUserId()).get(0).getClassName()); + } + } + return attdanceResultVOIPage; + } + + @Override + public AttdanceResultTotalVO total(AttendanceCountPageDTO dto) { + Long topDeptId = FebsUtil.getTopDeptId(); + + Map> staffMap = new HashMap<>(); + Map> studentMap = new HashMap<>(); + + List userIdList = new ArrayList<>(); + //先查找出学生或者教职工 + if (ObjectUtil.equals(dto.getType(), AttendanceUserTypeEnum.STAFF.getValue())) { + ListStaffDTO param = new ListStaffDTO(); + param.setSchoolId(topDeptId); + param.setMobile(dto.getNameOrNumber()); + param.setDeptId(dto.getDeptId()); + List staffList = remoteStaffService.listStaff(param).getData(); + param.setMobile(null); + param.setName(dto.getNameOrNumber()); + List staffListOth = remoteStaffService.listStaff(param).getData(); + staffList.addAll(staffListOth); + if (CollUtil.isNotEmpty(staffList)) { + userIdList = staffList.stream().map(EduStaff::getId) + .collect(Collectors.toList()); + } else { + return null; + } + } else { + //查询权限对应的班级的学生 + List studentList = new ArrayList<>(); + String rolePerms = FebsUtil.getCurrentUser().getRolePerms(); + if (rolePerms.contains(RoleEnum.ROLE_SCHOOL_PRINCIPAL.getValue())) { + ListStudentDTO param = new ListStudentDTO(); + param.setSchoolId(topDeptId); + param.setCampusId(dto.getCampusId()); + param.setSectionId(dto.getSectionId()); + param.setGradeId(dto.getGradeId()); + param.setClassId(dto.getClassId()); + param.setStuName(dto.getNameOrNumber()); + param.setIsQueryParent(false); + param.setIsQuerySchoolName(false); + studentList = remoteStudentService.listStudent(param).getData(); + } else { + if (ObjectUtil.isNull(dto.getCampusId()) && ObjectUtil.isNull(dto.getSectionId()) && ObjectUtil + .isNull(dto.getGradeId()) && ObjectUtil.isNull(dto.getClassId())) { + List classIdList = remoteStaffService.listClassIdByStaffId().getData(); + ListStudentDTO param = new ListStudentDTO(); + param.setClassIds(classIdList); + param.setIsQueryParent(false); + param.setIsQuerySchoolName(false); + param.setStuName(dto.getNameOrNumber()); + studentList = remoteStudentService.listStudent(param).getData(); + } else { + ListStudentDTO param = new ListStudentDTO(); + param.setSchoolId(topDeptId); + param.setCampusId(dto.getCampusId()); + param.setSectionId(dto.getSectionId()); + param.setGradeId(dto.getGradeId()); + param.setClassId(dto.getClassId()); + param.setStuName(dto.getNameOrNumber()); + param.setIsQueryParent(false); + param.setIsQuerySchoolName(false); + studentList = remoteStudentService.listStudent(param).getData(); + } + } + if (CollUtil.isNotEmpty(studentList)) { + userIdList = studentList.stream().map(EduStudent::getId) + .collect(Collectors.toList()); + } else { + return null; + } + } + dto.setUserIdList(userIdList); + List attdanceResultDetailVOList = baseMapper.findAttandanceTotal(dto); + + //请假 + ListUserRequestDTO requestDTO = new ListUserRequestDTO(); + requestDTO.setRequestType(dto.getType()); + requestDTO.setStartTime(dto.getStartDate().atTime(00, 00, 01)); + requestDTO.setEndTime(dto.getEndDate().atTime(23, 59, 59)); + List eduLeaveRequestUserVOList = remoteLeaveRequestService.findList(requestDTO) + .getData(); + + int missNumber = attdanceResultDetailVOList.stream().filter(a -> ObjectUtil.isNull(a.getStartStatus())) + .collect(Collectors.toList()).size(); + int normalNumber = attdanceResultDetailVOList.stream() + .filter(a -> ObjectUtil.equals(a.getStartStatus(), AttendanceResultEnum.NORMAL.getValue())) + .collect(Collectors.toList()).size(); + int lateNumber = attdanceResultDetailVOList.stream() + .filter(a -> ObjectUtil.equals(a.getStartStatus(), AttendanceResultEnum.LATE_DORM.getValue())) + .collect(Collectors.toList()).size(); + int abLateNumber = attdanceResultDetailVOList.stream() + .filter(a -> ObjectUtil.equals(a.getStartStatus(), AttendanceResultEnum.AB_LATE_DORM.getValue())) + .collect(Collectors.toList()).size(); + return AttdanceResultTotalVO.builder().normalNumber(normalNumber) + .missNumber(missNumber).lateNumber(lateNumber) + .abLateNumber(abLateNumber).leaveNumber(eduLeaveRequestUserVOList.size()).build(); + } + + @Override + public void downLocalAttendanceResult(AttendanceCountPageDTO dto, String uuid) { + String rolePerms = FebsUtil.getCurrentUser().getRolePerms(); + List userIdList = new ArrayList<>(); + if (rolePerms.contains(RoleEnum.ROLE_SCHOOL_PRINCIPAL.getValue())) { + ListStudentDTO param = new ListStudentDTO(); + param.setSchoolId(dto.getSchoolId()); + param.setCampusId(dto.getCampusId()); + param.setSectionId(dto.getSectionId()); + param.setGradeId(dto.getGradeId()); + param.setClassId(dto.getClassId()); + param.setStuName(dto.getNameOrNumber()); + param.setIsQueryParent(false); + param.setIsQuerySchoolName(false); + userIdList = remoteStudentService.listStudent(param).getData().stream().map(EduStudent::getId) + .collect(Collectors.toList()); + } else { + if (ObjectUtil.isNull(dto.getCampusId()) && ObjectUtil.isNull(dto.getSectionId()) && ObjectUtil + .isNull(dto.getGradeId()) && ObjectUtil.isNull(dto.getClassId())) { + List classIdList = remoteStaffService.listClassIdByStaffId().getData(); + ListStudentDTO param = new ListStudentDTO(); + param.setClassIds(classIdList); + param.setIsQueryParent(false); + param.setIsQuerySchoolName(false); + param.setStuName(dto.getNameOrNumber()); + userIdList = remoteStudentService.listStudent(param).getData().stream().map(EduStudent::getId) + .collect(Collectors.toList()); + } else { + ListStudentDTO param = new ListStudentDTO(); + param.setSchoolId(dto.getSchoolId()); + param.setCampusId(dto.getCampusId()); + param.setSectionId(dto.getSectionId()); + param.setGradeId(dto.getGradeId()); + param.setClassId(dto.getClassId()); + param.setStuName(dto.getNameOrNumber()); + param.setIsQueryParent(false); + param.setIsQuerySchoolName(false); + userIdList = remoteStudentService.listStudent(param).getData().stream().map(EduStudent::getId) + .collect(Collectors.toList()); + } + } + dto.setUserIdList(userIdList); + AttendanceResultServiceImpl bean = applicationContext + .getBean(AttendanceResultServiceImpl.class); + + bean.dealAttendanceReultData(dto, uuid); + } + + + @Override + public void downLocalAttendanceDayReport(AttendanceDayReportDTO dto, String uuid) { + String rolePerms = FebsUtil.getCurrentUser().getRolePerms(); + List userIdList = new ArrayList<>(); + if (rolePerms.contains(RoleEnum.ROLE_SCHOOL_PRINCIPAL.getValue())) { + ListStudentDTO param = new ListStudentDTO(); + param.setSchoolId(dto.getSchoolId()); + param.setIsQueryParent(false); + param.setIsQuerySchoolName(false); + userIdList = remoteStudentService.listStudent(param).getData().stream().map(EduStudent::getId) + .collect(Collectors.toList()); + } else { + List classIdList = remoteStaffService.listClassIdByStaffId().getData(); + ListStudentDTO param = new ListStudentDTO(); + param.setClassIds(classIdList); + param.setIsQueryParent(false); + param.setIsQuerySchoolName(false); + userIdList = remoteStudentService.listStudent(param).getData().stream().map(EduStudent::getId) + .collect(Collectors.toList()); + } + dto.setUserIdList(userIdList); + + AttendanceResultServiceImpl bean = applicationContext + .getBean(AttendanceResultServiceImpl.class); + bean.dealAttendanceReportData(dto, uuid); + } + + @Async + void dealAttendanceReportData(AttendanceDayReportDTO dto, String uuid) { + + long durationDays = dto.getStartAttendanceDate().until(dto.getEndAttendanceDate(), ChronoUnit.DAYS); + + log.info("相差天数{}", durationDays); + + String fileName = FileUtil.getLocalUploadAddress() + uuid + ".xls"; + File file = new File(fileName); + try { + log.info("开始导出考勤日报/周报/月报"); + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); + List> campusExportDataList = new ArrayList<>(); + List> sectionExportDataList = new ArrayList<>(); + List> gradeExportDataList = new ArrayList<>(); + List> classExportDataList = new ArrayList<>(); + List resultList = new ArrayList<>(); + + if (CollUtil.isNotEmpty(dto.getUserIdList())) { + resultList = list(Wrappers.lambdaQuery(new AttendanceResult()) + .in(AttendanceResult::getUserId, dto.getUserIdList()) + .eq(AttendanceResult::getUserType, dto.getUserType()) + .between(AttendanceResult::getAttendanceDate, dto.getStartAttendanceDate(), dto.getEndAttendanceDate()) + .orderByAsc(AttendanceResult::getUserId)); + + for (AttendanceResult result : resultList) { + if (ObjectUtil.equals(UserTypeEnum.PARENT_USER_TYPE.getType(), result.getUserType())) { + EduStudent student = commonService.getStudentById(result.getUserId()); + if (ObjectUtil.isNotNull(student)) { + result.setCampusName(student.getCampusName()); + result.setSectionName(student.getSectionName()); + result.setGradeName(student.getGradeName()); + result.setClassName(student.getClassName()); + } + } else { + EduStaff staff = commonService.getStaffById(result.getUserId()); + if (ObjectUtil.isNotNull(staff)) { + List staffDept = staff.getStaffDept(); + if (CollUtil.isEmpty(staffDept)) { + result.setCampusName(staff.getSchoolName()); + } else { + List deptNameList = staffDept.stream().map(EduStaffDept::getDeptName) + .collect(Collectors.toList()); + result.setCampusName(Joiner.on("/").join(deptNameList)); + } + } + } + } + + Map> campusMap = resultList.stream() + .collect(Collectors.groupingBy(AttendanceResult::getCampusName)); + + String startAttendanceDate = LocalDateTimeUtil.format(dto.getStartAttendanceDate(), "yyyy-MM-dd"); + String endAttendanceDate = LocalDateTimeUtil.format(dto.getEndAttendanceDate(), "yyyy-MM-dd"); + + List finalResultList = resultList; + campusMap.forEach((k, v) -> { + List cam_singleDataList = dealSingleExcelData(startAttendanceDate, endAttendanceDate, k, "-", "-", + "-", v); + campusExportDataList.add(cam_singleDataList); + Map> sectionMap = v.stream() + .collect(Collectors.groupingBy(AttendanceResult::getSectionName)); + sectionMap.forEach((s, l) -> { + List sec_singleDataList = dealSingleExcelData(startAttendanceDate, endAttendanceDate, k, s, "-", + "-", l); + sectionExportDataList.add(sec_singleDataList); + Map> gradeMap = l.stream() + .collect(Collectors.groupingBy(AttendanceResult::getGradeName)); + gradeMap.forEach((g, n) -> { + List grade_singleDataList = dealSingleExcelData(startAttendanceDate, endAttendanceDate, k, s, + g, "-", n); + gradeExportDataList.add(grade_singleDataList); + Map> classMap = n.stream() + .collect(Collectors.groupingBy(AttendanceResult::getClassName)); + classMap.forEach((c, m) -> { + List class_singleDataList = dealSingleExcelData(startAttendanceDate, endAttendanceDate, k, + s, g, c, m); + classExportDataList.add(class_singleDataList); + + DownLoadAttendanceResultVO vo = (DownLoadAttendanceResultVO) redisService + .hget(CachePrefixConstant.ATTENDANCE_DAY_REPORT_DOWNLOAD, uuid); + + redisService + .hset(CachePrefixConstant.ATTENDANCE_DAY_REPORT_DOWNLOAD, uuid, + DownLoadAttendanceResultVO.builder() + .key(uuid) + .finish(0) + .totalNum(finalResultList.size()) + .currentNum(ObjectUtil.isNull(vo) ? 1 : vo.getCurrentNum() + 1).build()); + }); + }); + }); + }); + } + + ExcelWriter excelWriter = EasyExcel.write(file).excelType(ExcelTypeEnum.XLSX).build(); + WriteSheet writeSheet0 = EasyExcel.writerSheet(0, durationDays == 0 ? "日报-校区" : durationDays > 7 ? "月报-校区" : "周报-校区") + .head(StudentDormAttendanceDayReportExcelVO.class).build(); + WriteSheet writeSheet1 = EasyExcel.writerSheet(1, durationDays == 0 ? "日报-学段" : durationDays > 7 ? "月报-学段" : "周报-学段") + .head(StudentDormAttendanceDayReportExcelVO.class).build(); + WriteSheet writeSheet2 = EasyExcel.writerSheet(2, durationDays == 0 ? "日报-年级" : durationDays > 7 ? "月报-年级" : "周报-年级") + .head(StudentDormAttendanceDayReportExcelVO.class).build(); + WriteSheet writeSheet3 = EasyExcel.writerSheet(3, durationDays == 0 ? "日报-班级" : durationDays > 7 ? "月报-班级" : "周报-班级") + .head(StudentDormAttendanceDayReportExcelVO.class).build(); + excelWriter.write(campusExportDataList, writeSheet0); + excelWriter.write(sectionExportDataList, writeSheet1); + excelWriter.write(gradeExportDataList, writeSheet2); + excelWriter.write(classExportDataList, writeSheet3); + excelWriter.finish(); + + // 上传文件到媒资 + String fileUrl = com.yida.data.common.core.utils.FileUtil.uploadFileToMediaServer(uploadUrl, file); + redisService + .hset(CachePrefixConstant.ATTENDANCE_DAY_REPORT_DOWNLOAD, uuid, DownLoadAttendanceResultVO.builder() + .key(uuid) + .finish(1) + .filePath(fileUrl) + .totalNum(CollUtil.isEmpty(resultList) ? 100 : resultList.size()) + .currentNum(CollUtil.isEmpty(resultList) ? 100 : resultList.size()).build()); + + stopWatch.stop(); + log.info("导出考勤日报总共耗时: {}", stopWatch.getTotalTimeSeconds() + "秒"); + } catch (Exception e) { + e.printStackTrace(); + } finally { + //删除本地文件 + if (cn.hutool.core.io.FileUtil.exist(file)) { + cn.hutool.core.io.FileUtil.del(file); + } + } + } + + List dealSingleExcelData(String startAttendanceDate, String endAttendanceDate, String campusName, String sectionName, + String gradeName, String className, + List resultList) { + List singleDataList = new ArrayList<>(); + singleDataList.add(ObjectUtil.equals(startAttendanceDate, endAttendanceDate) ? startAttendanceDate + : (startAttendanceDate + " 至 " + endAttendanceDate)); + + singleDataList.add(campusName); + singleDataList.add(sectionName); + singleDataList.add(gradeName); + singleDataList.add(className); + //应该打卡人数 + Map> userMap = resultList.stream() + .collect(Collectors.groupingBy(AttendanceResult::getUserId)); + singleDataList.add(String.valueOf(userMap.size())); + + //实际打卡人数 + List dakaAttendanceResultList = resultList.stream() + .filter(a -> !(ObjectUtil.isNull(a.getStartStatus()) && ObjectUtil.isNull(a.getEndStatus()))) + .collect(Collectors.toList()); + Map> dakaUserMap = dakaAttendanceResultList.stream() + .collect(Collectors.groupingBy(AttendanceResult::getUserId)); + singleDataList.add(String.valueOf(dakaUserMap.size())); + + //请假人数 + ListUserRequestDTO requestDTO = new ListUserRequestDTO(); + requestDTO.setRequestType(UserTypeEnum.PARENT_USER_TYPE.getType()); + requestDTO.setUserIdList(resultList.stream().map(AttendanceResult::getUserId).collect(Collectors.toList())); + requestDTO + .setStartTime(LocalDateTimeUtil.parse(startAttendanceDate, "yyyy-MM-dd").toLocalDate().atTime(00, 00, 00)); + requestDTO.setEndTime(LocalDateTimeUtil.parse(endAttendanceDate, "yyyy-MM-dd").toLocalDate().atTime(23, 23, 59)); + List eduLeaveRequestUserVOList = remoteLeaveRequestService.findList(requestDTO) + .getData(); + Map> eduRequestMap = eduLeaveRequestUserVOList.stream() + .collect(Collectors.groupingBy(EduLeaveRequestUserVO::getUserId)); + singleDataList.add(String.valueOf(eduRequestMap.size())); + + //正常打卡人数 + List abnormalAttendanceResultList = resultList.stream().filter( + a -> ObjectUtil.equals(AttendanceModeTypeEnum.FIX.getValue(), a.getAttType()) ? !(ObjectUtil + .equals(AttendanceResultEnum.NORMAL.getValue(), a.getStartStatus()) && ObjectUtil + .equals(AttendanceResultEnum.NORMAL.getValue(), a.getEndStatus())) + : !ObjectUtil.equals(AttendanceResultEnum.NORMAL.getValue(), a.getStartStatus())).collect(Collectors.toList()); + Map> abnormalUserMap = abnormalAttendanceResultList.stream() + .collect(Collectors.groupingBy(AttendanceResult::getUserId)); + singleDataList.add(String.valueOf((int) (userMap.size() - abnormalUserMap.size()))); + + //旷宿人数 + List missAttendanceResultList = resultList.stream().filter( + a -> ObjectUtil.equals(AttendanceModeTypeEnum.FIX.getValue(), a.getAttType()) ? (ObjectUtil + .isNull(a.getStartStatus()) && ObjectUtil.isNull(a.getEndStatus())) + : ObjectUtil.isNull(a.getStartStatus())).collect(Collectors.toList()); + Map> missUserMap = missAttendanceResultList.stream() + .collect(Collectors.groupingBy(AttendanceResult::getUserId)); + + Integer missNum = 0; + if (missUserMap.size() > eduRequestMap.size()) { + missNum = missUserMap.size() - eduRequestMap.size(); + } + singleDataList.add(String.valueOf(missNum)); + + //晚归打卡人数 + List lateAttendanceResultList = resultList.stream().filter( + a -> ObjectUtil.equals(AttendanceResultEnum.LATE_DORM.getValue(), a.getStartStatus())).collect(Collectors.toList()); + Map> lateUserMap = lateAttendanceResultList.stream() + .collect(Collectors.groupingBy(AttendanceResult::getUserId)); + singleDataList.add(String.valueOf(lateUserMap.size())); + + //异常晚归打卡人数 + List abLateAttendanceResultList = resultList.stream().filter( + a -> ObjectUtil.equals(AttendanceResultEnum.AB_LATE_DORM.getValue(), a.getStartStatus())) + .collect(Collectors.toList()); + Map> abLateUserMap = lateAttendanceResultList.stream() + .collect(Collectors.groupingBy(AttendanceResult::getUserId)); + singleDataList.add(String.valueOf(abLateUserMap.size())); + + //出勤率 + singleDataList.add(String.format("%.2f", dakaUserMap.size() / (double) userMap.size())); + +// //应打卡次数 +// List freeModeList = resultList.stream() +// .filter(a -> ObjectUtil.equals(AttendanceModeTypeEnum.FREE.getValue(), a.getAttType())).collect( +// Collectors.toList()); +// +// List fixModeList = resultList.stream() +// .filter(a -> ObjectUtil.equals(AttendanceModeTypeEnum.FIX.getValue(), a.getAttType())).collect( +// Collectors.toList()); +// +// singleDataList.add(String.valueOf(freeModeList.size() + (fixModeList.size() * 2))); +// +// //实际打卡次数 +// List freeModeDakaList = freeModeList.stream() +// .filter(a -> ObjectUtil.isNotNull(a.getStartStatus())) +// .collect(Collectors.toList()); +// +// List fixModeStartDakaList = fixModeList.stream() +// .filter(a -> ObjectUtil.isNotNull(a.getStartStatus())) +// .collect(Collectors.toList()); +// +// List fixModeEndDakaList = fixModeList.stream() +// .filter(a -> ObjectUtil.isNotNull(a.getEndStatus())) +// .collect(Collectors.toList()); +// +// singleDataList +// .add(String.valueOf(freeModeDakaList.size() + fixModeStartDakaList.size() + fixModeEndDakaList.size())); +// +// //正常打卡次数 +// List freeModeNormalList = freeModeList.stream() +// .filter(a -> ObjectUtil.equals(AttendanceResultEnum.NORMAL.getValue(), a.getStartStatus())) +// .collect(Collectors.toList()); +// +// List fixModeStartNormalList = fixModeList.stream() +// .filter(a -> ObjectUtil.equals(AttendanceResultEnum.NORMAL.getValue(), a.getStartStatus())) +// .collect(Collectors.toList()); +// +// List fixModeEndNormalList = fixModeList.stream() +// .filter(a -> ObjectUtil.equals(AttendanceResultEnum.NORMAL.getValue(), a.getEndStatus())) +// .collect(Collectors.toList()); +// singleDataList +// .add(String +// .valueOf(freeModeNormalList.size() + fixModeStartNormalList.size() + fixModeEndNormalList.size())); +// +// //旷宿次数 +// List freeModeMissList = freeModeList.stream() +// .filter(a -> ObjectUtil.isNull(a.getStartStatus())) +// .collect(Collectors.toList()); +// +// List fixModeStartMissList = fixModeList.stream() +// .filter(a -> ObjectUtil.isNull(a.getStartStatus())) +// .collect(Collectors.toList()); +// +// List fixModeEndMissList = fixModeList.stream() +// .filter(a -> ObjectUtil.isNull(a.getEndStatus())) +// .collect(Collectors.toList()); +// +// singleDataList +// .add(String +// .valueOf(freeModeMissList.size() + fixModeStartMissList.size() + fixModeEndMissList.size())); +// +// //晚归打卡次数 +// List freeModeLateList = freeModeList.stream() +// .filter(a -> ObjectUtil.equals(AttendanceResultEnum.LATE_DORM, a.getStartStatus())) +// .collect(Collectors.toList()); +// singleDataList.add(String.valueOf(freeModeLateList.size())); +// +// //异常晚归打卡次数 +// List freeModeAbLateList = freeModeList.stream() +// .filter(a -> ObjectUtil.equals(AttendanceResultEnum.AB_LATE_DORM, a.getStartStatus())) +// .collect(Collectors.toList()); +// singleDataList.add(String.valueOf(freeModeAbLateList.size())); +// +// //打卡率 +// singleDataList.add(String.format("%.2f", +// (freeModeDakaList.size() + fixModeStartDakaList.size() + fixModeEndDakaList.size()) +// / (double) freeModeList.size() + (fixModeList.size() * 2))); + + return singleDataList; + } + + @Async + void dealAttendanceReultData(AttendanceCountPageDTO dto, String uuid) { + String fileName = FileUtil.getLocalUploadAddress() + uuid + ".xls"; + File file = new File(fileName); + try { + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); + //查询考勤结果 + //查询权限对应的班级的学生 + List> exportDataList = new ArrayList<>(); + List> exportDataListSheet0 = new ArrayList<>(); + List userIdList = dto.getUserIdList(); + List studentList = new ArrayList<>(); + List resultList = new ArrayList<>(); + if (CollUtil.isNotEmpty(studentList)) { + userIdList = studentList.stream().map(EduStudent::getId) + .collect(Collectors.toList()); + } + if (CollUtil.isNotEmpty(userIdList)) { + resultList = list(Wrappers.lambdaQuery(new AttendanceResult()) + .in(AttendanceResult::getUserId, userIdList) + .eq(AttendanceResult::getUserType, dto.getType()) + .eq(ObjectUtil.isNotNull(dto.getRuleId()), AttendanceResult::getRuleId, dto.getRuleId()) + .between(AttendanceResult::getAttendanceDate, dto.getStartDate(), dto.getEndDate()) + .orderByAsc(AttendanceResult::getUserId)); + + Map> resultMap = resultList.stream() + .collect(Collectors.groupingBy(AttendanceResult::getUserId)); + + if (CollUtil.isNotEmpty(resultList)) { + for (int i = 0; i < resultList.size(); i++) { + AttendanceResult result = resultList.get(i); + EduStudent student = commonService.getStudentById(result.getUserId()); + if (ObjectUtil.isNull(student)) { + continue; + } + //更新进度缓存 + redisService + .hset(CachePrefixConstant.STUDENT_DORM_ATTENDANCE_RESULT_DOWNLOAD, uuid, + DownLoadAttendanceResultVO.builder() + .key(uuid) + .finish(0) + .totalNum(resultList.size() + resultMap.size()) + .currentNum(i + 1).build()); + //封装单行数据 + List singleDataList = new ArrayList<>(); + + singleDataList.add(student.getStuName()); + singleDataList.add(student.getStuNumber()); + singleDataList.add(student.getCampusName()); + singleDataList.add(student.getSectionName()); + singleDataList.add(student.getGradeName()); + singleDataList.add(student.getClassName()); + AttendanceRuleVO rule = attendanceRuleService.getRule(result.getRuleId()); + singleDataList.add(rule.getName()); + singleDataList.add(result.getAttendanceDate().toString()); + singleDataList.add(FebsUtil.convertWeekCN(result.getAttendanceDate().getDayOfWeek().getValue())); + singleDataList.add( + rule.getTimeDTOList().get(0).getStartTime() + "-" + rule.getTimeDTOList().get(0).getEndTime() + "-" + + rule.getTimeDTOList().get(0).getLastTime()); + singleDataList.add(ObjectUtil.isNull(result.getStartStatus()) ? "旷宿" + : AttendanceResultEnum.getName(result.getStartStatus())); + singleDataList + .add(ObjectUtil.isNull(result.getStartRealTime()) ? "-" : result.getStartRealTime().toString()); + exportDataList.add(singleDataList); + } + } + + for (Entry> entry : resultMap.entrySet()) { + Long r = entry.getKey(); + List n = entry.getValue(); + + DownLoadAttendanceResultVO vo = (DownLoadAttendanceResultVO) redisService + .hget(CachePrefixConstant.STUDENT_DORM_ATTENDANCE_RESULT_DOWNLOAD, uuid); + + redisService + .hset(CachePrefixConstant.STUDENT_DORM_ATTENDANCE_RESULT_DOWNLOAD, uuid, + DownLoadAttendanceResultVO.builder() + .key(uuid) + .finish(0) + .totalNum(resultList.size() + resultMap.size()) + .currentNum(vo.getCurrentNum() + 1).build()); + + EduStudent student = commonService.getStudentById(r); + if (ObjectUtil.isNull(student)) { + continue; + } + //封装单行数据 + List singleDataList = new ArrayList<>(); + + singleDataList.add(student.getStuName()); + singleDataList.add(student.getStuNumber()); + singleDataList.add(student.getCampusName()); + singleDataList.add(student.getSectionName()); + singleDataList.add(student.getGradeName()); + singleDataList.add(student.getClassName()); + + int missDay = n.stream().filter(k -> ObjectUtil.isNull(k.getStartStatus())).collect(Collectors.toList()) + .size(); + int normalDay = n.stream() + .filter(k -> ObjectUtil.equals(AttendanceResultEnum.NORMAL.getValue(), k.getStartStatus())) + .collect(Collectors.toList()).size(); + int lateDay = n.stream() + .filter(k -> ObjectUtil.equals(AttendanceResultEnum.LATE_DORM.getValue(), k.getStartStatus())) + .collect(Collectors.toList()).size(); + int abLateDay = n.stream() + .filter(k -> ObjectUtil.equals(AttendanceResultEnum.AB_LATE_DORM.getValue(), k.getStartStatus())) + .collect(Collectors.toList()).size(); + + singleDataList.add(String.valueOf(n.size())); + singleDataList.add(String.valueOf(normalDay + lateDay + abLateDay)); + singleDataList.add(String.valueOf(normalDay)); + singleDataList.add(String.valueOf(missDay)); + singleDataList.add(String.valueOf(lateDay)); + singleDataList.add(String.valueOf(abLateDay)); + exportDataListSheet0.add(singleDataList); + } + + } + // 导出数据 + ExcelWriter excelWriter = EasyExcel.write(file).excelType(ExcelTypeEnum.XLSX).build(); + WriteSheet writeSheet0 = EasyExcel.writerSheet(0, "考勤汇总").head(StudentDormAttendanceResultTotalExcelVO.class).build(); + WriteSheet writeSheet1 = EasyExcel.writerSheet(1, "考勤详情").head(StudentDormAttendanceResultExcelVO.class).build(); + excelWriter.write(exportDataListSheet0, writeSheet0); + excelWriter.write(exportDataList, writeSheet1); + excelWriter.finish(); +// EasyExcel.write(file) +// .excelType(ExcelTypeEnum.XLSX) +// // 这里放入动态头 +// .head(StudentDormAttendanceResultExcelVO.class).sheet("学生宿舍考勤") +// // 当然这里数据也可以用 List> 去传入 +// .doWrite(exportDataList); + // 上传文件到媒资 + String fileUrl = com.yida.data.common.core.utils.FileUtil.uploadFileToMediaServer(uploadUrl, file); + redisService + .hset(CachePrefixConstant.STUDENT_DORM_ATTENDANCE_RESULT_DOWNLOAD, uuid, DownLoadAttendanceResultVO.builder() + .key(uuid) + .finish(1) + .filePath(fileUrl) + .totalNum(CollUtil.isEmpty(resultList) ? 100 : resultList.size()) + .currentNum(CollUtil.isEmpty(resultList) ? 100 : resultList.size()).build()); + } catch (Exception e) { + e.printStackTrace(); + } finally { + //删除本地文件 + if (cn.hutool.core.io.FileUtil.exist(file)) { + cn.hutool.core.io.FileUtil.del(file); + } + } + } + + @Override + public IPage listResultDetailPage(AttendanceCountPageDTO dto) { + Long topDeptId = FebsUtil.getTopDeptId(); + Map> staffMap = new HashMap<>(); + Map> studentMap = new HashMap<>(); + List userIdList = new ArrayList<>(); + //先查找出学生或者教职工 + if (ObjectUtil.equals(dto.getType(), AttendanceUserTypeEnum.STAFF.getValue())) { + ListStaffDTO param = new ListStaffDTO(); + param.setSchoolId(topDeptId); + param.setMobile(dto.getNameOrNumber()); + param.setDeptId(dto.getDeptId()); + List staffList = remoteStaffService.listStaff(param).getData(); + + param.setMobile(null); + param.setName(dto.getNameOrNumber()); + List staffListOth = remoteStaffService.listStaff(param).getData(); + staffList.addAll(staffListOth); + + if (CollUtil.isNotEmpty(staffList)) { + staffMap = staffList.stream().collect(Collectors.groupingBy(EduStaff::getId)); + userIdList = staffList.stream().map(EduStaff::getId) + .collect(Collectors.toList()); + } else { + return new Page<>(); + } + } else { + //查询权限对应的班级的学生 + List studentList = new ArrayList<>(); + String rolePerms = FebsUtil.getCurrentUser().getRolePerms(); + if (rolePerms.contains(RoleEnum.ROLE_SCHOOL_PRINCIPAL.getValue())) { + ListStudentDTO param = new ListStudentDTO(); + param.setSchoolId(topDeptId); + param.setCampusId(dto.getCampusId()); + param.setSectionId(dto.getSectionId()); + param.setGradeId(dto.getGradeId()); + param.setClassId(dto.getClassId()); + param.setStuName(dto.getNameOrNumber()); + param.setIsQueryParent(false); + param.setIsQuerySchoolName(false); + studentList = remoteStudentService.listStudent(param).getData(); + } else { + if (ObjectUtil.isNull(dto.getCampusId()) && ObjectUtil.isNull(dto.getSectionId()) && ObjectUtil + .isNull(dto.getGradeId()) && ObjectUtil.isNull(dto.getClassId())) { + List classIdList = remoteStaffService.listClassIdByStaffId().getData(); + ListStudentDTO param = new ListStudentDTO(); + param.setClassIds(classIdList); + param.setIsQueryParent(false); + param.setIsQuerySchoolName(false); + param.setStuName(dto.getNameOrNumber()); + studentList = remoteStudentService.listStudent(param).getData(); + } else { + ListStudentDTO param = new ListStudentDTO(); + param.setSchoolId(topDeptId); + param.setCampusId(dto.getCampusId()); + param.setSectionId(dto.getSectionId()); + param.setGradeId(dto.getGradeId()); + param.setClassId(dto.getClassId()); + param.setStuName(dto.getNameOrNumber()); + param.setIsQueryParent(false); + param.setIsQuerySchoolName(false); + studentList = remoteStudentService.listStudent(param).getData(); + } + } + if (CollUtil.isNotEmpty(studentList)) { + studentMap = studentList.stream().collect(Collectors.groupingBy(EduStudent::getId)); + userIdList = studentList.stream().map(EduStudent::getId) + .collect(Collectors.toList()); + } else { + return new Page<>(); + } + } + dto.setUserIdList(userIdList); + //分页查询出人员 + IPage attdanceResultDetailVOIPage = baseMapper.listUserPage(dto.toPage(), dto); + + if (CollUtil.isEmpty(attdanceResultDetailVOIPage.getRecords())) { + return new Page<>(); + } + AttendanceCountPageDTO newParam = new AttendanceCountPageDTO(); + newParam.setStatus(dto.getStatus()); + newParam.setRuleId(dto.getRuleId()); + newParam.setUserIdList(attdanceResultDetailVOIPage.getRecords().stream().map(AttdanceResultDetailVO::getUserId).collect( + Collectors.toList())); + newParam.setStartDate(dto.getStartDate()); + newParam.setEndDate(dto.getEndDate()); + + List attdanceResultDetailVOS = baseMapper.listResultDetailPage(newParam); + + for (AttdanceResultDetailVO attdanceResultDetailVO : attdanceResultDetailVOS) { + AttendanceRuleVO rule = attendanceRuleService.getRule(attdanceResultDetailVO.getRuleId()); + AttendanceRuleTime ruleTime = attendanceRuleTimeService.getById(attdanceResultDetailVO.getRuleTimeId()); + attdanceResultDetailVO.setRuleName(ObjectUtil.isNull(rule) ? "未知规则" : rule.getName()); + attdanceResultDetailVO.setModelType(ObjectUtil.isNull(rule) ? 0 : rule.getType()); + attdanceResultDetailVO + .setRuleTimeName(ObjectUtil.isNull(ruleTime) ? "未知时段" : (ruleTime.getStartTime() + "-" + ruleTime.getEndTime())); + if (ObjectUtil.equals(dto.getType(), AttendanceUserTypeEnum.STAFF.getValue())) { + //教职工 + List staffList = staffMap.get(attdanceResultDetailVO.getUserId()); + attdanceResultDetailVO.setName(staffList.get(0).getName()); + attdanceResultDetailVO.setNumber(staffList.get(0).getMobile()); + List staffDept = commonService.getStaffById(attdanceResultDetailVO.getUserId()).getStaffDept(); + attdanceResultDetailVO + .setDeptName( + CollUtil.isEmpty(staffDept) ? commonService.getStaffById(attdanceResultDetailVO.getUserId()) + .getSchoolName() + : staffDept.get(0).getDeptName()); + } else { + //学生 + attdanceResultDetailVO.setName(studentMap.get(attdanceResultDetailVO.getUserId()).get(0).getStuName()); + attdanceResultDetailVO.setNumber(studentMap.get(attdanceResultDetailVO.getUserId()).get(0).getStuNumber()); + attdanceResultDetailVO + .setDeptName(studentMap.get(attdanceResultDetailVO.getUserId()).get(0).getGradeName() + "-" + studentMap + .get(attdanceResultDetailVO.getUserId()).get(0).getClassName()); + } + + //判断是否考勤 + List specialDateList = attendanceRuleSpecialDateService + .list(Wrappers.lambdaQuery(new AttendanceRuleSpecialDate()) + .eq(AttendanceRuleSpecialDate::getRuleId, attdanceResultDetailVO.getRuleId())); + + if (rule.getWeek().contains(LocalDate.now().getDayOfWeek().getValue() + "")) { + //在打卡时间段内,1判断是否含有特殊日期,2判断是否请假 + if (CollUtil.isNotEmpty(specialDateList)) { + List noNeedSpDateList = specialDateList.stream() + .filter(date -> date.getType().equals(0)) + .collect(Collectors.toList()); + + if (CollUtil.isNotEmpty(noNeedSpDateList)) { + attdanceResultDetailVO.setNeedAttendance(0); + } else { + //判断请假 + ListUserRequestDTO requestDTO = new ListUserRequestDTO(); + requestDTO.setRequestType(dto.getType()); + requestDTO.setUserIdList(Arrays.asList(attdanceResultDetailVO.getUserId())); + requestDTO.setStartTime(attdanceResultDetailVO.getAttendanceDate().atTime(ruleTime.getStartTime())); + requestDTO.setEndTime(attdanceResultDetailVO.getAttendanceDate().atTime(ruleTime.getEndTime())); + List eduLeaveRequestUserVOList = remoteLeaveRequestService.findList(requestDTO) + .getData(); + if (CollUtil.isNotEmpty(eduLeaveRequestUserVOList)) { + attdanceResultDetailVO.setNeedAttendance(1); + } else { + attdanceResultDetailVO.setNeedAttendance(0); + } + } + } else { + attdanceResultDetailVO.setNeedAttendance(0); + } + } else { + //未在打卡时间段内,判断是否又特殊日期需要打卡 + if (CollUtil.isNotEmpty(specialDateList)) { + List needSpDateList = specialDateList.stream() + .filter(date -> date.getType().equals(1)) + .collect(Collectors.toList()); + if (CollUtil.isNotEmpty(needSpDateList)) { + attdanceResultDetailVO.setNeedAttendance(0); + } else { + attdanceResultDetailVO.setNeedAttendance(1); + } + } else { + attdanceResultDetailVO.setNeedAttendance(1); + } + } + } + attdanceResultDetailVOIPage.setRecords(attdanceResultDetailVOS); + return attdanceResultDetailVOIPage; + } + + @Override + public List getUserAttendanceStatusByMonth(AttendanceStatusByMonthDTO dto) { + List dateStatusVOList = new ArrayList<>(); + if (redisService.hasKey( + CachePrefixConstant.ATTENDANCE_DATE_STATUS + dto.getUserType() + dto.getUserId() + dto.getAttendanceStartDate() + dto + .getAttendanceEndDate())) { + String s = (String) redisService.get( + CachePrefixConstant.ATTENDANCE_DATE_STATUS + dto.getUserType() + dto.getUserId() + dto.getAttendanceStartDate() + + dto + .getAttendanceEndDate()); + dateStatusVOList = JSON.parseArray(s, DateStatusVO.class); + } else { + dateStatusVOList = initStatusByDate(Collections.singletonList(dto.getUserId()), dto.getUserType(), + dto.getAttendanceStartDate(), + dto.getAttendanceEndDate()); + if (CollUtil.isNotEmpty(dateStatusVOList)) { + redisService.set( + CachePrefixConstant.ATTENDANCE_DATE_STATUS + dto.getUserType() + dto.getUserId() + dto + .getAttendanceStartDate() + + dto + .getAttendanceEndDate(), JSONObject.toJSON(dateStatusVOList).toString(), 300L); + } + } + + return dateStatusVOList; + } + + @Override + public List getUserAttendanceResultByDay(AttendanceResultByDayDTO attendanceResultByDayDTO) { + + List attendanceResultByDayVOList = new ArrayList<>(); + //1:查询用户对应考勤规则 + List ruleVOList = attendanceRuleService + .findByUserIdAndUserType(attendanceResultByDayDTO.getUserId(), attendanceResultByDayDTO.getUserType()); + for (AttendanceRuleVO attendanceRuleVO : ruleVOList) { + //查询考勤结果 + UserAttendanceResultByDayVO attendanceResultByDayVO = new UserAttendanceResultByDayVO(); + attendanceResultByDayVO.setRule(attendanceRuleVO); + + List resultList = list(Wrappers.lambdaQuery(new AttendanceResult()) + .eq(AttendanceResult::getAttendanceDate, attendanceResultByDayDTO.getAttendanceDate()) + .eq(AttendanceResult::getRuleId, attendanceRuleVO.getId()) + .eq(AttendanceResult::getUserId, attendanceResultByDayDTO.getUserId())); + + for (AttendanceResult result : resultList) { + if (ObjectUtil.isNull(result.getStartStatus())) { + ListUserRequestDTO requestDTO = new ListUserRequestDTO(); + requestDTO.setRequestType(attendanceResultByDayDTO.getUserType()); + requestDTO.setUserIdList(Collections.singletonList(result.getUserId())); + requestDTO.setStartTime(attendanceResultByDayDTO.getAttendanceDate().atTime(result.getStartStiTime())); + requestDTO.setEndTime(attendanceResultByDayDTO.getAttendanceDate().atTime(result.getEndStiTime())); + List requestUserVOList = remoteLeaveRequestService.findList(requestDTO).getData(); + if (CollUtil.isNotEmpty(requestUserVOList)) { + result.setStartStatus(6); + } + } + } + + attendanceResultByDayVO.setResult(resultList); + //计算累计时长 + Long seconds = new Long(0L); + for (AttendanceResult result : resultList) { + if (ObjectUtil.isNotNull(result.getStartRealTime()) && ObjectUtil.isNotNull(result.getEndRealTime())) { + seconds += Duration.between(result.getStartRealTime(), result.getEndRealTime()).getSeconds(); + } + } + attendanceResultByDayVO.setAttendanceTime(seconds / 60); + attendanceResultByDayVOList.add(attendanceResultByDayVO); + } + return attendanceResultByDayVOList; + } + + @Override + public UserAttendanceResultByTimeSlotVO getUserAttendanceResultByTimeSlot(AttendanceResultByStartAndEndTimeDTO dto) { + + List resultList = list(Wrappers.lambdaQuery(new AttendanceResult()) + .eq(AttendanceResult::getUserId, dto.getUserId()) + .eq(AttendanceResult::getUserType, dto.getUserType()) + .between(AttendanceResult::getAttendanceDate, dto.getAttendanceStartDate(), dto.getAttendanceEndDate())); + + Map> totalMap = resultList.stream() + .collect(Collectors.groupingBy(AttendanceResult::getAttendanceDate)); + //总天数 + Integer totalDays = totalMap.size(); + //异常天数 + AtomicReference abNormalDays = new AtomicReference<>(0); + //正常天数 + AtomicReference normalDays = new AtomicReference<>(0); + //迟到次数 + AtomicReference lateTimes = new AtomicReference<>(0); + //早退次数 + AtomicReference leaveTimes = new AtomicReference<>(0); + //缺卡次数 + AtomicReference missTimes = new AtomicReference<>(0); + + List lateList = new ArrayList<>(); + + List leaveList = new ArrayList<>(); + + List missList = new ArrayList<>(); + + totalMap.forEach((k, v) -> { + + //按考勤规则 + Map> collect = v.stream().collect(Collectors.groupingBy(AttendanceResult::getRuleId)); + + collect.forEach((r, n) -> { + //判断规则类型 + AttendanceRuleVO ruleVO = (AttendanceRuleVO) redisService + .hget(CachePrefixConstant.ATTENDANCE_RULE_DATA, String.valueOf(r)); + if (ObjectUtil.isNull(ruleVO)) { + ruleVO = attendanceRuleService.getRule(r); + if (ObjectUtil.isNotNull(ruleVO)) { + redisService.hset(CachePrefixConstant.ATTENDANCE_RULE_DATA, String.valueOf(r), ruleVO); + } + } + if (ObjectUtil.equals(AttendanceModeTypeEnum.FREE.getValue(), ruleVO.getType())) { + //自由打卡 + UserAttendanceResultDayAndNumVO missVO = new UserAttendanceResultDayAndNumVO(); + //当日上班缺卡 + List startMissList = v.stream().filter( + s -> s.getStartStatus() == null).collect( + Collectors.toList()); + + if (startMissList.size() > 0) { + abNormalDays.getAndSet(abNormalDays.get() + 1); + } else { + normalDays.getAndSet(normalDays.get() + 1); + } + int missNum = 0; + if (startMissList.size() > 0) { + missTimes.getAndSet(missTimes.get() + startMissList.size()); + missVO.setAttendanceDate(k); + missNum += startMissList.size(); + } + missVO.setNum(missNum); + if (ObjectUtil.isNotNull(missVO)) { + missList.add(missVO); + } + } else { + UserAttendanceResultDayAndNumVO lateVO = new UserAttendanceResultDayAndNumVO(); + UserAttendanceResultDayAndNumVO leaveVO = new UserAttendanceResultDayAndNumVO(); + UserAttendanceResultDayAndNumVO missVO = new UserAttendanceResultDayAndNumVO(); + //当日迟到 + List currentLateList = v.stream().filter( + s -> ObjectUtil.equals(AttendanceResultEnum.ABNORMAL.getValue(), s.getStartStatus())).collect( + Collectors.toList()); + //当日早退 + List currentLeaveList = v.stream().filter( + s -> ObjectUtil.equals(AttendanceResultEnum.ABNORMAL.getValue(), s.getEndStatus())).collect( + Collectors.toList()); + //当日上班缺卡 + List startMissList = v.stream().filter( + s -> s.getStartStatus() == null).collect( + Collectors.toList()); + //当日下班缺卡 + List endMissList = v.stream().filter( + s -> s.getEndStatus() == null).collect( + Collectors.toList()); + + if (currentLateList.size() > 0 || currentLeaveList.size() > 0 || startMissList.size() > 0 + || endMissList.size() > 0) { + abNormalDays.getAndSet(abNormalDays.get() + 1); + } else { + normalDays.getAndSet(normalDays.get() + 1); + } + + if (currentLateList.size() > 0) { + lateTimes.getAndSet(lateTimes.get() + currentLateList.size()); + lateVO.setAttendanceDate(k); + lateVO.setNum(currentLateList.size()); + lateList.add(lateVO); + } + if (currentLeaveList.size() > 0) { + leaveTimes.getAndSet(leaveTimes.get() + currentLeaveList.size()); + leaveVO.setAttendanceDate(k); + leaveVO.setNum(currentLeaveList.size()); + leaveList.add(leaveVO); + } + int missNum = 0; + if (startMissList.size() > 0) { + missTimes.getAndSet(missTimes.get() + startMissList.size()); + missVO.setAttendanceDate(k); + missNum += startMissList.size(); + } + if (endMissList.size() > 0) { + missTimes.getAndSet(missTimes.get() + endMissList.size()); + missVO.setAttendanceDate(k); + missNum += endMissList.size(); + } + missVO.setNum(missNum); + if (ObjectUtil.isNotNull(missVO)) { + missList.add(missVO); + } + } + }); + }); + + //请假 + ListUserRequestDTO requestDTO = new ListUserRequestDTO(); + requestDTO.setRequestType(dto.getUserType()); + requestDTO.setUserIdList(Collections.singletonList(dto.getUserId())); + requestDTO.setStartTime(dto.getAttendanceStartDate().atTime(LocalTime.of(00, 00, 01))); + requestDTO.setEndTime(dto.getAttendanceEndDate().atTime(LocalTime.of(23, 59, 59))); + List data = remoteLeaveRequestService.findList(requestDTO).getData(); + + return UserAttendanceResultByTimeSlotVO.builder().totalDays(totalDays) + .normalDays(normalDays.get()) + .abNormalDays(abNormalDays.get()) + .lateList(lateList).leaveList(leaveList).missList(missList).lateTimes(lateTimes.get()).leaveTimes(leaveTimes.get()) + .missTimes(missTimes.get()).requestTimes(data.size()).build(); + } + + @Override + public List findTotalUserStatus(ManageListUserDTO dto) { + if (redisService.hasKey( + CachePrefixConstant.ATTENDANCE_MANAGE_DATE_STATUS + dto.getSearchUserType() + dto.getUserId() + dto + .getAttendanceStartDate() + dto + .getAttendanceEndDate())) { + String s = (String) redisService.get( + CachePrefixConstant.ATTENDANCE_MANAGE_DATE_STATUS + dto.getSearchUserType() + dto.getUserId() + dto + .getAttendanceStartDate() + + dto + .getAttendanceEndDate()); + List dateStatusVOList = JSON.parseArray(s, DateStatusVO.class); + + return dateStatusVOList; + } + + //查询管理人员 + AttendanceRuleAdmin param = new AttendanceRuleAdmin(); + param.setUserType(dto.getSearchUserType()); + param.setStaffId(dto.getUserId()); + List adminList = attendanceRuleAdminService.findList(param); + + if (CollUtil.isEmpty(adminList)) { + log.info("【】职工无管理人员", dto.getUserId()); + return new ArrayList<>(); + } + //排除未启用规则 + List deptIdList = new ArrayList<>(); + for (AttendanceRuleAdmin admin : adminList) { + AttendanceRule attendanceRule = attendanceRuleService.getById(admin.getRuleId()); + if (ObjectUtil.equals(EnableStatusEnum.ENABLE_STATUS.getStatus(), attendanceRule.getStatus())) { + deptIdList.add(admin.getDeptId()); + } + } + if (CollUtil.isEmpty(deptIdList)) { + log.info("【】职工无管理人员", dto.getUserId()); + return new ArrayList<>(); + } + //查询部门下的人员 + List userIdList = initUserIdList(adminList, dto.getSearchUserType()); + + List dateStatusVOList = initStatusByDate(userIdList, dto.getSearchUserType(), dto.getAttendanceStartDate(), + dto.getAttendanceEndDate()); + + if (CollUtil.isNotEmpty(dateStatusVOList)) { + redisService.set( + CachePrefixConstant.ATTENDANCE_MANAGE_DATE_STATUS + dto.getSearchUserType() + dto.getUserId() + dto + .getAttendanceStartDate() + + dto + .getAttendanceEndDate(), JSONObject.toJSON(dateStatusVOList).toString()); + } + + return dateStatusVOList; + } + + @Override + public List findManageListUserVO(ManageListUserDTO dto) { + List returnList = new ArrayList<>(); + //查询用户管理部门 + AttendanceRuleAdmin param = new AttendanceRuleAdmin(); + param.setUserType(dto.getSearchUserType()); + param.setStaffId(dto.getUserId()); + List adminList = attendanceRuleAdminService.findList(param); + + Map> adminMap = adminList.stream() + .collect(Collectors.groupingBy(AttendanceRuleAdmin::getDeptId)); + adminMap.forEach((k, v) -> { + ManageListUserVO manageListUserVO = new ManageListUserVO(); + if (ObjectUtil.equals(UserTypeEnum.PARENT_USER_TYPE.getType(), dto.getSearchUserType())) { + //部门信息 + if (k > 0) { + EduUserDept userDept = commonService.getUserDept(k); + if (ObjectUtil.isNotNull(userDept)) { + manageListUserVO.setDeptName(userDept.getDeptName()); + manageListUserVO.setDeptType(userDept.getDeptType()); + manageListUserVO.setDeptId(userDept.getDeptId()); + } + } else { + //学校部门 + Dept dept = commonService.getDept(-k); + if (ObjectUtil.isNotNull(dept)) { + manageListUserVO.setDeptName(dept.getDeptName()); + manageListUserVO.setDeptId(dept.getDeptId()); + } + } + + } else { + //部门信息 + Dept dept = commonService.getDept(k); + if (ObjectUtil.isNotNull(dept)) { + manageListUserVO.setDeptName(dept.getDeptName()); + manageListUserVO.setDeptId(dept.getDeptId()); + } + } + List userIdList = new ArrayList<>(); + //正常数据 + Map> normalMap = new HashMap<>(); + Map> abNormalMap = new HashMap<>(); + Map> lateMap = new HashMap<>(); + Map> leaveMap = new HashMap<>(); + Map> missMap = new HashMap<>(); + + for (AttendanceRuleAdmin admin : v) { + AttendanceRule attendanceRule = attendanceRuleService.getById(admin.getRuleId()); + if (ObjectUtil.equals(EnableStatusEnum.NOT_ENABLE_STATUS.getStatus(), attendanceRule.getStatus())) { + continue; + } + List timeList = attendanceRuleTimeService.list(Wrappers.lambdaQuery(new AttendanceRuleTime()) + .eq(AttendanceRuleTime::getRuleId, attendanceRule.getId())); + + if (CollUtil.isEmpty(timeList)) { + continue; + } + userIdList.addAll(initUserIdList(Arrays.asList(admin), dto.getSearchUserType())); + + if (CollUtil.isNotEmpty(userIdList)) { + List studentResultList = list(Wrappers.lambdaQuery(new AttendanceResult()) + .eq(AttendanceResult::getRuleId, admin.getRuleId()) + .between(AttendanceResult::getAttendanceDate, dto.getAttendanceStartDate(), dto.getAttendanceEndDate()) + .eq(AttendanceResult::getUserType, dto.getSearchUserType()) + .in(AttendanceResult::getUserId, userIdList)); + //正常数据 + normalMap.putAll(studentResultList.stream().filter( + attendanceResult -> ObjectUtil.equals(AttendanceModeTypeEnum.FIX.getValue(), attendanceRule.getType()) ? ( + ObjectUtil.equals(AttendanceResultEnum.NORMAL.getValue(), attendanceResult.getStartStatus()) + && ObjectUtil.equals(AttendanceResultEnum.NORMAL.getValue(), attendanceResult.getEndStatus())) + : ObjectUtil.equals(AttendanceResultEnum.NORMAL.getValue(), attendanceResult.getStartStatus())) + .collect(Collectors.groupingBy(AttendanceResult::getUserId))); + + //异常数据 + abNormalMap.putAll(studentResultList.stream().filter( + attendanceResult -> ObjectUtil.equals(AttendanceModeTypeEnum.FIX.getValue(), attendanceRule.getType()) + ? (!(ObjectUtil.equals(AttendanceResultEnum.NORMAL.getValue(), attendanceResult.getStartStatus()) + && ObjectUtil.equals(AttendanceResultEnum.NORMAL.getValue(), attendanceResult.getEndStatus()))) + : !ObjectUtil.equals(AttendanceResultEnum.NORMAL.getValue(), attendanceResult.getStartStatus())) + .collect(Collectors.groupingBy(AttendanceResult::getUserId))); + + //迟到数据 + lateMap.putAll(studentResultList.stream().filter( + attendanceResult -> ObjectUtil.equals(AttendanceModeTypeEnum.FIX.getValue(), attendanceRule.getType()) + && ObjectUtil.equals(AttendanceResultEnum.ABNORMAL.getValue(), attendanceResult.getStartStatus())) + .collect(Collectors.groupingBy(AttendanceResult::getUserId))); + + //早退数据 + leaveMap.putAll(studentResultList.stream().filter( + attendanceResult -> ObjectUtil.equals(AttendanceModeTypeEnum.FIX.getValue(), attendanceRule.getType()) + && ObjectUtil.equals(AttendanceResultEnum.ABNORMAL.getValue(), attendanceResult.getEndStatus())) + .collect(Collectors.groupingBy(AttendanceResult::getUserId))); + + //缺卡数据 + missMap.putAll(studentResultList.stream().filter( + attendanceResult -> ObjectUtil.equals(AttendanceModeTypeEnum.FREE.getValue(), attendanceRule.getType()) + ? ObjectUtil.equals(null, attendanceResult.getStartStatus()) + : (ObjectUtil.equals(null, attendanceResult.getStartStatus()) || ObjectUtil + .equals(null, attendanceResult.getEndStatus()))) + .collect(Collectors.groupingBy(AttendanceResult::getUserId))); + + } + manageListUserVO.setTotalNum(userIdList.stream().distinct().collect(Collectors.toList()).size()); + manageListUserVO.setNormalNum(normalMap.size()); + + manageListUserVO.setLateUserNum(lateMap.size()); + manageListUserVO.setLeaveUserNum(leaveMap.size()); + + //TODO 请假人数 + ListUserRequestDTO requestDTO = new ListUserRequestDTO(); + requestDTO.setRequestType(dto.getSearchUserType()); + requestDTO.setUserIdList(userIdList); + requestDTO.setStartTime(dto.getAttendanceStartDate().atTime(timeList.get(0).getStartTime())); + requestDTO.setEndTime(dto.getAttendanceEndDate().atTime(timeList.get(0).getEndEffectiveEndTime())); + List leaveRequestUserVOList = remoteLeaveRequestService.findList(requestDTO).getData(); + manageListUserVO.setRequestUserNum( + leaveRequestUserVOList.stream().collect(Collectors.groupingBy(EduLeaveRequestUserVO::getUserId)).size()); + + if (leaveRequestUserVOList.size() >= missMap.size()) { + manageListUserVO.setMissUserNum(0); + } else { + manageListUserVO.setMissUserNum(missMap.size() - leaveRequestUserVOList.size()); + } + if (leaveRequestUserVOList.size() >= abNormalMap.size()) { + manageListUserVO.setAbNormalNum(0); + } else { + manageListUserVO.setAbNormalNum(abNormalMap.size() - leaveRequestUserVOList.size()); + } + + } + returnList.add(manageListUserVO); + }); + + return returnList; + } + + @Override + public cn.hutool.json.JSONObject findManageListUserDetailVO(ManageListUserDTO dto) { + //管理人员 + List userIdList = new ArrayList<>(); + if (ObjectUtil.isNull(dto.getDeptId())) { + AttendanceRuleAdmin param = new AttendanceRuleAdmin(); + param.setUserType(dto.getSearchUserType()); + param.setStaffId(dto.getUserId()); + List adminList = attendanceRuleAdminService.findList(param); + + if (ObjectUtil.isNotNull(dto.getRuleId())) { + adminList = adminList.stream() + .filter(attendanceRuleAdmin -> attendanceRuleAdmin.getRuleId().equals(dto.getRuleId())) + .collect(Collectors.toList()); + } + userIdList = initUserIdList(adminList, dto.getSearchUserType()); + } else { + if (ObjectUtil.equals(UserTypeEnum.PARENT_USER_TYPE.getType(), dto.getSearchUserType())) { + //按照家校部门查询 + List eduStudentList = new ArrayList<>(); + ListStudentDTO listStudentDTO = new ListStudentDTO(); + listStudentDTO.setIsQueryUserDept(false); + listStudentDTO.setIsQueryParent(false); + listStudentDTO.setIsQuerySchoolName(false); + //部门学校 + if (ObjectUtil.equals(UserDeptTypeEnum.CLASS_TYPE.getValue(), dto.getDeptType())) { + listStudentDTO.setClassId(dto.getDeptId()); + } else if (ObjectUtil.equals(UserDeptTypeEnum.GRADE_TYPE.getValue(), dto.getDeptType())) { + listStudentDTO.setGradeId(dto.getDeptId()); + } else if (ObjectUtil.equals(UserDeptTypeEnum.SECTION_TYPE.getValue(), dto.getDeptType())) { + listStudentDTO.setSectionId(dto.getDeptId()); + } else if (ObjectUtil.equals(UserDeptTypeEnum.CAMPUS_TYPE.getValue(), dto.getDeptType())) { + listStudentDTO.setCampusId(dto.getDeptId()); + } else { + listStudentDTO.setSchoolId(dto.getDeptId()); + } + eduStudentList = remoteStudentService.listStudent(listStudentDTO).getData(); + userIdList = eduStudentList.stream().map(EduStudent::getId).collect(Collectors.toList()); + } else { + //职工 + userIdList = remoteStaffService.listStaffByDeptId(dto.getDeptId(), null, null).getData(); + } + } + + if (CollUtil.isEmpty(userIdList)) { + return null; + } + dto.setUserIdList(userIdList); + + IPage manageListUserDetailVO = baseMapper.findManageListUserDetailVO(dto.toPage(), dto); + List records = manageListUserDetailVO.getRecords(); + List timeList = new ArrayList<>(); + for (ManageListUserAttendanceDetailVO record : records) { + if (ObjectUtil.equals(UserTypeEnum.PARENT_USER_TYPE.getType(), dto.getSearchUserType())) { + EduStudent student = commonService.getStudentById(record.getUserId()); + if (ObjectUtil.isNotNull(student)) { + record.setUserName(student.getStuName()); + record.setStudentType(student.getType()); + record.setAvatar(student.getAvatar()); + record.setDeptName(student.getCampusName() + "/" + student.getSectionName() + "/" + student.getClassName()); + record.setDormName( + ObjectUtil.isNotNull(student.getDormName()) && ObjectUtil.isNotNull(student.getDormRoomName()) ? + (student.getDormName() + "/" + student.getDormRoomName()) : null); + } + } else { + EduStaff staff = commonService.getStaffById(record.getUserId()); + if (ObjectUtil.isNotNull(staff)) { + record.setUserName(staff.getName()); + record.setDeptName(staff.getStaffDept().get(0).getDeptName()); + record.setAvatar(staff.getAvatar()); + } + } + record.setUserType(dto.getSearchUserType()); + + //默认1个时间段 + timeList = attendanceRuleTimeService.list(Wrappers.lambdaQuery(new AttendanceRuleTime()) + .eq(AttendanceRuleTime::getRuleId, record.getRuleId())); + + //判断请假 + if (record.getMissNum() > 0) { + ListUserRequestDTO requestDTO = new ListUserRequestDTO(); + requestDTO.setRequestType(record.getUserType()); + requestDTO.setUserIdList(Arrays.asList(record.getUserId())); + requestDTO.setStartTime(dto.getAttendanceStartDate().atTime(timeList.get(0).getStartTime())); + requestDTO.setEndTime(dto.getAttendanceEndDate().atTime(timeList.get(0).getEndEffectiveEndTime())); + List requestUserVOList = remoteLeaveRequestService.findList(requestDTO).getData(); + if (CollUtil.isNotEmpty(requestUserVOList)) { + record.setMissNum(0); + record.setRequestNum(1); + } + } + } + cn.hutool.json.JSONObject jsonObject = JSONUtil.parseObj(manageListUserDetailVO); + //查询异常总数 + //请假总人数 + ListUserRequestDTO requestDTO = new ListUserRequestDTO(); + requestDTO.setRequestType(dto.getSearchUserType()); + requestDTO.setUserIdList(userIdList); + requestDTO.setStartTime(dto.getAttendanceStartDate().atTime(timeList.get(0).getStartTime())); + requestDTO.setEndTime(dto.getAttendanceEndDate().atTime(timeList.get(0).getEndEffectiveEndTime())); + List requestUserVOList = remoteLeaveRequestService.findList(requestDTO).getData(); + int requestNum = requestUserVOList.stream().collect(Collectors.groupingBy(EduLeaveRequestUserVO::getUserId)).size(); + + jsonObject.set("errorNum", baseMapper.findManageListUserDetailVOErrorNum(dto) - requestNum); + return jsonObject; + } + + @Override + public ManageListUserAttendanceDetailTotalVO findManageListUserDetailTotalVO(ManageListUserDTO dto) { + ManageListUserAttendanceDetailTotalVO vo = new ManageListUserAttendanceDetailTotalVO(); + List userIdList = new ArrayList<>(); + if (ObjectUtil.isNull(dto.getDeptId())) { + AttendanceRuleAdmin param = new AttendanceRuleAdmin(); + param.setUserType(dto.getSearchUserType()); + param.setStaffId(dto.getUserId()); + List adminList = attendanceRuleAdminService.findList(param); + if (ObjectUtil.isNotNull(dto.getRuleId())) { + adminList = adminList.stream() + .filter(attendanceRuleAdmin -> attendanceRuleAdmin.getRuleId().equals(dto.getRuleId())) + .collect(Collectors.toList()); + } + userIdList = initUserIdList(adminList, dto.getSearchUserType()); + } else { + if (ObjectUtil.equals(UserTypeEnum.PARENT_USER_TYPE.getType(), dto.getSearchUserType())) { + //按照家校部门查询 + List eduStudentList = new ArrayList<>(); + ListStudentDTO listStudentDTO = new ListStudentDTO(); + listStudentDTO.setIsQueryUserDept(false); + listStudentDTO.setIsQueryParent(false); + listStudentDTO.setIsQuerySchoolName(false); + //部门学校 + if (ObjectUtil.equals(UserDeptTypeEnum.CLASS_TYPE.getValue(), dto.getDeptType())) { + listStudentDTO.setClassId(dto.getDeptId()); + } else if (ObjectUtil.equals(UserDeptTypeEnum.GRADE_TYPE.getValue(), dto.getDeptType())) { + listStudentDTO.setGradeId(dto.getDeptId()); + } else if (ObjectUtil.equals(UserDeptTypeEnum.SECTION_TYPE.getValue(), dto.getDeptType())) { + listStudentDTO.setSectionId(dto.getDeptId()); + } else if (ObjectUtil.equals(UserDeptTypeEnum.CAMPUS_TYPE.getValue(), dto.getDeptType())) { + listStudentDTO.setCampusId(dto.getDeptId()); + } else { + listStudentDTO.setSchoolId(dto.getDeptId()); + } + eduStudentList = remoteStudentService.listStudent(listStudentDTO).getData(); + userIdList = eduStudentList.stream().map(EduStudent::getId).collect(Collectors.toList()); + } else { + //职工 + userIdList = remoteStaffService.listStaffByDeptId(dto.getDeptId(), null, null).getData(); + } + } + if (CollUtil.isEmpty(userIdList)) { + vo.setTotalNum(0); + vo.setAbNormalNum(0); + } else { + vo.setTotalNum(userIdList.size()); + dto.setUserIdList(userIdList); + dto.setAttendanceStatus(0); + IPage manageListUserDetailVO = baseMapper + .findManageListUserDetailVO(new Page(1, -1), dto); + vo.setAbNormalNum(userIdList.size() - manageListUserDetailVO.getRecords().size()); + } + return vo; + } + + @Override + public List findManageUserDeptTree(Long userId, Integer searchUserType) { + + AttendanceRuleAdmin param = new AttendanceRuleAdmin(); + param.setUserType(searchUserType); + param.setStaffId(userId); + List adminList = attendanceRuleAdminService.findList(param); + List collect = adminList.stream().map(AttendanceRuleAdmin::getDeptId).distinct().collect(Collectors.toList()); + if (CollUtil.isEmpty(collect)) { + return null; + } + if (ObjectUtil.equals(UserTypeEnum.PARENT_USER_TYPE.getType(), searchUserType)) { + //家校部门树 + //查询用户管理部门 + return remoteUserDeptService + .getUserDeptTree(collect).getData(); + } else { + //职能部门树 + return remoteDeptService + .getDeptTree(collect).getData(); + } + } + + @Override + public StaffIdentityVO findStaffIdentity(Long staffId) { + StaffIdentityVO vo = new StaffIdentityVO(); + //学生管理员 + + AttendanceRuleAdmin param = new AttendanceRuleAdmin(); + param.setStaffId(staffId); + List adminList = attendanceRuleAdminService.findList(param); + + if (CollUtil.isEmpty(adminList)) { + vo.setManageStudent(false); + vo.setManageStaff(false); + } + //排除未启用规则 +// List realAdminList = new ArrayList<>(); +// for (AttendanceRuleAdmin admin : adminList) { +// AttendanceRule attendanceRule = attendanceRuleService.getById(admin.getRuleId()); +// if (ObjectUtil.isNull(attendanceRule) || ObjectUtil +// .equals(EnableStatusEnum.NOT_ENABLE_STATUS.getStatus(), attendanceRule.getStatus())) { +// continue; +// } else { +// realAdminList.add(admin); +// } +// } +// if (CollUtil.isEmpty(realAdminList)) { +// vo.setManageStudent(false); +// vo.setManageStaff(false); +// } + List parentAdminList = adminList.stream().filter( + attendanceRuleAdmin -> ObjectUtil.equals(UserTypeEnum.PARENT_USER_TYPE.getType(), attendanceRuleAdmin.getUserType())) + .collect( + Collectors.toList()); + + List staffAdminList = adminList.stream().filter( + attendanceRuleAdmin -> ObjectUtil.equals(UserTypeEnum.STAFF_USER_TYPE.getType(), attendanceRuleAdmin.getUserType())) + .collect( + Collectors.toList()); + + if (CollUtil.isNotEmpty(parentAdminList)) { + vo.setManageStudent(true); + } + + if (CollUtil.isNotEmpty(staffAdminList)) { + vo.setManageStaff(true); + } + return vo; + } + + + @Override + public void initUserAttendance() { + log.info("开始初始化学校的考勤数据"); + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); + //查询具有考勤规则的学校 + PageAttendanceRuleDTO dto = new PageAttendanceRuleDTO(); + dto.setStatus(EnableStatusEnum.ENABLE_STATUS.getStatus()); + List ruleVOList = attendanceRuleService.listRule(dto); + + for (AttendanceRuleVO attendanceRuleVO : ruleVOList) { + if (LocalDate.now().isBefore(attendanceRuleVO.getStartDate()) || LocalDate.now() + .isAfter(attendanceRuleVO.getEndDate())) { + continue; + } + if (CollUtil.isEmpty(attendanceRuleVO.getTimeDTOList())) { + continue; + } +// if (!attendanceRuleVO.getWeek().contains(String.valueOf(LocalDate.now().getDayOfWeek().getValue()))) { +// continue; +// } + //移除学生信息 + attendanceRuleObjUserService.remove(Wrappers.lambdaQuery(new AttendanceRuleObjUser()) + .eq(AttendanceRuleObjUser::getRuleId, attendanceRuleVO.getId())); + + List eduStudentList = new ArrayList<>(); + List eduStaffList = new ArrayList<>(); + List attendanceRuleObjList = attendanceRuleVO.getAttendanceRuleObjList(); + //循环处理数据 + log.info("开始处理学校:【{}】,考勤规则:【{}】的考勤数据", attendanceRuleVO.getSchoolId(), attendanceRuleVO.getName()); + if (ObjectUtil.equals(AttendanceUserTypeEnum.STAFF.getValue(), attendanceRuleVO.getUserType())) { + //教职工打卡 + //查询规则下的教职工 + for (AddAttendanceRuleObjDTO objDTO : attendanceRuleObjList) { + ListStaffDTO param = new ListStaffDTO(); + param.setDeptId(objDTO.getDeptId()); + List eduStaffs = remoteStaffService.listStaff(param).getData(); + for (EduStaff eduStaff : eduStaffs) { + EduStaffDept staffDept = new EduStaffDept(); + staffDept.setDeptId(objDTO.getDeptId()); + eduStaff.setStaffDept(Collections.singletonList(staffDept)); + eduStaffList.add(eduStaff); + } + } + } else { + for (AddAttendanceRuleObjDTO attendanceRuleObj : attendanceRuleObjList) { + //判断班级是否存在 + EduUserDept eduUserDept = remoteUserDeptService.getByDeptId(attendanceRuleObj.getDeptId()).getData(); + if (ObjectUtil.isNull(eduUserDept)) { + attendanceRuleObjUserService.remove(Wrappers.lambdaQuery(new AttendanceRuleObjUser()) + .eq(AttendanceRuleObjUser::getDeptId, attendanceRuleObj.getDeptId()) + .eq(AttendanceRuleObjUser::getRuleId, attendanceRuleVO.getId())); + attendanceRuleObjService.removeById(attendanceRuleObj.getId()); + continue; + } + //查询实际人员 + ListStudentDTO listStudentDTO = new ListStudentDTO(); + listStudentDTO.setIsQueryUserDept(false); + listStudentDTO.setIsQueryParent(false); + listStudentDTO.setIsQuerySchoolName(false); + listStudentDTO.setSchoolId(attendanceRuleVO.getSchoolId()); + listStudentDTO.setClassId(attendanceRuleObj.getDeptId()); + List allEduStudentList = remoteStudentService.listStudent(listStudentDTO).getData(); + + if (ObjectUtil.equals(AttendanceUserTypeEnum.STUDENT_TO_DORM.getValue(), attendanceRuleVO.getUserType())) { + allEduStudentList = allEduStudentList.stream().filter(student -> ObjectUtil.equals(1, student.getType()) + && (ObjectUtil.isNull(student.getStudentStatus()) || (ObjectUtil.isNotNull(student.getStatus()) + && ObjectUtil + .equals(StudentStatusEnum.ZAIDU.getStatus(), student.getStudentStatus())))) + .collect(Collectors.toList()); + } + + eduStudentList.addAll(allEduStudentList); +// List list = attendanceRuleObjUserService +// .list(Wrappers.lambdaQuery(new AttendanceRuleObjUser()) +// .eq(AttendanceRuleObjUser::getDeptId, attendanceRuleObj.getDeptId()) +// .eq(AttendanceRuleObjUser::getRuleId, attendanceRuleVO.getId()) +// .eq(AttendanceRuleObjUser::getUserType, UserTypeEnum.PARENT_USER_TYPE.getType()) +// ); +// for (AttendanceRuleObjUser user : list) { +// EduStudent student = remoteStudentService.getStudentNoPermission(user.getUserId()).getData(); +// if (ObjectUtil.isNotNull(student)) { +// if (ObjectUtil +// .equals(AttendanceUserTypeEnum.STUDENT_TO_DORM.getValue(), attendanceRuleVO.getUserType())) { +// //宿舍考勤 +// if (ObjectUtil.equals(1, student.getType())) { +// //住宿 +// eduStudentList.add(student); +// } else { +// //移除学生信息 +// attendanceRuleObjUserService.remove(Wrappers.lambdaQuery(new AttendanceRuleObjUser()) +// .eq(AttendanceRuleObjUser::getRuleId, attendanceRuleVO.getId()) +// .eq(AttendanceRuleObjUser::getUserId, user.getUserId())); +// } +// } else { +// eduStudentList.add(student); +// } +// } else { +// //移除学生信息 +// attendanceRuleObjUserService.remove(Wrappers.lambdaQuery(new AttendanceRuleObjUser()) +// .eq(AttendanceRuleObjUser::getRuleId, attendanceRuleVO.getId()) +// .eq(AttendanceRuleObjUser::getUserId, user.getUserId())); +// } +// } + } + } + List resultList = new ArrayList<>(); + List objUserList = new ArrayList<>(); + if (CollUtil.isNotEmpty(eduStudentList)) { + for (EduStudent eduStudent : eduStudentList) { + //增加考勤人员 + AttendanceRuleObjUser objUser = new AttendanceRuleObjUser(); + objUser.setUserId(eduStudent.getId()); + objUser.setUserName(eduStudent.getStuName()); + objUser.setUserType(UserTypeEnum.PARENT_USER_TYPE.getType()); + objUser.setRuleId(attendanceRuleVO.getId()); + objUser.setDeptId(eduStudent.getClassId()); + objUserList.add(objUser); + //增加考勤结果记录 + AttendanceResult result = new AttendanceResult(); + result.setAttType(attendanceRuleVO.getType()); + result.setUserType(ObjectUtil.equals(AttendanceUserTypeEnum.STAFF.getValue(), attendanceRuleVO.getUserType()) + ? AttendanceUserTypeEnum.STAFF.getValue() : AttendanceUserTypeEnum.STUDENT_TO_SCHOOL.getValue()); + result.setUserId(eduStudent.getId()); + result.setSchoolId(eduStudent.getSchoolId()); + result.setRuleId(attendanceRuleVO.getId()); + for (AddAttendanceRuleTimeDTO ruleTimeDTO : attendanceRuleVO.getTimeDTOList()) { + //判断今日是否含有记录 + long count = count(Wrappers.lambdaQuery(new AttendanceResult()) + .eq(AttendanceResult::getAttendanceDate, LocalDate.now()) + .eq(AttendanceResult::getUserId, eduStudent.getId()) + .eq(AttendanceResult::getRuleId, attendanceRuleVO.getId()) + .eq(AttendanceResult::getRuleTimeId, ruleTimeDTO.getId())); + if (count == 0) { + result.setRuleTimeId(ruleTimeDTO.getId()); + result.setStartStiTime(ruleTimeDTO.getStartTime()); + result.setEndStiTime(ruleTimeDTO.getEndTime()); + result.setAttendanceDate(LocalDate.now()); + resultList.add(result); + } + } + } + } + if (CollUtil.isNotEmpty(eduStaffList)) { + for (EduStaff staff : eduStaffList) { + AttendanceRuleObjUser objUser = new AttendanceRuleObjUser(); + objUser.setUserId(staff.getId()); + objUser.setUserName(staff.getName()); + objUser.setUserType(UserTypeEnum.STAFF_USER_TYPE.getType()); + objUser.setRuleId(attendanceRuleVO.getId()); + objUser.setDeptId(CollUtil.isNotEmpty(staff.getStaffDept()) ? staff.getStaffDept().get(0).getDeptId() : null); + objUserList.add(objUser); + + AttendanceResult result = new AttendanceResult(); + result.setAttType(attendanceRuleVO.getType()); + result.setUserType(ObjectUtil.equals(AttendanceUserTypeEnum.STAFF.getValue(), attendanceRuleVO.getUserType()) + ? AttendanceUserTypeEnum.STAFF.getValue() : AttendanceUserTypeEnum.STUDENT_TO_SCHOOL.getValue()); + result.setUserId(staff.getId()); + result.setSchoolId(staff.getSchoolId()); + result.setRuleId(attendanceRuleVO.getId()); + for (AddAttendanceRuleTimeDTO ruleTimeDTO : attendanceRuleVO.getTimeDTOList()) { + long count = count(Wrappers.lambdaQuery(new AttendanceResult()) + .eq(AttendanceResult::getAttendanceDate, LocalDate.now()) + .eq(AttendanceResult::getUserId, staff.getId()) + .eq(AttendanceResult::getRuleId, attendanceRuleVO.getId()) + .eq(AttendanceResult::getRuleTimeId, ruleTimeDTO.getId())); + if (count == 0) { + result.setRuleTimeId(ruleTimeDTO.getId()); + result.setStartStiTime(ruleTimeDTO.getStartTime()); + result.setEndStiTime(ruleTimeDTO.getEndTime()); + result.setAttendanceDate(LocalDate.now()); + resultList.add(result); + } + } + } + } + if (CollUtil.isNotEmpty(resultList) && attendanceRuleVO.getWeek() + .contains(String.valueOf(LocalDate.now().getDayOfWeek().getValue()))) { + //批量保存 + saveBatch(resultList); + } + if (CollUtil.isNotEmpty(objUserList)) { + //批量保存 + attendanceRuleObjUserService.saveBatch(objUserList); + } + } + stopWatch.stop(); + log.info("每日初始化考勤总共耗时: {}", stopWatch.getTotalTimeSeconds() + "秒"); + } + + @Override + public void initAttendanceReport(Long schoolId, LocalDate currentDate) { + //查询学校 + log.info("开始统计学生考勤数据"); + List schoolList = new ArrayList<>(); + if (Objects.isNull(schoolId)) { + // 查询所有绑定了企业微信的学校信息 + schoolList = remoteDeptService.listSchoolBySchoolType(Dept.TYPE_QYWX).getData(); + } else { + Dept school = remoteDeptService.getInfoByIdNoPermission(schoolId).getData(); + schoolList.add(school); + } + + if (CollUtil.isNotEmpty(schoolList)) { + schoolList.forEach(school -> { + //判断学校是否包含宿舍考勤 + List ruleList = attendanceRuleService.list(Wrappers.lambdaQuery(new AttendanceRule()) + .eq(AttendanceRule::getSchoolId, school.getDeptId()) + .eq(AttendanceRule::getUserType, AttendanceUserTypeEnum.STUDENT_TO_DORM.getValue())); + if (CollUtil.isNotEmpty(ruleList)) { + log.info("开始统计学校{}的学生考勤数据", school.getDeptName()); + } + }); + } + + //每日 + LocalDate now = LocalDate.now(); + AttendanceCountPageDTO dto = new AttendanceCountPageDTO(); + dto.setStartDate(now); + dto.setEndDate(now); + IPage attdanceResultVOIPage = baseMapper.listResultPage(new Page(1, -1), dto); + + } + + @Override + public void lateReport(Integer mode, Integer userType, Long ruleId, Long ruleTimeId, List staffIds, Integer isManager) { +// mode 0=推动至教职工,1=推送至学生家长 + AttendanceRule rule = attendanceRuleService.getById(ruleId); + if (ObjectUtil.isNull(rule) || !ObjectUtil.equals(EnableStatusEnum.ENABLE_STATUS.getStatus(), rule.getStatus())) { + log.info("【{}】规则已停用,不推送迟到报告", rule.getName()); + return; + } + if (ObjectUtil.equals(UserTypeEnum.PARENT_USER_TYPE.getType(), userType)) { + //今日还未打卡的全部学生 + List resultList = list(Wrappers.lambdaQuery(new AttendanceResult()) + .eq(AttendanceResult::getRuleId, ruleId) + .eq(AttendanceResult::getRuleTimeId, ruleTimeId) + .eq(AttendanceResult::getAttendanceDate, LocalDate.now()) + .isNull(AttendanceResult::getStartStatus)); + //学生 + if (mode == 1) { + //发送学生家长 + for (AttendanceResult result : resultList) { + //逐个推送至学生家长 + } + } else { + //发送教职工 ,汇总推送给管理员 + //自定义需要发送的职工 + long lateMinute = Duration.between(resultList.get(0).getEndStiTime(), LocalTime.now()).toMinutes(); + if (CollUtil.isNotEmpty(staffIds)) { + for (Long staffId : staffIds) { + noticeService.sendStudentAttendanceLateReportToStaff(resultList, staffId, rule, lateMinute); + } + } + //发送管理员 + if (ObjectUtil.equals(1, isManager)) { + AttendanceRuleAdmin admin = new AttendanceRuleAdmin(); + admin.setRuleId(ruleId); + List adminList = attendanceRuleAdminService.findList(admin); + for (AttendanceRuleAdmin attendanceRuleAdmin : adminList) { + List deptIdList = new ArrayList<>(); + EduUserDept userDept = commonService.getUserDept(attendanceRuleAdmin.getDeptId()); + if (ObjectUtil.equals(UserDeptTypeEnum.CLASS_TYPE.getValue(), userDept.getDeptType())) { + deptIdList = Arrays.asList(userDept.getDeptId()); + } else { + //查看班级 + deptIdList = remoteUserDeptService + .findChildIdByParentAndTypeNoPermission(attendanceRuleAdmin.getDeptId(), 1) + .getData().stream().map(EduUserDept::getDeptId).collect( + Collectors.toList()); + } + + List mangerUserIdList = attendanceRuleObjUserService + .list(Wrappers.lambdaQuery(new AttendanceRuleObjUser()) + .in(AttendanceRuleObjUser::getDeptId, deptIdList) + .eq(AttendanceRuleObjUser::getRuleId, ruleId)).stream().map(AttendanceRuleObjUser::getUserId) + .collect( + Collectors.toList()); + + List mangerResultList = resultList.stream() + .filter(result -> mangerUserIdList.contains(result.getUserId())).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(mangerResultList)) { + log.info("【{}】管理员发送迟到规则【{}】的提醒报告", attendanceRuleAdmin.getStaffId(), rule.getName()); + noticeService + .sendStudentAttendanceLateReportToStaff(mangerResultList, attendanceRuleAdmin.getStaffId(), + rule, + lateMinute); + } + } + } + } + } else { + // + } + } + + // * @param mode 0=推动至教职工,1=推送至学生家长 + // * @param userType 0=职工,1=学生 + @Override + public void dayReport(Integer mode, Integer userType, Long ruleId) { + AttendanceRule rule = attendanceRuleService.getById(ruleId); + if (ObjectUtil.isNull(rule) || !ObjectUtil.equals(EnableStatusEnum.ENABLE_STATUS.getStatus(), rule.getStatus())) { + log.error("【{}】规则已停用,不推送日报", rule.getName()); + return; + } + //今日异常打卡人员 + List resultList = list(Wrappers.lambdaQuery(new AttendanceResult()) + .eq(AttendanceResult::getRuleId, ruleId) + .eq(AttendanceResult::getAttendanceDate, LocalDate.now()) + .isNull(AttendanceResult::getStartStatus)); + + if (ObjectUtil.equals(AttendanceModeTypeEnum.FIX.getValue(), rule.getType())) { + //固定打卡 + resultList.addAll(list(Wrappers.lambdaQuery(new AttendanceResult()) + .eq(AttendanceResult::getRuleId, ruleId) + .eq(AttendanceResult::getAttendanceDate, LocalDate.now()) + .isNotNull(AttendanceResult::getStartStatus) + .isNull(AttendanceResult::getEndStatus))); + } + + if (mode == 1) { + //TODO 发送给家长端 + } else { + //查询规则管理员 + AttendanceRuleAdmin admin = new AttendanceRuleAdmin(); + admin.setRuleId(ruleId); + List adminList = attendanceRuleAdminService.findList(admin); + Map> adminMap = adminList.stream() + .collect(Collectors.groupingBy(AttendanceRuleAdmin::getStaffId)); + for (Entry> entry : adminMap.entrySet()) { + Boolean isLeader = false; //是否为校领导 + Long k = entry.getKey(); + List v = entry.getValue(); + List dayReportDataDTOList = new ArrayList<>(); + for (AttendanceRuleAdmin attendanceRuleAdmin : v) { + DayReportDataDTO dto = new DayReportDataDTO(); + List deptIdList = new ArrayList<>(); + if (ObjectUtil.equals(UserTypeEnum.PARENT_USER_TYPE.getType(), userType)) { + EduUserDept userDept = commonService.getUserDept(attendanceRuleAdmin.getDeptId()); + dto.setDeptName(ObjectUtil.isNull(userDept) ? "未知班级" : userDept.getDeptName()); + if (ObjectUtil.equals(UserDeptTypeEnum.CLASS_TYPE.getValue(), userDept.getDeptType())) { + deptIdList = Arrays.asList(userDept.getDeptId()); + } else { + //查看班级 + deptIdList = remoteUserDeptService + .findChildIdByParentAndTypeNoPermission(attendanceRuleAdmin.getDeptId(), 1) + .getData().stream().map(EduUserDept::getDeptId).collect( + Collectors.toList()); + isLeader = true; + } + } else { + Dept dept = commonService.getDept(attendanceRuleAdmin.getDeptId()); + dto.setDeptName(ObjectUtil.isNull(dept) ? "未知部门" : dept.getDeptName()); + deptIdList = Arrays.asList(dept.getDeptId()); + } + + //管理总人数 + if (CollUtil.isEmpty(deptIdList)) { + dto.setTotalNum(0); + dto.setAbNum(0); + dto.setRequestNum(0); + } else { + List mangerUserIdList = attendanceRuleObjUserService + .list(Wrappers.lambdaQuery(new AttendanceRuleObjUser()) + .in(AttendanceRuleObjUser::getDeptId, deptIdList) + .eq(AttendanceRuleObjUser::getRuleId, ruleId)).stream().map(AttendanceRuleObjUser::getUserId) + .collect( + Collectors.toList()); + + //未打卡人数 + List mangerResultList = + CollUtil.isEmpty(mangerUserIdList) ? new ArrayList<>() : resultList.stream() + .filter(result -> mangerUserIdList.contains(result.getUserId())).collect(Collectors.toList()); + + dto.setTotalNum(mangerUserIdList.size()); + dto.setAbNum(mangerResultList.size()); + + //查询请假人数 + if (CollUtil.isEmpty(mangerUserIdList)) { + dto.setRequestNum(0); + } else { + ListUserRequestDTO requestDTO = new ListUserRequestDTO(); + requestDTO.setRequestType(userType); + requestDTO.setStartTime(LocalDate.now().atTime(LocalTime.of(00, 00, 01))); + requestDTO.setEndTime(LocalDate.now().atTime(LocalTime.of(23, 59, 59))); + requestDTO.setUserIdList(mangerUserIdList); + List requestUserVOList = remoteLeaveRequestService.findList(requestDTO) + .getData(); + dto.setRequestNum( + requestUserVOList.stream().collect(Collectors.groupingBy(EduLeaveRequestUserVO::getUserId)) + .size()); + } + dayReportDataDTOList.add(dto); + } + } + noticeService.sendAttendanceDayReportToStaff(k, dayReportDataDTOList, rule, userType, isLeader); + } + + + } + +// if (ObjectUtil.equals(UserTypeEnum.PARENT_USER_TYPE.getType(), userType)) { +// //学生考勤 +// //今日未打卡学生 +// List resultList = list(Wrappers.lambdaQuery(new AttendanceResult()) +// .eq(AttendanceResult::getRuleId, ruleId) +// .eq(AttendanceResult::getAttendanceDate, LocalDate.now()) +// .isNull(AttendanceResult::getStartStatus)); +// +// if (ObjectUtil.equals(AttendanceModeTypeEnum.FIX.getValue(), rule.getType())) { +// //固定打卡 +// resultList.addAll(list(Wrappers.lambdaQuery(new AttendanceResult()) +// .eq(AttendanceResult::getRuleId, ruleId) +// .eq(AttendanceResult::getAttendanceDate, LocalDate.now()) +// .isNull(AttendanceResult::getEndStatus))); +// } +// if (mode == 1) { +// //TODO 发送给家长端 +// } else { +// //查询规则管理员 +// AttendanceRuleAdmin admin = new AttendanceRuleAdmin(); +// admin.setRuleId(ruleId); +// List adminList = attendanceRuleAdminService.findList(admin); +// +// Map> adminMap = adminList.stream() +// .collect(Collectors.groupingBy(AttendanceRuleAdmin::getStaffId)); +// +// adminMap.forEach((k, v) -> { +// List dayReportDataDTOList = new ArrayList<>(); +// for (AttendanceRuleAdmin attendanceRuleAdmin : v) { +// DayReportDataDTO dto = new DayReportDataDTO(); +// List deptIdList = new ArrayList<>(); +// EduUserDept userDept = commonService.getUserDept(attendanceRuleAdmin.getDeptId()); +// dto.setDeptName(userDept.getDeptName()); +// +// if (ObjectUtil.equals(UserDeptTypeEnum.CLASS_TYPE.getValue(), userDept.getDeptType())) { +// deptIdList = Arrays.asList(userDept.getDeptId()); +// +// } else { +// //查看班级 +// deptIdList = remoteUserDeptService +// .findChildIdByParentAndTypeNoPermission(attendanceRuleAdmin.getDeptId(), 1) +// .getData().stream().map(EduUserDept::getDeptId).collect( +// Collectors.toList()); +// } +// +// //管理总人数 +// List mangerUserIdList = attendanceRuleObjUserService +// .list(Wrappers.lambdaQuery(new AttendanceRuleObjUser()) +// .in(AttendanceRuleObjUser::getDeptId, deptIdList) +// .eq(AttendanceRuleObjUser::getRuleId, ruleId)).stream().map(AttendanceRuleObjUser::getUserId) +// .collect( +// Collectors.toList()); +// +// //未打卡人数 +// List mangerResultList = resultList.stream() +// .filter(result -> mangerUserIdList.contains(result.getUserId())).collect(Collectors.toList()); +// +// dto.setTotalNum(mangerUserIdList.size()); +// dto.setAbNum(mangerResultList.size()); +// dayReportDataDTOList.add(dto); +// } +// noticeService.sendStudentAttendanceDayReportToStaff(k, dayReportDataDTOList, rule); +// }); +// } +// } + } + + + @Override + public StaRecordCountVO staRecordCount(LocalDate startDate, LocalDate endDate, List schoolIds) { + List list = list(Wrappers.lambdaQuery(new AttendanceResult()) + .in(AttendanceResult::getSchoolId, schoolIds) + .between(AttendanceResult::getAttendanceDate, startDate, endDate)); + + Map> studentFixNormal = list.stream() + .filter(r -> ObjectUtil.equals(UserTypeEnum.PARENT_USER_TYPE.getType(), r.getUserType()) + && ObjectUtil.equals(AttendanceModeTypeEnum.FIX.getValue(), r.getAttType()) + && ObjectUtil.equals(AttendanceResultEnum.NORMAL, r.getStartStatus()) + && ObjectUtil.equals(AttendanceResultEnum.NORMAL, r.getEndStatus())) + .collect(Collectors.groupingBy(AttendanceResult::getUserId)); + + Map> studentFixAbNormal = list.stream() + .filter(r -> (ObjectUtil.equals(UserTypeEnum.PARENT_USER_TYPE.getType(), r.getUserType()) + && ObjectUtil.equals(AttendanceModeTypeEnum.FIX.getValue(), r.getAttType())) + && !(ObjectUtil.equals(AttendanceResultEnum.NORMAL, r.getStartStatus()) && ObjectUtil + .equals(AttendanceResultEnum.NORMAL, r.getEndStatus()))) + .collect(Collectors.groupingBy(AttendanceResult::getUserId)); + + Map> studentFreeNormal = list.stream() + .filter(r -> ObjectUtil.equals(UserTypeEnum.PARENT_USER_TYPE.getType(), r.getUserType()) + && ObjectUtil.equals(AttendanceModeTypeEnum.FREE.getValue(), r.getAttType()) + && ObjectUtil.equals(AttendanceResultEnum.NORMAL, r.getStartStatus())) + .collect(Collectors.groupingBy(AttendanceResult::getUserId)); + + Map> studentFreeAbNormal = list.stream() + .filter(r -> ObjectUtil.equals(UserTypeEnum.PARENT_USER_TYPE.getType(), r.getUserType()) + && ObjectUtil.equals(AttendanceModeTypeEnum.FREE.getValue(), r.getAttType()) + && !ObjectUtil.equals(AttendanceResultEnum.NORMAL, r.getStartStatus())) + .collect(Collectors.groupingBy(AttendanceResult::getUserId)); + + Map> studentFixLate = list.stream() + .filter(r -> ObjectUtil.equals(UserTypeEnum.PARENT_USER_TYPE.getType(), r.getUserType()) + && ObjectUtil.equals(AttendanceModeTypeEnum.FIX.getValue(), r.getAttType()) + && ObjectUtil.equals(AttendanceResultEnum.ABNORMAL.getValue(), r.getStartStatus())) + .collect(Collectors.groupingBy(AttendanceResult::getUserId)); + +// +// Map> studentFixLate = list.stream() +// .filter(r -> ObjectUtil.equals(UserTypeEnum.PARENT_USER_TYPE.getType(), r.getUserType()) +// && ObjectUtil.equals(AttendanceModeTypeEnum.FIX.getValue(), r.getAttType()) +// && ObjectUtil.equals(AttendanceResultEnum.ABNORMAL.getValue(), r.getStartStatus())) +// .collect(Collectors.groupingBy(AttendanceResult::getUserId)); + +// private Integer studentNormal; +// +// private Integer studentLate; +// +// private Integer studentNotArrive; +// +// private Integer studentRequest; +// +// private Integer staffNormal; +// +// private Integer staffLate; +// +// private Integer staffNotArrive; + return null; + } + + + private List initUserIdList(List adminList, Integer userType) { + List userIdList = new ArrayList<>(); + //查询用户ID集合 + for (AttendanceRuleAdmin admin : adminList) { + List objList = attendanceRuleObjService.findList(admin.getDeptId(), admin.getRuleId()); + userIdList.addAll(attendanceRuleObjUserService + .list(Wrappers.lambdaQuery(new AttendanceRuleObjUser()) + .in(AttendanceRuleObjUser::getDeptId, objList.stream().map(AttendanceRuleObj::getDeptId).collect( + Collectors.toList())) + .eq(AttendanceRuleObjUser::getUserType, userType) + .eq(AttendanceRuleObjUser::getRuleId, admin.getRuleId())).stream().map(AttendanceRuleObjUser::getUserId) + .collect(Collectors.toList())); + + } + return userIdList.stream().distinct().collect(Collectors.toList()); + } + + + /** + * @return + */ + private List initStatusByDate(List userIdList, Integer userType, LocalDate attendanceStartDate, + LocalDate attendanceEndDate) { + + List attendanceStatusByMonthVOList = baseMapper + .findAttendanceStatus(userType, userIdList, attendanceStartDate, attendanceEndDate); + + for (AttendanceStatusByMonthVO attendanceStatusVO : attendanceStatusByMonthVOList) { + //判断总的状态 + //先判断是否需要打卡 + AttendanceRuleVO rule = attendanceRuleService.getRule(attendanceStatusVO.getRuleId()); + + if (attendanceStatusVO.getDate().isAfter(LocalDate.now())) { + attendanceStatusVO.setStatus(4); //大于当前日期 + continue; + } + + if (ObjectUtil.isNotNull(rule) && !rule.getWeek() + .contains(String.valueOf(LocalDate.now().getDayOfWeek().getValue()))) { + attendanceStatusVO.setStatus(3); //非考勤日不参与打卡 + continue; + } + //请假状态 + if (userIdList.size() == 1) { + if (!(ObjectUtil.equals(AttendanceResultEnum.NORMAL.getValue(), attendanceStatusVO.getStartStatus()) && + ObjectUtil.equals(AttendanceResultEnum.NORMAL.getValue(), attendanceStatusVO.getEndStatus()))) { + AddAttendanceRuleTimeDTO ruleTime = attendanceRuleTimeService.get(attendanceStatusVO.getRuleTimeId()); + if (ObjectUtil.isNotNull(ruleTime)) { + ListUserRequestDTO requestDTO = new ListUserRequestDTO(); + requestDTO.setRequestType(userType); + requestDTO.setUserIdList(Arrays.asList(userIdList.get(0))); + requestDTO.setStartTime(attendanceStatusVO.getDate().atTime(ruleTime.getStartTime())); + requestDTO.setEndTime(attendanceStatusVO.getDate().atTime(ruleTime.getEndTime())); + List requestUserVOList = remoteLeaveRequestService.findList(requestDTO).getData(); + if (CollUtil.isNotEmpty(requestUserVOList)) { + attendanceStatusVO.setStatus(2); + continue; + } + } + } + } + if (ObjectUtil.equals(AttendanceModeTypeEnum.FIX.getValue(), attendanceStatusVO.getAttType()) ? + (ObjectUtil.equals(AttendanceResultEnum.NORMAL.getValue(), attendanceStatusVO.getStartStatus()) && + ObjectUtil.equals(AttendanceResultEnum.NORMAL.getValue(), attendanceStatusVO.getEndStatus())) + : ObjectUtil.equals(AttendanceResultEnum.NORMAL.getValue(), attendanceStatusVO.getStartStatus())) { + attendanceStatusVO.setStatus(0); + } else { + attendanceStatusVO.setStatus(1); + } + + } + List retList = new ArrayList<>(); + Map> listMap = attendanceStatusByMonthVOList.stream() + .collect(Collectors.groupingBy(AttendanceStatusByMonthVO::getDate)); + + listMap.forEach((k, v) -> { + DateStatusVO vo = new DateStatusVO(); + vo.setDate(k); + List abNomalList = v.stream() + .filter(n -> ObjectUtil.equals(AttendanceResultEnum.ABNORMAL.getValue(), n.getStatus())) + .collect(Collectors.toList()); + if (abNomalList.size() > 0) { + vo.setStatus(AttendanceResultEnum.ABNORMAL.getValue()); + } else { + vo.setStatus(v.get(0).getStatus()); + } + retList.add(vo); + }); + + if (CollUtil.isNotEmpty(retList)) { + Collections.reverse(retList); + } + return retList; + } + +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceRuleAddressServiceImpl.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceRuleAddressServiceImpl.java new file mode 100644 index 0000000..77516de --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceRuleAddressServiceImpl.java @@ -0,0 +1,25 @@ +package com.yida.data.attendance.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.attendance.mapper.AttendanceRuleAddressMapper; +import com.yida.data.attendance.service.AttendanceRuleAddressService; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRuleAddress; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +/** +* 考勤规则关联地点 Service实现 +* +* @date 2023-08-09 11:37:25 +*/ +@Service +@RequiredArgsConstructor +@Transactional(propagation = Propagation.SUPPORTS, readOnly = true) +public class AttendanceRuleAddressServiceImpl extends ServiceImpl + implements AttendanceRuleAddressService { + + + +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceRuleAdminServiceImpl.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceRuleAdminServiceImpl.java new file mode 100644 index 0000000..b843d2b --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceRuleAdminServiceImpl.java @@ -0,0 +1,30 @@ +package com.yida.data.attendance.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.attendance.mapper.AttendanceRuleAdminMapper; +import com.yida.data.attendance.service.AttendanceRuleAdminService; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRuleAdmin; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +/** + * 考勤-规则管理员 Service实现 + * + * @date 2023-08-09 11:37:25 + */ +@Service +@RequiredArgsConstructor +@Transactional(propagation = Propagation.SUPPORTS, readOnly = true) +public class AttendanceRuleAdminServiceImpl extends ServiceImpl + implements AttendanceRuleAdminService { + + + @Override + public List findList(AttendanceRuleAdmin admin) { + + return baseMapper.findList(admin); + } +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceRuleDeviceServiceImpl.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceRuleDeviceServiceImpl.java new file mode 100644 index 0000000..7aca615 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceRuleDeviceServiceImpl.java @@ -0,0 +1,24 @@ +package com.yida.data.attendance.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.attendance.mapper.AttendanceRuleDeviceMapper; +import com.yida.data.attendance.service.AttendanceRuleDeviceService; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRuleDevice; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +/** + * 考勤规则关联设备表 Service实现 + * + * @date 2023-08-09 11:37:25 + */ +@Service +@RequiredArgsConstructor +@Transactional(propagation = Propagation.SUPPORTS, readOnly = true) +public class AttendanceRuleDeviceServiceImpl extends ServiceImpl + implements AttendanceRuleDeviceService { + + +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceRuleObjServiceImpl.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceRuleObjServiceImpl.java new file mode 100644 index 0000000..32dae84 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceRuleObjServiceImpl.java @@ -0,0 +1,28 @@ +package com.yida.data.attendance.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.attendance.mapper.AttendanceRuleObjMapper; +import com.yida.data.attendance.service.AttendanceRuleObjService; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRuleObj; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +/** + * 规则适用部门 Service实现 + * + * @date 2023-08-09 11:37:25 + */ +@Service +@RequiredArgsConstructor +@Transactional(propagation = Propagation.SUPPORTS, readOnly = true) +public class AttendanceRuleObjServiceImpl extends ServiceImpl + implements AttendanceRuleObjService { + + @Override + public List findList(Long deptId, Long ruleId) { + return baseMapper.findList(deptId, ruleId); + } +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceRuleObjUserServiceImpl.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceRuleObjUserServiceImpl.java new file mode 100644 index 0000000..80e7302 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceRuleObjUserServiceImpl.java @@ -0,0 +1,110 @@ +package com.yida.data.attendance.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.attendance.mapper.AttendanceRuleObjUserMapper; +import com.yida.data.attendance.service.AttendanceRuleObjUserService; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRuleObj; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRuleObjUser; +import com.yida.data.common.core.entity.user.EduStaff; +import com.yida.data.common.core.entity.user.EduStudent; +import com.yida.data.common.core.entity.user.enums.StudentStatusEnum; +import com.yida.data.common.core.entity.user.enums.StudentTypeEnum; +import com.yida.data.common.core.enums.UserTypeEnum; +import com.yida.data.common.core.enums.attendance.AttendanceTypeEnum; +import com.yida.data.common.core.enums.attendance.AttendanceUserTypeEnum; +import com.yida.data.common.service.CommonService; +import com.yida.data.user.dto.ListStaffDTO; +import com.yida.data.user.dto.ListStudentDTO; +import com.yida.data.user.feign.RemoteStaffService; +import com.yida.data.user.feign.RemoteStudentService; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +/** + * 规则适用部门 Service实现 + * + * @date 2023-08-09 11:37:25 + */ +@Service +@RequiredArgsConstructor +@Transactional(propagation = Propagation.SUPPORTS, readOnly = true) +@Slf4j +public class AttendanceRuleObjUserServiceImpl extends ServiceImpl + implements AttendanceRuleObjUserService { + + private final RemoteStudentService remoteStudentService; + private final RemoteStaffService remoteStaffService; + private final CommonService commonService; + + @Override + public void addRuleUser(List ruleObjList, Long schoolId, Integer ruleType) { + //先删除原有数据 + remove(Wrappers.lambdaQuery(new AttendanceRuleObjUser()) + .eq(AttendanceRuleObjUser::getRuleId, ruleObjList.get(0).getRuleId())); + List userList = new ArrayList<>(); + //获取本校全部学生 + List allEduStudentList = new ArrayList<>(); + if (!ObjectUtil.equals(UserTypeEnum.STAFF_USER_TYPE.getType(), ruleType)) { + ListStudentDTO listStudentDTO = new ListStudentDTO(); + listStudentDTO.setIsQueryUserDept(false); + listStudentDTO.setIsQueryParent(false); + listStudentDTO.setIsQuerySchoolName(false); + listStudentDTO.setSchoolId(schoolId); + allEduStudentList = remoteStudentService.listStudent(listStudentDTO).getData(); + if (ObjectUtil.equals(AttendanceUserTypeEnum.STUDENT_TO_DORM.getValue(), ruleType)) { + allEduStudentList = allEduStudentList.stream().filter(student -> ObjectUtil.equals(1, student.getType()) + && (ObjectUtil.isNull(student.getStudentStatus()) || (ObjectUtil.isNotNull(student.getStatus()) && ObjectUtil + .equals(StudentStatusEnum.ZAIDU.getStatus(), student.getStudentStatus())))) + .collect(Collectors.toList()); + } + } + for (AttendanceRuleObj attendanceRuleObj : ruleObjList) { + if (ObjectUtil.equals(UserTypeEnum.PARENT_USER_TYPE.getType(), attendanceRuleObj.getUserType())) { + List collect = allEduStudentList.stream() + .filter(eduStudent -> eduStudent.getClassId().equals(attendanceRuleObj.getDeptId())).collect( + Collectors.toList()); + + if (CollUtil.isNotEmpty(collect)) { + for (EduStudent student : collect) { + AttendanceRuleObjUser user = new AttendanceRuleObjUser(); + user.setDeptId(attendanceRuleObj.getDeptId()); + user.setRuleId(attendanceRuleObj.getRuleId()); + user.setUserType(attendanceRuleObj.getUserType()); + user.setUserId(student.getId()); + user.setUserName(student.getStuName()); + userList.add(user); + } + } + } else { + //职工 + ListStaffDTO dto = new ListStaffDTO(); + dto.setDeptId(attendanceRuleObj.getDeptId()); + List eduStaffList = remoteStaffService.listStaff(dto).getData(); + if (CollUtil.isNotEmpty(eduStaffList)) { + for (EduStaff staff : eduStaffList) { + //判断是否已存在 + AttendanceRuleObjUser user = new AttendanceRuleObjUser(); + user.setDeptId(attendanceRuleObj.getDeptId()); + user.setRuleId(attendanceRuleObj.getRuleId()); + user.setUserType(attendanceRuleObj.getUserType()); + user.setUserId(staff.getId()); + user.setUserName(staff.getName()); + userList.add(user); + } + } + } + } + if (CollUtil.isNotEmpty(userList)) { + saveBatch(userList); + } + } +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceRuleRemindServiceImpl.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceRuleRemindServiceImpl.java new file mode 100644 index 0000000..ff5c646 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceRuleRemindServiceImpl.java @@ -0,0 +1,25 @@ +package com.yida.data.attendance.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.attendance.mapper.AttendanceRuleRemindMapper; +import com.yida.data.attendance.service.AttendanceRuleRemindService; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRuleRemind; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +/** +* 考勤-打卡提醒 Service实现 +* +* @date 2023-08-09 11:37:25 +*/ +@Service +@RequiredArgsConstructor +@Transactional(propagation = Propagation.SUPPORTS, readOnly = true) +public class AttendanceRuleRemindServiceImpl extends ServiceImpl + implements AttendanceRuleRemindService { + + + +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceRuleServiceImpl.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceRuleServiceImpl.java new file mode 100644 index 0000000..79dac4b --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceRuleServiceImpl.java @@ -0,0 +1,852 @@ +package com.yida.data.attendance.service.impl; + +import cc.mrbird.febs.common.redis.service.RedisService; +import cn.hutool.core.codec.Base64; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.UUID; +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.google.common.collect.Lists; +import com.yida.data.attendance.dto.AddAttendanceRuleDTO; +import com.yida.data.attendance.dto.AddAttendanceRuleTimeDTO; +import com.yida.data.attendance.dto.AttendanceFaceMatchDTO; +import com.yida.data.attendance.dto.AttendanceRuleAdminUserAddDTO; +import com.yida.data.attendance.dto.AttendanceRuleAdminUserPageDTO; +import com.yida.data.attendance.dto.AttendanceRuleUserAddDTO; +import com.yida.data.attendance.dto.AttendanceRuleUserPageDTO; +import com.yida.data.attendance.dto.DayReportDataDTO; +import com.yida.data.attendance.dto.PageAttendanceRuleDTO; +import com.yida.data.attendance.dto.UpdateAttendanceRuleStatusDTO; +import com.yida.data.attendance.mapper.AttendanceResultMapper; +import com.yida.data.attendance.mapper.AttendanceRuleMapper; +import com.yida.data.attendance.service.AttendanceRuleAddressService; +import com.yida.data.attendance.service.AttendanceRuleAdminService; +import com.yida.data.attendance.service.AttendanceRuleDeviceService; +import com.yida.data.attendance.service.AttendanceRuleObjService; +import com.yida.data.attendance.service.AttendanceRuleObjUserService; +import com.yida.data.attendance.service.AttendanceRuleRemindService; +import com.yida.data.attendance.service.AttendanceRuleService; +import com.yida.data.attendance.service.AttendanceRuleSpecialDateService; +import com.yida.data.attendance.service.AttendanceRuleTimeService; +import com.yida.data.attendance.service.AttendanceRuleWhiteListService; +import com.yida.data.attendance.service.AttendanceRuleWifiService; +import com.yida.data.attendance.vo.AttendanceFaceMatchVO; +import com.yida.data.attendance.vo.AttendanceRuleAdminUserVO; +import com.yida.data.attendance.vo.AttendanceRuleUserVO; +import com.yida.data.attendance.vo.AttendanceRuleVO; +import com.yida.data.attendance.vo.ConflictRuleVO; +import com.yida.data.attendance.vo.DayReportDataVO; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceResult; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRule; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRuleAddress; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRuleAdmin; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRuleDevice; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRuleObj; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRuleObjUser; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRuleRemind; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRuleSpecialDate; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRuleTime; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRuleWhiteList; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRuleWifi; +import com.yida.data.common.core.entity.constant.CachePrefixConstant; +import com.yida.data.common.core.entity.system.BaiduApiConfig; +import com.yida.data.common.core.entity.system.Dept; +import com.yida.data.common.core.entity.user.EduStaff; +import com.yida.data.common.core.entity.user.EduStaffDept; +import com.yida.data.common.core.entity.user.EduStudent; +import com.yida.data.common.core.entity.user.EduUserDept; +import com.yida.data.common.core.entity.user.enums.UserDeptTypeEnum; +import com.yida.data.common.core.enums.BaiDuModuleEnum; +import com.yida.data.common.core.enums.UserTypeEnum; +import com.yida.data.common.core.enums.attendance.AttendanceResultEnum; +import com.yida.data.common.core.exception.FebsException; +import com.yida.data.common.core.utils.BaiDuUtil; +import com.yida.data.common.core.utils.FebsUtil; +import com.yida.data.common.core.utils.FileUtil; +import com.yida.data.common.service.CommonService; +import com.yida.data.school.dto.userLeave.ListUserRequestDTO; +import com.yida.data.school.feign.leave.RemoteLeaveRequestService; +import com.yida.data.school.vo.userLeave.EduLeaveRequestUserVO; +import com.yida.data.system.feign.RemoteDeptService; +import com.yida.data.user.dto.ListStaffDTO; +import com.yida.data.user.dto.ListStudentDTO; +import com.yida.data.user.feign.RemoteStaffService; +import com.yida.data.user.feign.RemoteStudentService; +import com.yida.data.user.feign.RemoteUserDeptService; +import java.io.File; +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +/** + * 教职工考勤规则 Service实现 + */ +@Slf4j +@Service +@RequiredArgsConstructor +@Transactional(propagation = Propagation.SUPPORTS) +public class AttendanceRuleServiceImpl extends ServiceImpl + implements AttendanceRuleService { + + private final RedisService redisService; + private final AttendanceRuleObjService attendanceRuleObjService; + private final AttendanceRuleObjUserService attendanceRuleObjUserService; + private final AttendanceRuleSpecialDateService attendanceRuleSpecialDateService; + private final AttendanceRuleWhiteListService attendanceRuleWhiteListService; + private final AttendanceRuleDeviceService attendanceRuleDeviceService; + private final AttendanceRuleWifiService attendanceRuleWifiService; + private final AttendanceRuleAddressService attendanceRuleAddressService; + private final AttendanceRuleTimeService attendanceRuleTimeService; + private final AttendanceRuleAdminService attendanceRuleAdminService; + private final AttendanceRuleRemindService attendanceRuleRemindService; + private final AttendanceResultMapper attendanceResultMapper; + private final RemoteUserDeptService remoteUserDeptService; + + private final RemoteStudentService remoteStudentService; + private final RemoteStaffService remoteStaffService; + private final RemoteDeptService remoteDeptService; + private final CommonService commonService; + private final RemoteLeaveRequestService remoteLeaveRequestService; + + @Value("${febs.uploadUrl}") + private String uploadUrl; + + @Override + public void addAttendanceRule(AddAttendanceRuleDTO dto) { + if (CollUtil.isEmpty(dto.getAttendanceRuleObjList())) { + throw new FebsException("请添加打卡对象"); + } + //检验规则是否冲突 + List conflictRuleVOList = checkConflict(dto); + if (CollUtil.isNotEmpty(conflictRuleVOList)) { + StringBuilder builder = new StringBuilder(); + for (ConflictRuleVO vo : conflictRuleVOList) { + builder.append(vo.getDeptName()) + .append("已存在") + .append(vo.getRuleName()) + .append("规则") + .append(","); + } + builder.append("上述规则的运行时间与本规则运行时间有重叠,请调整设置。"); + throw new FebsException(builder.toString()); + } + + if (ObjectUtil.isNotNull(dto.getId())) { + //编辑 + removeAttachedList(Lists.newArrayList(dto.getId()), false); + + //TODO 考勤时段不能删除 + //更新规则缓存信息 + redisService.hdel(CachePrefixConstant.ATTENDANCE_RULE_DATA, String.valueOf(dto.getId())); + } + AttendanceRule rule = new AttendanceRule(); + BeanUtils.copyProperties(dto, rule); + rule.setSchoolId(FebsUtil.getDeptId()); + saveOrUpdate(rule); + + List ruleObjList = new ArrayList<>(); + if (CollUtil.isNotEmpty(dto.getAttendanceRuleObjList())) { + dto.getAttendanceRuleObjList().forEach(addAttendanceRuleObjDTO -> { + AttendanceRuleObj attendanceRuleObj = new AttendanceRuleObj(); + BeanUtils.copyProperties(addAttendanceRuleObjDTO, attendanceRuleObj); + attendanceRuleObj.setUserType(dto.getUserType() == 0 ? 0 : 1); + attendanceRuleObj.setRuleId(rule.getId()); + ruleObjList.add(attendanceRuleObj); + }); + } + if (CollUtil.isNotEmpty(ruleObjList)) { + attendanceRuleObjService.saveBatch(ruleObjList); + } + + List attendanceRuleSpecialDateArrayList = new ArrayList<>(); + if (CollUtil.isNotEmpty(dto.getSpecialDateDTOList())) { + dto.getSpecialDateDTOList().forEach(specialDateDTO -> { + AttendanceRuleSpecialDate specialDate = new AttendanceRuleSpecialDate(); + BeanUtils.copyProperties(specialDateDTO, specialDate); + specialDate.setRuleId(rule.getId()); + attendanceRuleSpecialDateArrayList.add(specialDate); + }); + } + if (CollUtil.isNotEmpty(attendanceRuleSpecialDateArrayList)) { + attendanceRuleSpecialDateService.saveBatch(attendanceRuleSpecialDateArrayList); + } + + List attendanceRuleWhiteListArrayList = new ArrayList<>(); + if (CollUtil.isNotEmpty(dto.getWhiteListDTOList())) { + dto.getWhiteListDTOList().forEach(whiteListDTO -> { + AttendanceRuleWhiteList whiteList = new AttendanceRuleWhiteList(); + BeanUtils.copyProperties(whiteListDTO, whiteList); + whiteList.setRuleId(rule.getId()); + whiteList.setUserType(dto.getUserType() == 0 ? 0 : 1); + attendanceRuleWhiteListArrayList.add(whiteList); + }); + } + if (CollUtil.isNotEmpty(attendanceRuleWhiteListArrayList)) { + attendanceRuleWhiteListService.saveBatch(attendanceRuleWhiteListArrayList); + } + + List attendanceRuleDeviceArrayList = new ArrayList<>(); + if (CollUtil.isNotEmpty(dto.getDeviceDTOList())) { + dto.getDeviceDTOList().forEach(deviceDTO -> { + AttendanceRuleDevice device = new AttendanceRuleDevice(); + BeanUtils.copyProperties(deviceDTO, device); + device.setRuleId(rule.getId()); + attendanceRuleDeviceArrayList.add(device); + }); + } + if (CollUtil.isNotEmpty(attendanceRuleDeviceArrayList)) { + attendanceRuleDeviceService.saveBatch(attendanceRuleDeviceArrayList); + } + + List attendanceRuleWifiArrayList = new ArrayList<>(); + if (CollUtil.isNotEmpty(dto.getWifiDTOList())) { + dto.getWifiDTOList().forEach(wifiDTO -> { + AttendanceRuleWifi wifi = new AttendanceRuleWifi(); + BeanUtils.copyProperties(wifiDTO, wifi); + wifi.setRuleId(rule.getId()); + attendanceRuleWifiArrayList.add(wifi); + }); + } + if (CollUtil.isNotEmpty(attendanceRuleWifiArrayList)) { + attendanceRuleWifiService.saveBatch(attendanceRuleWifiArrayList); + } + + List attendanceRuleAddresseList = new ArrayList<>(); + if (CollUtil.isNotEmpty(dto.getAddressDTOList())) { + dto.getAddressDTOList().forEach(addressDTO -> { + AttendanceRuleAddress address = new AttendanceRuleAddress(); + BeanUtils.copyProperties(addressDTO, address); + address.setRuleId(rule.getId()); + attendanceRuleAddresseList.add(address); + }); + } + if (CollUtil.isNotEmpty(attendanceRuleAddresseList)) { + attendanceRuleAddressService.saveBatch(attendanceRuleAddresseList); + } + + //考勤时段 + List attendanceRuleTimeArrayList = new ArrayList<>(); + if (CollUtil.isNotEmpty(dto.getTimeDTOList())) { + dto.getTimeDTOList().forEach(timeDTO -> { + AttendanceRuleTime time = new AttendanceRuleTime(); + BeanUtils.copyProperties(timeDTO, time); + time.setRuleId(rule.getId()); + attendanceRuleTimeArrayList.add(time); + }); + } + if (CollUtil.isNotEmpty(attendanceRuleTimeArrayList)) { + attendanceRuleTimeService.saveOrUpdateBatch(attendanceRuleTimeArrayList); + } + + List attendanceRuleAdminList = new ArrayList<>(); + if (CollUtil.isNotEmpty(dto.getAdminDTOList())) { + dto.getAdminDTOList().forEach(adminDTO -> { + if (ObjectUtil.isNotNull(adminDTO.getDeptId()) && ObjectUtil.isNotNull(adminDTO.getStaffId())) { + AttendanceRuleAdmin admin = new AttendanceRuleAdmin(); + BeanUtils.copyProperties(adminDTO, admin); + admin.setRuleId(rule.getId()); + admin.setUserType(dto.getUserType() == 0 ? 0 : 1); + admin.setSchoolId(FebsUtil.getTopDeptId()); + attendanceRuleAdminList.add(admin); + } + }); + } + if (CollUtil.isNotEmpty(attendanceRuleAdminList)) { + attendanceRuleAdminService.saveBatch(attendanceRuleAdminList); + } + + List attendanceRuleRemindList = new ArrayList<>(); + if (ObjectUtil.isNotEmpty(dto.getRemindDTOList())) { + dto.getRemindDTOList().forEach(remindDTO -> { + AttendanceRuleRemind remind = new AttendanceRuleRemind(); + BeanUtils.copyProperties(remindDTO, remind); + remind.setRuleId(rule.getId()); + remind.setUserType(dto.getUserType() == 0 ? 0 : 1); + attendanceRuleRemindList.add(remind); + }); + } + if (CollUtil.isNotEmpty(attendanceRuleRemindList)) { + attendanceRuleRemindService.saveBatch(attendanceRuleRemindList); + } + + //TODO 添加具体的打卡人员 + attendanceRuleObjUserService.addRuleUser(ruleObjList, FebsUtil.getTopDeptId(), rule.getUserType()); + + //清除缓存信息 + commonService.clearAttendanceRuleData(); + } + + + @Override + public AttendanceRuleVO getRule(Long id) { + return baseMapper.getRule(id); + } + + @Override + public void deleteRule(List idList) { + removeAttachedList(idList, true); + removeByIds(idList); + + //清除缓存信息 + commonService.clearAttendanceRuleData(); + } + + @Override + public IPage listRulePage(PageAttendanceRuleDTO dto) { + return baseMapper + .listRulePage(dto.toPage(), dto.getSchoolId(), dto.getRuleName(), dto.getType(), dto.getUserType(), + dto.getStatus()); + } + + @Override + public List listRule(PageAttendanceRuleDTO dto) { + return baseMapper + .listRule(dto.getSchoolId(), dto.getRuleName(), dto.getType(), dto.getUserType(), + dto.getStatus()); + } + + @Override + public IPage listRuleAttendanceUser(AttendanceRuleUserPageDTO dto) { + List userIdList = new ArrayList<>(); + ListStudentDTO param = new ListStudentDTO(); + ListStaffDTO staffParam = new ListStaffDTO(); + if (ObjectUtil.isNotNull(dto.getUserName())) { + if (ObjectUtil.equals(dto.getUserType(), UserTypeEnum.PARENT_USER_TYPE.getType())) { + param.setStuName(dto.getUserName()); + } else { + staffParam.setName(dto.getUserName()); + } + } + param.setSchoolId(dto.getSchoolId()); + param.setCampusId(dto.getCampusId()); + param.setSectionId(dto.getSectionId()); + param.setGradeId(dto.getGradeId()); + param.setClassId(dto.getClassId()); + staffParam.setDeptId(dto.getDeptId()); + if (ObjectUtil.isNotNull(dto.getUserName()) || ObjectUtil.isNotNull(dto.getCampusId()) + || ObjectUtil.isNotNull(dto.getSectionId()) || ObjectUtil.isNotNull(dto.getGradeId()) + || ObjectUtil.isNotNull(dto.getClassId())) { + List idList = remoteStudentService.listStudent(param).getData().stream().map(EduStudent::getId) + .collect(Collectors.toList()); + if (CollUtil.isNotEmpty(idList)) { + userIdList.addAll(idList); + dto.setUserIdList(userIdList); + } else { + dto.setUserIdList(Arrays.asList(-1L)); + } + } + if (ObjectUtil.isNotNull(dto.getUserName()) || ObjectUtil.isNotNull(dto.getDeptId())) { + List idList = remoteStaffService.listStaff(staffParam).getData().stream().map(EduStaff::getId) + .collect(Collectors.toList()); + if (CollUtil.isNotEmpty(idList)) { + userIdList.addAll(idList); + dto.setUserIdList(userIdList); + } else { + dto.setUserIdList(Arrays.asList(-1L)); + } + } + + IPage attendanceRuleUserVOIPage = baseMapper.listRuleAttendanceUser(dto.toPage(), dto); + List records = attendanceRuleUserVOIPage.getRecords(); + for (AttendanceRuleUserVO record : records) { + if (ObjectUtil.equals(dto.getUserType(), UserTypeEnum.PARENT_USER_TYPE.getType())) { + //学生信息 + EduStudent student = commonService.getStudentById(record.getUserId()); + record.setUserName(student.getStuName()); + record.setDeptName(student.getCampusName() + "/" + student.getSectionName() + "/" + student.getClassName()); + } else { + EduStaff staff = commonService.getStaffById(record.getUserId()); + record.setUserName(staff.getName()); + record.setDeptName(staff.getStaffDept().get(0).getDeptName()); + } + } + return attendanceRuleUserVOIPage; + } + + @Override + public void deleteRuleAttendanceUser(List ids) { + //删除今日考勤结果 + for (Long id : ids) { + AttendanceRuleObjUser objUser = attendanceRuleObjUserService.getById(id); + attendanceResultMapper.delete(Wrappers.lambdaQuery(new AttendanceResult()) + .eq(AttendanceResult::getAttendanceDate, LocalDate.now()) + .eq(AttendanceResult::getRuleId, objUser.getRuleId()) + .eq(AttendanceResult::getUserId, objUser.getUserId()) + .eq(AttendanceResult::getUserType, objUser.getUserType())); + } + //删除主体 + attendanceRuleObjUserService.removeByIds(ids); + } + + @Override + public void addRuleAttendanceUser(AttendanceRuleUserAddDTO dto) { + AttendanceRuleObjUser objUser = new AttendanceRuleObjUser(); + BeanUtils.copyProperties(dto, objUser); + if (ObjectUtil.equals(dto.getUserType(), UserTypeEnum.PARENT_USER_TYPE.getType())) { + EduStudent student = commonService.getStudentById(dto.getUserId()); + if (ObjectUtil.isNull(student)) { + throw new FebsException("用户不存在"); + } + List list = attendanceRuleObjUserService.list(Wrappers.lambdaQuery(new AttendanceRuleObjUser()) + .eq(AttendanceRuleObjUser::getUserId, dto.getUserId()) + .eq(AttendanceRuleObjUser::getUserType, dto.getUserType()) + .eq(AttendanceRuleObjUser::getRuleId, dto.getRuleId())); + + if (CollUtil.isNotEmpty(list)) { + throw new FebsException("用户已添加"); + } + if (ObjectUtil.isNotNull(student)) { + objUser.setDeptId(student.getClassId()); + objUser.setUserName(student.getStuName()); + } + + List objList = attendanceRuleObjService.list(Wrappers.lambdaQuery(new AttendanceRuleObj()) + .eq(AttendanceRuleObj::getRuleId, dto.getRuleId()) + .eq(AttendanceRuleObj::getDeptId, student.getClassId()) + .eq(AttendanceRuleObj::getUserType, dto.getUserType())); + + if (CollUtil.isEmpty(objList)) { + throw new FebsException("用户部门未加入考勤规则,请编辑规则"); + } + } else { + EduStaff staff = commonService.getStaffById(dto.getUserId()); + if (ObjectUtil.isNull(staff)) { + throw new FebsException("用户不存在"); + } + List list = attendanceRuleObjUserService.list(Wrappers.lambdaQuery(new AttendanceRuleObjUser()) + .eq(AttendanceRuleObjUser::getUserId, dto.getUserId()) + .eq(AttendanceRuleObjUser::getUserType, dto.getUserType()) + .eq(AttendanceRuleObjUser::getRuleId, dto.getRuleId())); + + if (CollUtil.isNotEmpty(list)) { + throw new FebsException("用户已添加"); + } + if (ObjectUtil.isNotNull(staff)) { + objUser.setDeptId(staff.getStaffDept().get(0).getDeptId()); + objUser.setUserName(staff.getName()); + } + + List objList = attendanceRuleObjService.list(Wrappers.lambdaQuery(new AttendanceRuleObj()) + .eq(AttendanceRuleObj::getRuleId, dto.getRuleId()) + .eq(AttendanceRuleObj::getDeptId, staff.getStaffDept().get(0).getDeptId()) + .eq(AttendanceRuleObj::getUserType, dto.getUserType())); + + if (CollUtil.isEmpty(objList)) { + throw new FebsException("用户部门未加入考勤规则,请编辑规则"); + } + } + + AttendanceRuleVO rule = getRule(dto.getRuleId()); + + AttendanceResult result = new AttendanceResult(); + result.setAttType(rule.getType()); + result.setUserType(objUser.getUserType()); + result.setUserId(objUser.getUserId()); + result.setSchoolId(rule.getSchoolId()); + result.setRuleId(rule.getId()); + + for (AddAttendanceRuleTimeDTO ruleTimeDTO : rule.getTimeDTOList()) { + long count = attendanceResultMapper.selectCount(Wrappers.lambdaQuery(new AttendanceResult()) + .eq(AttendanceResult::getAttendanceDate, LocalDate.now()) + .eq(AttendanceResult::getUserId, objUser.getUserId()) + .eq(AttendanceResult::getRuleId, rule.getId()) + .eq(AttendanceResult::getRuleTimeId, ruleTimeDTO.getId())); + if (count == 0) { + result.setRuleTimeId(ruleTimeDTO.getId()); + result.setStartStiTime(ruleTimeDTO.getStartTime()); + result.setEndStiTime(ruleTimeDTO.getEndTime()); + result.setAttendanceDate(LocalDate.now()); + } + } + attendanceResultMapper.insert(result); + attendanceRuleObjUserService.save(objUser); + } + + @Override + public void updateRuleStatus(UpdateAttendanceRuleStatusDTO dto) { + update(Wrappers.lambdaUpdate(new AttendanceRule()) + .eq(AttendanceRule::getId, dto.getId()) + .set(AttendanceRule::getStatus, dto.getStatus())); + } + + @Override + public AttendanceRuleVO findUserMatchRule(Integer userType, Long userId, String deviceSn, String wifiName, String wifiBssid, + LocalDate currentDate, Long schoolId) { + //查询user 所属deptId + List deptIdList = new ArrayList<>(); + if (ObjectUtil.isNull(userType)) { + return null; + } + if (UserTypeEnum.STAFF_USER_TYPE.getType().equals(userType)) { + //教职工 + EduStaff staff = remoteStaffService.getStaff(userId).getData(); + if (Objects.isNull(staff)) { + if (redisService.hHasKey(CachePrefixConstant.STAFF_DATA, userId.toString())) { + redisService.hdel(CachePrefixConstant.STAFF_DATA, userId.toString()); + } + log.error("职工不存在,id:[{}]", userId); + return null; + } + if (ObjectUtil.isNull(schoolId)) { + schoolId = staff.getSchoolId(); + } + List staffDeptIdList = staff.getStaffDept().stream().map(EduStaffDept::getDeptId).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(staffDeptIdList)) { + deptIdList = remoteDeptService.listParentDeptByChild(staffDeptIdList).getData().stream().map(Dept::getDeptId) + .collect(Collectors.toList()); + } + } else { + EduStudent student = remoteStudentService.getStudentNoPermission(userId).getData(); + + if (ObjectUtil.isNull(student)) { + if (redisService.hHasKey(CachePrefixConstant.STUDENT_DATA, userId.toString())) { + redisService.hdel(CachePrefixConstant.STUDENT_DATA, userId.toString()); + } + log.error("学生不存在,id:[{}]", userId); + return null; + } + if (ObjectUtil.isNull(schoolId)) { + schoolId = student.getSchoolId(); + } + deptIdList = Lists + .newArrayList(-student.getSchoolId(), student.getCampusId(), student.getSectionId(), student.getGradeId(), + student.getClassId()); + } + + if (CollUtil.isNotEmpty(deptIdList)) { + if (ObjectUtil.isNotNull(deviceSn)) { + List userMatchRuleByDevice = baseMapper + .findUserMatchRuleByDevice(userType, deptIdList, deviceSn, currentDate, currentDate.getDayOfWeek().getValue(), + schoolId); + if (CollUtil.isEmpty(userMatchRuleByDevice)) { + return null; + } else { + return userMatchRuleByDevice.get(0); + } + } else if (ObjectUtil.isNotNull(wifiBssid) && ObjectUtil.isNotNull(wifiName)) { + List userMatchRuleByWifi = baseMapper + .findUserMatchRuleByWifi(userType, deptIdList, wifiName, wifiBssid, null, currentDate, + currentDate.getDayOfWeek().getValue(), + schoolId); + if (CollUtil.isEmpty(userMatchRuleByWifi)) { + return null; + } else { + return userMatchRuleByWifi.get(0); + } + } + } + return null; + } + + @Override + public AttendanceFaceMatchVO AttendanceFaceMatch(AttendanceFaceMatchDTO dto) { + File file = null; + try { + String avatar = ""; + if (UserTypeEnum.STAFF_USER_TYPE.getType().equals(dto.getUserType())) { + EduStaff staff = commonService.getStaffById(dto.getUserId()); + avatar = staff.getAvatar(); + } else if (UserTypeEnum.PARENT_USER_TYPE.getType().equals(dto.getUserType())) { + EduStudent student = commonService.getStudentById(dto.getUserId()); + avatar = student.getAvatar(); + } else { + throw new FebsException("人员类型信息错误, 0=教职工,1=学生"); + } + if (ObjectUtil.isEmpty(avatar)) { + throw new FebsException("暂无人员人脸信息,请联系管理员"); + } + // 查询百度api配置信息 + BaiduApiConfig config = commonService + .getBaiDuApiConfigByDept(dto.getSchoolId(), BaiDuModuleEnum.FACE_DETECT.getValue()); + + if (Objects.isNull(config)) { + log.error("获取百度api相关信息错误deptId: {}", dto.getSchoolId()); + throw new FebsException("暂未配置人脸对比信息"); + } + // 人脸对比 阈值80 + String score = BaiDuUtil.faceMatch(config, avatar, dto.getBase64()); + int valid = NumberUtil.isLess(new BigDecimal("65"), new BigDecimal(score)) ? 1 : 0; + AttendanceFaceMatchVO matchVO = AttendanceFaceMatchVO + .builder() + .valid(valid) + .score(score) + .build(); + // 对比成功则上传图片 + if (valid == 1) { + String fileName = FileUtil.getLocalUploadAddress() + UUID.randomUUID() + ".png"; + file = new File(fileName); + // 上传图片 + file = Base64.decodeToFile(dto.getBase64(), file); + String url = FileUtil.uploadFileToMediaServer(uploadUrl, file); + matchVO.setUrl(url); + } else { + log.info("用户:{},人脸比对值:{}", dto.getUserId(), score); + } + return matchVO; + } catch (Exception e) { + throw new FebsException(e instanceof FebsException ? e.getMessage() : "人脸对比失败"); + } finally { + if (Objects.nonNull(file)) { + cn.hutool.core.io.FileUtil.del(file); + } + } + } + + @Override + public List findByUserIdAndUserType(Long userId, Integer userType) { + return baseMapper.findByUserIdAndUserType(userId, userType); + } + + + @Override + public List findUserManageRuleList(Long userId, Integer searchUserType) { + return baseMapper.findUserManageRuleList(userId, searchUserType); + } + + @Override + public List getSchoolIdList() { + return baseMapper.getSchoolIdList(); + } + + @Override + public IPage listRuleAttendanceAdminUser(AttendanceRuleAdminUserPageDTO dto) { + //根据条件查询下级部门ID + if (ObjectUtil.isNotNull(dto.getClassId())) { + dto.setDeptIdList(Arrays.asList(dto.getClassId())); + } else if (ObjectUtil.isNotNull(dto.getGradeId())) { + List deptList = remoteUserDeptService.findListByParent(dto.getGradeId()).getData(); + if (CollUtil.isNotEmpty(deptList)) { + List deptIdList = deptList.stream().map(EduUserDept::getDeptId).collect(Collectors.toList()); + deptIdList.add(dto.getGradeId()); + dto.setDeptIdList(deptIdList); + } else { + dto.setDeptIdList(Arrays.asList(dto.getGradeId())); + } + } else if (ObjectUtil.isNotNull(dto.getSectionId())) { + List deptList = remoteUserDeptService.findListByParent(dto.getSectionId()).getData(); + if (CollUtil.isNotEmpty(deptList)) { + List deptIdList = deptList.stream().map(EduUserDept::getDeptId).collect(Collectors.toList()); + deptIdList.add(dto.getSectionId()); + dto.setDeptIdList(deptIdList); + } else { + dto.setDeptIdList(Arrays.asList(dto.getGradeId())); + } + } else if (ObjectUtil.isNotNull(dto.getCampusId())) { + List deptList = remoteUserDeptService.findListByParent(dto.getCampusId()).getData(); + if (CollUtil.isNotEmpty(deptList)) { + List deptIdList = deptList.stream().map(EduUserDept::getDeptId).collect(Collectors.toList()); + deptIdList.add(dto.getCampusId()); + dto.setDeptIdList(deptIdList); + } else { + dto.setDeptIdList(Arrays.asList(dto.getGradeId())); + } + } + + if (ObjectUtil.isNotEmpty(dto.getStaffName())) { + ListStaffDTO param = new ListStaffDTO(); + param.setName(dto.getStaffName()); + List eduStaffList = remoteStaffService.listStaff(param).getData(); + if (CollUtil.isNotEmpty(eduStaffList)) { + List staffIdList = eduStaffList.stream().map(EduStaff::getId).collect(Collectors.toList()); + dto.setStaffIdList(staffIdList); + } + } + + IPage attendanceRuleAdminUserVOIPage = baseMapper + .listRuleAttendanceAdminUser(dto.toPage(), dto); + + List records = attendanceRuleAdminUserVOIPage.getRecords(); + for (AttendanceRuleAdminUserVO record : records) { + //查询部门Name + List eduUserDeptList = remoteUserDeptService.getParentListByDeptId(record.getDeptId()).getData(); + Collections.reverse(eduUserDeptList); + record.setDeptName(eduUserDeptList.stream() + .filter(eduUserDept -> ObjectUtil.isNotNull(eduUserDept) && ObjectUtil.isNotNull(eduUserDept.getDeptName())) + .map(EduUserDept::getDeptName).collect(Collectors.joining("/"))); + record.setStaffName(commonService.getStaffById(record.getStaffId()).getName()); + } + + return attendanceRuleAdminUserVOIPage; + } + + @Override + public void addAttendanceAdminUser(AttendanceRuleAdminUserAddDTO dto) { + AttendanceRuleAdmin admin = new AttendanceRuleAdmin(); + BeanUtils.copyProperties(dto, admin); + admin.setUserType(UserTypeEnum.PARENT_USER_TYPE.getType()); + admin.setSchoolId(FebsUtil.getTopDeptId()); + attendanceRuleAdminService.saveOrUpdate(admin); + } + + @Override + public void deleteRuleAttendanceAdminUser(List ids) { + attendanceRuleAdminService.removeByIds(ids); + } + + @Override + public List getDayReport(Long staffId, Integer userType, Long ruleId, String attendanceDateStr) { + + LocalDate attendanceDate = LocalDate.parse(attendanceDateStr, DateTimeFormatter.ofPattern("yyyy-MM-dd")); + + //今日未打卡人员 + List resultList = attendanceResultMapper.selectList(Wrappers.lambdaQuery(new AttendanceResult()) + .eq(AttendanceResult::getRuleId, ruleId) + .eq(AttendanceResult::getAttendanceDate, attendanceDate) + .isNull(AttendanceResult::getStartStatus)); + + List adminList = attendanceRuleAdminService.list(Wrappers.lambdaQuery(new AttendanceRuleAdmin()) + .eq(AttendanceRuleAdmin::getRuleId, ruleId) + .eq(AttendanceRuleAdmin::getStaffId, staffId)); + + List dayReportDataVOS = new ArrayList<>(); + for (AttendanceRuleAdmin attendanceRuleAdmin : adminList) { + DayReportDataVO vo = new DayReportDataVO(); + List deptIdList = new ArrayList<>(); + if (ObjectUtil.equals(UserTypeEnum.PARENT_USER_TYPE.getType(), userType)) { + EduUserDept userDept = commonService.getUserDept(attendanceRuleAdmin.getDeptId()); + vo.setDeptName(ObjectUtil.isNull(userDept) ? "未知班级" : userDept.getDeptName()); + if (ObjectUtil.isNotNull(userDept)) { + if (ObjectUtil.equals(UserDeptTypeEnum.CLASS_TYPE.getValue(), userDept.getDeptType())) { + deptIdList = Arrays.asList(userDept.getDeptId()); + } else { + //查看班级 + deptIdList = remoteUserDeptService + .findChildIdByParentAndTypeNoPermission(attendanceRuleAdmin.getDeptId(), 1) + .getData().stream().map(EduUserDept::getDeptId).collect( + Collectors.toList()); + } + } + } else { + Dept dept = commonService.getDept(attendanceRuleAdmin.getDeptId()); + vo.setDeptName(ObjectUtil.isNull(dept) ? "未知部门" : dept.getDeptName()); + deptIdList = Arrays.asList(dept.getDeptId()); + } + //管理总人数 + if (CollUtil.isEmpty(deptIdList)) { + vo.setTotalNum(0); + vo.setAbNum(0); + vo.setRequestNum(0); + } else { + List mangerUserIdList = attendanceRuleObjUserService + .list(Wrappers.lambdaQuery(new AttendanceRuleObjUser()) + .in(AttendanceRuleObjUser::getDeptId, deptIdList) + .eq(AttendanceRuleObjUser::getRuleId, ruleId)).stream().map(AttendanceRuleObjUser::getUserId) + .collect( + Collectors.toList()); + //未打卡人数 + List mangerResultList = + CollUtil.isEmpty(mangerUserIdList) ? new ArrayList<>() : resultList.stream() + .filter(result -> mangerUserIdList.contains(result.getUserId())).collect(Collectors.toList()); + + vo.setTotalNum(mangerUserIdList.size()); + vo.setAbNum(mangerResultList.size()); + + //查询请假人数 + if (CollUtil.isEmpty(mangerUserIdList)) { + vo.setRequestNum(0); + } else { + ListUserRequestDTO requestDTO = new ListUserRequestDTO(); + requestDTO.setRequestType(userType); + requestDTO.setStartTime(attendanceDate.atTime(LocalTime.of(00, 00, 01))); + requestDTO.setEndTime(attendanceDate.atTime(LocalTime.of(23, 59, 59))); + requestDTO.setUserIdList(mangerUserIdList); + List requestUserVOList = remoteLeaveRequestService.findList(requestDTO).getData(); + vo.setRequestNum( + requestUserVOList.stream().collect(Collectors.groupingBy(EduLeaveRequestUserVO::getUserId)) + .size()); + } + + String scoreStr = ""; + if (vo.getTotalNum() == 0) { + scoreStr = "0.00%"; + } else { + double score = + (double) ((vo.getTotalNum() - vo.getAbNum()) * 100) / vo + .getTotalNum(); + scoreStr = String.format("%.2f", score) + "%"; + } + vo.setScore(scoreStr); + vo.setDate(attendanceDate); + dayReportDataVOS.add(vo); + } + } + return dayReportDataVOS; + } + + public List checkConflict(AddAttendanceRuleDTO rule) { + List deptIdList = rule.getAttendanceRuleObjList().stream().map(x -> x.getDeptId()).collect(Collectors.toList()); + if (CollUtil.isEmpty(deptIdList)) { + return new ArrayList<>(); + } + // 查询有关联的部门 + List deptIds = remoteUserDeptService.getUpAndDownId(deptIdList.toArray(new Long[0])).getData(); + log.info("deptIds:[{}]", deptIds); + String[] weekList = rule.getWeek().split(","); + List conflictRuleVOList = new ArrayList<>(); + for (String week : weekList) { + List conflictRuleVOS = baseMapper + .checkNormalRule(deptIds, rule.getStartDate(), rule.getEndDate(), rule.getUserType(), rule.getId(), week); + if (CollUtil.isNotEmpty(conflictRuleVOS)) { + conflictRuleVOList.addAll(conflictRuleVOS); + } + } + return conflictRuleVOList; + } + + /** + * 删除规则附表 + */ + public void removeAttachedList(List ruleIdList, Boolean type) { + + attendanceRuleObjService.remove(Wrappers.lambdaQuery(new AttendanceRuleObj()) + .in(AttendanceRuleObj::getRuleId, ruleIdList)); + + attendanceRuleObjUserService.remove(Wrappers.lambdaQuery(new AttendanceRuleObjUser()) + .in(AttendanceRuleObjUser::getRuleId, ruleIdList)); + + attendanceRuleSpecialDateService.remove(Wrappers.lambdaQuery(new AttendanceRuleSpecialDate()) + .in(AttendanceRuleSpecialDate::getRuleId, ruleIdList)); + + attendanceRuleWhiteListService.remove(Wrappers.lambdaQuery(new AttendanceRuleWhiteList()) + .in(AttendanceRuleWhiteList::getRuleId, ruleIdList)); + + attendanceRuleDeviceService.remove(Wrappers.lambdaQuery(new AttendanceRuleDevice()) + .in(AttendanceRuleDevice::getRuleId, ruleIdList)); + + attendanceRuleWifiService.remove(Wrappers.lambdaQuery(new AttendanceRuleWifi()) + .in(AttendanceRuleWifi::getRuleId, ruleIdList)); + + attendanceRuleAddressService.remove(Wrappers.lambdaQuery(new AttendanceRuleAddress()) + .in(AttendanceRuleAddress::getRuleId, ruleIdList)); + + if (type) { + attendanceRuleTimeService.remove(Wrappers.lambdaQuery(new AttendanceRuleTime()) + .in(AttendanceRuleTime::getRuleId, ruleIdList)); + } + + attendanceRuleAdminService.remove(Wrappers.lambdaQuery(new AttendanceRuleAdmin()) + .in(AttendanceRuleAdmin::getRuleId, ruleIdList)); + + attendanceRuleRemindService.remove(Wrappers.lambdaQuery(new AttendanceRuleRemind()) + .in(AttendanceRuleRemind::getRuleId, ruleIdList)); + } + + +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceRuleSpecialDateServiceImpl.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceRuleSpecialDateServiceImpl.java new file mode 100644 index 0000000..a42be08 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceRuleSpecialDateServiceImpl.java @@ -0,0 +1,25 @@ +package com.yida.data.attendance.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.attendance.mapper.AttendanceRuleSpecialDateMapper; +import com.yida.data.attendance.service.AttendanceRuleSpecialDateService; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRuleSpecialDate; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +/** +* 考勤-特殊日期 Service实现 +* +* @date 2023-08-09 11:37:25 +*/ +@Service +@RequiredArgsConstructor +@Transactional(propagation = Propagation.SUPPORTS, readOnly = true) +public class AttendanceRuleSpecialDateServiceImpl extends ServiceImpl + implements AttendanceRuleSpecialDateService { + + + +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceRuleTimeServiceImpl.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceRuleTimeServiceImpl.java new file mode 100644 index 0000000..f51d78e --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceRuleTimeServiceImpl.java @@ -0,0 +1,37 @@ +package com.yida.data.attendance.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.attendance.dto.AddAttendanceRuleTimeDTO; +import com.yida.data.attendance.mapper.AttendanceRuleTimeMapper; +import com.yida.data.attendance.service.AttendanceRuleTimeService; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRuleTime; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +/** + * 考勤-打卡时段 Service实现 + * + * @date 2023-08-09 11:37:25 + */ +@Service +@RequiredArgsConstructor +@Transactional(propagation = Propagation.SUPPORTS, readOnly = true) +public class AttendanceRuleTimeServiceImpl extends ServiceImpl + implements AttendanceRuleTimeService { + + + @Override + public AddAttendanceRuleTimeDTO get(Long id) { + AttendanceRuleTime time = getById(id); + if (ObjectUtil.isNull(time)) { + return null; + } + AddAttendanceRuleTimeDTO timeDTO = new AddAttendanceRuleTimeDTO(); + BeanUtils.copyProperties(time, timeDTO); + return timeDTO; + } +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceRuleWhiteListServiceImpl.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceRuleWhiteListServiceImpl.java new file mode 100644 index 0000000..41a0ca3 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceRuleWhiteListServiceImpl.java @@ -0,0 +1,25 @@ +package com.yida.data.attendance.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.attendance.mapper.AttendanceRuleWhiteListMapper; +import com.yida.data.attendance.service.AttendanceRuleWhiteListService; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRuleWhiteList; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +/** +* 考勤-白名单 Service实现 +* +* @date 2023-08-09 11:37:25 +*/ +@Service +@RequiredArgsConstructor +@Transactional(propagation = Propagation.SUPPORTS, readOnly = true) +public class AttendanceRuleWhiteListServiceImpl extends ServiceImpl + implements AttendanceRuleWhiteListService { + + + +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceRuleWifiServiceImpl.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceRuleWifiServiceImpl.java new file mode 100644 index 0000000..00e57db --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/AttendanceRuleWifiServiceImpl.java @@ -0,0 +1,101 @@ +package com.yida.data.attendance.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.excel.EasyExcel; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.attendance.dto.BssidImportDTO; +import com.yida.data.attendance.excel.BssidExcelListener; +import com.yida.data.attendance.mapper.AttendanceRuleWifiMapper; +import com.yida.data.attendance.service.AttendanceRuleWifiService; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRule; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRuleObjUser; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRuleWifi; +import com.yida.data.common.core.entity.constant.CachePrefixConstant; +import com.yida.data.common.core.exception.FebsException; +import com.yida.data.common.core.utils.FileUtil; +import com.yida.data.common.service.CommonService; +import com.yida.data.school.dto.smart.GuideRosterErrorExportDTO; +import com.yida.data.school.dto.smart.GuideRosterImportDTO; +import com.yida.data.school.vo.smart.ImportRosterDataVO; +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.ehcache.impl.internal.concurrent.ConcurrentHashMap; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StopWatch; + +/** + * 考勤规则关联wifi Service实现 + * + * @date 2023-08-09 11:37:25 + */ +@Slf4j +@Service +@RequiredArgsConstructor +@Transactional(propagation = Propagation.SUPPORTS, readOnly = true) +public class AttendanceRuleWifiServiceImpl extends ServiceImpl + implements AttendanceRuleWifiService { + + private final CommonService commonService; + + @Override + public void ImportBssid(String fileUrl, Long ruleId) { + // 上传的excel文件 + File file = null; + // 错误信息文件excel + File errorFile = null; + try { + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); + // 调用导入方法 + List errorList = new ArrayList<>(); + file = new File(fileUrl); + EasyExcel.read(file, BssidImportDTO.class, + new BssidExcelListener(this, ruleId)) + .sheet().headRowNumber(1).doRead(); + stopWatch.stop(); + log.info("导入指南花名册数据总共耗时: {}", stopWatch.getTotalTimeSeconds() + "秒"); + } catch (Exception e) { + log.error("导入指南花名册数据失败: {}", e.getMessage(), e); + throw new FebsException("导入失败!请重新操作"); + } finally { + if (Objects.nonNull(file)) { + cn.hutool.core.io.FileUtil.del(file); + } + if (Objects.nonNull(errorFile)) { + cn.hutool.core.io.FileUtil.del(errorFile); + } + } + } + + @Override + public void addBssidList(ConcurrentHashMap concurrentHashMap, Long ruleId) { + List wifiList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(concurrentHashMap)) { + for (Map.Entry entry : concurrentHashMap.entrySet()) { + AttendanceRuleWifi wifi = new AttendanceRuleWifi(); + if (ObjectUtil.isNotNull(entry.getValue().getWifiBssid()) && ObjectUtil + .isNotNull(entry.getValue().getWifiName())) { + wifi.setWifiBssid(entry.getValue().getWifiBssid()); + wifi.setWifiName(entry.getValue().getWifiName()); + wifi.setRuleId(ruleId); + wifiList.add(wifi); + } + } + } + if (CollUtil.isNotEmpty(wifiList)) { + saveBatch(wifiList); + + //清除缓存信息 + commonService.clearAttendanceRuleData(); + } + } +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/EduAttendanceDeviceGroupServiceImpl.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/EduAttendanceDeviceGroupServiceImpl.java new file mode 100644 index 0000000..c5dff9b --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/EduAttendanceDeviceGroupServiceImpl.java @@ -0,0 +1,117 @@ +package com.yida.data.attendance.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.attendance.mapper.EduAttendanceDeviceGroupMapper; +import com.yida.data.attendance.mapper.EduDeviceGroupMapper; +import com.yida.data.attendance.service.EduAttendanceDeviceGroupService; +import com.yida.data.attendance.vo.DeviceOrDeviceGroupVO; +import com.yida.data.common.core.entity.CurrentUser; +import com.yida.data.common.core.entity.attendance.EduAttendanceDevice; +import com.yida.data.common.core.entity.attendance.EduAttendanceDeviceGroup; +import com.yida.data.common.core.entity.system.Dept; +import com.yida.data.common.core.entity.system.enums.RoleEnum; +import com.yida.data.common.core.utils.FebsUtil; +import com.yida.data.common.core.utils.RoleUtil; +import com.yida.data.system.feign.RemoteDeptService; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; +import javax.annotation.Resource; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + + +/** + * 设备分组表 Service实现 + * + * @author zhanghaijun + * @date 2021-06-16 15:27:11 + */ +@Service +@RequiredArgsConstructor +@Transactional(propagation = Propagation.SUPPORTS, readOnly = true) +public class EduAttendanceDeviceGroupServiceImpl extends ServiceImpl + implements EduAttendanceDeviceGroupService { + + private final EduDeviceGroupMapper eduDeviceGroupMapper; + + private final RemoteDeptService remoteDeptService; + + @Resource + private EduAttendanceDeviceGroupMapper eduAttendanceDeviceGroupMapper; + + /** + * 分页查分组 + * + * @param current + * @param size + * @return + */ + + @Override + public IPage selectGroup(String name, Long current, Long size, Long schoolId) + throws NoSuchMethodException { + Page page = new Page<>(current, size); + CurrentUser currentUser = FebsUtil.getCurrentUser(); + // 获取登陆用户的最大角色 + RoleEnum roleEnum = RoleUtil.getMaxRole(currentUser); + + List schoolIds = new ArrayList<>(); + // 代理商相关账号 + if (RoleEnum.ROLE_AGENT_ADMIN.equals(roleEnum) || RoleEnum.ROLE_AGENT_NORMAL.equals(roleEnum)) { + if (schoolId != null) { + schoolIds.add(schoolId); + } else { + List deptList = remoteDeptService.getSchoolByArea(null, null).getData(); + if (CollUtil.isNotEmpty(deptList)) { + schoolIds = deptList.stream().map(Dept::getDeptId).collect(Collectors.toList()); + } + } + } else { + // 学校账号 + schoolIds.add(currentUser.getDeptId()); + } + + return baseMapper.selectGroup(page, name, schoolIds); + } + + @Override + public List selectGroupAll() { + + return eduAttendanceDeviceGroupMapper.selectList(null); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void insertGroup(EduAttendanceDeviceGroup eduAttendanceDeviceGroup) { + + baseMapper.insert(eduAttendanceDeviceGroup); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateGroup(EduAttendanceDeviceGroup eduAttendanceDeviceGroup) { + baseMapper.updateById(eduAttendanceDeviceGroup); + } + + @Override + public void delGroup(Long id) { + + removeById(id); + } + + @Override + public List listDeviceAndDevice(String keyword, Long schoolId) { + return baseMapper.listDeviceAndGroup(keyword, schoolId); + } + + @Override + public List listDeviceByGroup(List groupIds) { + return baseMapper.listDeviceByGroup(groupIds); + } +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/EduAttendanceDeviceServiceImpl.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/EduAttendanceDeviceServiceImpl.java new file mode 100644 index 0000000..63d3da7 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/EduAttendanceDeviceServiceImpl.java @@ -0,0 +1,681 @@ +package com.yida.data.attendance.service.impl; + +import cc.mrbird.febs.common.redis.service.RedisService; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.LocalDateTimeUtil; +import cn.hutool.core.thread.ThreadFactoryBuilder; +import cn.hutool.core.thread.ThreadUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.attendance.dto.DevicePage; +import com.yida.data.attendance.dto.IssuedFaceDTO; +import com.yida.data.attendance.dto.RemoveFaceDTO; +import com.yida.data.attendance.mapper.EduAttendanceDeviceMapper; +import com.yida.data.attendance.service.AttendanceRuleDeviceService; +import com.yida.data.attendance.service.EduAttendanceDeviceService; +import com.yida.data.attendance.utils.MqttUtil; +import com.yida.data.attendance.vo.DeviceNumberVO; +import com.yida.data.attendance.vo.DeviceVO; +import com.yida.data.attendance.vo.OnlineCountVO; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.CurrentUser; +import com.yida.data.common.core.entity.agent.EduAgentWxPublicReceiver; +import com.yida.data.common.core.entity.attendance.EduAttendanceDevice; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRuleDevice; +import com.yida.data.common.core.entity.attendance.enums.DeviceStateEnum; +import com.yida.data.common.core.entity.constant.CachePrefixConstant; +import com.yida.data.common.core.entity.constant.hq.HaiqingConstant; +import com.yida.data.common.core.entity.constant.LockPrefixConstant; +import com.yida.data.common.core.entity.constant.StringConstant; +import com.yida.data.common.core.entity.system.Dept; +import com.yida.data.common.core.entity.system.EduDeptWxPublic; +import com.yida.data.common.core.entity.system.enums.RoleEnum; +import com.yida.data.common.core.entity.user.EduFaceGroupUser; +import com.yida.data.common.core.entity.user.EduUserDevice; +import com.yida.data.common.core.entity.user.EduUserDeviceFactory; +import com.yida.data.common.core.entity.user.EduUserFace; +import com.yida.data.common.core.enums.DeviceType; +import com.yida.data.common.core.enums.IssuedTypeEnum; +import com.yida.data.common.core.exception.FebsException; +import com.yida.data.common.core.utils.EnumUtils; +import com.yida.data.common.core.utils.FebsUtil; +import com.yida.data.common.core.utils.WxPublicUtil; +import com.yida.data.common.service.CommonService; +import com.yida.data.system.feign.RemoteAgentService; +import com.yida.data.system.feign.RemoteDeptService; +import com.yida.data.user.dto.UpdateFaceGroupUserStatusDTO; +import com.yida.data.user.feign.RemoteUserDeviceFactoryService; +import com.yida.data.user.feign.RemoteUserDeviceService; + +import java.time.LocalDateTime; +import java.util.*; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +import com.yida.data.user.feign.RemoteUserFaceService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@Slf4j +@RequiredArgsConstructor +public class EduAttendanceDeviceServiceImpl extends + ServiceImpl implements EduAttendanceDeviceService { + + private static final ThreadFactory FACE_THREAD_FACTORY = new ThreadFactoryBuilder() + .setNamePrefix("hq-issue-face-factory-").build(); + private static final ExecutorService FACE_POOL = new ThreadPoolExecutor(10, 10, 1000, + TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(), FACE_THREAD_FACTORY); + + private final AttendanceRuleDeviceService attendanceRuleDeviceService; + + private final RemoteDeptService remoteDeptService; + private final RemoteAgentService remoteAgentService; + private final RemoteUserFaceService remoteUserFaceService; + private final RemoteUserDeviceService remoteUserDeviceService; + private final RemoteUserDeviceFactoryService remoteUserDeviceFactoryService; + + private final MqttUtil mqttUtil; + private final RedisService redisService; + private final WxPublicUtil wxPublicUtil; + private final CommonService commonService; + + @Override + + public DevicePage listDevicePage(DevicePage page, String schoolName, String number, + Integer scope, Integer type, Integer state, + CurrentUser currentUser) { + List schoolIds = new ArrayList<>(); + // 查询关联学校信息 + List deptList = this.remoteDeptService.getSchoolByArea(null, schoolName).getData(); + if (CollUtil.isNotEmpty(deptList)) { + schoolIds = deptList.stream().map(Dept::getDeptId).collect(Collectors.toList()); + } else { + // 添加默认值,防止报错 + schoolIds.add(-1L); + } + + DevicePage res = baseMapper.listDevicePage(page, schoolIds, number, scope, type, state); + // 在线离线数量 + res.setOnlineNumber((int) count(Wrappers.lambdaQuery() + .eq(EduAttendanceDevice::getState, DeviceStateEnum.ONLINE_STATUS.getStatus()) + .in(EduAttendanceDevice::getSchoolId, schoolIds))); + res.setOfflineNumber((int) count(Wrappers.lambdaQuery() + .eq(EduAttendanceDevice::getState, DeviceStateEnum.OFFLINE_STATUS.getStatus()) + .in(EduAttendanceDevice::getSchoolId, schoolIds))); + + if (CollUtil.isNotEmpty(res.getRecords())) { + for (DeviceVO record : res.getRecords()) { + record.setSchoolName(commonService.getDept(record.getSchoolId()).getDeptName()); + } + } + return res; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public EduAttendanceDevice saveDevice(EduAttendanceDevice device) { + + // 判断设备编号是否重复 + EduAttendanceDevice exist = baseMapper.checkSn(device); + if (Objects.nonNull(exist)) { + throw new FebsException("该设备号已存在!请检查后重新保存"); + } + + if (StrUtil.isNotEmpty(device.getSn()) && DeviceType.HAIQING.getValue() + .equals(device.getDeviceType())) { + // 设置删除策略信息 + JSONObject params = JSONUtil.createObj() + .set("operator", HaiqingConstant.UP_DOOR_CONFIG) + .set("messageId", StrUtil.uuid().replace("-", "")) + .set("info", JSONUtil.createObj() + // 0:未开启(绑定空策略人员允许通行),1:开启(绑定空策略人员不可通行) + .set("IsASCheck", "1")); + Boolean flag = mqttUtil.publish(params.toString(), "mqtt/face/" + device.getSn()); + if (!flag) { + throw new FebsException("保存设备失败"); + } + + if (Objects.isNull(device.getId())) { + mqttUtil.addTopic("$queue/mqtt/face/" + device.getSn() + "/Ack"); + mqttUtil.addTopic("$queue/mqtt/face/" + device.getSn() + "/Rec"); + } + } + if (StrUtil.isNotBlank(device.getMacAddress())) { + device.setMacAddress(device.getMacAddress().toUpperCase()); + } + saveOrUpdate(device); + redisService.hdel(CachePrefixConstant.DEVICE_DATA, device.getSn()); + redisService.hdel(CachePrefixConstant.DEVICE_DATA_BY_ID, String.valueOf(device.getId())); + return device; + } + + /** + * 批量openDoor + * + * @param list + */ + + @Override + public void openAllDoor(List list) { + list.forEach(s -> mqttUtil.publish(spliceOpenDoor(), + spliceTopic(s))); + } + + /** + * 批量设置时间 + * + * @param list + */ + @Override + public void setAllTime(List list) { + list.forEach(s -> mqttUtil.publish(spliceSetSysTime(), spliceTopic(s))); + } + + @Override + public void openDoor(String id) { + mqttUtil.publish(spliceOpenDoor(), spliceTopic(id)); + + } + + @Override + public void setSysTime(String id) { + mqttUtil.publish(spliceSetSysTime(), spliceTopic(id)); + } + + @Override + public void issuedFace(IssuedFaceDTO dto) { + List userFaceList = dto.getUserFaceList(); + List deviceList = listByIds(dto.getDeviceList()); + // 在线设备数量 + long onlineNumber = deviceList.stream().filter(eduAttendanceDevice -> + DeviceStateEnum.ONLINE_STATUS.getStatus().equals(eduAttendanceDevice.getState())) + .count(); + // 判断是否有策略信息 +// boolean hasStrategyFlag = Objects.nonNull(dto.getGroupStrategy()); + // 海清设备 + if (DeviceType.HAIQING.getValue().equals(deviceList.get(0).getDeviceType())) { + // 每次下发的数量(必须大于每次最大下发数量) + int size = 100; + // 下发总数 + int totalSize = userFaceList.size() * deviceList.size(); + redisService.set(CachePrefixConstant.ISSUE_FACE_TOTAL + dto.getGroupId(), totalSize); + // 进度相关信息 + redisService.set(CachePrefixConstant.ISSUE_FACE_FINISH + dto.getGroupId(), 0); + redisService.set(CachePrefixConstant.ISSUE_FACE_ERROR + dto.getGroupId(), 0); + // 错误信息key值 + Set keys = redisService.keys(CachePrefixConstant.ISSUE_FACE_ERROR_MSG + dto.getGroupId()); + redisService.del(keys.toArray(new String[0])); + + // 遍历向每个设备下发信息 + for (EduAttendanceDevice device : deviceList) { + // 不同接口操作同一台设备时阻塞 + while (redisService.hasKey(CachePrefixConstant.HQ_EDIT_BATCH + device.getSn()) + || redisService.hasKey(CachePrefixConstant.HQ_BATCH_ADD + device.getSn()) + || redisService.hasKey(CachePrefixConstant.HQ_BATCH_EDIT + device.getSn())) { + try { + ThreadUtil.sleep(1000); + } catch (Exception e) { + log.error("阻塞设备信息失败", e); + } + } + + // 将人脸数据缓存到redis中 + Map userFaceMap = new HashMap<>(); + for (EduUserFace userFace : userFaceList) { + userFace.setDeviceName(device.getName()); + userFaceMap.put(userFace.getUserId().toString() + userFace.getUserType().toString(), userFace); + } + // 离线设备 + if (DeviceStateEnum.OFFLINE_STATUS.getStatus().equals(device.getState())) { + // 添加错误数据 + dealErrorMessage(dto.getGroupId(), device.getSn(), userFaceMap); + continue; + } + // 保存每个设备要添加的信息 + redisService.hmset(CachePrefixConstant.HQ_EDIT_BATCH + device.getSn(), userFaceMap); + // 添加人脸组在线设备数量(用于回调判断) + redisService.set(CachePrefixConstant.ISSUE_FACE_GROUP_DEVICE_NUMBER + device.getSn(), onlineNumber); + + // 判断是否设置当前设备下发的人脸组id + if (IssuedTypeEnum.FACE_GROUP.equals(dto.getIssuedTypeEnum())) { + // 当前设备下发的人脸组 + redisService.hset(CachePrefixConstant.ISSUE_FACE_GROUP_DEVICE, device.getSn(), dto.getGroupId()); + } + // 每个设备一个线程 + FACE_POOL.execute(() -> { + // 用户与厂商关联信息 + List userDeviceFactoryList = new ArrayList<>(); + while (redisService.hasKey(CachePrefixConstant.HQ_EDIT_BATCH + device.getSn())) { + // 添加人脸 + JSONObject addParams = new JSONObject(); + addParams.set("operator", HaiqingConstant.ADD_PERSONS_BATCH); + addParams.set("DataBegin", "BeginFlag"); + addParams.set("DataEnd", "EndFlag"); + JSONArray addUserFaces = new JSONArray(); + Map addMap = new HashMap<>(); + List addKey = new ArrayList<>(); + // 修改人脸 + JSONObject editParams = new JSONObject(); + editParams.set("operator", HaiqingConstant.EDIT_PERSONS_BATCH); + editParams.set("DataBegin", "BeginFlag"); + editParams.set("DataEnd", "EndFlag"); + JSONArray editUserFaces = new JSONArray(); + Map editMap = new HashMap<>(); + List editKey = new ArrayList<>(); + // 下发的所有是数据 + Map saveData = redisService + .hmget(CachePrefixConstant.HQ_EDIT_BATCH + device.getSn()); + log.info("循环下发"); + log.info("数据:[{}]", saveData); + if (saveData.size() == 0) { + break; + } + Set> entries = saveData.entrySet(); + log.info("处理后数据:[{}]", entries); + log.info("锁标识:[{}]", + redisService.get(LockPrefixConstant.HQ_DEVICE_USER_EDIT_LOCK + device.getSn())); + for (int i = 0; i < entries.size(); i += size) { + // 每size个下发一次 + List tempFace; + if (i + size <= entries.size()) { + tempFace = + CollUtil.sub(entries, i, i + size).stream().map(x -> ((EduUserFace) x.getValue())) + .collect(Collectors.toList()); + } else { + tempFace = + CollUtil.sub(entries, i, i + entries.size()).stream() + .map(x -> ((EduUserFace) x.getValue())).collect(Collectors.toList()); + } + for (EduUserFace userFace : tempFace) { + JSONObject oneUserFace = new JSONObject(); + oneUserFace.set("name", userFace.getName()); + String customId = userFace.getUserId().toString() + userFace.getUserType().toString(); + oneUserFace.set("customId", customId); + oneUserFace.set("picURI", userFace.getPicPath()); + // 永久白名单 + oneUserFace.set("personType", 0); + oneUserFace.set("tempCardType", 0); + oneUserFace.set("notes", userFace.getNotes()); + oneUserFace.set("cardValidBegin", userFace.getCardValidBegin()); + oneUserFace.set("cardValidEnd", userFace.getCardValidEnd()); + oneUserFace.set("RFIDCard", userFace.getRfidCard()); + // 判断人脸和设备关系 + List list = remoteUserDeviceService.listUserDevice(userFace.getUserId(), + userFace.getUserType(), device.getId(), dto.getGroupId()).getData(); + // 新增 + if (CollUtil.isEmpty(list)) { + // 厂商关联信息 + EduUserDeviceFactory userDeviceFactory = new EduUserDeviceFactory(); + userDeviceFactory.setUserId(userFace.getUserId()); + userDeviceFactory.setUserType(userFace.getUserType()); + userDeviceFactory.setTypeName(DeviceType.HAIQING.getValue()); + userDeviceFactory + .setTypeFlag(userFace.getUserId().toString() + userFace.getUserType().toString()); + userDeviceFactoryList.add(userDeviceFactory); + // 新增人脸的信息处理 + addUserFaces.set(oneUserFace); + addMap.put(userFace.getUserId().toString() + userFace.getUserType().toString(), userFace); + addKey.add(userFace.getUserId().toString() + userFace.getUserType().toString()); + } else { + // 编辑 + editUserFaces.set(oneUserFace); + editMap.put(userFace.getUserId().toString() + userFace.getUserType().toString(), userFace); + editKey.add(userFace.getUserId().toString() + userFace.getUserType().toString()); + } + // 处理人脸策略信息 +// if (hasStrategyFlag) { +// // key存组id,value存1 +// redisService.hset(CachePrefixConstant.USER_ATTENDANCE_STRATEGY +// + device.getSn() + "-" + customId, String.valueOf(dto.getGroupId()), 1); +// } + } + if (CollUtil.isNotEmpty(addUserFaces)) { + addParams.set("info", addUserFaces); + addParams.set("PersonNum", addUserFaces.size()); + addParams.set("messageId", StrUtil.uuid().replace("-", "")); + } + if (CollUtil.isNotEmpty(editUserFaces)) { + editParams.set("info", editUserFaces); + editParams.set("PersonNum", editUserFaces.size()); + editParams.set("messageId", StrUtil.uuid().replace("-", "")); + } + // 获取编辑锁 + redisService.falseLock(LockPrefixConstant.HQ_DEVICE_USER_EDIT_LOCK + device.getSn()); + if (CollUtil.isNotEmpty(addUserFaces)) { + // 发送下发人脸消息 + log.info("发送下发新增人脸消息=================sn: {}, params: {}", device.getSn(), addParams); + Boolean flag = mqttUtil.publish(addParams.toString(), "mqtt/face/" + device.getSn()); + if (!flag) { + // 新增未下发成功 + redisService.hdel(CachePrefixConstant.HQ_EDIT_BATCH + device.getSn(), + addKey.toArray(new String[0])); + // 添加错误数据 + dealErrorMessage(dto.getGroupId(), device.getSn(), addMap); + } else { + // 保存海清人脸新增信息缓存 + redisService.hmset(CachePrefixConstant.HQ_BATCH_ADD + device.getSn(), addMap); + } + } + if (CollUtil.isNotEmpty(editUserFaces)) { + log.info("发送下发编辑人脸消息=================sn: {}, params: {}", device.getSn(), editParams); + Boolean flag = mqttUtil.publish(editParams.toString(), "mqtt/face/" + device.getSn()); + if (!flag) { + // 编辑未下发成功 + redisService.hdel(CachePrefixConstant.HQ_EDIT_BATCH + device.getSn(), + editKey.toArray(new String[0])); + // 添加错误数据 + dealErrorMessage(dto.getGroupId(), device.getSn(), editMap); + } else { + // 保存海清人脸编辑信息缓存 + redisService.hmset(CachePrefixConstant.HQ_BATCH_EDIT + device.getSn(), editMap); + } + } + // 判断是否还有下发人脸数据数据 + if (!redisService.hasKey(CachePrefixConstant.HQ_EDIT_BATCH + device.getSn())) { + // 释放批量编辑锁 + redisService.falseUnLock(LockPrefixConstant.HQ_DEVICE_USER_EDIT_LOCK + device.getSn()); + } + // 等待设备消息释放锁 + while (redisService.hasKey(LockPrefixConstant.HQ_DEVICE_USER_EDIT_LOCK + device.getSn())) { + try { + ThreadUtil.sleep(1000); + } catch (Exception e) { + log.error("阻塞下发人脸失败", e); + } + } + } + } + log.info("下发结束"); + log.info("--------------------------"); + if (CollUtil.isNotEmpty(userDeviceFactoryList)) { + // 只有添加人脸需要保存厂商唯一标识 + remoteUserDeviceFactoryService.batchSaveUserDeviceFactory(userDeviceFactoryList); + } + }); + } + } + } + + /** + * 处理人脸下发错误数据 + * + * @param faceGroupId 人脸组id + * @param deviceSn 设备编号 + * @param faceList 人脸信息集合 + * @author ZYJ + * @date 2023/10/11 15:09 + */ + private void dealErrorMessage(Long faceGroupId, String deviceSn, Map faceList) { + // 添加失败信息 + redisService.incr(CachePrefixConstant.ISSUE_FACE_FINISH + faceGroupId, (long) faceList.size()); + redisService.incr(CachePrefixConstant.ISSUE_FACE_ERROR + faceGroupId, (long) faceList.size()); + // 设置当前设备错误信息 + redisService.lSet(CachePrefixConstant.ISSUE_FACE_ERROR_MSG + faceGroupId + StringConstant.DOT + deviceSn, + faceList.values()); + // 修改人脸状态 + if (CollUtil.isNotEmpty(faceList)) { + // 失败的用户 修改其下发状态 删除下发记录。EduUserFace转EduFaceGroupUser + UpdateFaceGroupUserStatusDTO dto = new UpdateFaceGroupUserStatusDTO(); + dto.setUserList(faceList.values().stream().map(value -> { + EduUserFace userFace = (EduUserFace) value; + EduFaceGroupUser user = new EduFaceGroupUser(); + user.setUserId(userFace.getUserId()); + user.setUserType(userFace.getUserType()); + user.setFaceGroupId(userFace.getFaceGroupUserId()); + return user; + }).collect(Collectors.toList())); + dto.setStatus(EduFaceGroupUser.ISSUE_FAIL); + remoteUserFaceService.updateFaceGroupUserStatus(dto); + } + } + + @Override + public void removeFace(RemoveFaceDTO dto) { + log.info("移除的人脸数据集合: {}", dto); + List deviceList = listByIds(dto.getDeviceList()); + int size = 200; + String deviceType = deviceList.get(0).getDeviceType(); + List deviceFactoryUserIds = dto.getDeviceFactoryUserId(); + if (DeviceType.HAIQING.getValue().equals(deviceType)) { + for (EduAttendanceDevice device : deviceList) { + FACE_POOL.execute(() -> { + JSONObject params = new JSONObject(); + params.set("operator", HaiqingConstant.DELETE_PERSONS_BATCH); + params.set("DataBegin", "BeginFlag"); + params.set("DataEnd", "EndFlag"); + // 每次最多删除200条 + for (int i = 0; i < deviceFactoryUserIds.size(); i += size) { + List tempIds; + if (i + size <= deviceFactoryUserIds.size()) { + tempIds = deviceFactoryUserIds.subList(i, i + size); + } else { + tempIds = deviceFactoryUserIds.subList(i, deviceFactoryUserIds.size()); + } + params.set("info", JSONUtil.createObj() + .set("customId", JSONUtil.parseArray(tempIds))); + params.set("PersonNum", tempIds.size()); + params.set("messageId", StrUtil.uuid().replace("-", "")); + log.info("删除的人脸数据: {}", params); + // 获取该台设备的删除锁 +// redisService.falseLock(LockPrefixConstant.HQ_DEVICE_USER_DELETE_LOCK + device.getSn()); + // 发送删除人脸消息 + mqttUtil.publish(params.toString(), "mqtt/face/" + device.getSn()); + // 等待设备消息释放锁 +// while (redisService.hasKey(LockPrefixConstant.HQ_DEVICE_USER_DELETE_LOCK + device.getSn())) { +// try { +// ThreadUtil.sleep(1000); +// } catch (Exception e) { +// log.error("阻塞删除人脸失败", e); +// } +// } + } + }); + } + } + } + + @Override + public void updateDeviceStatus() { + Set aliveDeviceSnKeys = redisService.keys(CachePrefixConstant.ALIVE_DEVICE); + Set aliveDeviceSn = CollUtil.isNotEmpty(aliveDeviceSnKeys) ? + aliveDeviceSnKeys.stream().map(x -> x.substring(CachePrefixConstant.ALIVE_DEVICE.length())) + .collect(Collectors.toSet()) : new HashSet() {{ + add("000"); + }}; + log.info("alive device list sn:[{}]", aliveDeviceSn); + // 系统内在线 此刻不在线的设备 + List noticeDeice = list(Wrappers.lambdaQuery() + .eq(EduAttendanceDevice::getState, 0) + .notIn(EduAttendanceDevice::getSn, aliveDeviceSn)); + // 系统内不在线 此刻上线的设备 + //noticeDeice.addAll(list(Wrappers.lambdaQuery() + // .eq(EduAttendanceDevice::getState, 1) + // .in(EduAttendanceDevice::getSn, aliveDeviceSn))); + if (CollUtil.isNotEmpty(noticeDeice)) { + EduDeptWxPublic sysWxPublic = commonService.getWxPublic(1L); + String accessToken = wxPublicUtil.getAccessToken(sysWxPublic.getAppId(), sysWxPublic.getSecret()); + // 本地缓存加速 + Map> receiversCache = new HashMap<>(); + for (EduAttendanceDevice device : noticeDeice) { + Long schoolId = device.getSchoolId(); + Dept school = commonService.getDept(device.getSchoolId()); + List receiverList = receiversCache.containsKey(schoolId) + ? receiversCache.get(schoolId) + : remoteAgentService.listReceiverBySchool(schoolId).getData(); + receiversCache.put(schoolId, receiverList); + // 如果有通知接收者 + if (CollUtil.isNotEmpty(receiverList)) { + for (EduAgentWxPublicReceiver receiver : receiverList) { + JSONObject msgData = new JSONObject() {{ + set("first", new JSONObject() {{ + set("value", school.getDeptName() + "设备掉线通知"); + set("color", "#173177"); + }}); + set("keyword1", new JSONObject() {{ + set("value", "人脸面板机-" + device.getName() + + (device.getZoneScope() == 0 ? "进门" : "出门") + + "【" + device.getSn() + "】"); + set("color", "#173177"); + }}); + set("keyword2", new JSONObject() {{ + set("value", LocalDateTimeUtil.format(LocalDateTime.now(), "yyyy-MM-dd " + + "HH:mm")); + set("color", "#173177"); + }}); + set("remark", new JSONObject() {{ + set("value", "请尽快登录后台进行检查!"); + set("color", "#173177"); + }}); + }}; + wxPublicUtil.publishTemplateMsg(accessToken, receiver.getWxPublicOpenId(), + WxPublicUtil.DEVICE_OFFLINE_TEMPLATE_ID, null, msgData); + } + } + } + } + if (CollUtil.isNotEmpty(aliveDeviceSn)) { + baseMapper.updateDevice(0, DeviceType.HAIQING.getValue(), aliveDeviceSn); + } + baseMapper.updateDevice(1, DeviceType.HAIQING.getValue(), aliveDeviceSn); + } + + private String spliceOpenDoor() { + + //拼接json + HashMap map = new HashMap<>(); + map.put("messageId", UUID.randomUUID().toString()); + map.put("operator", "Unlock"); + HashMap info = new HashMap<>(); + info.put("openDoor", 1); + map.put("info", info); + + return JSON.toJSONString(map); + } + + private String spliceTopic(String deviceId) { + return "mqtt/face/" + deviceId; + + } + + private String spliceSetSysTime() { + HashMap map = new HashMap<>(); + map.put("messageId", UUID.randomUUID().toString()); + map.put("operator", "SetSysTime"); + String date = LocalDateTimeUtil.format(LocalDateTime.now(), DatePattern.UTC_SIMPLE_PATTERN); + map.put("info", new HashMap() {{ + put("SysTime", date); + }}); + return JSON.toJSONString(map); + } + + /** + * 考勤设备数量统计 + * + * @return com.yida.data.common.core.common.ResultBean + * @author ZYJ + * @date 2021/10/8 17:14 + */ + @Override + public ResultBean findDeviceNumber() throws NoSuchMethodException { + // 需要查询的学校id集合 + List schoolIds = new ArrayList<>(); + CurrentUser currentUser = FebsUtil.getCurrentUser(); + // 获取登陆用户角色类型 + List roleList = new ArrayList<>(); + if (StringUtils.isNotBlank(Objects.requireNonNull(currentUser).getRolePerms())) { + for (String rolePerm : Objects.requireNonNull(currentUser).getRolePerms().split(StringConstant.COMMA)) { + // 获取登陆角色类型 + RoleEnum roleEnum = EnumUtils.valueOf(RoleEnum.class, rolePerm, + RoleEnum.class.getMethod("getValue")); + if (Objects.nonNull(roleEnum)) { + roleList.add(roleEnum); + } + } + } + + if (CollectionUtils.isNotEmpty(roleList)) { + // 排序 + RoleEnum roleEnum = roleList.stream().sorted(Comparator.comparing(RoleEnum::getOrder)) + .collect(Collectors.toList()).get(0); + // 代理商相关账号 + if (RoleEnum.ROLE_AGENT_ADMIN.equals(roleEnum) || RoleEnum.ROLE_AGENT_NORMAL.equals(roleEnum)) { + List deptList = remoteDeptService.getSchoolByArea(null, null).getData(); + if (CollUtil.isNotEmpty(deptList)) { + schoolIds = deptList.stream().map(Dept::getDeptId).collect(Collectors.toList()); + } + } else if (RoleEnum.ROLE_SCHOOL_PRINCIPAL.equals(roleEnum)) { + // 学校负责人账号 + schoolIds.add(currentUser.getDeptId()); + } else { + return ResultBean.buildSuccess( + DeviceNumberVO.builder() + .totalNumber(0L) + .onlineNumber(0L) + .offlineNumber(0L) + .build()); + } + } + // 查询不同状态考勤设备数量 + Long offlineNumber = this.baseMapper.findDeviceNumber(schoolIds, DeviceStateEnum.OFFLINE_STATUS.getStatus()); + Long onlineNumber = this.baseMapper.findDeviceNumber(schoolIds, DeviceStateEnum.ONLINE_STATUS.getStatus()); + return ResultBean.buildSuccess( + DeviceNumberVO.builder() + .totalNumber(offlineNumber + onlineNumber) + .onlineNumber(onlineNumber) + .offlineNumber(offlineNumber) + .build() + ); + } + + @Override + public void timingAllDevice() { + Set aliveDeviceSnKeys = redisService.keys(CachePrefixConstant.ALIVE_DEVICE); + List aliveDeviceSn = CollUtil.isNotEmpty(aliveDeviceSnKeys) + ? aliveDeviceSnKeys.stream().map(x -> x.substring(CachePrefixConstant.ALIVE_DEVICE.length())) + .collect(Collectors.toList()) : new ArrayList<>(); + if (CollUtil.isNotEmpty(aliveDeviceSn)) { + setAllTime(aliveDeviceSn); + } + } + + @Override + public OnlineCountVO getOnlineDistrib(List schoolIds) { + OnlineCountVO vo = new OnlineCountVO(); + if (CollUtil.isNotEmpty(schoolIds)) { + List cardList = list( + Wrappers.lambdaQuery().in(EduAttendanceDevice::getSchoolId, schoolIds) + .select(EduAttendanceDevice::getState)); + Map> onlineGroup = cardList.stream() + .collect(Collectors.groupingBy(EduAttendanceDevice::getState)); + vo.setOnlineNum(onlineGroup.getOrDefault(0, Collections.emptyList()).size()); + vo.setOfflineNum(onlineGroup.getOrDefault(1, Collections.emptyList()).size()); + } + return vo; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void delDevice(List ids) { + // 删除设备信息 + removeByIds(ids); + // 移除规则管理设备 + attendanceRuleDeviceService.remove(Wrappers.lambdaQuery(new AttendanceRuleDevice()) + .in(AttendanceRuleDevice::getDeviceId, ids)); + // TODO: 2023/10/23 后续移除和设备相关信息 + } +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/EduAttendanceStrategyServiceImpl.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/EduAttendanceStrategyServiceImpl.java new file mode 100644 index 0000000..279f275 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/EduAttendanceStrategyServiceImpl.java @@ -0,0 +1,438 @@ +package com.yida.data.attendance.service.impl; + +import cc.mrbird.febs.common.redis.service.RedisService; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.yida.data.attendance.dto.AddLeaveRequestStrategyDTO; +import com.yida.data.attendance.dto.IssuedFaceDTO; +import com.yida.data.attendance.service.EduAttendanceDeviceGroupService; +import com.yida.data.attendance.service.EduAttendanceDeviceService; +import com.yida.data.attendance.service.EduAttendanceStrategyService; +import com.yida.data.attendance.service.EduUserStrategyService; +import com.yida.data.attendance.utils.MqttUtil; +import com.yida.data.common.core.entity.attendance.EduAttendanceDevice; +import com.yida.data.common.core.entity.attendance.EduUserStrategy; +import com.yida.data.common.core.entity.attendance.enums.DeviceStateEnum; +import com.yida.data.common.core.entity.constant.CachePrefixConstant; +import com.yida.data.common.core.entity.constant.hq.HaiqingConstant; +import com.yida.data.common.core.entity.user.EduFaceGroupDevice; +import com.yida.data.common.core.entity.user.EduFaceGroupStrategy; +import com.yida.data.common.core.entity.user.EduFaceGroupStrategyPlanTime; +import com.yida.data.common.core.entity.user.EduFaceGroupStrategySpecialDate; +import com.yida.data.common.core.entity.user.EduFaceGroupStrategySpecialTime; +import com.yida.data.common.core.entity.user.EduFaceGroupUser; +import com.yida.data.common.core.entity.user.EduUserFace; +import com.yida.data.common.core.enums.DeviceType; +import com.yida.data.common.core.enums.IssuedTypeEnum; +import com.yida.data.common.core.exception.FebsException; +import com.yida.data.user.feign.RemoteUserFaceService; + +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * 设备策略service + * + * @author ZYJ + * @date 2022/12/13 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class EduAttendanceStrategyServiceImpl implements EduAttendanceStrategyService { + + private final EduUserStrategyService eduUserStrategyService; + private final EduAttendanceDeviceService eduAttendanceDeviceService; + private final EduAttendanceDeviceGroupService eduAttendanceDeviceGroupService; + + private final RemoteUserFaceService remoteUserFaceService; + + private final MqttUtil mqttUtil; + private final RedisService redisService; + + @Override + public void saveStrategyAndUser(EduFaceGroupStrategy eduFaceGroupStrategy) { + // 设置策略 + JSONObject params = new JSONObject(); + params.set("operator", HaiqingConstant.ADD_ACCESS_STRATEGY); + params.set("messageId", StrUtil.uuid().replace("-", "")); + // 包装信息主体 + JSONObject info = JSONUtil.createObj() + // 策略id使用人脸组id + .set("strategyID", eduFaceGroupStrategy.getFaceGroupId()) + .set("startDate", eduFaceGroupStrategy.getStrategyStartDate().format(DateTimeFormatter.ofPattern("yyyy-MM" + + "-dd'T'HH:mm:ss"))) + .set("endDate", eduFaceGroupStrategy.getStrategyEndDate().format(DateTimeFormatter.ofPattern("yyyy-MM" + + "-dd'T'HH:mm:ss"))); + // 周一 + JSONArray monday = new JSONArray(); + if (CollUtil.isNotEmpty(eduFaceGroupStrategy.getMondayTimeList())) { + for (EduFaceGroupStrategyPlanTime strategyPlanTime : eduFaceGroupStrategy.getMondayTimeList()) { + monday.add(JSONUtil.createObj() + .set("startTime", strategyPlanTime.getPlanStartTime().format(DateTimeFormatter.ofPattern("HH:mm:ss"))) + .set("endTime", strategyPlanTime.getPlanEndTime().format(DateTimeFormatter.ofPattern("HH:mm:ss"))) + ); + } + } + info.set("monday", monday); + // 周二 + JSONArray tuesday = new JSONArray(); + if (CollUtil.isNotEmpty(eduFaceGroupStrategy.getTuesdayTimeList())) { + for (EduFaceGroupStrategyPlanTime strategyPlanTime : eduFaceGroupStrategy.getTuesdayTimeList()) { + tuesday.add(JSONUtil.createObj() + .set("startTime", strategyPlanTime.getPlanStartTime().format(DateTimeFormatter.ofPattern("HH:mm:ss"))) + .set("endTime", strategyPlanTime.getPlanEndTime().format(DateTimeFormatter.ofPattern("HH:mm:ss"))) + ); + } + } + info.set("tuesday", tuesday); + // 周三 + JSONArray wednesday = new JSONArray(); + if (CollUtil.isNotEmpty(eduFaceGroupStrategy.getWednesdayTimeList())) { + for (EduFaceGroupStrategyPlanTime strategyPlanTime : eduFaceGroupStrategy.getWednesdayTimeList()) { + wednesday.add(JSONUtil.createObj() + .set("startTime", strategyPlanTime.getPlanStartTime().format(DateTimeFormatter.ofPattern("HH:mm:ss"))) + .set("endTime", strategyPlanTime.getPlanEndTime().format(DateTimeFormatter.ofPattern("HH:mm:ss"))) + ); + } + } + info.set("wednesday", wednesday); + // 周四 + JSONArray thursday = new JSONArray(); + if (CollUtil.isNotEmpty(eduFaceGroupStrategy.getThursdayTimeList())) { + for (EduFaceGroupStrategyPlanTime strategyPlanTime : eduFaceGroupStrategy.getThursdayTimeList()) { + thursday.add(JSONUtil.createObj() + .set("startTime", strategyPlanTime.getPlanStartTime().format(DateTimeFormatter.ofPattern("HH:mm:ss"))) + .set("endTime", strategyPlanTime.getPlanEndTime().format(DateTimeFormatter.ofPattern("HH:mm:ss"))) + ); + } + } + info.set("thursday", thursday); + // 周五 + JSONArray friday = new JSONArray(); + if (CollUtil.isNotEmpty(eduFaceGroupStrategy.getFridayTimeList())) { + for (EduFaceGroupStrategyPlanTime strategyPlanTime : eduFaceGroupStrategy.getFridayTimeList()) { + friday.add(JSONUtil.createObj() + .set("startTime", strategyPlanTime.getPlanStartTime().format(DateTimeFormatter.ofPattern("HH:mm:ss"))) + .set("endTime", strategyPlanTime.getPlanEndTime().format(DateTimeFormatter.ofPattern("HH:mm:ss"))) + ); + } + } + info.set("friday", friday); + // 周六 + JSONArray saturday = new JSONArray(); + if (CollUtil.isNotEmpty(eduFaceGroupStrategy.getSaturdayTimeList())) { + for (EduFaceGroupStrategyPlanTime strategyPlanTime : eduFaceGroupStrategy.getSaturdayTimeList()) { + saturday.add(JSONUtil.createObj() + .set("startTime", strategyPlanTime.getPlanStartTime().format(DateTimeFormatter.ofPattern("HH:mm:ss"))) + .set("endTime", strategyPlanTime.getPlanEndTime().format(DateTimeFormatter.ofPattern("HH:mm:ss"))) + ); + } + } + info.set("saturday", saturday); + // 周天 + JSONArray sunday = new JSONArray(); + if (CollUtil.isNotEmpty(eduFaceGroupStrategy.getSundayTimeList())) { + for (EduFaceGroupStrategyPlanTime strategyPlanTime : eduFaceGroupStrategy.getSundayTimeList()) { + sunday.add(JSONUtil.createObj() + .set("startTime", strategyPlanTime.getPlanStartTime().format(DateTimeFormatter.ofPattern("HH:mm:ss"))) + .set("endTime", strategyPlanTime.getPlanEndTime().format(DateTimeFormatter.ofPattern("HH:mm:ss"))) + ); + } + } + info.set("sunday", sunday); + // 处理特殊日期 + JSONArray holidayInfo = JSONUtil.createArray(); + if (CollUtil.isNotEmpty(eduFaceGroupStrategy.getSpecialDateList())) { + for (EduFaceGroupStrategySpecialDate specialDate : eduFaceGroupStrategy.getSpecialDateList()) { + JSONObject jsonObject = JSONUtil.createObj() + .set("holidayStartDate", specialDate.getSpecialStartDate() + .format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + "T00:00:00") + .set("holidayEndDate", specialDate.getSpecialEndDate() + .format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + "T23:59:59"); + // 处理时间 + JSONArray holidayPeriod = JSONUtil.createArray(); + for (EduFaceGroupStrategySpecialTime specialTime : specialDate.getSpecialTimeList()) { + holidayPeriod.add(JSONUtil.createObj() + .set("startTime", specialTime.getSpecialStartTime().format(DateTimeFormatter.ofPattern("HH:mm:ss"))) + .set("endTime", specialTime.getSpecialEndTime().format(DateTimeFormatter.ofPattern("HH:mm:ss"))) + ); + } + jsonObject.set("holidayPeriod", holidayPeriod); + holidayInfo.add(jsonObject); + } + } + info.set("holidayInfo", holidayInfo); + // 信息主体 + params.set("info", info); + // 处理设备集合 + List deviceList = checkGroupDevice(eduFaceGroupStrategy); + List userList = eduFaceGroupStrategy.getGroupUserList(); + + for (EduAttendanceDevice device : deviceList) { + log.info("推送的策略信息=================sn: {}, params: {}", device.getSn(), params); + // 添加策略消息 + mqttUtil.publish(params.toString(), "mqtt/face/" + device.getSn()); + + if (CollUtil.isNotEmpty(userList)) { + JSONObject userParams = JSONUtil.createObj(); + // 设置人员绑定策略 + userParams.set("operator", HaiqingConstant.PERSONS_BIND_STRATEGY) + .set("messageId", StrUtil.uuid().replace("-", "")); + JSONArray personsInfo = JSONUtil.createArray(); + for (EduFaceGroupUser groupUser : userList) { + String customId = groupUser.getUserId().toString() + groupUser.getUserType().toString(); + JSONObject singleObject = JSONUtil.createObj() + // 用户id+用户类型 + .set("customId", customId); + Map map = redisService.hmget(CachePrefixConstant.USER_ATTENDANCE_STRATEGY + + device.getSn() + "-" + customId); + // 设置用户信息 + JSONArray array = JSONUtil.createArray(); + map.forEach((k, v) -> array.add(k)); + singleObject.set("strategyID", array); + + personsInfo.add(singleObject); + } + // 人员绑定通行策略 + userParams.set("info", JSONUtil.createObj().set("personsInfo", personsInfo)); + log.info("推送的人员绑定信息=================sn: {}, params: {}", device.getSn(), userParams); + mqttUtil.publish(userParams.toString(), "mqtt/face/" + device.getSn()); + } + } + } + + /** + * 处理设备信息 + * + * @param eduFaceGroupStrategy 人脸组-策略信息 + * @return java.util.List + * @author ZYJ + * @date 2022/12/22 16:58 + */ + public List checkGroupDevice(EduFaceGroupStrategy eduFaceGroupStrategy) { + // 处理设备集合 + List deviceAndGroup = eduFaceGroupStrategy.getGroupDeviceList(); + List deviceList = new ArrayList<>(); + // 处理设备 + List deviceIds = deviceAndGroup.stream().filter(x -> x.getType() == 0).map(EduFaceGroupDevice::getDeviceId) + .collect(Collectors.toList()); + if (CollUtil.isNotEmpty(deviceIds)) { + List devices = eduAttendanceDeviceService.list( + Wrappers.lambdaQuery(new EduAttendanceDevice()).in(EduAttendanceDevice::getId, deviceIds)); + if (CollUtil.isNotEmpty(devices)) { + deviceList.addAll(devices); + } + } + // 处理设备组 + List deviceGroupIds = deviceAndGroup.stream().filter(x -> x.getType() == 1).map(EduFaceGroupDevice::getDeviceId) + .collect(Collectors.toList()); + if (CollUtil.isNotEmpty(deviceGroupIds)) { + List groupDevices = eduAttendanceDeviceGroupService.listDeviceByGroup(deviceGroupIds); + if (CollUtil.isNotEmpty(groupDevices)) { + deviceList.addAll(groupDevices); + } + } + if (CollUtil.isEmpty(deviceList)) { + log.info("当前人脸组策略没有对应的设备信息: {}", eduFaceGroupStrategy.getFaceGroupId()); + return new ArrayList<>(); + } + return deviceList; + } + + @Override + public void deleteStrategy(EduFaceGroupStrategy eduFaceGroupStrategy) { + // 处理设备集合 + List deviceList = checkGroupDevice(eduFaceGroupStrategy); + + // 设置删除策略信息 + JSONObject params = JSONUtil.createObj() + .set("operator", HaiqingConstant.DEL_ACCESS_STRATEGY) + .set("messageId", StrUtil.uuid().replace("-", "")) + .set("info", JSONUtil.createObj() + .set("strategyID", JSONUtil.createArray().set(eduFaceGroupStrategy.getFaceGroupId()))); + + for (EduAttendanceDevice device : deviceList) { + log.info("推送的删除策略消息=================sn: {}, params: {}", device.getSn(), params); + // 删除策略消息 + mqttUtil.publish(params.toString(), "mqtt/face/" + device.getSn()); + } + } + + @Override + public void bindUserStrategy(EduFaceGroupStrategy eduFaceGroupStrategy) { + // 处理设备集合 + List deviceList = checkGroupDevice(eduFaceGroupStrategy); + + List userList = eduFaceGroupStrategy.getGroupUserList(); + if (CollUtil.isNotEmpty(userList)) { + + for (EduAttendanceDevice device : deviceList) { + JSONObject userParams = JSONUtil.createObj(); + // 设置人员绑定策略 + userParams.set("operator", HaiqingConstant.PERSONS_BIND_STRATEGY) + .set("messageId", StrUtil.uuid().replace("-", "")); + JSONArray personsInfo = JSONUtil.createArray(); + // 封装每个设备的用户策略信息 + for (EduFaceGroupUser groupUser : userList) { + String customId = groupUser.getUserId().toString() + groupUser.getUserType().toString(); + JSONObject singleObject = JSONUtil.createObj() + // 用户id+用户类型 + .set("customId", customId); + Map map = redisService.hmget(CachePrefixConstant.USER_ATTENDANCE_STRATEGY + + device.getSn() + "-" + customId); + // 设置用户信息 + JSONArray array = JSONUtil.createArray(); + map.forEach((k, v) -> array.add(k)); + singleObject.set("strategyID", array); + + personsInfo.add(singleObject); + } + userParams.set("info", JSONUtil.createObj().set("personsInfo", personsInfo)); + log.info("推送的解绑策略消息=================sn: {}, params: {}", device.getSn(), userParams); + // 绑定策略消息 + mqttUtil.publish(userParams.toString(), "mqtt/face/" + device.getSn()); + } + } + } + + /** + * 解绑对应的人员-策略信息 + * + * @param eduFaceGroupStrategy 策略信息 + * @author ZYJ + * @date 2022/12/26 10:19 + */ + @Override + public void unBindUserStrategy(EduFaceGroupStrategy eduFaceGroupStrategy) { + // 处理设备集合 + List deviceList = checkGroupDevice(eduFaceGroupStrategy); + + List userList = eduFaceGroupStrategy.getGroupUserList(); + if (CollUtil.isNotEmpty(userList)) { + + for (EduAttendanceDevice device : deviceList) { + JSONObject userParams = JSONUtil.createObj(); + // 设置人员绑定策略 + userParams.set("operator", HaiqingConstant.PERSONS_UNBIND_STRATEGY) + .set("messageId", StrUtil.uuid().replace("-", "")); + JSONArray personsInfo = JSONUtil.createArray(); + for (EduFaceGroupUser groupUser : userList) { + String customId = groupUser.getUserId().toString() + groupUser.getUserType().toString(); + JSONObject singleObject = JSONUtil.createObj() + // 用户id+用户类型 + .set("customId", customId); + // 设置用户信息 + JSONArray array = JSONUtil.createArray().set(eduFaceGroupStrategy.getFaceGroupId()); + singleObject.set("strategyID", array); + personsInfo.add(singleObject); + // 移除对应的缓存 + redisService.hdel(CachePrefixConstant.USER_ATTENDANCE_STRATEGY + + device.getSn() + "-" + customId, String.valueOf(eduFaceGroupStrategy.getFaceGroupId())); + } + userParams.set("info", JSONUtil.createObj().set("personsInfo", personsInfo)); + log.info("推送的解绑策略消息=================sn: {}, params: {}", device.getSn(), userParams); + // 解绑策略消息 + mqttUtil.publish(userParams.toString(), "mqtt/face/" + device.getSn()); + } + } + } + + @Override + public void deleteAndSaveStrategy(EduFaceGroupStrategy eduFaceGroupStrategy) { + unBindUserStrategy(eduFaceGroupStrategy); + deleteStrategy(eduFaceGroupStrategy); + // 添加缓存信息 + for (EduFaceGroupDevice groupDevice : eduFaceGroupStrategy.getGroupDeviceList()) { + EduAttendanceDevice device = eduAttendanceDeviceService.getById(groupDevice.getDeviceId()); + for (EduFaceGroupUser groupUser : eduFaceGroupStrategy.getGroupUserList()) { + String customId = groupUser.getUserId().toString() + groupUser.getUserType().toString(); + redisService.hset(CachePrefixConstant.USER_ATTENDANCE_STRATEGY + + device.getSn() + "-" + customId, String.valueOf(eduFaceGroupStrategy.getFaceGroupId()), 1); + } + } + saveStrategyAndUser(eduFaceGroupStrategy); + } + + @Override + public void addLeaveRequestStrategy(AddLeaveRequestStrategyDTO dto) { + // 查询学校校门的设备 + List deviceList = eduAttendanceDeviceService.list(Wrappers.lambdaQuery(new EduAttendanceDevice()) + .eq(EduAttendanceDevice::getSchoolId, dto.getSchoolId()) + .eq(EduAttendanceDevice::getDeviceType, DeviceType.HAIQING.getValue()) + .eq(EduAttendanceDevice::getState, DeviceStateEnum.ONLINE_STATUS.getStatus()) + // 校门类型 + .eq(EduAttendanceDevice::getType, 0) + ); + if (CollUtil.isEmpty(deviceList)) { + return; + } + // 查询人脸信息 + EduUserFace eduUserFace = remoteUserFaceService.getFaceByUser(dto.getUserId(), dto.getRequestType() == 1 ? 0 : 1).getData(); + if (Objects.isNull(eduUserFace)) { + throw new FebsException("审核失败!请上传人脸信息后重新审核"); + } + // 添加策略 + JSONObject params = new JSONObject(); + params.set("operator", HaiqingConstant.ADD_ACCESS_STRATEGY); + params.set("messageId", StrUtil.uuid().replace("-", "")); + // 包装信息主体 + JSONObject info = JSONUtil.createObj() + // 策略id使用人脸组id + .set("strategyID", dto.getStrategyId()) + .set("startDate", dto.getStartTime().format(DateTimeFormatter.ofPattern("yyyy-MM" + + "-dd'T'HH:mm:ss"))) + .set("endDate", dto.getEndTime().format(DateTimeFormatter.ofPattern("yyyy-MM" + + "-dd'T'HH:mm:ss"))); + info.set("monday", JSONUtil.createArray()); + info.set("tuesday", JSONUtil.createArray()); + info.set("wednesday", JSONUtil.createArray()); + info.set("thursday", JSONUtil.createArray()); + info.set("friday", JSONUtil.createArray()); + info.set("saturday", JSONUtil.createArray()); + info.set("sunday", JSONUtil.createArray()); + info.set("holidayInfo", JSONUtil.createArray()); + // 信息主体 + params.set("info", info); + for (EduAttendanceDevice device : deviceList) { + log.info("推送的策略信息=================sn: {}, params: {}", device.getSn(), params); + // 添加策略消息 + mqttUtil.publish(params.toString(), "mqtt/face/" + device.getSn()); + } + // 保存人员请假策略信息 + eduUserStrategyService.saveOrUpdate(EduUserStrategy.builder() + .strategyId(dto.getStrategyId()) + .userId(dto.getUserId()) + .userType(dto.getRequestType() == 0 ? 1 : 0) + .startTime(dto.getStartTime()) + .endTime(dto.getEndTime()) + .deptId(dto.getSchoolId()) + .build() + ); + // 生成人脸下发信息 + IssuedFaceDTO issuedFaceDTO = new IssuedFaceDTO(); + issuedFaceDTO.setUserFaceList(Collections.singletonList(eduUserFace)); + issuedFaceDTO.setDeviceList(deviceList.stream().map(EduAttendanceDevice::getId).collect(Collectors.toList())); + issuedFaceDTO.setGroupId(dto.getStrategyId()); + EduFaceGroupStrategy groupStrategy = new EduFaceGroupStrategy(); + groupStrategy.setFaceGroupId(dto.getStrategyId()); + issuedFaceDTO.setGroupStrategy(groupStrategy); + // 请假下发 + issuedFaceDTO.setIssuedTypeEnum(IssuedTypeEnum.LEAVE_REQUEST); + // 下发人脸、绑定策略和人员关系 + eduAttendanceDeviceService.issuedFace(issuedFaceDTO); + } +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/EduDeviceGroupServiceImpl.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/EduDeviceGroupServiceImpl.java new file mode 100644 index 0000000..b18d4ed --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/EduDeviceGroupServiceImpl.java @@ -0,0 +1,32 @@ +package com.yida.data.attendance.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.attendance.mapper.EduDeviceGroupMapper; +import com.yida.data.attendance.service.EduDeviceGroupService; +import com.yida.data.common.core.entity.attendance.EduDeviceGroup; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +/** + * 设备对应分组关系表 Service实现 + * + * @author zhanghaijun + * @date 2021-06-16 15:29:10 + */ +@Service +@RequiredArgsConstructor +@Transactional(propagation = Propagation.SUPPORTS, readOnly = true) +public class EduDeviceGroupServiceImpl extends ServiceImpl + implements EduDeviceGroupService { + + @Override + @Transactional(rollbackFor = Exception.class) + public void insertGroup(List list) { + saveBatch(list); + } + + +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/EduUserStrategyServiceImpl.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/EduUserStrategyServiceImpl.java new file mode 100644 index 0000000..b22cf34 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/EduUserStrategyServiceImpl.java @@ -0,0 +1,87 @@ +package com.yida.data.attendance.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.attendance.mapper.EduUserStrategyMapper; +import com.yida.data.attendance.service.EduAttendanceDeviceService; +import com.yida.data.attendance.service.EduUserStrategyService; +import com.yida.data.attendance.utils.MqttUtil; +import com.yida.data.common.core.entity.attendance.EduAttendanceDevice; +import com.yida.data.common.core.entity.attendance.EduUserStrategy; +import com.yida.data.common.core.entity.attendance.enums.DeviceStateEnum; +import com.yida.data.common.core.entity.constant.hq.HaiqingConstant; +import com.yida.data.common.core.entity.user.EduStudent; +import com.yida.data.common.core.enums.DeviceType; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 人员策略信息 Service实现 + * + * @author ZYJ + * @date 2023-11-07 11:40:58 + */ +@Slf4j +@Service +@RequiredArgsConstructor +@Transactional(rollbackFor = Exception.class) +public class EduUserStrategyServiceImpl extends ServiceImpl + implements EduUserStrategyService { + + private final MqttUtil mqttUtil; + private final EduAttendanceDeviceService eduAttendanceDeviceService; + + @Override + public void checkOverTimeUserStrategy() { + // 查询超时请假策略 + List list = list(Wrappers.lambdaQuery(new EduUserStrategy()) + .lt(EduUserStrategy::getEndTime, LocalDateTime.now())); + if (CollUtil.isNotEmpty(list)) { + // 分组 + Map> userStrategyMap = list.stream() + .collect(Collectors.groupingBy(EduUserStrategy::getDeptId)); + userStrategyMap.forEach((deptId, userStrategy) -> { + // 设置删除策略信息 + JSONObject params = JSONUtil.createObj() + .set("operator", HaiqingConstant.DEL_ACCESS_STRATEGY) + .set("messageId", StrUtil.uuid().replace("-", "")); + // 策略id集合 + JSONArray array = JSONUtil.createArray(); + list.forEach(strategy -> array.add(strategy.getStrategyId())); + + // 查询学校校门的设备 + List deviceList = eduAttendanceDeviceService.list(Wrappers.lambdaQuery(new EduAttendanceDevice()) + .eq(EduAttendanceDevice::getSchoolId, deptId) + .eq(EduAttendanceDevice::getDeviceType, DeviceType.HAIQING.getValue()) + .eq(EduAttendanceDevice::getState, DeviceStateEnum.ONLINE_STATUS.getStatus()) + // 校门类型 + .eq(EduAttendanceDevice::getType, 0) + ); + + if (CollUtil.isNotEmpty(deviceList) && CollUtil.isNotEmpty(array)) { + params.set("info", JSONUtil.createObj().set("strategyID", array)); + for (EduAttendanceDevice device : deviceList) { + log.info("定时任务推送的删除策略消息=================sn: {}, params: {}", device.getSn(), params); + // 删除策略消息 + mqttUtil.publish(params.toString(), "mqtt/face/" + device.getSn()); + } + } + }); + + remove(Wrappers.lambdaQuery(new EduUserStrategy()).in(EduUserStrategy::getStrategyId, list.stream() + .map(EduUserStrategy::getStrategyId).collect(Collectors.toList()))); + } + } +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/ErrorRecordMsgServiceImpl.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/ErrorRecordMsgServiceImpl.java new file mode 100644 index 0000000..f942d47 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/ErrorRecordMsgServiceImpl.java @@ -0,0 +1,84 @@ +package com.yida.data.attendance.service.impl; + +import com.yida.data.attendance.dto.ListErrorRecordDTO; +import com.yida.data.attendance.repository.ErrorRecordMsgRepository; +import com.yida.data.attendance.service.ErrorRecordMsgService; +import com.yida.data.common.core.entity.ErrorRecordMsg; +import com.yida.data.common.core.utils.FebsUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.search.sort.SortBuilders; +import org.elasticsearch.search.sort.SortOrder; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.time.ZoneOffset; +import java.util.Optional; + +/** + * 通行记录错误信息es处理service + * + * @author ZYJ + * @date 2023/11/1 16:08 + */ +@Slf4j +@Service +@RequiredArgsConstructor +@Transactional(rollbackFor = Exception.class) +public class ErrorRecordMsgServiceImpl implements ErrorRecordMsgService { + + private final ErrorRecordMsgRepository errorRecordMsgRepository; + + @Override + public void saveMsg(ErrorRecordMsg errorRecordMsg) { + errorRecordMsgRepository.save(errorRecordMsg); + } + + @Override + public Page listErrorRecord(ListErrorRecordDTO dto) { + // 封装分页数据 + Pageable pageable = PageRequest.of(dto.getPageNum() - 1, dto.getPageSize()); + // 封装查询条件 + NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder() + .withPageable(pageable) + // 查询当前学校信息 + .withQuery(QueryBuilders.termQuery("schoolId", FebsUtil.getDeptId())) + .withSort(SortBuilders.fieldSort("createDate").order(SortOrder.DESC)); + // 姓名 + String name = dto.getName(); + if (StringUtils.isNotBlank(name)) { + queryBuilder.withQuery(QueryBuilders.matchQuery("msg", name)); + } + // 操作开始时间 + LocalDateTime startTime = dto.getStartDateTime(); + // 操作结束时间 + LocalDateTime endTime = dto.getEndDateTime(); + if (Optional.ofNullable(startTime).isPresent()) { + queryBuilder.withQuery(QueryBuilders.rangeQuery("createDate").gte(startTime.toInstant( + ZoneOffset.of("+8") + ).toEpochMilli()).lte(endTime.toInstant( + ZoneOffset.of("+8") + ).toEpochMilli())); + } + // 查询列表数据 + return errorRecordMsgRepository.search(queryBuilder.build()); + } + + @Override + public void batchDeleteErrorRecord(String[] recordIds) { + for (String id : recordIds) { + if (errorRecordMsgRepository.existsById(id)) { + errorRecordMsgRepository.deleteById(id); + } else { + log.error("记录id不存在: {}", id); + } + } + } +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/HaiqingCallbackService.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/HaiqingCallbackService.java new file mode 100644 index 0000000..2232371 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/HaiqingCallbackService.java @@ -0,0 +1,888 @@ +package com.yida.data.attendance.service.impl; + +import cc.mrbird.febs.common.redis.service.RedisService; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Snowflake; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.yida.data.attendance.dto.AddAttendanceRecordDTO; +import com.yida.data.attendance.mapper.EduAttendanceDeviceMapper; +import com.yida.data.attendance.service.AttendanceRecordService; +import com.yida.data.attendance.service.EduAttendanceStrategyService; +import com.yida.data.attendance.service.EduUserStrategyService; +import com.yida.data.attendance.service.ErrorRecordMsgService; +import com.yida.data.attendance.utils.MqttUtil; +import com.yida.data.common.core.entity.ErrorRecordMsg; +import com.yida.data.common.core.entity.ReceiveMsg; +import com.yida.data.common.core.entity.attendance.EduAttendanceDevice; +import com.yida.data.common.core.entity.attendance.EduUserStrategy; +import com.yida.data.common.core.entity.constant.CachePrefixConstant; +import com.yida.data.common.core.entity.constant.LockPrefixConstant; +import com.yida.data.common.core.entity.constant.StringConstant; +import com.yida.data.common.core.entity.constant.hq.HaiqingCallbackCodeConstant; +import com.yida.data.common.core.entity.constant.hq.HaiqingConstant; +import com.yida.data.common.core.entity.user.EduFaceGroupStrategy; +import com.yida.data.common.core.entity.user.EduFaceGroupUser; +import com.yida.data.common.core.entity.user.EduUserDevice; +import com.yida.data.common.core.entity.user.EduUserFace; +import com.yida.data.common.core.enums.DeviceType; +import com.yida.data.common.core.enums.MsgChannel; +import com.yida.data.common.core.enums.RecordTypeEnum; +import com.yida.data.common.core.utils.FileUtil; +import com.yida.data.user.dto.UpdateFaceGroupUserStatusDTO; +import com.yida.data.user.feign.RemoteFaceGroupStrategyService; +import com.yida.data.user.feign.RemoteUserDeviceService; +import com.yida.data.user.feign.RemoteUserFaceService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken; +import org.eclipse.paho.client.mqttv3.MqttCallbackExtended; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.Lazy; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +@Service +@Slf4j +@RefreshScope +public class HaiqingCallbackService implements MqttCallbackExtended { + + private static MqttUtil mqttUtil; + @Lazy + @Resource + private AttendanceRecordService attendanceRecordService; + @Resource + private EduAttendanceDeviceMapper eduAttendanceDeviceMapper; + @Resource + private RemoteUserFaceService remoteUserFaceService; + @Resource + private RemoteUserDeviceService remoteUserDeviceService; + @Resource + private ErrorRecordMsgService errorRecordMsgService; + @Resource + private RemoteFaceGroupStrategyService remoteFaceGroupStrategyService; + + @Resource + private RedisService redisService; + + @Resource + private ApplicationContext applicationContext; + + @Lazy + @Resource + private EduUserStrategyService eduUserStrategyService; + + private static final Snowflake SNOWFLAKE; + + private static final ExecutorService MQTT_HEARTBEAT_POOL = new ThreadPoolExecutor(5, 10, 1, + TimeUnit.MINUTES, new LinkedBlockingQueue<>()); + + @Value("${febs.uploadUrl}") + private String uploadUrl; + + static { + SNOWFLAKE = new Snowflake(1L, 1L); + } + + public void setMqttUtil(MqttUtil util) { + mqttUtil = util; + } + + @Override + public void connectComplete(boolean b, String s) { + //if (b) { + // 断线重连后重新添加订阅 + log.info("----------------"); + log.info("连接成功"); + log.info("----------------"); + // 全部设备消息订阅 + List deviceList = + eduAttendanceDeviceMapper.selectList(Wrappers.lambdaQuery(new EduAttendanceDevice()) + .eq(EduAttendanceDevice::getDeviceType, DeviceType.HAIQING)); + if (CollUtil.isNotEmpty(deviceList)) { + List snList = deviceList.stream() + .map(x -> StrUtil.utf8Str("$queue/mqtt/face/" + x.getSn() + "/Ack")).collect(Collectors.toList()); + snList.addAll(deviceList.stream().map(x -> StrUtil.utf8Str("$queue/mqtt/face/" + x.getSn() + + "/Rec")).collect(Collectors.toList())); + mqttUtil.addTopic(snList.toArray(new String[0])); + } + // 心跳订阅 + mqttUtil.addTopic(StrUtil.utf8Str("$queue/mqtt/face/heartbeat")); + // 上线订阅 + mqttUtil.addTopic(StrUtil.utf8Str("$queue/mqtt/face/basic")); + //} + } + + @Override + public void connectionLost(Throwable throwable) { + log.info("----------------"); + log.info("丢失连接", throwable); + log.info("----------------"); + } + + /** + * 接受消息 + */ + @Override + public void messageArrived(String s, MqttMessage mqttMessage) { + checkReceiveMsg(s, mqttMessage); + } + + @Async + public void checkReceiveMsg(String s, MqttMessage mqttMessage) { + String msg = new String(mqttMessage.getPayload()); + JSONObject msgJson = JSONUtil.parseObj(msg); + // 处理数据 + String type = msgJson.getStr("operator"); + JSONObject info = msgJson.getJSONObject("info"); + // 保存接收消息到es + if (!HaiqingConstant.HEARTBEAT.equals(type)) { + ReceiveMsg receiveMsg = new ReceiveMsg(); + receiveMsg.setTopic(s); + receiveMsg.setMsg(msg); + receiveMsg.setId(SNOWFLAKE.nextId()); + receiveMsg.setChannel(MsgChannel.MQTT.getValue()); + receiveMsg.setCreateDate(LocalDateTime.now()); + redisService.lSet(CachePrefixConstant.RECEIVE_MSG, receiveMsg); +// log.info("接收的消息值, type: {}, info: {}", type, info); + } + try { + switch (type) { + // 编辑单个人员 + case HaiqingConstant.EDIT_PERSON_CALL: + log.info("增改人员消息接收的消息值, type: {}, info: {}", type, info); + editUser(info); + break; + // 批量增加与修改 处理逻辑相同 + case HaiqingConstant.ADD_PERSON_BATCH_CALL: + log.info("批量增加人员接收的消息值, type: {}, info: {}", type, info); + editUserBatch(msgJson, info, 1); + break; + case HaiqingConstant.UPDATE_PERSON_BATCH_CALL: + log.info("批量修改人员接收的消息值, type: {}, info: {}", type, info); + editUserBatch(msgJson, info, 0); + break; + // 删除单个人员 + case HaiqingConstant.DELETE_PERSON_CALL: + log.info("删除人员接收的消息值, type: {}, info: {}", type, info); + deleteUser(info); + break; + // 批量删除人员 + case HaiqingConstant.DELETE_PERSON_BATCH_CALL: + log.info("批量删除人员接收的消息值, type: {}, info: {}", type, info); + deleteUserBatch(info); + break; + // 认证信息推送 + case HaiqingConstant.REC_PERSON: + recPerson(s, info); + break; + // 心跳保活 + case HaiqingConstant.HEARTBEAT: + heartbeat(info); + break; + case HaiqingConstant.UNLOCK_ACK: + openDoor(info); + break; + case HaiqingConstant.SET_SYS_TIME_ACK: + setSysTime(info); + break; + // 设备上线 + case HaiqingConstant.ONLINE: + online(info); + break; + // 回复接收到认证记录信息返回 + case HaiqingConstant.PUSH_MESSAGE_ACK: + log.info("接收确认返回: {}", info); + pushMessageReturn(info); + break; + default: + } + } catch (Exception e) { + info.remove("pic"); + log.error("haiqing callback fail, info: {}", JSONUtil.toJsonStr(info), e); + } + } + + /** + * 回复接收到认证记录信息返回 + * + * @param info 接收的返回信息 + * @author ZYJ + * @date 2023/10/27 11:35 + */ + private void pushMessageReturn(JSONObject info) { + try { + // 设备号 + String deviceSn = info.getStr("facesluiceId"); + // 记录id + Integer recordId = info.getInt("SnapOrRecordID"); + // 操作结果,成功:“ok”/失败:“fail” + String result = info.getStr("result"); + // 操作成功删除缓存信息 + if (HaiqingCallbackCodeConstant.PUSH_RETURN_SUCCESS_RESULT.equals(result)) { + redisService.hdel(CachePrefixConstant.HQ_RECEIVE_INFO + deviceSn, String.valueOf(recordId)); + } + } catch (Exception e) { + log.error("回复接收到认证记录信息返回处理失败", e); + } + } + + @Override + public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) { + + } + + + private void editUser(JSONObject info) { + if ("fail".equals(info.get("result").toString())) { + // 删除本地对应关系,重置用户状态 + Integer type = Integer + .valueOf(info.get("customId").toString().substring(info.get("customId").toString().length() - 1)); + Long userId = Long + .valueOf(info.get("customId").toString().substring(0, info.get("customId").toString().length() - 1)); + EduUserFace userFace = remoteUserFaceService.getFaceByUser(userId, type).getData(); + // 发送重新采集通知 + if (userFace != null) { +// noticeService.sendCollectFailNotice(userFace.getPicPath(), userId, type); + remoteUserFaceService.delFaceByUser(userId, type); + } + log.error("mqtt编辑用户失败,customId:{},msg:{}", info.get("customId"), info.get("detail").toString()); + } + } + + /** + * 批量增加人员回调 + * + * @param msgJson 接收设备的所有信息 + * @param info 接收的设备info信息 + * @param type 0-修改,1-增加 + */ + private void editUserBatch(JSONObject msgJson, JSONObject info, Integer type) { + // 设备号 + String deviceSn = info.getStr("facesluiceId"); + + // 添加设备锁 + String lockKey = LockPrefixConstant.ISSUE_FACE_DEVICE_LOCK + deviceSn; + // 加锁 + redisService.falseLock(lockKey); + try { + // 人脸组id + Object o = redisService.hget(CachePrefixConstant.ISSUE_FACE_GROUP_DEVICE, deviceSn); + Long faceGroupId = Objects.nonNull(o) ? Long.valueOf(o.toString()) : null; + // 设备回调后删除当前设备下发的人脸信息 + redisService.del(CachePrefixConstant.HQ_EDIT_BATCH + deviceSn); + // 当前设备下发的人脸信息 + Map faceList; + // 删除海清人脸下发信息. 0-修改,1-增加 + if (type == 0) { + // 编辑信息 + faceList = redisService.hmget(CachePrefixConstant.HQ_BATCH_EDIT + deviceSn); + redisService.del(CachePrefixConstant.HQ_BATCH_EDIT + deviceSn); + } else { + // 新增信息 + faceList = redisService.hmget(CachePrefixConstant.HQ_BATCH_ADD + deviceSn); + redisService.del(CachePrefixConstant.HQ_BATCH_ADD + deviceSn); + } + // 释放批量编辑锁 + redisService.falseUnLock(LockPrefixConstant.HQ_DEVICE_USER_EDIT_LOCK + deviceSn); + + // 判断返回状态码 + String code = msgJson.getStr("code"); + // 当前设备全部失败 + if (HaiqingCallbackCodeConstant.DEVICE_BUSY.equals(code) + || HaiqingCallbackCodeConstant.DATA_OUT_OF_RANGE.equals(code)) { + // 添加失败信息并返回 + redisService.incr(CachePrefixConstant.ISSUE_FACE_FINISH + faceGroupId, (long) faceList.size()); + redisService.incr(CachePrefixConstant.ISSUE_FACE_ERROR + faceGroupId, (long) faceList.size()); + // 设置当前设备错误信息 + redisService.lSet(CachePrefixConstant.ISSUE_FACE_ERROR_MSG + faceGroupId + StringConstant.DOT + deviceSn, + faceList.values()); + // 解除设备锁 + redisService.falseUnLock(lockKey); + + // 修改人脸状态 + if (CollUtil.isNotEmpty(faceList)) { + // 失败的用户 修改其下发状态 删除下发记录 + UpdateFaceGroupUserStatusDTO dto = new UpdateFaceGroupUserStatusDTO(); + dto.setUserList(faceList.values().stream().map(value -> { + EduUserFace userFace = (EduUserFace) value; + EduFaceGroupUser user = new EduFaceGroupUser(); + user.setUserId(userFace.getUserId()); + user.setUserType(userFace.getUserType()); + user.setFaceGroupId(userFace.getFaceGroupUserId()); + return user; + }).collect(Collectors.toList())); + dto.setStatus(EduFaceGroupUser.ISSUE_FAIL); + remoteUserFaceService.updateFaceGroupUserStatus(dto); + } + return; + } + + // 设备信息 + EduAttendanceDevice device = eduAttendanceDeviceMapper.selectOne( + Wrappers.lambdaQuery(new EduAttendanceDevice()).eq(EduAttendanceDevice::getSn, deviceSn) + .eq(EduAttendanceDevice::getDeviceType, DeviceType.HAIQING.getValue())); +// // 策略下发信息 +// JSONObject userParams = JSONUtil.createObj(); +// // 设置人员绑定策略 +// userParams.set("operator", HaiqingConstant.PERSONS_BIND_STRATEGY) +// .set("messageId", StrUtil.uuid().replace("-", "")); +// JSONArray personsInfo = JSONUtil.createArray(); + // 下发的人脸信息 + List userFaceList = new ArrayList<>(); + + // 判断设备数量 + Object onlineNumberObject = redisService.get(CachePrefixConstant.ISSUE_FACE_GROUP_DEVICE_NUMBER + device.getSn()); + int onlineNumber = Objects.nonNull(onlineNumberObject) ? (Integer) onlineNumberObject : 1; + + if (info.getInt("AddSucNum") != 0) { + // 去除添加成功人员 + JSONArray addSucInfo = info.getJSONArray("AddSucInfo"); + // 用户和设备关联信息 + List userDeviceList = new ArrayList<>(); + // 下发成功人脸信息 + List successList = new ArrayList<>(); + EduUserFace userFace = null; + + for (Object sucInfo : addSucInfo) { + try { + JSONObject sucMsg = (JSONObject) sucInfo; + String customId = sucMsg.getStr("customId"); + // 删除redis中的缓存 +// redisService.hdel(CachePrefixConstant.HQ_EDIT_BATCH + deviceSn, customId); + // 保存设备的下发记录 + userFace = (EduUserFace) faceList.get(customId); + if (userFace != null) { + if (type == 1) { + // 新增下发成功添加人脸与设备的关联关系 + EduUserDevice userDevice = new EduUserDevice(); + userDevice.setDeviceId(device.getId()); + userDevice.setFaceGroupId(userFace.getFaceGroupUserId()); + userDevice.setUserId(userFace.getUserId()); + userDevice.setUserType(userFace.getUserType()); + userDeviceList.add(userDevice); + } + // 添加策略下发人员信息 + userFaceList.add(userFace); + } + // 添加策略关联信息 +// JSONObject singleObject = JSONUtil.createObj() +// // 用户id+用户类型 +// .set("customId", customId); +// Map map = redisService.hmget(CachePrefixConstant.USER_ATTENDANCE_STRATEGY +// + deviceSn + "-" + customId); +// if (CollUtil.isEmpty(map)) { +// continue; +// } +// // 设置用户信息 +// JSONArray array = JSONUtil.createArray(); +// map.forEach((k, v) -> array.add(k)); +// singleObject.set("strategyID", array); +// personsInfo.add(singleObject); + } catch (Exception e) { + log.error("成功下发人脸错误信息: {}", sucInfo, e); + } finally { + // 添加成功人脸信息 + if (Objects.nonNull(userFace)) { + // 添加人脸信息锁 + String userFaceLockKey = LockPrefixConstant.ISSUE_FACE_GROUP_LOCK + userFace.getFaceGroupUserId() + + StringConstant.DOT + userFace.getUserId(); + redisService.lock(userFaceLockKey); + // 判断数量. 所有数量成功才修改人脸状态 + String groupUserSuccessKey = + CachePrefixConstant.ISSUE_GROUP_USER_FACE_SUCCESS + userFace.getFaceGroupUserId(); + if (redisService.hHasKey(groupUserSuccessKey, String.valueOf(userFace.getUserId()))) { + // 成功数量 + Integer successNum = (Integer) redisService + .hget(groupUserSuccessKey, String.valueOf(userFace.getUserId())); + if (successNum + 1 >= onlineNumber) { + // 下发成功的人脸 + EduFaceGroupUser user = new EduFaceGroupUser(); + user.setUserId(userFace.getUserId()); + user.setUserType(userFace.getUserType()); + user.setFaceGroupId(userFace.getFaceGroupUserId()); + successList.add(user); + redisService.hdel(groupUserSuccessKey, String.valueOf(userFace.getUserId())); + } else { + // 成功数量加1 + redisService.hashIncrement(groupUserSuccessKey, String.valueOf(userFace.getUserId()), 1L); + } + } else { + if (onlineNumber == 1) { + // 下发成功的人脸 + EduFaceGroupUser user = new EduFaceGroupUser(); + user.setUserId(userFace.getUserId()); + user.setUserType(userFace.getUserType()); + user.setFaceGroupId(userFace.getFaceGroupUserId()); + successList.add(user); + redisService.hdel(groupUserSuccessKey, String.valueOf(userFace.getUserId())); + } else { + // 添加成功数量 + redisService.hset(groupUserSuccessKey, String.valueOf(userFace.getUserId()), 1); + } + } + redisService.unlock(userFaceLockKey); + } + } + } + // 需要绑定策略的信息 +// if (CollUtil.isNotEmpty(personsInfo)) { +// userParams.set("info", JSONUtil.createObj().set("personsInfo", personsInfo)); +// log.info("推送的人员绑定策略消息=================sn: {}, params: {}", device.getSn(), userParams); +// // 绑定策略消息 +// mqttUtil.publish(userParams.toString(), "mqtt/face/" + device.getSn()); +// } + // 保存人员和设备关联信息 + if (CollUtil.isNotEmpty(userDeviceList)) { + remoteUserDeviceService.batchSave(userDeviceList); + } + // 保存下发成功信息 + if (CollUtil.isNotEmpty(successList)) { + UpdateFaceGroupUserStatusDTO dto = new UpdateFaceGroupUserStatusDTO(); + dto.setUserList(successList); + dto.setStatus(EduFaceGroupUser.ISSUED); + remoteUserFaceService.updateFaceGroupUserStatus(dto); + } + // 添加成功人员数量 + redisService.incr(CachePrefixConstant.ISSUE_FACE_FINISH + faceGroupId, info.getLong("AddSucNum")); + } + if (info.getInt("AddErrNum") != 0) { + // 下发失败修改下发状态 + JSONArray addErrInfo = info.getJSONArray("AddErrInfo"); + // 用户和设备关联信息 + List userDeviceList = new ArrayList<>(); + // 下发成功人脸信息 + List successList = new ArrayList<>(); + // 下发失败人脸信息 + List errorList = new ArrayList<>(); + + long error = 0; + long finish = 0; + for (Object errInfo : addErrInfo) { + String customId = ""; + String errCode = ""; + // 保存设备的下发记录 + EduUserFace userFace = null; + try { + JSONObject errMsg = (JSONObject) errInfo; + customId = errMsg.getStr("customId"); + errCode = errMsg.getStr("errcode"); + userFace = (EduUserFace) faceList.get(customId); + log.error("issue face fail,msg:[{}],customId:[{}]", errCode, customId); + if (Objects.nonNull(userFace)) { + // 新增人员时, 461代表设备上customId已经存在, 需要添加本地数据 + if (HaiqingCallbackCodeConstant.ADD_PERSON_EXIST.equals(errCode) && type == 1) { + + // 将本地数据修改为已存在 + EduUserDevice userDevice = new EduUserDevice(); + // 人脸与设备的关联关系 + userDevice.setDeviceId(device.getId()); + userDevice.setFaceGroupId(userFace.getFaceGroupUserId()); + userDevice.setUserId(userFace.getUserId()); + userDevice.setUserType(userFace.getUserType()); + userDeviceList.add(userDevice); + + // 添加人脸信息锁 + String userFaceLockKey = LockPrefixConstant.ISSUE_FACE_GROUP_LOCK + userFace.getFaceGroupUserId() + + StringConstant.DOT + userFace.getUserId(); + redisService.lock(userFaceLockKey); + // 判断数量. 所有数量成功才修改人脸状态 + String groupUserSuccessKey = + CachePrefixConstant.ISSUE_GROUP_USER_FACE_SUCCESS + userFace.getFaceGroupUserId(); + if (redisService.hHasKey(groupUserSuccessKey, String.valueOf(userFace.getUserId()))) { + // 成功数量 + Integer successNum = (Integer) redisService + .hget(groupUserSuccessKey, String.valueOf(userFace.getUserId())); + if (successNum + 1 >= onlineNumber) { + // 下发成功的人脸 + EduFaceGroupUser user = new EduFaceGroupUser(); + user.setUserId(userFace.getUserId()); + user.setUserType(userFace.getUserType()); + user.setFaceGroupId(userFace.getFaceGroupUserId()); + successList.add(user); + redisService.hdel(groupUserSuccessKey, String.valueOf(userFace.getUserId())); + } else { + // 成功数量加1 + redisService.hashIncrement(groupUserSuccessKey, String.valueOf(userFace.getUserId()), 1L); + } + } else { + if (onlineNumber == 1) { + // 下发成功的人脸 + EduFaceGroupUser user = new EduFaceGroupUser(); + user.setUserId(userFace.getUserId()); + user.setUserType(userFace.getUserType()); + user.setFaceGroupId(userFace.getFaceGroupUserId()); + successList.add(user); + redisService.hdel(groupUserSuccessKey, String.valueOf(userFace.getUserId())); + } else { + // 添加成功数量 + redisService.hset(groupUserSuccessKey, String.valueOf(userFace.getUserId()), 1); + } + } + redisService.unlock(userFaceLockKey); + // 添加策略下发人员信息 + userFaceList.add(userFace); + + // 添加策略关联信息 +// JSONObject singleObject = JSONUtil.createObj() +// // 用户id+用户类型 +// .set("customId", customId); +// Map map = redisService.hmget(CachePrefixConstant.USER_ATTENDANCE_STRATEGY +// + deviceSn + "-" + customId); +// if (CollUtil.isEmpty(map)) { +// continue; +// } +// // 设置用户信息 +// JSONArray array = JSONUtil.createArray(); +// map.forEach((k, v) -> array.add(k)); +// singleObject.set("strategyID", array); +// personsInfo.add(singleObject); + } + + // 编辑人员时, 462代表设备上不存在此customId, 需要删除本地数据 + if (HaiqingCallbackCodeConstant.EDIT_PERSON_NOT_EXIST.equals(errCode) && type == 0) { + // 删除人脸与设备的关联关系 + EduUserDevice userDevice = new EduUserDevice(); + userDevice.setDeviceId(device.getId()); + userDevice.setFaceGroupId(userFace.getFaceGroupUserId()); + userDevice.setUserId(userFace.getUserId()); + userDevice.setUserType(userFace.getUserType()); + remoteUserDeviceService.deleteRelation(userDevice); + } + } + } catch (Exception e) { + log.error("保存人员错误下发人脸错误信息: {}", errInfo, e); + } finally { + if (StrUtil.isEmpty(customId) || StrUtil.isEmpty(errCode) || Objects.isNull(userFace) + || !(HaiqingCallbackCodeConstant.ADD_PERSON_EXIST.equals(errCode) && type == 1)) { + error++; + if (Objects.nonNull(userFace)) { + EduFaceGroupUser user = new EduFaceGroupUser(); + user.setUserId(userFace.getUserId()); + user.setUserType(userFace.getUserType()); + user.setFaceGroupId(userFace.getFaceGroupUserId()); + errorList.add(user); + // 添加错误人脸 + redisService + .lSet(CachePrefixConstant.ISSUE_FACE_ERROR_MSG + faceGroupId + StringConstant.DOT + deviceSn, + userFace); + } + } + // 移除下发人脸信息 +// redisService.hdel(CachePrefixConstant.HQ_EDIT_BATCH + deviceSn, customId); + finish++; + } + } + +// if (CollUtil.isNotEmpty(personsInfo)) { +// userParams.set("info", JSONUtil.createObj().set("personsInfo", personsInfo)); +// log.info("推送的人员绑定策略消息=================sn: {}, params: {}", device.getSn(), userParams); +// // 绑定策略消息 +// mqttUtil.publish(userParams.toString(), "mqtt/face/" + device.getSn()); +// } + // 保存人员和设备关联信息 + if (CollUtil.isNotEmpty(userDeviceList)) { + remoteUserDeviceService.batchSave(userDeviceList); + } + // 保存下发成功信息 + if (CollUtil.isNotEmpty(successList)) { + UpdateFaceGroupUserStatusDTO dto = new UpdateFaceGroupUserStatusDTO(); + dto.setUserList(successList); + dto.setStatus(EduFaceGroupUser.ISSUED); + remoteUserFaceService.updateFaceGroupUserStatus(dto); + } + // 添加失败人员数量 + redisService.incr(CachePrefixConstant.ISSUE_FACE_FINISH + faceGroupId, finish); + redisService.incr(CachePrefixConstant.ISSUE_FACE_ERROR + faceGroupId, error); + // 保存下发失败信息 + if (CollUtil.isNotEmpty(errorList)) { + // 失败的用户 修改其下发状态 删除下发记录 + UpdateFaceGroupUserStatusDTO dto = new UpdateFaceGroupUserStatusDTO(); + dto.setUserList(errorList); + dto.setStatus(EduFaceGroupUser.ISSUE_FAIL); + remoteUserFaceService.updateFaceGroupUserStatus(dto); + } + } + // 异步推送策略绑定信息 + if (CollUtil.isNotEmpty(userFaceList)) { + HaiqingCallbackService bean = applicationContext.getBean(HaiqingCallbackService.class); + bean.pushStrategyMessage(deviceSn, userFaceList, faceGroupId); + } + } catch (Exception e) { + log.error("下发人脸回调失败", e); + } finally { + // 解除设备锁 + redisService.falseUnLock(lockKey); + } + } + + private void deleteUser(JSONObject info) { + if ("fail".equals(info.get("result").toString())) { + log.error("mqtt删除用户失败,userId:{},msg:{}", info.get("customId"), info.get("detail").toString()); + } + } + + /** + * 批量删除人员回调 + */ + private void deleteUserBatch(JSONObject info) { + String deviceSn = info.getStr("facesluiceId"); + // 释放该设备的删除锁 + redisService.falseUnLock(LockPrefixConstant.HQ_DEVICE_USER_DELETE_LOCK + deviceSn); + } + + private void setSysTime(JSONObject info) { + if ("fail".equals(info.get("result").toString())) { + log.error("mqtt设置时间失败,deviceId:{}", info.get("facesluiceId").toString()); + } + } + + private void openDoor(JSONObject info) { + if ("fail".equals(info.get("result").toString())) { + log.error("mqtt开门失败,deviceId:{}", info.get("facesluiceId").toString()); + } + } + + /** + * 接收认证结果 + */ + private void recPerson(String topic, JSONObject info) { + AddAttendanceRecordDTO dto = new AddAttendanceRecordDTO(); + Long schoolId = null; + try { + // TODO: 2023/10/28 断网续传验证后开启注释 +// try { +// // 设备号 +// String deviceSn = info.getStr("facesluiceId"); +// // 记录id +// Integer recordId = info.getInt("RecordID"); +// redisService.hset(CachePrefixConstant.HQ_RECEIVE_INFO + deviceSn, String.valueOf(recordId), info); +// +// HaiqingCallbackService bean = applicationContext.getBean(HaiqingCallbackService.class); +// // 接收认证消息推送方法 +// bean.pushConfirmMessage(deviceSn, 2, recordId); +// } catch (Exception e) { +// log.error("接收认证消息推送方法失败: {}", info, e); +// } + +// log.info("接收认证结果:{}", info); + String verifyStatus = info.getStr("VerifyStatus"); + + if (StrUtil.equals("24", verifyStatus)) { + //表示,无权限通过 + return; + } + + String userFlag = info.getStr("customId"); + if (StrUtil.isBlank(userFlag)) { + return; + } + Long userId = Long.valueOf(userFlag.substring(0, userFlag.length() - 1)); + // 设备号 + String sn = info.get("facesluiceId").toString(); + // 查询设备信息 + EduAttendanceDevice attendanceDevice = eduAttendanceDeviceMapper + .selectOne(Wrappers.lambdaQuery(new EduAttendanceDevice()) + .eq(EduAttendanceDevice::getSn, sn)); + if (Objects.isNull(attendanceDevice)) { + log.error("设备信息不存在: {}", sn); + return; + } + schoolId = attendanceDevice.getSchoolId(); + dto.setSchoolId(attendanceDevice.getSchoolId()); + dto.setDeviceSn(sn); + dto.setCreateTime(LocalDateTime.parse(info.getStr("time"), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); + dto.setUserId(userId); + // 优化类型 + char type = userFlag.charAt(userFlag.length() - 1); + dto.setUserType(Integer.parseInt(Character.toString(type)) == 0 ? 1 : 0); + dto.setName(info.getStr("persionName")); + + // 获取识别机推送信息 + String base64 = info.getStr("pic"); + String url = ""; + if (StrUtil.isNotEmpty(base64)) { +// log.error("人脸认证结果接收失败, 没有图片信息"); +// return; + // 本地路径 + String localPath = FileUtil.uploadBase64Img(base64.substring(base64.indexOf(",") + 1), "png"); + // 上传到媒资 + url = FileUtil.uploadFileToMediaServer(uploadUrl, localPath).split(",")[0]; + cn.hutool.core.io.FileUtil.del(localPath); + } + dto.setPicUrl(url); +// Double temp = info.get("temperature") != null ? Double.valueOf(info.get("temperature").toString()) : null; + // 人脸区域 +// String facePath = null; + // 上传人脸部分 +// String faceUrl = StrUtil.isNotBlank(facePath) ? FileUtil.uploadFileToMediaServer(facePath).split(",")[0] : url; + // 删除本地文件 + +// if (facePath != null) { +// cn.hutool.core.io.FileUtil.del(facePath); +// } +// log.info("人脸识别信息:[{}]", dto); + dto.setMsgChannel(MsgChannel.MQTT); + dto.setOriginalRecordId(info.getStr("RecordID")); + attendanceRecordService.addRecord(dto); + } catch (Exception e) { + // 添加数据到es + errorRecordMsgService.saveMsg(ErrorRecordMsg.builder() +// .id(SNOWFLAKE.nextId()) + .createDate(LocalDateTime.now()) + .schoolId(schoolId) + .msg(JSONUtil.toJsonStr(dto)) + .topic(topic) + .channel(MsgChannel.MQTT.getValue()) + .recordType(RecordTypeEnum.PANEL_MACHINE.getType()) + .build() + ); + throw e; + } + } + + /** + * 接收心跳消息 + */ + private void heartbeat(JSONObject info) { + MQTT_HEARTBEAT_POOL.execute(() -> { + String deviceSn = info.getStr("facesluiceId"); + // 一次心跳过期时间为发送时间60s之后,即连续两次未检测到心跳该设备才失活 + redisService.del(CachePrefixConstant.ALIVE_DEVICE + deviceSn); + redisService.set(CachePrefixConstant.ALIVE_DEVICE + deviceSn, 1, 90L); + }); + } + + /** + * 设备上线 + */ + private void online(JSONObject info) { + String deviceSn = info.getStr("facesluiceId"); + log.info("设备上线,sn:[{}]", deviceSn); + if (redisService.hasKey(CachePrefixConstant.HQ_EDIT_BATCH + deviceSn)) { + log.info("上线自动释放人脸下发锁,sn:[{}]", deviceSn); + redisService.falseUnLock(LockPrefixConstant.HQ_DEVICE_USER_EDIT_LOCK + deviceSn); + redisService.falseUnLock(LockPrefixConstant.HQ_DEVICE_USER_DELETE_LOCK + deviceSn); + } + JSONObject ack = new JSONObject() {{ + set("messageId", StrUtil.uuid()); + set("operator", "Online-Ack"); + set("info", new JSONObject() {{ + set("facesluiceId", deviceSn); + set("result", "ok"); + set("detail", ""); + }}); + }}; + mqttUtil.publish(ack.toString(), "mqtt/face/" + deviceSn); + } + + /** + * 接收认证消息推送方法 + * + * @param deviceSn 设备号 + * @param pushAckType 推送类型. 1:回复接收到陌生人抓拍信息; 2:回复接收到认证记录信息 + * @param snapOrRecordId 对应记录id. PushAckType=1, 填接收到的陌生人抓拍库 ID; PushAckType=2, 填接收到的控制记录库 ID + * @author ZYJ + * @date 2023/10/27 11:20 + */ + @Async + public void pushConfirmMessage(String deviceSn, int pushAckType, int snapOrRecordId) { + try { + log.info("开始推送消息"); + JSONObject jsonObject = JSONUtil.createObj() + .set("messageId", StrUtil.uuid()) + .set("operator", HaiqingConstant.PUSH_MESSAGE) + .set("info", JSONUtil.createObj() + .set("PushAckType", pushAckType) + .set("SnapOrRecordID", snapOrRecordId) + ); + Boolean publish = mqttUtil.publish(jsonObject.toString(), "mqtt/face/" + deviceSn); + log.info("结束推送消息: {}", publish); + } catch (Exception e) { + log.error("接收认证消息推送方法失败", e); + } + } + + /** + * 推送人员和策略绑定信息 + * + * @param deviceSn 设备号 + * @param userFaceList 人脸集合 + * @param faceGroupId 人脸组id + * @author ZYJ + * @date 2023/11/7 16:44 + */ + @Async + public void pushStrategyMessage(String deviceSn, List userFaceList, Long faceGroupId) { + try { + // 人员信息 + JSONArray personsInfo = JSONUtil.createArray(); + + for (EduUserFace userFace : userFaceList) { + if (Objects.isNull(userFace)) { + continue; + } + // 设置用户信息 + JSONArray array = JSONUtil.createArray(); + // 判断是否有请假策略 + List list = eduUserStrategyService.list(Wrappers.lambdaQuery(new EduUserStrategy()) + .eq(EduUserStrategy::getUserId, userFace.getUserId()) + .eq(EduUserStrategy::getUserType, userFace.getUserType()) + .ge(EduUserStrategy::getEndTime, LocalDateTime.now()) + ); + if (CollUtil.isNotEmpty(list)) { + list.forEach(strategy -> array.add(strategy.getStrategyId())); + } + // 判断人脸组是否有策略信息 + if (Objects.nonNull(faceGroupId)) { + EduFaceGroupStrategy strategy = remoteFaceGroupStrategyService.getStrategyInfo(faceGroupId).getData(); + if (Objects.nonNull(strategy)) { + array.add(faceGroupId); + } + } + if (CollUtil.isNotEmpty(array)) { + // 设置绑定信息 + JSONObject singleObject = JSONUtil.createObj() + // 用户id+用户类型 + .set("customId", userFace.getUserId() + userFace.getUserType().toString()) + // 策略id数组 + .set("strategyID", array); + personsInfo.add(singleObject); + } + } + // 推送绑定信息 + if (CollUtil.isNotEmpty(personsInfo)) { + // 策略下发信息 + JSONObject userParams = JSONUtil.createObj(); + // 设置人员绑定策略 + userParams.set("operator", HaiqingConstant.PERSONS_BIND_STRATEGY) + .set("messageId", StrUtil.uuid().replace("-", "")); + // 人员信息 + userParams.set("info", JSONUtil.createObj().set("personsInfo", personsInfo)); + log.info("推送的人员绑定策略消息=================sn: {}, params: {}", deviceSn, userParams); + // 绑定策略消息 + mqttUtil.publish(userParams.toString(), "mqtt/face/" + deviceSn); + } + } catch (Exception e) { + log.error("推送人员绑定策略消息失败, deviceSn: {}", deviceSn, e); + } + } +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/NoticeServiceImpl.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/NoticeServiceImpl.java new file mode 100644 index 0000000..b44820a --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/service/impl/NoticeServiceImpl.java @@ -0,0 +1,501 @@ +package com.yida.data.attendance.service.impl; + +import cc.mrbird.febs.common.redis.service.RedisService; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.LocalDateTimeUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.yida.data.attendance.dto.DayReportDataDTO; +import com.yida.data.attendance.service.AttendanceReportStrategyService; +import com.yida.data.attendance.service.AttendanceRuleRemindService; +import com.yida.data.attendance.service.NoticeService; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRecord; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceReportStrategy; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceResult; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRule; +import com.yida.data.common.core.entity.attendance.attendance.AttendanceRuleRemind; +import com.yida.data.common.core.entity.constant.AppConstant; +import com.yida.data.common.core.entity.constant.NoticeTypeConstant; +import com.yida.data.common.core.entity.notice.app.AppNotice; +import com.yida.data.common.core.entity.notice.app.inside.PushMessage; +import com.yida.data.common.core.entity.notice.qywx.NewsSchoolNotice; +import com.yida.data.common.core.entity.notice.qywx.TemplateCardStaffNotice; +import com.yida.data.common.core.entity.notice.qywx.TextCardStaffNotice; +import com.yida.data.common.core.entity.notice.qywx.inside.Article; +import com.yida.data.common.core.entity.notice.qywx.inside.News; +import com.yida.data.common.core.entity.notice.qywx.inside.TemplateCardNotice; +import com.yida.data.common.core.entity.notice.qywx.inside.TextCard; +import com.yida.data.common.core.entity.notice.qywx.inside.templateCard.CardAction; +import com.yida.data.common.core.entity.notice.qywx.inside.templateCard.HorizontalContent; +import com.yida.data.common.core.entity.notice.qywx.inside.templateCard.Jump; +import com.yida.data.common.core.entity.notice.qywx.inside.templateCard.MainTitle; +import com.yida.data.common.core.entity.school.EduYidaAppAccount; +import com.yida.data.common.core.entity.system.Dept; +import com.yida.data.common.core.entity.system.EduApp; +import com.yida.data.common.core.entity.system.EduYidaApp; +import com.yida.data.common.core.entity.user.EduParent; +import com.yida.data.common.core.entity.user.EduStaff; +import com.yida.data.common.core.entity.user.EduStudent; +import com.yida.data.common.core.enums.UserTypeEnum; +import com.yida.data.common.core.enums.attendance.AttendanceUserTypeEnum; +import com.yida.data.common.core.enums.leave.LeaveRequestTypeEnum; +import com.yida.data.common.core.utils.AppUtil; +import com.yida.data.common.core.utils.WxUtil; +import com.yida.data.common.service.CommonService; +import com.yida.data.user.feign.RemoteStaffService; +import com.yida.data.user.feign.RemoteStudentApplyService; +import com.yida.data.user.feign.RemoteStudentService; +import java.time.Duration; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import javax.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.apache.catalina.User; +import org.apache.poi.hssf.record.PageBreakRecord.Break; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.stereotype.Service; + +@Service +@Slf4j +@RefreshScope +public class NoticeServiceImpl implements NoticeService { + + @Resource + private RemoteStudentService remoteStudentService; + + @Resource + private RemoteStaffService remoteStaffService; + + @Resource + private AttendanceReportStrategyService attendanceReportStrategyService; + + @Resource + private CommonService commonService; + @Resource + private WxUtil wxUtil; + @Value("${febs.pageUrl}") + private String pageUrl; + @Resource + private RedisService redisService; + + @Resource + private RemoteStudentApplyService remoteStudentApplyService; + //schoolHomePage + + private static final String STUDENT_RECORD_DETAIL_URL = "/attendance/parents/home"; + private static final String STUDENT_RECORD_DETAIL_URL_NEW = "/schoolHomePage/#/stuAttAll"; + private static final String PARENT_COLLECT_FAIL_URL = "/collection/parent/index.html"; + //管理员查看学生考勤统计详情 + private static final String PARENT_TEACHER_ATTENDANCE_DETAIL_URL = "/schoolHomePage/#/stuTeacherdetail"; + //管理员查看教职工考勤统计详情 + private static final String STAFF_TEACHER_ATTENDANCE_DETAIL_URL = "/schoolHomePage/#/stuTeacherdetail"; + //学院领导查看日报统计信息 + private static final String STUDENT_DAY_REPORT_URL = "/schoolHomePage/#/attentionSentStastic"; + //通行记录默认图 + private static final String DEFAULT_ACCESS_IMG = "http://zbz.yd-data.com:8864/pic/other/2023111/8147045ffb904f208c8905ad7328d024.png"; + + @Override + public void sendAttendanceNotice(AttendanceRecord record) { + // 时间差异常 不进行推送 + LocalDateTime now = LocalDateTime.now(); + LocalDateTime deviceTime = record.getCreateTime(); + Duration duration = LocalDateTimeUtil.between(deviceTime, now); + // 时间差大于30分钟 不推送 + if (duration.toMinutes() > 30L) { + log.info("时间差过大,不推送通行消息,当前时间:[{}],设备时间:[{}],recordId:[{}]", now, deviceTime, record.getId()); + return; + } + if (ObjectUtil.isNull(record.getDeviceId())) { + return; + } + //目前推送进出学校 +// if (!ObjectUtil.equals(0, record.getZone())) { +// return; +// } + + //TODO 判断学生是否购买服务 +// EduAttendanceConfig config = +// (EduAttendanceConfig) redisService.hget(CachePrefixConstant.ATTENDANCE_CONFIG, +// result.getRecord().getSchoolId().toString()); +// if (config == null) { +// config = eduAttendanceConfigService.getConfig(result.getRecord().getSchoolId()); +// redisService.hset(CachePrefixConstant.ATTENDANCE_CONFIG, result.getRecord().getSchoolId().toString(), config); +// } +// if (ObjectUtil.equal("1", config.getPushState())) { //启用缴费才推送进出记录 +// //查询学生是否缴费 +// if (!remoteStudentApplyService.hasApply(result.getStudent().getId(), ApplyConstant.ATTENDANCE).getData()) { +// return; +// } +// } + + //查询家长推送提示是否开启 +// AttendanceReportStrategy strategy = attendanceReportStrategyService +// .getOne(Wrappers.lambdaQuery(new AttendanceReportStrategy()) +// .eq(AttendanceReportStrategy::getSchoolId, record.getSchoolId()) +// .eq(AttendanceReportStrategy::getType, 2)); +// +// if (ObjectUtil.isNull(strategy) || !ObjectUtil.equals(1, strategy.getParentEnrollReport())) { +// return; +// } + + if (ObjectUtil.equals(UserTypeEnum.PARENT_USER_TYPE.getType(), record.getUserType())) { + //家长端 + EduStudent student = commonService.getStudentById(record.getUserId()); + //查询学校信息 + Dept school = commonService.getDept(student.getSchoolId()); + List parentList = student.getParents(); + if (CollUtil.isNotEmpty(parentList)) { + if (CollUtil.isNotEmpty(parentList)) { + // 推微信消息 + if (school.getSchoolType().contains(Dept.TYPE_QYWX)) { + // 从redis获取应用数据 + EduApp app = commonService.getAppByCodeAndSchool(AppConstant.INDEX_PARENT, null, + student.getSchoolId()); + String token = wxUtil.getAccessToken(app.getWxCorpId(), app.getWxSecret()); + NewsSchoolNotice newsSchoolNotice = new NewsSchoolNotice(); + newsSchoolNotice.setAgentid(app.getWxAgentId()); + Article article = new Article(); + article.setPicurl(ObjectUtil.isEmpty(record.getPicUrl()) ? DEFAULT_ACCESS_IMG : record.getPicUrl()); + String detailUrl = pageUrl + STUDENT_RECORD_DETAIL_URL_NEW + + "?appId=" + app.getWxCorpId() + + "&userType=1" + + "&schoolId=" + student.getSchoolId() + + "&time=" + LocalDateTimeUtil.format(record.getCreateTime(), "yyyy" + + "-MM-dd") + + "&id=" + student.getId() + + "&recordId=" + record.getId() + + "&stuName=" + student.getStuName(); + article.setUrl(detailUrl); + article.setTitle("平安校园通知"); + newsSchoolNotice.setNews(new News(Collections.singletonList(article))); + for (EduParent parent : parentList) { + String wxId = parent.getWxId(); + String msg = ""; + if (ObjectUtil.equals(0, record.getZone())) { + //校门 + msg = String.format("尊敬的%s%s,%s在%s时间通过%s通道%s%s。【%s】", + student.getStuName(), + parent.getParentType(), + student.getStuName(), + LocalDateTimeUtil.format(record.getCreateTime(), "yyyy-MM-dd HH:mm:ss"), + record.getDeviceName(), + "0".equals(record.getScope().toString()) ? "进入" : "离开", + "0".equals(record.getZone().toString()) ? "学校" : "宿舍", + student.getSchoolName()); + } else { + //宿舍 + msg = String.format("尊敬的%s,%s时间在%s打卡成功,。【%s】", + student.getStuName(), + LocalDateTimeUtil.format(record.getCreateTime(), "yyyy-MM-dd HH:mm:ss"), + record.getDeviceName(), + student.getSchoolName()); + } + + article.setDescription(msg); + newsSchoolNotice.setTo_parent_userid(Collections.singletonList(wxId)); + wxUtil.pushSchoolNotice(token, newsSchoolNotice); + } +// log.info("push msg:{}", newsSchoolNotice); + } + // 推app消息 + if (school.getSchoolType().contains(Dept.TYPE_YIDA_APP)) { + // 从redis获取应用数据 + EduYidaApp yidaApp = commonService.getYidaApp(student.getSchoolId()); + EduYidaAppAccount account = commonService.getYidaAppAccount(student.getSchoolId(), 0); + AppNotice appNotice = new AppNotice(); + PushMessage msg = new PushMessage(); + msg.setTitle("平安校园通知"); + String detailUrl = pageUrl + STUDENT_RECORD_DETAIL_URL + + "?appId=" + school.getDeptId() + + "&type=1" + + "&loginType=2" + + "&id=" + student.getId().toString() + + "&aid=" + record.getId().toString() + + "&date=" + LocalDateTimeUtil.format(record.getCreateTime(), "yyyy" + + "-MM-dd"); + msg.setHtmlUrl(detailUrl); + msg.setImgUrl(ObjectUtil.isEmpty(record.getPicUrl()) ? DEFAULT_ACCESS_IMG : record.getPicUrl()); + msg.setAccountId(account.getYidaAppAccountId()); + msg.setMsgType(PushMessage.ARTICLE); + msg.setServiceId(account.getYidaAppAccountId()); + appNotice.setMsgList(Collections.singletonList(msg)); + for (EduParent parent : parentList) { + msg.setContent(String.format("尊敬的%s%s,%s在%s时间通过%s通道%s%s。【%s】", + student.getStuName(), + parent.getParentType(), + student.getStuName(), + LocalDateTimeUtil.format(record.getCreateTime(), "yyyy-MM-dd HH:mm:ss"), + record.getDeviceName(), + "0".equals(record.getScope().toString()) ? "进入" : "离开", + "0".equals(record.getZone().toString()) ? "学校" : "宿舍", + school.getDeptName() + )); + appNotice.setUserIds(Collections.singletonList(parent.getYidaAppUserId())); + appNotice.setPushMessage(new PushMessage(school.getDeptName() + "智慧校园", + account.getYidaAppAccountId())); + AppUtil.sendMsg(appNotice, yidaApp); + } + log.info("push attendance yida msg:{}", appNotice); + } + } + } + } else { + //TODO 职工段推送信息 + } + } + + @Override + public void sendCollectFailNotice(String picUrl, Long userId, Integer type) { + Dept school = null; + EduApp app; + // 学生和职工的通知样式不同 + + NewsSchoolNotice newsSchoolNotice = new NewsSchoolNotice(); + + Article article = new Article(); + article.setTitle("人脸审核不通过"); + + newsSchoolNotice.setNews(new News(Collections.singletonList(article))); + + if (type == 0) { + EduStudent student = remoteStudentService.getStudentNoPermission(userId).getData(); + school = commonService.getDept(student.getSchoolId()); + app = commonService.getAppByCodeAndSchool(AppConstant.COLLECT_PARENT, null, school.getDeptId()); + String token = wxUtil.getAccessToken(app.getWxCorpId(), app.getWxSecret()); + article.setPicurl(picUrl); + newsSchoolNotice.setAgentid(app.getWxAgentId()); + // 跳转链接 + String url = pageUrl + PARENT_COLLECT_FAIL_URL + "?studentId=" + student.getId() + "&corpId=" + + app.getWxCorpId(); + article.setUrl(url); + article.setDescription("点击图片重新采集"); + newsSchoolNotice.setTo_student_userid(Collections.singletonList(student.getWxId())); + // 每个家长发送消息 + wxUtil.pushSchoolNotice(token, newsSchoolNotice); + } + } + + @Override + public void sendLateNoticeToParent(AttendanceResult result) { + //封装卡片消息内容 + JSONObject notice = new JSONObject(); + EduStudent student = commonService.getStudentById(result.getUserId()); + Dept school = commonService.getDept(student.getSchoolId()); + EduApp app = commonService.getAppByCodeAndSchool(AppConstant.INDEX_PARENT, null, school.getDeptId()); + String token = wxUtil.getAccessToken(app.getWxCorpId(), app.getWxSecret()); + notice.put("msgtype", "textcard"); + notice.put("agentid", app.getWxAgentId()); + JSONObject textcard = new JSONObject(); + textcard.put("title", "迟到提醒"); + textcard.put("description", + "
" + LocalDate.now() + + "
" + student.getStuName() + "同学已迟到" + Duration + .between(result.getStartStiTime(), LocalTime.now()).toMinutes() + + ",请注意核实学生安全,如有特殊是由请及时告知相应教师。
"); + + StringBuilder detailUrl = new StringBuilder(); + detailUrl.append(pageUrl).append(STUDENT_RECORD_DETAIL_URL_NEW) + .append("?appId=").append(app.getWxCorpId()) + .append("&userType=1") + .append("&schoolId=").append(student.getSchoolId()) + .append("&date=").append(LocalDateTimeUtil.format(result.getCreateTime(), "yyyy" + + "-MM-dd")); + textcard.put("url", detailUrl); + notice.put("textcard", textcard); + List parentList = student.getParents(); + for (EduParent parent : parentList) { + notice.put("touser", parent.getWxId()); +// wxUtil.pushSchoolNotice(token, newsSchoolNotice); + } + } + + @Override + public void sendStudentAttendanceLateReportToStaff(List resultList, Long staffId, AttendanceRule rule, + Long lateMinute) { + EduStaff staff = remoteStaffService.getStaff(staffId).getData(); + //文本卡片消息 + TextCardStaffNotice textCardStaffNotice = new TextCardStaffNotice(); + textCardStaffNotice.setTouser(staff.getWxId()); + TextCard textCard = new TextCard(); + textCard + .setTitle(ObjectUtil.equals(AttendanceUserTypeEnum.STUDENT_TO_DORM.getValue(), rule.getUserType()) ? "晚归提醒" : "迟到提醒"); + + EduApp app = commonService.getAppByCodeAndSchool(AppConstant.CONTACT_SELECT, null, + staff.getSchoolId()); + if (ObjectUtil.isNull(app)) { + app = commonService.getAppByCodeAndSchool(AppConstant.ATTENDANCE_STAFF, null, + staff.getSchoolId()); + } + if (ObjectUtil.isNull(app)) { + log.error("学校【{}】无智慧校园应用,无法发送迟到报告", staff.getSchoolId()); + return; + } + textCardStaffNotice.setAgentid(app.getWxAgentId()); + String accessToken = wxUtil.getAccessToken(app.getWxCorpId(), app.getWxSecret()); + String url = String + .format("%s?corpId=%s&schoolId=%s&userType=%s&type=%s&startData=%s&endData=%s&timeName=%s&status=%s", + pageUrl + PARENT_TEACHER_ATTENDANCE_DETAIL_URL, + app.getWxCorpId(), + staff.getSchoolId(), 0, 1, LocalDateTimeUtil.format(LocalDateTime.now(), "yyyy" + + "-MM-dd"), LocalDateTimeUtil.format(LocalDateTime.now(), "yyyy" + + "-MM-dd"), LocalDateTimeUtil.format(LocalDateTime.now(), "yyyy" + + "-MM-dd"), 3); + //学生信息 + List studentNameList = new ArrayList<>(); + for (AttendanceResult result : resultList) { + if (studentNameList.size() > 4) { + break; + } + EduStudent student = remoteStudentService.getStudentNoPermission(result.getUserId()).getData(); + if (ObjectUtil.isNotNull(student)) { + studentNameList.add(student.getStuName()); + } + } + String format = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy年MM月dd日")); + + String msg = String.format("
%s
" + + "
%s
" + + "
%s等%S名学生已迟到%s分钟,请及时联系并核实情况!
", + format, rule.getName(), studentNameList.stream().collect(Collectors.joining(",")), resultList.size(), lateMinute); + + if (ObjectUtil.equals(AttendanceUserTypeEnum.STUDENT_TO_DORM.getValue(), rule.getUserType())) { + //宿舍考勤 + msg = String.format("
%s
" + + "
%s
" + + "
%s等%S名学生超出截止归寝时间%s分钟未归寝,请及时联系并核实情况!
", + format, rule.getName(), studentNameList.stream().collect(Collectors.joining(",")), resultList.size(), lateMinute); + } + + textCard.setDescription(msg); + + textCard.setUrl(url); + textCardStaffNotice.setTextcard(textCard); + //发送微信通知 + wxUtil.pushStaffNotice(accessToken, textCardStaffNotice); + } + + @Override + public void sendAttendanceDayReportToStaff(Long staffId, List dtoList, AttendanceRule rule, + Integer userType, Boolean isLeader) { + EduStaff staff = commonService.getStaffById(staffId); + Dept dept = commonService.getDept(staff.getSchoolId()); + //发送企业微信通知 + if (dept.getSchoolType().contains("0")) { + EduApp app = commonService.getAppByCodeAndSchool(AppConstant.CONTACT_SELECT, null, + staff.getSchoolId()); + if (ObjectUtil.isNull(app)) { + log.info("学校【{}】未开通智慧校园应用,无法推送消息", staff.getSchoolId()); + return; + } + String accessToken = wxUtil.getAccessToken(app.getWxCorpId(), app.getWxSecret()); + String url = ""; + String title = ""; + String format = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy年MM月dd日")); + StringBuilder msg = new StringBuilder(String + .format("
%s
", + rule.getName())); + + if (ObjectUtil.equals(UserTypeEnum.PARENT_USER_TYPE.getType(), userType)) { + //学生日报 + url = String + .format( + "%s?corpId=%s&schoolId=%s&userType=%s&type=%s&startData=%s&endData=%s&timeName=%s&status=%s&staffId=%s&ruleId=%s&searchUserType=%s", + pageUrl + (isLeader ? STUDENT_DAY_REPORT_URL : PARENT_TEACHER_ATTENDANCE_DETAIL_URL), + app.getWxCorpId(), + staff.getSchoolId(), 0, userType, + LocalDateTimeUtil.format(LocalDateTime.now(), "yyyy" + + "-MM-dd"), LocalDateTimeUtil.format(LocalDateTime.now(), "yyyy" + + "-MM-dd"), LocalDateTimeUtil.format(LocalDateTime.now(), "yyyy" + + "-MM-dd"), 3, staff.getId(), rule.getId(), userType); + title = format + "学生考勤日报"; + for (DayReportDataDTO dayReportDataDTO : dtoList) { +// String scoreStr = ""; +// if (dayReportDataDTO.getTotalNum() == 0) { +// scoreStr = "0.00%"; +// } else { +// double score = +// (double) ((dayReportDataDTO.getTotalNum() - dayReportDataDTO.getAbNum()) * 100) / dayReportDataDTO +// .getTotalNum(); +// scoreStr = String.format("%.2f", score) + "%"; +// } + msg.append(String.format("
%s:总人数:%s 异常:%s
", dayReportDataDTO.getDeptName(), + dayReportDataDTO.getTotalNum(), dayReportDataDTO.getAbNum())); + } + } else { + //职工日报 + url = String + .format( + "%s?corpId=%s&schoolId=%s&userType=%s&type=%s&startData=%s&endData=%s&timeName=%s&status=%s&staffId=%s&ruleId=%s&searchUserType=%s", + pageUrl + STAFF_TEACHER_ATTENDANCE_DETAIL_URL, + app.getWxCorpId(), + staff.getSchoolId(), 0, userType, + LocalDateTimeUtil.format(LocalDateTime.now(), "yyyy" + + "-MM-dd"), LocalDateTimeUtil.format(LocalDateTime.now(), "yyyy" + + "-MM-dd"), LocalDateTimeUtil.format(LocalDateTime.now(), "yyyy" + + "-MM-dd"), 3, staff.getId(), rule.getId(), userType); + title = format + "职工考勤日报"; + Integer totalNum = 0; + Integer abNum = 0; + for (DayReportDataDTO dayReportDataDTO : dtoList) { + totalNum += dayReportDataDTO.getTotalNum(); + abNum += dayReportDataDTO.getAbNum(); + } + msg.append(String.format("
总人数: %s
正常人数: %s
", + totalNum, totalNum - abNum)); + } + + //文本卡片消息 + TextCardStaffNotice textCardStaffNotice = new TextCardStaffNotice(); + textCardStaffNotice.setTouser(staff.getWxId()); + TextCard textCard = new TextCard(); + textCardStaffNotice.setAgentid(app.getWxAgentId()); + textCard.setTitle(title); + textCard.setDescription(msg.toString()); + textCard.setUrl(url); + textCardStaffNotice.setTextcard(textCard); + //发送微信通知 + wxUtil.pushStaffNotice(accessToken, textCardStaffNotice); +// +// //模板卡片消息--文本通知型 +// TemplateCardNotice templateCardNotice = new TemplateCardNotice(); +// templateCardNotice.setCard_type(NoticeTypeConstant.TEMPLATE_NOTICE_TYPE_TEXT); +// String title = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy年MM月dd日")) + "考勤日报"; +// templateCardNotice.setMain_title(MainTitle.builder().title(title).build()); +// templateCardNotice.setSub_title_text(rule.getName()); +// +// List horizontalContentList = new ArrayList<>(); +// +// for (DayReportDataDTO dayReportDataDTO : dtoList) { +// HorizontalContent horizontalContent = new HorizontalContent(); +// horizontalContent.setValue(dayReportDataDTO.getDeptName()); +// horizontalContent.setKeyname(dayReportDataDTO.getTotalNum() + "/" + dayReportDataDTO.getAbNum()); +// horizontalContentList.add(horizontalContent); +// } +// templateCardNotice.setHorizontal_content_list(horizontalContentList); +// +// templateCardNotice.setCard_action(CardAction.builder().type(1).url(url).build()); +// templateCardNotice +// .setJump_list(Collections.singletonList(Jump.builder().type(1).title("查看详情").url(url).build())); +// TemplateCardStaffNotice templateCardStaffNotice = new TemplateCardStaffNotice(); +// templateCardStaffNotice.setTouser(staff.getWxId()); +// templateCardStaffNotice.setAgentid(app.getWxAgentId()); +// templateCardStaffNotice.setTemplate_card(templateCardNotice); +// //发送微信通知 +// wxUtil.pushStaffNotice(accessToken, templateCardStaffNotice); + } + } + + +} diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/utils/FormUtil.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/utils/FormUtil.java new file mode 100644 index 0000000..e013f72 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/utils/FormUtil.java @@ -0,0 +1,99 @@ +package com.yida.data.attendance.utils; + +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.util.UUID; + +// +// +public class FormUtil { + // +// +// /** +// * 上传form到图普 +// * +// * @throws Exception +// */ +// public void uploadPic(String url, String filePath, Persion persion) throws Exception { +// +// RestTemplate rest = new RestTemplate(); +// FileSystemResource resource = new FileSystemResource(new File(filePath)); +// MultiValueMap param = new LinkedMultiValueMap<>(); +// param.add("name", persion.getName()); +// param.add("type", persion.getType()); +// param.add("headPicFile", resource); //相当于MultipartFile的名称 +//// param.add("fileName", "test.jpg"); +// +// String string = rest.postForObject(url, param, String.class); +// System.out.println(string); +// +// //rest.postForObject(url, param, String.class)也可以用下面的方法替换 +//// HttpEntity> httpEntity = new HttpEntity>(param); +//// ResponseEntity responseEntity = rest.exchange(url, HttpMethod.POST, httpEntity, String.class); +//// System.out.println(responseEntity.getBody()); +// } +// +// /** +// * 下载io流图片 +// * +// * @param request +// * @return +// * @throws IOException +// */ +// +// public String savePicByIo(HttpServletRequest request) throws IOException { +// // 图片存储路径 +// String path = Thread.currentThread().getContextClassLoader().getResource("image").getPath(); +// // 判断是否有路径 +// if (!new File(path).exists()) { +// new File(path).mkdirs(); +// } +// ServletInputStream inputStream = request.getInputStream(); +// String fileName = UUID.randomUUID().toString().replace("-", "") + ".jpg"; +// File tempFile = new File(path, fileName); +// if (!tempFile.exists()) { +// OutputStream os = new FileOutputStream(tempFile); +// BufferedOutputStream bos = new BufferedOutputStream(os); +// byte[] buf = new byte[1024]; +// int length; +// length = inputStream.read(buf, 0, buf.length); +// while (length != -1) { +// bos.write(buf, 0, length); +// length = inputStream.read(buf); +// } +// bos.close(); +// os.close(); +// inputStream.close(); +// } +// return path; +// } +// +// /** +// * 下载form表单图片 +// * +// * @param file +// * @return +// * @throws IOException +// */ +// + public String savePicByFormData(MultipartFile file) throws IOException { + // 图片存储路径 + String path = Thread.currentThread().getContextClassLoader().getResource("image").getPath(); + // 判断是否有路径 + if (!new File(path).exists()) { + new File(path).mkdirs(); + } + String fileName = UUID.randomUUID().toString().replace("-", "") + ".jpg"; + File tempFile = new File(path, fileName); + if (!tempFile.exists()) { + tempFile.createNewFile(); + } + file.transferTo(tempFile); + return fileName; + + } +// +// +} \ No newline at end of file diff --git a/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/utils/MqttUtil.java b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/utils/MqttUtil.java new file mode 100644 index 0000000..129e7f1 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/java/com/yida/data/attendance/utils/MqttUtil.java @@ -0,0 +1,95 @@ +package com.yida.data.attendance.utils; + +import cn.hutool.core.util.StrUtil; +import com.yida.data.attendance.constant.MqttConstant; +import com.yida.data.attendance.service.impl.HaiqingCallbackService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttClient; +import org.eclipse.paho.client.mqttv3.MqttConnectOptions; +import org.eclipse.paho.client.mqttv3.MqttException; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence; +import org.springframework.context.annotation.Configuration; + +@Configuration +@Slf4j +public class MqttUtil { + + private static MqttClient mqttClient; + private static final String MQTT_CLIENT_ID = StrUtil.uuid(); + + public MqttUtil(HaiqingCallbackService haiqingCallbackService, MqttConstant mqttConstant) { + MemoryPersistence memoryPersistence = new MemoryPersistence(); + try { + mqttClient = new MqttClient(mqttConstant.getUrl(), MQTT_CLIENT_ID, + memoryPersistence); + // 设置回调函数,当订阅到信息时调用此方法 + mqttClient.setCallback(haiqingCallbackService); + // 向回调添加此客户端 + haiqingCallbackService.setMqttUtil(this); + MqttConnectOptions connOpts = new MqttConnectOptions(); + // 不自动清除session,每次连接会消费离线期间积累的消息 + // 设置是否清空session,这里如果设置为false表示服务器会保留客户端的连接记录,这里设置为true表示每次连接到服务器都以新的身份连接 + connOpts.setCleanSession(true); + // 设置自动重连 + connOpts.setAutomaticReconnect(true); + //connOpts.setConnectionTimeout(10); + // 设置会话心跳时间 单位为秒 服务器会每隔1.5*20秒的时间向客户端发送个消息判断客户端是否在线,但这个方法并没有重连的机制 + connOpts.setKeepAliveInterval(20); + connOpts.setUserName(mqttConstant.getUsername()); + connOpts.setPassword(mqttConstant.getPassword().toCharArray()); +// connOpts.setAutomaticReconnect(true); + mqttClient.connect(connOpts); + } catch (Exception e) { + log.error("创建客户端error:{}", e.getMessage()); + } + } + + + public Boolean publish(String msg, String topic) { + try { + mqttClient.publish(topic, new MqttMessage(msg.getBytes())); + } catch (Exception e) { + log.error("发送设备信息失败, msg: {}, topic: {}", msg, topic, e); + reconnect(); + return false; + } + return true; + } + + public Boolean addTopic(String topic) { + try { + mqttClient.subscribe(topic, 2); + } catch (Exception e) { + log.error("发送订阅msg失败:{}", e.getMessage()); + reconnect(); + return false; + } + return true; + } + + public Boolean addTopic(String[] topic) { + try { + // 保证一定只接受一次消息 + int[] qos = new int[topic.length]; + for (int i = 0; i < topic.length; i++) { + qos[i] = 2; + } + mqttClient.subscribe(topic, qos); + } catch (Exception e) { + log.error("发送订阅msg失败:{}", e.getMessage()); + reconnect(); + return false; + } + return true; + } + + private void reconnect() { + try { + mqttClient.reconnect(); + } catch (MqttException e) { + log.error("重新连接客户端失败", e); + } + } + +} diff --git a/febs-server/attendance/attendance-biz/src/main/resources/banner.txt b/febs-server/attendance/attendance-biz/src/main/resources/banner.txt new file mode 100644 index 0000000..af17941 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/resources/banner.txt @@ -0,0 +1,9 @@ + ████████ ██████ ████████ ████████ ███████ ██ ██ +░░░░░░██ ░█░░░░██ ░░░░░░██ ░██░░░░░ ░██░░░░██ ░██ ░██ + ██ ░█ ░██ ██ ░██ ░██ ░██░██ ░██ + ██ ░██████ ██ █████░███████ ░██ ░██░██ ░██ + ██ ░█░░░░ ██ ██ ░░░░░ ░██░░░░ ░██ ░██░██ ░██ + ██ ░█ ░██ ██ ░██ ░██ ██ ░██ ░██ + ████████░███████ ████████ ░████████░███████ ░░███████ +░░░░░░░░ ░░░░░░░ ░░░░░░░░ ░░░░░░░░ ░░░░░░░ ░░░░░░░ + ${spring.application.name} \ No newline at end of file diff --git a/febs-server/attendance/attendance-biz/src/main/resources/bootstrap.yml b/febs-server/attendance/attendance-biz/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..c777526 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/resources/bootstrap.yml @@ -0,0 +1,33 @@ +spring: + profiles: + active: "@env-name@" + # active: "dev" + application: + name: Edu-Attendance + cloud: + nacos: + config: + server-addr: ${nacos.url} + group: DEFAULT_GROUP + prefix: edu-attendance + file-extension: yaml + discovery: + server-addr: ${nacos.url} + +logging: + level: + org: + springframework: + boot: + actuate: + endpoint: + EndpointId: error + com: + alibaba: + cloud: + nacos: + client: + NacosPropertySourceBuilder: error +#mybatis-plus: +# configuration: +# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl \ No newline at end of file diff --git a/febs-server/attendance/attendance-biz/src/main/resources/mapper/AttendanceRecordMapper.xml b/febs-server/attendance/attendance-biz/src/main/resources/mapper/AttendanceRecordMapper.xml new file mode 100644 index 0000000..8312463 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/resources/mapper/AttendanceRecordMapper.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + diff --git a/febs-server/attendance/attendance-biz/src/main/resources/mapper/AttendanceResultMapper.xml b/febs-server/attendance/attendance-biz/src/main/resources/mapper/AttendanceResultMapper.xml new file mode 100644 index 0000000..cd3ed74 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/resources/mapper/AttendanceResultMapper.xml @@ -0,0 +1,316 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/febs-server/attendance/attendance-biz/src/main/resources/mapper/AttendanceRuleAddressMapper.xml b/febs-server/attendance/attendance-biz/src/main/resources/mapper/AttendanceRuleAddressMapper.xml new file mode 100644 index 0000000..ec6bde6 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/resources/mapper/AttendanceRuleAddressMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/febs-server/attendance/attendance-biz/src/main/resources/mapper/AttendanceRuleAdminMapper.xml b/febs-server/attendance/attendance-biz/src/main/resources/mapper/AttendanceRuleAdminMapper.xml new file mode 100644 index 0000000..646e73f --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/resources/mapper/AttendanceRuleAdminMapper.xml @@ -0,0 +1,32 @@ + + + + + + diff --git a/febs-server/attendance/attendance-biz/src/main/resources/mapper/AttendanceRuleDeviceMapper.xml b/febs-server/attendance/attendance-biz/src/main/resources/mapper/AttendanceRuleDeviceMapper.xml new file mode 100644 index 0000000..d92dde8 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/resources/mapper/AttendanceRuleDeviceMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/febs-server/attendance/attendance-biz/src/main/resources/mapper/AttendanceRuleMapper.xml b/febs-server/attendance/attendance-biz/src/main/resources/mapper/AttendanceRuleMapper.xml new file mode 100644 index 0000000..a7d3be2 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/resources/mapper/AttendanceRuleMapper.xml @@ -0,0 +1,390 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/febs-server/attendance/attendance-biz/src/main/resources/mapper/AttendanceRuleObjMapper.xml b/febs-server/attendance/attendance-biz/src/main/resources/mapper/AttendanceRuleObjMapper.xml new file mode 100644 index 0000000..29f64b6 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/resources/mapper/AttendanceRuleObjMapper.xml @@ -0,0 +1,16 @@ + + + + + + diff --git a/febs-server/attendance/attendance-biz/src/main/resources/mapper/AttendanceRuleRemindMapper.xml b/febs-server/attendance/attendance-biz/src/main/resources/mapper/AttendanceRuleRemindMapper.xml new file mode 100644 index 0000000..e858585 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/resources/mapper/AttendanceRuleRemindMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/febs-server/attendance/attendance-biz/src/main/resources/mapper/AttendanceRuleSpecialDateMapper.xml b/febs-server/attendance/attendance-biz/src/main/resources/mapper/AttendanceRuleSpecialDateMapper.xml new file mode 100644 index 0000000..c2f950e --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/resources/mapper/AttendanceRuleSpecialDateMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/febs-server/attendance/attendance-biz/src/main/resources/mapper/AttendanceRuleTimeMapper.xml b/febs-server/attendance/attendance-biz/src/main/resources/mapper/AttendanceRuleTimeMapper.xml new file mode 100644 index 0000000..3d69ca2 --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/resources/mapper/AttendanceRuleTimeMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/febs-server/attendance/attendance-biz/src/main/resources/mapper/AttendanceRuleWhiteListMapper.xml b/febs-server/attendance/attendance-biz/src/main/resources/mapper/AttendanceRuleWhiteListMapper.xml new file mode 100644 index 0000000..de406ee --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/resources/mapper/AttendanceRuleWhiteListMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/febs-server/attendance/attendance-biz/src/main/resources/mapper/AttendanceRuleWifiMapper.xml b/febs-server/attendance/attendance-biz/src/main/resources/mapper/AttendanceRuleWifiMapper.xml new file mode 100644 index 0000000..836402d --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/resources/mapper/AttendanceRuleWifiMapper.xml @@ -0,0 +1,11 @@ + + + + + + diff --git a/febs-server/attendance/attendance-biz/src/main/resources/mapper/EduAttendanceDeviceGroupMapper.xml b/febs-server/attendance/attendance-biz/src/main/resources/mapper/EduAttendanceDeviceGroupMapper.xml new file mode 100644 index 0000000..2dda78d --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/resources/mapper/EduAttendanceDeviceGroupMapper.xml @@ -0,0 +1,53 @@ + + + + + + + + + diff --git a/febs-server/attendance/attendance-biz/src/main/resources/mapper/EduAttendanceDeviceMapper.xml b/febs-server/attendance/attendance-biz/src/main/resources/mapper/EduAttendanceDeviceMapper.xml new file mode 100644 index 0000000..8a3b4ec --- /dev/null +++ b/febs-server/attendance/attendance-biz/src/main/resources/mapper/EduAttendanceDeviceMapper.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/febs-server/attendance/pom.xml b/febs-server/attendance/pom.xml new file mode 100644 index 0000000..c3611c9 --- /dev/null +++ b/febs-server/attendance/pom.xml @@ -0,0 +1,25 @@ + + + + febs-server + com.yida.data + 2.2-RELEASE + + 4.0.0 + + com.yida.data.attendance + attendance + pom + + attendance-api + attendance-biz + + + + 8 + 8 + + + \ No newline at end of file diff --git a/febs-server/edu-common/src/main/java/com/yida/data/common/excel/DefaultExportExcelClient.java b/febs-server/edu-common/src/main/java/com/yida/data/common/excel/DefaultExportExcelClient.java new file mode 100644 index 0000000..9e49545 --- /dev/null +++ b/febs-server/edu-common/src/main/java/com/yida/data/common/excel/DefaultExportExcelClient.java @@ -0,0 +1,154 @@ +package com.yida.data.common.excel; + +import cc.mrbird.febs.common.redis.service.RedisService; +import cn.hutool.core.lang.UUID; +import cn.hutool.json.JSONUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.support.ExcelTypeEnum; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.EasyExcelExportBaseDTO; +import com.yida.data.common.core.enums.FileDealStatusEnum; +import com.yida.data.common.core.file.IExportExcelClient; +import com.yida.data.common.core.file.common.export.ExportExcelData; +import com.yida.data.common.core.file.common.export.SelectExportData; +import com.yida.data.common.core.utils.FileUtil; +import com.yida.data.common.service.CommonService; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.springframework.util.StopWatch; + +import java.io.File; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * 导出excel工具类 + * + * @author ZYJ + * @date 2023/10/19 16:49 + */ +@Data +@Slf4j +@AllArgsConstructor +public abstract class DefaultExportExcelClient> + implements IExportExcelClient { + + /** + * 导出的service层 + */ + protected final BaseService baseService; + + protected final RedisService redisService; + protected final CommonService commonService; + protected final String exportCacheKey; + protected final String uploadUrl; + + public Class getClassR() { + Type sType = getClass().getGenericSuperclass(); + Type[] generics = ((ParameterizedType) sType).getActualTypeArguments(); + return (Class) (generics[1]); + } + + /** + * 查询excel 导出需要的数据 + * + * @param t 查询条件 + * @return java.util.List + * @author ZYJ + * @date 2023/12/12 16:54 + */ + public abstract List selectExportData(T t); + + /** + * 处理单条数据 + * + * @param o 需要处理的数据 + * @return R + * @author ZYJ + * @date 2023/12/13 13:58 + */ + public abstract R handleSingleData(O o); + + @Override + public void exportExcelData(T t) { + File file = null; + try { + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); + // 生成导出成功excel文件名 + String fileName = FileUtil.getLocalUploadAddress() + UUID.randomUUID() + ".xls"; + // 查询需要导出的文件信息 + List dataList = this.selectExportData(t); + + // 添加处理总数量 + redisService.hset(this.exportCacheKey, t.getKey(), ExportExcelData.builder() + .key(t.getKey()) + .exportStatus(FileDealStatusEnum.DEALING.getStatus()) + .total(dataList.size()) + .finish(0) + .build()); + + // 处理数据 + List list = new ArrayList<>(); + // 完成数量 + int finishNumber = 0; + for (O o : dataList) { + try { + R r = this.handleSingleData(o); + list.add(r); + } catch (Exception e) { + log.error("{}导出错误: {}", t.getFunctionName(), JSONUtil.toJsonStr(o)); + } finally { + finishNumber += 1; + redisService.hset(this.exportCacheKey, t.getKey(), ExportExcelData.builder() + .key(t.getKey()) + .exportStatus(FileDealStatusEnum.DEALING.getStatus()) + .total(dataList.size()) + .finish(finishNumber) + .build()); + } + } + // 导出数据 + file = new File(fileName); + EasyExcel.write(file, getClassR()) + .excelType(ExcelTypeEnum.XLS) + .sheet("数据导出") + .doWrite(list); + // 上传文件到媒资 + String fileUrl = FileUtil.uploadFileToMediaServer(uploadUrl, file); + // 处理完成 + ExportExcelData exportExcelData = ExportExcelData.builder() + .key(t.getKey()) + .exportStatus(FileDealStatusEnum.DEAL_SUCCESS.getStatus()) + .fileName(fileName) + .total(dataList.size()) + .finish(finishNumber) + .filePath(fileUrl) + .build(); + redisService.hset(this.exportCacheKey, t.getKey(), exportExcelData); + // 添加处理时间 + stopWatch.stop(); + log.info("{}数据总共耗时: {}", t.getFunctionName(), stopWatch.getTotalTimeSeconds() + "秒"); + } catch (Exception e) { + log.error("{}导出失败", t.getFunctionName(), e); + // 添加处理失败的结果 + redisService.hset(this.exportCacheKey, t.getKey(), ExportExcelData.builder() + .key(t.getKey()) + .exportStatus(FileDealStatusEnum.DEAL_FAIL.getStatus()) + .build()); + } finally { + if (Objects.nonNull(file)) { + cn.hutool.core.io.FileUtil.del(file); + } + } + } + + @Override + public Object selectExportInfo(String key) { + return redisService.hget(exportCacheKey, key); + } +} diff --git a/febs-server/edu-common/src/main/java/com/yida/data/common/excel/DefaultExportLargeClient.java b/febs-server/edu-common/src/main/java/com/yida/data/common/excel/DefaultExportLargeClient.java new file mode 100644 index 0000000..fa7dcf5 --- /dev/null +++ b/febs-server/edu-common/src/main/java/com/yida/data/common/excel/DefaultExportLargeClient.java @@ -0,0 +1,285 @@ +package com.yida.data.common.excel; + +import cc.mrbird.febs.common.redis.service.RedisService; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.support.ExcelTypeEnum; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.constant.CachePrefixConstant; +import com.yida.data.common.core.enums.FileDealStatusEnum; +import com.yida.data.common.core.file.IExportLargeClient; +import com.yida.data.common.core.file.common.DownloadFileChunk; +import com.yida.data.common.core.file.common.export.ExportLargeData; +import com.yida.data.common.core.file.common.export.SelectExportData; +import com.yida.data.common.core.exception.FebsException; +import com.yida.data.common.core.utils.file.ChunkUtil; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.StopWatch; + +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.file.Files; +import java.util.*; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +/** + * 导出大文件工具类 + * zip文件 + * + * @author ZYJ + * @date 2023/10/19 16:49 + */ +@Data +@Slf4j +@AllArgsConstructor +public abstract class DefaultExportLargeClient> + implements IExportLargeClient { + + /** + * 导出的service层 + */ + protected final BaseService baseService; + + protected final RedisService redisService; + protected final String exportCacheKey; + protected final String uploadUrl; + + /** + * 查询大文件导出需要的数据 + * + * @param t 查询条件 + * @return java.util.Map + * @author ZYJ + * @date 2023/10/20 16:09 + */ + public abstract Map selectExportData(T t); + + @Override + public void exportLargeData(T t) { + // 查询需要导出的文件信息 + Map map = this.selectExportData(t); + // zip文件 + File file = null; + // 错误信息文件 + File errorFile = null; + try { + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); + // 生成的文件名称 + String fileName = com.yida.data.common.core.utils.FileUtil.getLocalUploadAddress() + t.getKey() + ".zip"; + file = new File(fileName); + ZipOutputStream zos = new ZipOutputStream(Files.newOutputStream(file.toPath())); + // 添加处理总数量 + redisService.hset(this.exportCacheKey, t.getKey(), ExportLargeData.builder() + .key(t.getKey()) + .exportStatus(FileDealStatusEnum.DEALING.getStatus()) + .total(map.size()) + .finish(0) + .build()); + + // 完成数量 + int finishNumber = 0; + // 错误数量 + int errorNumber = 0; + // 是否完成流程 + boolean flag; + // 错误信息 + Map errorMap = new HashMap<>(); + + for (Map.Entry entry : map.entrySet()) { + flag = true; + String name = ""; + String fileUrl = ""; + try { + // 文件名称 + name = entry.getKey(); +// log.info("处理数据: {}", name); + // 文件地址 + fileUrl = entry.getValue(); + // 下载文件 + URL url = new URL(fileUrl); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + String message = connection.getHeaderField(0); + if (StringUtils.isNotEmpty(message)) { + if (message.startsWith("HTTP/1.1 404")) { + flag = false; + // 添加错误数据 + errorMap.put(name, fileUrl); + errorNumber += 1; + finishNumber += 1; + + redisService.hset(this.exportCacheKey, t.getKey(), ExportLargeData.builder() + .key(t.getKey()) + .exportStatus(FileDealStatusEnum.DEALING.getStatus()) + .total(map.size()) + .finish(finishNumber) + .error(errorNumber) + .build()); + continue; + } + zos.putNextEntry(new ZipEntry(name + ".jpg")); + InputStream fis = connection.getInputStream(); + byte[] buffer = new byte[1024]; + int r = 0; + while ((r = fis.read(buffer)) != -1) { + zos.write(buffer, 0, r); + } + fis.close(); + } + } catch (Exception e) { + flag = false; + // 添加错误数据 + if (StrUtil.isNotBlank(name) && StrUtil.isNotBlank(fileUrl)) { + errorMap.put(name, fileUrl); + } + errorNumber += 1; + finishNumber += 1; + + redisService.hset(this.exportCacheKey, t.getKey(), ExportLargeData.builder() + .key(t.getKey()) + .exportStatus(FileDealStatusEnum.DEALING.getStatus()) + .total(map.size()) + .finish(finishNumber) + .error(errorNumber) + .build()); + } finally { + if (flag) { + finishNumber += 1; + redisService.hset(this.exportCacheKey, t.getKey(), ExportLargeData.builder() + .key(t.getKey()) + .exportStatus(FileDealStatusEnum.DEALING.getStatus()) + .total(map.size()) + .finish(finishNumber) + .error(errorNumber) + .build()); + } + } + } + zos.flush(); + zos.close(); + stopWatch.stop(); + // 处理错误数据 + String errorFileUrl = ""; + if (CollUtil.isNotEmpty(errorMap)) { + // 表头list的生成,实际的表头信息可以从数据库或者缓存等处动态读取 + List> allColList = new ArrayList<>(); + // 姓名表头 + allColList.add(CollUtil.newArrayList("名称")); + // 校区表头 + allColList.add(CollUtil.newArrayList("地址")); + // 处理错误数据 + List> exportErrorDataList = new ArrayList<>(); + errorMap.forEach((k, v) -> exportErrorDataList.add(CollUtil.newArrayList(k, v))); + + String errorFileName = com.yida.data.common.core.utils.FileUtil.getLocalUploadAddress() + t.getKey() + ".xls"; + errorFile = new File(errorFileName); + // 导出错误数据 + EasyExcel.write(errorFile) + .excelType(ExcelTypeEnum.XLS) + // 这里放入动态头 + .head(allColList).sheet("错误信息") + // 当然这里数据也可以用 List> 去传入 + .doWrite(exportErrorDataList); + // 上传文件到媒资 + errorFileUrl = com.yida.data.common.core.utils.FileUtil.uploadFileToMediaServer(uploadUrl, errorFile); + } + // 处理完成 + ExportLargeData exportLargeData = ExportLargeData.builder() + .key(t.getKey()) + .exportStatus(FileDealStatusEnum.DEAL_SUCCESS.getStatus()) + .fileName(fileName) + .fileSize(new File(fileName).length()) + .total(map.size()) + .finish(finishNumber) + .error(errorNumber) + .build(); + if (StrUtil.isNotBlank(errorFileUrl)) { + exportLargeData.setErrorFilePath(errorFileUrl); + } + redisService.hset(this.exportCacheKey, t.getKey(), exportLargeData); + log.info("导出照片数据总共耗时: {}", stopWatch.getTotalTimeSeconds() + "秒"); + } catch (Exception e) { + log.error("导出大文件失败", e); + // 添加处理失败的结果 + redisService.hset(this.exportCacheKey, t.getKey(), ExportLargeData.builder() + .key(t.getKey()) + .exportStatus(FileDealStatusEnum.DEAL_FAIL.getStatus()) + .build()); + // 删除本地zip文件 + if (Objects.nonNull(file)) { + FileUtil.del(file); + } + } finally { + // 删除本地错误信息文件 + if (Objects.nonNull(errorFile)) { + FileUtil.del(errorFile); + } + } + } + + @Override + public Object selectExportInfo(String key) { + return redisService.hget(exportCacheKey, key); + } + + @Override + public void downLoadChunk(DownloadFileChunk dto, HttpServletResponse response) { + // 生成的文件信息 + File resultFile = null; + Integer index = null; + Integer chunkTotal = null; + + try { + // 获取缓存信息 + ExportLargeData exportLargeData = (ExportLargeData) redisService.hget(this.exportCacheKey, dto.getKey()); + String fileName = exportLargeData.getFileName(); + + String[] splits = fileName.split("\\."); + String type = splits[splits.length - 1]; + String resultFileName = com.yida.data.common.core.utils.FileUtil.getLocalUploadAddress() + dto.getKey() + "." + type; + // 生成的分片文件 + resultFile = new File(resultFileName); + + // 分片信息 + Integer chunkSize = dto.getChunkSize(); + index = dto.getIndex(); + chunkTotal = dto.getChunkTotal(); + + long offset = (long) chunkSize * (index - 1); + if (Objects.equals(index, chunkTotal)) { + offset = resultFile.length() - chunkSize; + } + byte[] chunk = ChunkUtil.getChunk(index, chunkSize, resultFileName, offset); + + log.info("下载文件分片" + resultFileName + "," + index + "," + chunkSize + "," + chunk.length + "," + offset); +// response.addHeader("Access-Control-Allow-Origin","Content-Disposition"); + response.addHeader("Content-Disposition", "attachment;filename=" + fileName); + response.addHeader("Content-Length", String.valueOf(chunk.length)); +// response.setHeader("filename", fileName); + response.setContentType("application/octet-stream"); + + ServletOutputStream out = response.getOutputStream(); + out.write(chunk); + out.flush(); + out.close(); + } catch (Exception e) { + log.error("下载分片失败", e); + throw new FebsException("下载分片失败"); + } finally { + if (Objects.nonNull(resultFile) && Objects.nonNull(index) + && Objects.nonNull(chunkTotal) && index.equals(chunkTotal)) { + FileUtil.del(resultFile); + } + } + } +} diff --git a/febs-server/edu-common/src/main/java/com/yida/data/common/service/CommonService.java b/febs-server/edu-common/src/main/java/com/yida/data/common/service/CommonService.java index 8ac3696..f818726 100644 --- a/febs-server/edu-common/src/main/java/com/yida/data/common/service/CommonService.java +++ b/febs-server/edu-common/src/main/java/com/yida/data/common/service/CommonService.java @@ -1,43 +1,132 @@ package com.yida.data.common.service; +import static com.yida.data.common.core.entity.constant.CachePrefixConstant.STAFF_DATA; + import cc.mrbird.febs.common.redis.service.RedisService; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.net.URLEncoder; +import cn.hutool.core.util.CharsetUtil; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import com.yida.data.common.core.entity.CurrentUser; +import com.yida.data.common.core.entity.Dict; +import com.yida.data.common.core.entity.constant.AppConstant; import com.yida.data.common.core.entity.constant.CachePrefixConstant; +import com.yida.data.common.core.entity.constant.QywxServiceProviderConstant; +import com.yida.data.common.core.entity.constant.UPayConstant; +import com.yida.data.common.core.entity.consume.DeptConsumeTerminalCache; +import com.yida.data.common.core.entity.consume.EduConsumeConfig; +import com.yida.data.common.core.entity.school.EduDeptHomeApp; import com.yida.data.common.core.entity.school.EduYidaAppAccount; -import com.yida.data.common.core.entity.system.*; +import com.yida.data.common.core.entity.system.BaiduApiConfig; +import com.yida.data.common.core.entity.system.ConstructionPayConfig; +import com.yida.data.common.core.entity.system.Dept; +import com.yida.data.common.core.entity.system.EduApp; +import com.yida.data.common.core.entity.system.EduAppTemplate; +import com.yida.data.common.core.entity.system.EduArea; +import com.yida.data.common.core.entity.system.EduDeptFunction; +import com.yida.data.common.core.entity.system.EduDeptPayType; +import com.yida.data.common.core.entity.system.EduDeptWxPublic; +import com.yida.data.common.core.entity.system.EduHoliday; +import com.yida.data.common.core.entity.system.EduPayWxConfig; +import com.yida.data.common.core.entity.system.EduQywxServiceProvider; +import com.yida.data.common.core.entity.system.EduQywxServiceProviderSchool; +import com.yida.data.common.core.entity.system.EduYidaApp; +import com.yida.data.common.core.entity.system.UPayConfig; +import com.yida.data.common.core.entity.system.UnionPayConfig; +import com.yida.data.common.core.entity.system.WhiteList; +import com.yida.data.common.core.entity.system.enums.RoleEnum; +import com.yida.data.common.core.entity.system.enums.SysFunctionEnum; +import com.yida.data.common.core.entity.user.EduStaff; +import com.yida.data.common.core.entity.user.EduStudent; import com.yida.data.common.core.entity.user.EduUserDept; import com.yida.data.common.core.entity.user.enums.UserDeptTypeEnum; +import com.yida.data.common.core.enums.BaiDuModuleEnum; +import com.yida.data.common.core.enums.school.DeptAppTypeEnum; +import com.yida.data.common.core.utils.FebsUtil; import com.yida.data.common.core.utils.NumberUtil; import com.yida.data.common.core.utils.RedisUtil; -import com.yida.data.system.feign.*; +import com.yida.data.common.core.utils.UPayUtil; +import com.yida.data.common.core.utils.WxServiceProviderUtil; +import com.yida.data.common.core.utils.WxUtil; +import com.yida.data.school.feign.index.RemoteDeptHomeIndexService; +import com.yida.data.system.feign.RemoteAppService; +import com.yida.data.system.feign.RemoteBaiDuApiConfigService; +import com.yida.data.system.feign.RemoteCommonService; +import com.yida.data.system.feign.RemoteConstructionPayConfigService; +import com.yida.data.system.feign.RemoteConsumeConfigService; +import com.yida.data.system.feign.RemoteDeptFunctionService; +import com.yida.data.system.feign.RemoteDeptService; +import com.yida.data.system.feign.RemoteDictService; +import com.yida.data.system.feign.RemoteHolidayService; +import com.yida.data.system.feign.RemotePayTypeService; +import com.yida.data.system.feign.RemotePayWxConfigService; +import com.yida.data.system.feign.RemoteQywxService; +import com.yida.data.system.feign.RemoteUPayConfigService; +import com.yida.data.system.feign.RemoteUnionPayConfigService; +import com.yida.data.system.feign.RemoteWhiteListService; +import com.yida.data.system.feign.RemoteYidaAppAccountService; +import com.yida.data.system.feign.RemoteYidaAppService; +import com.yida.data.user.feign.RemoteStaffService; +import com.yida.data.user.feign.RemoteStudentService; import com.yida.data.user.feign.RemoteUserDeptService; +import com.yida.data.user.vo.TeacherDeptVO; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; -import java.time.LocalDate; -import java.util.List; -import java.util.Objects; - @Slf4j @Service @RequiredArgsConstructor public class CommonService { - private final RemoteDeptService remoteDeptService; private final RemoteAppService remoteAppService; - private final RemoteYidaAppService remoteYidaAppService; - private final RemoteYidaAppAccountService remoteYidaAppAccountService; - private final RemotePayWxConfigService remotePayWxConfigService; - private final RemoteHolidayService remoteHolidayService; + private final RemoteQywxService remoteQywxService; + private final RemoteDeptService remoteDeptService; + private final RemoteDictService remoteDictService; private final RemoteCommonService remoteCommonService; - private final RemoteUserDeptService remoteUserDeptService; + private final RemoteYidaAppService remoteYidaAppService; + private final RemoteHolidayService remoteHolidayService; private final RemotePayTypeService remotePayTypeService; + private final RemoteUserDeptService remoteUserDeptService; + private final RemoteWhiteListService remoteWhiteListService; + private final RemoteUPayConfigService remoteUPayConfigService; + private final RemotePayWxConfigService remotePayWxConfigService; + private final RemoteDeptFunctionService remoteDeptFunctionService; + private final RemoteConsumeConfigService remoteConsumeConfigService; private final RemoteUnionPayConfigService remoteUnionPayConfigService; + private final RemoteYidaAppAccountService remoteYidaAppAccountService; + private final RemoteBaiDuApiConfigService remoteBaiDuApiConfigService; + private final RemoteConstructionPayConfigService remoteConstructionPayConfigService; + private final RemoteStaffService remoteStaffService; + private final RemoteStudentService remoteStudentService; + private final RemoteDeptHomeIndexService remoteDeptHomeIndexService; + + + private final WxUtil wxUtil; + private final WxServiceProviderUtil wxServiceProviderUtil; private final RedisService redisService; + public List selectDict(String type) { + if (ObjectUtil.isNull(type)) { + return null; + } + return remoteDictService.selectDict(type).getData(); + } + + public Dict getDictByTypeAndValueOrLabel(String type, String value, String label) { + if (ObjectUtil.isNull(type)) { + return null; + } + return remoteDictService.getDictByTypeAndValueOrLabel(type, value, label).getData(); + } + public Dept getDept(Long deptId) { if (deptId == null) { return null; @@ -211,7 +300,7 @@ public class CommonService { redisService.llSet(CachePrefixConstant.HOLIDAY, data); for (EduHoliday holiday : data) { // 节假日 - if (target.equals(holiday)) { + if (target.equals(holiday.getDate())) { return false; } } @@ -220,7 +309,7 @@ public class CommonService { for (Object o : objects) { // 节假日 EduHoliday holiday = (EduHoliday) o; - if (target.equals(holiday)) { + if (target.equals(holiday.getDate())) { return false; } } @@ -228,6 +317,38 @@ public class CommonService { return true; } + + /** + * 时间段内 节假日集合 + */ + public List inHolidayDateList(LocalDate startDate, LocalDate endDate) { + List inHolidayList = new ArrayList<>(); + List objects = redisService.lGet(CachePrefixConstant.HOLIDAY, 0L, -1L); + if (CollUtil.isEmpty(objects)) { + List data = remoteHolidayService.listAllHoliday().getData(); + if (CollUtil.isNotEmpty(data)) { + redisService.llSet(CachePrefixConstant.HOLIDAY, data); + for (EduHoliday holiday : data) { + // 节假日 + LocalDate date = holiday.getDate(); + if ((date.isAfter(startDate) && date.isBefore(endDate)) || date.equals(startDate) || date.equals(endDate)) { + inHolidayList.add(date); + } + } + } + } else { + for (Object o : objects) { + // 节假日 + EduHoliday holiday = (EduHoliday) o; + LocalDate date = holiday.getDate(); + if ((date.isAfter(startDate) && date.isBefore(endDate)) || date.equals(startDate) || date.equals(endDate)) { + inHolidayList.add(date); + } + } + } + return inHolidayList; + } + /** * 查询当天的上一个工作日 */ @@ -306,6 +427,83 @@ public class CommonService { return config; } + /** + * 根据部门查询建行支付配置 + * + * @param deptId 部门id + * @return com.yida.data.common.core.entity.system.ConstructionPayConfig + * @author ZYJ + * @date 2023/6/19 16:50 + */ + public ConstructionPayConfig getConstructionPayConfigByDept(Long deptId) { + ConstructionPayConfig config = redisService.hasKey(CachePrefixConstant.CONSTRUCTION_PAY_CONFIG) + ? (ConstructionPayConfig) redisService.hget(CachePrefixConstant.CONSTRUCTION_PAY_CONFIG, deptId.toString()) + : null; + if (config == null) { + config = remoteConstructionPayConfigService.getConstructionPayConfigByDept(deptId).getData(); + redisService.hset(CachePrefixConstant.CONSTRUCTION_PAY_CONFIG, deptId.toString(), config); + } + return config; + } + + /** + * 根据部门查询收钱吧支付配置 + * + * @param deptId 部门id + * @return com.yida.data.common.core.entity.system.UPayConfig + * @author ZYJ + * @date 2023/3/21 10:42 + */ + public UPayConfig getUPayConfigByDept(Long deptId) { + UPayConfig config = redisService.hasKey(CachePrefixConstant.U_PAY_CONFIG) + ? (UPayConfig) redisService.hget(CachePrefixConstant.U_PAY_CONFIG, deptId.toString()) + : null; + if (config == null) { + config = remoteUPayConfigService.getUPayConfigByDept(deptId).getData(); + redisService.hset(CachePrefixConstant.U_PAY_CONFIG, deptId.toString(), config); + } + return config; + } + + /** + * 获取学校消费机服务器信息 + * + * @param deptId 部门id + * @return com.yida.data.common.core.entity.consume.EduConsumeConfig + * @author ZYJ + * @date 2023/4/6 17:46 + */ + public EduConsumeConfig getConsumeConfigByDept(Long deptId) { + EduConsumeConfig config = redisService.hasKey(CachePrefixConstant.CONSUME_CONFIG) + ? (EduConsumeConfig) redisService.hget(CachePrefixConstant.CONSUME_CONFIG, deptId.toString()) + : null; + if (config == null) { + config = remoteConsumeConfigService.getConsumeConfigByDept(deptId).getData(); + redisService.hset(CachePrefixConstant.CONSUME_CONFIG, deptId.toString(), config); + } + return config; + } + + /** + * 获取学校收钱吧终端信息 + * + * @param deptId 学校id + * @return com.yida.data.common.core.entity.consume.DeptConsumeTerminalCache + * @author ZYJ + * @date 2023/4/3 14:47 + */ + public DeptConsumeTerminalCache getDeptConsumeTerminal(Long deptId) { + DeptConsumeTerminalCache cache = redisService.hasKey(CachePrefixConstant.DEPT_CONSUME_TERMINAL + deptId.toString()) + ? (DeptConsumeTerminalCache) redisService.get(CachePrefixConstant.DEPT_CONSUME_TERMINAL + deptId.toString()) + : null; + if (cache == null) { + cache = UPayUtil.active(getUPayConfigByDept(deptId), UPayConstant.ACTIVE_DEVICE_NAME); + cache.setDeptId(deptId); + redisService.set(CachePrefixConstant.DEPT_CONSUME_TERMINAL + deptId.toString(), cache); + } + return cache; + } + /** * 向下查询指定家校部门类型的家校部门id(可查询非直接子家校部门) 未毕业家校部门 * @@ -331,14 +529,360 @@ public class CommonService { return remoteUserDeptService.findChildIdByParentAndTypeNoPermission(deptId, type).getData(); } + /** + * 获取服务商信息 + * + * @param serviceCorpId 服务商企业微信corpId + * @return com.yida.data.common.core.entity.system.EduQywxServiceProvider + * @author ZYJ + * @date 2022/12/1 10:46 + */ + public EduQywxServiceProvider getServiceProvider(String serviceCorpId) { + EduQywxServiceProvider serviceProvider = redisService.hasKey(CachePrefixConstant.SYS_SERVICE_PROVIDER) + ? (EduQywxServiceProvider) redisService.hget(CachePrefixConstant.SYS_SERVICE_PROVIDER, serviceCorpId) + : null; + if (Objects.isNull(serviceProvider)) { + serviceProvider = remoteAppService.getServiceProviderByServiceCorpId(serviceCorpId).getData(); + if (Objects.nonNull(serviceProvider)) { + redisService.hset(CachePrefixConstant.SYS_SERVICE_PROVIDER, serviceCorpId, serviceProvider); + } + } + return serviceProvider; + } /** - * 工具学校名称查找机构信息 + * 获取对应服务商模板信息 * - * @param schoolName - * @return + * @param templateId 模板id + * @param serviceCorpId 服务商corpId + * @return com.yida.data.common.core.entity.system.EduAppTemplate + * @author ZYJ + * @date 2022/12/1 9:27 + */ + public EduAppTemplate getAppTemplateByTemplateId(String templateId, String serviceCorpId) { + EduAppTemplate eduAppTemplate = redisService.hasKey(CachePrefixConstant.SYS_APP_TEMPLATE) + ? (EduAppTemplate) redisService.hget(CachePrefixConstant.SYS_APP_TEMPLATE, serviceCorpId + "." + templateId) + : null; + if (Objects.isNull(eduAppTemplate)) { + eduAppTemplate = remoteAppService.getAppTemplateByTemplateId(templateId, serviceCorpId).getData(); + if (Objects.nonNull(eduAppTemplate)) { + redisService.hset(CachePrefixConstant.SYS_APP_TEMPLATE, serviceCorpId + "." + templateId, eduAppTemplate); + } + } + return eduAppTemplate; + } + + /** + * 根据学校对应的通讯录应用类型获取不同的access_token 创建、编辑、删除、获取部门ID列表、获取成员ID列表时使用 + * + * @param schoolId 学校id + * @return java.lang.String + * @author ZYJ + * @date 2022/12/1 9:46 + */ + public String getAddressListToken(Long schoolId) { + String accessToken; + // 获取学校通讯录应用 + EduApp app = getAppByCodeAndSchool(AppConstant.CONTACT, null, schoolId); + + if (Objects.isNull(app.getTemplateId())) { + // 自建应用 + accessToken = wxUtil.getAccessToken(app.getWxCorpId(), app.getWxSecret()); + } else { + // 服务商代开发应用 + // 获取对应模板信息 + EduAppTemplate appTemplate = getAppTemplateByTemplateId(app.getTemplateId(), app.getServiceCorpId()); + // 获取第三方应用凭证 + String suiteAccessToken = wxServiceProviderUtil.getSuiteAccessToken(appTemplate.getTemplateId(), + appTemplate.getTemplateSecret(), + String.valueOf(redisService.get(QywxServiceProviderConstant.SERVICE_SUITE_TICKET + appTemplate.getTemplateId()))); + // 获取企业微信信息缓存 +// EduQywxServiceProviderSchool providerSchool = (EduQywxServiceProviderSchool) redisService +// .hget(QywxServiceProviderConstant.PROVIDER_SCHOOL_CORP_ORIGINAL_DATA, +// app.getServiceCorpId() + "." + app.getWxCorpId()); + EduQywxServiceProviderSchool providerSchool = getCorpByOriginalData(app.getServiceCorpId(), app.getWxCorpId()); + accessToken = wxServiceProviderUtil + .getCorpToken(providerSchool.getDeptEncryptionCorpId(), app.getWxSecret(), suiteAccessToken); + } + return accessToken; + } + + /** + * 服务商对应学校加密corpId数据(原始值为key) + * + * @param providerCorpId 服务商corpId + * @param deptOriginalCorpId 部门原始corpId + * @return com.yida.data.common.core.common.ResultBean + * @author ZYJ + * @date 2023/9/25 17:48 + */ + public EduQywxServiceProviderSchool getCorpByOriginalData(String providerCorpId, String deptOriginalCorpId) { + EduQywxServiceProviderSchool providerSchool = + redisService.hasKey(QywxServiceProviderConstant.PROVIDER_SCHOOL_CORP_ORIGINAL_DATA) + ? (EduQywxServiceProviderSchool) redisService.hget(QywxServiceProviderConstant.PROVIDER_SCHOOL_CORP_ORIGINAL_DATA, + providerCorpId + "." + deptOriginalCorpId) + : null; + if (providerSchool == null) { + providerSchool = remoteQywxService.getCorpByOriginalData(providerCorpId, deptOriginalCorpId).getData(); + redisService + .hset(QywxServiceProviderConstant.PROVIDER_SCHOOL_CORP_ORIGINAL_DATA, providerCorpId + "." + deptOriginalCorpId, + providerSchool); + } + return providerSchool; + } + + /** + * 服务商对应学校加密corpId数据(加密值为key) + * + * @param providerCorpId 服务商corpId + * @param deptEncryptionCorpId 部门加密corpId + * @return com.yida.data.common.core.common.ResultBean + * @author ZYJ + * @date 2023/9/25 17:48 + */ + public EduQywxServiceProviderSchool getCorpByEncryptionData(String providerCorpId, String deptEncryptionCorpId) { + EduQywxServiceProviderSchool providerSchool = redisService.hasKey(QywxServiceProviderConstant.PROVIDER_SCHOOL_CORP_DATA) + ? (EduQywxServiceProviderSchool) redisService.hget(QywxServiceProviderConstant.PROVIDER_SCHOOL_CORP_DATA, + providerCorpId + "." + deptEncryptionCorpId) + : null; + if (providerSchool == null) { + providerSchool = remoteQywxService.getCorpByEncryptionData(providerCorpId, deptEncryptionCorpId).getData(); + redisService.hset(QywxServiceProviderConstant.PROVIDER_SCHOOL_CORP_DATA, providerCorpId + "." + deptEncryptionCorpId, + providerSchool); + } + return providerSchool; + } + + /** + * 获取企业凭证 + * + * @param app 通讯录应用信息 + * @return java.lang.String + * @author ZYJ + * @date 2022/12/1 11:24 + */ + public String getCorpToken(EduApp app) { + // 获取对应模板信息 + EduAppTemplate appTemplate = getAppTemplateByTemplateId(app.getTemplateId(), app.getServiceCorpId()); + // 获取第三方应用凭证 + String suiteAccessToken = wxServiceProviderUtil.getSuiteAccessToken(appTemplate.getTemplateId(), + appTemplate.getTemplateSecret(), + String.valueOf(redisService.get(QywxServiceProviderConstant.SERVICE_SUITE_TICKET + appTemplate.getTemplateId()))); + // 获取企业微信信息缓存 +// EduQywxServiceProviderSchool providerSchool = (EduQywxServiceProviderSchool) redisService +// .hget(QywxServiceProviderConstant.PROVIDER_SCHOOL_CORP_ORIGINAL_DATA, +// app.getServiceCorpId() + "." + app.getWxCorpId()); + EduQywxServiceProviderSchool providerSchool = getCorpByOriginalData(app.getServiceCorpId(), app.getWxCorpId()); + return wxServiceProviderUtil.getCorpToken(providerSchool.getDeptEncryptionCorpId(), app.getWxSecret(), suiteAccessToken); + } + + /** + * 设置职工授权url + * + * @param corpId 企业的CorpID + * @param redirectUrl 授权后重定向的回调链接地址,请使用urlencode对链接进行处理 + * @param agentId 应用agentid,snsapi_privateinfo时必填 + * @return java.lang.String + * @author ZYJ + * @date 2022/11/25 15:11 + */ + public String setAuthUrl(String corpId, String redirectUrl, String agentId) { + return "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + corpId + + "&redirect_uri=" + URLEncoder.createDefault().encode(redirectUrl, CharsetUtil.CHARSET_UTF_8) + + "&response_type=code&scope=snsapi_privateinfo&state=STATE" + + "&agentid=" + agentId + "#wechat_redirect"; + } + + /** + * 根据通讯录应用情况获取对应用户明文id 如果不是通讯录模板授权则返回本身userId + * + * @param userId 企业微信userId + * @param schoolId 学校id + * @param eduApp 通讯录app + * @return java.lang.String + * @author ZYJ + * @date 2023/2/2 10:41 + */ + public String getPlainUserId(String userId, Long schoolId, EduApp eduApp) { + // 获取学校通讯录应用 + EduApp app = getAppByCodeAndSchool(AppConstant.CONTACT, null, schoolId); + + // 本身就是明文id + if (Objects.isNull(app.getTemplateId())) { + return userId; + } else { + // 企业自建应用或基础应用的调用接口凭证 + EduApp appContactSchool = getAppByCodeAndSchool(AppConstant.CONTACT_SCHOOL, null, schoolId); + String accessToken = wxUtil.getAccessToken(appContactSchool.getWxCorpId(), appContactSchool.getWxSecret()); + // 密文转换成明文id + return wxServiceProviderUtil.convertUserIdToPlain(accessToken, userId, eduApp.getWxAgentId()); + } + } + + /** + * 根据通讯录应用情况获取对应用户密文id 如果不是通讯录模板授权则返回本身userId + * + * @param userId 企业微信userId + * @param schoolId 学校id + * @return java.lang.String + * @author ZYJ + * @date 2023/2/2 14:45 + */ + public String getSecretUserId(String userId, Long schoolId) { + // 获取学校通讯录应用 + EduApp app = getAppByCodeAndSchool(AppConstant.CONTACT, null, schoolId); + + // 本身就是明文id + if (Objects.isNull(app.getTemplateId())) { + return userId; + } else { + EduApp eduApp = getAppByCodeAndSchool(AppConstant.CONTACT_SELECT, null, schoolId); + // 明文转换成密文id + return wxServiceProviderUtil.convertUserIdToSecret( + wxUtil.getAccessToken(eduApp.getWxCorpId(), eduApp.getWxSecret()), userId); + } + } + + /** + * 查询学校用于查询的通讯录应用 + * + * @param schoolId 学校id + * @return com.yida.data.common.core.entity.system.EduApp + * @author ZYJ + * @date 2023/4/23 20:25 + */ + public EduApp getAppContactUsedBySelect(Long schoolId) { + // 获取学校通讯录应用 + EduApp app = getAppByCodeAndSchool(AppConstant.CONTACT, null, schoolId); + // 本身就是明文id + if (Objects.isNull(app.getTemplateId())) { + return app; + } else { + return getAppByCodeAndSchool(AppConstant.CONTACT_SELECT, null, schoolId); + } + } + + /** + * 根据学校名称查找机构信息 + * + * @param schoolName 学校名称 + * @return com.yida.data.common.core.entity.system.Dept + * @author ZYJ + * @date 2023/2/2 11:03 */ public Dept getSchoolByName(String schoolName) { return remoteDeptService.getSchoolByName(schoolName).getData(); } + + /** + * 获取系统白名单信息 + * + * @param functionName 功能名称 {@link SysFunctionEnum} + * @return com.yida.data.common.core.entity.system.WhiteList + * @author ZYJ + * @date 2023/2/20 18:00 + */ + public WhiteList getWhiteList(String functionName) { + WhiteList whiteList = redisService.hasKey(CachePrefixConstant.SYS_WHITE_LIST) + ? (WhiteList) redisService.hget(CachePrefixConstant.SYS_WHITE_LIST, functionName) + : null; + if (whiteList == null) { + whiteList = remoteWhiteListService.getWhiteList(functionName).getData(); + redisService.hset(CachePrefixConstant.SYS_WHITE_LIST, functionName, whiteList); + } + return whiteList; + } + + /** + * 获取部门是否开通当前功能 + * + * @param functionName 功能名称 + * @param schoolId 部门id + * @return com.yida.data.common.core.entity.system.EduDeptFunction + * @author ZYJ + * @date 2023/2/21 16:08 + */ + public EduDeptFunction getDeptFunction(String functionName, Long schoolId) { + EduDeptFunction eduDeptFunction = redisService.hasKey(CachePrefixConstant.SYS_DEPT_FUNCTION + schoolId) + ? (EduDeptFunction) redisService.hget(CachePrefixConstant.SYS_DEPT_FUNCTION + schoolId, functionName) + : null; + if (eduDeptFunction == null) { + eduDeptFunction = remoteDeptFunctionService.getDeptFunction(functionName, schoolId).getData(); + redisService.hset(CachePrefixConstant.SYS_DEPT_FUNCTION + schoolId, functionName, eduDeptFunction); + } + return eduDeptFunction; + } + + /** + * 根据学校id查询百度api配置 + * + * @param deptId 学校id + * @param moduleName 百度模块名称 {@link BaiDuModuleEnum} + * @return com.yida.data.common.core.entity.system.BaiduApiConfig + * @author ZYJ + * @date 2023/6/20 20:57 + */ + public BaiduApiConfig getBaiDuApiConfigByDept(Long deptId, String moduleName) { + BaiduApiConfig config = redisService.hasKey(CachePrefixConstant.BAI_DU_API_CONFIG + deptId) + ? (BaiduApiConfig) redisService.hget(CachePrefixConstant.BAI_DU_API_CONFIG + deptId, moduleName) + : null; + if (config == null) { + config = remoteBaiDuApiConfigService.getBaiDuApiConfigByDept(deptId, moduleName).getData(); + redisService.hset(CachePrefixConstant.BAI_DU_API_CONFIG + deptId.toString(), moduleName, config); + } + return config; + } + + public EduStaff getStaffById(Long staffId) { + EduStaff staff = (EduStaff) redisService.hget(STAFF_DATA, staffId.toString()); + if (ObjectUtil.isNull(staff)) { + staff = remoteStaffService.getStaff(staffId).getData(); + if (ObjectUtil.isNotNull(staff)) { + redisService.hset(STAFF_DATA, staffId.toString(), staff); + } + } + return staff; + } + + public EduStudent getStudentById(Long id) { + EduStudent student = (EduStudent) redisService + .hget(CachePrefixConstant.STUDENT_DATA, id.toString()); + if (ObjectUtil.isNull(student)) { + student = remoteStudentService.getStudentNoPermission(id).getData(); + if (student == null) { + log.error("学生不存在,id:[{}]", id); + return null; + } else { + redisService.hset(CachePrefixConstant.STUDENT_DATA, id.toString(), student); + } + } + return student; + } + + + /** + * 清除 人员匹配考勤规则 + */ + public void clearAttendanceRuleData() { + redisService.del(CachePrefixConstant.ATTENDANCE_STUDENT_RULE); + } + + + public void delUserGenerateUrlLinkCache(Long schoolId, Long userId, Integer userType) { + //查询所有的微信小程序app + List eduDeptHomeAppList = remoteDeptHomeIndexService.getDeptAppList(schoolId).getData(); + List wxAppList = eduDeptHomeAppList.stream() + .filter(e -> DeptAppTypeEnum.WX.getType().equals(e.getAppType())) + .collect(Collectors.toList()); + for (EduDeptHomeApp homeApp : wxAppList) { + redisService.del(CachePrefixConstant.USER_GENERATE_URL_LINK + userId + "" + userType + "" + homeApp.getId()); + } + } + + public List findStaffMangerClassIdList() { + List ClassIdList = new ArrayList<>(); + CurrentUser currentUser = FebsUtil.getCurrentUser(); + String rolePerms = FebsUtil.getCurrentUser().getRolePerms(); + return null; + } } diff --git a/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/ApplyFormDataInputDTO.java b/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/ApplyFormDataInputDTO.java new file mode 100644 index 0000000..50e7bfe --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/ApplyFormDataInputDTO.java @@ -0,0 +1,33 @@ +package com.yida.data.customForm.dto.apply; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.*; +import lombok.experimental.SuperBuilder; + +import java.io.Serializable; + +/** + * 家长端申请表单填写信息 + * + * @author ZYJ + * @date 2023/11/14 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "ApplyFormDataInputDTO", description = "家长端申请表单填写信息") +public class ApplyFormDataInputDTO implements Serializable { + + private static final long serialVersionUID = -6987439370835565575L; + + @ApiModelProperty("对应表单id") + private Long formId; + + @ApiModelProperty("表单对应数据JSON字符串") + private String jsonDataString; + + @ApiModelProperty("填写用户id(学生id)") + private Long userId; +} diff --git a/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/ApplyFormFillSelectPageDTO.java b/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/ApplyFormFillSelectPageDTO.java new file mode 100644 index 0000000..b7e4bb9 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/ApplyFormFillSelectPageDTO.java @@ -0,0 +1,45 @@ +package com.yida.data.customForm.dto.apply; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.yida.data.common.core.common.BaseDTO; +import com.yida.data.common.core.entity.applyForm.CoreApplyForm; +import com.yida.data.common.core.entity.applyForm.CoreApplyFormFillUser; +import com.yida.data.common.core.enums.EnableStatusEnum; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +import java.io.Serializable; + +/** + * 表单填报数据后台列表请求类 + * + * @author ZYJ + * @date 2023/12/7 + */ +@Data +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@ApiModel(value = "ApplyFormFillSelectPageDTO", description = "表单填报数据后台列表请求类") +public class ApplyFormFillSelectPageDTO extends BaseDTO implements Serializable { + + private static final long serialVersionUID = 4108055176121429655L; + + @ApiModelProperty(value = "表单名称") + private String formTitle; + + @ApiModelProperty(value = "部门id") + private Long deptId; + + @ApiModelProperty("审核状态:默认0未审核,1已通过,2已拒绝,3审核中") + private Integer examineStatus; + + @ApiModelProperty(value = "填报用户名称") + private String userName; +} \ No newline at end of file diff --git a/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/ApplyFormFillUserDataDTO.java b/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/ApplyFormFillUserDataDTO.java new file mode 100644 index 0000000..54878b8 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/ApplyFormFillUserDataDTO.java @@ -0,0 +1,40 @@ +package com.yida.data.customForm.dto.apply; + +import com.yida.data.common.core.entity.applyForm.CoreApplyFormFillUserApprovalProcess; +import com.yida.data.common.core.entity.applyForm.CoreApplyFormItem; +import com.yida.data.common.core.entity.user.EduStudent; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import io.swagger.annotations.ApiParam; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.web.bind.annotation.RequestParam; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +/** + * 表单填报数据请求信息 + * + * @author ZYJ + * @date 2023/11/29 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "ApplyFormFillUserDataDTO", description = "表单填报数据请求信息") +public class ApplyFormFillUserDataDTO implements Serializable { + + private static final long serialVersionUID = -662728926408140104L; + + @ApiModelProperty(value = "填报用户id(学生id)", required = true) + private Long userId; + + @ApiModelProperty(value = "表单id", required = true) + private Long applyFormId; + + @ApiModelProperty(value = "用户填报信息id", required = true) + private Long fillUserId; +} \ No newline at end of file diff --git a/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/ApplyFormSelectPageDTO.java b/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/ApplyFormSelectPageDTO.java new file mode 100644 index 0000000..fce9ef1 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/ApplyFormSelectPageDTO.java @@ -0,0 +1,43 @@ +package com.yida.data.customForm.dto.apply; + +import com.yida.data.common.core.common.BaseDTO; +import com.yida.data.common.core.entity.applyForm.CoreApplyForm; +import com.yida.data.common.core.enums.EnableStatusEnum; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +import java.io.Serializable; + +/** + * 申请表单后台列表请求类 + * + * @author ZYJ + * @date 2023/11/14 + */ +@Data +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@ApiModel(value = "ApplyFormSelectPageDTO", description = "申请表单后台列表请求类") +public class ApplyFormSelectPageDTO extends BaseDTO implements Serializable { + + private static final long serialVersionUID = 5386525553625287056L; + + @ApiModelProperty(value = "表单名称") + private String formTitle; + + @ApiModelProperty(value = "部门id") + private Long deptId; + + /** + * {@link EnableStatusEnum} + */ + @ApiModelProperty("启用状态. 0:停用,1:启用") + private Integer status; +} \ No newline at end of file diff --git a/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/ApprovalFillUserFormPageDTO.java b/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/ApprovalFillUserFormPageDTO.java new file mode 100644 index 0000000..b81d4e5 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/ApprovalFillUserFormPageDTO.java @@ -0,0 +1,36 @@ +package com.yida.data.customForm.dto.apply; + +import com.yida.data.common.core.common.BaseDTO; +import com.yida.data.common.core.entity.applyForm.CoreApplyForm; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +import java.io.Serializable; +import java.util.List; + +/** + * 教师端我审批的申请表单请求类 + * + * @author ZYJ + * @date 2023/11/29 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@ApiModel(value = "ApprovalFillUserFormPageDTO", description = "教师端我审批的申请表单请求类") +public class ApprovalFillUserFormPageDTO extends BaseDTO implements Serializable { + + private static final long serialVersionUID = -4059072495960583855L; + + @ApiModelProperty("填报用户信息id集合") + private List fillUserIds; + + @ApiModelProperty("学校id") + private Long schoolId; +} \ No newline at end of file diff --git a/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/ApprovalProcessSelectPageDTO.java b/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/ApprovalProcessSelectPageDTO.java new file mode 100644 index 0000000..0b7dbd5 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/ApprovalProcessSelectPageDTO.java @@ -0,0 +1,39 @@ +package com.yida.data.customForm.dto.apply; + +import com.yida.data.common.core.common.BaseDTO; +import com.yida.data.common.core.entity.applyForm.CoreApprovalProcess; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +import java.io.Serializable; + +/** + * 审核流程节点后台列表请求类 + * + * @author ZYJ + * @date 2023/11/21 + */ +@Data +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@ApiModel(value = "ApprovalProcessSelectPageDTO", description = "审核流程节点后台列表请求类") +public class ApprovalProcessSelectPageDTO extends BaseDTO implements Serializable { + + private static final long serialVersionUID = 9222217114308071592L; + + @ApiModelProperty(value = "审核节点名称") + private String approvalProcessName; + + @ApiModelProperty(value = "部门id", hidden = true) + private Long deptId; + + @ApiModelProperty(value = "审批方式:0-会审,1-或审") + private Integer approvalType; +} \ No newline at end of file diff --git a/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/ApprovalRemindDTO.java b/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/ApprovalRemindDTO.java new file mode 100644 index 0000000..b6ed56a --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/ApprovalRemindDTO.java @@ -0,0 +1,37 @@ +package com.yida.data.customForm.dto.apply; + +import com.yida.data.common.core.enums.EnableStatusEnum; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 保存审核提醒策略请求类 + * + * @author ZYJ + * @date 2023/12/21 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "ApprovalRemindDTO", description = "保存审核提醒策略请求类") +public class ApprovalRemindDTO implements Serializable { + + private static final long serialVersionUID = -2552169814490729278L; + + /** + * 审核提醒状态. 0为停用,1为启用 {@link EnableStatusEnum} + */ + @ApiModelProperty(value = "审核提醒状态. 0为停用,1为启用") + private Integer approvalRemindStatus; + + /** + * 审核结果状态. 0为停用,1为启用 {@link EnableStatusEnum} + */ + @ApiModelProperty(value = "审核结果状态. 0为停用,1为启用") + private Integer approvalResultStatus; +} \ No newline at end of file diff --git a/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/AuditFormDTO.java b/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/AuditFormDTO.java new file mode 100644 index 0000000..e44efcf --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/AuditFormDTO.java @@ -0,0 +1,54 @@ +package com.yida.data.customForm.dto.apply; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.*; +import lombok.experimental.SuperBuilder; + +import java.io.Serializable; + +/** + * 审核表单提交对象 + * + * @author ZYJ + * @date 2023/11/29 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "AuditFormDTO", description = "审核表单提交对象") +public class AuditFormDTO implements Serializable { + + private static final long serialVersionUID = -8111141594138282797L; + + @ApiModelProperty(value = "用户填报信息id") + private Long fillUserId; + + @ApiModelProperty(value = "表单id") + private Long applyFormId; + + @ApiModelProperty(value = "流程ID") + private Long processId; + + @ApiModelProperty(value = "审核人ID") + private Long approvalId; + + @ApiModelProperty(value = "审核结果:1=通过,0=不通过") + private Integer approvalResult; + + @ApiModelProperty(value = "审核不通过的原因") + private String approvalReason; + + @ApiModelProperty(value = "审核顺序") + private Integer sort; + + @ApiModelProperty(value = "审核第几流程ID") + private Long userProcessId; + + @ApiModelProperty(value = "审核不通过原因") + private String refuseReason; + + @ApiModelProperty("签名图片") + private String signPic; +} diff --git a/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/FormFillUserPageDTO.java b/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/FormFillUserPageDTO.java new file mode 100644 index 0000000..6d92232 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/FormFillUserPageDTO.java @@ -0,0 +1,30 @@ +package com.yida.data.customForm.dto.apply; + +import com.yida.data.common.core.common.BaseDTO; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class FormFillUserPageDTO extends BaseDTO { + + @ApiModelProperty("请假人姓名") + private String requestUserName; + @ApiModelProperty("请假类型:0教师请假,1学生请假") + private Integer requestType; + @ApiModelProperty("所属学校ID") + private Long schoolId; + @ApiModelProperty("审核状态:0待审核,3审核中,4已审核(包含1已通过,2已拒绝)") + private Integer status; + private List statusList; + private List studentIdList; + @ApiModelProperty("请假主体ID集合") + private List idList; +} diff --git a/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/H5ApplyFormSelectPageDTO.java b/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/H5ApplyFormSelectPageDTO.java new file mode 100644 index 0000000..5253bc0 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/H5ApplyFormSelectPageDTO.java @@ -0,0 +1,37 @@ +package com.yida.data.customForm.dto.apply; + +import com.yida.data.common.core.common.BaseDTO; +import com.yida.data.common.core.entity.applyForm.CoreApplyForm; +import com.yida.data.common.core.enums.EnableStatusEnum; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +import java.io.Serializable; + +/** + * H5端-申请表单后台列表请求类 + * + * @author ZYJ + * @date 2023/11/14 + */ +@Data +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@ApiModel(value = "H5ApplyFormSelectPageDTO", description = "H5端-申请表单后台列表请求类") +public class H5ApplyFormSelectPageDTO extends BaseDTO implements Serializable { + + private static final long serialVersionUID = 488904990734180208L; + + @ApiModelProperty(value = "家长id") + private Long parentId; + + @ApiModelProperty(value = "部门id") + private Long deptId; +} \ No newline at end of file diff --git a/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/OfficialSealSaveDTO.java b/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/OfficialSealSaveDTO.java new file mode 100644 index 0000000..4fc5b77 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/OfficialSealSaveDTO.java @@ -0,0 +1,36 @@ +package com.yida.data.customForm.dto.apply; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 保存公章请求类 + * + * @author ZYJ + * @date 2023/11/17 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "OfficialSealSaveDTO", description = "添加缴费单人员请求类") +public class OfficialSealSaveDTO implements Serializable { + + private static final long serialVersionUID = 4108079000646231315L; + + @ApiModelProperty("公章id") + private Long id; + + @ApiModelProperty("公章名称") + private String officialSealTitle; + + @ApiModelProperty("状态. 0为停用,1为启用") + private Integer status; + + @ApiModelProperty("公章图片地址") + private String picUrl; +} \ No newline at end of file diff --git a/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/OfficialSealSelectPageDTO.java b/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/OfficialSealSelectPageDTO.java new file mode 100644 index 0000000..2227cf2 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/OfficialSealSelectPageDTO.java @@ -0,0 +1,44 @@ +package com.yida.data.customForm.dto.apply; + +import com.yida.data.common.core.common.BaseDTO; +import com.yida.data.common.core.entity.applyForm.CoreApplyForm; +import com.yida.data.common.core.entity.applyForm.CoreOfficialSeal; +import com.yida.data.common.core.enums.EnableStatusEnum; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +import java.io.Serializable; + +/** + * 学校公章后台列表请求类 + * + * @author ZYJ + * @date 2023/11/17 + */ +@Data +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@ApiModel(value = "OfficialSealSelectPageDTO", description = "学校公章后台列表请求类") +public class OfficialSealSelectPageDTO extends BaseDTO implements Serializable { + + private static final long serialVersionUID = 4118969684345957010L; + + @ApiModelProperty("公章名称") + private String officialSealTitle; + + @ApiModelProperty("部门id") + private Long deptId; + + /** + * {@link EnableStatusEnum} + */ + @ApiModelProperty("启用状态. 0:停用,1:启用") + private Integer status; +} \ No newline at end of file diff --git a/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/SaveFormProcessDTO.java b/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/SaveFormProcessDTO.java new file mode 100644 index 0000000..3b4b0a9 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/SaveFormProcessDTO.java @@ -0,0 +1,34 @@ +package com.yida.data.customForm.dto.apply; + +import com.yida.data.common.core.entity.applyForm.CoreApplyFormApprovalProcess; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.List; + +/** + * 保存申请表单流程类 + * + * @author ZYJ + * @date 2023/12/19 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "SaveFormProcessDTO", description = "保存申请表单流程类") +public class SaveFormProcessDTO implements Serializable { + + private static final long serialVersionUID = -1681343397781694833L; + + @ApiModelProperty(value = "表单id") + private Long formId; + + @ApiModelProperty(value = "流程信息") + private List list; +} diff --git a/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/SelectApprovalApplyFormDataListDTO.java b/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/SelectApprovalApplyFormDataListDTO.java new file mode 100644 index 0000000..613d37c --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/SelectApprovalApplyFormDataListDTO.java @@ -0,0 +1,38 @@ +package com.yida.data.customForm.dto.apply; + +import com.yida.data.common.core.common.BaseDTO; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import io.swagger.annotations.ApiParam; +import lombok.*; +import lombok.experimental.SuperBuilder; + +import java.io.Serializable; + +/** + * 职工端查询需要审批的申请表单请求类 + * + * @author ZYJ + * @date 2023/11/28 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@ApiModel(value = "SelectApprovalApplyFormDataListDTO", description = "职工端查询需要审批的申请表单请求类") +public class SelectApprovalApplyFormDataListDTO extends BaseDTO implements Serializable { + + private static final long serialVersionUID = 6556440007861284331L; + + @ApiModelProperty("教师id") + private Long userId; + + @ApiModelProperty("学生姓名") + private String studentName; + + @ApiModelProperty("学校id") + private Long schoolId; + + @ApiModelProperty("状态,0未处理,1已处理") + private Integer currentUserStatus; +} diff --git a/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/SendParentNoticeDTO.java b/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/SendParentNoticeDTO.java new file mode 100644 index 0000000..a4cc4d8 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/SendParentNoticeDTO.java @@ -0,0 +1,60 @@ +package com.yida.data.customForm.dto.apply; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.yida.data.common.core.entity.system.Dept; +import com.yida.data.common.core.entity.user.EduStudent; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * 发送家长表单审核模板消息 数据封装类 + * + * @author ZYJ + * @date 2023/11/30 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SendParentNoticeDTO implements Serializable { + + private static final long serialVersionUID = -6522443814615298394L; + + /** + * 学校信息 + */ + private Dept school; + + /** + * 学生信息 + */ + private EduStudent student; + + /** + * 审批结果 1已通过,0未通过 + */ + private Integer examineStatus; + + /** + * 申请时间 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; + + /** + * 申请表单id + */ + private Long formId; + + /** + * 用户填报信息id + */ + private Long fillUserId; +} diff --git a/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/SendStaffNoticeDTO.java b/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/SendStaffNoticeDTO.java new file mode 100644 index 0000000..58e75fb --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/dto/apply/SendStaffNoticeDTO.java @@ -0,0 +1,93 @@ +package com.yida.data.customForm.dto.apply; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * 发送职工表单审核模板消息 数据封装类 + * + * @author ZYJ + * @date 2023/11/28 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SendStaffNoticeDTO implements Serializable { + + private static final long serialVersionUID = 624201172110126750L; + + /** + * 学校ID + */ + private Long schoolId; + + /** + * 本次审核职工 + */ + private String staffWxId; + + /** + * 本次审核职工 + */ + private String staffName; + + /** + * 学校类型 + */ + private String schoolType; + + /** + * 上一位审核职工 + */ + private String preStaffName; + + /** + * 上一位审核职工角色 + */ + private String preStaffRoleName; + + /** + * 学生姓名 / 职工姓名 + */ + private String userName; + + /** + * 学生所属班级名称 / 职工所属部门 + */ + private String userDeptName; + + /** + * 申请时间 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; + + /** + * 审批结果 1已通过,0未通过 + */ + private Integer status; + + /** + * 申请表单id + */ + private Long formId; + + /** + * 用户填报信息id + */ + private Long fillUserId; + + /** + * 用户id(学生id) + */ + private Long userId; +} diff --git a/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/vo/apply/ApplyFormFillSelectPageVO.java b/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/vo/apply/ApplyFormFillSelectPageVO.java new file mode 100644 index 0000000..2d628fa --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/vo/apply/ApplyFormFillSelectPageVO.java @@ -0,0 +1,70 @@ +package com.yida.data.customForm.vo.apply; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.yida.data.common.core.enums.EnableStatusEnum; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * 表单填报数据后台列表返回数据 + * + * @author ZYJ + * @date 2023/12/7 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "ApplyFormFillSelectPageVO", description = "表单填报数据后台列表返回数据") +public class ApplyFormFillSelectPageVO implements Serializable { + + private static final long serialVersionUID = 206000991050950577L; + + @ApiModelProperty("表单标题") + private String formTitle; + + @ApiModelProperty("学校id") + private Long schoolId; + + /** + * 表单id + */ + @ApiModelProperty(value = "表单id") + @TableField("apply_form_id") + private Long applyFormId; + + @ApiModelProperty(value = "表单对应填报数据id") + @TableField("apply_form_dta_id") + private Long applyFormDataId; + + @ApiModelProperty(value = "填报用户id") + @TableField("user_id") + private Long userId; + + @ApiModelProperty(value = "填报用户名称") + @TableField("user_name") + private String userName; + + @ApiModelProperty("审核状态:默认0未审核,1已通过,2已拒绝,3审核中") + private Integer examineStatus; + + @ApiModelProperty(value = "审核时间") + @TableField(value = "audit_time") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime auditTime; + + @ApiModelProperty(value = "审核不通过原因") + @TableField("refuse_reason") + private String refuseReason; + + @ApiModelProperty("部门名称") + private String deptName; +} \ No newline at end of file diff --git a/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/vo/apply/ApplyFormFillUserDataVO.java b/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/vo/apply/ApplyFormFillUserDataVO.java new file mode 100644 index 0000000..1a7e088 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/vo/apply/ApplyFormFillUserDataVO.java @@ -0,0 +1,61 @@ +package com.yida.data.customForm.vo.apply; + +import com.yida.data.common.core.entity.applyForm.CoreApplyFormFillUserApprovalProcess; +import com.yida.data.common.core.entity.applyForm.CoreApplyFormFillUserApprovalProcessRecord; +import com.yida.data.common.core.entity.applyForm.CoreApplyFormItem; +import com.yida.data.common.core.entity.user.EduStudent; +import com.yida.data.common.core.enums.EnableStatusEnum; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +/** + * 表单填报数据返回信息 + * + * @author ZYJ + * @date 2023/11/29 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "ApplyFormFillUserDataVO", description = "表单填报数据返回信息") +public class ApplyFormFillUserDataVO implements Serializable { + + private static final long serialVersionUID = 7915931324819292444L; + + @ApiModelProperty("申请表单id") + private Long id; + + @ApiModelProperty("表单标题") + private String formTitle; + + @ApiModelProperty("背景图") + private String backgroundImgUrl; + + @ApiModelProperty("头图") + private String headerImgUrl; + + @ApiModelProperty("填报信息id") + private Long applyFormDataId; + + @ApiModelProperty("用户填报信息id") + private Long fillUserId; + + @ApiModelProperty("学生信息") + private EduStudent student; + + @ApiModelProperty("用户填报的具体信息") + private Map fillUserData; + + @ApiModelProperty("表单组件集合") + private List itemList; + + @ApiModelProperty("审核流程信息") + private List userApprovalProcessList; +} \ No newline at end of file diff --git a/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/vo/apply/ApplyFormInfoVO.java b/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/vo/apply/ApplyFormInfoVO.java new file mode 100644 index 0000000..b23a157 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/vo/apply/ApplyFormInfoVO.java @@ -0,0 +1,75 @@ +package com.yida.data.customForm.vo.apply; + +import com.yida.data.common.core.entity.applyForm.CoreApplyFormItem; +import com.yida.data.common.core.enums.EnableStatusEnum; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.List; + +/** + * 申请表单详情返回数据 + * + * @author ZYJ + * @date 2023/11/14 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "ApplyFormInfoVO", description = "申请表单详情返回数据") +public class ApplyFormInfoVO implements Serializable { + + private static final long serialVersionUID = 4199278871825693151L; + + @ApiModelProperty("申请表单id") + private Long id; + + /** + * {@link EnableStatusEnum} + */ + @ApiModelProperty("启用状态. 0:停用, 1:启用") + private Integer status; + + @ApiModelProperty("表单标题") + private String formTitle; + + @ApiModelProperty("表单类型") + private Long formTypeId; + + @ApiModelProperty("表单描述说明") + private String formRemark; + + @ApiModelProperty("是否显示排序:1=是,0=否") + private String sorted; + + @ApiModelProperty("0为不开启一页一题,1为开启一页一题") + private Integer pageOneQuestion; + + @ApiModelProperty("0为开启进度条,1为关闭进度条") + private Integer progressBar; + + @ApiModelProperty("分页最大停留时间(单位秒)") + private Integer stopMaxTime; + + @ApiModelProperty("分页最小停留时间(单位秒)") + private Integer stopMinTime; + + @ApiModelProperty("背景图") + private String backgroundImgUrl; + + @ApiModelProperty("头图") + private String headerImgUrl; + + @ApiModelProperty("导出模板文件地址") + private String templateFileUrl; + + @ApiModelProperty("数据表名称") + private String tableName; + + @ApiModelProperty("表单组件集合") + private List itemList; +} \ No newline at end of file diff --git a/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/vo/apply/ApplyFormProcessSelectVO.java b/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/vo/apply/ApplyFormProcessSelectVO.java new file mode 100644 index 0000000..5f04889 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/vo/apply/ApplyFormProcessSelectVO.java @@ -0,0 +1,39 @@ +package com.yida.data.customForm.vo.apply; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 查询表单对应的审核流程数据 + * + * @author ZYJ + * @date 2023/12/16 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "ApplyFormSelectPageVO", description = "查询表单对应的审核流程数据") +public class ApplyFormProcessSelectVO implements Serializable { + + private static final long serialVersionUID = 1002282786015046740L; + + @ApiModelProperty("审核流程id") + private Long approvalProcessId; + + @ApiModelProperty("审核流程名称") + private String approvalProcessName; + + @ApiModelProperty("审批人员类型:0-指定角色,1-指定人员") + private Integer approvalUserType; + + @ApiModelProperty("审批方式:0-会审,1-或审") + private Integer approvalType; + + @ApiModelProperty("审核人员字符串") + private String approvalUserName; +} \ No newline at end of file diff --git a/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/vo/apply/ApplyFormSelectPageVO.java b/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/vo/apply/ApplyFormSelectPageVO.java new file mode 100644 index 0000000..b7a8d27 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/vo/apply/ApplyFormSelectPageVO.java @@ -0,0 +1,49 @@ +package com.yida.data.customForm.vo.apply; + +import com.yida.data.common.core.enums.EnableStatusEnum; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 申请表单后台列表返回数据 + * + * @author ZYJ + * @date 2023/11/14 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "ApplyFormSelectPageVO", description = "申请表单后台列表返回数据") +public class ApplyFormSelectPageVO implements Serializable { + + private static final long serialVersionUID = 8529913736282242373L; + + @ApiModelProperty("申请表单id") + private Long id; + + @ApiModelProperty("表单标题") + private String formTitle; + + @ApiModelProperty("背景图") + private String backgroundImgUrl; + + @ApiModelProperty("头图") + private String headerImgUrl; + + @ApiModelProperty(value = "对应数据表名称", hidden = true) + private String tableName; + + @ApiModelProperty(value = "提交数量") + private Long submitNum; + + /** + * {@link EnableStatusEnum} + */ + @ApiModelProperty("启用状态. 0:停用, 1:启用") + private Integer status; +} \ No newline at end of file diff --git a/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/vo/apply/ApprovalApplyFormPageVO.java b/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/vo/apply/ApprovalApplyFormPageVO.java new file mode 100644 index 0000000..c952307 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/vo/apply/ApprovalApplyFormPageVO.java @@ -0,0 +1,34 @@ +package com.yida.data.customForm.vo.apply; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * 教师查询我审核的表单类别数据 + * + * @author ZYJ + * @date 2023/11/28 + */ +@Data +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@ApiModel(value = "ApprovalApplyFormPageVO", description = "教师查询我审核的表单类别数据") +public class ApprovalApplyFormPageVO extends MyApplyFormPageVO implements Serializable { + + private static final long serialVersionUID = 6944129273047249532L; + + @ApiModelProperty("学生班级信息") + private String userDeptName; +} \ No newline at end of file diff --git a/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/vo/apply/ApprovalProcessInfoVO.java b/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/vo/apply/ApprovalProcessInfoVO.java new file mode 100644 index 0000000..346b743 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/vo/apply/ApprovalProcessInfoVO.java @@ -0,0 +1,43 @@ +package com.yida.data.customForm.vo.apply; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.yida.data.common.core.entity.applyForm.CoreApprovalProcessUser; +import com.yida.data.common.core.enums.EnableStatusEnum; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.List; + +/** + * 审核流程节点详情返回数据 + * + * @author ZYJ + * @date 2023/11/21 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "ApprovalProcessInfoVO", description = "审核流程节点详情返回数据") +public class ApprovalProcessInfoVO implements Serializable { + + private static final long serialVersionUID = -4441915066856278590L; + + @ApiModelProperty("审核流程节点id") + private Long id; + + @ApiModelProperty("审核流程名称") + private String approvalProcessName; + + @ApiModelProperty("审批人员类型:0-指定角色,1-指定人员") + private Integer approvalUserType; + + @ApiModelProperty("审批方式:0-会审,1-或审") + private Integer approvalType; + + @ApiModelProperty("审核人员信息") + private List userList; +} \ No newline at end of file diff --git a/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/vo/apply/ApprovalProcessSelectPageVO.java b/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/vo/apply/ApprovalProcessSelectPageVO.java new file mode 100644 index 0000000..4ade74b --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/vo/apply/ApprovalProcessSelectPageVO.java @@ -0,0 +1,47 @@ +package com.yida.data.customForm.vo.apply; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * 审核流程后台列表返回数据 + * + * @author ZYJ + * @date 2023/11/21 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "ApprovalProcessSelectPageVO", description = "审核流程后台列表返回数据") +public class ApprovalProcessSelectPageVO implements Serializable { + + private static final long serialVersionUID = -3815063304958884659L; + + @ApiModelProperty("审核流程id") + private Long id; + + @ApiModelProperty("审核流程名称") + private String approvalProcessName; + + @ApiModelProperty("审核人员字符串") + private String approvalUserName; + + @ApiModelProperty("审批人员类型:0-指定角色,1-指定人员") + private Integer approvalUserType; + + @ApiModelProperty("审批方式:0-会审,1-或审") + private Integer approvalType; + + @ApiModelProperty("创建时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; +} \ No newline at end of file diff --git a/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/vo/apply/ApprovalRemindInfoVO.java b/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/vo/apply/ApprovalRemindInfoVO.java new file mode 100644 index 0000000..68d5520 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/vo/apply/ApprovalRemindInfoVO.java @@ -0,0 +1,40 @@ +package com.yida.data.customForm.vo.apply; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.yida.data.common.core.entity.applyForm.CoreApprovalProcessUser; +import com.yida.data.common.core.enums.EnableStatusEnum; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.List; + +/** + * 审核提醒策略详情 + * + * @author ZYJ + * @date 2023/12/21 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "ApprovalRemindInfoVO", description = "审核提醒策略详情") +public class ApprovalRemindInfoVO implements Serializable { + + private static final long serialVersionUID = -8312618288590569425L; + + /** + * 审核提醒状态. 0为停用,1为启用 {@link EnableStatusEnum} + */ + @ApiModelProperty(value = "审核提醒状态. 0为停用,1为启用") + private Integer approvalRemindStatus; + + /** + * 审核结果状态. 0为停用,1为启用 {@link EnableStatusEnum} + */ + @ApiModelProperty(value = "审核结果状态. 0为停用,1为启用") + private Integer approvalResultStatus; +} \ No newline at end of file diff --git a/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/vo/apply/MyApplyFormPageVO.java b/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/vo/apply/MyApplyFormPageVO.java new file mode 100644 index 0000000..d585393 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/vo/apply/MyApplyFormPageVO.java @@ -0,0 +1,65 @@ +package com.yida.data.customForm.vo.apply; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.yida.data.common.core.enums.EnableStatusEnum; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * 家长端查询已经填报的申请列表数据 + * + * @author ZYJ + * @date 2023/11/23 + */ +@Data +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "MyApplyFormPageVO", description = "家长端查询已经填报的申请列表数据") +public class MyApplyFormPageVO implements Serializable { + + private static final long serialVersionUID = 3100369332357552698L; + + @ApiModelProperty("申请表单id") + private Long id; + + @ApiModelProperty("表单标题") + private String formTitle; + + @ApiModelProperty("背景图") + private String backgroundImgUrl; + + @ApiModelProperty("头图") + private String headerImgUrl; + + @ApiModelProperty("审核状态:默认0未审核,1已通过,2已拒绝,3审核中") + private Integer examineStatus; + + @ApiModelProperty("填报时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + @ApiModelProperty("填报的学生id") + private Long userId; + + @ApiModelProperty("学生姓名") + private String userName; + + @ApiModelProperty("学生头像") + private String userPicUrl; + + @ApiModelProperty("填报信息id") + private Long applyFormDataId; + + @ApiModelProperty("用户填报信息id") + private Long fillUserId; +} \ No newline at end of file diff --git a/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/vo/apply/OfficialSealInfoVO.java b/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/vo/apply/OfficialSealInfoVO.java new file mode 100644 index 0000000..802767c --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/vo/apply/OfficialSealInfoVO.java @@ -0,0 +1,43 @@ +package com.yida.data.customForm.vo.apply; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.yida.data.common.core.entity.applyForm.CoreApplyFormItem; +import com.yida.data.common.core.enums.EnableStatusEnum; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.List; + +/** + * 申请表单详情返回数据 + * + * @author ZYJ + * @date 2023/11/14 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "OfficialSealInfoVO", description = "申请表单详情返回数据") +public class OfficialSealInfoVO implements Serializable { + + private static final long serialVersionUID = 5097919143166649586L; + + @ApiModelProperty("申请表单id") + private Long id; + + @ApiModelProperty("公章名称") + private String officialSealTitle; + + /** + * {@link EnableStatusEnum} + */ + @ApiModelProperty("启用状态. 0:停用, 1:启用") + private Integer status; + + @ApiModelProperty("公章图片地址") + private String picUrl; +} \ No newline at end of file diff --git a/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/vo/apply/OfficialSealSelectPageVO.java b/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/vo/apply/OfficialSealSelectPageVO.java new file mode 100644 index 0000000..5f178f3 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-api/src/main/java/com/yida/data/customForm/vo/apply/OfficialSealSelectPageVO.java @@ -0,0 +1,49 @@ +package com.yida.data.customForm.vo.apply; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.yida.data.common.core.enums.EnableStatusEnum; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * 学校公章后台列表返回数据 + * + * @author ZYJ + * @date 2023/11/17 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "OfficialSealSelectPageVO", description = "学校公章后台列表返回数据") +public class OfficialSealSelectPageVO implements Serializable { + + private static final long serialVersionUID = 7233799022727223532L; + + @ApiModelProperty("公章id") + private Long id; + + @ApiModelProperty("公章名称") + private String officialSealTitle; + + /** + * {@link EnableStatusEnum} + */ + @ApiModelProperty("启用状态. 0:停用, 1:启用") + private Integer status; + + @ApiModelProperty("公章图片地址") + private String picUrl; + + @ApiModelProperty("创建时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; +} \ No newline at end of file diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/pom.xml b/febs-server/edu-custom-form/edu-custom-form-biz/pom.xml index 7ca074a..1e0c47d 100644 --- a/febs-server/edu-custom-form/edu-custom-form-biz/pom.xml +++ b/febs-server/edu-custom-form/edu-custom-form-biz/pom.xml @@ -9,7 +9,7 @@ 4.0.0 edu-custom-form-biz - + jar 8 8 diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/EduCustomFormApplication.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/EduCustomFormApplication.java new file mode 100644 index 0000000..5ccced4 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/EduCustomFormApplication.java @@ -0,0 +1,34 @@ +package com.yida.data.form; + +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; + +import org.mybatis.spring.annotation.MapperScan; +import org.mybatis.spring.annotation.MapperScans; +import org.springframework.boot.SpringBootConfiguration; +import org.springframework.boot.WebApplicationType; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.cloud.openfeign.EnableFeignClients; +import org.springframework.context.annotation.EnableAspectJAutoProxy; +import org.springframework.scheduling.annotation.EnableAsync; + +import cc.mrbird.febs.common.security.starter.annotation.EnableFebsCloudResourceServer; + + +/** + * @author wjm + */ +@SpringBootConfiguration +@EnableAsync +@EnableFeignClients(basePackages = "com.yida.data") +@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) +@EnableFebsCloudResourceServer +@EnableAspectJAutoProxy(exposeProxy = true) +@MapperScan("com.yida.data.form.*.mapper") +public class EduCustomFormApplication { + public static void main(String[] args) { + new SpringApplicationBuilder(EduCustomFormApplication.class) + .web(WebApplicationType.SERVLET) + .run(args); + } +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/controller/CoreApplyFormController.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/controller/CoreApplyFormController.java new file mode 100644 index 0000000..4b29e87 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/controller/CoreApplyFormController.java @@ -0,0 +1,89 @@ +package com.yida.data.form.apply.controller; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.applyForm.CoreApplyForm; +import com.yida.data.common.core.entity.applyForm.CoreApplyFormApprovalProcess; +import com.yida.data.customForm.dto.apply.ApplyFormSelectPageDTO; +import com.yida.data.customForm.dto.apply.SaveFormProcessDTO; +import com.yida.data.customForm.vo.apply.ApplyFormInfoVO; +import com.yida.data.customForm.vo.apply.ApplyFormProcessSelectVO; +import com.yida.data.customForm.vo.apply.ApplyFormSelectPageVO; +import com.yida.data.form.apply.service.CoreApplyFormApprovalProcessService; +import com.yida.data.form.apply.service.CoreApplyFormService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.RequiredArgsConstructor; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + + +/** + * 申请类表单管理 Controller + * + * @author ZYJ + * @date 2023/11/14 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/applyFrom") +@Api(tags = "后台--申请类表单管理") +public class CoreApplyFormController { + + private final CoreApplyFormService coreApplyFormService; + private final CoreApplyFormApprovalProcessService coreApplyFormApprovalProcessService; + + @ApiOperation("查询申请表单列表数据") + @PostMapping("/listApplyFormPage") + public ResultBean> listApplyFormPage(ApplyFormSelectPageDTO dto) { + IPage page = coreApplyFormService.listApplyFormPage(dto); + return ResultBean.buildSuccess(page); + } + + @ApiOperation("查询申请表单详情") + @GetMapping("/getApplyFormInfo") + public ResultBean getApplyFormInfo( + @RequestParam @ApiParam(value = "表单id", required = true) Long id) { + return ResultBean.buildSuccess(coreApplyFormService.getApplyFormInfo(id)); + } + + @ApiOperation("删除申请表单") + @GetMapping("/deleteApplyForm") + public ResultBean deleteApplyForm( + @RequestParam @ApiParam(value = "表单id", required = true) Long id) { + coreApplyFormService.deleteApplyForm(id); + return ResultBean.buildSuccess(); + } + + @ApiOperation(value = "保存申请表单", consumes = MediaType.APPLICATION_JSON_VALUE) + @PostMapping(value = "/saveApplyForm", consumes = MediaType.APPLICATION_JSON_VALUE) + public ResultBean saveApplyForm(@RequestBody CoreApplyForm applyForm) { + return ResultBean.buildSuccess(coreApplyFormService.saveApplyForm(applyForm)); + } + + @ApiOperation("修改申请表单状态") + @GetMapping("updateEnableStatus") + public ResultBean updateEnableStatus( + @ApiParam(value = "表单id", required = true) @RequestParam Long formId, + @ApiParam(value = "状态. 0为停用,1为启用", required = true) @RequestParam Integer enableStatus) { + coreApplyFormService.updateEnableStatus(formId, enableStatus); + return ResultBean.buildSuccess(); + } + + @ApiOperation("查询表单对应的审核流程数据") + @GetMapping("/listFormApprovalProcess") + public ResultBean> listFormApprovalProcess( + @ApiParam(value = "表单id", required = true) @RequestParam Long formId) { + return ResultBean.buildSuccess(coreApplyFormApprovalProcessService.listFormApprovalProcess(formId)); + } + + @ApiOperation("保存表单审核流程数据") + @PostMapping("/saveFormApprovalProcess") + public ResultBean saveFormApprovalProcess(@RequestBody SaveFormProcessDTO dto) { + coreApplyFormApprovalProcessService.saveApplyFormApprovalProcess(dto.getFormId() , dto.getList()); + return ResultBean.buildSuccess(); + } +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/controller/CoreApplyFormFillController.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/controller/CoreApplyFormFillController.java new file mode 100644 index 0000000..42c3805 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/controller/CoreApplyFormFillController.java @@ -0,0 +1,37 @@ +package com.yida.data.form.apply.controller; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.customForm.dto.apply.ApplyFormFillSelectPageDTO; +import com.yida.data.customForm.vo.apply.ApplyFormFillSelectPageVO; +import com.yida.data.customForm.vo.apply.ApplyFormSelectPageVO; +import com.yida.data.form.apply.service.CoreApplyFormFillUserService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + + +/** + * 表单填报管理 Controller + * + * @author ZYJ + * @date 2023/12/7 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/fill") +@Api(tags = "后台--表单填报管理") +public class CoreApplyFormFillController { + + private final CoreApplyFormFillUserService coreApplyFormFillUserService; + + @ApiOperation("查询申请表单填报列表数据") + @PostMapping("/listApplyFormFillPage") + public ResultBean> listApplyFormFillPage(ApplyFormFillSelectPageDTO dto) { + IPage page = coreApplyFormFillUserService.listApplyFormFillPage(dto); + return ResultBean.buildSuccess(page); + } +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/controller/CoreApprovalProcessController.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/controller/CoreApprovalProcessController.java new file mode 100644 index 0000000..81e8da8 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/controller/CoreApprovalProcessController.java @@ -0,0 +1,71 @@ +package com.yida.data.form.apply.controller; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.yida.data.common.core.utils.FebsUtil; +import com.yida.data.form.apply.service.CoreApprovalProcessService; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.applyForm.CoreApprovalProcess; +import com.yida.data.customForm.dto.apply.ApprovalProcessSelectPageDTO; +import com.yida.data.customForm.vo.apply.ApprovalProcessInfoVO; +import com.yida.data.customForm.vo.apply.ApprovalProcessSelectPageVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.RequiredArgsConstructor; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + + +/** + * 审核流程节点管理 Controller + * + * @author ZYJ + * @date 2023/11/21 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/process") +@Api(tags = "后台--审核流程管理") +public class CoreApprovalProcessController { + + private final CoreApprovalProcessService coreApprovalProcessService; + + @ApiOperation("查询审核流程节点列表数据") + @PostMapping("/listApprovalProcessPage") + public ResultBean> listApprovalProcessPage(ApprovalProcessSelectPageDTO dto) { + IPage page = coreApprovalProcessService.listApprovalProcessPage(dto); + return ResultBean.buildSuccess(page); + } + + @ApiOperation("查询所有审核流程节点数据(排除当前表单包含的数据)") + @PostMapping("/listApprovalProcess") + public ResultBean> listApprovalProcess( + @ApiParam(value = "表单id", required = true) @RequestParam Long formId) { + return ResultBean.buildSuccess(coreApprovalProcessService.listApprovalProcess(formId)); + } + + @ApiOperation("查询审核流程节点详情") + @GetMapping("/getApprovalProcessInfo") + public ResultBean getApprovalProcessInfo( + @RequestParam @ApiParam(value = "审核流程节点id", required = true) Long id) { + return ResultBean.buildSuccess(coreApprovalProcessService.getApprovalProcessInfo(id)); + } + + @ApiOperation("删除审核流程节点") + @GetMapping("/deleteApprovalProcess") + public ResultBean deleteApprovalProcess( + @RequestParam @ApiParam(value = "审核流程节点id", required = true) Long id) { + coreApprovalProcessService.deleteApprovalProcess(id); + return ResultBean.buildSuccess(); + } + + @ApiOperation(value = "保存审核流程节点", consumes = MediaType.APPLICATION_JSON_VALUE) + @PostMapping(value = "/saveApprovalProcess", consumes = MediaType.APPLICATION_JSON_VALUE) + public ResultBean saveApprovalProcess(@RequestBody CoreApprovalProcess process) { + coreApprovalProcessService.saveApprovalProcess(process); + return ResultBean.buildSuccess(); + } +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/controller/CoreApprovalRemindController.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/controller/CoreApprovalRemindController.java new file mode 100644 index 0000000..2b2166d --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/controller/CoreApprovalRemindController.java @@ -0,0 +1,40 @@ +package com.yida.data.form.apply.controller; + +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.customForm.dto.apply.ApprovalRemindDTO; +import com.yida.data.customForm.vo.apply.ApprovalRemindInfoVO; +import com.yida.data.form.apply.service.CoreApprovalRemindService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.*; + + +/** + * 审核提醒策略 Controller + * + * @author ZYJ + * @date 2023/12/21 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/remind") +@Api(tags = "后台--审核提醒策略") +public class CoreApprovalRemindController { + + private final CoreApprovalRemindService coreApprovalRemindService; + + @ApiOperation("查询审核提醒策略详情") + @GetMapping("/getApprovalRemindInfo") + public ResultBean getApprovalRemindInfo() { + return ResultBean.buildSuccess(coreApprovalRemindService.getApprovalRemindInfo()); + } + + @ApiOperation(value = "保存审核提醒策略", consumes = MediaType.APPLICATION_JSON_VALUE) + @PostMapping(value = "/saveApprovalRemind", consumes = MediaType.APPLICATION_JSON_VALUE) + public ResultBean saveApprovalRemind(@RequestBody ApprovalRemindDTO dto) { + coreApprovalRemindService.saveApprovalRemind(dto); + return ResultBean.buildSuccess(); + } +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/controller/CoreOfficialSealController.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/controller/CoreOfficialSealController.java new file mode 100644 index 0000000..f1e2467 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/controller/CoreOfficialSealController.java @@ -0,0 +1,80 @@ +package com.yida.data.form.apply.controller; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.yida.data.common.core.entity.applyForm.CoreOfficialSeal; +import com.yida.data.form.apply.service.CoreOfficialSealService; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.customForm.dto.apply.OfficialSealSaveDTO; +import com.yida.data.customForm.dto.apply.OfficialSealSelectPageDTO; +import com.yida.data.customForm.vo.apply.OfficialSealInfoVO; +import com.yida.data.customForm.vo.apply.OfficialSealSelectPageVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.RequiredArgsConstructor; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + + +/** + * 学校公章管理 Controller + * + * @author ZYJ + * @date 2023/11/17 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/officialSeal") +@Api(tags = "后台--学校公章管理") +public class CoreOfficialSealController { + + private final CoreOfficialSealService coreOfficialSealService; + + @ApiOperation("查询学校公章列表数据") + @PostMapping("/listOfficialSealPage") + public ResultBean> listOfficialSealPage(OfficialSealSelectPageDTO dto) { + IPage page = coreOfficialSealService.listOfficialSealPage(dto); + return ResultBean.buildSuccess(page); + } + + @ApiOperation("查询学校所有公章数据") + @PostMapping("/listOfficialSeal") + public ResultBean> listOfficialSeal(@RequestParam @ApiParam(value = "学校id") Long schoolId) { + return ResultBean.buildSuccess(coreOfficialSealService.list(Wrappers.lambdaQuery(new CoreOfficialSeal()) + .eq(CoreOfficialSeal::getDeptId, schoolId))); + } + + @ApiOperation("查询公章详情") + @GetMapping("/getOfficialSealInfo") + public ResultBean getOfficialSealInfo( + @RequestParam @ApiParam(value = "公章id", required = true) Long id) { + return ResultBean.buildSuccess(coreOfficialSealService.getOfficialSealInfo(id)); + } + + @ApiOperation("删除公章") + @GetMapping("/deleteOfficialSeal") + public ResultBean deleteOfficialSeal( + @RequestParam @ApiParam(value = "公章id", required = true) Long id) { + coreOfficialSealService.deleteOfficialSeal(id); + return ResultBean.buildSuccess(); + } + + @ApiOperation(value = "保存公章", consumes = MediaType.APPLICATION_JSON_VALUE) + @PostMapping(value = "/saveOfficialSeal", consumes = MediaType.APPLICATION_JSON_VALUE) + public ResultBean saveOfficialSeal(@RequestBody OfficialSealSaveDTO dto) { + coreOfficialSealService.saveOfficialSeal(dto); + return ResultBean.buildSuccess(); + } + + @ApiOperation("修改公章状态") + @GetMapping("updateEnableStatus") + public ResultBean updateEnableStatus( + @ApiParam(value = "公章id", required = true) @RequestParam Long id, + @ApiParam(value = "状态. 0为停用,1为启用", required = true) @RequestParam Integer enableStatus) { + coreOfficialSealService.updateEnableStatus(id, enableStatus); + return ResultBean.buildSuccess(); + } +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/controller/app/AppApplyFormController.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/controller/app/AppApplyFormController.java new file mode 100644 index 0000000..2ab3ad3 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/controller/app/AppApplyFormController.java @@ -0,0 +1,76 @@ +package com.yida.data.form.apply.controller.app; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.yida.data.form.apply.service.AppApplyFormService; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.customForm.dto.apply.*; +import com.yida.data.customForm.vo.apply.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + + +/** + * H5--申请类表单接口管理 Controller + * + * @author ZYJ + * @date 2023/11/14 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/app/applyFrom") +@Api(tags = "H5--申请类表单接口管理") +public class AppApplyFormController { + + private final AppApplyFormService appApplyFormService; + + @ApiOperation("家长端查询可填报的申请表单列表数据") + @PostMapping("/parent/listApplyFormPage") + public ResultBean> listApplyFormPage(H5ApplyFormSelectPageDTO dto) { + IPage page = appApplyFormService.listApplyFormPage(dto); + return ResultBean.buildSuccess(page); + } + + @ApiOperation("家长端查询已经填报的申请数据") + @PostMapping("/parent/listMyApplyFormPage") + public ResultBean> listMyApplyFormPage(H5ApplyFormSelectPageDTO dto) { + IPage page = appApplyFormService.listMyApplyFormPage(dto); + return ResultBean.buildSuccess(page); + } + + @ApiOperation("家长端查询申请表单详情") + @GetMapping("/parent/getApplyFormInfo") + public ResultBean getApplyFormInfo( + @RequestParam @ApiParam(value = "表单id", required = true) Long id) { + return ResultBean.buildSuccess(appApplyFormService.getApplyFormInfo(id)); + } + + @ApiOperation("家长端提交保存申请表单数据") + @PostMapping("/parent/saveApplyFormData") + public ResultBean saveApplyFormData(@RequestBody ApplyFormDataInputDTO dto) { + appApplyFormService.saveApplyFormData(dto); + return ResultBean.buildSuccess(); + } + + @ApiOperation("教师端我审批的申请表单") + @GetMapping("/staff/findApprovalApplyFormDataList") + public ResultBean> findApprovalApplyFormDataList(SelectApprovalApplyFormDataListDTO dto) { + IPage page = appApplyFormService.findApprovalApplyFormDataList(dto); + return ResultBean.buildSuccess(page); + } + + @ApiOperation("获取申请表单填报数据") + @PostMapping("/getApplyFormFillUserData") + public ResultBean getApplyFormFillUserData(ApplyFormFillUserDataDTO dto) { + return ResultBean.buildSuccess(appApplyFormService.getApplyFormFillUserData(dto)); + } + + @ApiOperation("教师端填报数据审核") + @PostMapping("/staff/auditForm") + public ResultBean auditForm(@RequestBody AuditFormDTO dto) { + appApplyFormService.auditForm(dto); + return ResultBean.buildSuccess(); + } +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/mapper/AppApplyFormMapper.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/mapper/AppApplyFormMapper.java new file mode 100644 index 0000000..810c7ac --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/mapper/AppApplyFormMapper.java @@ -0,0 +1,12 @@ +package com.yida.data.form.apply.mapper; + +/** + * H5--申请类表单管理 mapper + * + * @author ZYJ + * @date 2023/11/28 + */ +public interface AppApplyFormMapper { + + +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/mapper/ApplyFormDataMapper.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/mapper/ApplyFormDataMapper.java new file mode 100644 index 0000000..dabc0f0 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/mapper/ApplyFormDataMapper.java @@ -0,0 +1,48 @@ +package com.yida.data.form.apply.mapper; + +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + * 申请类表单填报数据 mapper + * + * @author ZYJ + * @date 2023/11/16 + */ +public interface ApplyFormDataMapper { + + /** + * 查询数据表字段 + * + * @param tableName 表名称 + * @return java.util.List + * @author ZYJ + * @date 2023/11/16 17:19 + */ + List findApplyFormFiled(@Param("tableName") String tableName); + + /** + * 动态保存sql,并返回主键id + * + * @param sql 对应sql语句 + * @param parameterMap 参数 + * @author ZYJ + * @date 2023/11/16 17:34 + */ + void saveFormData(@Param("sql") String sql, + @Param("parameterMap") Map parameterMap); + + /** + * 查询用户填报数据信息 + * + * @param sql 对应sql语句 + * @param parameterMap 参数 + * @return java.util.Map + * @author ZYJ + * @date 2023/11/29 15:28 + */ + Map findFillUserData(@Param("sql") String sql, + @Param("parameterMap") Map parameterMap); +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/mapper/CoreApplyFormApprovalProcessMapper.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/mapper/CoreApplyFormApprovalProcessMapper.java new file mode 100644 index 0000000..630bdf3 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/mapper/CoreApplyFormApprovalProcessMapper.java @@ -0,0 +1,43 @@ +package com.yida.data.form.apply.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yida.data.common.core.entity.applyForm.CoreApplyForm; +import com.yida.data.common.core.entity.applyForm.CoreApplyFormApprovalProcess; +import com.yida.data.common.core.entity.applyForm.CoreApprovalProcess; +import com.yida.data.customForm.dto.apply.ApplyFormSelectPageDTO; +import com.yida.data.customForm.vo.apply.ApplyFormProcessSelectVO; +import com.yida.data.customForm.vo.apply.ApplyFormSelectPageVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 申请表单对应的审核流程 mapper + * + * @author ZYJ + * @date 2023/11/21 + */ +public interface CoreApplyFormApprovalProcessMapper extends BaseMapper { + + /** + * 查询表单对应的审核流程 + * + * @param applyFormId 表单id + * @return java.util.List + * @author ZYJ + * @date 2023/11/24 14:04 + */ + List selectApplyFormApprovalProcess(@Param("applyFormId") Long applyFormId); + + /** + * 查询表单对应的审核流程页面数据 + * + * @param formId 表单id + * @return java.util.List + * @author ZYJ + * @date 2023/12/18 16:51 + */ + List listFormApprovalProcess(@Param("formId") Long formId); +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/mapper/CoreApplyFormFillUserApprovalProcessMapper.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/mapper/CoreApplyFormFillUserApprovalProcessMapper.java new file mode 100644 index 0000000..1ed3ea1 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/mapper/CoreApplyFormFillUserApprovalProcessMapper.java @@ -0,0 +1,15 @@ +package com.yida.data.form.apply.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.applyForm.CoreApplyFormFillUserApprovalProcess; + +/** + * 表单填报用户对应审核流程表 mapper + * + * @author ZYJ + * @date 2023/11/24 + */ +public interface CoreApplyFormFillUserApprovalProcessMapper extends BaseMapper { + + +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/mapper/CoreApplyFormFillUserApprovalProcessRecordMapper.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/mapper/CoreApplyFormFillUserApprovalProcessRecordMapper.java new file mode 100644 index 0000000..44fdf68 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/mapper/CoreApplyFormFillUserApprovalProcessRecordMapper.java @@ -0,0 +1,15 @@ +package com.yida.data.form.apply.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.applyForm.CoreApplyFormFillUserApprovalProcessRecord; + +/** + * 填报用户表单审核流程记录表(具体的审核信息) mapper + * + * @author ZYJ + * @date 2023/11/24 + */ +public interface CoreApplyFormFillUserApprovalProcessRecordMapper extends BaseMapper { + + +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/mapper/CoreApplyFormFillUserMapper.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/mapper/CoreApplyFormFillUserMapper.java new file mode 100644 index 0000000..36c9ead --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/mapper/CoreApplyFormFillUserMapper.java @@ -0,0 +1,78 @@ +package com.yida.data.form.apply.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yida.data.common.core.entity.applyForm.CoreApplyForm; +import com.yida.data.common.core.entity.applyForm.CoreApplyFormFillUser; +import com.yida.data.customForm.dto.apply.ApplyFormFillSelectPageDTO; +import com.yida.data.customForm.dto.apply.ApprovalFillUserFormPageDTO; +import com.yida.data.customForm.dto.apply.H5ApplyFormSelectPageDTO; +import com.yida.data.customForm.dto.apply.SelectApprovalApplyFormDataListDTO; +import com.yida.data.customForm.vo.apply.ApplyFormFillSelectPageVO; +import com.yida.data.customForm.vo.apply.ApprovalApplyFormPageVO; +import com.yida.data.customForm.vo.apply.MyApplyFormPageVO; +import org.apache.ibatis.annotations.Param; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * 申请表单填报用户信息表 mapper + * + * @author ZYJ + * @date 2023/11/22 + */ +public interface CoreApplyFormFillUserMapper extends BaseMapper { + + + /** + * 查询用户已经填报的数据 + * + * @param page 分页信息 + * @param dto 查询参数 + * @param userIds 填报用户id集合 + * @return com.baomidou.mybatisplus.core.metadata.IPage + * @author ZYJ + * @date 2023/11/23 15:06 + */ + IPage selectUserFillForm(Page page, + @Param("dto") H5ApplyFormSelectPageDTO dto, + @Param("userIds") List userIds); + + /** + * 职工参与审核的填报用户信息 + * + * @param dto 查询条件 + * @param dateTime 时间点 + * @return java.util.List + * @author ZYJ + * @date 2023/11/29 10:36 + */ + List findApprovalFormDataFillUserList(@Param("dto") SelectApprovalApplyFormDataListDTO dto, + @Param("dateTime") LocalDateTime dateTime); + + /** + * 查询教师审核的表单分页数据 + * + * @param page 分页信息 + * @param dto 查询条件 + * @return com.baomidou.mybatisplus.core.metadata.IPage + * @author ZYJ + * @date 2023/11/29 13:51 + */ + IPage selectApprovalUserFillForm(Page page, + @Param("dto") ApprovalFillUserFormPageDTO dto); + + /** + * 查询申请表单填报列表数据 + * + * @param page 分页信息 + * @param dto 查询条件 + * @return com.baomidou.mybatisplus.core.metadata.IPage + * @author ZYJ + * @date 2023/12/7 15:19 + */ + IPage listApplyFormFillPage(Page page, + @Param("dto") ApplyFormFillSelectPageDTO dto); +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/mapper/CoreApplyFormItemChildrenMapper.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/mapper/CoreApplyFormItemChildrenMapper.java new file mode 100644 index 0000000..e7a5b69 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/mapper/CoreApplyFormItemChildrenMapper.java @@ -0,0 +1,14 @@ +package com.yida.data.form.apply.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.applyForm.CoreApplyFormItemChildren; + +/** + * 申请类型表单组件选项 mapper + * + * @author ZYJ + * @date 2023/11/14 + */ +public interface CoreApplyFormItemChildrenMapper extends BaseMapper { + +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/mapper/CoreApplyFormItemMapper.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/mapper/CoreApplyFormItemMapper.java new file mode 100644 index 0000000..d566e72 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/mapper/CoreApplyFormItemMapper.java @@ -0,0 +1,15 @@ +package com.yida.data.form.apply.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.applyForm.CoreApplyFormItem; +import com.yida.data.common.core.entity.customform.CoreCustomFormItems; + +/** + * 申请类型表单组件 mapper + * + * @author ZYJ + * @date 2023/11/14 + */ +public interface CoreApplyFormItemMapper extends BaseMapper { + +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/mapper/CoreApplyFormMapper.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/mapper/CoreApplyFormMapper.java new file mode 100644 index 0000000..afa5b29 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/mapper/CoreApplyFormMapper.java @@ -0,0 +1,49 @@ +package com.yida.data.form.apply.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yida.data.common.core.entity.applyForm.CoreApplyForm; +import com.yida.data.customForm.dto.apply.ApplyFormSelectPageDTO; +import com.yida.data.customForm.vo.apply.ApplyFormSelectPageVO; +import org.apache.ibatis.annotations.Param; + +/** + * 申请类型表单 mapper + * + * @author ZYJ + * @date 2023/11/14 + */ +public interface CoreApplyFormMapper extends BaseMapper { + + /** + * 查询申请表单列表数据 + * + * @param page 分页信息 + * @param dto 查询参数 + * @return com.baomidou.mybatisplus.core.metadata.IPage + * @author ZYJ + * @date 2023/11/14 16:17 + */ + IPage listApplyFormPage(Page page, + @Param("dto") ApplyFormSelectPageDTO dto); + + /** + * 返回int类型数据的动态sql + * + * @param sql 对应sql语句 + * @return java.lang.Integer + * @author ZYJ + * @date 2023/11/14 16:52 + */ + Integer initSqlReturnInt(@Param("sql") String sql); + + /** + * 没有返回值的动态sql + * + * @param sql 对应sql语句 + * @author ZYJ + * @date 2023/11/15 15:19 + */ + void initSqlReturnVoid(@Param("sql") String sql); +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/mapper/CoreApprovalProcessMapper.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/mapper/CoreApprovalProcessMapper.java new file mode 100644 index 0000000..426764f --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/mapper/CoreApprovalProcessMapper.java @@ -0,0 +1,30 @@ +package com.yida.data.form.apply.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yida.data.common.core.entity.applyForm.CoreApprovalProcess; +import com.yida.data.customForm.dto.apply.ApprovalProcessSelectPageDTO; +import com.yida.data.customForm.vo.apply.ApprovalProcessSelectPageVO; +import org.apache.ibatis.annotations.Param; + +/** + * 审核流程表 mapper + * + * @author ZYJ + * @date 2023/11/21 + */ +public interface CoreApprovalProcessMapper extends BaseMapper { + + /** + * 查询审核流程节点列表数据 + * + * @param page 分页信息 + * @param dto 查询参数 + * @return com.baomidou.mybatisplus.core.metadata.IPage + * @author ZYJ + * @date 2023/11/21 15:31 + */ + IPage listApprovalProcessPage(Page page, + @Param("dto") ApprovalProcessSelectPageDTO dto); +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/mapper/CoreApprovalProcessUserMapper.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/mapper/CoreApprovalProcessUserMapper.java new file mode 100644 index 0000000..23ff98f --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/mapper/CoreApprovalProcessUserMapper.java @@ -0,0 +1,15 @@ +package com.yida.data.form.apply.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.applyForm.CoreApprovalProcessUser; + +/** + * 审核流程人员配置表 mapper + * + * @author ZYJ + * @date 2023/11/21 + */ +public interface CoreApprovalProcessUserMapper extends BaseMapper { + + +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/mapper/CoreApprovalRemindMapper.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/mapper/CoreApprovalRemindMapper.java new file mode 100644 index 0000000..a6ac8b8 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/mapper/CoreApprovalRemindMapper.java @@ -0,0 +1,21 @@ +package com.yida.data.form.apply.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yida.data.common.core.entity.applyForm.CoreApprovalProcess; +import com.yida.data.common.core.entity.applyForm.CoreApprovalRemind; +import com.yida.data.customForm.dto.apply.ApprovalProcessSelectPageDTO; +import com.yida.data.customForm.vo.apply.ApprovalProcessSelectPageVO; +import org.apache.ibatis.annotations.Param; + +/** + * 审核提醒策略表 mapper + * + * @author ZYJ + * @date 2023/11/21 + */ +public interface CoreApprovalRemindMapper extends BaseMapper { + + +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/mapper/CoreOfficialSealMapper.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/mapper/CoreOfficialSealMapper.java new file mode 100644 index 0000000..0818833 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/mapper/CoreOfficialSealMapper.java @@ -0,0 +1,33 @@ +package com.yida.data.form.apply.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yida.data.common.core.entity.applyForm.CoreApplyForm; +import com.yida.data.common.core.entity.applyForm.CoreOfficialSeal; +import com.yida.data.customForm.dto.apply.ApplyFormSelectPageDTO; +import com.yida.data.customForm.dto.apply.OfficialSealSelectPageDTO; +import com.yida.data.customForm.vo.apply.ApplyFormSelectPageVO; +import com.yida.data.customForm.vo.apply.OfficialSealSelectPageVO; +import org.apache.ibatis.annotations.Param; + +/** + * 学校公章 mapper + * + * @author ZYJ + * @date 2023/11/17 + */ +public interface CoreOfficialSealMapper extends BaseMapper { + + /** + * 查询学校公章列表数据 + * + * @param page 分页信息 + * @param dto 查询条件 + * @return com.baomidou.mybatisplus.core.metadata.IPage + * @author ZYJ + * @date 2023/11/17 15:45 + */ + IPage listOfficialSealPage(Page page, + @Param("dto") OfficialSealSelectPageDTO dto); +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/AppApplyFormService.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/AppApplyFormService.java new file mode 100644 index 0000000..3993572 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/AppApplyFormService.java @@ -0,0 +1,85 @@ +package com.yida.data.form.apply.service; + + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.yida.data.customForm.dto.apply.*; +import com.yida.data.customForm.vo.apply.*; + +import java.util.List; + +/** + * H5--申请类表单管理 Service + * + * @author ZYJ + * @date 2023/11/15 + */ +public interface AppApplyFormService { + + /** + * 家长端查询申请表单列表数据 + * + * @param dto 查询条件 + * @return com.baomidou.mybatisplus.core.metadata.IPage + * @author ZYJ + * @date 2023/11/15 20:51 + */ + IPage listApplyFormPage(H5ApplyFormSelectPageDTO dto); + + /** + * 家长端查询已经填报的申请数据 + * + * @param dto 查询条件 + * @return com.baomidou.mybatisplus.core.metadata.IPage + * @author ZYJ + * @date 2023/11/23 14:43 + */ + IPage listMyApplyFormPage(H5ApplyFormSelectPageDTO dto); + + /** + * 家长端查询申请表单详情 + * + * @param id 表单id + * @return com.yida.data.customForm.vo.apply.ApplyFormInfoVO + * @author ZYJ + * @date 2023/11/16 15:26 + */ + ApplyFormInfoVO getApplyFormInfo(Long id); + + /** + * 家长端提交保存申请表单数据 + * + * @param dto 家长端申请表单填写信息 + * @author ZYJ + * @date 2023/11/16 16:28 + */ + void saveApplyFormData(ApplyFormDataInputDTO dto); + + /** + * 教师端我审批的申请表单 + * + * @param dto 请求参数 + * @return com.baomidou.mybatisplus.core.metadata.IPage + * @author ZYJ + * @date 2023/11/28 15:03 + */ + IPage findApprovalApplyFormDataList(SelectApprovalApplyFormDataListDTO dto); + + /** + * 获取申请表单填报数据 + * + * @param dto 表单填报数据请求信息 + * @return com.yida.data.customForm.vo.apply.ApplyFormFillUserDataVO + * @author ZYJ + * @date 2023/11/29 15:12 + */ + ApplyFormFillUserDataVO getApplyFormFillUserData(ApplyFormFillUserDataDTO dto); + + /** + * 填报数据审核 + * + * @param dto 审核信息 + * @author ZYJ + * @date 2023/11/29 16:01 + */ + void auditForm(AuditFormDTO dto); +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/ApplyFormDataService.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/ApplyFormDataService.java new file mode 100644 index 0000000..eb4c9ad --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/ApplyFormDataService.java @@ -0,0 +1,25 @@ +package com.yida.data.form.apply.service; + + +import com.yida.data.common.core.entity.applyForm.CoreApplyForm; +import com.yida.data.customForm.dto.apply.ApplyFormDataInputDTO; + +/** + * 申请类表单填报数据 Service + * + * @author ZYJ + * @date 2023/11/16 + */ +public interface ApplyFormDataService { + + + /** + * 保存申请类型表单填报信息 + * + * @param dto 家长端申请表单填写信息 + * @param applyForm 申请类型表单信息 + * @author ZYJ + * @date 2023/11/16 16:48 + */ + void saveFormData(ApplyFormDataInputDTO dto, CoreApplyForm applyForm); +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/CoreApplyFormApprovalProcessService.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/CoreApplyFormApprovalProcessService.java new file mode 100644 index 0000000..4e46b4d --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/CoreApplyFormApprovalProcessService.java @@ -0,0 +1,43 @@ +package com.yida.data.form.apply.service; + + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.applyForm.CoreApplyForm; +import com.yida.data.common.core.entity.applyForm.CoreApplyFormApprovalProcess; +import com.yida.data.common.core.entity.applyForm.CoreApprovalProcess; +import com.yida.data.customForm.dto.apply.ApplyFormSelectPageDTO; +import com.yida.data.customForm.vo.apply.ApplyFormInfoVO; +import com.yida.data.customForm.vo.apply.ApplyFormProcessSelectVO; +import com.yida.data.customForm.vo.apply.ApplyFormSelectPageVO; + +import java.util.List; + +/** + * 申请表单对应的审核流程 Service + * + * @author ZYJ + * @date 2023/11/21 + */ +public interface CoreApplyFormApprovalProcessService extends IService { + + /** + * 保存申请表单对应审核流程 + * + * @param applyFormId 申请表单id + * @param processList 表单对应审核流程节点集合 + * @author ZYJ + * @date 2023/11/22 14:01 + */ + void saveApplyFormApprovalProcess(Long applyFormId, List processList); + + /** + * 查询表单对应的审核流程数据 + * + * @param formId 表单id + * @return java.util.List + * @author ZYJ + * @date 2023/12/18 16:50 + */ + List listFormApprovalProcess(Long formId); +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/CoreApplyFormFillUserApprovalProcessRecordService.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/CoreApplyFormFillUserApprovalProcessRecordService.java new file mode 100644 index 0000000..0735316 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/CoreApplyFormFillUserApprovalProcessRecordService.java @@ -0,0 +1,15 @@ +package com.yida.data.form.apply.service; + + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.applyForm.CoreApplyFormFillUserApprovalProcessRecord; + +/** + * 填报用户表单审核流程记录表(具体的审核信息) Service + * + * @author ZYJ + * @date 2023/11/24 + */ +public interface CoreApplyFormFillUserApprovalProcessRecordService extends IService { + +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/CoreApplyFormFillUserApprovalProcessService.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/CoreApplyFormFillUserApprovalProcessService.java new file mode 100644 index 0000000..999bec9 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/CoreApplyFormFillUserApprovalProcessService.java @@ -0,0 +1,15 @@ +package com.yida.data.form.apply.service; + + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.applyForm.CoreApplyFormFillUserApprovalProcess; + +/** + * 表单填报用户对应审核流程表 Service + * + * @author ZYJ + * @date 2023/11/24 + */ +public interface CoreApplyFormFillUserApprovalProcessService extends IService { + +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/CoreApplyFormFillUserService.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/CoreApplyFormFillUserService.java new file mode 100644 index 0000000..0604a25 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/CoreApplyFormFillUserService.java @@ -0,0 +1,42 @@ +package com.yida.data.form.apply.service; + + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.applyForm.CoreApplyFormFillUser; +import com.yida.data.customForm.dto.apply.ApplyFormFillSelectPageDTO; +import com.yida.data.customForm.dto.apply.H5ApplyFormSelectPageDTO; +import com.yida.data.customForm.vo.apply.ApplyFormFillSelectPageVO; +import com.yida.data.customForm.vo.apply.MyApplyFormPageVO; + +import java.util.List; + +/** + * 申请表单填报用户信息表 Service + * + * @author ZYJ + * @date 2023/11/22 + */ +public interface CoreApplyFormFillUserService extends IService { + + /** + * 查询用户已经填报的数据 + * + * @param dto 查询条件 + * @param userIds 填报用户id集合 + * @return com.baomidou.mybatisplus.core.metadata.IPage + * @author ZYJ + * @date 2023/11/23 15:05 + */ + IPage selectUserFillForm(H5ApplyFormSelectPageDTO dto, List userIds); + + /** + * 查询申请表单填报列表数据 + * + * @param dto 表单填报数据后台列表请求类 + * @return com.baomidou.mybatisplus.core.metadata.IPage + * @author ZYJ + * @date 2023/12/7 15:05 + */ + IPage listApplyFormFillPage(ApplyFormFillSelectPageDTO dto); +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/CoreApplyFormItemChildrenService.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/CoreApplyFormItemChildrenService.java new file mode 100644 index 0000000..d14d625 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/CoreApplyFormItemChildrenService.java @@ -0,0 +1,16 @@ +package com.yida.data.form.apply.service; + + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.applyForm.CoreApplyFormItemChildren; + +/** + * 申请类型表单组件选项 Service + * + * @author ZYJ + * @date 2023/11/14 + */ +public interface CoreApplyFormItemChildrenService extends IService { + + +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/CoreApplyFormItemService.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/CoreApplyFormItemService.java new file mode 100644 index 0000000..404440e --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/CoreApplyFormItemService.java @@ -0,0 +1,16 @@ +package com.yida.data.form.apply.service; + + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.applyForm.CoreApplyFormItem; + +/** + * 申请类型表单组件 Service + * + * @author ZYJ + * @date 2023/11/14 + */ +public interface CoreApplyFormItemService extends IService { + + +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/CoreApplyFormService.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/CoreApplyFormService.java new file mode 100644 index 0000000..cac169f --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/CoreApplyFormService.java @@ -0,0 +1,66 @@ +package com.yida.data.form.apply.service; + + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.applyForm.CoreApplyForm; +import com.yida.data.customForm.dto.apply.ApplyFormSelectPageDTO; +import com.yida.data.customForm.vo.apply.ApplyFormInfoVO; +import com.yida.data.customForm.vo.apply.ApplyFormSelectPageVO; + +/** + * 申请类型表单 Service + * + * @author ZYJ + * @date 2023/11/14 + */ +public interface CoreApplyFormService extends IService { + + /** + * 查询申请表单列表数据 + * + * @param dto 申请表单后台列表请求类 + * @return com.baomidou.mybatisplus.core.metadata.IPage + * @author ZYJ + * @date 2023/11/14 16:07 + */ + IPage listApplyFormPage(ApplyFormSelectPageDTO dto); + + /** + * 查询申请表单详情 + * + * @param id 表单id + * @return com.yida.data.customForm.vo.apply.ApplyFormInfoVO + * @author ZYJ + * @date 2023/11/14 17:34 + */ + ApplyFormInfoVO getApplyFormInfo(Long id); + + /** + * 删除申请表单 + * + * @param id 表单id + * @author ZYJ + * @date 2023/11/14 20:21 + */ + void deleteApplyForm(Long id); + + /** + * 保存申请表单 + * + * @param applyForm 申请表单信息 + * @author ZYJ + * @date 2023/11/15 11:28 + */ + Long saveApplyForm(CoreApplyForm applyForm); + + /** + * 修改申请表单状态 + * + * @param formId 表单id + * @param enableStatus 状态. 0为停用,1为启用 + * @author ZYJ + * @date 2023/11/15 16:09 + */ + void updateEnableStatus(Long formId, Integer enableStatus); +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/CoreApprovalProcessService.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/CoreApprovalProcessService.java new file mode 100644 index 0000000..bd8a0f6 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/CoreApprovalProcessService.java @@ -0,0 +1,68 @@ +package com.yida.data.form.apply.service; + + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.applyForm.CoreApprovalProcess; +import com.yida.data.customForm.dto.apply.ApprovalProcessSelectPageDTO; +import com.yida.data.customForm.vo.apply.ApprovalProcessInfoVO; +import com.yida.data.customForm.vo.apply.ApprovalProcessSelectPageVO; + +import java.util.List; + +/** + * 审核流程表 Service + * + * @author ZYJ + * @date 2023/11/21 + */ +public interface CoreApprovalProcessService extends IService { + + /** + * 查询审核流程节点列表数据 + * + * @param dto 审核流程节点后台列表请求类 + * @return com.baomidou.mybatisplus.core.metadata.IPage + * @author ZYJ + * @date 2023/11/21 15:12 + */ + IPage listApprovalProcessPage(ApprovalProcessSelectPageDTO dto); + + /** + * 查询审核流程节点详情 + * + * @param id 审核流程节点id + * @return com.yida.data.customForm.vo.apply.ApprovalProcessInfoVO + * @author ZYJ + * @date 2023/11/21 16:03 + */ + ApprovalProcessInfoVO getApprovalProcessInfo(Long id); + + /** + * 删除审核流程节点 + * + * @param id 审核流程节点id + * @author ZYJ + * @date 2023/11/21 16:35 + */ + void deleteApprovalProcess(Long id); + + /** + * 保存审核流程节点 + * + * @param process 保存的节点信息 + * @author ZYJ + * @date 2023/11/21 16:51 + */ + void saveApprovalProcess(CoreApprovalProcess process); + + /** + * 查询所有审核流程节点数据(排除当前表单包含的数据) + * + * @param formId 表单id + * @return java.util.List + * @author ZYJ + * @date 2023/12/19 14:17 + */ + List listApprovalProcess(Long formId); +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/CoreApprovalProcessUserService.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/CoreApprovalProcessUserService.java new file mode 100644 index 0000000..3bb0139 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/CoreApprovalProcessUserService.java @@ -0,0 +1,16 @@ +package com.yida.data.form.apply.service; + + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.applyForm.CoreApprovalProcess; +import com.yida.data.common.core.entity.applyForm.CoreApprovalProcessUser; + +/** + * 审核流程人员配置表 Service + * + * @author ZYJ + * @date 2023/11/21 + */ +public interface CoreApprovalProcessUserService extends IService { + +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/CoreApprovalRemindService.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/CoreApprovalRemindService.java new file mode 100644 index 0000000..c2d3388 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/CoreApprovalRemindService.java @@ -0,0 +1,34 @@ +package com.yida.data.form.apply.service; + + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.applyForm.CoreApprovalRemind; +import com.yida.data.customForm.dto.apply.ApprovalRemindDTO; +import com.yida.data.customForm.vo.apply.ApprovalRemindInfoVO; + +/** + * 审核提醒策略表 Service + * + * @author ZYJ + * @date 2023/11/23 + */ +public interface CoreApprovalRemindService extends IService { + + /** + * 查询审核提醒策略详情 + * + * @return com.yida.data.customForm.vo.apply.ApprovalRemindInfoVO + * @author ZYJ + * @date 2023/12/21 15:19 + */ + ApprovalRemindInfoVO getApprovalRemindInfo(); + + /** + * 保存审核提醒策略 + * + * @param dto 保存审核提醒策略请求类 + * @author ZYJ + * @date 2023/12/21 15:26 + */ + void saveApprovalRemind(ApprovalRemindDTO dto); +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/CoreOfficialSealService.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/CoreOfficialSealService.java new file mode 100644 index 0000000..5e503ad --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/CoreOfficialSealService.java @@ -0,0 +1,67 @@ +package com.yida.data.form.apply.service; + + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.applyForm.CoreOfficialSeal; +import com.yida.data.customForm.dto.apply.OfficialSealSaveDTO; +import com.yida.data.customForm.dto.apply.OfficialSealSelectPageDTO; +import com.yida.data.customForm.vo.apply.OfficialSealInfoVO; +import com.yida.data.customForm.vo.apply.OfficialSealSelectPageVO; + +/** + * 学校公章 Service + * + * @author ZYJ + * @date 2023/11/17 + */ +public interface CoreOfficialSealService extends IService { + + /** + * 查询学校公章列表数据 + * + * @param dto 查询条件 + * @return com.baomidou.mybatisplus.core.metadata.IPage + * @author ZYJ + * @date 2023/11/17 15:44 + */ + IPage listOfficialSealPage(OfficialSealSelectPageDTO dto); + + /** + * 查询公章详情 + * + * @param id 公章id + * @return com.yida.data.customForm.vo.apply.OfficialSealInfoVO + * @author ZYJ + * @date 2023/11/17 16:48 + */ + OfficialSealInfoVO getOfficialSealInfo(Long id); + + /** + * 删除公章 + * + * @param id 公章id + * @author ZYJ + * @date 2023/11/17 17:07 + */ + void deleteOfficialSeal(Long id); + + /** + * 保存公章 + * + * @param dto 保存的公章信息 + * @author ZYJ + * @date 2023/11/17 17:32 + */ + void saveOfficialSeal(OfficialSealSaveDTO dto); + + /** + * 修改公章状态 + * + * @param id 表单id + * @param enableStatus 状态. 0为停用,1为启用 + * @author ZYJ + * @date 2023/11/17 17:35 + */ + void updateEnableStatus(Long id, Integer enableStatus); +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/SendNoticeService.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/SendNoticeService.java new file mode 100644 index 0000000..ea6631e --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/SendNoticeService.java @@ -0,0 +1,39 @@ +package com.yida.data.form.apply.service; + +import com.yida.data.common.core.entity.system.Dept; +import com.yida.data.common.core.entity.user.EduStudent; +import com.yida.data.customForm.dto.apply.SendParentNoticeDTO; +import com.yida.data.customForm.dto.apply.SendStaffNoticeDTO; +import org.springframework.scheduling.annotation.Async; + +import java.time.LocalDateTime; + +/** + * 发送消息 Service + * + * @author ZYJ + * @date 2023/11/30 + */ +public interface SendNoticeService { + + /** + * 发送申请表单职工企业微信端模板消息 + * + * @param dto 发送职工表单审核模板消息 数据封装类 + * @param isFirst 是否为初次审核 0否,1是 + * @author ZYJ + * @date 2023/11/28 14:09 + */ + @Async + void sendStaffNotice(SendStaffNoticeDTO dto, Integer isFirst); + + /** + * 发送申请表单家长企业微信端模板消息 + * + * @param dto 消息信息 + * @author ZYJ + * @date 2023/11/30 17:07 + */ + @Async + void sendParentNotice(SendParentNoticeDTO dto); +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/impl/AppApplyFormServiceImpl.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/impl/AppApplyFormServiceImpl.java new file mode 100644 index 0000000..5b0499e --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/impl/AppApplyFormServiceImpl.java @@ -0,0 +1,532 @@ +package com.yida.data.form.apply.service.impl; + +import cc.mrbird.febs.common.redis.service.RedisService; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yida.data.common.core.entity.applyForm.*; +import com.yida.data.common.core.entity.constant.CachePrefixConstant; +import com.yida.data.common.core.entity.system.Dept; +import com.yida.data.common.core.entity.user.EduStaff; +import com.yida.data.common.core.entity.user.EduStudent; +import com.yida.data.common.core.entity.user.EduUserDept; +import com.yida.data.common.core.enums.EnableStatusEnum; +import com.yida.data.common.core.enums.RoleName; +import com.yida.data.common.core.enums.leave.ApprovalResultEnum; +import com.yida.data.common.core.enums.leave.AuditModeEnum; +import com.yida.data.common.core.exception.FebsException; +import com.yida.data.common.service.CommonService; +import com.yida.data.customForm.dto.apply.*; +import com.yida.data.customForm.vo.apply.*; +import com.yida.data.form.apply.mapper.ApplyFormDataMapper; +import com.yida.data.form.apply.mapper.CoreApplyFormFillUserMapper; +import com.yida.data.form.apply.service.*; +import com.yida.data.user.dto.ListStaffDTO; +import com.yida.data.user.feign.RemoteStaffService; +import com.yida.data.user.feign.RemoteStudentService; +import com.yida.data.user.feign.RemoteUserDeptService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; + +/** + * H5--申请类表单管理 Service + * + * @author ZYJ + * @date 2023/11/15 20:38 + */ +@Slf4j +@Service +@RequiredArgsConstructor +@Transactional(rollbackFor = Exception.class) +public class AppApplyFormServiceImpl implements AppApplyFormService { + + private final SendNoticeService sendNoticeService; + private final ApplyFormDataService applyFormDataService; + private final CoreApplyFormService coreApplyFormService; + private final CoreApplyFormItemService coreApplyFormItemService; + private final CoreApprovalProcessService coreApprovalProcessService; + private final CoreApplyFormFillUserService coreApplyFormFillUserService; + private final CoreApplyFormItemChildrenService coreApplyFormItemChildrenService; + private final CoreApplyFormFillUserApprovalProcessService coreApplyFormFillUserApprovalProcessService; + private final CoreApplyFormFillUserApprovalProcessRecordService coreApplyFormFillUserApprovalProcessRecordService; + + private final ApplyFormDataMapper applyFormDataMapper; + private final CoreApplyFormFillUserMapper coreApplyFormFillUserMapper; + + private final RemoteStaffService remoteStaffService; + private final RemoteStudentService remoteStudentService; + private final RemoteUserDeptService remoteUserDeptService; + + private final RedisService redisService; + private final CommonService commonService; + + @Override + public IPage listApplyFormPage(H5ApplyFormSelectPageDTO dto) { + ApplyFormSelectPageDTO selectPageDTO = new ApplyFormSelectPageDTO(); + selectPageDTO.setDeptId(dto.getDeptId()); + selectPageDTO.setStatus(EnableStatusEnum.ENABLE_STATUS.getStatus()); + selectPageDTO.setPageNum(dto.getPageNum()); + selectPageDTO.setPageSize(dto.getPageSize()); + // 查询表单信息 + return coreApplyFormService.listApplyFormPage(selectPageDTO); + } + + @Override + public IPage listMyApplyFormPage(H5ApplyFormSelectPageDTO dto) { + // 查询学生列表 + List studentList = remoteStudentService.listStudentByParent(dto.getParentId()).getData(); + if (CollUtil.isEmpty(studentList)) { + return new Page<>(); + } + Map> studentListMap = studentList.stream().collect(Collectors.groupingBy(EduStudent::getId)); + // 查询用户已经填报的数据 + List studentIds = studentList.stream().map(EduStudent::getId).collect(Collectors.toList()); + IPage page = coreApplyFormFillUserService.selectUserFillForm(dto, studentIds); + page.getRecords().forEach(myApplyFormPageVO -> { + // 处理学生信息 + EduStudent eduStudent = studentListMap.get(myApplyFormPageVO.getUserId()).get(0); + myApplyFormPageVO.setUserName(eduStudent.getStuName()); + myApplyFormPageVO.setUserPicUrl(eduStudent.getAvatar()); + }); + return page; + } + + @Override + public ApplyFormInfoVO getApplyFormInfo(Long id) { + return coreApplyFormService.getApplyFormInfo(id); + } + + @Override + public void saveApplyFormData(ApplyFormDataInputDTO dto) { + CoreApplyForm applyForm = coreApplyFormService.getById(dto.getFormId()); + if (Objects.isNull(applyForm)) { + throw new FebsException("申请表信息异常"); + } + applyFormDataService.saveFormData(dto, applyForm); + } + + @Override + public IPage findApprovalApplyFormDataList(SelectApprovalApplyFormDataListDTO dto) { + LocalDateTime preDateTime = LocalDate.now().minusMonths(1).atTime(23, 59, 59); + // 职工参与审核的填报用户信息 + List approvalUserFormList = coreApplyFormFillUserMapper.findApprovalFormDataFillUserList(dto, preDateTime); + if (CollUtil.isEmpty(approvalUserFormList)) { + return new Page<>(); + } + // 如果表单已通过或者未通过,表示已处理了 + List dealEdList = approvalUserFormList.stream() + .filter(e -> ObjectUtil.equals(ApprovalResultEnum.AUDIT_PASS.getResult(), e.getExamineStatus()) + || ObjectUtil.equals(ApprovalResultEnum.AUDIT_NO.getResult(), e.getExamineStatus())) + .collect(Collectors.toList()); + List dealEdIdList = dealEdList.stream().map(CoreApplyFormFillUser::getId).collect(Collectors.toList()); + // 待处理/正在处理的请假 + List dealIngList = approvalUserFormList.stream() + .filter(e -> ObjectUtil.equals(ApprovalResultEnum.AUDIT.getResult(), e.getExamineStatus()) + || ObjectUtil.equals(ApprovalResultEnum.AUDIT_ING.getResult(), e.getExamineStatus())) + .collect(Collectors.toList()); + List dealIngIdList = new ArrayList<>(); + + for (CoreApplyFormFillUser fillUser : dealIngList) { + // 待审核 + List userApprovalProcessList = coreApplyFormFillUserApprovalProcessService + .list(Wrappers.lambdaQuery(new CoreApplyFormFillUserApprovalProcess()) + .eq(CoreApplyFormFillUserApprovalProcess::getFillUserId, fillUser.getId()) + .eq(CoreApplyFormFillUserApprovalProcess::getExamineStatus, ApprovalResultEnum.AUDIT.getResult()) + .orderByAsc(CoreApplyFormFillUserApprovalProcess::getSort)); + if (CollUtil.isEmpty(userApprovalProcessList)) { + continue; + } + // 下一级审核 + CoreApplyFormFillUserApprovalProcess userApprovalProcess = userApprovalProcessList.get(0); + List recordList = coreApplyFormFillUserApprovalProcessRecordService + .list(Wrappers.lambdaQuery(new CoreApplyFormFillUserApprovalProcessRecord()) + .eq(CoreApplyFormFillUserApprovalProcessRecord::getFillUserId, fillUser.getId()) + .eq(CoreApplyFormFillUserApprovalProcessRecord::getUserProcessId, userApprovalProcess.getId())); + if (recordList.stream().map(CoreApplyFormFillUserApprovalProcessRecord::getApprovalId) + .collect(Collectors.toList()).contains(dto.getUserId())) { + dealIngIdList.add(fillUser.getId()); + } + // 已审核通过 + List userApprovalProcessPassList = coreApplyFormFillUserApprovalProcessService + .list(Wrappers.lambdaQuery(new CoreApplyFormFillUserApprovalProcess()) + .eq(CoreApplyFormFillUserApprovalProcess::getFillUserId, fillUser.getId()) + .eq(CoreApplyFormFillUserApprovalProcess::getExamineStatus, ApprovalResultEnum.AUDIT_PASS.getResult()) + .orderByAsc(CoreApplyFormFillUserApprovalProcess::getSort)); + if (CollUtil.isEmpty(userApprovalProcessPassList)) { + continue; + } + List passRecordList = coreApplyFormFillUserApprovalProcessRecordService + .list(Wrappers.lambdaQuery(new CoreApplyFormFillUserApprovalProcessRecord()) + .eq(CoreApplyFormFillUserApprovalProcessRecord::getFillUserId, fillUser.getId()) + .in(CoreApplyFormFillUserApprovalProcessRecord::getUserProcessId, + userApprovalProcessPassList.stream().map(CoreApplyFormFillUserApprovalProcess::getId).collect( + Collectors.toList()))); + if (passRecordList.stream().map(CoreApplyFormFillUserApprovalProcessRecord::getApprovalId) + .collect(Collectors.toList()).contains(dto.getUserId())) { + dealEdIdList.add(fillUser.getId()); + } + } + + if (CollUtil.isEmpty(dealEdIdList)) { + dealEdIdList.add(-1L); + } + + if (CollUtil.isEmpty(dealIngIdList)) { + dealIngIdList.add(-1L); + } + ApprovalFillUserFormPageDTO pageDTO = new ApprovalFillUserFormPageDTO(); + pageDTO.setPageNum(dto.getPageNum()); + pageDTO.setPageSize(dto.getPageSize()); + pageDTO.setSchoolId(dto.getSchoolId()); + pageDTO.setFillUserIds( + ObjectUtil.equals(ApprovalResultEnum.AUDIT.getResult(), dto.getCurrentUserStatus()) ? dealIngIdList : dealEdIdList); + // 查询教师审核的表单分页数据 + IPage page = coreApplyFormFillUserMapper.selectApprovalUserFillForm(pageDTO.toPage(), pageDTO); + for (ApprovalApplyFormPageVO record : page.getRecords()) { + // 学生 + EduStudent student = commonService.getStudentById(record.getUserId()); + if (ObjectUtil.isNull(student)) { + log.error("学生【{}】不存在,无法处理申请表单数据", record.getUserId().toString()); + continue; + } + EduUserDept userGreadeDept = (EduUserDept) redisService + .hget(CachePrefixConstant.USER_DEPT_DATA, student.getGradeId().toString()); + + EduUserDept userClassDept = (EduUserDept) redisService + .hget(CachePrefixConstant.USER_DEPT_DATA, student.getClassId().toString()); + + if (ObjectUtil.isNull(userGreadeDept)) { + userGreadeDept = remoteUserDeptService.getByDeptId(student.getGradeId()).getData(); + if (ObjectUtil.isNotNull(userGreadeDept)) { + redisService.hset(CachePrefixConstant.USER_DEPT_DATA, student.getGradeId().toString(), userGreadeDept); + } + } + + if (ObjectUtil.isNull(userClassDept)) { + userClassDept = remoteUserDeptService.getByDeptId(student.getClassId()).getData(); + if (ObjectUtil.isNotNull(userClassDept)) { + redisService.hset(CachePrefixConstant.USER_DEPT_DATA, student.getClassId().toString(), userClassDept); + } + } + if (ObjectUtil.isNull(userGreadeDept) && ObjectUtil.isNull(userGreadeDept)) { + record.setUserDeptName("未知班级"); + } else { + record.setUserDeptName( + (ObjectUtil.isNull(userGreadeDept) ? "" : userGreadeDept.getDeptName()) + (ObjectUtil + .isNull(userClassDept) ? "" : userClassDept.getDeptName())); + } + record.setUserPicUrl(student.getAvatar()); + } + return page; + } + + @Override + public ApplyFormFillUserDataVO getApplyFormFillUserData(ApplyFormFillUserDataDTO dto) { + // 返回信息 + ApplyFormFillUserDataVO vo = new ApplyFormFillUserDataVO(); + // 查询填报用户信息 + CoreApplyFormFillUser fillUser = coreApplyFormFillUserService.getById(dto.getFillUserId()); + vo.setFillUserId(fillUser.getId()); + // 表单信息 + CoreApplyForm applyForm = coreApplyFormService.getById(dto.getApplyFormId()); + BeanUtils.copyProperties(applyForm, vo); + // 查询组件信息 + List itemList = coreApplyFormItemService.list(Wrappers.query().lambda() + .eq(CoreApplyFormItem::getFormId, dto.getApplyFormId())); + itemList.forEach(item -> { + // 查询组件选项信息 + List childrenList = + coreApplyFormItemChildrenService.list(Wrappers.query().lambda() + .eq(CoreApplyFormItemChildren::getFormItemId, item.getId())); + item.setChildrenList(childrenList); + }); + vo.setItemList(itemList); + // 查询对应的填报信息 + Map parameterMap = new HashMap<>(); + String sql = "select * from " + applyForm.getTableName() + " where id = #{parameterMap.id}"; + parameterMap.put("id", fillUser.getApplyFormDataId()); + Map fillUserData = applyFormDataMapper.findFillUserData(sql, parameterMap); + vo.setFillUserData(fillUserData); + // 查询填报用户对应的审核流程 + List userApprovalProcessList = coreApplyFormFillUserApprovalProcessService + .list(Wrappers.lambdaQuery(new CoreApplyFormFillUserApprovalProcess()) + .eq(CoreApplyFormFillUserApprovalProcess::getFillUserId, fillUser.getId()) + .orderByAsc(CoreApplyFormFillUserApprovalProcess::getSort)); + userApprovalProcessList.forEach(userApprovalProcess -> { + List recordList = coreApplyFormFillUserApprovalProcessRecordService + .list(Wrappers.lambdaQuery(new CoreApplyFormFillUserApprovalProcessRecord()) + .eq(CoreApplyFormFillUserApprovalProcessRecord::getFillUserId, fillUser.getId()) + .eq(CoreApplyFormFillUserApprovalProcessRecord::getUserProcessId, userApprovalProcess.getId())); + // 查询审核人信息 + ListStaffDTO staffDTO = new ListStaffDTO(); + staffDTO.setIds(recordList.stream().map(CoreApplyFormFillUserApprovalProcessRecord::getApprovalId) + .collect(Collectors.toList())); + for (CoreApplyFormFillUserApprovalProcessRecord record : recordList) { + EduStaff staff = (EduStaff) redisService.hget(CachePrefixConstant.STAFF_DATA, record.getApprovalId().toString()); + if (Objects.isNull(staff)) { + staff = remoteStaffService.getStaff(record.getApprovalId()).getData(); + if (Objects.nonNull(staff)) { + redisService + .hset(CachePrefixConstant.STAFF_DATA, record.getApprovalId().toString(), staff); + } + } + if (Objects.nonNull(staff)) { + record.setApprovalInfo(staff); + } + } + userApprovalProcess.setRecordList(recordList); + }); + vo.setUserApprovalProcessList(userApprovalProcessList); + // 学生信息 + EduStudent student = (EduStudent) redisService + .hget(CachePrefixConstant.STUDENT_DATA, fillUser.getUserId().toString()); + if (Objects.isNull(student)) { + student = remoteStudentService.getStudentNoPermission(fillUser.getUserId()).getData(); + if (ObjectUtil.isNotNull(student)) { + redisService.hset(CachePrefixConstant.STUDENT_DATA, fillUser.getUserId().toString(), student); + } + } + vo.setStudent(student); + return vo; + } + + @Override + public void auditForm(AuditFormDTO dto) { + // 填报信息主体 + CoreApplyFormFillUser fillUser = coreApplyFormFillUserService.getById(dto.getFillUserId()); + // 查询学生 + EduStudent student = (EduStudent) redisService + .hget(CachePrefixConstant.STUDENT_DATA, fillUser.getUserId().toString()); + if (Objects.isNull(student)) { + student = remoteStudentService.getStudentNoPermission(fillUser.getUserId()).getData(); + if (student == null) { + throw new FebsException("学生信息错误,请联系管理员"); + } else { + redisService.hset(CachePrefixConstant.STUDENT_DATA, fillUser.getUserId().toString(), student); + } + } + // 查询学校信息 + Dept school = commonService.getDept(student.getSchoolId()); + // 封装消息发送对象 + SendStaffNoticeDTO sendStaffNoticeDTO = new SendStaffNoticeDTO(); + sendStaffNoticeDTO.setSchoolId(student.getSchoolId()); + sendStaffNoticeDTO.setSchoolType(school.getSchoolType()); + sendStaffNoticeDTO.setCreateTime(LocalDateTime.now()); + sendStaffNoticeDTO.setUserName(student.getStuName()); + sendStaffNoticeDTO.setUserDeptName( + String.join("/", student.getCampusName(), student.getGradeName(), student.getClassName())); + sendStaffNoticeDTO.setFormId(fillUser.getApplyFormId()); + sendStaffNoticeDTO.setFillUserId(fillUser.getId()); + sendStaffNoticeDTO.setUserId(student.getId()); + // 判断审核权限 + List list = coreApplyFormFillUserApprovalProcessRecordService.list( + Wrappers.lambdaQuery(new CoreApplyFormFillUserApprovalProcessRecord()) + .eq(CoreApplyFormFillUserApprovalProcessRecord::getFillUserId, fillUser.getId()) + .eq(CoreApplyFormFillUserApprovalProcessRecord::getApprovalId, dto.getApprovalId()) + .orderByAsc(CoreApplyFormFillUserApprovalProcessRecord::getSort)); + // 获取当前审核数据 + CoreApplyFormFillUserApprovalProcessRecord processRecord = new CoreApplyFormFillUserApprovalProcessRecord(); + for (CoreApplyFormFillUserApprovalProcessRecord record : list) { + if (record.getApprovalResult() == 0) { + processRecord = record; + break; + } + } + // 保存审核流程记录 + processRecord.setApprovalResult(dto.getApprovalResult() == 0 ? 2 : 1); + processRecord.setApprovalReason(dto.getApprovalReason()); + processRecord.setSignPic(dto.getSignPic()); + processRecord.setAuditTime(LocalDateTime.now()); + processRecord.setUpdateDate(LocalDateTime.now()); + coreApplyFormFillUserApprovalProcessRecordService.updateById(processRecord); + // 查询对应的用户审核流程 + CoreApplyFormFillUserApprovalProcess userApprovalProcess = + coreApplyFormFillUserApprovalProcessService.getById(processRecord.getUserProcessId()); + // 查询审核流程具体信息 + CoreApprovalProcess approvalProcess = coreApprovalProcessService.getById(userApprovalProcess.getProcessId()); + + sendStaffNoticeDTO.setPreStaffName(processRecord.getApprovalName()); + // 查询角色名称 + List roleNames = new ArrayList<>(); + List teacherRoleTypeList = remoteStaffService + .listStaffRolesByStaffId(processRecord.getApprovalId()).getData(); + if (teacherRoleTypeList.contains(1)) { + roleNames.add(RoleName.CAMPUS.getName()); + } else if (teacherRoleTypeList.contains(2)) { + roleNames.add(RoleName.GRADE.getName()); + } else if (teacherRoleTypeList.contains(3)) { + roleNames.add(RoleName.MASTER.getName()); + } else if (teacherRoleTypeList.contains(4)) { + roleNames.add(RoleName.COURSE.getName()); + } else if (teacherRoleTypeList.contains(5)) { + roleNames.add(RoleName.SECTION.getName()); + } else { + roleNames.add(RoleName.TEACHER.getName()); + } + sendStaffNoticeDTO.setPreStaffRoleName(StrUtil.join("/", roleNames)); + // 或审 + if (ObjectUtil.equals(AuditModeEnum.OR_AUDIT.getMode(), approvalProcess.getApprovalType())) { + userApprovalProcess.setExamineStatus(dto.getApprovalResult() == 0 ? 2 : 1); + userApprovalProcess.setAuditTime(LocalDateTime.now()); + // 查询用户下一个审核流程 + CoreApplyFormFillUserApprovalProcess nextUserApprovalProcess = coreApplyFormFillUserApprovalProcessService + .getOne(Wrappers.lambdaQuery(new CoreApplyFormFillUserApprovalProcess()) + .eq(CoreApplyFormFillUserApprovalProcess::getFillUserId, fillUser.getId()) + .eq(CoreApplyFormFillUserApprovalProcess::getSort, userApprovalProcess.getSort() + 1)); + // 用户填报信息 + CoreApplyFormFillUser saveFillUser = new CoreApplyFormFillUser(); + saveFillUser.setId(fillUser.getId()); + // 无下一个用户审核流程则表示审核完毕 + if (Objects.isNull(nextUserApprovalProcess)) { + // 审核通过 + if (ObjectUtil.equals(ApprovalResultEnum.AUDIT_PASS.getResult(), dto.getApprovalResult())) { + saveFillUser.setExamineStatus(ApprovalResultEnum.AUDIT_PASS.getResult()); + } else { + // 审核不通过 + saveFillUser.setExamineStatus(ApprovalResultEnum.AUDIT_NO.getResult()); + saveFillUser.setRefuseReason(dto.getRefuseReason()); + } + saveFillUser.setAuditTime(LocalDateTime.now()); + } else { + // 有下一个用户审核流程 + if (ObjectUtil.equals(ApprovalResultEnum.AUDIT_PASS.getResult(), dto.getApprovalResult())) { + // 当前节点审核通过, 用户修改为审核中 + saveFillUser.setExamineStatus(ApprovalResultEnum.AUDIT_ING.getResult()); + // 查询下一个审核节点的审核人信息 + List nextAppUser = coreApplyFormFillUserApprovalProcessRecordService.list( + Wrappers.lambdaQuery(new CoreApplyFormFillUserApprovalProcessRecord()) + .eq(CoreApplyFormFillUserApprovalProcessRecord::getUserProcessId, nextUserApprovalProcess.getId())); + nextAppUser.forEach(record -> { + // 发送提示审核消息 + EduStaff staff = remoteStaffService.getStaff(record.getApprovalId()).getData(); + sendStaffNoticeDTO.setStaffWxId(staff.getWxId()); + sendStaffNoticeDTO.setStaffName(staff.getName()); + sendStaffNoticeDTO.setSchoolType(school.getSchoolType()); + sendNoticeService.sendStaffNotice(sendStaffNoticeDTO, 0); + }); + } else { + // 审核不通过 + saveFillUser.setExamineStatus(ApprovalResultEnum.AUDIT_NO.getResult()); + saveFillUser.setRefuseReason(dto.getRefuseReason()); + saveFillUser.setAuditTime(LocalDateTime.now()); + } + } + coreApplyFormFillUserService.updateById(saveFillUser); + // 给家长发送审核结果信息 + if (ObjectUtil.equals(ApprovalResultEnum.AUDIT_PASS.getResult(), saveFillUser.getExamineStatus()) + || ObjectUtil.equals(ApprovalResultEnum.AUDIT_NO.getResult(), saveFillUser.getExamineStatus())) { + CoreApplyFormFillUser user = coreApplyFormFillUserService.getById(saveFillUser.getId()); + sendNoticeService.sendParentNotice( + SendParentNoticeDTO.builder() + .school(school) + .student(student) + .examineStatus(saveFillUser.getExamineStatus()) + .createTime(user.getCreateDate()) + .formId(fillUser.getApplyFormId()) + .fillUserId(user.getId()) + .build() + ); + } + } else { + // 会审 + // 本次审核流程对应的全部审核人员 + List recordList = coreApplyFormFillUserApprovalProcessRecordService + .list(Wrappers.lambdaQuery(new CoreApplyFormFillUserApprovalProcessRecord()) + .eq(CoreApplyFormFillUserApprovalProcessRecord::getUserProcessId, processRecord.getUserProcessId()) + .eq(CoreApplyFormFillUserApprovalProcessRecord::getFillUserId, fillUser.getId())); + // 已通过的人员 + List passRecordList = recordList.stream() + .filter(x -> ObjectUtil.equals(ApprovalResultEnum.AUDIT_PASS.getResult(), x.getApprovalResult())) + .collect(Collectors.toList()); + // 用户填报信息 + CoreApplyFormFillUser saveFillUser = new CoreApplyFormFillUser(); + saveFillUser.setId(fillUser.getId()); + // 审核通过 + if (ObjectUtil.equals(ApprovalResultEnum.AUDIT_PASS.getResult(), dto.getApprovalResult())) { + // 本次流程全部审核通过 + if (recordList.size() == passRecordList.size()) { + // 查询用户下一个审核流程 + CoreApplyFormFillUserApprovalProcess nextUserApprovalProcess = coreApplyFormFillUserApprovalProcessService + .getOne(Wrappers.lambdaQuery(new CoreApplyFormFillUserApprovalProcess()) + .eq(CoreApplyFormFillUserApprovalProcess::getFillUserId, fillUser.getId()) + .eq(CoreApplyFormFillUserApprovalProcess::getSort, userApprovalProcess.getSort() + 1)); + // 无下一个用户审核流程则表示审核完毕 + if (Objects.isNull(nextUserApprovalProcess)) { + saveFillUser.setExamineStatus(ApprovalResultEnum.AUDIT_PASS.getResult()); + saveFillUser.setAuditTime(LocalDateTime.now()); + // 给家长发送审核结果信息 + CoreApplyFormFillUser user = coreApplyFormFillUserService.getById(saveFillUser.getId()); + sendNoticeService.sendParentNotice( + SendParentNoticeDTO.builder() + .school(school) + .student(student) + .examineStatus(saveFillUser.getExamineStatus()) + .createTime(user.getCreateDate()) + .formId(fillUser.getApplyFormId()) + .fillUserId(user.getId()) + .build() + ); + } else { + // 有下一个用户审核流程 + // 当前节点审核通过, 用户修改为审核中 + saveFillUser.setExamineStatus(ApprovalResultEnum.AUDIT_ING.getResult()); + // 查询下一个审核节点的审核人信息 + List nextAppUser = coreApplyFormFillUserApprovalProcessRecordService.list( + Wrappers.lambdaQuery(new CoreApplyFormFillUserApprovalProcessRecord()) + .eq(CoreApplyFormFillUserApprovalProcessRecord::getUserProcessId, nextUserApprovalProcess.getId())); + nextAppUser.forEach(record -> { + // 发送提示审核消息 + EduStaff staff = remoteStaffService.getStaff(record.getApprovalId()).getData(); + sendStaffNoticeDTO.setStaffWxId(staff.getWxId()); + sendStaffNoticeDTO.setStaffName(staff.getName()); + sendStaffNoticeDTO.setSchoolType(school.getSchoolType()); + sendNoticeService.sendStaffNotice(sendStaffNoticeDTO, 0); + }); + } + // 当前用户审核流程修改为通过 + userApprovalProcess.setExamineStatus(ApprovalResultEnum.AUDIT_PASS.getResult()); + userApprovalProcess.setAuditTime(LocalDateTime.now()); + } else { + // 本次流程还有未审核通过的人员 + userApprovalProcess.setExamineStatus(ApprovalResultEnum.AUDIT_ING.getResult()); //当前流程审核中 + userApprovalProcess.setAuditTime(LocalDateTime.now()); + // 当前人员修改为审核中 + saveFillUser.setExamineStatus(ApprovalResultEnum.AUDIT_ING.getResult()); + } + } else { + // 审核不通过 + saveFillUser.setExamineStatus(ApprovalResultEnum.AUDIT_NO.getResult()); + saveFillUser.setRefuseReason(dto.getRefuseReason()); + saveFillUser.setAuditTime(LocalDateTime.now()); + // 当前用户审核流程修改为不通过 + userApprovalProcess.setExamineStatus(ApprovalResultEnum.AUDIT_NO.getResult()); + userApprovalProcess.setAuditTime(LocalDateTime.now()); + // 给家长发送审核结果信息 + CoreApplyFormFillUser user = coreApplyFormFillUserService.getById(saveFillUser.getId()); + sendNoticeService.sendParentNotice( + SendParentNoticeDTO.builder() + .school(school) + .student(student) + .examineStatus(saveFillUser.getExamineStatus()) + .createTime(user.getCreateDate()) + .formId(fillUser.getApplyFormId()) + .fillUserId(user.getId()) + .build() + ); + } + coreApplyFormFillUserService.updateById(saveFillUser); + } + coreApplyFormFillUserApprovalProcessService.updateById(userApprovalProcess); + } +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/impl/ApplyFormDataServiceImpl.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/impl/ApplyFormDataServiceImpl.java new file mode 100644 index 0000000..2adaeeb --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/impl/ApplyFormDataServiceImpl.java @@ -0,0 +1,214 @@ +package com.yida.data.form.apply.service.impl; + +import cc.mrbird.febs.common.redis.service.RedisService; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.yida.data.common.core.entity.applyForm.*; +import com.yida.data.common.core.entity.constant.CachePrefixConstant; +import com.yida.data.common.core.entity.system.Dept; +import com.yida.data.common.core.entity.system.enums.SchoolNatureEnum; +import com.yida.data.common.core.entity.user.EduStaff; +import com.yida.data.common.core.entity.user.EduStudent; +import com.yida.data.common.core.enums.ApprovalRoleTypeEnum; +import com.yida.data.common.core.enums.AuditStatusEnum; +import com.yida.data.common.core.exception.FebsException; +import com.yida.data.common.service.CommonService; +import com.yida.data.customForm.dto.apply.ApplyFormDataInputDTO; +import com.yida.data.customForm.dto.apply.SendStaffNoticeDTO; +import com.yida.data.form.apply.mapper.ApplyFormDataMapper; +import com.yida.data.form.apply.mapper.CoreApplyFormApprovalProcessMapper; +import com.yida.data.form.apply.service.*; +import com.yida.data.user.feign.RemoteStaffService; +import com.yida.data.user.feign.RemoteStudentService; +import com.yida.data.user.feign.RemoteTeacherService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.*; + +/** + * 申请类表单填报数据 Service + * + * @author ZYJ + * @date 2023/11/16 + */ +@Slf4j +@Service +@RequiredArgsConstructor +@Transactional(rollbackFor = Exception.class) +public class ApplyFormDataServiceImpl implements ApplyFormDataService { + + private final SendNoticeService sendNoticeService; + private final CoreApplyFormFillUserService coreApplyFormFillUserService; + private final CoreApprovalProcessUserService coreApprovalProcessUserService; + private final CoreApplyFormFillUserApprovalProcessService coreApplyFormFillUserApprovalProcessService; + private final CoreApplyFormFillUserApprovalProcessRecordService coreApplyFormFillUserApprovalProcessRecordService; + + private final ApplyFormDataMapper applyFormDataMapper; + private final CoreApplyFormApprovalProcessMapper coreApplyFormApprovalProcessMapper; + + private final RemoteStaffService remoteStaffService; + private final RemoteTeacherService remoteTeacherService; + private final RemoteStudentService remoteStudentService; + + private final RedisService redisService; + private final CommonService commonService; + + @Override + public void saveFormData(ApplyFormDataInputDTO dto, CoreApplyForm applyForm) { + + // 查询学生 + EduStudent student = (EduStudent) redisService + .hget(CachePrefixConstant.STUDENT_DATA, dto.getUserId().toString()); + if (Objects.isNull(student)) { + student = remoteStudentService.getStudentNoPermission(dto.getUserId()).getData(); + if (student == null) { + throw new FebsException("学生信息错误,请联系管理员"); + } else { + redisService.hset(CachePrefixConstant.STUDENT_DATA, dto.getUserId().toString(), student); + } + } + // 查询学校信息 + Dept school = commonService.getDept(applyForm.getSchoolId()); + // 封装消息发送对象 + SendStaffNoticeDTO sendStaffNoticeDTO = new SendStaffNoticeDTO(); + sendStaffNoticeDTO.setSchoolId(applyForm.getSchoolId()); + sendStaffNoticeDTO.setSchoolType(school.getSchoolType()); + sendStaffNoticeDTO.setCreateTime(LocalDateTime.now()); + sendStaffNoticeDTO.setUserName(student.getStuName()); + sendStaffNoticeDTO.setUserDeptName( + String.join("/", student.getCampusName(), student.getGradeName(), student.getClassName())); + sendStaffNoticeDTO.setFormId(dto.getFormId()); + sendStaffNoticeDTO.setUserId(student.getId()); + // 查询数据表字段 + List filedList = applyFormDataMapper.findApplyFormFiled(applyForm.getTableName()); + // 填报信息处理 + JSONObject jsonObject = JSONUtil.parseObj(dto.getJsonDataString()); + // 字段集合 + List parameterList = new ArrayList<>(); + Map parameterMap = new HashMap<>(); + // 处理保存sql语句 + String baseSql = "insert into " + applyForm.getTableName() + "("; + filedList.forEach(filed -> { + parameterList.add("#{parameterMap." + filed + "}"); + parameterMap.put(filed, jsonObject.get(filed)); + }); + // 处理其余字段 + parameterMap.put("create_date", new Date()); + parameterMap.put("user_id", dto.getUserId()); + parameterMap.put("examine_status", "0"); + // 数据主键id + parameterMap.put("id", null); + String finalSql = baseSql + String.join(",", filedList) + ") values (" + String.join(",", parameterList) + ")"; + // 保存数据 + applyFormDataMapper.saveFormData(finalSql, parameterMap); + // 处涉及多次填报,添加填报数据主键id + CoreApplyFormFillUser fillUser = CoreApplyFormFillUser.builder() + .schoolId(student.getSchoolId()) + .applyFormId(applyForm.getId()) + .applyFormDataId((Long) parameterMap.get("id")) + .userId(dto.getUserId()) + .userName(student.getStuName()) + .build(); + // 保存填报记录数据 + coreApplyFormFillUserService.save(fillUser); + + sendStaffNoticeDTO.setFillUserId(fillUser.getId()); + // 查询表单对应的审核流程 + List approvalProcessList = coreApplyFormApprovalProcessMapper.selectApplyFormApprovalProcess(applyForm.getId()); + for (int i = 0; i < approvalProcessList.size(); i++) { + CoreApprovalProcess approvalProcess = approvalProcessList.get(i); + // 保存填报用户对应的流程 + CoreApplyFormFillUserApprovalProcess fillUserApprovalProcess = new CoreApplyFormFillUserApprovalProcess(); + fillUserApprovalProcess.setApplyFormId(applyForm.getId()); + fillUserApprovalProcess.setFillUserId(fillUser.getId()); + fillUserApprovalProcess.setProcessId(approvalProcess.getId()); + fillUserApprovalProcess.setProcessName(approvalProcess.getApprovalProcessName()); + fillUserApprovalProcess.setApprovalType(approvalProcess.getApprovalType()); + fillUserApprovalProcess.setApprovalUserType(approvalProcess.getApprovalUserType()); + fillUserApprovalProcess.setSort(i); + coreApplyFormFillUserApprovalProcessService.save(fillUserApprovalProcess); + // 查询审核流程人员信息 + List processUserList = coreApprovalProcessUserService.list(Wrappers.lambdaQuery(new CoreApprovalProcessUser()) + .eq(CoreApprovalProcessUser::getProcessId, approvalProcess.getId())); + for (CoreApprovalProcessUser processUser : processUserList) { + // 职工审核 + if (Objects.nonNull(processUser.getStaffId())) { + EduStaff staff = remoteStaffService.getStaff(processUser.getStaffId()).getData(); + // 保存具体人员的审核记录 + CoreApplyFormFillUserApprovalProcessRecord fillUserApprovalProcessRecord = new CoreApplyFormFillUserApprovalProcessRecord(); + fillUserApprovalProcessRecord.setSchoolId(applyForm.getSchoolId()); + fillUserApprovalProcessRecord.setApplyFormId(applyForm.getId()); + fillUserApprovalProcessRecord.setFillUserId(fillUser.getId()); + fillUserApprovalProcessRecord.setUserProcessId(fillUserApprovalProcess.getId()); + fillUserApprovalProcessRecord.setApprovalId(processUser.getStaffId()); + fillUserApprovalProcessRecord.setApprovalName(staff.getName()); + fillUserApprovalProcessRecord.setSort(i); + coreApplyFormFillUserApprovalProcessRecordService.save(fillUserApprovalProcessRecord); + // 发送审核信息 + if (i == 0) { + sendStaffNoticeDTO.setStaffWxId(staff.getWxId()); + sendStaffNoticeDTO.setStaffName(staff.getName()); + sendNoticeService.sendStaffNotice(sendStaffNoticeDTO, 1); + } + } else if (Objects.nonNull(processUser.getStaffRoleId())) { + // 角色审核 + // 审核人员信息 + List approvalUserList = new ArrayList<>(); + // 班主任 + if (ApprovalRoleTypeEnum.CLASS_TEACHER_TYPE.getType().equals(processUser.getStaffRoleId())) { + // 查询学生班主任 + approvalUserList = remoteTeacherService.listTeacherByDeptId(student.getClassId(), "3").getData(); + } else { + // 高校系主任/K12年级主任 + if (student.getSchoolId() == 10593) { + // 技师学院单独处理 + approvalUserList = remoteTeacherService.listTeacherByDeptId(student.getCampusId(), "1") + .getData(); + } else { + Dept dept = commonService.getDept(student.getSchoolId()); + // 学校性质 + if (ObjectUtil.equals(SchoolNatureEnum.UNI_TYPE.getValue(), + dept.getSchoolNature())) { + // 高校 + approvalUserList = remoteTeacherService.listTeacherByDeptId(student.getSectionId(), "5") + .getData(); + } else { + // K12 + approvalUserList = remoteTeacherService.listTeacherByDeptId(student.getGradeId(), "2") + .getData(); + } + } + } + if (CollUtil.isNotEmpty(approvalUserList)) { + for (EduStaff eduStaff : approvalUserList) { + // 保存具体人员的审核记录 + CoreApplyFormFillUserApprovalProcessRecord fillUserApprovalProcessRecord = new CoreApplyFormFillUserApprovalProcessRecord(); + fillUserApprovalProcessRecord.setSchoolId(applyForm.getSchoolId()); + fillUserApprovalProcessRecord.setApplyFormId(applyForm.getId()); + fillUserApprovalProcessRecord.setFillUserId(fillUser.getId()); + fillUserApprovalProcessRecord.setUserProcessId(fillUserApprovalProcess.getId()); + fillUserApprovalProcessRecord.setApprovalId(eduStaff.getId()); + fillUserApprovalProcessRecord.setApprovalName(eduStaff.getName()); + fillUserApprovalProcessRecord.setSort(i); + coreApplyFormFillUserApprovalProcessRecordService.save(fillUserApprovalProcessRecord); + + // 发送审核信息 + if (i == 0) { + sendStaffNoticeDTO.setStaffWxId(eduStaff.getWxId()); + sendStaffNoticeDTO.setStaffName(eduStaff.getName()); + sendNoticeService.sendStaffNotice(sendStaffNoticeDTO, 1); + } + } + } + } + } + } + } +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/impl/CoreApplyFormApprovalProcessServiceImpl.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/impl/CoreApplyFormApprovalProcessServiceImpl.java new file mode 100644 index 0000000..88b2cb1 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/impl/CoreApplyFormApprovalProcessServiceImpl.java @@ -0,0 +1,64 @@ +package com.yida.data.form.apply.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.applyForm.CoreApprovalProcess; +import com.yida.data.common.core.entity.applyForm.CoreApprovalProcessUser; +import com.yida.data.customForm.vo.apply.ApplyFormProcessSelectVO; +import com.yida.data.form.apply.mapper.CoreApplyFormApprovalProcessMapper; +import com.yida.data.form.apply.service.CoreApplyFormApprovalProcessService; +import com.yida.data.common.core.entity.applyForm.CoreApplyFormApprovalProcess; +import com.yida.data.form.apply.service.CoreApprovalProcessUserService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * 申请表单对应的审核流程 Service + * + * @author ZYJ + * @date 2023/11/21 + */ +@Slf4j +@Service +@RequiredArgsConstructor +@Transactional(rollbackFor = Exception.class) +public class CoreApplyFormApprovalProcessServiceImpl extends ServiceImpl + implements CoreApplyFormApprovalProcessService { + + private final CoreApprovalProcessUserService coreApprovalProcessUserService; + + @Override + public void saveApplyFormApprovalProcess(Long applyFormId, List processList) { + // 删除已存在的节点数据 + remove(Wrappers.lambdaQuery(new CoreApplyFormApprovalProcess()) + .eq(CoreApplyFormApprovalProcess::getApplyFormId, applyFormId)); + // 保存信息 + for (int i = 0; i < processList.size(); i++) { + CoreApplyFormApprovalProcess process = processList.get(i); + // 处理排序 + process.setSort(i); + save(process); + } + } + + @Override + public List listFormApprovalProcess(Long formId) { + List list = baseMapper.listFormApprovalProcess(formId); + // 处理审核人员信息 + list.forEach(vo -> { + List processUserList = coreApprovalProcessUserService.list(Wrappers.lambdaQuery(new CoreApprovalProcessUser()) + .eq(CoreApprovalProcessUser::getProcessId, vo.getApprovalProcessId())); + if (CollUtil.isNotEmpty(processUserList)) { + String names = processUserList.stream().map(CoreApprovalProcessUser::getName).collect(Collectors.joining("、")); + vo.setApprovalUserName(names); + } + }); + return list; + } +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/impl/CoreApplyFormFillUserApprovalProcessRecordServiceImpl.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/impl/CoreApplyFormFillUserApprovalProcessRecordServiceImpl.java new file mode 100644 index 0000000..1dca1ad --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/impl/CoreApplyFormFillUserApprovalProcessRecordServiceImpl.java @@ -0,0 +1,25 @@ +package com.yida.data.form.apply.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.form.apply.mapper.CoreApplyFormFillUserApprovalProcessRecordMapper; +import com.yida.data.form.apply.service.CoreApplyFormFillUserApprovalProcessRecordService; +import com.yida.data.common.core.entity.applyForm.CoreApplyFormFillUserApprovalProcessRecord; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * 填报用户表单审核流程记录表(具体的审核信息) Service + * + * @author ZYJ + * @date 2023/11/24 + */ +@Slf4j +@Service +@Transactional(rollbackFor = Exception.class) +public class CoreApplyFormFillUserApprovalProcessRecordServiceImpl + extends ServiceImpl + implements CoreApplyFormFillUserApprovalProcessRecordService { + + +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/impl/CoreApplyFormFillUserApprovalProcessServiceImpl.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/impl/CoreApplyFormFillUserApprovalProcessServiceImpl.java new file mode 100644 index 0000000..45d4dd4 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/impl/CoreApplyFormFillUserApprovalProcessServiceImpl.java @@ -0,0 +1,25 @@ +package com.yida.data.form.apply.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.form.apply.mapper.CoreApplyFormFillUserApprovalProcessMapper; +import com.yida.data.form.apply.service.CoreApplyFormFillUserApprovalProcessService; +import com.yida.data.common.core.entity.applyForm.CoreApplyFormFillUserApprovalProcess; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * 表单填报用户对应审核流程表 Service + * + * @author ZYJ + * @date 2023/11/24 + */ +@Slf4j +@Service +@Transactional(rollbackFor = Exception.class) +public class CoreApplyFormFillUserApprovalProcessServiceImpl + extends ServiceImpl + implements CoreApplyFormFillUserApprovalProcessService { + + +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/impl/CoreApplyFormFillUserServiceImpl.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/impl/CoreApplyFormFillUserServiceImpl.java new file mode 100644 index 0000000..ec06bb9 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/impl/CoreApplyFormFillUserServiceImpl.java @@ -0,0 +1,47 @@ +package com.yida.data.form.apply.service.impl; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.utils.FebsUtil; +import com.yida.data.customForm.dto.apply.ApplyFormFillSelectPageDTO; +import com.yida.data.customForm.vo.apply.ApplyFormFillSelectPageVO; +import com.yida.data.customForm.vo.apply.ApplyFormSelectPageVO; +import com.yida.data.form.apply.mapper.CoreApplyFormFillUserMapper; +import com.yida.data.form.apply.service.CoreApplyFormFillUserService; +import com.yida.data.common.core.entity.applyForm.CoreApplyFormFillUser; +import com.yida.data.customForm.dto.apply.H5ApplyFormSelectPageDTO; +import com.yida.data.customForm.vo.apply.MyApplyFormPageVO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * 申请表单填报用户信息表 Service + * + * @author ZYJ + * @date 2023/11/22 + */ +@Slf4j +@Service +@Transactional(rollbackFor = Exception.class) +public class CoreApplyFormFillUserServiceImpl extends ServiceImpl + implements CoreApplyFormFillUserService { + + @Override + public IPage selectUserFillForm(H5ApplyFormSelectPageDTO dto, List userIds) { + return baseMapper.selectUserFillForm(dto.toPage(), dto, userIds); + } + + @Override + public IPage listApplyFormFillPage(ApplyFormFillSelectPageDTO dto) { + // TODO: 2023/12/7 此处暂时只有学校角色 + dto.setDeptId(FebsUtil.getDeptId()); + IPage page = baseMapper.listApplyFormFillPage(dto.toPage(), dto); + page.getRecords().forEach(vo -> { + // 处理部门数据 + }); + return page; + } +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/impl/CoreApplyFormItemChildrenServiceImpl.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/impl/CoreApplyFormItemChildrenServiceImpl.java new file mode 100644 index 0000000..35028a5 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/impl/CoreApplyFormItemChildrenServiceImpl.java @@ -0,0 +1,23 @@ +package com.yida.data.form.apply.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.form.apply.service.CoreApplyFormItemChildrenService; +import com.yida.data.form.apply.mapper.CoreApplyFormItemChildrenMapper; +import com.yida.data.common.core.entity.applyForm.CoreApplyFormItemChildren; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * 申请类型表单组件选项 Service + * + * @author ZYJ + * @date 2023/11/14 19:17 + */ +@Slf4j +@Service +@Transactional(rollbackFor = Exception.class) +public class CoreApplyFormItemChildrenServiceImpl extends ServiceImpl + implements CoreApplyFormItemChildrenService { + +} \ No newline at end of file diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/impl/CoreApplyFormItemServiceImpl.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/impl/CoreApplyFormItemServiceImpl.java new file mode 100644 index 0000000..14b6615 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/impl/CoreApplyFormItemServiceImpl.java @@ -0,0 +1,25 @@ +package com.yida.data.form.apply.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.form.apply.mapper.CoreApplyFormItemMapper; +import com.yida.data.form.apply.service.CoreApplyFormItemService; +import com.yida.data.common.core.entity.applyForm.CoreApplyFormItem; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * 申请类型表单组件 Service + * + * @author ZYJ + * @date 2023/11/14 19:17 + */ +@Slf4j +@Service +@RequiredArgsConstructor +@Transactional(rollbackFor = Exception.class) +public class CoreApplyFormItemServiceImpl extends ServiceImpl + implements CoreApplyFormItemService { + +} \ No newline at end of file diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/impl/CoreApplyFormServiceImpl.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/impl/CoreApplyFormServiceImpl.java new file mode 100644 index 0000000..17ab26a --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/impl/CoreApplyFormServiceImpl.java @@ -0,0 +1,188 @@ +package com.yida.data.form.apply.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.applyForm.*; +import com.yida.data.common.core.enums.EnableStatusEnum; +import com.yida.data.common.core.exception.FebsException; +import com.yida.data.form.apply.service.*; +import com.yida.data.form.apply.mapper.CoreApplyFormMapper; +import com.yida.data.common.core.utils.FebsUtil; +import com.yida.data.customForm.dto.apply.ApplyFormSelectPageDTO; +import com.yida.data.customForm.vo.apply.ApplyFormInfoVO; +import com.yida.data.customForm.vo.apply.ApplyFormSelectPageVO; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Objects; + +/** + * 申请类型表单 Service + * + * @author ZYJ + * @date 2023/11/14 + */ +@Slf4j +@Service +@RequiredArgsConstructor +@Transactional(rollbackFor = Exception.class) +public class CoreApplyFormServiceImpl extends ServiceImpl + implements CoreApplyFormService { + + private final CoreApplyFormItemService coreApplyFormItemService; + private final CoreApplyFormFillUserService coreApplyFormFillUserService; + private final CoreApplyFormItemChildrenService coreApplyFormItemChildrenService; + private final CoreApplyFormApprovalProcessService coreApplyFormApprovalProcessService; + + public static final String BASE_APPLY_TABLE_NAME = "core_apply_form_data_z_"; + + @Override + public IPage listApplyFormPage(ApplyFormSelectPageDTO dto) { + // TODO: 2023/11/14 此处暂时只有学校角色 + dto.setDeptId(FebsUtil.getDeptId()); + IPage page = baseMapper.listApplyFormPage(dto.toPage(), dto); + page.getRecords().forEach(form -> + form.setSubmitNum( + coreApplyFormFillUserService.count(Wrappers.lambdaQuery(new CoreApplyFormFillUser()) + .eq(CoreApplyFormFillUser::getApplyFormId, form.getId())) + )); + return page; + } + + @Override + public ApplyFormInfoVO getApplyFormInfo(Long id) { + // 返回数据 + ApplyFormInfoVO vo = new ApplyFormInfoVO(); + CoreApplyForm applyForm = getById(id); + if (Objects.nonNull(applyForm)) { + BeanUtils.copyProperties(applyForm, vo); + // 查询组件信息 + List itemList = coreApplyFormItemService.list(Wrappers.query().lambda() + .eq(CoreApplyFormItem::getFormId, id)); + itemList.forEach(item -> { + // 查询组件选项信息 + List childrenList = + coreApplyFormItemChildrenService.list(Wrappers.query().lambda() + .eq(CoreApplyFormItemChildren::getFormItemId, item.getId())); + item.setChildrenList(childrenList); + }); + vo.setItemList(itemList); + } + return vo; + } + + @Override + public void deleteApplyForm(Long id) { + CoreApplyForm applyForm = getById(id); + // 判断是否有填报数据 + long count = coreApplyFormFillUserService.count(Wrappers.lambdaQuery(new CoreApplyFormFillUser()) + .eq(CoreApplyFormFillUser::getApplyFormId, id)); + if (count > 0) { + throw new FebsException("当前表单已有填报数据,无法删除!"); + } + // 删除申请表信息 + removeById(id); + // 删除数据表信息 + String dropTableSql = "DROP TABLE IF EXISTS `" + applyForm.getTableName() + "`; \n"; + baseMapper.initSqlReturnVoid(dropTableSql); + // 删除附表信息 + coreApplyFormItemService.remove(Wrappers.lambdaQuery(new CoreApplyFormItem()) + .eq(CoreApplyFormItem::getFormId, id)); + coreApplyFormItemChildrenService.remove(Wrappers.lambdaQuery(new CoreApplyFormItemChildren()) + .eq(CoreApplyFormItemChildren::getFormId, id)); + } + + @Override + public Long saveApplyForm(CoreApplyForm applyForm) { + String tableName = BASE_APPLY_TABLE_NAME + System.currentTimeMillis(); + // 编辑 + if (Objects.nonNull(applyForm.getId())) { + // 判断是否有填报数据 + long count = coreApplyFormFillUserService.count(Wrappers.lambdaQuery(new CoreApplyFormFillUser()) + .eq(CoreApplyFormFillUser::getApplyFormId, applyForm.getId())); + if (count > 0) { + throw new FebsException("当前表单已有填报数据,无法删除!"); + } + // 删除附表信息 + coreApplyFormItemService.remove(Wrappers.lambdaQuery(new CoreApplyFormItem()) + .eq(CoreApplyFormItem::getFormId, applyForm.getId())); + coreApplyFormItemChildrenService.remove(Wrappers.lambdaQuery(new CoreApplyFormItemChildren()) + .eq(CoreApplyFormItemChildren::getFormId, applyForm.getId())); + // 删除数据表信息 + String dropTableSql = "DROP TABLE IF EXISTS `" + applyForm.getTableName() + "`; \n"; + baseMapper.initSqlReturnVoid(dropTableSql); + applyForm.setTableName(tableName); + updateById(applyForm); + } else { + // TODO: 2023/11/15 此处暂时只有学校角色 + applyForm.setSchoolId(FebsUtil.getDeptId()); + // 对应表名称 + applyForm.setTableName(tableName); + save(applyForm); + } + // 保存审核流程节点信息 + if (CollUtil.isNotEmpty(applyForm.getProcessList())) { + coreApplyFormApprovalProcessService.saveApplyFormApprovalProcess(applyForm.getId(), applyForm.getProcessList()); + } + // 动态生成填报表 + StringBuilder stringBuilder = new StringBuilder(); + String createTableSql = "CREATE TABLE " + applyForm.getTableName() + "( \n" + "`id` bigint(20) NOT NULL AUTO_INCREMENT,\n"; + stringBuilder.append(createTableSql); + // 处理组件数据 + applyForm.getItemList().forEach(item -> { + String typeValue; + if ("moreInput".equals(item.getItemType())) { + typeValue = "text"; + } else { + typeValue = "varchar(255)"; + } + // 添加选项信息 + String sql = "`" + item.getItemFiledName() + "` " + typeValue + " DEFAULT NULL COMMENT '" + item.getItemTitle() + "'"; + stringBuilder.append(sql).append(","); + // 保存选项信息 + item.setId(null); + item.setFormId(applyForm.getId()); + coreApplyFormItemService.save(item); + + item.getChildrenList().forEach(itemChildren -> { + itemChildren.setId(null); + itemChildren.setFormItemId(item.getId()); + itemChildren.setFormId(applyForm.getId()); + coreApplyFormItemChildrenService.save(itemChildren); + }); + }); + // 创建数据表sql + String initSql = stringBuilder + + "`user_id` bigint(20) DEFAULT NULL COMMENT '学生id',\n" + + "`create_date` datetime DEFAULT NULL COMMENT '创建时间',\n" + + "`examine_status` tinyint(1) DEFAULT '0' COMMENT '审核状态:默认0未审核,1已通过,2已拒绝,3审核中',\n" + + "PRIMARY KEY (`id`)\n" + + ") ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8"; + + baseMapper.initSqlReturnVoid(initSql); + return applyForm.getId(); + } + + @Override + public void updateEnableStatus(Long formId, Integer enableStatus) { + if (EnableStatusEnum.ENABLE_STATUS.getStatus().equals(enableStatus)) { + // 判断当前表单是否有流程信息 + long count = coreApplyFormApprovalProcessService.count(Wrappers.lambdaQuery(new CoreApplyFormApprovalProcess()) + .eq(CoreApplyFormApprovalProcess::getApplyFormId, formId)); + if (count == 0) { + throw new FebsException("当前表单暂无审核流程,请添加审核流程后再启用!"); + } + } + CoreApplyForm applyForm = new CoreApplyForm(); + applyForm.setId(formId); + applyForm.setStatus(enableStatus); + updateById(applyForm); + } +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/impl/CoreApprovalProcessServiceImpl.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/impl/CoreApprovalProcessServiceImpl.java new file mode 100644 index 0000000..7503dc8 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/impl/CoreApprovalProcessServiceImpl.java @@ -0,0 +1,130 @@ +package com.yida.data.form.apply.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.applyForm.CoreApplyFormApprovalProcess; +import com.yida.data.form.apply.mapper.CoreApprovalProcessMapper; +import com.yida.data.form.apply.service.CoreApplyFormApprovalProcessService; +import com.yida.data.form.apply.service.CoreApprovalProcessService; +import com.yida.data.form.apply.service.CoreApprovalProcessUserService; +import com.yida.data.common.core.entity.applyForm.CoreApprovalProcess; +import com.yida.data.common.core.entity.applyForm.CoreApprovalProcessUser; +import com.yida.data.common.core.utils.FebsUtil; +import com.yida.data.customForm.dto.apply.ApprovalProcessSelectPageDTO; +import com.yida.data.customForm.vo.apply.ApprovalProcessInfoVO; +import com.yida.data.customForm.vo.apply.ApprovalProcessSelectPageVO; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * 审核流程表 Service + * + * @author ZYJ + * @date 2023/11/21 + */ +@Slf4j +@Service +@RequiredArgsConstructor +@Transactional(rollbackFor = Exception.class) +public class CoreApprovalProcessServiceImpl extends ServiceImpl + implements CoreApprovalProcessService { + + private final CoreApprovalProcessUserService coreApprovalProcessUserService; + private final CoreApplyFormApprovalProcessService coreApplyFormApprovalProcessService; + + @Override + public IPage listApprovalProcessPage(ApprovalProcessSelectPageDTO dto) { + // TODO: 2023/11/21 此处暂时只有学校角色 + dto.setDeptId(FebsUtil.getDeptId()); + IPage page = baseMapper.listApprovalProcessPage(dto.toPage(), dto); + // TODO: 2023/11/21 后续查询关键字段 + if (CollUtil.isNotEmpty(page.getRecords())) { + page.getRecords().forEach(process -> { + // 查询审核人员名称 + List processUserList = coreApprovalProcessUserService.list(Wrappers.lambdaQuery(new CoreApprovalProcessUser()) + .eq(CoreApprovalProcessUser::getProcessId, process.getId())); + if (CollUtil.isNotEmpty(processUserList)) { + String names = processUserList.stream().map(CoreApprovalProcessUser::getName).collect(Collectors.joining("、")); + process.setApprovalUserName(names); + } + }); + } + return page; + } + + @Override + public ApprovalProcessInfoVO getApprovalProcessInfo(Long id) { + // 返回数据 + ApprovalProcessInfoVO vo = new ApprovalProcessInfoVO(); + CoreApprovalProcess process = getById(id); + if (Objects.nonNull(process)) { + BeanUtils.copyProperties(process, vo); + // 查询人员信息 + List list = coreApprovalProcessUserService.list(Wrappers.lambdaQuery(new CoreApprovalProcessUser()) + .eq(CoreApprovalProcessUser::getProcessId, id)); + vo.setUserList(list); + } + return vo; + } + + @Override + public void deleteApprovalProcess(Long id) { + removeById(id); + // 删除关联用户 + coreApprovalProcessUserService.remove(Wrappers.lambdaQuery(new CoreApprovalProcessUser()) + .eq(CoreApprovalProcessUser::getProcessId, id)); + // TODO: 2023/11/21 删除申请表单对应的审核流程信息 (此处需要判断能否删除) + } + + @Override + public void saveApprovalProcess(CoreApprovalProcess process) { + // TODO: 2023/11/21 需要判断能否修改 + if (Objects.nonNull(process.getId())) { + // 删除用户信息 + coreApprovalProcessUserService.remove(Wrappers.lambdaQuery(new CoreApprovalProcessUser()) + .eq(CoreApprovalProcessUser::getProcessId, process.getId())); + } else { + process.setDeptId(FebsUtil.getDeptId()); + } + saveOrUpdate(process); + // 处理用户信息 + if (CollUtil.isNotEmpty(process.getUserList())) { + for (CoreApprovalProcessUser coreApprovalProcessUser : process.getUserList()) { + coreApprovalProcessUser.setId(null); + coreApprovalProcessUser.setProcessId(process.getId()); + coreApprovalProcessUserService.save(coreApprovalProcessUser); + } + } + } + + @Override + public List listApprovalProcess(Long formId) { + // 查询表单已有的流程 + List list = coreApplyFormApprovalProcessService.list(Wrappers.lambdaQuery(new CoreApplyFormApprovalProcess()) + .eq(CoreApplyFormApprovalProcess::getApplyFormId, formId)); + List processList = list(Wrappers.lambdaQuery(new CoreApprovalProcess()) + .notIn(CollUtil.isNotEmpty(list), CoreApprovalProcess::getId, list.stream() + .map(CoreApplyFormApprovalProcess::getApprovalProcessId).collect(Collectors.toList()))); + if (CollUtil.isNotEmpty(processList)) { + processList.forEach(process -> { + // 查询审核人员名称 + List processUserList = coreApprovalProcessUserService.list(Wrappers.lambdaQuery(new CoreApprovalProcessUser()) + .eq(CoreApprovalProcessUser::getProcessId, process.getId())); + if (CollUtil.isNotEmpty(processUserList)) { + String names = processUserList.stream().map(CoreApprovalProcessUser::getName).collect(Collectors.joining("、")); + process.setApprovalUserName(names); + } + }); + } + return processList; + } +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/impl/CoreApprovalProcessUserServiceImpl.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/impl/CoreApprovalProcessUserServiceImpl.java new file mode 100644 index 0000000..7d9a19d --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/impl/CoreApprovalProcessUserServiceImpl.java @@ -0,0 +1,25 @@ +package com.yida.data.form.apply.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.form.apply.mapper.CoreApprovalProcessUserMapper; +import com.yida.data.form.apply.service.CoreApprovalProcessUserService; +import com.yida.data.common.core.entity.applyForm.CoreApprovalProcessUser; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * 审核流程人员配置表 Service + * + * @author ZYJ + * @date 2023/11/21 + */ +@Slf4j +@Service +@RequiredArgsConstructor +@Transactional(rollbackFor = Exception.class) +public class CoreApprovalProcessUserServiceImpl extends ServiceImpl + implements CoreApprovalProcessUserService { + +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/impl/CoreApprovalRemindServiceImpl.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/impl/CoreApprovalRemindServiceImpl.java new file mode 100644 index 0000000..304211a --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/impl/CoreApprovalRemindServiceImpl.java @@ -0,0 +1,55 @@ +package com.yida.data.form.apply.service.impl; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.utils.FebsUtil; +import com.yida.data.customForm.dto.apply.ApprovalRemindDTO; +import com.yida.data.customForm.vo.apply.ApprovalProcessInfoVO; +import com.yida.data.customForm.vo.apply.ApprovalRemindInfoVO; +import com.yida.data.form.apply.mapper.CoreApprovalRemindMapper; +import com.yida.data.form.apply.service.CoreApprovalRemindService; +import com.yida.data.common.core.entity.applyForm.CoreApprovalRemind; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +/** + * 审核提醒策略表 Service + * + * @author ZYJ + * @date 2023/11/23 + */ +@Slf4j +@Service +@Transactional(rollbackFor = Exception.class) +public class CoreApprovalRemindServiceImpl extends ServiceImpl + implements CoreApprovalRemindService { + + @Override + public ApprovalRemindInfoVO getApprovalRemindInfo() { + // 返回信息 + ApprovalRemindInfoVO vo = new ApprovalRemindInfoVO(); + CoreApprovalRemind approvalRemind = getOne(Wrappers.lambdaQuery(new CoreApprovalRemind()) + .eq(CoreApprovalRemind::getDeptId, FebsUtil.getDeptId())); + if (Objects.nonNull(approvalRemind)) { + BeanUtils.copyProperties(approvalRemind, vo); + } + return vo; + } + + @Override + public void saveApprovalRemind(ApprovalRemindDTO dto) { + CoreApprovalRemind approvalRemind = getOne(Wrappers.lambdaQuery(new CoreApprovalRemind()) + .eq(CoreApprovalRemind::getDeptId, FebsUtil.getDeptId())); + if (Objects.isNull(approvalRemind)) { + approvalRemind = new CoreApprovalRemind(); + approvalRemind.setDeptId(FebsUtil.getDeptId()); + } + approvalRemind.setApprovalRemindStatus(dto.getApprovalRemindStatus()); + approvalRemind.setApprovalResultStatus(dto.getApprovalResultStatus()); + saveOrUpdate(approvalRemind); + } +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/impl/CoreOfficialSealServiceImpl.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/impl/CoreOfficialSealServiceImpl.java new file mode 100644 index 0000000..fa0f3af --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/impl/CoreOfficialSealServiceImpl.java @@ -0,0 +1,75 @@ +package com.yida.data.form.apply.service.impl; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.form.apply.mapper.CoreOfficialSealMapper; +import com.yida.data.form.apply.service.CoreOfficialSealService; +import com.yida.data.common.core.entity.applyForm.CoreOfficialSeal; +import com.yida.data.common.core.utils.FebsUtil; +import com.yida.data.customForm.dto.apply.OfficialSealSaveDTO; +import com.yida.data.customForm.dto.apply.OfficialSealSelectPageDTO; +import com.yida.data.customForm.vo.apply.OfficialSealInfoVO; +import com.yida.data.customForm.vo.apply.OfficialSealSelectPageVO; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +/** + * 学校公章 Service + * + * @author ZYJ + * @date 2023/11/17 + */ +@Slf4j +@Service +@RequiredArgsConstructor +@Transactional(rollbackFor = Exception.class) +public class CoreOfficialSealServiceImpl extends ServiceImpl + implements CoreOfficialSealService { + + @Override + public IPage listOfficialSealPage(OfficialSealSelectPageDTO dto) { + // TODO: 2023/11/17 此处暂时只有学校角色 + dto.setDeptId(FebsUtil.getDeptId()); + // TODO: 2023/11/17 需要查询对应的审核流程 + return baseMapper.listOfficialSealPage(dto.toPage(), dto); + } + + @Override + public OfficialSealInfoVO getOfficialSealInfo(Long id) { + CoreOfficialSeal officialSeal = getById(id); + // 返回数据 + OfficialSealInfoVO vo = new OfficialSealInfoVO(); + if (Objects.nonNull(officialSeal)) { + BeanUtils.copyProperties(officialSeal, vo); + } + return vo; + } + + @Override + public void deleteOfficialSeal(Long id) { + // TODO: 2023/11/17 需要判断能否删除 + removeById(id); + } + + @Override + public void saveOfficialSeal(OfficialSealSaveDTO dto) { + // TODO: 2023/11/17 此处暂时只有学校角色 + CoreOfficialSeal coreOfficialSeal = new CoreOfficialSeal(); + BeanUtils.copyProperties(dto, coreOfficialSeal); + coreOfficialSeal.setDeptId(FebsUtil.getDeptId()); + saveOrUpdate(coreOfficialSeal); + } + + @Override + public void updateEnableStatus(Long id, Integer enableStatus) { + CoreOfficialSeal coreOfficialSeal = new CoreOfficialSeal(); + coreOfficialSeal.setId(id); + coreOfficialSeal.setStatus(enableStatus); + updateById(coreOfficialSeal); + } +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/impl/SendNoticeServiceImpl.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/impl/SendNoticeServiceImpl.java new file mode 100644 index 0000000..89bda37 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/apply/service/impl/SendNoticeServiceImpl.java @@ -0,0 +1,168 @@ +package com.yida.data.form.apply.service.impl; + +import cn.hutool.core.date.LocalDateTimeUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.yida.data.common.core.entity.applyForm.CoreApprovalRemind; +import com.yida.data.common.core.entity.constant.AppConstant; +import com.yida.data.common.core.entity.constant.NoticeTypeConstant; +import com.yida.data.common.core.entity.notice.qywx.TemplateCardStaffNotice; +import com.yida.data.common.core.entity.notice.qywx.TextSchoolNotice; +import com.yida.data.common.core.entity.notice.qywx.inside.TemplateCardNotice; +import com.yida.data.common.core.entity.notice.qywx.inside.Text; +import com.yida.data.common.core.entity.notice.qywx.inside.templateCard.CardAction; +import com.yida.data.common.core.entity.notice.qywx.inside.templateCard.HorizontalContent; +import com.yida.data.common.core.entity.notice.qywx.inside.templateCard.Jump; +import com.yida.data.common.core.entity.notice.qywx.inside.templateCard.MainTitle; +import com.yida.data.common.core.entity.system.Dept; +import com.yida.data.common.core.entity.system.EduApp; +import com.yida.data.common.core.entity.user.EduStudent; +import com.yida.data.common.core.enums.EnableStatusEnum; +import com.yida.data.common.core.enums.leave.ApprovalResultEnum; +import com.yida.data.common.core.utils.WxUtil; +import com.yida.data.common.service.CommonService; +import com.yida.data.customForm.dto.apply.SendParentNoticeDTO; +import com.yida.data.customForm.dto.apply.SendStaffNoticeDTO; +import com.yida.data.form.apply.service.CoreApprovalRemindService; +import com.yida.data.form.apply.service.SendNoticeService; +import com.yida.data.user.feign.RemoteStudentService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Objects; + +/** + * 发送消息 Service + * + * @author ZYJ + * @date 2023/11/30 + */ +@Slf4j +@Service +@RequiredArgsConstructor +@Transactional(rollbackFor = Exception.class) +public class SendNoticeServiceImpl implements SendNoticeService { + + private final CoreApprovalRemindService coreApprovalRemindService; + + private final RemoteStudentService remoteStudentService; + + private final WxUtil wxUtil; + private final CommonService commonService; + + @Value("${febs.parentFormNoticeUrl}") + private String parentFormNoticeUrl; + + @Value("${febs.teacherFormNoticeUrl}") + private String teacherFormNoticeUrl; + + @Override + public void sendStaffNotice(SendStaffNoticeDTO dto, Integer isFirst) { + // 需要判断是否要推送消息 + CoreApprovalRemind approvalRemind = coreApprovalRemindService.getOne(Wrappers.lambdaQuery(new CoreApprovalRemind()) + .eq(CoreApprovalRemind::getDeptId, dto.getSchoolId())); + if (Objects.nonNull(approvalRemind) + && EnableStatusEnum.ENABLE_STATUS.getStatus().equals(approvalRemind.getApprovalRemindStatus())) { + // 企业微信推送消息 + if (dto.getSchoolType().contains(Dept.TYPE_QYWX)) { + // 查询推送消息的应用信息 + EduApp app = commonService.getAppByCodeAndSchool(AppConstant.CONTACT_SELECT, null, + dto.getSchoolId()); + String accessToken = wxUtil.getAccessToken(app.getWxCorpId(), app.getWxSecret()); + // 跳转职工审核页面 + String url = String + .format("%s?corpId=%s&schoolId=%s&userType=%s&formId=%s&fillUserId=%s&userId=%s¤tUserStatus=%s", teacherFormNoticeUrl, + app.getWxCorpId(), + dto.getSchoolId(), 0, dto.getFormId(), dto.getFillUserId(), dto.getUserId(), 0); + log.error("申请表单职工url: {}", url); + // 模板卡片消息--文本通知型 + TemplateCardNotice templateCardNotice = new TemplateCardNotice(); + templateCardNotice.setCard_type(NoticeTypeConstant.TEMPLATE_NOTICE_TYPE_TEXT); + templateCardNotice.setMain_title(MainTitle.builder().title("学生申请提醒").build()); + + // 是否为初次审核 + if (isFirst == 1) { + // 初次审核 + templateCardNotice + .setSub_title_text(String.format("尊敬的%s老师,%S同学于%S提交的申请信息,等待您的审批!", + dto.getStaffName(), dto.getUserName(), + LocalDateTimeUtil.format(dto.getCreateTime(), "yyyy-MM-dd HH:mm:ss"))); + } else { + // 非初次审核 + templateCardNotice + .setSub_title_text(String.format("尊敬的%s老师,你好!%S老师【%S】已同意%S同学于%S提交的申请信息,等待您的审批!", + dto.getStaffName(), dto.getPreStaffName(), dto.getPreStaffRoleName(), dto.getUserName(), + LocalDateTimeUtil.format(dto.getCreateTime(), "yyyy-MM-dd HH:mm:ss"))); + } + + List horizontalContentList = new ArrayList<>(); + horizontalContentList + .add(HorizontalContent.builder().keyname("班级").value(dto.getUserDeptName()).build()); + horizontalContentList + .add(HorizontalContent.builder().keyname("学生").value(dto.getUserName()).build()); + + horizontalContentList.add(HorizontalContent.builder().keyname("申请时间") + .value(LocalDateTimeUtil.format(dto.getCreateTime(), "yyyy-MM-dd HH:mm")).build()); + templateCardNotice.setHorizontal_content_list(horizontalContentList); + templateCardNotice.setCard_action(CardAction.builder().type(1).url(url).build()); + templateCardNotice + .setJump_list(Collections.singletonList(Jump.builder().type(1).title("点击查看详情并处理").url(url).build())); + + TemplateCardStaffNotice templateCardStaffNotice = new TemplateCardStaffNotice(); + templateCardStaffNotice.setTouser(dto.getStaffWxId()); + templateCardStaffNotice.setAgentid(app.getWxAgentId()); + templateCardStaffNotice.setTemplate_card(templateCardNotice); + // 发送企业微信通知 + wxUtil.pushStaffNotice(accessToken, templateCardStaffNotice); + } + } + } + + @Override + public void sendParentNotice(SendParentNoticeDTO dto) { + // 学校信息 + Dept school = dto.getSchool(); + // 学生信息 + EduStudent student = dto.getStudent(); + + // 需要判断是否要推送消息 + CoreApprovalRemind approvalRemind = coreApprovalRemindService.getOne(Wrappers.lambdaQuery(new CoreApprovalRemind()) + .eq(CoreApprovalRemind::getDeptId, school.getDeptId())); + if (Objects.nonNull(approvalRemind) + && EnableStatusEnum.ENABLE_STATUS.getStatus().equals(approvalRemind.getApprovalResultStatus())) { + // 企业微信推送消息 + if (school.getSchoolType().contains(Dept.TYPE_QYWX)) { + TextSchoolNotice textSchoolNotice = new TextSchoolNotice(); + // 查询推送消息的应用信息 + EduApp appByCodeAndSchool = commonService.getAppByCodeAndSchool(AppConstant.INDEX_PARENT, null, school.getDeptId()); + // 查询家长id集合 + List parentId = remoteStudentService.findParentWxId(Collections.singletonList(student.getId())).getData(); + Text text = new Text(); + textSchoolNotice.setText(text); + textSchoolNotice.setAgentid(appByCodeAndSchool.getWxAgentId()); + // 跳转学生填报详情页面 + String url = String + .format("%s?corpId=%s&schoolId=%s&userType=%s&formId=%s&fillUserId=%s&userId=%s", parentFormNoticeUrl, + appByCodeAndSchool.getWxCorpId(), + school.getDeptId(), 1, dto.getFormId(), dto.getFillUserId(), dto.getStudent().getId()); + + String msg = ObjectUtil.equals(ApprovalResultEnum.AUDIT_PASS.getResult(), dto.getExamineStatus()) ? "已通过" : "未通过"; + text.setContent( + "" + student.getStuName() + "同学于" + + LocalDateTimeUtil.format(dto.getCreateTime(), "yyyy-MM-dd HH:mm:ss") + + "的申请" + msg + ",点击可查看详情" + ""); + textSchoolNotice.setTo_parent_userid(parentId); + // 发送信息 + String accessToken = wxUtil.getAccessToken(appByCodeAndSchool.getWxCorpId(), appByCodeAndSchool.getWxSecret()); + wxUtil.pushSchoolNotice(accessToken, textSchoolNotice); + } + + } + } +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/controller/CoreCustomFormAuthController.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/controller/CoreCustomFormAuthController.java new file mode 100644 index 0000000..34f9e7f --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/controller/CoreCustomFormAuthController.java @@ -0,0 +1,53 @@ +package com.yida.data.form.customForm.controller; + +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.customform.CoreCustomFormAuth; +import com.yida.data.form.customForm.service.CoreCustomFormAuthService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + + +/** + * 表单对应管理员权限表 Controller + * + * @author ccl + * @date 2021-11-05 15:41:13 + */ +@Api(tags = "后台--表单权限") +@Slf4j +@Validated +@RestController +@RequestMapping("coreCustomFormAuth") +@RequiredArgsConstructor +public class CoreCustomFormAuthController { + + private final CoreCustomFormAuthService coreCustomFormAuthService; + + @ApiOperation("新增或修改表单基本权限") + @PostMapping("saveOrUpdateFormAuth") + public ResultBean saveOrUpdateFormAuth (@RequestBody CoreCustomFormAuth formAuth){ + coreCustomFormAuthService.saveOrUpdate(formAuth); + return ResultBean.buildSuccess(); + } + + @ApiOperation("批量删除表单基本权限") + @PostMapping("delFormAuth") + public ResultBean delFormAuth (@RequestBody List authIds){ + coreCustomFormAuthService.removeByIds(authIds); + return ResultBean.buildSuccess(); + } + + @ApiOperation("查询权限列表") + @GetMapping("findFormAuthList") + public ResultBean> findFormAuthList (){ + + return ResultBean.buildSuccess(coreCustomFormAuthService.list()); + } + +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/controller/CoreCustomFormController.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/controller/CoreCustomFormController.java new file mode 100644 index 0000000..78ec5de --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/controller/CoreCustomFormController.java @@ -0,0 +1,123 @@ +package com.yida.data.form.customForm.controller; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.customform.CoreCustomForm; +import com.yida.data.common.core.utils.FebsUtil; +import com.yida.data.form.customForm.service.CoreCustomFormItemChildrenService; +import com.yida.data.form.customForm.service.CoreCustomFormItemsService; +import com.yida.data.form.customForm.service.CoreCustomFormService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.extern.slf4j.Slf4j; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + + + +/** + * 自定义表单 Controller + * + * @author wjm + * @date 2021-08-11 20:55:19 + */ +@Slf4j +@Validated +@RestController +@RequestMapping("/coreCustomForm") +@RequiredArgsConstructor +@Api(tags = "后台--表单管理") +public class CoreCustomFormController { + + private final CoreCustomFormService coreCustomFormService; + private final CoreCustomFormItemsService coreCustomFormItemsService; + private final CoreCustomFormItemChildrenService coreCustomFormItemChildrenService; + + + /*** + * @Author jianMingWang + * @Description //查询所有表单 + * @Date 14:33 2021/8/9 + * @Param [schoolId] + * @return com.liuliu.data.custom.entity.ResultBean> + **/ + @ApiOperation("表单分页查询") + @GetMapping("/findList") + public ResultBean> fondType(@ApiParam(value = "学校ID", required = true, type = "Long") Long schoolId, + @ApiParam(value = "表单类型ID", required = true, type = "Long") Long formTypeId, + @ApiParam(value = "是否为模板:1=是,0=否", required = false, type = "String") @RequestParam(value = "model", required = false) String model, + @ApiParam(value = "当前页码", required = false, defaultValue = "1", type = "Integer") @RequestParam(defaultValue = "1") Integer pageNum, + @ApiParam(value = "页面大小", required = false, defaultValue = "10", type = "Integer") @RequestParam(defaultValue = "10") Integer pageSize) { + + IPage customFormPageList = coreCustomFormService.findCustomFormPageList(new Page(pageNum, pageSize), + schoolId, formTypeId, model, FebsUtil.getCurrentUser()); + return ResultBean.buildSuccess(customFormPageList); + + } + + + /*** + * @Author jianMingWang + * @Description //获取当前表单 + * @Date 11:22 2021/8/10 + * @Param [schoolId, formTypeId] + * @return com.liuliu.data.custom.entity.ResultBean + **/ + @ApiOperation("表单详情") + @GetMapping("/findById") + public ResultBean findById(@ApiParam(value = "主键ID", required = true, type = "Long") Long id) { + + return ResultBean.buildSuccess(coreCustomFormService.findById(id)); + + } + + + /*** + * @Author jianMingWang + * @Description //删除表单 + * @Date 14:29 2021/8/9 + * @Param [coreCustomForm] + * @return com.liuliu.data.custom.entity.ResultBean + **/ + @ApiOperation("删除表单") + @GetMapping("/delForm") + public ResultBean delForm(@ApiParam(value = "主键ID", required = true, type = "Long") Long formId) { + + coreCustomFormService.delForm(formId); + //删除表单对应附表 + return ResultBean.buildSuccess(); + } + + /*** + * @Author jianMingWang + * @Description 创建、编辑表单 + * @Date 14:29 2021/8/9 + * @Param [coreCustomForm] + * @return com.liuliu.data.custom.entity.ResultBean + **/ + @ApiOperation("创建表单") + @PostMapping("/createForm") + public ResultBean createForm(@RequestBody CoreCustomForm dto) throws Exception { + + Integer state = coreCustomFormService.saveForm(dto); + if (state==1){ + return ResultBean.buildError("已发布的表不能修改"); + } + return ResultBean.buildSuccess(); + } + + @ApiOperation("表单发布") + @GetMapping("/publishForm") + public ResultBean publishForm(@RequestParam Long formId,@ApiParam("1为发布,2为取消发布")@RequestParam Integer status) { + + CoreCustomForm byId = coreCustomFormService.getById(formId); + byId.setStatus(status); + coreCustomFormService.publishForm(byId); + return ResultBean.buildSuccess(); + } + + +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/controller/CoreCustomFormDataController.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/controller/CoreCustomFormDataController.java new file mode 100644 index 0000000..17a5ce0 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/controller/CoreCustomFormDataController.java @@ -0,0 +1,154 @@ +package com.yida.data.form.customForm.controller; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.customform.*; +import com.yida.data.customForm.dto.RemindAgainDTO; +import com.yida.data.form.customForm.entity.FormDataReturn; +import com.yida.data.form.customForm.service.CoreCustomFormDataService; +import com.yida.data.form.customForm.service.CoreCustomFormItemChildrenService; +import com.yida.data.form.customForm.service.CoreCustomFormItemsService; +import com.yida.data.form.customForm.service.CoreCustomFormService; +import com.yida.data.customForm.vo.CommitUserVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * @ClassName CoreCustomFormDataController + * @Author jianMingWang + * @Date 2021/8/12 16:54 + * @Version 1.0 + **/ +@Slf4j +@Validated +@RestController +@RequestMapping("/coreCustomFormData") +@RequiredArgsConstructor +@Api(tags = "后台--表单数据相关") +public class CoreCustomFormDataController { + + @Autowired + private CoreCustomFormDataService coreCustomFormDataService; + @Autowired + private CoreCustomFormService coreCustomFormService; + @Autowired + private CoreCustomFormItemsService coreCustomFormItemsService; + @Autowired + private CoreCustomFormItemChildrenService coreCustomFormItemChildrenService; + + + /*** + * @Author jianMingWang + * @Description //列表分页查看当前表单数据 + * @Date 17:33 2021/9/16 + * @Param [] + * @return com.yida.data.common.core.common.ResultBean + **/ + @ApiOperation("列表分页查询当前表单数据") + @GetMapping("/findSubmitFromDataListByFormId") + public ResultBean findSubmitFromDataListByFormId(@ApiParam(required = true, value = "表单主键ID") @RequestParam Integer formId, + @ApiParam(required = true, value = "每页条数") @RequestParam(required = true, defaultValue = "10") Integer pageSize, + @ApiParam(required = true, value = "页码") @RequestParam(required = true, defaultValue = "1") Integer pageNo) { + + return ResultBean.buildSuccess(coreCustomFormDataService.findList(formId, pageSize, pageNo)); + + } + + /*** + * @Author jianMingWang + * @Description //导出excel数据 + * @Date 16:40 2021/9/17 + * @return com.yida.data.common.core.common.ResultBean + **/ + @GetMapping("/exportData") + @ApiOperation("导出表单数据") + public void exportData(@ApiParam(value = "表单主键ID", required = true) @RequestParam Integer formId, HttpServletResponse response) { + try { + coreCustomFormDataService.exportData(formId, response); + } catch (Exception e) { + e.printStackTrace(); + } + } + + /*** + * @Author jianMingWang + * @Description //获取当前表单 + * @Date 11:22 2021/8/10 + * @Param [schoolId, formTypeId] + * @return com.liuliu.data.custom.entity.ResultBean + **/ + @ApiOperation("表单详情") + @GetMapping("/findById") + public ResultBean findById(@ApiParam(value = "主键ID", required = true, type = "Long") Long id) { + + CoreCustomForm coreCustomForm = coreCustomFormService.getById(id); + List coreCustomFormItemList = coreCustomFormItemsService.list(Wrappers.query().lambda().eq(CoreCustomFormItems::getFormId, id)); + coreCustomFormItemList.forEach(coreCustomFormItems -> { + List coreCustomFormItemChildrenlist = coreCustomFormItemChildrenService.list(Wrappers.query().lambda().eq(CoreCustomFormItemChildren::getFormItemId, coreCustomFormItems.getId())); + coreCustomFormItems.setCoreCustomFormItemChildrenList(coreCustomFormItemChildrenlist); + }); + coreCustomForm.setCoreCustomFormItemsList(coreCustomFormItemList); + return ResultBean.buildSuccess(coreCustomForm); + + + } + + @GetMapping("commitUser") + @ApiOperation("表单人员列表查询") + public ResultBean commitUser(@ApiParam("表单id") @RequestParam Long formId, + @ApiParam("未提交为0,已提交为1") @RequestParam Integer type, + @ApiParam("名字") @RequestParam(required = false) String name, + @RequestParam(defaultValue = "1") Long pageNum, + @RequestParam(defaultValue = "10") Long pageSize) { + + Page page = new Page<>(); + page.setCurrent(pageNum); + page.setSize(pageSize); + return ResultBean.buildSuccess(coreCustomFormService.commitUser(formId,type,name,page)); + } + + @GetMapping("findCommitUser") + @ApiOperation("已提交人员列表查询") + public ResultBean findCommitUser(@ApiParam("表单id") @RequestParam Long formId, + @ApiParam("0为未提交,1为已提交") @RequestParam(required = false) Integer fillType, + @RequestParam(defaultValue = "1") Long pageNum, + @RequestParam(defaultValue = "10") Long pageSize) { + + Page page = new Page<>(); + page.setCurrent(pageNum); + page.setSize(pageSize); + return ResultBean.buildSuccess(coreCustomFormService.findCommitUser(formId, fillType, page)); + } + + @GetMapping("findStatistic") + @ApiOperation("查询统计数据") + public ResultBean findStatistic(@ApiParam("表单id") @RequestParam Long formId) { + + return ResultBean.buildSuccess(coreCustomFormService.findStatistic(formId)); + } + + @PostMapping("remindAgain") + @ApiOperation("未提交人员再次提醒") + public ResultBean remindAgain(@RequestBody RemindAgainDTO dto) { + + coreCustomFormService.remindAgain(dto); + return ResultBean.buildSuccess(); + } + + @ApiOperation("导出已提交、未提交人员") + @GetMapping("/exportUserListInOut") + public void exportUserListInOut(@ApiParam("表单id") @RequestParam Long formId, @ApiParam("1为已提交,0为未提交") @RequestParam Integer status, HttpServletResponse response) { + coreCustomFormService.exportUserListInOut(formId, status, response); + } + +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/controller/CoreCustomFormGroupController.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/controller/CoreCustomFormGroupController.java new file mode 100644 index 0000000..0e17119 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/controller/CoreCustomFormGroupController.java @@ -0,0 +1,71 @@ +package com.yida.data.form.customForm.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.customform.CoreCustomForm; +import com.yida.data.common.core.entity.customform.CoreCustomFormGroup; +import com.yida.data.form.customForm.service.CoreCustomFormGroupService; +import com.yida.data.form.customForm.service.CoreCustomFormService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 表单组 Controller + * + * @author ccl + * @date 2021-11-05 15:41:03 + */ +@Slf4j +@Validated +@RestController +@RequestMapping("coreCustomFormGroup") +@RequiredArgsConstructor +@Api(tags = "后台--表单分组") +public class CoreCustomFormGroupController { + + private final CoreCustomFormGroupService formGroupService; + + private final CoreCustomFormService customFormService; + + @GetMapping("findGroupPageList") + @ApiOperation("分页查询表单组") + public ResultBean> findGroupPageList(@RequestParam(defaultValue = "1") Integer pageNum, + @RequestParam(defaultValue = "10") Integer pageSize, + @RequestParam(required = false) String groupName){ + + + return ResultBean.buildSuccess(formGroupService.findGroupPageList(pageNum,pageSize,groupName)); + } + + @PostMapping("saveOrUpdateGroup") + @ApiOperation("新增表单组") + public ResultBean saveOrUpdateGroup(@RequestBody CoreCustomFormGroup formGroup){ + formGroupService.saveOrUpdate(formGroup); + return ResultBean.buildSuccess(); + } + + @PostMapping("removeFormGroup") + @ApiOperation("批量删除表单组") + public ResultBean removeFormGroup(@RequestBody List ids){ + formGroupService.removeByIds(ids); + return ResultBean.buildSuccess(); + } + + @GetMapping("updateFormGroup") + @ApiOperation("将表单分到表单组") + public ResultBean updateFormGroup(@RequestParam @ApiParam("表单组id") Long id, + @RequestParam @ApiParam("组 id") Long groupId){ + CoreCustomForm coreCustomForm = new CoreCustomForm(); + coreCustomForm.setId(id); + coreCustomForm.setGroupId(groupId); + customFormService.updateById(coreCustomForm); + return ResultBean.buildSuccess(); + } +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/controller/CoreCustomFormModelController.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/controller/CoreCustomFormModelController.java new file mode 100644 index 0000000..63eabc6 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/controller/CoreCustomFormModelController.java @@ -0,0 +1,41 @@ +package com.yida.data.form.customForm.controller; + +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.form.customForm.service.CoreCustomFormModelService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +/** + * 自定义表单模板 Controller + * + * @author wjm + * @date 2021-08-30 15:22:15 + */ +@Slf4j +@Validated +@RestController +@RequestMapping("formModel") +@RequiredArgsConstructor +@Api(tags = "后台--表单模板管理") +public class CoreCustomFormModelController { + + private final CoreCustomFormModelService coreCustomFormModelService; + + @GetMapping("/selectFormModel") + @ApiOperation("查询表单模板") + public ResultBean selectFormModel(@RequestParam Long id){ + + return ResultBean.buildSuccess(coreCustomFormModelService.getById(id)); + } + + @GetMapping("/delFormModel") + @ApiOperation("删除表单模板") + public ResultBean delFormModel(@RequestParam Long id){ + coreCustomFormModelService.removeById(id); + return ResultBean.buildSuccess(); + } +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/controller/CoreCustomFormTypeController.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/controller/CoreCustomFormTypeController.java new file mode 100644 index 0000000..d6360c4 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/controller/CoreCustomFormTypeController.java @@ -0,0 +1,47 @@ +package com.yida.data.form.customForm.controller; + +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.customform.CoreCustomFormType; +import com.yida.data.form.customForm.service.CoreCustomFormTypeService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 自定义表单类型表 Controller + * + * @author wjm + * @date 2021-08-12 10:56:57 + */ +@Slf4j +@Validated +@RestController +@RequestMapping("/coreCustomFormType") +@RequiredArgsConstructor +@Api(tags = "后台--表单类型") +public class CoreCustomFormTypeController { + + @Autowired + private final CoreCustomFormTypeService coreCustomFormTypeService; + + + @ApiOperation("查询自定义表单类型LIST") + @GetMapping("/findList") + public ResultBean> fondTypeList(){ + List type = coreCustomFormTypeService.list(); + return ResultBean.buildSuccess(type); + } + + @ApiOperation("新增表单类型") + @PostMapping("/insertFormType") + public ResultBean insertFormType(@RequestBody CoreCustomFormType coreCustomFormType){ + coreCustomFormTypeService.save(coreCustomFormType); + return ResultBean.buildSuccess(); + } +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/controller/InCoreCustomFormController.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/controller/InCoreCustomFormController.java new file mode 100644 index 0000000..2fc644c --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/controller/InCoreCustomFormController.java @@ -0,0 +1,45 @@ +package com.yida.data.form.customForm.controller; + +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.customForm.dto.RemindAgainDTO; +import com.yida.data.form.customForm.service.CoreCustomFormService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author ccl + */ +@Slf4j +@Validated +@RestController +@RequestMapping("in/coreCustomForm") +@RequiredArgsConstructor +@Api(tags = "不鉴权-表单管理") +public class InCoreCustomFormController { + + private final CoreCustomFormService coreCustomFormService; + + @GetMapping("updateById") + @ApiOperation("修改表单为发布") + public ResultBean updateById(@RequestParam Long id){ + coreCustomFormService.updateAndSendNotice(id); + return ResultBean.buildSuccess(); + } + + @GetMapping("remindLast") + @ApiOperation("距离结束通知") + public ResultBean remindLast(@RequestParam Long id){ + RemindAgainDTO dto = new RemindAgainDTO(); + dto.setFormId(id); + coreCustomFormService.remindAgain(dto); + return ResultBean.buildSuccess(); + } + +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/controller/app/AppCustomFormController.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/controller/app/AppCustomFormController.java new file mode 100644 index 0000000..2257f0b --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/controller/app/AppCustomFormController.java @@ -0,0 +1,145 @@ +package com.yida.data.form.customForm.controller.app; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.customform.CoreCustomForm; +import com.yida.data.common.core.entity.customform.CoreCustomFormRelationUser; +import com.yida.data.common.core.entity.customform.CoreCustomFormRelationUserParent; +import com.yida.data.customForm.dto.FormDataInput; +import com.yida.data.form.customForm.service.CoreCustomFormDataService; +import com.yida.data.form.customForm.service.CoreCustomFormRelationUserParentService; +import com.yida.data.form.customForm.service.CoreCustomFormRelationUserService; +import com.yida.data.form.customForm.service.CoreCustomFormService; +import com.yida.data.customForm.vo.FormStudentVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * @author ccl + */ +@Slf4j +@Validated +@RestController +@RequestMapping("/appCustomForm") +@RequiredArgsConstructor +@Api(tags = "app表单--表单管理") +public class AppCustomFormController { + + @Resource + private final CoreCustomFormService formService; + + @Resource + private final CoreCustomFormDataService coreCustomFormDataService; + + @Resource + private final CoreCustomFormRelationUserService userService; + + @Resource + private final CoreCustomFormRelationUserParentService parentService; + + @GetMapping("appFindFormList") + @ApiOperation("app查询填报列表") + public ResultBean> appFindFormList(@ApiParam("用户id") @RequestParam Long userId, + @ApiParam("0为职工,1为学生,2为家长") @RequestParam Integer type, + @ApiParam("学校id") @RequestParam Long schoolId, + @ApiParam("表单名称") @RequestParam(required = false) String tableName, + @ApiParam("表单状态,不传为全查") @RequestParam(required = false) Integer status, + @RequestParam(defaultValue = "10") Long pageSize, + @RequestParam(defaultValue = "1") Long pageNum){ + + return ResultBean.buildSuccess(formService.appFindFormList(new Page(pageNum,pageSize),userId,tableName,status,schoolId,type)); + } + + @GetMapping("appFindAdminFormList") + @ApiOperation("app查询管理列表列表") + public ResultBean> appFindAdminFormList(@ApiParam("用户id") @RequestParam Long userId, + @ApiParam("学校id") @RequestParam Long schoolId, + @ApiParam("表单名称") @RequestParam(required = false) String tableName, + @ApiParam("表单状态,不传为全查") @RequestParam(required = false) Integer status, + @RequestParam(defaultValue = "10") Long pageSize, + @RequestParam(defaultValue = "1") Long pageNum){ + return ResultBean.buildSuccess(formService.appFindAdminFormList(new Page(pageNum,pageSize),userId,tableName,status,schoolId)); + } + + @GetMapping("appHandOnCustomForm") + @ApiOperation("app用户查询用户是否是管理员") + public ResultBean appHandOnCustomForm(@ApiParam("用户id")@RequestParam Long userId, + @ApiParam("学校id")@RequestParam Long schoolId){ + + return ResultBean.buildSuccess(formService.appHandOnCustomForm(userId,schoolId)); + } + + /*** + * @Author jianMingWang + * @Description 提交表单数据 + * @Date 11:28 2021/8/11 + * @Param [formDataInput] + * @return com.liuliu.data.custom.entity.ResultBean + **/ + @ApiOperation("app提交保存表单数据") + @PostMapping("/saveFormData") + public ResultBean saveFormData(@RequestBody FormDataInput formDataInput) { + + CoreCustomForm form = formService.getOne(Wrappers.lambdaQuery(new CoreCustomForm()) + .eq(CoreCustomForm::getTableName, formDataInput.getTableName())); + + //验证用否是否能填报 + List userList = new ArrayList<>(); + List list = userService.list(Wrappers.lambdaQuery(new CoreCustomFormRelationUser()) + .eq(CoreCustomFormRelationUser::getCustomFormId, form.getId())); + if (form.getRecever()==2){ + List list1 = new ArrayList<>(); + List parentList = parentService.list(Wrappers.lambdaQuery(new CoreCustomFormRelationUserParent()) + .eq(CoreCustomFormRelationUserParent::getCustomFormId, form.getId())); + for (CoreCustomFormRelationUserParent userParent : parentList) { + list1.add(userParent.getParentId()); + } + if (!list1.contains(formDataInput.getUserId())){ + return ResultBean.buildError("您不能填报该表"); + } + }else { + for (CoreCustomFormRelationUser relationUser : list) { + userList.add(relationUser.getUserId()); + } + if (!userList.contains(formDataInput.getUserId())) { + return ResultBean.buildError("您不能填报该表"); + } + } + Map data = coreCustomFormDataService.findData(form.getId(), formDataInput.getUserId()); + if (ObjectUtil.isNotEmpty(data)&&form.getUpdateType()==0){ + return ResultBean.buildError("您已填报,请勿重复填写"); + } + coreCustomFormDataService.saveFormData(formDataInput,data); + return ResultBean.buildSuccess(); + + } + + @GetMapping("appFindFormAndData") + @ApiOperation("app查询表单填报详情") + public ResultBean appFindFormAndData(@ApiParam("用户id")@RequestParam Long userId, + @ApiParam("表单id")@RequestParam Long formId){ + + return ResultBean.buildSuccess(formService.appFindFormAndData(userId,formId)); + } + + @GetMapping("appFindStudentByForm") + @ApiOperation("app查询表单关联的学生列表") + public ResultBean> appFindStudentByForm(@ApiParam("家长id")@RequestParam Long userId, + @ApiParam("表单id")@RequestParam Long formId){ + + return ResultBean.buildSuccess(formService.appFindStudentByForm(userId,formId)); + } +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/entity/FormDataReturn.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/entity/FormDataReturn.java new file mode 100644 index 0000000..ba2d1ff --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/entity/FormDataReturn.java @@ -0,0 +1,26 @@ +package com.yida.data.form.customForm.entity; + +import com.yida.data.common.core.entity.customform.CoreCustomFormItems; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +/** + * @ClassName FormDataReturn + * @Author jianMingWang + * @Date 2021/9/17 14:39 + * @Version 1.0 + **/ +@Data +public class FormDataReturn { + private List list; + private Integer total; + private List filedList; + + public FormDataReturn(List list, Integer total, List filedList) { + this.list = list; + this.total = total; + this.filedList = filedList; + } +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/entity/RedisKey.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/entity/RedisKey.java new file mode 100644 index 0000000..f4b47c8 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/entity/RedisKey.java @@ -0,0 +1,14 @@ +package com.yida.data.form.customForm.entity; + +/** + * @ClassName RedisKey + * @Author jianMingWang + * @Date 2021/9/17 13:47 + * @Version 1.0 + **/ +public interface RedisKey { + /** + * 表单主体信息缓存key + */ + String FORM_LOCAL = "form.local."; +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormAuthMapper.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormAuthMapper.java new file mode 100644 index 0000000..f0a1c50 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormAuthMapper.java @@ -0,0 +1,14 @@ +package com.yida.data.form.customForm.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.customform.CoreCustomFormAuth; + +/** + * 表单对应管理员权限表 Mapper + * + * @author ccl + * @date 2021-11-05 15:41:13 + */ +public interface CoreCustomFormAuthMapper extends BaseMapper { + +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormAuthRelationFormMapper.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormAuthRelationFormMapper.java new file mode 100644 index 0000000..95f49c2 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormAuthRelationFormMapper.java @@ -0,0 +1,14 @@ +package com.yida.data.form.customForm.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.customform.CoreCustomFormAuthRelationForm; + +/** + * 权限对应管理员表 Mapper + * + * @author ccl + * @date 2021-11-05 15:41:15 + */ +public interface CoreCustomFormAuthRelationFormMapper extends BaseMapper { + +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormDataMapper.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormDataMapper.java new file mode 100644 index 0000000..86c2a92 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormDataMapper.java @@ -0,0 +1,42 @@ +package com.yida.data.form.customForm.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yida.data.common.core.entity.customform.CoreCustomForm; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + * 自定义表单 Mapper + * + * @author wjm + * @date 2021-08-11 20:55:19 + */ +public interface CoreCustomFormDataMapper{ + + List findFormFiled(@Param("dbName") String dbName, @Param("tableName") String tableName); + + void initSqlWithParameterReturnVoid(@Param("sql") String sql, @Param("parameterMap") Map parameterMap); + + List initSqlWithNUllReturnListMap(@Param("sql") String sql); + + Integer initSqlWithNUllReturnInteger(@Param("sql") String sql); + + /** + * 查询对应表的数据 + * @param sql + * @return + */ + Map findData(@Param("sql") String sql); + + /** + * 清空数据表 + * @param sql + */ + void truncateTable(@Param("sql") String sql); + + void removeBySql(@Param("sql") String sql); +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormGroupMapper.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormGroupMapper.java new file mode 100644 index 0000000..5c73ccf --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormGroupMapper.java @@ -0,0 +1,23 @@ +package com.yida.data.form.customForm.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yida.data.common.core.entity.customform.CoreCustomFormGroup; +import org.apache.ibatis.annotations.Param; + +/** + * 表单组 Mapper + * + * @author ccl + * @date 2021-11-05 15:41:03 + */ +public interface CoreCustomFormGroupMapper extends BaseMapper { + + /** + * 分页查询组列表并返回组内表name; + * @param objectPage + * @param groupName + * @return + */ + Page findGroupPageList(@Param("objectPage") Page objectPage, @Param("groupName") String groupName); +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormItemChildrenMapper.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormItemChildrenMapper.java new file mode 100644 index 0000000..ce0d21d --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormItemChildrenMapper.java @@ -0,0 +1,17 @@ +package com.yida.data.form.customForm.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.customform.CoreCustomFormItemChildren; + +import java.util.List; + +/** + * 自定义表单组件 Mapper + * + * @author wjm + * @date 2021-08-12 10:45:22 + */ +public interface CoreCustomFormItemChildrenMapper extends BaseMapper { + + +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormItemsMapper.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormItemsMapper.java new file mode 100644 index 0000000..b11ca13 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormItemsMapper.java @@ -0,0 +1,16 @@ +package com.yida.data.form.customForm.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.customform.CoreCustomFormItemChildren; +import com.yida.data.common.core.entity.customform.CoreCustomFormItems; + +import java.util.List; + +/** + * 自定义表单组件 Mapper + * + * @author wjm + * @date 2021-08-12 10:44:45 + */ +public interface CoreCustomFormItemsMapper extends BaseMapper { +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormMapper.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormMapper.java new file mode 100644 index 0000000..16a7918 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormMapper.java @@ -0,0 +1,57 @@ +package com.yida.data.form.customForm.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yida.data.common.core.entity.customform.CoreCustomForm; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 自定义表单 Mapper + * + * @author wjm + * @date 2021-08-11 20:55:19 + */ +public interface CoreCustomFormMapper extends BaseMapper { + + IPage findPageList(@Param("page") Page page, @Param("coreCustomForm") CoreCustomForm coreCustomForm); + + Integer initSqlReturnInt(@Param("sql") String sql); + + void initSqlReturnVoid(@Param("sql") String sql); + + + /** + * 查询用户对应填写表单 + * @param page + * @param userId + * @param tableName + * @param status + * @param schoolId + * @return + */ + IPage appFindFormList(@Param("page") Page page, + @Param("userIdList") List userIdList, + @Param("tableName") String tableName, + @Param("status") Integer status, + @Param("schoolId") Long schoolId, + @Param("type") Integer type); + + + /** + * 查询用户对应管理表单 + * @param page + * @param userId + * @param tableName + * @param status + * @param schoolId + * @return + */ + IPage appFindAdminFormList(@Param("page") Page page, + @Param("userId") Long userId, + @Param("tableName") String tableName, + @Param("status") Integer status, + @Param("schoolId") Long schoolId); +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormModelItemChildrenMapper.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormModelItemChildrenMapper.java new file mode 100644 index 0000000..5986ef0 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormModelItemChildrenMapper.java @@ -0,0 +1,14 @@ +package com.yida.data.form.customForm.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.customform.CoreCustomFormModelItemChildren; + +/** + * 自定义表单模板组件 Mapper + * + * @author wjm + * @date 2021-08-30 15:22:32 + */ +public interface CoreCustomFormModelItemChildrenMapper extends BaseMapper { + +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormModelItemsMapper.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormModelItemsMapper.java new file mode 100644 index 0000000..cd4d17b --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormModelItemsMapper.java @@ -0,0 +1,14 @@ +package com.yida.data.form.customForm.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.customform.CoreCustomFormModelItems; + +/** + * 自定义表单模板组件 Mapper + * + * @author wjm + * @date 2021-08-30 15:22:49 + */ +public interface CoreCustomFormModelItemsMapper extends BaseMapper { + +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormModelMapper.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormModelMapper.java new file mode 100644 index 0000000..d661711 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormModelMapper.java @@ -0,0 +1,14 @@ +package com.yida.data.form.customForm.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.customform.CoreCustomFormModel; + +/** + * 自定义表单模板 Mapper + * + * @author wjm + * @date 2021-08-30 15:22:15 + */ +public interface CoreCustomFormModelMapper extends BaseMapper { + +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormRelationAdminMapper.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormRelationAdminMapper.java new file mode 100644 index 0000000..d5c0d3c --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormRelationAdminMapper.java @@ -0,0 +1,14 @@ +package com.yida.data.form.customForm.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.customform.CoreCustomFormRelationAdmin; + +/** + * 表单对应管理员 Mapper + * + * @author ccl + * @date 2021-11-05 15:41:08 + */ +public interface CoreCustomFormRelationAdminMapper extends BaseMapper { + +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormRelationUserMapper.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormRelationUserMapper.java new file mode 100644 index 0000000..3cfb834 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormRelationUserMapper.java @@ -0,0 +1,31 @@ +package com.yida.data.form.customForm.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yida.data.common.core.entity.customform.CoreCustomFormRelationUser; +import org.apache.ibatis.annotations.Param; + +/** + * 表单对应可见人员表 Mapper + * + * @author ccl + * @date 2021-11-05 15:41:11 + */ +public interface CoreCustomFormRelationUserMapper extends BaseMapper { + + /** + * 查询所有的人数和所有已填的人 + * @param id + */ + Integer findUserNum(@Param("id") Long id); + + /** + * 为填报得人员 + * @param formId + * @return + */ + Integer findNotCommit(Long formId); + + Page findUserList(@Param("page") Page page, @Param("type") Integer type, + @Param("name") String name, @Param("formId") Long formId); +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormRelationUserParentMapper.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormRelationUserParentMapper.java new file mode 100644 index 0000000..9da3cf5 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormRelationUserParentMapper.java @@ -0,0 +1,25 @@ +package com.yida.data.form.customForm.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.customform.CoreCustomFormRelationUserParent; +import com.yida.data.common.core.entity.customform.CoreCustomFormStatistic; +import org.apache.ibatis.annotations.Param; + +/** + * @author ccl + */ +public interface CoreCustomFormRelationUserParentMapper extends BaseMapper { + /** + * 查询总数 + * @param formId + * @return + */ + Integer findTotal(@Param("formId") Long formId); + + /** + * 查询未提交数据 + * @param formId + * @return + */ + Integer findParentStatistic(Long formId); +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormStatisticMapper.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormStatisticMapper.java new file mode 100644 index 0000000..bfd92ce --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormStatisticMapper.java @@ -0,0 +1,14 @@ +package com.yida.data.form.customForm.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.customform.CoreCustomFormStatistic; + +/** + * 表单对应统计数据表 Mapper + * + * @author ccl + * @date 2021-11-05 15:58:43 + */ +public interface CoreCustomFormStatisticMapper extends BaseMapper { + +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormTopicalMapper.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormTopicalMapper.java new file mode 100644 index 0000000..0c75053 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormTopicalMapper.java @@ -0,0 +1,14 @@ +package com.yida.data.form.customForm.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.customform.CoreCustomFormTopical; + +/** + * 表单对应主题表 Mapper + * + * @author ccl + * @date 2021-11-05 15:41:09 + */ +public interface CoreCustomFormTopicalMapper extends BaseMapper { + +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormTypeMapper.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormTypeMapper.java new file mode 100644 index 0000000..7d1a96f --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/mapper/CoreCustomFormTypeMapper.java @@ -0,0 +1,14 @@ +package com.yida.data.form.customForm.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.customform.CoreCustomFormType; + +/** + * 自定义表单类型表 Mapper + * + * @author wjm + * @date 2021-08-12 10:56:57 + */ +public interface CoreCustomFormTypeMapper extends BaseMapper { + +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormAuthRelationFormService.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormAuthRelationFormService.java new file mode 100644 index 0000000..280d0f9 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormAuthRelationFormService.java @@ -0,0 +1,15 @@ +package com.yida.data.form.customForm.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.customform.CoreCustomFormAuthRelationForm; + +import java.util.List; + +/** +* 权限对应管理员表 Service接口 +* +* @author ccl +* @date 2021-11-05 15:41:15 +*/ +public interface CoreCustomFormAuthRelationFormService extends IService { +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormAuthService.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormAuthService.java new file mode 100644 index 0000000..1caecef --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormAuthService.java @@ -0,0 +1,16 @@ +package com.yida.data.form.customForm.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.customform.CoreCustomFormAuth; + +import java.util.List; + +/** +* 表单对应管理员权限表 Service接口 +* +* @author ccl +* @date 2021-11-05 15:41:13 +*/ +public interface CoreCustomFormAuthService extends IService { +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormDataService.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormDataService.java new file mode 100644 index 0000000..ec6fce6 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormDataService.java @@ -0,0 +1,74 @@ +package com.yida.data.form.customForm.service; + + +import com.yida.data.customForm.dto.FormDataInput; +import com.yida.data.form.customForm.entity.FormDataReturn; + +import javax.servlet.http.HttpServletResponse; +import java.text.ParseException; +import java.util.List; +import java.util.Map; + +/** + * 自定义表单 Service接口 + * + * @author wjm + * @date 2021-08-11 20:55:19 + */ +public interface CoreCustomFormDataService { + + /*** + * @Author jianMingWang + * @Description 保存表单数据 + * @Date 9:39 2021/9/17 + * @Param formDataInput + * @return void + **/ + void saveFormData(FormDataInput formDataInput,Map data); + + /*** + * @Author jianMingWang + * @Description //分页列表查询表单数据 + * @Date 9:40 2021/9/17 + * @Param [formId, pageSize, pageNo] + * @return java.util.List + **/ + List findSubmitFormDataListByFormId(Integer formId, Integer pageSize, Integer pageNo); + + + /*** + * @Author jianMingWang + * @Description //查询提交总数 + * @Date 14:12 2021/9/17 + * @Param [formId] + * @return java.lang.Integer + **/ + Integer findSubmitFormDataTotalNumByFormId(Integer formId); + + + /*** + * @Author jianMingWang + * @Description //分页查询表单数据 + * @Date 14:34 2021/9/23 + * @Param [formId, pageSize, pageNo] + * @return com.yida.data.customForm.entity.FormDataReturn + **/ + FormDataReturn findList(Integer formId, Integer pageSize, Integer pageNo); + + /*** + * @Author jianMingWang + * @Description //导出表单数据 + * @Date 14:34 2021/9/23 + * @Param [formId, response] + * @return void + **/ + void exportData(Integer formId, HttpServletResponse response) throws ParseException; + + Map findData(Long formId, Long userId); + + /** + * 清空 + * @param sql + */ + void truncateTable(String sql); +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormGroupService.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormGroupService.java new file mode 100644 index 0000000..7e972ba --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormGroupService.java @@ -0,0 +1,21 @@ +package com.yida.data.form.customForm.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.customform.CoreCustomFormGroup; + + +/** +* 表单组 Service接口 +* +* @author ccl +* @date 2021-11-05 15:41:03 +*/ +public interface CoreCustomFormGroupService extends IService { + + /** + * 查询分组列表,同时返回组内表名和id + * @return + */ + Page findGroupPageList(Integer pageNum, Integer pageSize, String groupName); +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormItemChildrenService.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormItemChildrenService.java new file mode 100644 index 0000000..70a2a27 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormItemChildrenService.java @@ -0,0 +1,16 @@ +package com.yida.data.form.customForm.service; + + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.customform.CoreCustomFormItemChildren; + +/** + * 自定义表单组件选项 Service接口 + * + * @author wjm + * @date 2021-08-11 20:55:19 + */ +public interface CoreCustomFormItemChildrenService extends IService { + + +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormItemsService.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormItemsService.java new file mode 100644 index 0000000..28d4c20 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormItemsService.java @@ -0,0 +1,20 @@ +package com.yida.data.form.customForm.service; + + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.CurrentUser; +import com.yida.data.common.core.entity.customform.CoreCustomForm; +import com.yida.data.common.core.entity.customform.CoreCustomFormItems; + +/** + * 自定义表单组件 Service接口 + * + * @author wjm + * @date 2021-08-11 20:55:19 + */ +public interface CoreCustomFormItemsService extends IService { + + +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormModelItemChildrenService.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormModelItemChildrenService.java new file mode 100644 index 0000000..f86e18d --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormModelItemChildrenService.java @@ -0,0 +1,13 @@ +package com.yida.data.form.customForm.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.customform.CoreCustomFormModelItemChildren; + +/** +* 自定义表单模板组件 Service接口 +* +* @author wjm +* @date 2021-08-30 15:22:32 +*/ +public interface CoreCustomFormModelItemChildrenService extends IService { +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormModelItemsService.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormModelItemsService.java new file mode 100644 index 0000000..adb7fdd --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormModelItemsService.java @@ -0,0 +1,13 @@ +package com.yida.data.form.customForm.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.customform.CoreCustomFormModelItems; + +/** +* 自定义表单模板组件 Service接口 +* +* @author wjm +* @date 2021-08-30 15:22:49 +*/ +public interface CoreCustomFormModelItemsService extends IService { +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormModelService.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormModelService.java new file mode 100644 index 0000000..f471ee6 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormModelService.java @@ -0,0 +1,13 @@ +package com.yida.data.form.customForm.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.customform.CoreCustomFormModel; + +/** +* 自定义表单模板 Service接口 +* +* @author wjm +* @date 2021-08-30 15:22:15 +*/ +public interface CoreCustomFormModelService extends IService { +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormRelationAdminService.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormRelationAdminService.java new file mode 100644 index 0000000..ac42252 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormRelationAdminService.java @@ -0,0 +1,17 @@ +package com.yida.data.form.customForm.service; + +import com.yida.data.common.core.entity.QueryRequest; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.customform.CoreCustomFormRelationAdmin; + +import java.util.List; + +/** +* 表单对应管理员 Service接口 +* +* @author ccl +* @date 2021-11-05 15:41:08 +*/ +public interface CoreCustomFormRelationAdminService extends IService { +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormRelationUserParentService.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormRelationUserParentService.java new file mode 100644 index 0000000..a22ecc7 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormRelationUserParentService.java @@ -0,0 +1,18 @@ +package com.yida.data.form.customForm.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.customform.CoreCustomFormRelationUserParent; +import com.yida.data.common.core.entity.customform.CoreCustomFormStatistic; + +/** + * @author ccl + */ +public interface CoreCustomFormRelationUserParentService extends IService { + /** + * 查询家长统计数据 + * + * @param formId + * @return + */ + CoreCustomFormStatistic findParentStatistic(Long formId); +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormRelationUserService.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormRelationUserService.java new file mode 100644 index 0000000..5b44c14 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormRelationUserService.java @@ -0,0 +1,41 @@ +package com.yida.data.form.customForm.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yida.data.common.core.entity.QueryRequest; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.customform.CoreCustomFormRelationUser; +import com.yida.data.common.core.entity.customform.CoreCustomFormStatistic; + +import java.util.List; + +/** +* 表单对应可见人员表 Service接口 +* +* @author ccl +* @date 2021-11-05 15:41:11 +*/ +public interface CoreCustomFormRelationUserService extends IService { + /** + * 查询对应表中所有应填人员,和已填人员 + * @param id + */ + Integer findUserNum(Long id); + + /** + * 查询统计数据 + * @param formId + * @return + */ + CoreCustomFormStatistic findStatistic(Long formId); + + /** + * 条件查询用户 + * @param page + * @param type + * @param name + * @param formId + * @return + */ + Page findUserList(Page page, Integer type, String name, Long formId); +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormService.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormService.java new file mode 100644 index 0000000..d434171 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormService.java @@ -0,0 +1,144 @@ +package com.yida.data.form.customForm.service; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.CurrentUser; +import com.yida.data.common.core.entity.QueryRequest; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.customform.CoreCustomForm; +import com.yida.data.common.core.entity.customform.CoreCustomFormRelationUser; +import com.yida.data.common.core.entity.customform.CoreCustomFormStatistic; +import com.yida.data.customForm.dto.RemindAgainDTO; +import com.yida.data.customForm.dto.SaveCustomFormDTO; +import com.yida.data.customForm.vo.CommitUserVO; +import com.yida.data.customForm.vo.FormStudentVO; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 自定义表单 Service接口 + * + * @author wjm + * @date 2021-08-11 20:55:19 + */ +public interface CoreCustomFormService extends IService { + + IPage findCustomFormPageList(Page page, Long schoolId, Long formTypeId, String model, CurrentUser currentUser); + + Integer saveForm(CoreCustomForm dto) throws Exception; + + + /** + * app查询用户对应填写表单 + * @param objectPage + * @param userId + * @param formName + * @param status + * @param schoolId + * @return + */ + IPage appFindFormList(Page objectPage, Long userId,String tableName,Integer status,Long schoolId,Integer type); + + + /** + * app查询用户管理对应表单 + * @param objectPage + * @param userId + * @param tableName + * @param status + * @param schoolId + * @return + */ + IPage appFindAdminFormList(Page objectPage, Long userId,String tableName,Integer status,Long schoolId); + + /** + * 查询用户对应是否是管理员 + * @param userId + * @param schoolId + * @return + */ + Boolean appHandOnCustomForm(Long userId,Long schoolId); + + /** + * 查询表单详情 + * @param id + * @return + */ + CoreCustomForm findById(Long id); + + /** + * 删除表单,及对应附表 + * @param id + */ + void delForm(Long id); + + void updateAndSendNotice(Long formId); + + /** + * 条件查询表单对应填报情况 + * @param formId + * @param fillType + * @param page + * @return + */ + Page findCommitUser(Long formId, Integer fillType, Page page); + + /** + * 查询表单对应统计数据 + * @param formId + * @return + */ + CoreCustomFormStatistic findStatistic(Long formId); + + /** + * 再次提醒 + * @param dto + */ + void remindAgain(RemindAgainDTO dto); + + /** + * 导出表单未提交和已提交的人员信息 + * @param formId + * @param status + * @param response + */ + void exportUserListInOut(Long formId, Integer status, HttpServletResponse response); + + + + /** + * 发布接口 + * @param byId + */ + void publishForm(CoreCustomForm byId); + + + + /** + * 查询表单和填报数据 + * @param userId + * @param formId + * @return + */ + Object appFindFormAndData(Long userId, Long formId); + + /** + * 条件查询 + * @param formId + * @param type + * @param page + * @return + */ + CommitUserVO commitUser(Long formId, Integer type, String name, Page page); + + /** + * 通过表单查询对应需要填报的学生 + * @param userId + * @param formId + * @return + */ + List appFindStudentByForm(Long userId, Long formId); +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormStatisticService.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormStatisticService.java new file mode 100644 index 0000000..3e30592 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormStatisticService.java @@ -0,0 +1,18 @@ +package com.yida.data.form.customForm.service; + + +import com.yida.data.common.core.entity.QueryRequest; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.customform.CoreCustomFormStatistic; + +import java.util.List; + +/** +* 表单对应统计数据表 Service接口 +* +* @author ccl +* @date 2021-11-05 15:58:43 +*/ +public interface CoreCustomFormStatisticService extends IService { +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormTopicalService.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormTopicalService.java new file mode 100644 index 0000000..dc650b7 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormTopicalService.java @@ -0,0 +1,17 @@ +package com.yida.data.form.customForm.service; + +import com.yida.data.common.core.entity.QueryRequest; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.customform.CoreCustomFormTopical; + +import java.util.List; + +/** +* 表单对应主题表 Service接口 +* +* @author ccl +* @date 2021-11-05 15:41:09 +*/ +public interface CoreCustomFormTopicalService extends IService { +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormTypeService.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormTypeService.java new file mode 100644 index 0000000..2841cef --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/CoreCustomFormTypeService.java @@ -0,0 +1,18 @@ +package com.yida.data.form.customForm.service; + + +import com.yida.data.common.core.entity.QueryRequest; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.customform.CoreCustomFormType; + +import java.util.List; + +/** +* 自定义表单类型表 Service接口 +* +* @author wjm +* @date 2021-08-12 10:56:57 +*/ +public interface CoreCustomFormTypeService extends IService { +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormAuthRelationFormServiceImpl.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormAuthRelationFormServiceImpl.java new file mode 100644 index 0000000..aa5ae5f --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormAuthRelationFormServiceImpl.java @@ -0,0 +1,27 @@ +package com.yida.data.form.customForm.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.customform.CoreCustomFormAuthRelationForm; +import com.yida.data.form.customForm.mapper.CoreCustomFormAuthRelationFormMapper; +import com.yida.data.form.customForm.service.CoreCustomFormAuthRelationFormService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.annotation.Propagation; +import lombok.RequiredArgsConstructor; + + +/** +* 权限对应管理员表 Service实现 +* +* @author ccl +* @date 2021-11-05 15:41:15 +*/ +@Service +@RequiredArgsConstructor +@Transactional(propagation = Propagation.SUPPORTS, readOnly = true) +public class CoreCustomFormAuthRelationFormServiceImpl extends ServiceImpl + implements CoreCustomFormAuthRelationFormService { + +private final CoreCustomFormAuthRelationFormMapper coreCustomFormAuthAdminMapper; + +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormAuthServiceImpl.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormAuthServiceImpl.java new file mode 100644 index 0000000..7ccc4ad --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormAuthServiceImpl.java @@ -0,0 +1,26 @@ +package com.yida.data.form.customForm.service.impl; + +import com.yida.data.common.core.entity.customform.CoreCustomFormAuth; +import com.yida.data.form.customForm.mapper.CoreCustomFormAuthMapper; +import com.yida.data.form.customForm.service.CoreCustomFormAuthService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.annotation.Propagation; +import lombok.RequiredArgsConstructor; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +/** +* 表单对应管理员权限表 Service实现 +* +* @author ccl +* @date 2021-11-05 15:41:13 +*/ +@Service +@RequiredArgsConstructor +@Transactional(propagation = Propagation.SUPPORTS, readOnly = true) +public class CoreCustomFormAuthServiceImpl extends ServiceImpl + implements CoreCustomFormAuthService { + +private final CoreCustomFormAuthMapper coreCustomFormAuthMapper; + +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormDataServiceImpl.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormDataServiceImpl.java new file mode 100644 index 0000000..1b37549 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormDataServiceImpl.java @@ -0,0 +1,433 @@ +package com.yida.data.form.customForm.service.impl; + +import cc.mrbird.febs.common.redis.service.RedisService; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.yida.data.common.core.entity.constant.AppConstant; +import com.yida.data.common.core.entity.customform.*; +import com.yida.data.common.core.entity.notice.qywx.BaseStaffNotice; +import com.yida.data.common.core.entity.notice.qywx.inside.Text; +import com.yida.data.common.core.entity.system.EduApp; +import com.yida.data.common.core.entity.user.EduParent; +import com.yida.data.common.core.entity.user.EduStaff; +import com.yida.data.common.core.entity.user.EduStudent; +import com.yida.data.common.core.utils.ExcelUtil; +import com.yida.data.common.core.utils.WxUtil; +import com.yida.data.common.service.CommonService; +import com.yida.data.customForm.dto.FormDataInput; +import com.yida.data.customForm.vo.ParentCommit; +import com.yida.data.form.customForm.entity.FormDataReturn; +import com.yida.data.form.customForm.entity.RedisKey; +import com.yida.data.form.customForm.mapper.CoreCustomFormDataMapper; +import com.yida.data.form.customForm.service.*; +import com.yida.data.user.feign.RemoteStaffService; +import com.yida.data.user.feign.RemoteStudentService; +import lombok.RequiredArgsConstructor; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; + +import static com.yida.data.common.core.entity.constant.CachePrefixConstant.STAFF_DATA; +import static com.yida.data.common.core.entity.constant.CachePrefixConstant.STUDENT_DATA; + +/** + * 自定义表单 Service实现 + * + * @author wjm + * @date 2021-08-11 20:55:19 + */ +@Service +@RequiredArgsConstructor +@Transactional(propagation = Propagation.SUPPORTS, readOnly = true) +public class CoreCustomFormDataServiceImpl implements CoreCustomFormDataService { + + @Value("${edu.customform.dbname}") + private String dbName; + + @Value("${febs.teacherFormUrl}") + private String teacherFormUrl; + + @Resource + private CoreCustomFormDataMapper coreCustomFormDataMapper; + + @Resource + private CoreCustomFormService coreCustomFormService; + + @Resource + private CoreCustomFormItemsService coreCustomFormItemsService; + + @Resource + private CoreCustomFormRelationUserService userService; + + @Resource + private RedisService redisService; + + @Resource + private RemoteStaffService remoteStaffService; + + @Resource + private RemoteStudentService remoteStudentService; + + @Resource + private CoreCustomFormRelationUserParentService parentService; + + @Resource + private CoreCustomFormRelationAdminService adminService; + + @Resource + private WxUtil wxUtil; + @Resource + private CommonService commonService; + + @Override + public void saveFormData(FormDataInput formDataInput, Map data) { + CoreCustomForm form = coreCustomFormService.getOne(Wrappers.lambdaQuery(new CoreCustomForm()) + .eq(CoreCustomForm::getTableName, formDataInput.getTableName())); + if (ObjectUtil.isNotEmpty(data)) { + String sql = "DELETE FROM " + formDataInput.getTableName() + " WHERE user_id = " + formDataInput.getUserId(); + coreCustomFormDataMapper.removeBySql(sql); + } + + List filedList = coreCustomFormDataMapper.findFormFiled(dbName, formDataInput.getTableName()); + JSONObject jsonObject = JSONUtil.parseObj(formDataInput.getJsonDataString()); + List parameterList = new ArrayList<>(); + Map parameterMap = new HashMap(); + String baseSql = "insert into " + formDataInput.getTableName() + "("; + filedList.forEach(filed -> { + parameterList.add("#{parameterMap." + filed + "}"); + parameterMap.put(filed, jsonObject.get(filed)); + }); + parameterMap.put("create_date", new Date()); + parameterMap.put("user_id", formDataInput.getUserId()); + String finalSql = baseSql + String.join(",", filedList) + ")values(" + String.join(",", parameterList) + ")"; + coreCustomFormDataMapper.initSqlWithParameterReturnVoid(finalSql, parameterMap); + + + //修改填报人填报状态 + CoreCustomForm one = coreCustomFormService.getOne(Wrappers.lambdaQuery(new CoreCustomForm()) + .eq(CoreCustomForm::getTableName, formDataInput.getTableName())); + + if (one.getRecever() != 2) { + userService.update(Wrappers.lambdaUpdate(new CoreCustomFormRelationUser()) + .eq(CoreCustomFormRelationUser::getCustomFormId, one.getId()) + .eq(CoreCustomFormRelationUser::getUserId, formDataInput.getUserId()) + .set(CoreCustomFormRelationUser::getFill, 1) + .set(CoreCustomFormRelationUser::getFillTime, LocalDateTime.now())); + } else if (one.getRecever() == 2) { + parentService.update(Wrappers.lambdaUpdate(new CoreCustomFormRelationUserParent()) + .eq(CoreCustomFormRelationUserParent::getCustomFormId, one.getId()) + .set(CoreCustomFormRelationUserParent::getFillType, 1) + .set(CoreCustomFormRelationUserParent::getFillTime, LocalDateTime.now())); + } + + //新增数据发送通知 + if (form.getRemindAdmin() == 1) { + + //查询对应管理员 + List adminList = adminService.list(Wrappers.lambdaQuery(new CoreCustomFormRelationAdmin()) + .eq(CoreCustomFormRelationAdmin::getCustomFormId, form.getId())); + for (CoreCustomFormRelationAdmin relationUser : adminList) { + EduStaff staff = remoteStaffService.getStaffNoPermission(relationUser.getAdminId()).getData(); + BaseStaffNotice textSchoolNotice = new BaseStaffNotice(); + EduApp appByCodeAndSchool = commonService.getAppByCodeAndSchool(AppConstant.INDEX_PARENT, null, form.getOrgId()); + Text text = new Text(); + textSchoolNotice.setText(text); + textSchoolNotice.setAgentid(appByCodeAndSchool.getWxAgentId()); + String url = teacherFormUrl + appByCodeAndSchool.getWxCorpId() + "&loginType=0&userType=0&state=" + AppConstant.INDEX_PARENT + "&id=" + form.getId(); + ; + + text.setContent("" + form.getRemindAdminModel() + " " + staff.getName() + "已填报《" + form.getFormTitle() + "》" + ""); + textSchoolNotice.setTouser(staff.getWxId()); + String accessToken = wxUtil.getAccessToken(appByCodeAndSchool.getWxCorpId(), appByCodeAndSchool.getWxSecret()); + wxUtil.pushStaffNotice(accessToken, textSchoolNotice); + } + } + + } + + + @Override + public List findSubmitFormDataListByFormId(Integer formId, Integer pageSize, Integer pageNo) { + //查询formID对应的数据表 + CoreCustomForm coreCustomForm = null; + if (redisService.hasKey(RedisKey.FORM_LOCAL + formId)) { + coreCustomForm = (CoreCustomForm) redisService.get(RedisKey.FORM_LOCAL + formId); + } else { + coreCustomForm = coreCustomFormService.getById(formId); + } + + if (ObjectUtil.isEmpty(pageNo) && ObjectUtil.isEmpty(pageSize)) { + String initSql = "select * from " + coreCustomForm.getTableName(); + return coreCustomFormDataMapper.initSqlWithNUllReturnListMap(initSql); + } + + Integer limitBeginNum = pageNo == 1 ? 0 : (pageSize * (pageNo - 1)); + Integer limitEndNum = pageNo * pageSize; + String initSql = "select * from " + coreCustomForm.getTableName() + + " limit " + limitBeginNum + "," + limitEndNum; + //查询出表单数据ListMap + //查询出表单数据 + List maps = coreCustomFormDataMapper.initSqlWithNUllReturnListMap(initSql); + for (Map map : maps) { + Long userId = (Long) map.get("user_id"); + //教职工 + if (coreCustomForm.getRecever() == 0) { + EduStaff staff = (EduStaff) redisService.hget(STAFF_DATA, userId.toString()); + if (ObjectUtil.isEmpty(staff)) { + staff = remoteStaffService.getStaff(userId).getData(); + redisService.hset(STAFF_DATA, userId.toString(), staff); + } + map.put("staff", staff); + } + //学生 + else if (coreCustomForm.getRecever() == 1) { + EduStudent student = (EduStudent) redisService.hget(STUDENT_DATA, userId.toString()); + if (ObjectUtil.isEmpty(student)) { + student = remoteStudentService.getStudentNoPermission(userId).getData(); + redisService.hset(STUDENT_DATA, userId.toString(), student); + } + map.put("student", student); + } + //家长 + else if (coreCustomForm.getRecever() == 2) { + Long customUserId = parentService.getOne(Wrappers.lambdaQuery(new CoreCustomFormRelationUserParent()) + .eq(CoreCustomFormRelationUserParent::getCustomFormId, formId) + .eq(CoreCustomFormRelationUserParent::getParentId, userId)).getCustomUserId(); + Long studentId = userService.getById(customUserId).getUserId(); + + EduStudent student = (EduStudent) redisService.hget(STUDENT_DATA, studentId.toString()); + if (ObjectUtil.isEmpty(student)) { + student = remoteStudentService.getStudentNoPermission(studentId).getData(); + redisService.hset(STUDENT_DATA, studentId.toString(), student); + } + EduParent parent = student.getParents().stream().filter(p -> p.getId().equals(userId)).collect(Collectors.toList()).get(0); + + ParentCommit parentCommit = new ParentCommit(); + parentCommit.setParentName(student.getStuName() + parent.getParentType()); + parentCommit.setPhone(parent.getMobile()); + parentCommit.setSchoolName(student.getSchoolName()); + parentCommit.setCampusName(student.getCampusName()); + parentCommit.setSectionName(student.getSectionName()); + parentCommit.setGradeName(student.getGradeName()); + parentCommit.setClassName(student.getClassName()); + map.put("parent", parentCommit); + } + } + return coreCustomFormDataMapper.initSqlWithNUllReturnListMap(initSql); + } + + + @Override + public Integer findSubmitFormDataTotalNumByFormId(Integer formId) { + CoreCustomForm coreCustomForm = null; + if (redisService.hasKey(RedisKey.FORM_LOCAL + formId)) { + coreCustomForm = (CoreCustomForm) redisService.get(RedisKey.FORM_LOCAL + formId); + } else { + coreCustomForm = coreCustomFormService.getById(formId); + } + String initSql = "select count(id) from " + coreCustomForm.getTableName(); + //查询出表单数据ListMap + //查询出表单数据 + return coreCustomFormDataMapper.initSqlWithNUllReturnInteger(initSql); + } + + @Override + public FormDataReturn findList(Integer formId, Integer pageSize, Integer pageNo) { + List submitFormDataListByFormId = this.findSubmitFormDataListByFormId(formId, pageSize, pageNo); + Integer submitFormDataTotalNumByFormId = this.findSubmitFormDataTotalNumByFormId(formId); + List coreCustomFormItemList = coreCustomFormItemsService.list(Wrappers.query().lambda().eq(CoreCustomFormItems::getFormId, formId)); + return new FormDataReturn(submitFormDataListByFormId, submitFormDataTotalNumByFormId, coreCustomFormItemList); + } + + + @Override + public void exportData(Integer formId, HttpServletResponse response) throws ParseException { + CoreCustomForm byId = coreCustomFormService.getById(formId); + if (byId.getRecever() == 0) { + XSSFWorkbook workbook = new XSSFWorkbook(); + XSSFSheet sheet = workbook.createSheet(); + XSSFRow row = sheet.createRow(0); + List coreCustomFormItemList = coreCustomFormItemsService.list(Wrappers.query().lambda().eq(CoreCustomFormItems::getFormId, formId)); + row.createCell(0).setCellValue("序号"); + row.createCell(1).setCellValue("姓名"); + row.createCell(2).setCellValue("电话"); + row.createCell(coreCustomFormItemList.size() + 3).setCellValue("时间"); + for (int i = 0; i < coreCustomFormItemList.size(); i++) { + row.createCell(i + 4).setCellValue(coreCustomFormItemList.get(i).getItemTitle()); + } + + List submitFormDataListByFormId = this.findSubmitFormDataListByFormId(formId, null, null); + for (int j = 0; j < submitFormDataListByFormId.size(); j++) { + XSSFRow row1 = sheet.createRow(j + 1); + Map map = submitFormDataListByFormId.get(j); + Iterator iter = map.keySet().iterator(); + while (iter.hasNext()) { + //字段名称 + String key = iter.next(); + //填报值 + Object value = map.get(key); + + if ("id".equals(key)) { + row1.createCell(0).setCellValue(ObjectUtil.toString(value)); + continue; + } + if ("user_id".equals(key)) { + EduStaff hget = (EduStaff) redisService.hget(STAFF_DATA, value.toString()); + row1.createCell(1).setCellValue(ObjectUtil.toString(hget.getName())); + row1.createCell(2).setCellValue(ObjectUtil.toString(hget.getMobile())); + continue; + } + if ("create_date".equals(key)) { + SimpleDateFormat myFmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + row1.createCell(coreCustomFormItemList.size() + 2).setCellValue(myFmt.format(myFmt.parse(ObjectUtil.toString(value)))); + continue; + } + for (int i = 0; i < coreCustomFormItemList.size(); i++) { + String itemFiledName = coreCustomFormItemList.get(i).getItemFiledName(); + if (key.equals(itemFiledName)) { + row1.createCell(i + 3).setCellValue(ObjectUtil.toString(value)); + } + } + } + } + ExcelUtil.export("表单数据", "xlsx", workbook, response); + } else if (byId.getRecever() == 1) { + XSSFWorkbook workbook = new XSSFWorkbook(); + XSSFSheet sheet = workbook.createSheet(); + XSSFRow row = sheet.createRow(0); + List coreCustomFormItemList = coreCustomFormItemsService.list(Wrappers.query().lambda().eq(CoreCustomFormItems::getFormId, formId)); + row.createCell(0).setCellValue("序号"); + row.createCell(1).setCellValue("班级"); + row.createCell(2).setCellValue("姓名"); + row.createCell(3).setCellValue("学号"); + row.createCell(coreCustomFormItemList.size() + 3).setCellValue("填报时间"); + for (int i = 0; i < coreCustomFormItemList.size(); i++) { + row.createCell(i + 5).setCellValue(coreCustomFormItemList.get(i).getItemTitle()); + } + List submitFormDataListByFormId = this.findSubmitFormDataListByFormId(formId, null, null); + for (int j = 0; j < submitFormDataListByFormId.size(); j++) { + XSSFRow row1 = sheet.createRow(j + 1); + Map map = submitFormDataListByFormId.get(j); + Iterator iter = map.keySet().iterator(); + while (iter.hasNext()) { + //字段名称 + String key = iter.next(); + //填报值 + Object value = map.get(key); + + if ("id".equals(key)) { + row1.createCell(0).setCellValue(ObjectUtil.toString(value)); + continue; + } + if ("user_id".equals(key)) { + EduStudent hget = (EduStudent) redisService.hget(STUDENT_DATA, value.toString()); + String classAndGrade = hget.getGradeName() + hget.getClassName(); + row1.createCell(1).setCellValue(ObjectUtil.toString(classAndGrade)); + row1.createCell(2).setCellValue(ObjectUtil.toString(hget.getStuName())); + row1.createCell(3).setCellValue(ObjectUtil.toString(hget.getStuNumber())); + continue; + } + if ("create_date".equals(key)) { + SimpleDateFormat myFmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + row1.createCell(coreCustomFormItemList.size() + 3).setCellValue(myFmt.format(myFmt.parse(ObjectUtil.toString(value)))); + continue; + } + for (int i = 0; i < coreCustomFormItemList.size(); i++) { + String itemFiledName = coreCustomFormItemList.get(i).getItemFiledName(); + if (key.equals(itemFiledName)) { + row1.createCell(i + 5).setCellValue(ObjectUtil.toString(value)); + } + } + } + } + ExcelUtil.export("表单数据", "xlsx", workbook, response); + } else if (byId.getRecever() == 2) { + XSSFWorkbook workbook = new XSSFWorkbook(); + XSSFSheet sheet = workbook.createSheet(); + XSSFRow row = sheet.createRow(0); + List coreCustomFormItemList = coreCustomFormItemsService.list(Wrappers.query().lambda().eq(CoreCustomFormItems::getFormId, formId)); + row.createCell(0).setCellValue("序号"); + row.createCell(1).setCellValue("班级"); + row.createCell(2).setCellValue("家长"); + row.createCell(3).setCellValue("电话"); + row.createCell(coreCustomFormItemList.size() + 3).setCellValue("填报时间"); + for (int i = 0; i < coreCustomFormItemList.size(); i++) { + row.createCell(i + 5).setCellValue(coreCustomFormItemList.get(i).getItemTitle()); + } + + List submitFormDataListByFormId = this.findSubmitFormDataListByFormId(formId, null, null); + for (int j = 0; j < submitFormDataListByFormId.size(); j++) { + XSSFRow row1 = sheet.createRow(j + 1); + Map map = submitFormDataListByFormId.get(j); + Iterator iter = map.keySet().iterator(); + while (iter.hasNext()) { + //字段名称 + String key = iter.next(); + //填报值 + Object value = map.get(key); + + if ("id".equals(key)) { + row1.createCell(0).setCellValue(ObjectUtil.toString(value)); + continue; + } + if ("user_id".equals(key)) { + CoreCustomFormRelationUserParent one = parentService.getOne(Wrappers.lambdaQuery(new CoreCustomFormRelationUserParent()) + .eq(CoreCustomFormRelationUserParent::getCustomFormId, formId) + .eq(CoreCustomFormRelationUserParent::getParentId, key)); + CoreCustomFormRelationUser relationStudent = userService.getById(one.getCustomUserId()); + + EduStudent hget = (EduStudent) redisService.hget(STUDENT_DATA, relationStudent.getUserId().toString()); + List parents = hget.getParents(); + EduParent parent = parents.stream().filter(p -> p.getWxId().equals(key)).collect(Collectors.toList()).get(0); + + String classAndGrade = hget.getGradeName() + hget.getClassName(); + row1.createCell(1).setCellValue(ObjectUtil.toString(classAndGrade)); + row1.createCell(2).setCellValue(ObjectUtil.toString(parent.getParentType())); + row1.createCell(3).setCellValue(ObjectUtil.toString(parent.getMobile())); + continue; + } + if ("create_date".equals(key)) { + SimpleDateFormat myFmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + row1.createCell(coreCustomFormItemList.size() + 3).setCellValue(myFmt.format(myFmt.parse(ObjectUtil.toString(value)))); + continue; + } + for (int i = 0; i < coreCustomFormItemList.size(); i++) { + String itemFiledName = coreCustomFormItemList.get(i).getItemFiledName(); + if (key.equals(itemFiledName)) { + row1.createCell(i + 4).setCellValue(ObjectUtil.toString(value)); + } + } + } + } + ExcelUtil.export("表单数据", "xlsx", workbook, response); + } + } + + @Override + public Map findData(Long formId, Long userId) { + CoreCustomForm form = coreCustomFormService.getById(formId); + String sql = "select * from " + form.getTableName() + " where user_id = " + userId; + + return coreCustomFormDataMapper.findData(sql); + } + + @Override + public void truncateTable(String sql) { + coreCustomFormDataMapper.truncateTable(sql); + } + +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormGroupServiceImpl.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormGroupServiceImpl.java new file mode 100644 index 0000000..fcff5ed --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormGroupServiceImpl.java @@ -0,0 +1,40 @@ +package com.yida.data.form.customForm.service.impl; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yida.data.common.core.entity.customform.CoreCustomFormGroup; +import com.yida.data.form.customForm.mapper.CoreCustomFormGroupMapper; +import com.yida.data.form.customForm.service.CoreCustomFormGroupService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.annotation.Propagation; +import lombok.RequiredArgsConstructor; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + + +/** + * 表单组 Service实现 + * + * @author ccl + * @date 2021-11-05 15:41:03 + */ +@Service +@RequiredArgsConstructor +@Transactional(propagation = Propagation.SUPPORTS, readOnly = true) +public class CoreCustomFormGroupServiceImpl extends ServiceImpl + implements CoreCustomFormGroupService { + + private final CoreCustomFormGroupMapper coreCustomFormGroupMapper; + + + + @Override + public Page findGroupPageList(Integer pageNum,Integer pageSize,String groupName) { + + Page groupPage = page(new Page<>(pageNum, pageSize), Wrappers.lambdaQuery(new CoreCustomFormGroup()) + .like(CoreCustomFormGroup::getGroupName, groupName) + .orderByDesc(CoreCustomFormGroup::getCreateDate)); + + return groupPage; + } +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormItemChildrenServiceImpl.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormItemChildrenServiceImpl.java new file mode 100644 index 0000000..306fe1b --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormItemChildrenServiceImpl.java @@ -0,0 +1,27 @@ +package com.yida.data.form.customForm.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.customform.CoreCustomFormItemChildren; +import com.yida.data.form.customForm.mapper.CoreCustomFormItemChildrenMapper; +import com.yida.data.form.customForm.service.CoreCustomFormItemChildrenService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; + +/** + * 自定义表单类型表 Service实现 + * + * @author wjm + * @date 2021-08-12 10:56:57 + */ +@Service +@RequiredArgsConstructor +@Transactional(propagation = Propagation.SUPPORTS, readOnly = true) +public class CoreCustomFormItemChildrenServiceImpl extends ServiceImpl implements CoreCustomFormItemChildrenService { + + @Resource + private final CoreCustomFormItemChildrenMapper coreCustomFormItemChildrenMapper; +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormItemsServiceImpl.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormItemsServiceImpl.java new file mode 100644 index 0000000..b0719dd --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormItemsServiceImpl.java @@ -0,0 +1,28 @@ +package com.yida.data.form.customForm.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.customform.CoreCustomFormItems; +import com.yida.data.form.customForm.mapper.CoreCustomFormItemsMapper; +import com.yida.data.form.customForm.service.CoreCustomFormItemsService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; + +/** + * 自定义表单类型表 Service实现 + * + * @author wjm + * @date 2021-08-12 10:56:57 + */ +@Service +@RequiredArgsConstructor +@Transactional(propagation = Propagation.SUPPORTS, readOnly = true) +public class CoreCustomFormItemsServiceImpl extends ServiceImpl implements CoreCustomFormItemsService { + + @Resource + private final CoreCustomFormItemsMapper coreCustomFormItemsMapper; + +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormModelItemChildrenServiceImpl.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormModelItemChildrenServiceImpl.java new file mode 100644 index 0000000..c7db82e --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormModelItemChildrenServiceImpl.java @@ -0,0 +1,26 @@ +package com.yida.data.form.customForm.service.impl; + +import com.yida.data.common.core.entity.customform.CoreCustomFormModelItemChildren; +import com.yida.data.form.customForm.mapper.CoreCustomFormModelItemChildrenMapper; +import com.yida.data.form.customForm.service.CoreCustomFormModelItemChildrenService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.annotation.Propagation; +import lombok.RequiredArgsConstructor; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +/** +* 自定义表单模板组件 Service实现 +* +* @author wjm +* @date 2021-08-30 15:22:32 +*/ +@Service +@RequiredArgsConstructor +@Transactional(propagation = Propagation.SUPPORTS, readOnly = true) +public class CoreCustomFormModelItemChildrenServiceImpl extends ServiceImpl + implements CoreCustomFormModelItemChildrenService { + +private final CoreCustomFormModelItemChildrenMapper coreCustomFormModelItemChildrenMapper; + +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormModelItemsServiceImpl.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormModelItemsServiceImpl.java new file mode 100644 index 0000000..d591c89 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormModelItemsServiceImpl.java @@ -0,0 +1,26 @@ +package com.yida.data.form.customForm.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.customform.CoreCustomFormModelItems; +import com.yida.data.form.customForm.mapper.CoreCustomFormModelItemsMapper; +import com.yida.data.form.customForm.service.CoreCustomFormModelItemsService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.annotation.Propagation; +import lombok.RequiredArgsConstructor; + +/** +* 自定义表单模板组件 Service实现 +* +* @author wjm +* @date 2021-08-30 15:22:49 +*/ +@Service +@RequiredArgsConstructor +@Transactional(propagation = Propagation.SUPPORTS, readOnly = true) +public class CoreCustomFormModelItemsServiceImpl extends ServiceImpl + implements CoreCustomFormModelItemsService { + +private final CoreCustomFormModelItemsMapper coreCustomFormModelItemsMapper; + +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormModelServiceImpl.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormModelServiceImpl.java new file mode 100644 index 0000000..584919b --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormModelServiceImpl.java @@ -0,0 +1,26 @@ +package com.yida.data.form.customForm.service.impl; + +import com.yida.data.common.core.entity.customform.CoreCustomFormModel; +import com.yida.data.form.customForm.mapper.CoreCustomFormModelMapper; +import com.yida.data.form.customForm.service.CoreCustomFormModelService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.annotation.Propagation; +import lombok.RequiredArgsConstructor; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +/** +* 自定义表单模板 Service实现 +* +* @author wjm +* @date 2021-08-30 15:22:15 +*/ +@Service +@RequiredArgsConstructor +@Transactional(propagation = Propagation.SUPPORTS, readOnly = true) +public class CoreCustomFormModelServiceImpl extends ServiceImpl + implements CoreCustomFormModelService { + +private final CoreCustomFormModelMapper coreCustomFormModelMapper; + +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormRelationAdminServiceImpl.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormRelationAdminServiceImpl.java new file mode 100644 index 0000000..f97ea3f --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormRelationAdminServiceImpl.java @@ -0,0 +1,26 @@ +package com.yida.data.form.customForm.service.impl; + +import com.yida.data.common.core.entity.customform.CoreCustomFormRelationAdmin; +import com.yida.data.form.customForm.mapper.CoreCustomFormRelationAdminMapper; +import com.yida.data.form.customForm.service.CoreCustomFormRelationAdminService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.annotation.Propagation; +import lombok.RequiredArgsConstructor; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +/** +* 表单对应管理员 Service实现 +* +* @author ccl +* @date 2021-11-05 15:41:08 +*/ +@Service +@RequiredArgsConstructor +@Transactional(propagation = Propagation.SUPPORTS, readOnly = true) +public class CoreCustomFormRelationAdminServiceImpl extends ServiceImpl + implements CoreCustomFormRelationAdminService { + +private final CoreCustomFormRelationAdminMapper coreCustomFormRelationAdminMapper; + +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormRelationUserParentServiceImpl.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormRelationUserParentServiceImpl.java new file mode 100644 index 0000000..c234cc2 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormRelationUserParentServiceImpl.java @@ -0,0 +1,32 @@ +package com.yida.data.form.customForm.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.customform.CoreCustomFormRelationUserParent; +import com.yida.data.common.core.entity.customform.CoreCustomFormStatistic; +import com.yida.data.form.customForm.mapper.CoreCustomFormRelationUserParentMapper; +import com.yida.data.form.customForm.service.CoreCustomFormRelationUserParentService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +/** + * @author ccl + */ +@Service +@RequiredArgsConstructor +@Transactional(propagation = Propagation.SUPPORTS, readOnly = true) +public class CoreCustomFormRelationUserParentServiceImpl extends ServiceImpl + implements CoreCustomFormRelationUserParentService { + @Override + public CoreCustomFormStatistic findParentStatistic(Long formId) { + Integer total = baseMapper.findTotal(formId); + Integer notCommit =baseMapper.findParentStatistic(formId); + CoreCustomFormStatistic formStatistic = new CoreCustomFormStatistic(); + formStatistic.setCustomFormId(formId); + formStatistic.setNotSubmitNum(notCommit); + formStatistic.setTotalNum(total); + formStatistic.setSubmitNum(total-notCommit); + return formStatistic; + } +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormRelationUserServiceImpl.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormRelationUserServiceImpl.java new file mode 100644 index 0000000..27b31f4 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormRelationUserServiceImpl.java @@ -0,0 +1,49 @@ +package com.yida.data.form.customForm.service.impl; + +import com.yida.data.common.core.entity.customform.CoreCustomFormRelationUser; +import com.yida.data.common.core.entity.customform.CoreCustomFormStatistic; +import com.yida.data.form.customForm.mapper.CoreCustomFormRelationUserMapper; +import com.yida.data.form.customForm.service.CoreCustomFormRelationUserService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.annotation.Propagation; +import lombok.RequiredArgsConstructor; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +/** + * 表单对应可见人员表 Service实现 + * + * @author ccl + * @date 2021-11-05 15:41:11 + */ +@Service +@RequiredArgsConstructor +@Transactional(propagation = Propagation.SUPPORTS, readOnly = true) +public class CoreCustomFormRelationUserServiceImpl extends ServiceImpl + implements CoreCustomFormRelationUserService { + + private final CoreCustomFormRelationUserMapper coreCustomFormRelationUserMapper; + + @Override + public Integer findUserNum(Long id) { + return baseMapper.findUserNum(id); + } + + @Override + public CoreCustomFormStatistic findStatistic(Long formId) { + Integer num = baseMapper.findNotCommit(formId); + CoreCustomFormStatistic formStatistic = new CoreCustomFormStatistic(); + formStatistic.setTotalNum(findUserNum(formId)); + formStatistic.setNotSubmitNum(num); + formStatistic.setSubmitNum(findUserNum(formId)-num); + formStatistic.setCustomFormId(formId); + return formStatistic; + } + + @Override + public Page findUserList(Page page, Integer type, String name, Long formId) { + + return baseMapper.findUserList(page,type,name,formId); + } +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormServiceImpl.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormServiceImpl.java new file mode 100644 index 0000000..5092ace --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormServiceImpl.java @@ -0,0 +1,1062 @@ +package com.yida.data.form.customForm.service.impl; + +import cc.mrbird.febs.common.redis.service.RedisService; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.CurrentUser; +import com.yida.data.common.core.entity.constant.AppConstant; +import com.yida.data.common.core.entity.customform.*; +import com.yida.data.common.core.entity.job.Job; +import com.yida.data.common.core.entity.notice.qywx.BaseStaffNotice; +import com.yida.data.common.core.entity.notice.qywx.TextSchoolNotice; +import com.yida.data.common.core.entity.notice.qywx.inside.Text; +import com.yida.data.common.core.entity.system.Dept; +import com.yida.data.common.core.entity.system.EduApp; +import com.yida.data.common.core.entity.user.EduParent; +import com.yida.data.common.core.entity.user.EduStaff; +import com.yida.data.common.core.entity.user.EduStaffDept; +import com.yida.data.common.core.entity.user.EduStudent; +import com.yida.data.common.core.utils.ExcelUtil; +import com.yida.data.common.core.utils.WxUtil; +import com.yida.data.common.service.CommonService; +import com.yida.data.customForm.dto.RemindAgainDTO; +import com.yida.data.customForm.vo.*; +import com.yida.data.form.customForm.mapper.CoreCustomFormMapper; +import com.yida.data.form.customForm.service.*; +import com.yida.data.job.feign.RemoteJobService; +import com.yida.data.user.feign.RemoteStaffService; +import com.yida.data.user.feign.RemoteStudentService; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import static com.yida.data.common.core.entity.constant.CachePrefixConstant.STAFF_DATA; +import static com.yida.data.common.core.entity.constant.CachePrefixConstant.STUDENT_DATA; + +/** + * 自定义表单 Service实现 + * + * @author wjm + * @date 2021-08-11 20:55:19 + */ +@Service +@RequiredArgsConstructor +@Transactional(propagation = Propagation.SUPPORTS, readOnly = true) +public class CoreCustomFormServiceImpl extends ServiceImpl implements CoreCustomFormService { + + private static final String JOB_BEAN_NAME = "formUpdateTask"; + private static final String JOB_METHOD_NAME = "formUpdate"; + private static final String JOB_METHOD_NAME1 = "formRemind"; + @Resource + private final CoreCustomFormAuthRelationFormService relationFormService; + @Resource + private final CoreCustomFormRelationAdminService adminService; + @Resource + private final CoreCustomFormMapper coreCustomFormMapper; + @Resource + private CoreCustomFormItemsService coreCustomFormItemsService; + @Resource + private CoreCustomFormItemChildrenService coreCustomFormItemChildrenService; + @Resource + private CoreCustomFormRelationUserService relationUserService; + @Resource + private CoreCustomFormTopicalService topicalService; + @Resource + private CoreCustomFormRelationUserParentService parentService; + @Resource + private RemoteStaffService remoteStaffService; + @Resource + private CoreCustomFormDataService coreCustomFormDataService; + + @Resource + private CommonService commonService; + @Resource + private WxUtil wxUtil; + @Resource + private RedisService redisService; + + @Resource + private RemoteJobService remoteJobService; + @Resource + private RemoteStudentService remoteStudentService; + + @Value("${edu.customform.basetablename}") + private String baseTableName; + + @Value("${febs.parentFormUrl}") + private String parentFormUrl; + + @Value("${febs.teacherFormUrl}") + private String teacherFormUrl; + + @Override + public IPage findCustomFormPageList(Page page, Long schoolId, Long formTypeId, String model, CurrentUser currentUser) { + CoreCustomForm coreCustomForm = new CoreCustomForm(); + if (0 == formTypeId) { + coreCustomForm.setCreateId(currentUser.getUserId()); + coreCustomForm.setFormTypeId(null); + } else { + coreCustomForm.setFormTypeId(formTypeId); + } + coreCustomForm.setOrgId(schoolId); + IPage pageList = coreCustomFormMapper.findPageList(page, coreCustomForm); + pageList.getRecords().forEach(customForm -> { + String tableName = customForm.getTableName(); + if (ObjectUtil.isNotEmpty(tableName)) { + String sql = "SELECT count(id) FROM " + tableName; + int i = coreCustomFormMapper.initSqlReturnInt(sql); + customForm.setSubmitNum(i); + } + }); + return pageList; + } + + /*** + * @Author jianMingWang + * @Description 保存表单信息 + * @Date 15:39 2021/8/12 + * @Param [coreCustomForm] + * @return void + **/ + @Override + public Integer saveForm(CoreCustomForm coreCustomForm) { + + + if (ObjectUtil.isNotEmpty(coreCustomForm.getId())) { + CoreCustomForm byId = getById(coreCustomForm.getId()); + //2.1编辑时判断是否已发布,发布后不能修改 + if (byId.getStatus() == 1) { + //已发布,不能修改 + return 1; + } + updateById(coreCustomForm); + //2.2删除之前的任务 + remoteJobService.delJobByMethod(JOB_BEAN_NAME, JOB_METHOD_NAME, coreCustomForm.getId().toString()); + //2.4删除附表 + coreCustomFormItemsService.remove(Wrappers.query().lambda().eq(CoreCustomFormItems::getFormId, coreCustomForm.getId())); + coreCustomFormItemChildrenService.remove(Wrappers.query().lambda().eq(CoreCustomFormItemChildren::getFormId, coreCustomForm.getId())); + relationUserService.remove(Wrappers.lambdaQuery(new CoreCustomFormRelationUser()) + .eq(CoreCustomFormRelationUser::getCustomFormId, coreCustomForm.getId())); + adminService.remove(Wrappers.lambdaQuery(new CoreCustomFormRelationAdmin()) + .eq(CoreCustomFormRelationAdmin::getCustomFormId, coreCustomForm.getId())); + //2.4删除表对应的管理员的权限 + relationFormService.remove(Wrappers.lambdaQuery(new CoreCustomFormAuthRelationForm()) + .eq(CoreCustomFormAuthRelationForm::getCustomFormId, coreCustomForm.getId())); + parentService.remove(Wrappers.lambdaQuery(new CoreCustomFormRelationUserParent()) + .eq(CoreCustomFormRelationUserParent::getCustomFormId, coreCustomForm.getId())); + } else { + coreCustomForm.setTableName(baseTableName + System.currentTimeMillis()); + save(coreCustomForm); + } + String droptableSql = "DROP TABLE IF EXISTS `" + coreCustomForm.getTableName() + "`; \n"; + + StringBuffer stringBuffer = new StringBuffer(); + String createTableSql = "CREATE TABLE " + coreCustomForm.getTableName() + "( \n" + "`id` int(11) NOT NULL AUTO_INCREMENT,\n"; + stringBuffer.append(createTableSql); + + + //3.1添加组件 + coreCustomForm.getCoreCustomFormItemsList().forEach(coreCustomFormItems -> { + + String typeValue = ""; + if ("moreInput".equals(coreCustomFormItems.getItemType())) { + typeValue = "text"; + } else { + typeValue = "varchar(255)"; + } + String filedName = coreCustomFormItems.getItemType() + System.currentTimeMillis(); + String sql = "`" + filedName + "` " + typeValue + " DEFAULT NULL COMMENT '" + coreCustomFormItems.getItemTitle() + "'"; + stringBuffer.append(sql).append(","); + + + coreCustomFormItems.setId(null); + coreCustomFormItems.setFormId(coreCustomForm.getId()); + coreCustomFormItems.setDelFlag(0); + coreCustomFormItems.setItemFiledName(filedName); + coreCustomFormItemsService.save(coreCustomFormItems); + + coreCustomFormItems.getCoreCustomFormItemChildrenList().forEach(coreCustomFormItemChildren -> { + coreCustomFormItemChildren.setId(null); + coreCustomFormItemChildren.setFormItemId(coreCustomFormItems.getId()); + coreCustomFormItemChildren.setFormId(coreCustomForm.getId()); + coreCustomFormItemChildrenService.save(coreCustomFormItemChildren); + + }); + + }); + + + //3.2执行创建表sql + + coreCustomFormMapper.initSqlReturnVoid(droptableSql); + + String initsql = stringBuffer + + "`user_id` bigint DEFAULT NULL,\n" + + "`create_date` datetime DEFAULT NULL,\n" + + "PRIMARY KEY (`id`)\n" + + ") ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8"; + + coreCustomFormMapper.initSqlReturnVoid(initsql); + + //4.1保存表单对应管理员和管理员对应权限 + List adminList = new ArrayList<>(); + List adminAuthList = new ArrayList<>(); + List formRelationAdmins = coreCustomForm.getFormRelationAdmins(); + for (CoreCustomFormRelationAdmin formRelationAdmin : formRelationAdmins) { + formRelationAdmin.setCustomFormId(coreCustomForm.getId()); + adminList.add(formRelationAdmin); + List relationForms = formRelationAdmin.getRelationForms(); + for (CoreCustomFormAuthRelationForm relationForm : relationForms) { + relationForm.setUserId(formRelationAdmin.getAdminId()); + relationForm.setCustomFormId(coreCustomForm.getId()); + adminAuthList.add(relationForm); + } + } + adminService.saveBatch(adminList); + + relationFormService.saveBatch(adminAuthList); + + //4.1保存填写人员列表,如果每个家长必须填,则保存家长WxId,如果为每个学生必须填,则保存学生id + + List userList = new ArrayList<>(); + List formRelationUsers = coreCustomForm.getFormRelationUsers(); + for (CoreCustomFormRelationUser formRelationUser : formRelationUsers) { + formRelationUser.setCustomFormId(coreCustomForm.getId()); + userList.add(formRelationUser); + } + relationUserService.saveBatch(userList); + //4.1.1如果表单收集对象为家长则保存家长微信id和家长id + List userParentList = new ArrayList<>(); + if (coreCustomForm.getRecever() == 2) { + for (CoreCustomFormRelationUser formRelationUser : userList) { + EduStudent student = (EduStudent) redisService.hget(STUDENT_DATA, formRelationUser.getUserId().toString()); + if (ObjectUtil.isEmpty(student)) { + student = remoteStudentService.getStudentNoPermission(formRelationUser.getUserId()).getData(); + redisService.hset(STUDENT_DATA, formRelationUser.getUserId().toString(), student); + } + List parents = student.getParents(); + for (EduParent parent : parents) { + CoreCustomFormRelationUserParent userParent = new CoreCustomFormRelationUserParent(); + userParent.setParentId(parent.getId()); + userParent.setParentWxId(parent.getWxId()); + userParent.setCustomFormId(coreCustomForm.getId()); + userParent.setCustomUserId(formRelationUser.getId()); + userParentList.add(userParent); + } + + } + } + parentService.saveBatch(userParentList); + + if (ObjectUtil.isEmpty(coreCustomForm.getId())) { + //1.新增主体表 + //1.1直接发布看需不需要提醒 + if (coreCustomForm.getStatus() == 1) { + //1.1.1发布时需要提醒用户且为家长 + if (coreCustomForm.getRemindUser() == 1) { + remindUser(coreCustomForm); + } + + //1.2定时发布 + if (coreCustomForm.getPublishType() == 1) { + + LocalDateTime publishDate = coreCustomForm.getPublishDate(); + Job job = new Job(); + job.setBeanName(JOB_BEAN_NAME); + job.setMethodName(JOB_METHOD_NAME); + job.setParams(coreCustomForm.getId().toString()); + job.setStatus(Job.ScheduleStatus.NORMAL.getValue()); + + // 1.2.1cron表达式 + String cron = "0" + + " " + + publishDate.getMinute() + + " " + + publishDate.getHour() + + " " + + publishDate.getDayOfMonth() + + " " + + publishDate.getMonthValue() + + " " + + "?" + + " " + + publishDate.getYear(); + job.setCronExpression(cron); + remoteJobService.saveJob(job); + } + } + } else { + //2.编辑 + + //2.3定时发布 + if (coreCustomForm.getPublishType() == 1) { + + LocalDateTime publishDate = coreCustomForm.getPublishDate(); + Job job = new Job(); + job.setBeanName(JOB_BEAN_NAME); + job.setMethodName(JOB_METHOD_NAME); + job.setParams(coreCustomForm.getId().toString()); + job.setStatus(Job.ScheduleStatus.NORMAL.getValue()); + + //2.3.1cron表达式 + String cron = "0" + + " " + + publishDate.getMinute() + + " " + + publishDate.getHour() + + " " + + publishDate.getDayOfMonth() + + " " + + publishDate.getMonthValue() + + " " + + "?" + + " " + + publishDate.getYear(); + job.setCronExpression(cron); + remoteJobService.saveJob(job); + } + //修改为立即发布看需不需要通知家长; + if (coreCustomForm.getStatus() == 1) { + if (coreCustomForm.getRemindUser() == 1) { + remindUser(coreCustomForm); + } + } + } + return 200; + } + + /** + * 通知表单对应人员 + * + * @param coreCustomForm + */ + private void remindUser(CoreCustomForm coreCustomForm) { + if (coreCustomForm.getRecever() == 1 || coreCustomForm.getRecever() == 2) { + + List userId = new ArrayList<>(); + for (CoreCustomFormRelationUser formRelationUser : coreCustomForm.getFormRelationUsers()) { + userId.add(formRelationUser.getUserId()); + } + List parentId = remoteStudentService.findParentWxId(userId).getData(); + //1.1.2发送通知 + TextSchoolNotice textSchoolNotice = new TextSchoolNotice(); + EduApp appByCodeAndSchool = commonService.getAppByCodeAndSchool(AppConstant.INDEX_PARENT, null, coreCustomForm.getOrgId()); + + Text text = new Text(); + textSchoolNotice.setText(text); + textSchoolNotice.setAgentid(appByCodeAndSchool.getWxAgentId()); + String url = parentFormUrl + appByCodeAndSchool.getWxCorpId() + "&loginType=0&userType=1&state=" + AppConstant.INDEX_PARENT + "&id=" + coreCustomForm.getId(); + String remindUserModel = coreCustomForm.getRemindUserModel(); + if (ObjectUtil.isEmpty(remindUserModel)) { + remindUserModel = ""; + } + text.setContent("" + "《" + coreCustomForm.getFormTitle() + "》" + remindUserModel + ""); + textSchoolNotice.setTo_parent_userid(parentId); + String accessToken = wxUtil.getAccessToken(appByCodeAndSchool.getWxCorpId(), appByCodeAndSchool.getWxSecret()); + wxUtil.pushSchoolNotice(accessToken, textSchoolNotice); + + } + //通知教职工 + if (coreCustomForm.getRecever() == 0) { + for (CoreCustomFormRelationUser relationUser : coreCustomForm.getFormRelationUsers()) { + EduStaff staff = remoteStaffService.getStaffNoPermission(relationUser.getUserId()).getData(); + BaseStaffNotice textSchoolNotice = new BaseStaffNotice(); + EduApp appByCodeAndSchool = commonService.getAppByCodeAndSchool(AppConstant.CONTACT_SELECT, null, coreCustomForm.getOrgId()); + Text text = new Text(); + textSchoolNotice.setText(text); + textSchoolNotice.setAgentid(appByCodeAndSchool.getWxAgentId()); + String url = teacherFormUrl + appByCodeAndSchool.getWxCorpId() + "&loginType=0&userType=0&state=" + + AppConstant.CONTACT_SELECT + "&id=" + coreCustomForm.getId(); + String remindUserModel = coreCustomForm.getRemindUserModel(); + if (ObjectUtil.isEmpty(remindUserModel)) { + remindUserModel = ""; + } + text.setContent("" + "《" + coreCustomForm.getFormTitle() + "》" + remindUserModel + ""); + textSchoolNotice.setTouser(staff.getWxId()); + String accessToken = wxUtil.getAccessToken(appByCodeAndSchool.getWxCorpId(), appByCodeAndSchool.getWxSecret()); + wxUtil.pushStaffNotice(accessToken, textSchoolNotice); + } + } + //1.2看需不需要快结束时提醒 + if (coreCustomForm.getRemind() == 1) { + //创建定时任务,快结束时提醒 + LocalDateTime publishDate = coreCustomForm.getEndDate().minusHours(coreCustomForm.getRemindHour()); + Job job = new Job(); + job.setBeanName(JOB_BEAN_NAME); + job.setMethodName(JOB_METHOD_NAME1); + job.setParams(coreCustomForm.getId().toString()); + job.setStatus(Job.ScheduleStatus.NORMAL.getValue()); + + + // 1.2.1cron表达式 + String cron = "0" + + " " + + publishDate.getMinute() + + " " + + publishDate.getHour() + + " " + + publishDate.getDayOfMonth() + + " " + + publishDate.getMonthValue() + + " " + + "?" + + " " + + publishDate.getYear(); + job.setCronExpression(cron); + remoteJobService.saveJob(job); + } + } + + @Override + public IPage appFindFormList(Page page, Long userId, String tableName, Integer status, Long schoolId, Integer type) { + + List userIdList = new ArrayList<>(); + + + //type = 1 的时候 userId = 家长id + if (type == 1) { + List data = remoteStudentService.listStudentByParent(userId).getData(); + //空的证明没有学生直接返回; + if (CollectionUtil.isEmpty(data)) { + return new Page<>(); + } + for (EduStudent datum : data) { + userIdList.add(datum.getId()); + } + + IPage coreCustomFormIPage = baseMapper.appFindFormList(page, userIdList, tableName, status, schoolId, type); + for (CoreCustomForm record : coreCustomFormIPage.getRecords()) { + + if (record.getRecever() == 1) { + //已填报数量 + int size = relationUserService.list(Wrappers.lambdaQuery(new CoreCustomFormRelationUser()) + .eq(CoreCustomFormRelationUser::getCustomFormId, record.getId()) + .eq(CoreCustomFormRelationUser::getFill, 1) + .in(CoreCustomFormRelationUser::getUserId, userIdList)).size(); + record.setFillNum(size); + //已填报数量需要填报数量 + int needSize = relationUserService.list(Wrappers.lambdaQuery(new CoreCustomFormRelationUser()) + .eq(CoreCustomFormRelationUser::getCustomFormId, record.getId()) + .in(CoreCustomFormRelationUser::getUserId, userIdList)).size(); + record.setNeedFillNum(needSize); + } else { + Integer fillType = parentService.getOne(Wrappers.lambdaQuery(new CoreCustomFormRelationUserParent()) + .eq(CoreCustomFormRelationUserParent::getCustomFormId, record.getId()) + .eq(CoreCustomFormRelationUserParent::getParentId, userId)).getFillType(); + record.setFill(fillType); + } + } + return coreCustomFormIPage; + } else { + userIdList.add(userId); + + return baseMapper.appFindFormList(page, userIdList, tableName, status, schoolId, type); + } + } + + @Override + public IPage appFindAdminFormList(Page page, Long userId, String tableName, Integer status, Long schoolId) { + + return baseMapper.appFindAdminFormList(page, userId, tableName, status, schoolId); + } + + @Override + public Boolean appHandOnCustomForm(Long userId, Long schoolId) { + List list = adminService.list(Wrappers.lambdaQuery(new CoreCustomFormRelationAdmin()) + .eq(CoreCustomFormRelationAdmin::getAdminId, userId)); + return !CollectionUtil.isEmpty(list); + } + + @Override + public CoreCustomForm findById(Long id) { + CoreCustomForm coreCustomForm = getById(id); + List coreCustomFormItemList = coreCustomFormItemsService.list(Wrappers.query().lambda().eq(CoreCustomFormItems::getFormId, id)); + coreCustomFormItemList.forEach(coreCustomFormItems -> { + List coreCustomFormItemChildrenList = coreCustomFormItemChildrenService.list(Wrappers.query().lambda().eq(CoreCustomFormItemChildren::getFormItemId, coreCustomFormItems.getId())); + coreCustomFormItems.setCoreCustomFormItemChildrenList(coreCustomFormItemChildrenList); + }); + coreCustomForm.setCoreCustomFormItemsList(coreCustomFormItemList); + + //查询表对应主题 + coreCustomForm.setCoreCustomFormTopical(topicalService.getOne(Wrappers.lambdaQuery(new CoreCustomFormTopical()) + .eq(CoreCustomFormTopical::getCustomFormId, id))); + //查询对应关联填写用户 + List list = relationUserService.list(Wrappers.lambdaQuery(new CoreCustomFormRelationUser()) + .eq(CoreCustomFormRelationUser::getCustomFormId, id)); + coreCustomForm.setFormRelationUsers(list); + //查询对应关联管理员 + List relationAdmins = adminService.list(Wrappers.lambdaQuery(new CoreCustomFormRelationAdmin()) + .eq(CoreCustomFormRelationAdmin::getCustomFormId, id)); + for (CoreCustomFormRelationAdmin relationAdmin : relationAdmins) { + //查询对应关联权限 + relationAdmin.setRelationForms(relationFormService.list(Wrappers.lambdaQuery(new CoreCustomFormAuthRelationForm()) + .eq(CoreCustomFormAuthRelationForm::getCustomFormId, id) + .eq(CoreCustomFormAuthRelationForm::getUserId, relationAdmin.getAdminId()))); + } + coreCustomForm.setFormRelationAdmins(relationAdmins); + + return coreCustomForm; + } + + @Override + public void delForm(Long id) { + //删除主表 + baseMapper.deleteById(id); + //删除附表 + relationUserService.remove(Wrappers.lambdaQuery(new CoreCustomFormRelationUser()) + .eq(CoreCustomFormRelationUser::getCustomFormId, id)); + adminService.remove(Wrappers.lambdaQuery(new CoreCustomFormRelationAdmin()) + .eq(CoreCustomFormRelationAdmin::getCustomFormId, id)); + coreCustomFormItemsService.remove(Wrappers.lambdaQuery(new CoreCustomFormItems()) + .eq(CoreCustomFormItems::getFormId, id)); + coreCustomFormItemChildrenService.remove(Wrappers.lambdaQuery(new CoreCustomFormItemChildren()) + .eq(CoreCustomFormItemChildren::getFormId, id)); + relationFormService.remove(Wrappers.lambdaQuery(new CoreCustomFormAuthRelationForm()) + .eq(CoreCustomFormAuthRelationForm::getCustomFormId, id)); + topicalService.remove(Wrappers.lambdaQuery(new CoreCustomFormTopical()) + .eq(CoreCustomFormTopical::getCustomFormId, id)); + } + + @Override + public void updateAndSendNotice(Long formId) { + + //修改为发布 + update(Wrappers.lambdaUpdate(new CoreCustomForm()) + .eq(CoreCustomForm::getId, formId) + .set(CoreCustomForm::getStatus, 1)); + + CoreCustomForm coreCustomForm = getById(formId); + List list = relationUserService.list(Wrappers.lambdaQuery(new CoreCustomFormRelationUser()) + .eq(CoreCustomFormRelationUser::getCustomFormId, formId)); + + //发布时需要提醒用户且为家长 + if (coreCustomForm.getRemindUser() == 1 && coreCustomForm.getRecever() == 1) { + List userId = new ArrayList<>(); + for (CoreCustomFormRelationUser formRelationUser : list) { + userId.add(formRelationUser.getUserId()); + } + List parentId = remoteStudentService.findParentWxId(userId).getData(); + //发送通知 + TextSchoolNotice textSchoolNotice = new TextSchoolNotice(); + EduApp appByCodeAndSchool = commonService.getAppByCodeAndSchool(AppConstant.INDEX_PARENT, null, coreCustomForm.getOrgId()); + + Text text = new Text(); + textSchoolNotice.setText(text); + textSchoolNotice.setAgentid(appByCodeAndSchool.getWxAgentId()); + String url = parentFormUrl + appByCodeAndSchool.getWxCorpId() + "&loginType=0&userType=1&state=" + AppConstant.INDEX_PARENT + "&id=" + coreCustomForm.getId(); + String remindUserModel = coreCustomForm.getRemindUserModel(); + if (ObjectUtil.isEmpty(remindUserModel)) { + remindUserModel = ""; + } + text.setContent("" + "《" + coreCustomForm.getFormTitle() + "》" + remindUserModel + ""); + textSchoolNotice.setTo_parent_userid(parentId); + String accessToken = wxUtil.getAccessToken(appByCodeAndSchool.getWxCorpId(), appByCodeAndSchool.getWxSecret()); + wxUtil.pushSchoolNotice(accessToken, textSchoolNotice); + } + //发布同时开启了快到期提醒 + if (coreCustomForm.getRemind() == 1) { + //创建定时任务,快结束时提醒 + LocalDateTime publishDate = coreCustomForm.getEndDate().minusHours(coreCustomForm.getRemindHour()); + //发布时的 + if (publishDate.isAfter(LocalDateTime.now())) { + + } + Job job = new Job(); + job.setBeanName(JOB_BEAN_NAME); + job.setMethodName(JOB_METHOD_NAME1); + job.setParams(coreCustomForm.getId().toString()); + job.setStatus(Job.ScheduleStatus.NORMAL.getValue()); + + StringBuilder cron = new StringBuilder(); + // 1.2.1cron表达式 + cron.append("0") + .append(" ") + .append(publishDate.getMinute()) + .append(" ") + .append(publishDate.getHour()) + .append(" ") + .append(publishDate.getDayOfMonth()) + .append(" ") + .append(publishDate.getMonthValue()) + .append(" ") + .append("?") + .append(" ") + .append(publishDate.getYear()); + job.setCronExpression(cron.toString()); + remoteJobService.saveJob(job); + } + } + + @Override + public Page findCommitUser(Long formId, Integer fillType, Page page) { + CoreCustomForm form = getById(formId); + List submitFormDataListByFormId = coreCustomFormDataService.findSubmitFormDataListByFormId(formId.intValue(), null, null); + List formItems = coreCustomFormItemsService.list(Wrappers.lambdaQuery(new CoreCustomFormItems()) + .eq(CoreCustomFormItems::getFormId, formId)); + + //接收对象为家长 + List commitUser = new ArrayList<>(); + if (form.getRecever() == 2) { + Page parentPage = parentService.page(page, Wrappers.lambdaQuery(new CoreCustomFormRelationUserParent()) + .eq(CoreCustomFormRelationUserParent::getCustomFormId, formId) + .eq(CoreCustomFormRelationUserParent::getFillType, fillType)); + for (CoreCustomFormRelationUserParent record : parentPage.getRecords()) { + List collect = submitFormDataListByFormId.stream().filter(o -> o.get("user_id").toString().equals(record.getParentId().toString())).collect(Collectors.toList()); + for (Map datum : collect) { + if (form.getRecever() == 0) { + datum.put("type", 0); + } else if (form.getRecever() == 1) { + datum.put("type", 1); + } + CoreCustomFormRelationUser byId = relationUserService.getById(record.getCustomUserId()); + EduStudent student = (EduStudent) redisService.hget(STUDENT_DATA, byId.getUserId().toString()); + if (ObjectUtil.isEmpty(student)) { + student = remoteStudentService.getStudentNoPermission(byId.getUserId()).getData(); + redisService.hset(STUDENT_DATA, byId.getUserId().toString(), student); + } + EduParent parent = student.getParents().stream().filter(p -> p.getId().equals(record.getParentId())).collect(Collectors.toList()).get(0); + List eduParents = new ArrayList<>(); + eduParents.add(parent); + student.setParents(eduParents); + datum.put("parent", parent); + datum.put("filedList", formItems); + } + Map map = new HashMap<>(); + map.put("staffAndData", collect); + commitUser.add(map); + } + Page page1 = new Page<>(); + page1.setSize(parentPage.getSize()); + page1.setCurrent(parentPage.getCurrent()); + page1.setTotal(parentPage.getTotal()); + page1.setRecords(commitUser); + return page1; + } + + Page userPage = relationUserService.page(page, Wrappers.lambdaQuery(new CoreCustomFormRelationUser()) + .eq(CoreCustomFormRelationUser::getCustomFormId, formId) + .eq(CoreCustomFormRelationUser::getFill, fillType)); + for (CoreCustomFormRelationUser record : userPage.getRecords()) { + EduStaff staff = new EduStaff(); + EduStudent student = new EduStudent(); + if (form.getRecever() == 0) { + staff = (EduStaff) redisService.hget(STAFF_DATA, record.getUserId().toString()); + if (ObjectUtil.isEmpty(staff)) { + staff = remoteStaffService.getStaff(record.getUserId()).getData(); + redisService.hset(STAFF_DATA, record.getUserId().toString(), staff); + } + } + if (form.getRecever() == 1) { + student = (EduStudent) redisService.hget(STUDENT_DATA, record.getUserId().toString()); + if (ObjectUtil.isEmpty(student)) { + student = remoteStudentService.getStudentNoPermission(record.getUserId()).getData(); + redisService.hset(STUDENT_DATA, record.getUserId().toString(), student); + } + } + // + List data = submitFormDataListByFormId.stream().filter(o -> o.get("user_id").toString().equals(record.getUserId().toString())).collect(Collectors.toList()); + + for (Map datum : data) { + if (form.getRecever() == 0) { + datum.put("type", 0); + } else if (form.getRecever() == 1) { + datum.put("type", 1); + } + datum.put("student", student); + datum.put("staff", staff); + datum.put("filedList", formItems); + } + Map map = new HashMap<>(); + map.put("staffAndData", data); + commitUser.add(map); + } + Page page1 = new Page<>(); + page1.setSize(userPage.getSize()); + page1.setCurrent(userPage.getCurrent()); + page1.setTotal(userPage.getTotal()); + page1.setRecords(commitUser); + return page1; + } + + @Override + public CoreCustomFormStatistic findStatistic(Long formId) { + CoreCustomForm byId = getById(formId); + //教职工和学生统计 + if (byId.getRecever() == 0 || byId.getRecever() == 1) { + return relationUserService.findStatistic(formId); + } + //家长统计 + return parentService.findParentStatistic(formId); + } + + @Override + public void remindAgain(RemindAgainDTO dto) { + CoreCustomForm byId = getById(dto.getFormId()); + + //查询未填报人员id, + List userIdList = dto.getUserId(); + if (CollectionUtil.isEmpty(userIdList)) { + List staffList = relationUserService.list(Wrappers.lambdaQuery(new CoreCustomFormRelationUser()) + .eq(CoreCustomFormRelationUser::getCustomFormId, dto.getFormId()) + .eq(CoreCustomFormRelationUser::getFill, 0)); + for (CoreCustomFormRelationUser relationUser : staffList) { + userIdList.add(relationUser.getUserId()); + } + } + + //1.教职工通知 + if (byId.getRecever() == 0) { + for (Long staffId : userIdList) { + // + EduStaff staff = remoteStaffService.getStaffNoPermission(staffId).getData(); + BaseStaffNotice textSchoolNotice = new BaseStaffNotice(); + EduApp appByCodeAndSchool = commonService.getAppByCodeAndSchool(AppConstant.CONTACT_SELECT, null, byId.getOrgId()); + Text text = new Text(); + textSchoolNotice.setText(text); + textSchoolNotice.setAgentid(appByCodeAndSchool.getWxAgentId()); + String url = teacherFormUrl + appByCodeAndSchool.getWxCorpId() + "&loginType=0&userType=0&state=" + + AppConstant.CONTACT_SELECT + "&id=" + byId.getId(); + + text.setContent("" + "《" + byId.getFormTitle() + "》" + byId.getRemindUserModel() + ""); + textSchoolNotice.setTouser(staff.getWxId()); + String accessToken = wxUtil.getAccessToken(appByCodeAndSchool.getWxCorpId(), appByCodeAndSchool.getWxSecret()); + wxUtil.pushStaffNotice(accessToken, textSchoolNotice); + } + }//2.学生对象通知 + List parentWxId = remoteStudentService.findParentWxId(userIdList).getData(); + TextSchoolNotice textSchoolNotice = new TextSchoolNotice(); + EduApp appByCodeAndSchool = commonService.getAppByCodeAndSchool(AppConstant.INDEX_PARENT, null, byId.getOrgId()); + Text text = new Text(); + textSchoolNotice.setText(text); + textSchoolNotice.setAgentid(appByCodeAndSchool.getWxAgentId()); + String url = parentFormUrl + appByCodeAndSchool.getWxCorpId() + "&loginType=0&userType=1&state=" + + AppConstant.INDEX_PARENT + "&id=" + byId.getId(); + String remindUserModel = byId.getRemindUserModel(); + if (ObjectUtil.isEmpty(remindUserModel)) { + remindUserModel = ""; + } + text.setContent("" + "《" + byId.getFormTitle() + "》" + remindUserModel + ""); + textSchoolNotice.setTo_parent_userid(parentWxId); + String accessToken = wxUtil.getAccessToken(appByCodeAndSchool.getWxCorpId(), appByCodeAndSchool.getWxSecret()); + wxUtil.pushSchoolNotice(accessToken, textSchoolNotice); + + } + + @Override + public void exportUserListInOut(Long formId, Integer status, HttpServletResponse response) { + //导出已提交或未提交人员数据 + CoreCustomForm form = getById(formId); + //填写的主体为教职工 + if (form.getRecever() == 0) { + //职工信息列表 + List importStaffList = new ArrayList<>(); + List staffIdList = new ArrayList<>(); + List list = relationUserService.list(Wrappers.lambdaQuery(new CoreCustomFormRelationUser()) + .eq(CoreCustomFormRelationUser::getCustomFormId, formId) + .eq(CoreCustomFormRelationUser::getFill, status)); + for (CoreCustomFormRelationUser relationUser : list) { + staffIdList.add(relationUser.getUserId()); + } + for (Long staffId : staffIdList) { + EduStaff staff = (EduStaff) redisService.hget(STAFF_DATA, staffId.toString()); + ImportStaffVO importStaffVO = new ImportStaffVO(); + importStaffVO.setName(staff.getName()); + importStaffVO.setPhone(staff.getMobile()); + importStaffVO.setPosition(staff.getPosition()); + importStaffVO.setSchoolName(staff.getSchoolName()); + importStaffVO.setSex(staff.getSex()); + importStaffList.add(importStaffVO); + } + String name = ""; + if (status == 0) { + name = "未提交职工.xlsx"; + } else { + name = "已提交职工.xlsx"; + } + ExcelUtil.export(name, ImportStaffVO.class, importStaffList, response); + + } + //填写主体为学生 + else if (form.getRecever() == 1) { + //学生信息列表 + List importStudent = new ArrayList<>(); + List studentList = new ArrayList<>(); + List list = relationUserService.list(Wrappers.lambdaQuery(new CoreCustomFormRelationUser()) + .eq(CoreCustomFormRelationUser::getCustomFormId, formId) + .eq(CoreCustomFormRelationUser::getFill, status)); + for (CoreCustomFormRelationUser relationUser : list) { + studentList.add(relationUser.getUserId()); + } + for (Long studentId : studentList) { + EduStudent student = (EduStudent) redisService.hget(STUDENT_DATA, studentId.toString()); + if (ObjectUtil.isEmpty(student)) { + student = remoteStudentService.getStudentNoPermission(studentId).getData(); + } + ImportStudentVO importStudentVO = new ImportStudentVO(); + importStudentVO.setCampusName(student.getCampusName()); + importStudentVO.setClassName(student.getClassName()); + importStudentVO.setGradeName(student.getGradeName()); + importStudentVO.setSchoolName(student.getSchoolName()); + importStudentVO.setSectionName(student.getSectionName()); + importStudentVO.setStudentName(student.getStuName()); + importStudentVO.setStudentNum(student.getStuNumber()); + importStudent.add(importStudentVO); + } + String name = ""; + if (status == 0) { + name = "未提交学生.xlsx"; + } else { + name = "已提交学生.xlsx"; + } + ExcelUtil.export(name, ImportStudentVO.class, importStudent, response); + } + //填写主体为家长 + else if (form.getRecever() == 2) { + //学生信息加家长信息b + List importParentVOList = new ArrayList<>(); + List parentList = parentService.list(Wrappers.lambdaQuery(new CoreCustomFormRelationUserParent()) + .eq(CoreCustomFormRelationUserParent::getCustomFormId, formId) + .eq(CoreCustomFormRelationUserParent::getFillType, status)); + + for (CoreCustomFormRelationUserParent parent : parentList) { + CoreCustomFormRelationUser byId = relationUserService.getById(parent.getCustomUserId()); + + EduStudent student = (EduStudent) redisService.hget(STUDENT_DATA, byId.getUserId().toString()); + List collect = student.getParents().stream().filter(s -> s.getWxId().equals(parent.getParentId())).collect(Collectors.toList()); + + ImportParentVO importParentVO = new ImportParentVO(); + importParentVO.setCampusName(student.getCampusName()); + importParentVO.setClassName(student.getClassName()); + importParentVO.setGradeName(student.getGradeName()); + importParentVO.setSchoolName(student.getSchoolName()); + importParentVO.setSectionName(student.getSectionName()); + importParentVO.setStudentName(student.getStuName()); + importParentVO.setParentName(collect.get(0).getParentType()); + importParentVO.setPhone(collect.get(0).getMobile()); + importParentVOList.add(importParentVO); + + } + String name = ""; + if (status == 0) { + name = "未提交家长.xlsx"; + } else { + name = "已提交家长.xlsx"; + } + ExcelUtil.export(name, ImportParentVO.class, importParentVOList, response); + } + } + + + @Override + public void publishForm(CoreCustomForm byId) { + //修改表单发布,通知对应人员 + updateById(byId); + if (byId.getStatus() == 1) { + //通知教职工 + if (byId.getRecever() == 0) { + List staffList = relationUserService.list(Wrappers.lambdaQuery(new CoreCustomFormRelationUser()) + .eq(CoreCustomFormRelationUser::getCustomFormId, byId.getId())); + for (CoreCustomFormRelationUser relationUser : staffList) { + EduStaff staff = remoteStaffService.getStaffNoPermission(relationUser.getUserId()).getData(); + BaseStaffNotice textSchoolNotice = new BaseStaffNotice(); + EduApp appByCodeAndSchool = commonService.getAppByCodeAndSchool(AppConstant.CONTACT_SELECT, null, byId.getOrgId()); + Text text = new Text(); + textSchoolNotice.setText(text); + textSchoolNotice.setAgentid(appByCodeAndSchool.getWxAgentId()); + String url = teacherFormUrl + appByCodeAndSchool.getWxCorpId() + "&loginType=0&userType=0&state=" + AppConstant.CONTACT_SELECT + "&id=" + byId.getId(); + String remindUserModel = byId.getRemindUserModel(); + if (ObjectUtil.isEmpty(remindUserModel)) { + remindUserModel = ""; + } + text.setContent("" + "《" + byId.getFormTitle() + "》" + remindUserModel + ""); + textSchoolNotice.setTouser(staff.getWxId()); + String accessToken = wxUtil.getAccessToken(appByCodeAndSchool.getWxCorpId(), appByCodeAndSchool.getWxSecret()); + wxUtil.pushStaffNotice(accessToken, textSchoolNotice); + } + } + //通知学生所有家长 + else { + List studentList = relationUserService.list(Wrappers.lambdaQuery(new CoreCustomFormRelationUser()) + .eq(CoreCustomFormRelationUser::getCustomFormId, byId.getId())); + List studentIdList = new ArrayList<>(); + for (CoreCustomFormRelationUser student : studentList) { + studentIdList.add(student.getUserId()); + } + List parentWxId = remoteStudentService.findParentWxId(studentIdList).getData(); + TextSchoolNotice textSchoolNotice = new TextSchoolNotice(); + EduApp appByCodeAndSchool = commonService.getAppByCodeAndSchool(AppConstant.INDEX_PARENT, null, byId.getOrgId()); + Text text = new Text(); + textSchoolNotice.setText(text); + textSchoolNotice.setAgentid(appByCodeAndSchool.getWxAgentId()); + String url = parentFormUrl + appByCodeAndSchool.getWxCorpId() + + "&loginType=0&userType=1&state=" + AppConstant.INDEX_PARENT + "&id=" + byId.getId(); + String remindUserModel = byId.getRemindUserModel(); + if (ObjectUtil.isEmpty(remindUserModel)) { + remindUserModel = ""; + } + text.setContent("" + "《" + byId.getFormTitle() + "》" + remindUserModel + ""); + textSchoolNotice.setTo_parent_userid(parentWxId); + String accessToken = wxUtil.getAccessToken(appByCodeAndSchool.getWxCorpId(), appByCodeAndSchool.getWxSecret()); + wxUtil.pushSchoolNotice(accessToken, textSchoolNotice); + } + } else { + //撤回时,修改所有关联用户表为未填报,填报时间为null,清空对应data表 + relationUserService.update(Wrappers.lambdaUpdate(new CoreCustomFormRelationUser()) + .eq(CoreCustomFormRelationUser::getCustomFormId, byId.getId()) + .set(CoreCustomFormRelationUser::getFill, 0)); + + //清空对应data表 + String sql = "truncate table " + byId.getTableName(); + coreCustomFormDataService.truncateTable(sql); + } + } + + + @Override + public CoreCustomForm appFindFormAndData(Long userId, Long formId) { + CoreCustomForm form = getById(formId); + List itemList = coreCustomFormItemsService.list(Wrappers.lambdaQuery(new CoreCustomFormItems()) + .eq(CoreCustomFormItems::getFormId, formId)); + for (CoreCustomFormItems coreCustomFormItems : itemList) { + List itemChildrenList = coreCustomFormItemChildrenService.list(Wrappers.lambdaQuery(new CoreCustomFormItemChildren()) + .eq(CoreCustomFormItemChildren::getFormId, formId) + .eq(CoreCustomFormItemChildren::getFormItemId, coreCustomFormItems.getId())); + coreCustomFormItems.setCoreCustomFormItemChildrenList(itemChildrenList); + } + form.setCoreCustomFormItemsList(itemList); + CoreCustomFormTopical topical = topicalService.getOne(Wrappers.lambdaQuery(new CoreCustomFormTopical()) + .eq(CoreCustomFormTopical::getCustomFormId, formId)); + form.setCoreCustomFormTopical(topical); + Map userData = coreCustomFormDataService.findData(formId, userId); + form.setData(userData); + return form; + } + + @Override + public CommitUserVO commitUser(Long formId, Integer type, String name, Page page) { + CoreCustomForm form = getById(formId); + List userList = new ArrayList<>(); + + Page page1 = relationUserService.findUserList(page, type, name, formId); + List parentList = parentService.list(Wrappers.lambdaQuery(new CoreCustomFormRelationUserParent()) + .eq(CoreCustomFormRelationUserParent::getCustomFormId, formId) + .eq(CoreCustomFormRelationUserParent::getFillType, type)); + if (form.getRecever() == 2) { + for (CoreCustomFormRelationUserParent userParent : parentList) { + Long studentId = relationUserService.getById(userParent.getCustomUserId()).getUserId(); + EduStudent student = (EduStudent) redisService.hget(STUDENT_DATA, studentId.toString()); + List parents = student.getParents(); + EduParent parent = parents.stream().filter(p -> p.getId().equals(userParent.getParentId())).collect(Collectors.toList()).get(0); + + CommitVO commitVO = new CommitVO(); + commitVO.setId(parent.getId()); + String deptName = student.getGradeName() + student.getClassName(); + commitVO.setDeptName(deptName); + commitVO.setName(student.getStuName() + parent.getParentType()); + userList.add(commitVO); + } + } + for (CoreCustomFormRelationUser user : page1.getRecords()) { + if (form.getRecever() == 0) { + EduStaff staff = (EduStaff) redisService.hget(STAFF_DATA, user.getUserId().toString()); + if (ObjectUtil.isEmpty(staff)) { + staff = remoteStaffService.getStaff(user.getUserId()).getData(); + } + CommitVO commitVO = new CommitVO(); + commitVO.setId(staff.getId()); + + commitVO.setName(staff.getName()); + List staffDept = staff.getStaffDept(); + String staffDeptName = ""; + for (int i = 0; i < staffDept.size(); i++) { + Dept dept = commonService.getDept(staffDept.get(i).getDeptId()); + if (i == staffDept.size() - 1) { + staffDeptName += dept.getDeptName(); + } else { + staffDeptName += dept.getDeptName() + "/"; + } + ; + + } + commitVO.setDeptName(staffDeptName); + userList.add(commitVO); + } else if (form.getRecever() == 1) { + EduStudent student = (EduStudent) redisService.hget(STUDENT_DATA, user.getUserId().toString()); + if (ObjectUtil.isEmpty(student)) { + student = remoteStudentService.getStudentNoPermission(user.getUserId()).getData(); + + } + CommitVO commitVO = new CommitVO(); + commitVO.setId(student.getId()); + String deptName = student.getGradeName() + student.getClassName(); + commitVO.setDeptName(deptName); + commitVO.setName(student.getStuName()); + userList.add(commitVO); + + } + } + CommitUserVO commitUserVO = new CommitUserVO(); + commitUserVO.setType(form.getRecever()); + commitUserVO.setRecord(userList); + commitUserVO.setPageNum(page1.getCurrent()); + commitUserVO.setPageSize(page1.getSize()); + commitUserVO.setTotal(page1.getTotal()); + + return commitUserVO; + } + + @Override + public List appFindStudentByForm(Long userId, Long formId) { + List data = remoteStudentService.listStudentByParent(userId).getData(); + List list = relationUserService.list(Wrappers.lambdaQuery(new CoreCustomFormRelationUser()) + .eq(CoreCustomFormRelationUser::getCustomFormId, formId)); + List studentList = new ArrayList<>(); + for (CoreCustomFormRelationUser relationUser : list) { + for (EduStudent datum : data) { + if (relationUser.getUserId().equals(datum.getId())) { + FormStudentVO formStudentVO = new FormStudentVO(); + formStudentVO.setFill(relationUser.getFill()); + formStudentVO.setStudentId(datum.getId()); + formStudentVO.setStudentName(datum.getStuName()); + studentList.add(formStudentVO); + } + } + } + return studentList; + } + + /*** + * @Author jianMingWang + * @Description 组装执行sql + * @Date 20:00 2021/8/10 + * @Param [] + * @return java.lang.String + **/ + public String createSql(CoreCustomFormItems coreCustomFormItem) { + String typeValue = ""; + if ("moreInput".equals(coreCustomFormItem.getItemType())) { + typeValue = "text"; + } else { + typeValue = "varchar(255)"; + } + String filedname = coreCustomFormItem.getItemType() + System.currentTimeMillis(); + return "`" + filedname + "` " + typeValue + " DEFAULT NULL COMMENT '" + coreCustomFormItem.getItemTitle() + "'"; + } + + +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormStatisticServiceImpl.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormStatisticServiceImpl.java new file mode 100644 index 0000000..b7f2b2a --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormStatisticServiceImpl.java @@ -0,0 +1,26 @@ +package com.yida.data.form.customForm.service.impl; + +import com.yida.data.common.core.entity.customform.CoreCustomFormStatistic; +import com.yida.data.form.customForm.mapper.CoreCustomFormStatisticMapper; +import com.yida.data.form.customForm.service.CoreCustomFormStatisticService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.annotation.Propagation; +import lombok.RequiredArgsConstructor; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +/** +* 表单对应统计数据表 Service实现 +* +* @author ccl +* @date 2021-11-05 15:58:43 +*/ +@Service +@RequiredArgsConstructor +@Transactional(propagation = Propagation.SUPPORTS, readOnly = true) +public class CoreCustomFormStatisticServiceImpl extends ServiceImpl + implements CoreCustomFormStatisticService { + +private final CoreCustomFormStatisticMapper coreCustomFormStatisticMapper; + +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormTopicalServiceImpl.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormTopicalServiceImpl.java new file mode 100644 index 0000000..fd72748 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormTopicalServiceImpl.java @@ -0,0 +1,26 @@ +package com.yida.data.form.customForm.service.impl; + +import com.yida.data.common.core.entity.customform.CoreCustomFormTopical; +import com.yida.data.form.customForm.mapper.CoreCustomFormTopicalMapper; +import com.yida.data.form.customForm.service.CoreCustomFormTopicalService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.annotation.Propagation; +import lombok.RequiredArgsConstructor; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +/** +* 表单对应主题表 Service实现 +* +* @author ccl +* @date 2021-11-05 15:41:09 +*/ +@Service +@RequiredArgsConstructor +@Transactional(propagation = Propagation.SUPPORTS, readOnly = true) +public class CoreCustomFormTopicalServiceImpl extends ServiceImpl + implements CoreCustomFormTopicalService { + +private final CoreCustomFormTopicalMapper coreCustomFormTopicalMapper; + +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormTypeServiceImpl.java b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormTypeServiceImpl.java new file mode 100644 index 0000000..be5081b --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/java/com/yida/data/form/customForm/service/impl/CoreCustomFormTypeServiceImpl.java @@ -0,0 +1,25 @@ +package com.yida.data.form.customForm.service.impl; + +import com.yida.data.common.core.entity.customform.CoreCustomFormType; +import com.yida.data.form.customForm.mapper.CoreCustomFormTypeMapper; +import com.yida.data.form.customForm.service.CoreCustomFormTypeService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.annotation.Propagation; +import lombok.RequiredArgsConstructor; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +/** + * 自定义表单类型表 Service实现 + * + * @author wjm + * @date 2021-08-12 10:56:57 + */ +@Service +@RequiredArgsConstructor +@Transactional(propagation = Propagation.SUPPORTS, readOnly = true) +public class CoreCustomFormTypeServiceImpl extends ServiceImpl implements CoreCustomFormTypeService { + + private final CoreCustomFormTypeMapper coreCustomFormTypeMapper; + +} diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/apply/AppApplyFormMapper.xml b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/apply/AppApplyFormMapper.xml new file mode 100644 index 0000000..33b4e6c --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/apply/AppApplyFormMapper.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/apply/ApplyFormDataMapper.xml b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/apply/ApplyFormDataMapper.xml new file mode 100644 index 0000000..9c2944a --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/apply/ApplyFormDataMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + ${sql} + + SELECT LAST_INSERT_ID() + + + + + + + diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/apply/CoreApplyFormApprovalProcessMapper.xml b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/apply/CoreApplyFormApprovalProcessMapper.xml new file mode 100644 index 0000000..beeabf3 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/apply/CoreApplyFormApprovalProcessMapper.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/apply/CoreApplyFormFillUserMapper.xml b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/apply/CoreApplyFormFillUserMapper.xml new file mode 100644 index 0000000..5407e73 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/apply/CoreApplyFormFillUserMapper.xml @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/apply/CoreApplyFormMapper.xml b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/apply/CoreApplyFormMapper.xml new file mode 100644 index 0000000..9e48bc7 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/apply/CoreApplyFormMapper.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/apply/CoreApprovalProcessMapper.xml b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/apply/CoreApprovalProcessMapper.xml new file mode 100644 index 0000000..edbaa46 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/apply/CoreApprovalProcessMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/apply/CoreOfficialSealMapper.xml b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/apply/CoreOfficialSealMapper.xml new file mode 100644 index 0000000..048f4dd --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/apply/CoreOfficialSealMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormAuthAdminMapper.xml b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormAuthAdminMapper.xml new file mode 100644 index 0000000..6891338 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormAuthAdminMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormAuthMapper.xml b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormAuthMapper.xml new file mode 100644 index 0000000..8dfa990 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormAuthMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormDataMapper.xml b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormDataMapper.xml new file mode 100644 index 0000000..a607aaf --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormDataMapper.xml @@ -0,0 +1,36 @@ + + + + + ${sql} + + + ${sql} + + + + + + + + + + + + diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormGroupMapper.xml b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormGroupMapper.xml new file mode 100644 index 0000000..81f6817 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormGroupMapper.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormGroupRelationFormMapper.xml b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormGroupRelationFormMapper.xml new file mode 100644 index 0000000..92d7cae --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormGroupRelationFormMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormItemChildrenMapper.xml b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormItemChildrenMapper.xml new file mode 100644 index 0000000..4addc02 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormItemChildrenMapper.xml @@ -0,0 +1,4 @@ + + + + diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormItemsMapper.xml b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormItemsMapper.xml new file mode 100644 index 0000000..b57aa2b --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormItemsMapper.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormMapper.xml b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormMapper.xml new file mode 100644 index 0000000..27641f7 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormMapper.xml @@ -0,0 +1,151 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormModelItemChildrenMapper.xml b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormModelItemChildrenMapper.xml new file mode 100644 index 0000000..0b9e8df --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormModelItemChildrenMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormModelItemsMapper.xml b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormModelItemsMapper.xml new file mode 100644 index 0000000..a885383 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormModelItemsMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormModelMapper.xml b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormModelMapper.xml new file mode 100644 index 0000000..627c567 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormModelMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormRelationAdminMapper.xml b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormRelationAdminMapper.xml new file mode 100644 index 0000000..fd4c8d2 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormRelationAdminMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormRelationUserMapper.xml b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormRelationUserMapper.xml new file mode 100644 index 0000000..21a564e --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormRelationUserMapper.xml @@ -0,0 +1,37 @@ + + + + + + + + diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormRelationUserParentMapper.xml b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormRelationUserParentMapper.xml new file mode 100644 index 0000000..08761a9 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormRelationUserParentMapper.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormStatisticMapper.xml b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormStatisticMapper.xml new file mode 100644 index 0000000..45f94ee --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormStatisticMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormTopicalMapper.xml b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormTopicalMapper.xml new file mode 100644 index 0000000..b93c9c1 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormTopicalMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormTypeMapper.xml b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormTypeMapper.xml new file mode 100644 index 0000000..99913a5 --- /dev/null +++ b/febs-server/edu-custom-form/edu-custom-form-biz/src/main/resources/mapper/customForm/CoreCustomFormTypeMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/dto/consume/ConsumeOrderPageDTO.java b/febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/dto/consume/ConsumeOrderPageDTO.java new file mode 100644 index 0000000..7bc2d78 --- /dev/null +++ b/febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/dto/consume/ConsumeOrderPageDTO.java @@ -0,0 +1,42 @@ +package com.yida.data.device.dto.consume; + +import com.yida.data.common.core.common.BaseDTO; +import com.yida.data.common.core.entity.consume.EduConsumeOrder; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +import java.io.Serializable; + +/** + * 消费订单后台列表请求类 + * + * @author ZYJ + * @date 2023/4/14 + */ +@Data +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@ApiModel(value = "ConsumeOrderPageDTO", description = "消费订单后台列表请求类") +public class ConsumeOrderPageDTO extends BaseDTO implements Serializable { + + private static final long serialVersionUID = 5188209169253382906L; + + @ApiModelProperty("订单状态") + private String orderStatus; + + @ApiModelProperty("订单号") + private String orderCode; + + @ApiModelProperty("学生姓名或校园卡号") + private String searchData; + + @ApiModelProperty("学校id") + private Long schoolId; +} \ No newline at end of file diff --git a/febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/dto/consume/CreateConsumeOrderDTO.java b/febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/dto/consume/CreateConsumeOrderDTO.java new file mode 100644 index 0000000..d04294d --- /dev/null +++ b/febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/dto/consume/CreateConsumeOrderDTO.java @@ -0,0 +1,54 @@ +package com.yida.data.device.dto.consume; + +import com.yida.data.common.core.enums.PayWay; +import com.yida.data.common.core.enums.UnionPayTypeEnum; +import com.yida.data.common.core.enums.WxPayTypeEnum; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 生成消费订单请求类 + * + * @author ZYJ + * @date 2023/3/23 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "CreateConsumeOrderDTO", description = "生成消费订单请求类") +public class CreateConsumeOrderDTO implements Serializable { + + private static final long serialVersionUID = 230831080990848937L; + + @ApiModelProperty("学生id") + private Long studentId; + + @ApiModelProperty("学校id") + private Long schoolId; + + @ApiModelProperty("充值金额. 单位: 元") + private BigDecimal money; + + /** + * 支付方式 + * {@link PayWay} + */ + @ApiModelProperty("支付方式") + private String payWay; + + /** + * 支付类型 + * 银联云闪付: {@link UnionPayTypeEnum} + * 微信类型: {@link WxPayTypeEnum} + */ + @ApiModelProperty("支付类型") + private Integer payType; +} \ No newline at end of file diff --git a/febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/dto/consume/H5ConsumeOrderPageDTO.java b/febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/dto/consume/H5ConsumeOrderPageDTO.java new file mode 100644 index 0000000..366892c --- /dev/null +++ b/febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/dto/consume/H5ConsumeOrderPageDTO.java @@ -0,0 +1,36 @@ +package com.yida.data.device.dto.consume; + +import com.yida.data.common.core.common.BaseDTO; +import com.yida.data.common.core.entity.consume.EduConsumeOrder; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +import java.io.Serializable; + +/** + * 消费订单列表请求类(充值记录) + * + * @author ZYJ + * @date 2023/3/24 + */ +@Data +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@ApiModel(value = "H5ConsumeOrderPageDTO", description = "消费订单列表请求类(充值记录)") +public class H5ConsumeOrderPageDTO extends BaseDTO implements Serializable { + + private static final long serialVersionUID = 3749227164138041581L; + + @ApiModelProperty("学生id") + private Long studentId; + + @ApiModelProperty("学校id") + private Long deptId; +} \ No newline at end of file diff --git a/febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/dto/consume/H5ConsumeRecordPageDTO.java b/febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/dto/consume/H5ConsumeRecordPageDTO.java new file mode 100644 index 0000000..2cbf409 --- /dev/null +++ b/febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/dto/consume/H5ConsumeRecordPageDTO.java @@ -0,0 +1,36 @@ +package com.yida.data.device.dto.consume; + +import com.yida.data.common.core.common.BaseDTO; +import com.yida.data.common.core.entity.consume.EduConsumeRecord; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +import java.io.Serializable; + +/** + * 消费机学生消费记录列表请求类 + * + * @author ZYJ + * @date 2023/3/24 + */ +@Data +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@ApiModel(value = "H5ConsumeRecordPageDTO", description = "消费机学生消费记录列表请求类") +public class H5ConsumeRecordPageDTO extends BaseDTO implements Serializable { + + private static final long serialVersionUID = 4230279140715058049L; + + @ApiModelProperty("学生id") + private Long studentId; + + @ApiModelProperty("学校id") + private Long deptId; +} \ No newline at end of file diff --git a/febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/fallback/RemoteConsumeCardServiceFallback.java b/febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/fallback/RemoteConsumeCardServiceFallback.java new file mode 100644 index 0000000..36de5d3 --- /dev/null +++ b/febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/fallback/RemoteConsumeCardServiceFallback.java @@ -0,0 +1,32 @@ +package com.yida.data.device.fallback; + +import com.yida.data.common.core.annotation.Fallback; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.consume.EduStudentConsumeCard; +import com.yida.data.device.feign.consume.RemoteConsumeCardService; +import feign.hystrix.FallbackFactory; +import lombok.extern.slf4j.Slf4j; + +/** + * RemoteConsumeCardService fallback处理类 + * + * @author ZYJ + * @date 2023/3/20 + */ +@Slf4j +@Fallback +public class RemoteConsumeCardServiceFallback implements FallbackFactory { + + @Override + public RemoteConsumeCardService create(Throwable throwable) { + log.error("RemoteConsumeCardService fallback reason:{}", throwable.getMessage()); + + return new RemoteConsumeCardService() { + + @Override + public ResultBean saveConsumeCard(EduStudentConsumeCard eduStudentConsumeCard) { + return null; + } + }; + } +} diff --git a/febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/fallback/RemoteConsumeOrderServiceFallback.java b/febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/fallback/RemoteConsumeOrderServiceFallback.java new file mode 100644 index 0000000..76fbe0d --- /dev/null +++ b/febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/fallback/RemoteConsumeOrderServiceFallback.java @@ -0,0 +1,36 @@ +package com.yida.data.device.fallback; + +import com.yida.data.common.core.annotation.Fallback; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.device.feign.consume.RemoteConsumeOrderService; +import feign.hystrix.FallbackFactory; +import lombok.extern.slf4j.Slf4j; + +/** + * RemoteConsumeOrderService fallback处理类 + * + * @author ZYJ + * @date 2023/4/3 + */ +@Slf4j +@Fallback +public class RemoteConsumeOrderServiceFallback implements FallbackFactory { + + @Override + public RemoteConsumeOrderService create(Throwable throwable) { + log.error("RemoteConsumeOrderService fallback reason:{}", throwable.getMessage()); + + return new RemoteConsumeOrderService() { + + @Override + public ResultBean updateOrderStatus() { + return null; + } + + @Override + public ResultBean updateRefundStatus() { + return null; + } + }; + } +} diff --git a/febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/feign/consume/RemoteConsumeCardService.java b/febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/feign/consume/RemoteConsumeCardService.java new file mode 100644 index 0000000..3fbc600 --- /dev/null +++ b/febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/feign/consume/RemoteConsumeCardService.java @@ -0,0 +1,20 @@ +package com.yida.data.device.feign.consume; + +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.constant.FebsServerConstant; +import com.yida.data.common.core.entity.consume.EduStudentConsumeCard; +import com.yida.data.device.fallback.RemoteStudentCardServiceFallback; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +@FeignClient(value = FebsServerConstant.EDU_DEVICE, contextId = "consumeCardClient", + fallbackFactory = RemoteStudentCardServiceFallback.class) +public interface RemoteConsumeCardService { + + /** + * 保存学生消费机信息 + */ + @PostMapping("/consumeCard/saveConsumeCard") + ResultBean saveConsumeCard(@RequestBody EduStudentConsumeCard eduStudentConsumeCard); +} diff --git a/febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/feign/consume/RemoteConsumeOrderService.java b/febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/feign/consume/RemoteConsumeOrderService.java new file mode 100644 index 0000000..eb64d89 --- /dev/null +++ b/febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/feign/consume/RemoteConsumeOrderService.java @@ -0,0 +1,38 @@ +package com.yida.data.device.feign.consume; + +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.constant.FebsServerConstant; +import com.yida.data.device.fallback.RemoteConsumeOrderServiceFallback; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; + +/** + * 消费订单模块feign + * + * @author ZYJ + * @date 2023/4/3 + */ +@FeignClient(value = FebsServerConstant.EDU_DEVICE, contextId = "consumeOrderServiceClient", + fallbackFactory = RemoteConsumeOrderServiceFallback.class) +public interface RemoteConsumeOrderService { + + /** + * 更新超时订单状态 + * + * @return com.yida.data.common.core.common.ResultBean + * @author ZYJ + * @date 2023/4/3 13:26 + */ + @GetMapping("/in/consume/updateOrderStatus") + ResultBean updateOrderStatus(); + + /** + * 更新退款订单状态 + * + * @return com.yida.data.common.core.common.ResultBean + * @author ZYJ + * @date 2023/4/3 13:26 + */ + @GetMapping("/in/consume/updateRefundStatus") + ResultBean updateRefundStatus(); +} diff --git a/febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/vo/consume/ConsumeDeviceVO.java b/febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/vo/consume/ConsumeDeviceVO.java new file mode 100644 index 0000000..210e213 --- /dev/null +++ b/febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/vo/consume/ConsumeDeviceVO.java @@ -0,0 +1,53 @@ +package com.yida.data.device.vo.consume; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * 消费机列表返回接口 + * + * @author ZYJ + * @date 2023-03-15 10:02:27 + */ +@Data +@ApiModel("设备信息") +public class ConsumeDeviceVO implements Serializable { + + private static final long serialVersionUID = 1192859620255962398L; + + private Long id; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + @ApiModelProperty("设备名称") + private String name; + + @ApiModelProperty("设备编号") + private String sn; + + @ApiModelProperty("设备mac地址") + private String macAddress; + + @ApiModelProperty("设备厂商") + private String deviceType; + + @ApiModelProperty("ip") + private String ip; + + @ApiModelProperty("学校id") + private Long schoolId; + + @ApiModelProperty("学校名称") + private String schoolName; + + @ApiModelProperty("设备在线状态,0-在线,1-未在线") + private Integer state; +} diff --git a/febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/vo/consume/ConsumeOrderPageVO.java b/febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/vo/consume/ConsumeOrderPageVO.java new file mode 100644 index 0000000..5a0ec98 --- /dev/null +++ b/febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/vo/consume/ConsumeOrderPageVO.java @@ -0,0 +1,74 @@ +package com.yida.data.device.vo.consume; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.yida.data.common.core.entity.consume.EduConsumeOrderStudent; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 消费订单后台列表返回类 + * + * @author ZYJ + * @date 2023/4/14 + */ +@Data +@ApiModel(value = "ConsumeOrderPageVO", description = "消费订单后台列表返回类") +public class ConsumeOrderPageVO implements Serializable { + + private static final long serialVersionUID = -4944464049391972122L; + + @ApiModelProperty(value = "订单id") + private Long orderId; + + @ApiModelProperty(value = "部门id") + private Long deptId; + + @ApiModelProperty(value = "部门名称") + private String deptName; + + @ApiModelProperty(value = "订单状态:0:待付款 1:付款中 2:交易完成(正常支付成功) 3:待退款 4:交易关闭(a:超时未支付,b:退款成功") + private String orderStatus; + + @ApiModelProperty(value = "支付状态:0:未支付(默认) 1:已支付 2:已退款 3:已取消") + private String payStatus; + + @ApiModelProperty(value = "订单总金额") + private BigDecimal totalMoney; + + @ApiModelProperty(value = "实际支付金额") + private BigDecimal practicalMoney; + + @ApiModelProperty(value = "支付人手机号(家长手机)") + private String phone; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty("创建时间") + private Date createDate; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty("支付时间") + private Date payDate; + + @ApiModelProperty("订单编号") + private String orderCode; + + @ApiModelProperty("交易流水号") + private String transactionNumber; + + @ApiModelProperty(value = "支付方式:1:微信,2:支付宝,3:银联,4:收钱吧") + private String payWay; + + @ApiModelProperty(value = "是否退款:0:否(默认) 1:是") + private String isRefund; + + @ApiModelProperty("订单学生信息") + private EduConsumeOrderStudent student; +} \ No newline at end of file diff --git a/febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/vo/consume/ConsumeOrderStudentCacheVO.java b/febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/vo/consume/ConsumeOrderStudentCacheVO.java new file mode 100644 index 0000000..d729250 --- /dev/null +++ b/febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/vo/consume/ConsumeOrderStudentCacheVO.java @@ -0,0 +1,44 @@ +package com.yida.data.device.vo.consume; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 学生消费订单缓存类 + * + * @author ZYJ + * @date 2023/3/22 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "ConsumeOrderStudentCacheVO", description = "学生消费订单缓存类") +public class ConsumeOrderStudentCacheVO implements Serializable { + + private static final long serialVersionUID = 8649760066609681494L; + + @ApiModelProperty("学生id") + private Long studentId; + + @ApiModelProperty("学生姓名") + private String studentName; + + @ApiModelProperty("下单家长id") + private Long parentId; + + @ApiModelProperty("家长类型") + private String parentType; + + @ApiModelProperty("家长手机号码") + private String mobile; + + @ApiModelProperty("订单号") + private String orderNo; +} \ No newline at end of file diff --git a/febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/vo/consume/ConsumePayInfoVO.java b/febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/vo/consume/ConsumePayInfoVO.java new file mode 100644 index 0000000..493d9ca --- /dev/null +++ b/febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/vo/consume/ConsumePayInfoVO.java @@ -0,0 +1,77 @@ +package com.yida.data.device.vo.consume; + +import com.yida.data.common.core.enums.PayWay; +import com.yida.data.common.core.enums.UnionPayTypeEnum; +import com.yida.data.common.core.enums.WxPayTypeEnum; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 生成消费订单返回信息 + * + * @author ZYJ + * @date 2023/3/22 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "ConsumePayInfoVO", description = "生成消费订单返回信息") +public class ConsumePayInfoVO implements Serializable { + + private static final long serialVersionUID = 6829651635967940690L; + + @ApiModelProperty("错误状态码. 仅在接口异常时返回") + private Integer errorCode; + + @ApiModelProperty("错误信息. 仅在接口异常时返回") + private String errorMessage; + + @ApiModelProperty("订单号") + private String orderCode; + + @ApiModelProperty("微信时间戳") + private String wxTimestamp; + + @ApiModelProperty("微信随机字符串") + private String wxNonceStr; + + @ApiModelProperty("微信商户号") + private String wxAppId; + + @ApiModelProperty("微信package") + private String wxPackage; + + @ApiModelProperty("微信签名后串") + private String wxSign; + + @ApiModelProperty("是否需要跳转支付") + private Boolean needToPay; + + /** + * 支付方式 + * {@link PayWay} + */ + @ApiModelProperty("支付方式") + private String payWay; + + /** + * 支付类型 + * 银联云闪付: {@link UnionPayTypeEnum} + * 微信类型: {@link WxPayTypeEnum} + */ + @ApiModelProperty("具体支付子类型") + private Integer payType; + + @ApiModelProperty("支付域名") + private String payDomain; + + @ApiModelProperty("支付地址") + private String payUrl; +} diff --git a/febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/vo/consume/ConsumeRefundOrderVO.java b/febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/vo/consume/ConsumeRefundOrderVO.java new file mode 100644 index 0000000..46c33b3 --- /dev/null +++ b/febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/vo/consume/ConsumeRefundOrderVO.java @@ -0,0 +1,48 @@ +package com.yida.data.device.vo.consume; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 消费订单退款数据 + * + * @author ZYJ + * @date 2023/4/3 + */ +@Data +public class ConsumeRefundOrderVO implements Serializable { + + private static final long serialVersionUID = -6557981285672617008L; + + /** + * 订单id + */ + private Long orderId; + + /** + * 订单号 + */ + private String orderCode; + + /** + * 退款id + */ + private Long refundId; + + /** + * 退款号 + */ + private String refundCode; + + /** + * 订单支付方式 + * 支付方式:1:微信,2:支付宝,3:银联,4:收钱吧 + */ + private String payWay; + + /** + * 学校部门id + */ + private Long deptId; +} diff --git a/febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/vo/consume/ConsumeVipVO.java b/febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/vo/consume/ConsumeVipVO.java new file mode 100644 index 0000000..e2b6de9 --- /dev/null +++ b/febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/vo/consume/ConsumeVipVO.java @@ -0,0 +1,52 @@ +package com.yida.data.device.vo.consume; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 学生消费机会员返回类 + * + * @author ZYJ + * @date 2023/3/16 + */ +@Data +@ApiModel(value = "ConsumeVipVO", description = "学生消费机会员返回类") +public class ConsumeVipVO implements Serializable { + + private static final long serialVersionUID = 6368984207326579608L; + + @ApiModelProperty("true代表是会员, false代表非会员") + private Boolean vipFlag; + + @ApiModelProperty("有效期开始时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime startTime; + + @ApiModelProperty("有效期结束时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime endTime; + + @ApiModelProperty("余额") + private BigDecimal balance; + + @ApiModelProperty("卡片状态(1:正常卡 2:挂失卡)") + private Integer cardStatus; + + @ApiModelProperty("卡号") + private String stuCardNum; + + @ApiModelProperty("支付方式") + private String payWay; + + @ApiModelProperty("支付类型") + private String payType; +} diff --git a/febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/vo/consume/H5ConsumeOrderPageVO.java b/febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/vo/consume/H5ConsumeOrderPageVO.java new file mode 100644 index 0000000..bf8627d --- /dev/null +++ b/febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/vo/consume/H5ConsumeOrderPageVO.java @@ -0,0 +1,67 @@ +package com.yida.data.device.vo.consume; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 消费订单列表返回类(充值记录) + * + * @author ZYJ + * @date 2023/3/24 + */ +@Data +@ApiModel(value = "H5ConsumeOrderPageVO", description = "消费订单列表返回类(充值记录)") +public class H5ConsumeOrderPageVO implements Serializable { + + private static final long serialVersionUID = -8643407654576586273L; + + @ApiModelProperty(value = "订单id") + private Long orderId; + + @ApiModelProperty(value = "部门id") + private Long deptId; + + @ApiModelProperty(value = "部门名称") + private String deptName; + + @ApiModelProperty(value = "订单状态:0:待付款 1:付款中 2:交易完成(正常支付成功) 3:待退款 4:交易关闭(a:超时未支付,b:退款成功") + private String orderStatus; + + @ApiModelProperty(value = "支付状态:0:未支付(默认) 1:已支付 2:已退款 3:已取消") + private String payStatus; + + @ApiModelProperty(value = "订单总金额") + private BigDecimal totalMoney; + + @ApiModelProperty(value = "实际支付金额") + private BigDecimal practicalMoney; + + @ApiModelProperty("学生名称") + private String studentName; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty("创建时间") + private Date createDate; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty("支付时间") + private Date payDate; + + @ApiModelProperty("订单编号") + private String orderCode; + + @ApiModelProperty("交易流水号") + private String transactionNumber; + + @ApiModelProperty(value = "支付方式:1:微信,2:支付宝,3:银联,4:收钱吧") + private String payWay; +} \ No newline at end of file diff --git a/febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/vo/consume/H5ConsumeRecordPageVO.java b/febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/vo/consume/H5ConsumeRecordPageVO.java new file mode 100644 index 0000000..8502237 --- /dev/null +++ b/febs-server/edu-device/edu-device-api/src/main/java/com/yida/data/device/vo/consume/H5ConsumeRecordPageVO.java @@ -0,0 +1,85 @@ +package com.yida.data.device.vo.consume; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 学生消费记录列表返回类 + * + * @author ZYJ + * @date 2023/3/24 + */ +@Data +@ApiModel(value = "H5ConsumeRecordPageVO", description = "学生消费记录列表返回类") +public class H5ConsumeRecordPageVO implements Serializable { + + private static final long serialVersionUID = -5754645385438209457L; + + @ApiModelProperty(value = "主键") + private Long id; + + @ApiModelProperty(value = "创建时间(下单时间)") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + @ApiModelProperty(value = "订单号") + private Long orderNo; + + @ApiModelProperty(value = "消费机设备编号") + private String deviceNo; + + @ApiModelProperty(value = "学生主键ID") + private Long studentId; + + @ApiModelProperty(value = "学生姓名") + private String studentName; + + @ApiModelProperty(value = "校园卡号") + private String stuCardNumber; + + @ApiModelProperty(value = "消费金额. 单位: 元") + private BigDecimal transactionAmount; + + @ApiModelProperty(value = "消费时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime transactionTime; + + @ApiModelProperty(value = "学校主键ID") + private Long schoolId; + + @ApiModelProperty(value = "学校名称") + private String schoolName; + + @ApiModelProperty(value = "学区主键ID") + private Long campusId; + + @ApiModelProperty(value = "学区名称") + private String campusName; + + @ApiModelProperty(value = "学段主键ID") + private Long sectionId; + + @ApiModelProperty(value = "学段名称") + private String sectionName; + + @ApiModelProperty(value = "年级主键ID") + private Long gradeId; + + @ApiModelProperty(value = "年级名称") + private String gradeName; + + @ApiModelProperty(value = "班级主键ID") + private Long classId; + + @ApiModelProperty(value = "班级名称") + private String className; +} \ No newline at end of file diff --git a/febs-server/edu-device/edu-device-api/src/main/resources/META-INF/spring.factories b/febs-server/edu-device/edu-device-api/src/main/resources/META-INF/spring.factories index 1f23b88..f952799 100644 --- a/febs-server/edu-device/edu-device-api/src/main/resources/META-INF/spring.factories +++ b/febs-server/edu-device/edu-device-api/src/main/resources/META-INF/spring.factories @@ -1,4 +1,5 @@ # Auto Configure org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.yida.data.device.fallback.RemoteStudentCardServiceFallback,\ -com.yida.data.device.fallback.RemoteTelephoneServiceFallback +com.yida.data.device.fallback.RemoteTelephoneServiceFallback,\ +com.yida.data.device.fallback.RemoteConsumeCardServiceFallback diff --git a/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/controller/EduConsumeDeviceController.java b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/controller/EduConsumeDeviceController.java new file mode 100644 index 0000000..b86f994 --- /dev/null +++ b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/controller/EduConsumeDeviceController.java @@ -0,0 +1,69 @@ +package com.yida.data.device.consume.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.consume.EduConsumeDevice; +import com.yida.data.device.consume.service.EduConsumeDeviceService; +import com.yida.data.device.vo.consume.ConsumeDeviceVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * 消费机设备Controller + * + * @author ZYJ + * @date 2023-03-14 18:02:27 + */ +@Slf4j +@RestController +@RequiredArgsConstructor +@RequestMapping("consumeDevice") +@Api(tags = "消费机设备后台api") +public class EduConsumeDeviceController { + + private final EduConsumeDeviceService eduConsumeDeviceService; + + @ApiOperation("消费机设备列表分页查询") + @GetMapping("/listDevicePage") + public ResultBean> listDevicePage( + @ApiParam("设备编号或名称") String number, + @ApiParam("设备状态,0-在线,1-离线") Integer state, + @ApiParam("学校id") Long schoolId, + @ApiParam("当前页码") @RequestParam(defaultValue = "1") Integer pageNum, + @ApiParam("页面大小") @RequestParam(defaultValue = "10") Integer pageSize) { + return ResultBean.buildSuccess(eduConsumeDeviceService.listDevicePage(pageNum, pageSize, number, state, schoolId)); + } + + @ApiOperation("保存消费机设备") + @PostMapping("/saveConsumeDevice") + public ResultBean saveDevice(@RequestBody EduConsumeDevice device) { + eduConsumeDeviceService.saveDevice(device); + return ResultBean.buildSuccess(); + } + + @ApiOperation("获取设备详情") + @GetMapping("/getDeviceInfo") + public ResultBean getDeviceInfo(@RequestParam Long deviceId) { + EduConsumeDevice consumeDevice = eduConsumeDeviceService.getById(deviceId); + ConsumeDeviceVO deviceVO = new ConsumeDeviceVO(); + if (Objects.nonNull(consumeDevice)) { + BeanUtils.copyProperties(consumeDevice, deviceVO); + } + return ResultBean.buildSuccess(deviceVO); + } + + @ApiOperation("批量删除消费机设备") + @PostMapping("/deleteDeviceBatch") + public ResultBean deleteDeviceBatch(@RequestBody List ids) { + eduConsumeDeviceService.removeByIds(ids); + return ResultBean.buildSuccess(); + } +} diff --git a/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/controller/EduConsumeOrderController.java b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/controller/EduConsumeOrderController.java new file mode 100644 index 0000000..6cf2401 --- /dev/null +++ b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/controller/EduConsumeOrderController.java @@ -0,0 +1,46 @@ +package com.yida.data.device.consume.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.device.consume.service.EduConsumeOrderService; +import com.yida.data.device.dto.consume.ConsumeOrderPageDTO; +import com.yida.data.device.vo.consume.ConsumeOrderPageVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +/** + * 消费订单 Controller + * + * @author ZYJ + * @date 2023/4/14 + */ +@Slf4j +@RestController +@RequiredArgsConstructor +@RequestMapping("/consumeOrder") +@Api(tags = "消费订单api") +public class EduConsumeOrderController { + + private final EduConsumeOrderService eduConsumeOrderService; + + @ApiOperation("消费订单列表分页查询") + @GetMapping("/listConsumeOrderPage") + public ResultBean> listConsumeOrderPage(ConsumeOrderPageDTO dto) { + return ResultBean.buildSuccess(eduConsumeOrderService.listConsumeOrderPage(dto)); + } + + @GetMapping(value = "refundOrder") + @ApiOperation(value = "消费订单退款") + public ResultBean refundOrder( + @ApiParam(value = "订单号", required = true) @RequestParam String orderCode) { + eduConsumeOrderService.refundOrder(orderCode); + return ResultBean.buildSuccess(); + } +} diff --git a/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/controller/EduStudentConsumeCardController.java b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/controller/EduStudentConsumeCardController.java new file mode 100644 index 0000000..20853f4 --- /dev/null +++ b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/controller/EduStudentConsumeCardController.java @@ -0,0 +1,36 @@ +package com.yida.data.device.consume.controller; + +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.consume.EduStudentConsumeCard; +import com.yida.data.device.consume.service.EduStudentConsumeCardService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 学生消费机信息管理Controller + * + * @author ZYJ + * @date 2023-03-14 18:02:27 + */ +@Slf4j +@RestController +@RequiredArgsConstructor +@RequestMapping("consumeCard") +@Api(tags = "学生消费机信息管理api") +public class EduStudentConsumeCardController { + + private final EduStudentConsumeCardService eduStudentConsumeCardService; + + @ApiOperation("保存学生消费机信息") + @PostMapping("/saveConsumeCard") + public ResultBean saveConsumeCard(@RequestBody EduStudentConsumeCard eduStudentConsumeCard) { + eduStudentConsumeCardService.saveConsumeCard(eduStudentConsumeCard); + return ResultBean.buildSuccess(); + } +} diff --git a/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/controller/H5ConsumeController.java b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/controller/H5ConsumeController.java new file mode 100644 index 0000000..a59bb4a --- /dev/null +++ b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/controller/H5ConsumeController.java @@ -0,0 +1,107 @@ +package com.yida.data.device.consume.controller; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.device.consume.service.H5ConsumeService; +import com.yida.data.device.dto.consume.CreateConsumeOrderDTO; +import com.yida.data.device.dto.consume.H5ConsumeOrderPageDTO; +import com.yida.data.device.dto.consume.H5ConsumeRecordPageDTO; +import com.yida.data.device.vo.consume.ConsumePayInfoVO; +import com.yida.data.device.vo.consume.ConsumeVipVO; +import com.yida.data.device.vo.consume.H5ConsumeOrderPageVO; +import com.yida.data.device.vo.consume.H5ConsumeRecordPageVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + * 消费机前端controller + * + * @author ZYJ + * @date 2023/3/16 + */ +@Slf4j +@RestController +@RequiredArgsConstructor +@RequestMapping("h5/consume") +@Api(tags = "消费机前端api") +public class H5ConsumeController { + + private final H5ConsumeService h5ConsumeService; + + @GetMapping("/checkVip") + @ApiOperation("查询学生消费机会员状态") + public ResultBean checkVip( + @ApiParam(value = "学生id", required = true) @RequestParam Long studentId, + @ApiParam(value = "学校id", required = true) @RequestParam Long schoolId) { + return ResultBean.buildSuccess(h5ConsumeService.checkVip(studentId, schoolId)); + } + + @GetMapping("/reportLoss") + @ApiOperation("挂失") + public ResultBean reportLoss(@ApiParam(value = "学生id", required = true) @RequestParam Long studentId) { + return ResultBean.buildSuccess(h5ConsumeService.reportLoss(studentId)); + } + + @GetMapping("/unfreeze") + @ApiOperation("解冻") + public ResultBean unfreeze(@ApiParam(value = "学生id", required = true) @RequestParam Long studentId) { + return ResultBean.buildSuccess(h5ConsumeService.unfreeze(studentId)); + } + + @PostMapping("/createConsumeOrder") + @ApiOperation("生成消费订单(充值)") + public ResultBean createConsumeOrder(@RequestBody CreateConsumeOrderDTO dto) { + return ResultBean.buildSuccess(h5ConsumeService.createConsumeOrder(dto)); + } + + @GetMapping("/consumeOrderSuccess") + @ApiOperation("消费订单完成(前台支付成功后调用)") + public ResultBean consumeOrderSuccess( + @ApiParam(value = "订单号", required = true) @RequestParam String orderCode) { + h5ConsumeService.consumeOrderSuccess(orderCode); + return ResultBean.buildSuccess(); + } + + @PostMapping(value = "listH5ConsumeOrderPage") + @ApiOperation(value = "前端查询消费订单列表数据(充值记录)") + public ResultBean> listH5ConsumeOrderPage(@RequestBody H5ConsumeOrderPageDTO dto) { + IPage page = h5ConsumeService.listH5ConsumeOrderPage(dto); + return ResultBean.buildSuccess(page); + } + + @GetMapping(value = "getH5ConsumeOrderInfo") + @ApiOperation(value = "前端查询消费订单详情(充值记录)") + public ResultBean getH5ConsumeOrderInfo( + @ApiParam(value = "订单id") @RequestParam(required = false) Long orderId, + @ApiParam(value = "订单号") @RequestParam(required = false) String orderCode) { + return ResultBean.buildSuccess(h5ConsumeService.getH5ConsumeOrderInfo(orderId, orderCode)); + } + + @GetMapping("continuePayOrder") + @ApiOperation("继续支付") + public ResultBean continuePayOrder( + @ApiParam(value = "订单号", required = true) @RequestParam String orderCode, + @ApiParam(value = "学校id", required = true) @RequestParam Long deptId) { + ConsumePayInfoVO infoVO = h5ConsumeService.continuePayOrder(orderCode, deptId); + return ResultBean.buildSuccess(infoVO); + } + + @GetMapping(value = "cancelOrder") + @ApiOperation(value = "取消订单") + public ResultBean cancelOrder( + @ApiParam(value = "订单号", required = true) @RequestParam String orderCode) { + h5ConsumeService.cancelOrder(orderCode); + return ResultBean.buildSuccess(); + } + + @PostMapping(value = "listH5ConsumeRecordPage") + @ApiOperation(value = "前端查询学生消费记录列表") + public ResultBean> listH5ConsumeRecordPage(@RequestBody H5ConsumeRecordPageDTO dto) { + IPage page = h5ConsumeService.listH5ConsumeRecordPage(dto); + return ResultBean.buildSuccess(page); + } +} diff --git a/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/controller/InEduConsumeOrderController.java b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/controller/InEduConsumeOrderController.java new file mode 100644 index 0000000..07106ab --- /dev/null +++ b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/controller/InEduConsumeOrderController.java @@ -0,0 +1,80 @@ +package com.yida.data.device.consume.controller; + +import cn.hutool.json.JSONUtil; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.FebsResponse; +import com.yida.data.device.consume.service.EduConsumeOrderService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import java.io.BufferedReader; +import java.io.IOException; +import java.util.Map; + +/** + * 消费订单 Controller(不鉴权) + * + * @author ZYJ + * @date 2023/3/23 + */ +@Slf4j +@RestController +@RequiredArgsConstructor +@RequestMapping("in/consume") +@Api(tags = "消费订单api") +public class InEduConsumeOrderController { + + private final EduConsumeOrderService eduConsumeOrderService; + + @ApiOperation("微信支付通知结果回调 此接口暂时无用(需手动查询订单支付状态)") + @PostMapping("/wxPayNotify") + public FebsResponse wxPayNotify(@RequestBody Map res) { + return new FebsResponse().put("code", "SUCCESS"); + } + + @ApiOperation("微信退款通知结果回调 此接口暂时无用(需手动查询订单退款状态)") + @PostMapping("/wxRefundNotify") + public FebsResponse wxRefundNotify(@RequestBody Map res) { + return new FebsResponse().put("code", "SUCCESS"); + } + + @ApiOperation("银联支付通知结果回调") + @PostMapping("/unionPayNotify") + public String unionPayNotify(@RequestParam Map map) { + log.info("银联支付通知结果回调, result: {}", JSONUtil.toJsonStr(map)); + return null; +// return eduConsumeOrderService.unionPayNotify(map); + } + + @ApiOperation("收钱吧支付通知结果回调") + @PostMapping("/uPayNotify") + public String uPayNotify(HttpServletRequest request) throws IOException { + BufferedReader bufferReader = new BufferedReader(request.getReader()); + StringBuilder sb = new StringBuilder(); + String line; + while ((line = bufferReader.readLine()) != null) { + sb.append(line); + } + log.info("收钱吧支付通知结果回调, result: {}", sb.toString()); + log.info("收钱吧支付通知结果回调签名, sign: {}", request.getHeader("Authorization")); + return eduConsumeOrderService.uPayNotify(sb.toString(), request); + } + + @GetMapping(value = "updateOrderStatus") + @ApiOperation(value = "更新超时订单状态") + public ResultBean updateOrderStatus() { + eduConsumeOrderService.updateOrderStatus(); + return ResultBean.buildSuccess(); + } + + @GetMapping(value = "updateRefundStatus") + @ApiOperation(value = "更新退款订单状态") + public ResultBean updateRefundStatus() { + eduConsumeOrderService.updateRefundStatus(); + return ResultBean.buildSuccess(); + } +} diff --git a/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/controller/out/OutConsumeController.java b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/controller/out/OutConsumeController.java new file mode 100644 index 0000000..db3f180 --- /dev/null +++ b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/controller/out/OutConsumeController.java @@ -0,0 +1,35 @@ +package com.yida.data.device.consume.controller.out; + +import com.yida.data.common.core.entity.FebsResponse; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Map; + +/** + * 消费机 Controller(不鉴权) + * + * @author ZYJ + * @date 2023/3/10 + */ +@Slf4j +@RestController +@RequiredArgsConstructor +@RequestMapping("out/consume") +@Api(tags = "消费机api") +public class OutConsumeController { + + @ApiOperation("海普天消费结果通知") + @PostMapping("/consumeNotify") + public FebsResponse consumeNotify(@RequestBody Map res) { + log.info("结果信息: {}", res); + return new FebsResponse().put("code", "SUCCESS"); + } + +} diff --git a/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/mapper/EduConsumeDeviceMapper.java b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/mapper/EduConsumeDeviceMapper.java new file mode 100644 index 0000000..b2beb33 --- /dev/null +++ b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/mapper/EduConsumeDeviceMapper.java @@ -0,0 +1,21 @@ +package com.yida.data.device.consume.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yida.data.common.core.entity.consume.EduConsumeDevice; +import com.yida.data.device.vo.consume.ConsumeDeviceVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 消费机设备Mapper + * + * @author ZYJ + * @date 2023-03-14 18:02:27 + */ +public interface EduConsumeDeviceMapper extends BaseMapper { + + Page listDevicePage(Page page, @Param("schoolIds")List schoolIds, + @Param("number") String number, @Param("state") Integer state); +} diff --git a/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/mapper/EduConsumeOrderMapper.java b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/mapper/EduConsumeOrderMapper.java new file mode 100644 index 0000000..5df909d --- /dev/null +++ b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/mapper/EduConsumeOrderMapper.java @@ -0,0 +1,80 @@ +package com.yida.data.device.consume.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yida.data.common.core.entity.consume.EduConsumeOrder; +import com.yida.data.device.dto.consume.ConsumeOrderPageDTO; +import com.yida.data.device.dto.consume.H5ConsumeOrderPageDTO; +import com.yida.data.device.vo.consume.ConsumeOrderPageVO; +import com.yida.data.device.vo.consume.ConsumeRefundOrderVO; +import com.yida.data.device.vo.consume.H5ConsumeOrderPageVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 消费订单(充值记录)Mapper + * + * @author ZYJ + * @date 2023/3/23 + */ +public interface EduConsumeOrderMapper extends BaseMapper { + + /** + * 前端查询账单订单列表数据 + * 未支付、成功、退款中 + * + * @param page 分页数据 + * @param dto 消费订单列表请求类(充值记录) + * @return com.baomidou.mybatisplus.core.metadata.IPage + * @author ZYJ + * @date 2023/3/24 14:29 + */ + IPage listH5ConsumeOrderPage(Page page, + @Param("dto") H5ConsumeOrderPageDTO dto); + + /** + * 前端查询消费订单详情(充值记录) + * + * @param orderId 订单id + * @param orderCode 订单号 + * @return com.yida.data.device.vo.consume.H5ConsumeOrderPageVO + * @author ZYJ + * @date 2023/3/24 14:45 + */ + H5ConsumeOrderPageVO getH5ConsumeOrderInfo(@Param("orderId") Long orderId, @Param("orderCode") String orderCode); + + /** + * 查询所有已经超时订单 + * 未支付状态 + * + * @return java.util.List + * @author ZYJ + * @date 2023/4/3 13:31 + */ + List selectTimeOutConsumeOrder(); + + /** + * 查询退款中状态的消费订单 + * + * @return java.util.List + * @author ZYJ + * @date 2023/4/3 16:07 + */ + List selectRefundOrder(); + + /** + * 消费订单后台列表分页查询 + * + * @param page 分页信息 + * @param schoolIds 学校id集合 + * @param dto 消费订单后台列表请求类 + * @return com.baomidou.mybatisplus.extension.plugins.pagination.Page + * @author ZYJ + * @date 2023/4/14 17:09 + */ + Page listConsumeOrderPage(Page page, + @Param("schoolIds") List schoolIds, + @Param("dto") ConsumeOrderPageDTO dto); +} diff --git a/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/mapper/EduConsumeOrderRefundMapper.java b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/mapper/EduConsumeOrderRefundMapper.java new file mode 100644 index 0000000..a78cab6 --- /dev/null +++ b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/mapper/EduConsumeOrderRefundMapper.java @@ -0,0 +1,14 @@ +package com.yida.data.device.consume.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.consume.EduConsumeOrderRefund; + +/** + * 消费订单退款信息Mapper + * + * @author ZYJ + * @date 2023-04-03 16:12:35 + */ +public interface EduConsumeOrderRefundMapper extends BaseMapper { + +} diff --git a/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/mapper/EduConsumeOrderStudentMapper.java b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/mapper/EduConsumeOrderStudentMapper.java new file mode 100644 index 0000000..8725e95 --- /dev/null +++ b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/mapper/EduConsumeOrderStudentMapper.java @@ -0,0 +1,14 @@ +package com.yida.data.device.consume.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.consume.EduConsumeOrderStudent; + +/** + * 消费订单(充值)学生详细信息Mapper + * + * @author ZYJ + * @date 2023/3/23 + */ +public interface EduConsumeOrderStudentMapper extends BaseMapper { + +} diff --git a/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/mapper/EduConsumeRecordMapper.java b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/mapper/EduConsumeRecordMapper.java new file mode 100644 index 0000000..2cdeff7 --- /dev/null +++ b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/mapper/EduConsumeRecordMapper.java @@ -0,0 +1,30 @@ +package com.yida.data.device.consume.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yida.data.common.core.entity.consume.EduConsumeRecord; +import com.yida.data.device.dto.consume.H5ConsumeRecordPageDTO; +import com.yida.data.device.vo.consume.H5ConsumeRecordPageVO; +import org.apache.ibatis.annotations.Param; + +/** + * 消费机学生消费记录Mapper + * + * @author ZYJ + * @date 2023-03-24 16:16:49 + */ +public interface EduConsumeRecordMapper extends BaseMapper { + + /** + * 前端查询学生消费记录列表 + * + * @param page 分页信息 + * @param dto 消费机学生消费记录列表请求类 + * @return com.baomidou.mybatisplus.core.metadata.IPage + * @author ZYJ + * @date 2023/3/24 17:18 + */ + IPage listH5ConsumeRecordPage(Page page, + @Param("dto") H5ConsumeRecordPageDTO dto); +} diff --git a/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/mapper/EduStudentConsumeCardMapper.java b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/mapper/EduStudentConsumeCardMapper.java new file mode 100644 index 0000000..c53fea7 --- /dev/null +++ b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/mapper/EduStudentConsumeCardMapper.java @@ -0,0 +1,14 @@ +package com.yida.data.device.consume.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.consume.EduStudentConsumeCard; + +/** + * 学生消费机信息管理Mapper + * + * @author ZYJ + * @date 2023-03-20 15:02:20 + */ +public interface EduStudentConsumeCardMapper extends BaseMapper { + +} diff --git a/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/service/EduConsumeDeviceService.java b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/service/EduConsumeDeviceService.java new file mode 100644 index 0000000..e2fe3f1 --- /dev/null +++ b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/service/EduConsumeDeviceService.java @@ -0,0 +1,38 @@ +package com.yida.data.device.consume.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.consume.EduConsumeDevice; +import com.yida.data.device.vo.consume.ConsumeDeviceVO; + +/** + * 消费机设备Service接口 + * + * @author ZYJ + * @date 2023-03-14 18:02:27 + */ +public interface EduConsumeDeviceService extends IService { + + /** + * 消费机设备列表分页查询 + * + * @param pageNum 页码 + * @param pageSize 每页数量 + * @param number 设备编号或名称 + * @param state 设备状态,0-在线,1-离线 + * @param schoolId 学校id + * @return com.baomidou.mybatisplus.extension.plugins.pagination.Page + * @author ZYJ + * @date 2023/3/15 10:14 + */ + Page listDevicePage(Integer pageNum, Integer pageSize, String number, Integer state, Long schoolId); + + /** + * 保存消费机设备 + * + * @param device 消费机设备信息 + * @author ZYJ + * @date 2023/3/15 10:43 + */ + void saveDevice(EduConsumeDevice device); +} diff --git a/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/service/EduConsumeOrderRefundService.java b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/service/EduConsumeOrderRefundService.java new file mode 100644 index 0000000..a01a474 --- /dev/null +++ b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/service/EduConsumeOrderRefundService.java @@ -0,0 +1,13 @@ +package com.yida.data.device.consume.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.consume.EduConsumeOrderRefund; + +/** +* 消费订单退款信息Service接口 +* +* @author ZYJ +* @date 2023-04-03 16:12:35 +*/ +public interface EduConsumeOrderRefundService extends IService { +} diff --git a/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/service/EduConsumeOrderService.java b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/service/EduConsumeOrderService.java new file mode 100644 index 0000000..a996323 --- /dev/null +++ b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/service/EduConsumeOrderService.java @@ -0,0 +1,65 @@ +package com.yida.data.device.consume.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.consume.EduConsumeOrder; +import com.yida.data.device.dto.consume.ConsumeOrderPageDTO; +import com.yida.data.device.vo.consume.ConsumeOrderPageVO; + +import javax.servlet.http.HttpServletRequest; + +/** + * 消费订单(充值记录)Service接口 + * + * @author ZYJ + * @date 2023/3/23 + */ +public interface EduConsumeOrderService extends IService { + + /** + * 收钱吧支付通知结果回调 + * + * @param result 回调值 + * @param request 请求信息 + * @return java.lang.String + * @author ZYJ + * @date 2023/3/23 16:13 + */ + String uPayNotify(String result, HttpServletRequest request); + + /** + * 更新超时订单状态 + * + * @author ZYJ + * @date 2023/4/3 13:26 + */ + void updateOrderStatus(); + + + /** + * 更新退款订单状态 + * + * @author ZYJ + * @date 2023/4/3 13:26 + */ + void updateRefundStatus(); + + /** + * 消费订单列表分页查询 + * + * @param dto 消费订单后台列表请求类 + * @return com.baomidou.mybatisplus.extension.plugins.pagination.Page + * @author ZYJ + * @date 2023/4/14 16:48 + */ + Page listConsumeOrderPage(ConsumeOrderPageDTO dto); + + /** + * 消费订单退款 + * + * @param orderCode 订单号 + * @author ZYJ + * @date 2023/4/15 15:37 + */ + void refundOrder(String orderCode); +} diff --git a/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/service/EduConsumeOrderStudentService.java b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/service/EduConsumeOrderStudentService.java new file mode 100644 index 0000000..02cb087 --- /dev/null +++ b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/service/EduConsumeOrderStudentService.java @@ -0,0 +1,14 @@ +package com.yida.data.device.consume.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.consume.EduConsumeOrderStudent; + +/** +* 消费订单(充值)学生详细信息Service接口 +* +* @author ZYJ +* @date 2023-03-23 14:03:58 +*/ +public interface EduConsumeOrderStudentService extends IService { + +} diff --git a/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/service/EduConsumeRecordService.java b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/service/EduConsumeRecordService.java new file mode 100644 index 0000000..65b4acd --- /dev/null +++ b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/service/EduConsumeRecordService.java @@ -0,0 +1,14 @@ +package com.yida.data.device.consume.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.consume.EduConsumeRecord; + +/** +* 消费机学生消费记录Service接口 +* +* @author ZYJ +* @date 2023-03-24 16:16:49 +*/ +public interface EduConsumeRecordService extends IService { + +} diff --git a/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/service/EduStudentConsumeCardService.java b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/service/EduStudentConsumeCardService.java new file mode 100644 index 0000000..54259b2 --- /dev/null +++ b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/service/EduStudentConsumeCardService.java @@ -0,0 +1,22 @@ +package com.yida.data.device.consume.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.consume.EduStudentConsumeCard; + +/** + * 学生消费机信息管理Service接口 + * + * @author ZYJ + * @date 2023-03-20 15:02:20 + */ +public interface EduStudentConsumeCardService extends IService { + + /** + * 保存学生消费机信息 + * + * @param eduStudentConsumeCard 学生消费机信息 + * @author ZYJ + * @date 2023/3/20 15:54 + */ + void saveConsumeCard(EduStudentConsumeCard eduStudentConsumeCard); +} diff --git a/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/service/H5ConsumeService.java b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/service/H5ConsumeService.java new file mode 100644 index 0000000..5585e7f --- /dev/null +++ b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/service/H5ConsumeService.java @@ -0,0 +1,132 @@ +package com.yida.data.device.consume.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.yida.data.device.dto.consume.CreateConsumeOrderDTO; +import com.yida.data.device.dto.consume.H5ConsumeOrderPageDTO; +import com.yida.data.device.dto.consume.H5ConsumeRecordPageDTO; +import com.yida.data.device.vo.consume.ConsumePayInfoVO; +import com.yida.data.device.vo.consume.ConsumeVipVO; +import com.yida.data.device.vo.consume.H5ConsumeOrderPageVO; +import com.yida.data.device.vo.consume.H5ConsumeRecordPageVO; + +import java.time.LocalDateTime; + +/** + * 消费机前端service + * + * @author ZYJ + * @date 2023/3/16 + */ +public interface H5ConsumeService { + + /** + * 查询学生消费机会员状态 + * + * @param studentId 学生id + * @param schoolId 学校id + * @return com.yida.data.device.vo.consume.ConsumeVipVO + * @author ZYJ + * @date 2023/3/16 15:52 + */ + ConsumeVipVO checkVip(Long studentId, Long schoolId); + + /** + * 挂失 + * + * @param studentId 学生id + * @return java.lang.String + * @author ZYJ + * @date 2023/3/30 9:38 + */ + String reportLoss(Long studentId); + + /** + * 解冻 + * + * @param studentId 学生id + * @return java.lang.String + * @author ZYJ + * @date 2023/3/30 9:39 + */ + String unfreeze(Long studentId); + + /** + * 生成消费订单(充值) + * + * @param dto 生成消费订单请求类 + * @return com.yida.data.device.vo.consume.ConsumePayInfoVO + * @author ZYJ + * @date 2023/3/22 16:37 + */ + ConsumePayInfoVO createConsumeOrder(CreateConsumeOrderDTO dto); + + /** + * 消费订单完成(前台支付成功后调用) + * + * @param orderCode 订单号 + * @author ZYJ + * @date 2023/3/23 16:43 + */ + void consumeOrderSuccess(String orderCode); + + /** + * 消费订单支付成功 + * + * @param orderCode 订单号 + * @param payDate 支付完成时间 + * @author ZYJ + * @date 2023/3/23 17:06 + */ + void consumeOrderPaySuccess(String orderCode, LocalDateTime payDate); + + /** + * 前端查询消费订单列表数据(充值记录) + * + * @param dto 消费订单列表请求类(充值记录) + * @return com.baomidou.mybatisplus.core.metadata.IPage + * @author ZYJ + * @date 2023/3/24 14:26 + */ + IPage listH5ConsumeOrderPage(H5ConsumeOrderPageDTO dto); + + /** + * 前端查询消费订单详情(充值记录) + * + * @param orderId 订单id + * @param orderCode 订单号 + * @return com.yida.data.device.vo.consume.H5ConsumeOrderPageVO + * @author ZYJ + * @date 2023/3/24 14:43 + */ + H5ConsumeOrderPageVO getH5ConsumeOrderInfo(Long orderId, String orderCode); + + /** + * 继续支付 + * + * @param orderCode 订单号 + * @param deptId 学校id + * @return com.yida.data.device.vo.consume.ConsumePayInfoVO + * @author ZYJ + * @date 2023/3/24 14:49 + */ + ConsumePayInfoVO continuePayOrder(String orderCode, Long deptId); + + /** + * 取消订单 + * + * @param orderCode 订单号 + * @author ZYJ + * @date 2023/3/30 14:14 + */ + void cancelOrder(String orderCode); + + /** + * 前端查询学生消费记录列表 + * + * @param dto 消费机学生消费记录列表请求类 + * @return com.baomidou.mybatisplus.core.metadata.IPage + * @author ZYJ + * @date 2023/3/24 16:55 + */ + IPage listH5ConsumeRecordPage(H5ConsumeRecordPageDTO dto); +} diff --git a/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/service/impl/EduConsumeDeviceServiceImpl.java b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/service/impl/EduConsumeDeviceServiceImpl.java new file mode 100644 index 0000000..50aa9e9 --- /dev/null +++ b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/service/impl/EduConsumeDeviceServiceImpl.java @@ -0,0 +1,74 @@ +package com.yida.data.device.consume.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.consume.EduConsumeDevice; +import com.yida.data.common.core.entity.system.Dept; +import com.yida.data.common.core.entity.system.enums.SysFunctionEnum; +import com.yida.data.common.core.exception.FebsException; +import com.yida.data.device.consume.mapper.EduConsumeDeviceMapper; +import com.yida.data.device.consume.service.EduConsumeDeviceService; +import com.yida.data.device.vo.consume.ConsumeDeviceVO; +import com.yida.data.system.feign.RemoteDeptService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * 消费机设备Service实现 + * + * @author ZYJ + * @date 2023-03-14 18:02:27 + */ +@Slf4j +@Service +@RequiredArgsConstructor +@Transactional(rollbackFor = Exception.class) +public class EduConsumeDeviceServiceImpl extends ServiceImpl + implements EduConsumeDeviceService { + + private final RemoteDeptService remoteDeptService; + + @Override + public Page listDevicePage(Integer pageNum, Integer pageSize, String number, Integer state, Long schoolId) { + List schoolIds = new ArrayList<>(); + if (Objects.isNull(schoolId)) { + List deptList = remoteDeptService.getSchoolByArea(null, "").getData(); + if (CollUtil.isEmpty(deptList)) { + schoolIds.add(-1L); + } else { + schoolIds = deptList.stream().map(Dept::getDeptId).collect(Collectors.toList()); + } + } else { + schoolIds.add(schoolId); + } + Page devicePage = baseMapper.listDevicePage(new Page<>(pageNum, pageSize), schoolIds, number, state); + devicePage.getRecords().forEach(consumeDeviceVO -> consumeDeviceVO.setSchoolName(remoteDeptService.getInfoById(consumeDeviceVO.getSchoolId()).getData().getDeptName())); + return devicePage; + } + + @Override + public void saveDevice(EduConsumeDevice device) { + // 查询设备号是否重复 + EduConsumeDevice eduConsumeDevice = getOne(Wrappers.lambdaQuery(new EduConsumeDevice()) + .eq(EduConsumeDevice::getSn, device.getSn()) + .ne(Objects.nonNull(device.getId()), EduConsumeDevice::getId, device.getId()) + ); + if (Objects.nonNull(eduConsumeDevice)) { + throw new FebsException("该设备号已存在,请勿重复添加"); + } + + if (Objects.isNull(device.getId())) { + device.setDeviceType(SysFunctionEnum.HAI_PU_TIAN.getValue()); + } + saveOrUpdate(device); + } +} diff --git a/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/service/impl/EduConsumeOrderRefundServiceImpl.java b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/service/impl/EduConsumeOrderRefundServiceImpl.java new file mode 100644 index 0000000..411691f --- /dev/null +++ b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/service/impl/EduConsumeOrderRefundServiceImpl.java @@ -0,0 +1,26 @@ +package com.yida.data.device.consume.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.consume.EduConsumeOrderRefund; +import com.yida.data.device.consume.mapper.EduConsumeOrderRefundMapper; +import com.yida.data.device.consume.service.EduConsumeOrderRefundService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * 消费订单退款信息Service实现 + * + * @author ZYJ + * @date 2023-04-03 16:12:35 + */ +@Slf4j +@Service +@RequiredArgsConstructor +@Transactional(rollbackFor = Exception.class) +public class EduConsumeOrderRefundServiceImpl extends ServiceImpl + implements EduConsumeOrderRefundService { + + +} diff --git a/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/service/impl/EduConsumeOrderServiceImpl.java b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/service/impl/EduConsumeOrderServiceImpl.java new file mode 100644 index 0000000..6e6b806 --- /dev/null +++ b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/service/impl/EduConsumeOrderServiceImpl.java @@ -0,0 +1,594 @@ +package com.yida.data.device.consume.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.date.LocalDateTimeUtil; +import cn.hutool.core.util.NumberUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.constant.UPayConstant; +import com.yida.data.common.core.entity.constant.UnionPayConstant; +import com.yida.data.common.core.entity.constant.WxPayConstant; +import com.yida.data.common.core.entity.consume.DeptConsumeTerminalCache; +import com.yida.data.common.core.entity.consume.EduConsumeOrder; +import com.yida.data.common.core.entity.consume.EduConsumeOrderRefund; +import com.yida.data.common.core.entity.pay.URefund; +import com.yida.data.common.core.entity.pay.UnionRefund; +import com.yida.data.common.core.entity.system.Dept; +import com.yida.data.common.core.entity.system.EduPayWxConfig; +import com.yida.data.common.core.entity.system.UPayConfig; +import com.yida.data.common.core.entity.system.UnionPayConfig; +import com.yida.data.common.core.enums.*; +import com.yida.data.common.core.exception.FebsException; +import com.yida.data.common.core.utils.*; +import com.yida.data.common.service.CommonService; +import com.yida.data.device.consume.mapper.EduConsumeOrderMapper; +import com.yida.data.device.consume.service.EduConsumeOrderRefundService; +import com.yida.data.device.consume.service.EduConsumeOrderService; +import com.yida.data.device.consume.service.H5ConsumeService; +import com.yida.data.device.dto.consume.ConsumeOrderPageDTO; +import com.yida.data.device.vo.consume.ConsumeOrderPageVO; +import com.yida.data.device.vo.consume.ConsumeRefundOrderVO; +import com.yida.data.system.feign.RemoteDeptService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * 消费订单(充值记录)Service实现 + * + * @author ZYJ + * @date 2023/3/23 + */ +@Slf4j +@Service +@RequiredArgsConstructor +@Transactional(rollbackFor = Exception.class) +public class EduConsumeOrderServiceImpl extends ServiceImpl + implements EduConsumeOrderService { + + private final EduConsumeOrderRefundService eduConsumeOrderRefundService; + + @Lazy + @Resource + private H5ConsumeService h5ConsumeService; + + private final RemoteDeptService remoteDeptService; + + private final CommonService commonService; + private final UnionPayPublicUtil unionPayPublicUtil; + private static final String CONSUME_WX_REFUND_NOTIFY_URL = "mall/in/consume/wxRefundNotify"; + + @Value("${febs.apiUrl}") + private String apiUrl; + + @Override + public String uPayNotify(String result, HttpServletRequest request) { + try { + JSONObject map = JSONUtil.parseObj(result); + // 根据订单号查询对应的订单信息 + EduConsumeOrder order = getOne(new LambdaQueryWrapper<>(new EduConsumeOrder()) + .eq(EduConsumeOrder::getOrderCode, map.get("client_sn"))); + if (Objects.isNull(order)) { + log.error("收钱吧支付回调, 未找到订单信息, orderNO: {}", map.get("client_sn")); + return UPayNotifyResultEnum.FAILED_STATUS.getValue(); + } + // 判断支付结果是否处理 + if (OrderStatusEnum.PAY_SUCCESS.getStatus().equals(order.getOrderStatus())) { + log.info("收钱吧支付回调, 该订单已经处理: {}", order.getOrderCode()); + return UPayNotifyResultEnum.SUCCESS_STATUS.getValue(); + } + // 获取收钱吧配置信息 + UPayConfig config = commonService.getUPayConfigByDept(order.getDeptId()); + if (Objects.isNull(config)) { + log.info("收钱吧支付回调, 该学校没有对应的配置信息: {}", order.getDeptId()); + return UPayNotifyResultEnum.FAILED_STATUS.getValue(); + } + // 返回的订单状态 + String orderStatus = (String) map.get("order_status"); + // 新订单和不明确订单直接返回 + if (UPayTradeStateEnum.CREATED.getStatus().equals(orderStatus) + || UPayTradeStateEnum.INVALID_STATUS_CODE.getStatus().equals(orderStatus)) { + log.info("新订单和不明确订单, orderNo: {}", order.getOrderCode()); + return UPayNotifyResultEnum.FAILED_STATUS.getValue(); + } + // 签名 + String signature = request.getHeader("Authorization"); + // 验签 + boolean checkFlag = UPayUtil.validateSign(result, signature, config.getPublicKey()); + if (!checkFlag) { + log.error("收钱吧支付回调, 验签失败"); + return UPayNotifyResultEnum.FAILED_STATUS.getValue(); + } + // 支付时间 + String payTime = (String) map.get("finish_time"); + // 修改订单状态 + UPayTradeStateEnum tradeStateEnum = EnumUtils.valueOf(UPayTradeStateEnum.class, orderStatus, + UPayTradeStateEnum.class.getMethod("getStatus")); + switch (Objects.requireNonNull(tradeStateEnum)) { + // 支付成功 + case PAID: +// h5ConsumeService.consumeOrderPaySuccess(order.getOrderCode(), LocalDateTimeUtil.parse(payTime, DatePattern.NORM_DATETIME_PATTERN)); + h5ConsumeService.consumeOrderPaySuccess(order.getOrderCode(), LocalDateTimeUtil.ofUTC(Long.parseLong(payTime))); + break; + // 订单关闭 + case CANCELED: + order.setOrderStatus(OrderStatusEnum.CLOSED.getStatus()); + order.setPayStatus(PayStatusEnum.CANCEL.getStatus()); + updateById(order); + break; + default: + break; + } + + } catch (Exception e) { + log.error("处理收钱吧支付回调数据失败", e); + return UPayNotifyResultEnum.FAILED_STATUS.getValue(); + } + return UPayNotifyResultEnum.SUCCESS_STATUS.getValue(); + } + + @Override + public void updateOrderStatus() { + // 查询超时订单 + List list = baseMapper.selectTimeOutConsumeOrder(); + if (CollUtil.isNotEmpty(list)) { + for (EduConsumeOrder order : list) { + // 微信订单 + if (PayWay.WEI_XIN.getValue().equals(order.getPayWay())) { + updateWxOrderStatus(order); + } else if (PayWay.UNION.getValue().equals(order.getPayWay())) { + updateUnionOrderStatus(order); + } else if (PayWay.U_PAY.getValue().equals(order.getPayWay())) { + updateUPayOrderStatus(order); + } + } + } + } + + /** + * 更新微信超时消费订单状态 + * + * @param order 订单信息 + * @author ZYJ + * @date 2023/4/3 13:34 + */ + private void updateWxOrderStatus(EduConsumeOrder order) { + try { + // 查询学校微信支付配置信息 + EduPayWxConfig config = commonService.getPayWxConfigBySchool(order.getDeptId()); + // 主动查询订单支付状态 + JSONObject resultJson = JSONUtil.parseObj(WxPayUtil.queryOrder(config, order.getOrderCode())); + log.info("微信消费订单查询返回数据, consumeOrderCode: {}, resultJson: {}", order.getOrderCode(), resultJson); + if (resultJson.containsKey(WxPayConstant.CODE_NAME) + && WxPayConstant.ORDER_NOT_EXIST.equals(resultJson.getStr(WxPayConstant.CODE_NAME))) { + // 订单不存在 取消订单 + order.setOrderStatus(OrderStatusEnum.CLOSED.getStatus()); + order.setPayStatus(PayStatusEnum.CANCEL.getStatus()); + } else { + String tradeState = resultJson.getStr("trade_state"); + // 未支付则关闭订单 + if (WxTradeStateEnum.NOT_PAY.getStatus().equals(tradeState)) { + WxPayUtil.closeOrder(config, order.getOrderCode()); + } + WxTradeStateEnum wxTradeStateEnum = EnumUtils.valueOf(WxTradeStateEnum.class, tradeState, + WxTradeStateEnum.class.getMethod("getStatus")); + switch (Objects.requireNonNull(wxTradeStateEnum)) { + // 支付成功情况 + case SUCCESS: + h5ConsumeService.consumeOrderPaySuccess(order.getOrderCode(), + DateUtil.parseLocalDateTime(resultJson.getStr("success_time"), + "yyyy-MM" + "-dd'T" + "'HH:mm" + ":ssXXX")); + break; + // 作废订单 + case NOT_PAY: + case CLOSED: + case REVOKED: + case PAY_ERROR: + order.setOrderStatus(OrderStatusEnum.CLOSED.getStatus()); + order.setPayStatus(PayStatusEnum.CANCEL.getStatus()); + break; + default: + break; + } + } + if (OrderStatusEnum.CLOSED.getStatus().equals(order.getOrderStatus())) { + baseMapper.updateById(order); + } + } catch (Exception e) { + log.error("更新微信消费订单状态失败, order: {}", order, e); + } + } + + /** + * 更新银联超时消费订单状态 + * + * @param order 订单信息 + * @author ZYJ + * @date 2023/4/3 13:41 + */ + private void updateUnionOrderStatus(EduConsumeOrder order) { + try { + // 查询学校银联配置信息 + UnionPayConfig config = commonService.getUnionPayConfigByDept(order.getDeptId()); + // 主商户信息 + UnionPayConfig parentConfig = config.getParentConfig(); + // 开发者ID + String appId = Objects.nonNull(parentConfig) ? parentConfig.getAppId() : config.getAppId(); + // 开发者key + String appKey = Objects.nonNull(parentConfig) ? parentConfig.getAppKey() : config.getAppKey(); + + // 主动查询订单支付状态 + JSONObject resultJson = UnionPayUtil.queryOrder(config, unionPayPublicUtil.getAccessToken(appId, appKey), order.getOrderCode()); + log.info("银联消费订单查询返回数据, consumeOrderCode: {}, resultJson: {}", order.getOrderCode(), resultJson); + // 返回code + String code = (String) resultJson.get(UnionPayConstant.CODE_NAME); + // 无法找到指定的订单 需要直接关闭订单 + if (UnionPayConstant.NO_ORDER_CODE.equalsIgnoreCase(code) + || UnionPayConstant.TARGET_FAIL_CODE.equalsIgnoreCase(code)) { + order.setOrderStatus(OrderStatusEnum.CLOSED.getStatus()); + order.setPayStatus(PayStatusEnum.CANCEL.getStatus()); + baseMapper.updateById(order); + return; + } + // 支付状态 + String status = (String) resultJson.get("status"); + // 未支付则关闭订单 (银联云闪付不支付关闭订单) + if (UnionTradeStateEnum.NEW_ORDER.getStatus().equals(status) + && !UnionPayTypeEnum.UNION_H5_TYPE.getType().equals(order.getPayType())) { + UnionPayUtil.closeOrder(config, unionPayPublicUtil.getAccessToken(appId, appKey), order.getOrderCode()); + } + UnionTradeStateEnum tradeStateEnum = EnumUtils.valueOf(UnionTradeStateEnum.class, status, + UnionTradeStateEnum.class.getMethod("getStatus")); + switch (Objects.requireNonNull(tradeStateEnum)) { + // 支付成功 + case TRADE_SUCCESS: + h5ConsumeService.consumeOrderPaySuccess(order.getOrderCode(), + LocalDateTimeUtil.parse((String) resultJson.get("payTime"), DatePattern.NORM_DATETIME_PATTERN)); + break; + // 作废订单 + case NEW_ORDER: + case TRADE_CLOSED: + case WAIT_BUYER_PAY: + order.setOrderStatus(OrderStatusEnum.CLOSED.getStatus()); + order.setPayStatus(PayStatusEnum.CANCEL.getStatus()); + break; + default: + break; + } + if (OrderStatusEnum.CLOSED.getStatus().equals(order.getOrderStatus())) { + baseMapper.updateById(order); + } + } catch (Exception e) { + log.error("更新银联消费订单状态失败, order: {}", order, e); + } + } + + /** + * 更新收钱吧超时消费订单状态 + * + * @param order 订单信息 + * @author ZYJ + * @date 2023/4/3 13:48 + */ + private void updateUPayOrderStatus(EduConsumeOrder order) { + try { + DeptConsumeTerminalCache terminalCache = commonService.getDeptConsumeTerminal(order.getDeptId()); + JSONObject jsonObject = UPayUtil.queryOrder(order.getOrderCode(), terminalCache.getTerminalSn(), terminalCache.getTerminalKey()); + log.info("收钱吧消费订单查询返回数据, consumeOrderCode: {}, resultJson: {}", order.getOrderCode(), jsonObject); + JSONObject bizResponse = jsonObject.getJSONObject("biz_response"); + // 无法找到指定的订单 需要直接关闭订单 + if (UPayConstant.NO_ORDER_CODE.equals(bizResponse.getStr(UPayConstant.ERROR_CODE_NAME)) + || UPayConstant.TRADE_NOT_EXIST.equals(bizResponse.getStr(UPayConstant.ERROR_CODE_NAME))) { + order.setOrderStatus(OrderStatusEnum.CLOSED.getStatus()); + order.setPayStatus(PayStatusEnum.CANCEL.getStatus()); + baseMapper.updateById(order); + return; + } + JSONObject resultJson = bizResponse.getJSONObject("data"); + // 支付状态 + String status = (String) resultJson.get("order_status"); + // 无法找到指定的订单 需要直接关闭订单 + if (UPayTradeStateEnum.CREATED.getStatus().equals(status) + || UPayTradeStateEnum.INVALID_STATUS_CODE.getStatus().equals(status)) { + order.setOrderStatus(OrderStatusEnum.CLOSED.getStatus()); + order.setPayStatus(PayStatusEnum.CANCEL.getStatus()); + baseMapper.updateById(order); + return; + } + UPayTradeStateEnum tradeStateEnum = EnumUtils.valueOf(UPayTradeStateEnum.class, status, + UPayTradeStateEnum.class.getMethod("getStatus")); + switch (Objects.requireNonNull(tradeStateEnum)) { + // 支付成功 + case PAID: + h5ConsumeService.consumeOrderPaySuccess(order.getOrderCode(), LocalDateTimeUtil.ofUTC(Long.parseLong(resultJson.getStr("finish_time")))); + break; + // 作废订单 + case CREATED: + case CANCELED: + order.setOrderStatus(OrderStatusEnum.CLOSED.getStatus()); + order.setPayStatus(PayStatusEnum.CANCEL.getStatus()); + break; + default: + break; + } + if (OrderStatusEnum.CLOSED.getStatus().equals(order.getOrderStatus())) { + baseMapper.updateById(order); + } + } catch (Exception e) { + log.error("更新收钱吧消费订单状态失败, order: {}", order, e); + } + } + + @Override + public void updateRefundStatus() { + // 查询退款中状态的消费订单 + List refundOrderList = baseMapper.selectRefundOrder(); + if (CollUtil.isNotEmpty(refundOrderList)) { + refundOrderList.forEach(refundOrderVO -> { + // 微信 + if (PayWay.WEI_XIN.getValue().equals(refundOrderVO.getPayWay())) { + updateWxRefundStatus(refundOrderVO); + } else if (PayWay.UNION.getValue().equals(refundOrderVO.getPayWay())) { + updateUnionRefundStatus(refundOrderVO); + } else if (PayWay.U_PAY.getValue().equals(refundOrderVO.getPayWay())) { + updateUPayRefundStatus(refundOrderVO); + } + }); + } + } + + /** + * 更新微信退款订单状态 + * + * @param vo 退款信息 + * @author ZYJ + * @date 2023/4/3 16:11 + */ + private void updateWxRefundStatus(ConsumeRefundOrderVO vo) { + try { + EduPayWxConfig config = commonService.getPayWxConfigBySchool(vo.getDeptId()); + // 主动查询退款状态 + JSONObject resultJson = JSONUtil.parseObj(WxPayUtil.queryRefund(config, vo.getRefundCode())); + log.info("账单订单退款查询返回数据, refundOrderCode: {}, resultJson: {}", vo.getRefundCode(), resultJson); + // 状态 + String status = resultJson.getStr("status"); + WxRefundStatusEnum wxRefundStatusEnum = EnumUtils.valueOf(WxRefundStatusEnum.class, status, + WxRefundStatusEnum.class.getMethod("getStatus")); + switch (Objects.requireNonNull(wxRefundStatusEnum)) { + case REFUND_SUCCESS: + // 更新订单退款状态 + EduConsumeOrder order = getById(vo.getOrderId()); + order.setOrderStatus(OrderStatusEnum.CLOSED.getStatus()); + order.setPayStatus(PayStatusEnum.REFUND_SUCCESS.getStatus()); + order.setIsRefund(RefundStatusEnum.IS_REFUND.getStatus()); + baseMapper.updateById(order); + // 更新退款时间 + EduConsumeOrderRefund eduBillOrderRefund = eduConsumeOrderRefundService.getById(vo.getRefundId()); + eduBillOrderRefund.setRefundTime(DateUtil.parseLocalDateTime(resultJson.getStr("success_time"), "yyyy-MM-dd'T'HH:mm:ssXXX")); + eduConsumeOrderRefundService.updateById(eduBillOrderRefund); + break; + case REFUND_ABNORMAL: + // TODO 2022/6/27 需要后续处理退款失败情况 + break; + default: + break; + } + } catch (Exception e) { + log.error("查询微信消费订单退款状态失败, refundOrder: {}", vo, e); + } + } + + /** + * 更新银联退款订单状态 + * + * @param vo 退款信息 + * @author ZYJ + * @date 2023/4/3 16:22 + */ + private void updateUnionRefundStatus(ConsumeRefundOrderVO vo) { + try { + // 查询学校银联配置信息 + UnionPayConfig config = commonService.getUnionPayConfigByDept(vo.getDeptId()); + // 主商户信息 + UnionPayConfig parentConfig = config.getParentConfig(); + // 开发者ID + String appId = Objects.nonNull(parentConfig) ? parentConfig.getAppId() : config.getAppId(); + // 开发者key + String appKey = Objects.nonNull(parentConfig) ? parentConfig.getAppKey() : config.getAppKey(); + // 主动查询退款状态 + JSONObject resultJson = UnionPayUtil.refundQuery(config, vo.getRefundCode(), unionPayPublicUtil.getAccessToken(appId, appKey)); + log.info("银联账单订单退款查询返回数据, refundOrderCode: {}, resultJson: {}", vo.getRefundCode(), resultJson); + // 退款状态 + String refundStatus = resultJson.getStr("refundStatus"); + UnionRefundStatusEnum refundStatusEnum = EnumUtils.valueOf(UnionRefundStatusEnum.class, refundStatus, + UnionRefundStatusEnum.class.getMethod("getStatus")); + switch (Objects.requireNonNull(refundStatusEnum)) { + case REFUND_SUCCESS: + // 更新订单退款状态 + EduConsumeOrder eduBillOrder = getById(vo.getOrderId()); + eduBillOrder.setOrderStatus(OrderStatusEnum.CLOSED.getStatus()); + eduBillOrder.setPayStatus(PayStatusEnum.REFUND_SUCCESS.getStatus()); + eduBillOrder.setIsRefund(RefundStatusEnum.IS_REFUND.getStatus()); + baseMapper.updateById(eduBillOrder); + // 更新退款时间 + EduConsumeOrderRefund eduBillOrderRefund = eduConsumeOrderRefundService.getById(vo.getRefundId()); + eduBillOrderRefund.setRefundTime(LocalDateTimeUtil.parse((String) resultJson.get("responseTimestamp"), DatePattern.NORM_DATETIME_PATTERN)); + eduConsumeOrderRefundService.updateById(eduBillOrderRefund); + break; + case REFUND_FAIL: + // TODO 2022/6/27 需要后续处理退款失败情况 + break; + default: + break; + } + } catch (Exception e) { + log.error("查询银联消费订单退款状态失败, refundOrder: {}", vo, e); + } + } + + /** + * 更新收钱吧退款订单状态 + * + * @param vo 退款信息 + * @author ZYJ + * @date 2023/4/3 16:26 + */ + private void updateUPayRefundStatus(ConsumeRefundOrderVO vo) { + try { + DeptConsumeTerminalCache terminalCache = commonService.getDeptConsumeTerminal(vo.getDeptId()); + JSONObject jsonObject = UPayUtil.queryRefundOrder(vo.getOrderCode(), vo.getRefundCode(), terminalCache.getTerminalSn(), terminalCache.getTerminalKey()); + log.info("收钱吧消费订单查询返回数据, consumeOrderCode: {}, resultJson: {}", vo.getOrderCode(), jsonObject); + JSONObject resultJson = jsonObject.getJSONObject("biz_response").getJSONObject("data"); + + // 订单状态 + String status = (String) resultJson.get("order_status"); + UPayTradeStateEnum tradeStateEnum = EnumUtils.valueOf(UPayTradeStateEnum.class, status, + UPayTradeStateEnum.class.getMethod("getStatus")); + switch (Objects.requireNonNull(tradeStateEnum)) { + // 支付成功 + case REFUNDED: + // 更新订单退款状态 + EduConsumeOrder eduBillOrder = getById(vo.getOrderId()); + eduBillOrder.setOrderStatus(OrderStatusEnum.CLOSED.getStatus()); + eduBillOrder.setPayStatus(PayStatusEnum.REFUND_SUCCESS.getStatus()); + eduBillOrder.setIsRefund(RefundStatusEnum.IS_REFUND.getStatus()); + baseMapper.updateById(eduBillOrder); + // 更新退款时间 + EduConsumeOrderRefund eduBillOrderRefund = eduConsumeOrderRefundService.getById(vo.getRefundId()); + eduBillOrderRefund.setRefundTime(LocalDateTimeUtil.ofUTC(Long.parseLong(resultJson.getStr("finish_time")))); + eduConsumeOrderRefundService.updateById(eduBillOrderRefund); + break; + case REFUND_ERROR: + // TODO 2023/4/3 需要后续处理退款失败情况 + break; + default: + break; + } + } catch (Exception e) { + log.error("查询收钱吧消费订单退款状态失败, refundOrder: {}", vo, e); + } + } + + @Override + public Page listConsumeOrderPage(ConsumeOrderPageDTO dto) { + + List schoolIds = new ArrayList<>(); + if (Objects.isNull(dto.getSchoolId())) { + List deptList = remoteDeptService.getSchoolByArea(null, "").getData(); + if (CollUtil.isEmpty(deptList)) { + schoolIds.add(-1L); + } else { + schoolIds = deptList.stream().map(Dept::getDeptId).collect(Collectors.toList()); + } + } else { + schoolIds.add(dto.getSchoolId()); + } + + return baseMapper.listConsumeOrderPage(new Page<>(dto.getPageNum(), dto.getPageSize()), schoolIds, dto); + } + + @Override + public void refundOrder(String orderCode) { + EduConsumeOrder order = getOne(new LambdaQueryWrapper<>(new EduConsumeOrder()).eq(EduConsumeOrder::getOrderCode, orderCode)); + // 判断订单能否退款 + Asserts.isTrue(OrderStatusEnum.PAY_SUCCESS.getStatus().equals(order.getOrderStatus()) + && PayStatusEnum.PAY_SUCCESS.getStatus().equals(order.getPayStatus()), "该笔订单无法进行退款"); + // 保存退款信息 + EduConsumeOrderRefund eduConsumeOrderRefund = new EduConsumeOrderRefund(); + eduConsumeOrderRefund.setOrderCode(orderCode); + // 生成退款订单号 + String refundOrderCode = ""; + if (PayWay.WEI_XIN.getValue().equals(order.getPayWay())) { + // 微信 + refundOrderCode = "R" + orderCode; + } else if (PayWay.UNION.getValue().equals(order.getPayWay())) { + // 银联 + // 获取银联商户号相关信息 + UnionPayConfig config = commonService.getUnionPayConfigByDept(order.getDeptId()); + refundOrderCode = UnionPayUtil.getOrderNumber(Objects.nonNull(config.getParentConfig()) + ? config.getParentConfig().getSourceNumber() : config.getSourceNumber()); + } else if (PayWay.U_PAY.getValue().equals(order.getPayWay())) { + // 收钱吧 + refundOrderCode = "R" + orderCode; + } + eduConsumeOrderRefund.setRefundCode(refundOrderCode); + eduConsumeOrderRefund.setRefundSerialNumber(order.getTransactionNumber().replace("P", "R")); + eduConsumeOrderRefundService.save(eduConsumeOrderRefund); + // 修改订单状态 + order.setOrderStatus(OrderStatusEnum.USER_REFUNDING.getStatus()); + updateById(order); + try { + // 调用退款接口 + PayWay payWay = EnumUtils.valueOf(PayWay.class, order.getPayWay(), + PayWay.class.getMethod("getValue")); + switch (Objects.requireNonNull(payWay)) { + // 微信 + case WEI_XIN: + // 查询学校微信支付配置 + EduPayWxConfig config = commonService.getPayWxConfigBySchool(order.getDeptId()); + WxPayUtil.refund(config, eduConsumeOrderRefund.getOrderCode(), + eduConsumeOrderRefund.getRefundReason(), + eduConsumeOrderRefund.getRefundCode(), + NumberUtil.mul(order.getPracticalMoney(), new BigDecimal("100")).longValue(), + NumberUtil.mul(order.getPracticalMoney(), new BigDecimal("100")).longValue(), + apiUrl + CONSUME_WX_REFUND_NOTIFY_URL); + break; + case UNION: + // 查询学校银联云闪付支付配置 + UnionPayConfig unionPayConfig = commonService.getUnionPayConfigByDept(order.getDeptId()); + UnionPayConfig parentConfig = unionPayConfig.getParentConfig(); + UnionPayUtil.refund(unionPayConfig, UnionRefund.builder() + .orderNo(orderCode) + .refundOrderNo(eduConsumeOrderRefund.getRefundCode()) + .transactionNumber(eduConsumeOrderRefund.getRefundSerialNumber()) + .refundAmount(order.getPracticalMoney()) + .build() + , unionPayPublicUtil.getAccessToken( + Objects.nonNull(parentConfig) ? parentConfig.getAppId() : unionPayConfig.getAppId(), + Objects.nonNull(parentConfig) ? parentConfig.getAppKey() : unionPayConfig.getAppKey() + )); + break; + case U_PAY: + DeptConsumeTerminalCache terminalCache = commonService.getDeptConsumeTerminal(order.getDeptId()); + JSONObject jsonObject = UPayUtil.refund(URefund.builder() + .clientSn(orderCode) + .refundRequestNo(refundOrderCode) + .operator(order.getPhone()) + .refundAmount(order.getPracticalMoney()) + .build(), terminalCache.getTerminalSn(), terminalCache.getTerminalKey()); + JSONObject resultJson = jsonObject.getJSONObject("biz_response").getJSONObject("data"); + // 更新订单退款状态 + order.setOrderStatus(OrderStatusEnum.CLOSED.getStatus()); + order.setPayStatus(PayStatusEnum.REFUND_SUCCESS.getStatus()); + order.setIsRefund(RefundStatusEnum.IS_REFUND.getStatus()); + baseMapper.updateById(order); + // 更新退款时间 + EduConsumeOrderRefund eduBillOrderRefund = eduConsumeOrderRefundService.getById(eduConsumeOrderRefund.getId()); + eduBillOrderRefund.setRefundTime(LocalDateTimeUtil.ofUTC(Long.parseLong(resultJson.getStr("finish_time")))); + eduConsumeOrderRefundService.updateById(eduBillOrderRefund); + break; + default: + break; + } + } catch (Exception e) { + log.error("退款失败", e); + throw new FebsException("退款失败"); + } + } +} diff --git a/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/service/impl/EduConsumeOrderStudentServiceImpl.java b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/service/impl/EduConsumeOrderStudentServiceImpl.java new file mode 100644 index 0000000..643aa91 --- /dev/null +++ b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/service/impl/EduConsumeOrderStudentServiceImpl.java @@ -0,0 +1,24 @@ +package com.yida.data.device.consume.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.consume.EduConsumeOrderStudent; +import com.yida.data.device.consume.mapper.EduConsumeOrderStudentMapper; +import com.yida.data.device.consume.service.EduConsumeOrderStudentService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * 消费订单(充值)学生详细信息Service实现 + * + * @author ZYJ + * @date 2023-03-23 14:03:58 + */ +@Service +@RequiredArgsConstructor +@Transactional(rollbackFor = Exception.class) +public class EduConsumeOrderStudentServiceImpl extends ServiceImpl + implements EduConsumeOrderStudentService { + + +} diff --git a/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/service/impl/EduConsumeRecordServiceImpl.java b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/service/impl/EduConsumeRecordServiceImpl.java new file mode 100644 index 0000000..98ad34d --- /dev/null +++ b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/service/impl/EduConsumeRecordServiceImpl.java @@ -0,0 +1,24 @@ +package com.yida.data.device.consume.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.consume.EduConsumeRecord; +import com.yida.data.device.consume.mapper.EduConsumeRecordMapper; +import com.yida.data.device.consume.service.EduConsumeRecordService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * 消费机学生消费记录Service实现 + * + * @author ZYJ + * @date 2023-03-24 16:16:49 + */ +@Service +@RequiredArgsConstructor +@Transactional(rollbackFor = Exception.class) +public class EduConsumeRecordServiceImpl extends ServiceImpl + implements EduConsumeRecordService { + + +} diff --git a/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/service/impl/EduStudentConsumeCardServiceImpl.java b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/service/impl/EduStudentConsumeCardServiceImpl.java new file mode 100644 index 0000000..f044ed6 --- /dev/null +++ b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/service/impl/EduStudentConsumeCardServiceImpl.java @@ -0,0 +1,38 @@ +package com.yida.data.device.consume.service.impl; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.consume.EduStudentConsumeCard; +import com.yida.data.device.consume.mapper.EduStudentConsumeCardMapper; +import com.yida.data.device.consume.service.EduStudentConsumeCardService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.util.Objects; + +/** + * 学生消费机信息管理Service实现 + * + * @author ZYJ + * @date 2023-03-20 15:02:20 + */ +@Slf4j +@Service +@RequiredArgsConstructor +@Transactional(rollbackFor = Exception.class) +public class EduStudentConsumeCardServiceImpl extends ServiceImpl + implements EduStudentConsumeCardService { + + @Override + public void saveConsumeCard(EduStudentConsumeCard eduStudentConsumeCard) { + EduStudentConsumeCard consumeCard = getOne(Wrappers.lambdaQuery(new EduStudentConsumeCard()) + .eq(EduStudentConsumeCard::getStudentId, eduStudentConsumeCard.getStudentId())); + if (Objects.isNull(consumeCard)) { + eduStudentConsumeCard.setBalance(new BigDecimal("0.0")); + save(eduStudentConsumeCard); + } + } +} diff --git a/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/service/impl/H5ConsumeServiceImpl.java b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/service/impl/H5ConsumeServiceImpl.java new file mode 100644 index 0000000..eccf7c3 --- /dev/null +++ b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/consume/service/impl/H5ConsumeServiceImpl.java @@ -0,0 +1,784 @@ +package com.yida.data.device.consume.service.impl; + +import cc.mrbird.febs.common.redis.service.RedisService; +import cn.hutool.core.codec.Base64; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.date.LocalDateTimeUtil; +import cn.hutool.core.lang.Snowflake; +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.crypto.SecureUtil; +import cn.hutool.crypto.asymmetric.Sign; +import cn.hutool.crypto.asymmetric.SignAlgorithm; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.yida.data.common.core.common.ResultMsgType; +import com.yida.data.common.core.common.ResultStatusType; +import com.yida.data.common.core.entity.CurrentUser; +import com.yida.data.common.core.entity.Dict; +import com.yida.data.common.core.entity.apply.EduApplyProductOrder; +import com.yida.data.common.core.entity.constant.CachePrefixConstant; +import com.yida.data.common.core.entity.constant.UPayConstant; +import com.yida.data.common.core.entity.constant.UnionPayConstant; +import com.yida.data.common.core.entity.consume.*; +import com.yida.data.common.core.entity.pay.UPayOrder; +import com.yida.data.common.core.entity.pay.UnionPayOrder; +import com.yida.data.common.core.entity.system.EduDeptPayType; +import com.yida.data.common.core.entity.system.EduPayWxConfig; +import com.yida.data.common.core.entity.system.UnionPayConfig; +import com.yida.data.common.core.entity.user.EduParent; +import com.yida.data.common.core.entity.user.EduStudent; +import com.yida.data.common.core.entity.user.EduStudentApply; +import com.yida.data.common.core.enums.*; +import com.yida.data.common.core.exception.FebsException; +import com.yida.data.common.core.utils.*; +import com.yida.data.common.service.CommonService; +import com.yida.data.device.consume.mapper.EduConsumeOrderMapper; +import com.yida.data.device.consume.mapper.EduConsumeRecordMapper; +import com.yida.data.device.consume.service.EduConsumeOrderService; +import com.yida.data.device.consume.service.EduConsumeOrderStudentService; +import com.yida.data.device.consume.service.EduStudentConsumeCardService; +import com.yida.data.device.consume.service.H5ConsumeService; +import com.yida.data.device.dto.consume.CreateConsumeOrderDTO; +import com.yida.data.device.dto.consume.H5ConsumeOrderPageDTO; +import com.yida.data.device.dto.consume.H5ConsumeRecordPageDTO; +import com.yida.data.device.vo.consume.*; +import com.yida.data.user.feign.RemoteStudentApplyService; +import com.yida.data.user.feign.RemoteStudentService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Objects; +import java.util.concurrent.ExecutorService; +import java.util.stream.Collectors; + +/** + * 消费机前端service + * + * @author ZYJ + * @date 2023/3/16 + */ +@Slf4j +@Service +@RequiredArgsConstructor +@Transactional(rollbackFor = Exception.class) +public class H5ConsumeServiceImpl implements H5ConsumeService { + + private final EduConsumeOrderService eduConsumeOrderService; + private final EduStudentConsumeCardService eduStudentConsumeCardService; + private final EduConsumeOrderStudentService eduConsumeOrderStudentService; + + private final EduConsumeOrderMapper eduConsumeOrderMapper; + private final EduConsumeRecordMapper eduConsumeRecordMapper; + + private final RemoteStudentService remoteStudentService; + private final RemoteStudentApplyService remoteStudentApplyService; + + private final RedisService redisService; + private final CommonService commonService; + private final UnionPayPublicUtil unionPayPublicUtil; + + private static final ExecutorService CONSUME_ORDER_SUCCESS_POOL = ThreadPoolUtil.getThreadPool("consume-order-pool-%d"); + private static final Snowflake ORDER_CODE_GENERATOR = new Snowflake(1, 1); + + private static final String CONSUME_WX_PAY_NOTIFY_URL = "device/in/consume/wxPayNotify"; + private static final String CONSUME_WX_REFUND_NOTIFY_URL = "device/in/consume/wxRefundNotify"; + + private static final String CONSUME_UNION_PAY_NOTIFY_URL = "device/in/consume/unionPayNotify"; + private static final String CONSUME_UNION_PAY_RETURN_URL = ""; + + @Value("${febs.apiUrl}") + private String apiUrl; + + @Value("${febs.pageUrl}") + private String pageUrl; + + @Override + public ConsumeVipVO checkVip(Long studentId, Long schoolId) { + Dict dict = commonService.getDictByTypeAndValueOrLabel("apply_type", null, "食堂消费"); + // 查询是否是会员 + EduStudentApply studentApply = remoteStudentApplyService.getStudentApply(studentId, dict.getValue()).getData(); + ConsumeVipVO consumeVipVO = new ConsumeVipVO(); + if (Objects.isNull(studentApply)) { + consumeVipVO.setVipFlag(false); + } else { + consumeVipVO.setVipFlag(true); + consumeVipVO.setStartTime(studentApply.getStartTime()); + consumeVipVO.setEndTime(studentApply.getEndTime()); + EduStudentConsumeCard consumeCard = eduStudentConsumeCardService.getOne(Wrappers.lambdaQuery(new EduStudentConsumeCard()) + .eq(EduStudentConsumeCard::getStudentId, studentId)); + if (Objects.nonNull(consumeCard)) { + consumeVipVO.setBalance(consumeCard.getBalance()); + consumeVipVO.setCardStatus(consumeCard.getCardStatus()); + EduStudent student = remoteStudentService.getStudentNoPermission(studentId).getData(); + consumeVipVO.setStuCardNum(student.getStuCardNumber()); + } + EduDeptPayType deptPayWay = commonService.getDeptPayWay(schoolId); + if (Objects.nonNull(deptPayWay)) { + consumeVipVO.setPayWay(deptPayWay.getPayWay()); + consumeVipVO.setPayType(deptPayWay.getSupportType()); + } + } + return consumeVipVO; + } + + @Override + public String reportLoss(Long studentId) { + EduStudentConsumeCard consumeCard = eduStudentConsumeCardService.getOne(Wrappers.lambdaQuery(new EduStudentConsumeCard()) + .eq(EduStudentConsumeCard::getStudentId, studentId)); + if (Objects.isNull(consumeCard)) { + throw new FebsException(ResultMsgType.CARD_STATUS_ERROR.getValue()); + } + EduStudent eduStudent = remoteStudentService.getStudentNoPermission(studentId).getData(); + // 获取学校消费机服务器信息 + EduConsumeConfig consumeConfig = commonService.getConsumeConfigByDept(consumeCard.getDeptId()); + // 调用消费机挂失接口 + ConsumeUtil.lockCard(consumeConfig, ConsumeUtil.getPersonInfo(consumeConfig, eduStudent.getStuCardNumber()).getStr("cardID")); + consumeCard.setCardStatus(EduStudentConsumeCard.LOSS_CARD); + eduStudentConsumeCardService.updateById(consumeCard); + return EduStudentConsumeCard.LOSS_CARD.toString(); + } + + @Override + public String unfreeze(Long studentId) { + EduStudentConsumeCard consumeCard = eduStudentConsumeCardService.getOne(Wrappers.lambdaQuery(new EduStudentConsumeCard()) + .eq(EduStudentConsumeCard::getStudentId, studentId)); + if (Objects.isNull(consumeCard)) { + throw new FebsException(ResultMsgType.CARD_STATUS_ERROR.getValue()); + } + EduStudent eduStudent = remoteStudentService.getStudentNoPermission(studentId).getData(); + // 获取学校消费机服务器信息 + EduConsumeConfig consumeConfig = commonService.getConsumeConfigByDept(consumeCard.getDeptId()); + // 调用消费机解挂接口 + ConsumeUtil.unLockCard(consumeConfig, ConsumeUtil.getPersonInfo(consumeConfig, eduStudent.getStuCardNumber()).getStr("cardID")); + consumeCard.setCardStatus(EduStudentConsumeCard.NORMAL_CARD); + eduStudentConsumeCardService.updateById(consumeCard); + return EduStudentConsumeCard.NORMAL_CARD.toString(); + } + + @Override + public ConsumePayInfoVO createConsumeOrder(CreateConsumeOrderDTO dto) { + CurrentUser currentUser = FebsUtil.getCurrentUser(); + // 查询学生信息 + EduStudent student = remoteStudentService.getStudentNoPermission(dto.getStudentId()).getData(); + if (Objects.isNull(student)) { + throw new FebsException("学生信息错误"); + } + if (NumberUtil.isLessOrEqual(dto.getMoney(), BigDecimal.ZERO)) { + throw new FebsException("请输入正确的充值金额"); + } + // 判断是否有下单缓存信息 + ConsumeOrderStudentCacheVO existOrderStudent = (ConsumeOrderStudentCacheVO) redisService.get( + CachePrefixConstant.CONSUME_ORDER_STUDENT + dto.getStudentId().toString()); + if (Objects.nonNull(existOrderStudent)) { + return ConsumePayInfoVO.builder() + .errorCode(ResultStatusType.FAIL.getValue()) + .errorMessage(String.format("%s%s正在支付中, 请耐心等待", + existOrderStudent.getStudentName(), existOrderStudent.getParentType())) + .orderCode(existOrderStudent.getOrderNo()) + .build(); + } + if (StringUtils.isEmpty(dto.getPayWay()) || + PayWay.ALIPAY.getValue().equals(dto.getPayWay())) { + throw new FebsException(ResultMsgType.PAY_TYPE_ERROR.getValue()); + } + // 家长信息 + List parents = student.getParents(); + EduParent orderParent = parents.stream().filter( + x -> currentUser.getMobile().equals(x.getMobile())).collect(Collectors.toList()).get(0); + if (Objects.isNull(orderParent)) { + log.error("家长信息错误, studentId: {}, mobile: {}", dto.getStudentId(), currentUser.getMobile()); + throw new FebsException("学生信息错误"); + } + String orderCode = ""; + try { + // 订单号 需要根据支付方式生成不同的订单号 + String orderNo = ""; + if (PayWay.WEI_XIN.getValue().equals(dto.getPayWay())) { + // 微信 + orderNo = String.valueOf(ORDER_CODE_GENERATOR.nextId()); + } else if (PayWay.UNION.getValue().equals(dto.getPayWay())) { + // 银联 + // 获取银联商户号相关信息 + UnionPayConfig config = commonService.getUnionPayConfigByDept(student.getSchoolId()); + orderNo = UnionPayUtil.getOrderNumber(Objects.nonNull(config.getParentConfig()) + ? config.getParentConfig().getSourceNumber() : config.getSourceNumber()); + } else if (PayWay.U_PAY.getValue().equals(dto.getPayWay())) { + // 收钱吧 + orderNo = String.valueOf(ORDER_CODE_GENERATOR.nextId()); + } + if (StringUtils.isEmpty(orderNo)) { + log.error("生成订单号失败!"); + throw new FebsException(ResultMsgType.ORDER_FAIL.getValue()); + } + orderCode = orderNo; + ConsumeOrderStudentCacheVO consumeOrderStudentCacheVO = ConsumeOrderStudentCacheVO.builder() + .studentId(dto.getStudentId()) + .studentName(student.getStuName()) + .parentId(orderParent.getId()) + .parentType(orderParent.getParentType()) + .mobile(currentUser.getMobile()) + .orderNo(orderNo) + .build(); + // 添加学生消费订单缓存 + redisService.set(CachePrefixConstant.CONSUME_ORDER_STUDENT + dto.getStudentId().toString(), consumeOrderStudentCacheVO, UPayConstant.ORDER_TIME); + return createOrder(dto, student, orderParent, currentUser, orderNo); + } catch (FebsException e) { + // 删除学生消费订单缓存 + redisService.del(CachePrefixConstant.CONSUME_ORDER_STUDENT + dto.getStudentId()); + // 删除消费订单对应缓存 + if (StringUtils.isNotBlank(orderCode)) { + redisService.del(CachePrefixConstant.CONSUME_ORDER + orderCode); + redisService.del(CachePrefixConstant.CONSUME_ORDER_FLAG + orderCode); + } + throw new FebsException(e.getMessage()); + } catch (Exception e) { + // 删除学生消费订单缓存 + redisService.del(CachePrefixConstant.CONSUME_ORDER_STUDENT + dto.getStudentId()); + // 删除消费订单对应缓存 + if (StringUtils.isNotBlank(orderCode)) { + redisService.del(CachePrefixConstant.CONSUME_ORDER + orderCode); + redisService.del(CachePrefixConstant.CONSUME_ORDER_FLAG + orderCode); + } + throw new FebsException(ResultMsgType.ORDER_FAIL.getValue()); + } + } + + /** + * 生成订单并返回支付信息 + * + * @param dto 生成消费订单请求类 + * @param student 学生信息 + * @param orderParent 下单家长 + * @param currentUser 登录用户信息 + * @param orderNo 订单号 + * @return com.yida.data.device.vo.consume.ConsumePayInfoVO + * @author ZYJ + * @date 2023/3/23 15:50 + */ + private ConsumePayInfoVO createOrder(CreateConsumeOrderDTO dto, EduStudent student, + EduParent orderParent, CurrentUser currentUser, String orderNo) { + // 生成消费订单信息 + EduConsumeOrder eduConsumeOrder = new EduConsumeOrder(); + eduConsumeOrder.setOrderCode(orderNo); + // 流水号 + eduConsumeOrder.setTransactionNumber(PayUtil.generateSerialNumber("P", dto.getSchoolId(), "")); + eduConsumeOrder.setStudentId(student.getId()); + eduConsumeOrder.setTotalMoney(dto.getMoney()); + eduConsumeOrder.setPracticalMoney(dto.getMoney()); + eduConsumeOrder.setPhone(currentUser.getMobile()); + // 订单状态和支付状态 + eduConsumeOrder.setOrderStatus(OrderStatusEnum.NOT_PAY.getStatus()); + eduConsumeOrder.setPayStatus(PayStatusEnum.NOT_PAY.getStatus()); + eduConsumeOrder.setPayWay(dto.getPayWay()); + eduConsumeOrder.setPayType(dto.getPayType()); + eduConsumeOrder.setDeptId(student.getSchoolId()); + // 保存订单主体信息 + eduConsumeOrderService.save(eduConsumeOrder); + // 保存学生信息 + EduConsumeOrderStudent eduConsumeOrderStudent = new EduConsumeOrderStudent(); + BeanUtils.copyProperties(student, eduConsumeOrderStudent); + eduConsumeOrderStudent.setId(null); + eduConsumeOrderStudent.setOrderId(eduConsumeOrder.getOrderId()); + eduConsumeOrderStudent.setStudentId(student.getId()); + eduConsumeOrderStudent.setStudentName(student.getStuName()); + eduConsumeOrderStudent.setStudentNumber(student.getStuNumber()); + eduConsumeOrderStudent.setStuCardNumber(student.getStuCardNumber()); + eduConsumeOrderStudent.setStudentFamilyType(student.getFamilyType()); + eduConsumeOrderStudent.setStudentParentType(orderParent.getParentType()); + eduConsumeOrderStudentService.save(eduConsumeOrderStudent); + + // 下单返回信息 + String result = placeOrder(student, eduConsumeOrder, orderParent); + // 添加消费订单缓存 + redisService.set(CachePrefixConstant.CONSUME_ORDER + eduConsumeOrder.getOrderCode(), eduConsumeOrder, UPayConstant.ORDER_TIME); + redisService.set(CachePrefixConstant.CONSUME_ORDER_FLAG + eduConsumeOrder.getOrderCode(), result, UPayConstant.ORDER_TIME); + + return getPayInfo(eduConsumeOrder.getOrderCode(), result, eduConsumeOrder.getDeptId(), true, + dto.getPayWay(), dto.getPayType()); + } + + /** + * 调用第三方接口生成支付信息 + * + * @param student 学生信息 + * @param eduConsumeOrder 订单信息 + * @param orderParent 下单家长 + * @return java.lang.String + * @author ZYJ + * @date 2023/3/23 15:43 + */ + private String placeOrder(EduStudent student, EduConsumeOrder eduConsumeOrder, EduParent orderParent) { + // 下单返回信息 + String result = ""; + try { + if (PayWay.WEI_XIN.getValue().equals(eduConsumeOrder.getPayWay())) { + // 微信支付 + EduPayWxConfig config = commonService.getPayWxConfigBySchool(student.getSchoolId()); + EduApplyProductOrder order = new EduApplyProductOrder(); + order.setProductName(""); + order.setOrderCode(eduConsumeOrder.getOrderCode()); + order.setPraccticalMoney(eduConsumeOrder.getPracticalMoney().doubleValue()); + String ip = FebsUtil.getHttpServletRequestIpAddress(); + // js api下单 + if (WxPayTypeEnum.JS_TYPE.getStatus().equals(eduConsumeOrder.getPayType())) { + result = WxPayUtil.placeOrderJs(config, order, orderParent.getWxPublicOpenId(), ip, + apiUrl + CONSUME_WX_PAY_NOTIFY_URL); + } else { + // h5下单 + result = WxPayUtil.placeOrderH5(config, order, ip, apiUrl + CONSUME_WX_PAY_NOTIFY_URL); + } + } else if (PayWay.UNION.getValue().equals(eduConsumeOrder.getPayWay())) { + // 获取对应支付类型枚举 + UnionPayTypeEnum unionPayTypeEnum = EnumUtils.valueOf(UnionPayTypeEnum.class, eduConsumeOrder.getPayType(), + UnionPayTypeEnum.class.getMethod("getType")); + // 银联云闪付 + result = UnionPayUtil.placeOrder(commonService.getUnionPayConfigByDept(student.getSchoolId()), + UnionPayOrder.builder() + .orderNo(eduConsumeOrder.getOrderCode()) + .transactionNumber(eduConsumeOrder.getTransactionNumber()) + .payMoney(eduConsumeOrder.getPracticalMoney()) + .notifyUrl(apiUrl + CONSUME_UNION_PAY_NOTIFY_URL) + .returnUrl(pageUrl + CONSUME_UNION_PAY_RETURN_URL) + .payTypeEnum(unionPayTypeEnum) + .build()); + } else if (PayWay.U_PAY.getValue().equals(eduConsumeOrder.getPayWay())) { + // 收钱吧 + DeptConsumeTerminalCache terminalCache = commonService.getDeptConsumeTerminal(eduConsumeOrder.getDeptId()); + result = UPayUtil.placeOrder(UPayOrder.builder() + .clientSn(eduConsumeOrder.getOrderCode()) + .totalAmount(eduConsumeOrder.getPracticalMoney()) + .operator(orderParent.getMobile()) + .notifyUrl(apiUrl + UPayConstant.NOTIFY_URL) +// .returnUrl(pageUrl + UPayConstant.RETURN_URL) + .returnUrl("http://zbztest.yd-data.com") + .build(), terminalCache.getTerminalSn(), terminalCache.getTerminalKey()); + } + } catch (Exception e) { + log.error("消费下单失败", e); + throw new FebsException(ResultMsgType.ORDER_FAIL.getValue()); + } + if (StringUtils.isEmpty(result)) { + log.error("消费下单失败, 没有支付信息"); + throw new FebsException(ResultMsgType.ORDER_FAIL.getValue()); + } + return result; + } + + /** + * 获取订单支付信息 + * + * @param orderCode 订单号 + * @param orderFlag 微信js支付prepayId, h5支付跳转地址 + * @param deptId 学校id + * @param needToPay 是否需要跳转支付 + * @param payWay 支付方式 {@link PayWay} + * @param payType 支付类型 + * @return com.yida.data.device.vo.consume.ConsumePayInfoVO + * @author ZYJ + * @date 2023/3/23 15:48 + */ + public ConsumePayInfoVO getPayInfo(String orderCode, String orderFlag, Long deptId, + boolean needToPay, String payWay, Integer payType) { + ConsumePayInfoVO consumePayInfoVO = null; + if (PayWay.WEI_XIN.getValue().equals(payWay)) { + // 微信 + consumePayInfoVO = getWxJsSign(orderCode, orderFlag, deptId, needToPay, payType); + } else if (PayWay.UNION.getValue().equals(payWay)) { + // 银联 + consumePayInfoVO = ConsumePayInfoVO.builder() + .orderCode(orderCode) + .needToPay(needToPay) + .payWay(payWay) + .payType(payType) + .payDomain(UnionPayConstant.URL) + .payUrl(orderFlag) + .build(); + } else if (PayWay.U_PAY.getValue().equals(payWay)) { + // 收钱吧 + consumePayInfoVO = ConsumePayInfoVO.builder() + .orderCode(orderCode) + .needToPay(needToPay) + .payWay(payWay) + .payType(payType) + .payDomain(UPayConstant.URL) + .payUrl(orderFlag) + .build(); + } + return consumePayInfoVO; + } + + /** + * 生成微信支付信息 + * + * @param orderCode 订单号 + * @param orderFlag 微信js支付prepayId, h5支付跳转地址 + * @param deptId 学校id + * @param needToPay 是否需要跳转支付 + * @param wxPayType 微信支付类型 {@link WxPayTypeEnum} + * @return com.yida.data.device.vo.consume.ConsumePayInfoVO + * @author ZYJ + * @date 2023/3/23 15:47 + */ + public ConsumePayInfoVO getWxJsSign(String orderCode, String orderFlag, Long deptId, + boolean needToPay, Integer wxPayType) { + ConsumePayInfoVO infoVO = new ConsumePayInfoVO(); + infoVO.setOrderCode(orderCode); + infoVO.setNeedToPay(needToPay); + infoVO.setPayWay(PayWay.WEI_XIN.getValue()); + infoVO.setPayType(wxPayType); + + // js api类型 + if (Objects.isNull(wxPayType) || WxPayTypeEnum.JS_TYPE.getStatus().equals(wxPayType)) { + EduPayWxConfig config = commonService.getPayWxConfigBySchool(deptId); + String timestamp = String.valueOf(System.currentTimeMillis() / 1000); + String nonceStr = RandomUtil.randomString(32); + String packages = "prepay_id=" + orderFlag; + String code = config.getWxPublicId() + "\n" + timestamp + "\n" + nonceStr + "\n" + packages + "\n"; + Sign sign = SecureUtil.sign(SignAlgorithm.SHA256withRSA, config.getApiCreditPrivateKeyNoHead(), + null); + byte[] res = sign.sign(code.getBytes()); + String signRes = Base64.encode(res); + infoVO.setWxAppId(config.getWxPublicId()); + infoVO.setWxSign(signRes); + infoVO.setWxTimestamp(timestamp); + infoVO.setWxPackage(packages); + infoVO.setWxNonceStr(nonceStr); + } else { + infoVO.setPayUrl(orderFlag); + } + return infoVO; + } + + @Override + public void consumeOrderSuccess(String orderCode) { + CONSUME_ORDER_SUCCESS_POOL.execute(() -> { + EduConsumeOrder order = eduConsumeOrderService.getOne(new LambdaQueryWrapper<>(new EduConsumeOrder()) + .eq(EduConsumeOrder::getOrderCode, orderCode)); + + if (Objects.nonNull(order) + && (OrderStatusEnum.NOT_PAY.getStatus().equals(order.getOrderStatus()) + || OrderStatusEnum.USER_PAYING.getStatus().equals(order.getOrderStatus()))) { + if (PayWay.WEI_XIN.getValue().equals(order.getPayWay())) { + // 微信 + wxConsumeOrderSuccess(order); + } else if (PayWay.UNION.getValue().equals(order.getPayWay())) { + // 银联 + unionConsumeOrderSuccess(order); + } else if (PayWay.U_PAY.getValue().equals(order.getPayWay())) { + // 收钱吧 + uPayConsumeOrderSuccess(order); + } + } + }); + } + + /** + * 处理微信查询订单 + * + * @param order 订单信息 + * @author ZYJ + * @date 2023/3/23 16:48 + */ + private void wxConsumeOrderSuccess(EduConsumeOrder order) { + boolean flag = false; + // 订单号 + String orderCode = order.getOrderCode(); + // 查询学校微信配置信息 + EduPayWxConfig config = commonService.getPayWxConfigBySchool(order.getDeptId()); + while (LocalDateTimeUtil.between(order.getCreateDate(), LocalDateTime.now()).getSeconds() < UPayConstant.ORDER_TIME) { + try { + JSONObject resJson = JSONUtil.parseObj(WxPayUtil.queryOrder(config, orderCode)); + String tradeState = resJson.getStr("trade_state"); + if (WxTradeStateEnum.NOT_PAY.getStatus().equals(tradeState)) { + continue; + } + WxTradeStateEnum wxTradeStateEnum = EnumUtils.valueOf(WxTradeStateEnum.class, tradeState, + WxTradeStateEnum.class.getMethod("getStatus")); + switch (Objects.requireNonNull(wxTradeStateEnum)) { + // 支付成功 + case SUCCESS: + consumeOrderPaySuccess(orderCode, DateUtil.parseLocalDateTime(resJson.getStr("success_time"), "yyyy-MM" + "-dd'T" + "'HH:mm" + ":ssXXX")); + flag = true; + break; + // 作废订单 + case CLOSED: + case REVOKED: + case PAY_ERROR: + order.setOrderStatus(OrderStatusEnum.CLOSED.getStatus()); + order.setPayStatus(PayStatusEnum.CANCEL.getStatus()); + eduConsumeOrderService.updateById(order); + flag = true; + break; + default: + break; + } + if (flag) { + break; + } + Thread.sleep(1000L); + } catch (Exception e) { + log.error("消费订单(微信支付方式)完成失败, orderNo: {}", orderCode, e); + } + } + } + + /** + * 处理银联查询订单 + * + * @param order 订单信息 + * @author ZYJ + * @date 2023/3/23 16:50 + */ + private void unionConsumeOrderSuccess(EduConsumeOrder order) { + boolean flag = false; + // 订单号 + String orderCode = order.getOrderCode(); + // 查询学校银联配置信息 + UnionPayConfig config = commonService.getUnionPayConfigByDept(order.getDeptId()); + // 主商户信息 + UnionPayConfig parentConfig = config.getParentConfig(); + + while (LocalDateTimeUtil.between(order.getCreateDate(), LocalDateTime.now()).getSeconds() < UPayConstant.ORDER_TIME) { + try { + JSONObject resJson = UnionPayUtil.queryOrder(config, + unionPayPublicUtil.getAccessToken( + Objects.nonNull(parentConfig) ? parentConfig.getAppId() : config.getAppId(), + Objects.nonNull(parentConfig) ? parentConfig.getAppKey() : config.getAppKey() + ), orderCode); + // 支付状态 + String status = (String) resJson.get("status"); + if (UnionTradeStateEnum.NEW_ORDER.getStatus().equals(status) + || UnionTradeStateEnum.UNKNOWN.getStatus().equals(status) + || UnionTradeStateEnum.WAIT_BUYER_PAY.getStatus().equals(status)) { + return; + } + UnionTradeStateEnum tradeStateEnum = EnumUtils.valueOf(UnionTradeStateEnum.class, status, + UnionTradeStateEnum.class.getMethod("getStatus")); + switch (Objects.requireNonNull(tradeStateEnum)) { + // 支付成功 + case TRADE_SUCCESS: + consumeOrderPaySuccess(order.getOrderCode(), + LocalDateTimeUtil.parse((String) resJson.get("payTime"), DatePattern.NORM_DATETIME_PATTERN)); + flag = true; + break; + // 订单关闭 + case TRADE_CLOSED: + order.setOrderStatus(OrderStatusEnum.CLOSED.getStatus()); + order.setPayStatus(PayStatusEnum.CANCEL.getStatus()); + eduConsumeOrderService.updateById(order); + flag = true; + break; + default: + break; + } + if (flag) { + break; + } + Thread.sleep(1000L); + } catch (Exception e) { + log.error("消费订单(云闪付支付方式)完成失败, orderNo: {}", orderCode, e); + } + } + } + + /** + * 处理收钱吧查询订单 + * + * @param order 订单信息 + * @author ZYJ + * @date 2023/3/23 17:29 + */ + private void uPayConsumeOrderSuccess(EduConsumeOrder order) { + boolean flag = false; + // 订单号 + String orderCode = order.getOrderCode(); + + while (LocalDateTimeUtil.between(order.getCreateDate(), LocalDateTime.now()).getSeconds() < UPayConstant.ORDER_TIME) { + try { + DeptConsumeTerminalCache terminalCache = commonService.getDeptConsumeTerminal(order.getDeptId()); + JSONObject jsonObject = UPayUtil.queryOrder(orderCode, terminalCache.getTerminalSn(), terminalCache.getTerminalKey()); + JSONObject resJson = jsonObject.getJSONObject("biz_response").getJSONObject("data"); + // 支付状态 + String status = (String) resJson.get("order_status"); + if (UPayTradeStateEnum.CREATED.getStatus().equals(status) + || UPayTradeStateEnum.INVALID_STATUS_CODE.getStatus().equals(status)) { + return; + } + UPayTradeStateEnum tradeStateEnum = EnumUtils.valueOf(UPayTradeStateEnum.class, status, + UnionTradeStateEnum.class.getMethod("getStatus")); + switch (Objects.requireNonNull(tradeStateEnum)) { + // 支付成功 + case PAID: + consumeOrderPaySuccess(order.getOrderCode(), LocalDateTimeUtil.ofUTC(Long.parseLong(resJson.getStr("finish_time")))); + flag = true; + break; + // 订单关闭 + case PAY_CANCELED: + order.setOrderStatus(OrderStatusEnum.CLOSED.getStatus()); + order.setPayStatus(PayStatusEnum.CANCEL.getStatus()); + eduConsumeOrderService.updateById(order); + flag = true; + break; + default: + break; + } + if (flag) { + break; + } + Thread.sleep(1000L); + } catch (Exception e) { + log.error("消费订单(收钱吧支付方式)完成失败, orderNo: {}", orderCode, e); + } + } + } + + /** + * 消费订单支付成功 + * + * @param orderCode 订单号 + * @param payDate 支付时间 + * @author ZYJ + * @date 2023/3/23 17:06 + */ + @Override + public void consumeOrderPaySuccess(String orderCode, LocalDateTime payDate) { + EduConsumeOrder order = eduConsumeOrderService.getOne(new LambdaQueryWrapper<>(new EduConsumeOrder()) + .eq(EduConsumeOrder::getOrderCode, orderCode)); + order.setPayDate(payDate); + order.setOrderStatus(OrderStatusEnum.PAY_SUCCESS.getStatus()); + order.setPayStatus(PayStatusEnum.PAY_SUCCESS.getStatus()); + eduConsumeOrderService.updateById(order); + // 获取学校消费机服务器信息 + EduConsumeConfig consumeConfig = commonService.getConsumeConfigByDept(order.getDeptId()); + EduStudent student = remoteStudentService.getStudentNoPermission(order.getStudentId()).getData(); + // 调用消费机接口 + ConsumeUtil.recharge(consumeConfig, Recharge.builder() + .amount(order.getPracticalMoney().toString()) + .accountNo(student.getStuCardNumber()) + .increase(true) + .walletType(1) + .transactionNumber(order.getTransactionNumber()) + .paymentModel(Recharge.PaymentModel.builder() + // 支付方式. 0:现金 1:微信 2:支付宝 4:银行卡 8:其他APP + .payType(1) + .payTime(LocalDateTimeUtil.format(payDate, DatePattern.NORM_DATETIME_PATTERN)) + .orderNumber(orderCode) + .build()) + .build()); + // 处理对应消费机信息金额 + EduStudentConsumeCard consumeCard = eduStudentConsumeCardService.getOne(Wrappers.lambdaQuery(new EduStudentConsumeCard()) + .eq(EduStudentConsumeCard::getStudentId, order.getStudentId())); + if (Objects.nonNull(consumeCard)) { + consumeCard.setBalance(NumberUtil.add(consumeCard.getBalance(), order.getPracticalMoney())); + eduStudentConsumeCardService.updateById(consumeCard); + } + // 删除学生消费订单缓存 + redisService.del(CachePrefixConstant.CONSUME_ORDER_STUDENT + order.getStudentId().toString()); + // 删除消费订单对应缓存 + redisService.del(CachePrefixConstant.CONSUME_ORDER + orderCode); + redisService.del(CachePrefixConstant.CONSUME_ORDER_FLAG + orderCode); + } + + @Override + public IPage listH5ConsumeOrderPage(H5ConsumeOrderPageDTO dto) { + return eduConsumeOrderMapper.listH5ConsumeOrderPage(dto.toPage(), dto); + } + + @Override + public H5ConsumeOrderPageVO getH5ConsumeOrderInfo(Long orderId, String orderCode) { + return eduConsumeOrderMapper.getH5ConsumeOrderInfo(orderId, orderCode); + } + + @Override + public ConsumePayInfoVO continuePayOrder(String orderCode, Long deptId) { + EduConsumeOrder order = eduConsumeOrderService.getOne(new LambdaQueryWrapper<>(new EduConsumeOrder()) + .eq(EduConsumeOrder::getOrderCode, orderCode)); + if (Objects.isNull(order) || OrderStatusEnum.CLOSED.getStatus().equals(order.getOrderStatus())) { + throw new FebsException(ResultMsgType.ORDER_INVALID.getValue()); + } + // 判断当前订单能否被当前用户支付 + ConsumeOrderStudentCacheVO existConsumeOrderStudent = (ConsumeOrderStudentCacheVO) redisService.get( + CachePrefixConstant.CONSUME_ORDER_STUDENT + order.getStudentId().toString()); + if (Objects.nonNull(existConsumeOrderStudent) + && !FebsUtil.getCurrentUser().getMobile().equals(existConsumeOrderStudent.getMobile())) { + throw new FebsException(String.format("%s%s正在支付中, 请耐心等待", + existConsumeOrderStudent.getStudentName(), + existConsumeOrderStudent.getParentType())); + } + // 获取对应待支付信息缓存 + Object orderFlag = redisService.get(CachePrefixConstant.CONSUME_ORDER_FLAG + orderCode); + if (Objects.isNull(orderFlag)) { + throw new FebsException("当前订单已失效!"); + } + return getPayInfo(orderCode, orderFlag.toString(), deptId, + true, order.getPayWay(), order.getPayType()); + } + + @Override + public void cancelOrder(String orderCode) { + // TODO 2023/3/31 需要做状态判断能否取消订单 + EduConsumeOrder order = eduConsumeOrderService.getOne(new LambdaQueryWrapper<>(new EduConsumeOrder()) + .eq(EduConsumeOrder::getOrderCode, orderCode)); + if (OrderStatusEnum.CLOSED.getStatus().equals(order.getOrderStatus())) { + throw new FebsException(ResultMsgType.ORDER_INVALID.getValue()); + } + // 判断当前订单能否被当前用户取消 + ConsumeOrderStudentCacheVO existConsumeOrderStudent = (ConsumeOrderStudentCacheVO) redisService.get( + CachePrefixConstant.CONSUME_ORDER_STUDENT + order.getStudentId().toString()); + if (Objects.nonNull(existConsumeOrderStudent) + && !FebsUtil.getCurrentUser().getMobile().equals(existConsumeOrderStudent.getMobile())) { + throw new FebsException(String.format("%s%s正在支付中, 请耐心等待", + existConsumeOrderStudent.getStudentName(), existConsumeOrderStudent.getParentType())); + } + order.setOrderStatus(OrderStatusEnum.CLOSED.getStatus()); + order.setPayStatus(PayStatusEnum.CANCEL.getStatus()); + eduConsumeOrderService.updateById(order); + try { + // 判断支付方式 + if (PayWay.WEI_XIN.getValue().equals(order.getPayWay())) { + // 关闭微信订单 + WxPayUtil.closeOrder(commonService.getPayWxConfigBySchool(order.getDeptId()), order.getOrderCode()); + } else if (PayWay.UNION.getValue().equals(order.getPayWay()) + && !UnionPayTypeEnum.UNION_H5_TYPE.getType().equals(order.getPayType())) { + // 关闭银联订单 (银联云闪付不支付关闭订单) + UnionPayConfig unionPayConfig = commonService.getUnionPayConfigByDept(order.getDeptId()); + UnionPayConfig parentConfig = unionPayConfig.getParentConfig(); + UnionPayUtil.closeOrder(unionPayConfig, + unionPayPublicUtil.getAccessToken( + Objects.nonNull(parentConfig) ? parentConfig.getAppId() : unionPayConfig.getAppId(), + Objects.nonNull(parentConfig) ? parentConfig.getAppKey() : unionPayConfig.getAppKey() + ), order.getOrderCode()); + } else if (PayWay.U_PAY.getValue().equals(order.getPayWay())) { + // 关闭收钱吧订单 + DeptConsumeTerminalCache terminalCache = commonService.getDeptConsumeTerminal(order.getDeptId()); + UPayUtil.closeOrder(orderCode, terminalCache.getTerminalSn(), terminalCache.getTerminalKey()); + } + } catch (Exception e) { + log.error("关闭订单失败, order: {}", order, e); + throw new FebsException("取消订单失败"); + } + // 删除学生消费订单缓存 + redisService.del(CachePrefixConstant.CONSUME_ORDER_STUDENT + order.getStudentId().toString()); + // 删除消费订单对应缓存 + redisService.del(CachePrefixConstant.CONSUME_ORDER + orderCode); + redisService.del(CachePrefixConstant.CONSUME_ORDER_FLAG + orderCode); + } + + @Override + public IPage listH5ConsumeRecordPage(H5ConsumeRecordPageDTO dto) { + return eduConsumeRecordMapper.listH5ConsumeRecordPage(dto.toPage(), dto); + } +} diff --git a/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/studentCard/config/CardRabbitReceiver.java b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/studentCard/config/CardRabbitReceiver.java index 6a0f6c3..e5623f5 100644 --- a/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/studentCard/config/CardRabbitReceiver.java +++ b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/studentCard/config/CardRabbitReceiver.java @@ -119,7 +119,7 @@ public class CardRabbitReceiver { redisService.hset(CachePrefixConstant.STUDENT_DATA, card.getStudentId().toString(), student); } EduApp app = commonService - .getAppByCodeAndSchool(AppConstant.ELECTRONIC_PARENT, null, card.getSchoolId()); + .getAppByCodeAndSchool(AppConstant.INDEX_PARENT, null, card.getSchoolId()); String accessToken = wxUtil.getAccessToken(app.getWxCorpId(), app.getWxSecret()); TextSchoolNotice notice = new TextSchoolNotice(); notice.setAgentid(app.getWxAgentId()); diff --git a/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/studentCard/controller/EduStudentCardController.java b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/studentCard/controller/EduStudentCardController.java index 55b5efe..d4137f7 100644 --- a/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/studentCard/controller/EduStudentCardController.java +++ b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/studentCard/controller/EduStudentCardController.java @@ -2,7 +2,6 @@ package com.yida.data.device.studentCard.controller; import cc.mrbird.febs.common.redis.service.RedisService; import com.baomidou.mybatisplus.core.metadata.IPage; -import com.yida.data.common.core.annotation.ControllerLog; import com.yida.data.common.core.common.ModuleName; import com.yida.data.common.core.common.ResultBean; import com.yida.data.common.core.entity.CurrentUser; @@ -21,12 +20,12 @@ import com.yida.data.device.dto.studentCard.CardWithAddressDTO; import com.yida.data.device.dto.studentCard.DisturbStatusDTO; import com.yida.data.device.studentCard.service.EduStudentCardDisturbTimeService; import com.yida.data.device.studentCard.service.EduStudentCardService; +import com.yida.data.device.vo.OnlineCountVO; import com.yida.data.device.vo.studentCard.CardInfoVO; import com.yida.data.device.vo.studentCard.CardPageVO; import com.yida.data.device.vo.studentCard.CardWithAddressVO; import com.yida.data.device.vo.studentCard.ListStudentCardVO; import com.yida.data.device.vo.studentCard.LocationVO; -import com.yida.data.device.vo.OnlineCountVO; import com.yida.data.device.vo.studentCard.TrackVO; import com.yida.data.log.annotation.OperationLog; import com.yida.data.system.feign.RemoteDeptService; @@ -83,6 +82,7 @@ public class EduStudentCardController { @ApiOperation("更新学生证") @PostMapping("/updateCard") + @OperationLog(module = ModuleName.ELECTRONIC_STUDENT_CARD, methods = "更新学生证", type = OperationLogTypeEnum.UPDATE) public ResultBean updateCard(@RequestBody EduStudentCard card) { eduStudentCardService.updateCard(card); return ResultBean.buildSuccess(); @@ -154,9 +154,7 @@ public class EduStudentCardController { @ApiOperation("家长对应学生列表") @GetMapping("/listStudentCard") - @ControllerLog(operation = "家长对应学生列表") public ResultBean> listStudentCard(@ApiParam("家长id") @RequestParam Long parentId) { - return ResultBean.buildSuccess(eduStudentCardService.listStudentCard(parentId)); } @@ -182,7 +180,7 @@ public class EduStudentCardController { @ApiOperation("批量免打扰") @PostMapping("/setDisturbStatus") - @ControllerLog(operation = "批量免打扰") + @OperationLog(module = ModuleName.ELECTRONIC_STUDENT_CARD, methods = "批量免打扰", type = OperationLogTypeEnum.UPDATE) public ResultBean setDisturbStatus(@RequestBody DisturbStatusDTO disturbStatusDTO) { eduStudentCardService.setDisturbStatus(disturbStatusDTO); return ResultBean.buildSuccess(); @@ -213,6 +211,7 @@ public class EduStudentCardController { @ApiOperation("下发监听指令") @GetMapping("/issueMonitor") + @OperationLog(module = ModuleName.ELECTRONIC_STUDENT_CARD, methods = "下发监听指令", type = OperationLogTypeEnum.SELECT) public ResultBean issueMonitor(@ApiParam("接收监听手机号") String mobile, @ApiParam("学生证imei号") String imei) { eduStudentCardService.issueMonitor(mobile, imei); diff --git a/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/studentCard/controller/EduStudentCardPhoneController.java b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/studentCard/controller/EduStudentCardPhoneController.java index 0adce56..ebe9266 100644 --- a/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/studentCard/controller/EduStudentCardPhoneController.java +++ b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/studentCard/controller/EduStudentCardPhoneController.java @@ -2,9 +2,12 @@ package com.yida.data.device.studentCard.controller; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.yida.data.common.core.annotation.ControllerLog; +import com.yida.data.common.core.common.ModuleName; import com.yida.data.common.core.common.ResultBean; import com.yida.data.common.core.entity.card.EduStudentCardPhone; +import com.yida.data.common.core.entity.system.enums.OperationLogTypeEnum; import com.yida.data.device.studentCard.service.EduStudentCardPhoneService; +import com.yida.data.log.annotation.OperationLog; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; @@ -39,7 +42,6 @@ public class EduStudentCardPhoneController { @ApiOperation("查询学生证电话") @GetMapping("/getFamilyPhone") - @ControllerLog(operation = "查询亲情电话") public ResultBean getFamilyPhone(@ApiParam("iMei号") @RequestParam String imei, @ApiParam("1是亲情电话,2是sos电话,3是通话白名单") @RequestParam Integer type) { List list = eduStudentCardPhoneService.list(Wrappers.lambdaQuery(new EduStudentCardPhone()) @@ -50,7 +52,7 @@ public class EduStudentCardPhoneController { @ApiOperation("保存电话") @PostMapping("/savePhone") - @ControllerLog(operation = "保存电话") + @OperationLog(module = ModuleName.TELEPHONE, methods = "保存电话", type = OperationLogTypeEnum.SAVE) public ResultBean savePhone(@RequestBody EduStudentCardPhone phone) { eduStudentCardPhoneService.savePhone(phone); return ResultBean.buildSuccess(); @@ -59,7 +61,7 @@ public class EduStudentCardPhoneController { @ApiOperation("通用删除电话") @GetMapping("/delPhone") - @ControllerLog(operation = "通用删除电话") + @OperationLog(module = ModuleName.TELEPHONE, methods = "通用删除电话", type = OperationLogTypeEnum.DELETE) public ResultBean delPhone(@RequestParam Long id) { eduStudentCardPhoneService.delPhone(id); return ResultBean.buildSuccess(); @@ -67,7 +69,7 @@ public class EduStudentCardPhoneController { @ApiOperation("批量修改电话") @PostMapping("/updateFamilyPhoneBatch") - @ControllerLog(operation = "修改电话") + @OperationLog(module = ModuleName.TELEPHONE, methods = "批量修改电话", type = OperationLogTypeEnum.UPDATE) public ResultBean updateFamilyPhoneBatch(@RequestBody List phones, @ApiParam("1-亲情电话,2-sos,3-白名单") Integer type, String imei) { eduStudentCardPhoneService.updatePhoneBatch(phones, type, imei); diff --git a/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/studentCard/service/impl/EduStudentCardAlarmServiceImpl.java b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/studentCard/service/impl/EduStudentCardAlarmServiceImpl.java index b7303f9..da297b9 100644 --- a/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/studentCard/service/impl/EduStudentCardAlarmServiceImpl.java +++ b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/studentCard/service/impl/EduStudentCardAlarmServiceImpl.java @@ -158,7 +158,7 @@ public class EduStudentCardAlarmServiceImpl extends ServiceImpl } private void pushSchoolNotice(EduStudent student, EduStudentCardAlarm alarm, Dept school) { - EduApp app = commonService.getAppByCodeAndSchool(AppConstant.ELECTRONIC_PARENT, null, school.getDeptId()); + EduApp app = commonService.getAppByCodeAndSchool(AppConstant.INDEX_PARENT, null, school.getDeptId()); TextSchoolNotice notice = new TextSchoolNotice(); notice.setAgentid(app.getWxAgentId()); notice.setTo_student_userid(Collections.singletonList(student.getWxId())); diff --git a/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/telephone/controller/EduTelephoneController.java b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/telephone/controller/EduTelephoneController.java index fe46745..34c5273 100644 --- a/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/telephone/controller/EduTelephoneController.java +++ b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/telephone/controller/EduTelephoneController.java @@ -2,9 +2,11 @@ package com.yida.data.device.telephone.controller; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.yida.data.common.core.annotation.ControllerLog; +import com.yida.data.common.core.common.ModuleName; import com.yida.data.common.core.common.ResultBean; import com.yida.data.common.core.entity.CurrentUser; import com.yida.data.common.core.entity.system.Dept; +import com.yida.data.common.core.entity.system.enums.OperationLogTypeEnum; import com.yida.data.common.core.entity.telephone.EduTelephone; import com.yida.data.common.core.entity.telephone.EduTelephoneBlack; import com.yida.data.common.core.entity.telephone.EduTelephoneCard; @@ -19,6 +21,7 @@ import com.yida.data.device.telephone.service.EduTelephoneService; import com.yida.data.device.vo.OnlineCountVO; import com.yida.data.device.vo.telephone.DeviceNumberVO; import com.yida.data.device.vo.telephone.TelephoneVO; +import com.yida.data.log.annotation.OperationLog; import com.yida.data.system.feign.RemoteDeptService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -84,13 +87,13 @@ public class EduTelephoneController { */ @ApiOperation("话机设备数量统计") @GetMapping("/findDeviceNumber") - @ControllerLog(operation = "话机设备数量统计") public ResultBean findDeviceNumber() throws NoSuchMethodException { return eduTelephoneService.findDeviceNumber(); } @ApiOperation("修改或新增") @PostMapping("/insertTelephone") + @OperationLog(module = ModuleName.TELEPHONE, methods = "修改或新增亲情电话", type = OperationLogTypeEnum.SAVE) public ResultBean insertTelephone(@RequestBody EduTelephone eduTelephone) { eduTelephoneService.saveOrUpdate(eduTelephone); return ResultBean.buildSuccess(); @@ -98,6 +101,7 @@ public class EduTelephoneController { @ApiOperation("批量设置") @PostMapping("/updateTelephone") + @OperationLog(module = ModuleName.TELEPHONE, methods = "批量设置亲情电话", type = OperationLogTypeEnum.UPDATE) public ResultBean updateTelephone(@RequestBody TelephoneDTO telephoneDTO) { eduTelephoneService.updateTelephone(telephoneDTO); return ResultBean.buildSuccess(); @@ -112,6 +116,7 @@ public class EduTelephoneController { @ApiOperation("重置本月通话时间") @GetMapping("/delTelephoneTime") + @OperationLog(module = ModuleName.TELEPHONE, methods = "重置本月通话时间", type = OperationLogTypeEnum.UPDATE) public ResultBean delTelephoneTime(@ApiParam("话机Id") @RequestParam Long id) { EduTelephone eduTelephone = new EduTelephone(); eduTelephone.setId(id); @@ -122,6 +127,7 @@ public class EduTelephoneController { @ApiOperation("停运") @GetMapping("/stopTelephone") + @OperationLog(module = ModuleName.TELEPHONE, methods = "停运亲情电话", type = OperationLogTypeEnum.UPDATE) public ResultBean stopTelephone(@ApiParam("话机Id") @RequestParam Long id, @ApiParam("1停运,0正常") @RequestParam Integer status) { @@ -133,6 +139,7 @@ public class EduTelephoneController { @ApiOperation("删除和批量删除") @PostMapping("/delTelephone") + @OperationLog(module = ModuleName.TELEPHONE, methods = "删除和批量删除亲情电话", type = OperationLogTypeEnum.DELETE) public ResultBean delTelephone(@ApiParam("ids") @RequestBody List ids) { eduTelephoneService.removeByIds(ids); for (Long id : ids) { @@ -146,6 +153,7 @@ public class EduTelephoneController { @ApiOperation("批量停运") @PostMapping("/listStopTelephone") + @OperationLog(module = ModuleName.TELEPHONE, methods = "批量停运亲情电话", type = OperationLogTypeEnum.UPDATE) public ResultBean listStopTelephone(@ApiParam("话机Id") @RequestBody PhoneStatusDTO phoneStatusDTO) { List ids = phoneStatusDTO.getIds(); diff --git a/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/telephone/controller/EduTelephoneOrderController.java b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/telephone/controller/EduTelephoneOrderController.java index ab1857b..3dffe05 100644 --- a/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/telephone/controller/EduTelephoneOrderController.java +++ b/febs-server/edu-device/edu-device-biz/src/main/java/com/yida/data/device/telephone/controller/EduTelephoneOrderController.java @@ -4,14 +4,17 @@ import cc.mrbird.febs.common.redis.service.RedisService; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.yida.data.common.core.annotation.ControllerLog; +import com.yida.data.common.core.common.ModuleName; import com.yida.data.common.core.common.ResultBean; import com.yida.data.common.core.entity.constant.CachePrefixConstant; +import com.yida.data.common.core.entity.system.enums.OperationLogTypeEnum; import com.yida.data.common.core.entity.telephone.EduTelephoneOrder; import com.yida.data.common.core.utils.FebsUtil; import com.yida.data.device.dto.telephone.OrderPageDTO; import com.yida.data.device.telephone.service.EduTelephoneOrderService; import com.yida.data.device.vo.telephone.OrderInfoVO; import com.yida.data.device.vo.telephone.OrderPageVO; +import com.yida.data.log.annotation.OperationLog; import com.yida.data.school.vo.transcation.PayInfoVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -65,17 +68,17 @@ public class EduTelephoneOrderController { @GetMapping("/listOrder") public ResultBean> listOrder(@ApiParam("卡id") @RequestParam Long cardId) { return ResultBean.buildSuccess(eduTelephoneOrderService.list(Wrappers.lambdaQuery(new EduTelephoneOrder()) - .eq(EduTelephoneOrder::getCardId, cardId).orderByDesc(EduTelephoneOrder::getCreateDate))); + .eq(EduTelephoneOrder::getCardId, cardId).orderByDesc(EduTelephoneOrder::getCreateDate))); } @ApiOperation("生成订单") @GetMapping("/createOrder") - @ControllerLog(operation = "生成订单") + @OperationLog(module = ModuleName.TELEPHONE, methods = "生成订单", type = OperationLogTypeEnum.INSERT) public ResultBean insertEduProductOrder(@ApiParam("充值金额") Double money, - @ApiParam("ic卡id") Long icCardId, - @ApiParam("支付方式,0-微信jsapi,1-微信h5") Integer payType) { + @ApiParam("ic卡id") Long icCardId, + @ApiParam("支付方式,0-微信jsapi,1-微信h5") Integer payType) { return ResultBean.buildSuccess(eduTelephoneOrderService.createOrder(money, icCardId, payType, FebsUtil.getCurrentUser(), - FebsUtil.getHttpServletRequestIpAddress())); + FebsUtil.getHttpServletRequestIpAddress())); } @ApiOperation("订单完成(前台支付完成后调用)") @@ -87,6 +90,7 @@ public class EduTelephoneOrderController { @ApiOperation("发起支付") @GetMapping("/payOrder") + @OperationLog(module = ModuleName.TELEPHONE, methods = "发起支付", type = OperationLogTypeEnum.INSERT) public ResultBean payOrder(String orderCode) { Object prepay = redisService.get(CachePrefixConstant.ORDER_FLAG + orderCode); PayInfoVO infoVO = eduTelephoneOrderService.getWxJsSign(orderCode, prepay.toString()); diff --git a/febs-server/edu-device/edu-device-biz/src/main/resources/mapper/consume/EduConsumeDeviceMapper.xml b/febs-server/edu-device/edu-device-biz/src/main/resources/mapper/consume/EduConsumeDeviceMapper.xml new file mode 100644 index 0000000..0a15113 --- /dev/null +++ b/febs-server/edu-device/edu-device-biz/src/main/resources/mapper/consume/EduConsumeDeviceMapper.xml @@ -0,0 +1,26 @@ + + + + + + + diff --git a/febs-server/edu-device/edu-device-biz/src/main/resources/mapper/consume/EduConsumeOrderMapper.xml b/febs-server/edu-device/edu-device-biz/src/main/resources/mapper/consume/EduConsumeOrderMapper.xml new file mode 100644 index 0000000..d7a70c9 --- /dev/null +++ b/febs-server/edu-device/edu-device-biz/src/main/resources/mapper/consume/EduConsumeOrderMapper.xml @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/febs-server/edu-device/edu-device-biz/src/main/resources/mapper/consume/EduConsumeOrderRefundMapper.xml b/febs-server/edu-device/edu-device-biz/src/main/resources/mapper/consume/EduConsumeOrderRefundMapper.xml new file mode 100644 index 0000000..3d63d71 --- /dev/null +++ b/febs-server/edu-device/edu-device-biz/src/main/resources/mapper/consume/EduConsumeOrderRefundMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/febs-server/edu-device/edu-device-biz/src/main/resources/mapper/consume/EduConsumeOrderStudentMapper.xml b/febs-server/edu-device/edu-device-biz/src/main/resources/mapper/consume/EduConsumeOrderStudentMapper.xml new file mode 100644 index 0000000..f5a606f --- /dev/null +++ b/febs-server/edu-device/edu-device-biz/src/main/resources/mapper/consume/EduConsumeOrderStudentMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/febs-server/edu-device/edu-device-biz/src/main/resources/mapper/consume/EduConsumeRecordMapper.xml b/febs-server/edu-device/edu-device-biz/src/main/resources/mapper/consume/EduConsumeRecordMapper.xml new file mode 100644 index 0000000..e5e2cf1 --- /dev/null +++ b/febs-server/edu-device/edu-device-biz/src/main/resources/mapper/consume/EduConsumeRecordMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + diff --git a/febs-server/edu-device/edu-device-biz/src/main/resources/mapper/consume/EduStudentConsumeCardMapper.xml b/febs-server/edu-device/edu-device-biz/src/main/resources/mapper/consume/EduStudentConsumeCardMapper.xml new file mode 100644 index 0000000..90077ca --- /dev/null +++ b/febs-server/edu-device/edu-device-biz/src/main/resources/mapper/consume/EduStudentConsumeCardMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/febs-server/edu-mall/edu-mall-api/src/main/java/com/yida/data/mall/vo/h5/BillOrderStudentCacheVO.java b/febs-server/edu-mall/edu-mall-api/src/main/java/com/yida/data/mall/vo/h5/BillOrderStudentCacheVO.java index 3350358..7102259 100644 --- a/febs-server/edu-mall/edu-mall-api/src/main/java/com/yida/data/mall/vo/h5/BillOrderStudentCacheVO.java +++ b/febs-server/edu-mall/edu-mall-api/src/main/java/com/yida/data/mall/vo/h5/BillOrderStudentCacheVO.java @@ -42,6 +42,6 @@ public class BillOrderStudentCacheVO implements Serializable { @ApiModelProperty("家长手机号码") private String mobile; - @ApiModelProperty("'订单号'") + @ApiModelProperty("订单号") private String orderNo; } \ No newline at end of file diff --git a/febs-server/edu-mall/edu-mall-biz/src/main/java/com/yida/data/mall/controller/EduBillController.java b/febs-server/edu-mall/edu-mall-biz/src/main/java/com/yida/data/mall/controller/EduBillController.java index 75073ef..15563e2 100644 --- a/febs-server/edu-mall/edu-mall-biz/src/main/java/com/yida/data/mall/controller/EduBillController.java +++ b/febs-server/edu-mall/edu-mall-biz/src/main/java/com/yida/data/mall/controller/EduBillController.java @@ -123,15 +123,6 @@ public class EduBillController { return ResultBean.buildSuccess(eduBillStudentService.exportBillPayData(billStudentSelectPageDTO, response)); } - @GetMapping(value = "sendBillNotice") - @ApiOperation(value = "账单催缴") - public ResultBean sendBillNotice( - @ApiParam(value = "账单id", required = true) @RequestParam Long billId, - @ApiParam(value = "推送标题", required = true) @RequestParam String noticeTitle) { - eduBillStudentService.sendBillNotice(billId, noticeTitle); - return ResultBean.buildSuccess(); - } - @PostMapping(value = "listBillOrderPage") @ApiOperation(value = "查询账单订单列表数据") public ResultBean> listBillOrderPage(BillOrderSelectPageDTO dto) { diff --git a/febs-server/edu-mall/edu-mall-biz/src/main/java/com/yida/data/mall/mapper/EduBillOrderItemMapper.java b/febs-server/edu-mall/edu-mall-biz/src/main/java/com/yida/data/mall/mapper/EduBillOrderItemMapper.java index 015164b..c55ef76 100644 --- a/febs-server/edu-mall/edu-mall-biz/src/main/java/com/yida/data/mall/mapper/EduBillOrderItemMapper.java +++ b/febs-server/edu-mall/edu-mall-biz/src/main/java/com/yida/data/mall/mapper/EduBillOrderItemMapper.java @@ -53,19 +53,4 @@ public interface EduBillOrderItemMapper extends BaseMapper { */ List listItemPayInfo(@Param("billId") Long billId, @Param("studentId") Long studentId); - - - /** - * 查询学生是否有对应账单项目的缴费信息 - * - * @param billId 账单id - * @param studentId 学生id - * @param itemId 项目id - * @return int - * @author ZYJ - * @date 2023/9/19 14:58 - */ - int countItemPayInfo(@Param("billId") Long billId, - @Param("studentId") Long studentId, - @Param("itemId") Long itemId); } diff --git a/febs-server/edu-mall/edu-mall-biz/src/main/java/com/yida/data/mall/mapper/EduBillOrderMapper.java b/febs-server/edu-mall/edu-mall-biz/src/main/java/com/yida/data/mall/mapper/EduBillOrderMapper.java index bfe58af..3d93a06 100644 --- a/febs-server/edu-mall/edu-mall-biz/src/main/java/com/yida/data/mall/mapper/EduBillOrderMapper.java +++ b/febs-server/edu-mall/edu-mall-biz/src/main/java/com/yida/data/mall/mapper/EduBillOrderMapper.java @@ -62,14 +62,12 @@ public interface EduBillOrderMapper extends BaseMapper { * 查询账单缴费人数 * 缴费金额大于0 * - * @param billId 账单id - * @param studentIds 学生id集合 + * @param billId 账单id * @return java.lang.Long * @author ZYJ * @date 2022/4/18 16:30 */ - Long sumPayStudentNumber(@Param("billId") Long billId, - @Param("studentIds") List studentIds); + Long sumPayStudentNumber(@Param("billId") Long billId); /** * 查询所有已经超时订单 diff --git a/febs-server/edu-mall/edu-mall-biz/src/main/java/com/yida/data/mall/service/EduBillOrderItemService.java b/febs-server/edu-mall/edu-mall-biz/src/main/java/com/yida/data/mall/service/EduBillOrderItemService.java index 7400e8d..6ebff3e 100644 --- a/febs-server/edu-mall/edu-mall-biz/src/main/java/com/yida/data/mall/service/EduBillOrderItemService.java +++ b/febs-server/edu-mall/edu-mall-biz/src/main/java/com/yida/data/mall/service/EduBillOrderItemService.java @@ -48,16 +48,4 @@ public interface EduBillOrderItemService extends IService { * @date 2022/4/19 17:04 */ List listItemPayInfo(Long billId, Long studentId); - - /** - * 查询学生是否有对应账单项目的缴费信息 - * - * @param billId 账单id - * @param studentId 学生id - * @param itemId 项目id - * @return int - * @author ZYJ - * @date 2023/9/19 14:57 - */ - int countItemPayInfo(Long billId, Long studentId, Long itemId); } diff --git a/febs-server/edu-mall/edu-mall-biz/src/main/java/com/yida/data/mall/service/EduBillOrderService.java b/febs-server/edu-mall/edu-mall-biz/src/main/java/com/yida/data/mall/service/EduBillOrderService.java index 52ac456..53429ca 100644 --- a/febs-server/edu-mall/edu-mall-biz/src/main/java/com/yida/data/mall/service/EduBillOrderService.java +++ b/febs-server/edu-mall/edu-mall-biz/src/main/java/com/yida/data/mall/service/EduBillOrderService.java @@ -4,7 +4,6 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.yida.data.common.core.entity.mall.EduBillOrder; import java.math.BigDecimal; -import java.util.List; import java.util.Map; /** @@ -46,13 +45,12 @@ public interface EduBillOrderService extends IService { /** * 查询账单缴费人数 * - * @param billId 账单id - * @param studentIds 学生id集合 + * @param billId 账单id * @return java.lang.Long * @author ZYJ * @date 2022/4/18 16:29 */ - Long sumPayStudentNumber(Long billId, List studentIds); + Long sumPayStudentNumber(Long billId); /** * 银联支付通知结果回调 diff --git a/febs-server/edu-mall/edu-mall-biz/src/main/java/com/yida/data/mall/service/EduBillStudentService.java b/febs-server/edu-mall/edu-mall-biz/src/main/java/com/yida/data/mall/service/EduBillStudentService.java index ebce92b..5d56e8e 100644 --- a/febs-server/edu-mall/edu-mall-biz/src/main/java/com/yida/data/mall/service/EduBillStudentService.java +++ b/febs-server/edu-mall/edu-mall-biz/src/main/java/com/yida/data/mall/service/EduBillStudentService.java @@ -2,12 +2,10 @@ package com.yida.data.mall.service; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; -import com.yida.data.common.core.entity.constant.FebsConstant; import com.yida.data.common.core.entity.mall.EduBillStudent; import com.yida.data.mall.dto.BillStudentSelectPageDTO; import com.yida.data.mall.dto.BillUserSaveDTO; import com.yida.data.mall.vo.BillStudentInfoVO; -import org.springframework.scheduling.annotation.Async; import javax.servlet.http.HttpServletResponse; import java.util.List; @@ -81,15 +79,4 @@ public interface EduBillStudentService extends IService { * @date 2022/10/11 17:29 */ String exportBillPayData(BillStudentSelectPageDTO billStudentSelectPageDTO, HttpServletResponse response); - - /** - * 账单催缴 - * - * @param billId 账单id - * @param noticeTitle 推送标题 - * @author ZYJ - * @date 2023/7/14 14:30 - */ - @Async(FebsConstant.ASYNC_POOL) - void sendBillNotice(Long billId, String noticeTitle); } diff --git a/febs-server/edu-mall/edu-mall-biz/src/main/java/com/yida/data/mall/service/H5EduBillService.java b/febs-server/edu-mall/edu-mall-biz/src/main/java/com/yida/data/mall/service/H5EduBillService.java index 98287bc..4d6f0bd 100644 --- a/febs-server/edu-mall/edu-mall-biz/src/main/java/com/yida/data/mall/service/H5EduBillService.java +++ b/febs-server/edu-mall/edu-mall-biz/src/main/java/com/yida/data/mall/service/H5EduBillService.java @@ -92,7 +92,7 @@ public interface H5EduBillService { H5BillOrderInfoVO getH5BillOrderInfo(Long billOrderId, String orderCode); /** - * continuePayOrder + * 继续支付 * * @param orderCode 订单号 * @param deptId 学校id diff --git a/febs-server/edu-mall/edu-mall-biz/src/main/java/com/yida/data/mall/service/impl/EduBillOrderItemServiceImpl.java b/febs-server/edu-mall/edu-mall-biz/src/main/java/com/yida/data/mall/service/impl/EduBillOrderItemServiceImpl.java index 269f442..e00ccba 100644 --- a/febs-server/edu-mall/edu-mall-biz/src/main/java/com/yida/data/mall/service/impl/EduBillOrderItemServiceImpl.java +++ b/febs-server/edu-mall/edu-mall-biz/src/main/java/com/yida/data/mall/service/impl/EduBillOrderItemServiceImpl.java @@ -38,9 +38,4 @@ public class EduBillOrderItemServiceImpl extends ServiceImpl public List listItemPayInfo(Long billId, Long studentId) { return baseMapper.listItemPayInfo(billId, studentId); } - - @Override - public int countItemPayInfo(Long billId, Long studentId, Long itemId) { - return baseMapper.countItemPayInfo(billId, studentId, itemId); - } } diff --git a/febs-server/edu-mall/edu-mall-biz/src/main/java/com/yida/data/mall/service/impl/EduBillOrderServiceImpl.java b/febs-server/edu-mall/edu-mall-biz/src/main/java/com/yida/data/mall/service/impl/EduBillOrderServiceImpl.java index b2402a0..9cb185f 100644 --- a/febs-server/edu-mall/edu-mall-biz/src/main/java/com/yida/data/mall/service/impl/EduBillOrderServiceImpl.java +++ b/febs-server/edu-mall/edu-mall-biz/src/main/java/com/yida/data/mall/service/impl/EduBillOrderServiceImpl.java @@ -65,8 +65,8 @@ public class EduBillOrderServiceImpl extends ServiceImpl } @Override - public Long sumPayStudentNumber(Long billId, List studentIds) { - return baseMapper.sumPayStudentNumber(billId, studentIds); + public Long sumPayStudentNumber(Long billId) { + return baseMapper.sumPayStudentNumber(billId); } @Override @@ -76,7 +76,7 @@ public class EduBillOrderServiceImpl extends ServiceImpl if (CollUtil.isNotEmpty(list)) { for (EduBillOrder order : list) { // 微信订单 - if (PayWay.WEIXIN.getValue().equals(order.getPayWay())) { + if (PayWay.WEI_XIN.getValue().equals(order.getPayWay())) { updateWxBillOrderStatus(order); } else if (PayWay.UNION.getValue().equals(order.getPayWay())) { updateUnionBillOrderStatus(order); @@ -210,7 +210,7 @@ public class EduBillOrderServiceImpl extends ServiceImpl if (CollUtil.isNotEmpty(refundOrderList)) { refundOrderList.forEach(billRefundOrderVO -> { // 微信 - if (PayWay.WEIXIN.getValue().equals(billRefundOrderVO.getPayWay())) { + if (PayWay.WEI_XIN.getValue().equals(billRefundOrderVO.getPayWay())) { updateWxRefundStatus(billRefundOrderVO); } else if (PayWay.UNION.getValue().equals(billRefundOrderVO.getPayWay())) { updateUnionRefundStatus(billRefundOrderVO); diff --git a/febs-server/edu-mall/edu-mall-biz/src/main/java/com/yida/data/mall/service/impl/EduBillServiceImpl.java b/febs-server/edu-mall/edu-mall-biz/src/main/java/com/yida/data/mall/service/impl/EduBillServiceImpl.java index 1d37aa9..a8a5bf0 100644 --- a/febs-server/edu-mall/edu-mall-biz/src/main/java/com/yida/data/mall/service/impl/EduBillServiceImpl.java +++ b/febs-server/edu-mall/edu-mall-biz/src/main/java/com/yida/data/mall/service/impl/EduBillServiceImpl.java @@ -89,7 +89,7 @@ public class EduBillServiceImpl extends ServiceImpl billSelectPageVO.setTotalNumber(totalNumber); // 缴费人数 缴费金额大于0 if (totalNumber > 0) { - billSelectPageVO.setPayNumber(eduBillOrderService.sumPayStudentNumber(billSelectPageVO.getId(), studentIds)); + billSelectPageVO.setPayNumber(eduBillOrderService.sumPayStudentNumber(billSelectPageVO.getId())); } }); return page; @@ -199,8 +199,10 @@ public class EduBillServiceImpl extends ServiceImpl new LambdaQueryWrapper<>(new EduBillStudent()).eq(EduBillStudent::getBillId, billSaveDTO.getId())); } saveOrUpdate(eduBill); - boolean flag = Objects.isNull(billSaveDTO.getId()) || Objects.isNull(billSaveDTO.getOldBillStartDate()) - || billSaveDTO.getOldBillStartDate().isAfter(LocalDateTime.now()); + boolean flag = Objects.isNull(billSaveDTO.getId()) || + (Objects.nonNull(billSaveDTO.getId()) && + (Objects.isNull(billSaveDTO.getOldBillStartDate()) + || billSaveDTO.getOldBillStartDate().isAfter(LocalDateTime.now()))); List saveItemList = new ArrayList<>(); if (flag) { // 保存对应的缴费项目数据 @@ -280,7 +282,8 @@ public class EduBillServiceImpl extends ServiceImpl if (BillStatusEnum.ENABLE_STATUS.getStatus().equals(bill.getEnableStatus())) { throw new FebsException("当前账单已启用, 无法删除!"); } - if (Objects.isNull(bill.getBillStartDate()) || bill.getBillStartDate().isAfter(LocalDateTime.now())) { + if (Objects.isNull(bill.getBillStartDate()) || + Objects.nonNull(bill.getBillStartDate()) && bill.getBillStartDate().isAfter(LocalDateTime.now())) { // 删除项目子选项 eduBillItemSubService.remove( new LambdaQueryWrapper<>(new EduBillItemSub()).eq(EduBillItemSub::getBillId, billId)); diff --git a/febs-server/edu-mall/edu-mall-biz/src/main/java/com/yida/data/mall/service/impl/EduBillStatisticsServiceImpl.java b/febs-server/edu-mall/edu-mall-biz/src/main/java/com/yida/data/mall/service/impl/EduBillStatisticsServiceImpl.java index 2096400..b2e2a2b 100644 --- a/febs-server/edu-mall/edu-mall-biz/src/main/java/com/yida/data/mall/service/impl/EduBillStatisticsServiceImpl.java +++ b/febs-server/edu-mall/edu-mall-biz/src/main/java/com/yida/data/mall/service/impl/EduBillStatisticsServiceImpl.java @@ -123,6 +123,8 @@ public class EduBillStatisticsServiceImpl implements EduBillStatisticsService { // 查询指定账单数据 billList.add(eduBillService.getById(billId)); } + // 查询已开始的账单 +// List billList = eduBillMapper.selectStartBill(); if (CollUtil.isNotEmpty(billList)) { for (EduBill eduBill : billList) { diff --git a/febs-server/edu-mall/edu-mall-biz/src/main/java/com/yida/data/mall/service/impl/EduBillStudentServiceImpl.java b/febs-server/edu-mall/edu-mall-biz/src/main/java/com/yida/data/mall/service/impl/EduBillStudentServiceImpl.java index 7d9e458..44e61fd 100644 --- a/febs-server/edu-mall/edu-mall-biz/src/main/java/com/yida/data/mall/service/impl/EduBillStudentServiceImpl.java +++ b/febs-server/edu-mall/edu-mall-biz/src/main/java/com/yida/data/mall/service/impl/EduBillStudentServiceImpl.java @@ -2,7 +2,6 @@ package com.yida.data.mall.service.impl; import cc.mrbird.febs.common.redis.service.RedisService; import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.core.util.NumberUtil; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.TypeReference; @@ -16,16 +15,10 @@ import com.yida.data.common.core.entity.constant.StringConstant; import com.yida.data.common.core.entity.mall.EduBill; import com.yida.data.common.core.entity.mall.EduBillOrder; import com.yida.data.common.core.entity.mall.EduBillStudent; -import com.yida.data.common.core.entity.notice.app.AppNotice; -import com.yida.data.common.core.entity.notice.app.inside.PushMessage; -import com.yida.data.common.core.entity.system.EduYidaApp; -import com.yida.data.common.core.entity.user.EduParent; import com.yida.data.common.core.entity.user.EduStudent; import com.yida.data.common.core.enums.OrderStatusEnum; import com.yida.data.common.core.exception.FebsException; -import com.yida.data.common.core.utils.AppUtil; import com.yida.data.common.core.utils.FebsUtil; -import com.yida.data.common.service.CommonService; import com.yida.data.mall.dto.BillStudentSelectPageDTO; import com.yida.data.mall.dto.BillUserSaveDTO; import com.yida.data.mall.mapper.EduBillMapper; @@ -38,13 +31,11 @@ import com.yida.data.mall.vo.BillItemInfoVO; import com.yida.data.mall.vo.BillStudentInfoVO; import com.yida.data.mall.vo.h5.H5BillItemVO; import com.yida.data.system.feign.RemoteCommonService; -import com.yida.data.user.dto.ListStudentDTO; import com.yida.data.user.feign.RemoteStudentService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; -import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -53,7 +44,10 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; import java.time.LocalDateTime; -import java.util.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; import java.util.stream.Collectors; /** @@ -69,8 +63,8 @@ import java.util.stream.Collectors; public class EduBillStudentServiceImpl extends ServiceImpl implements EduBillStudentService { - private final CommonService commonService; private final RemoteStudentService remoteStudentService; + private final RemoteCommonService remoteCommonService; private final EduBillOrderService eduBillOrderService; private final EduBillOrderItemService eduBillOrderItemService; @@ -83,12 +77,6 @@ public class EduBillStudentServiceImpl extends ServiceImpl private final RedisService redisService; - @Value("${febs.pushUrl}") - private String pushUrl; - - @Value("${febs.billUrl}") - private String billUrl; - @Override public IPage listBillUserPage(BillStudentSelectPageDTO dto) { // 查询学生信息 @@ -375,79 +363,4 @@ public class EduBillStudentServiceImpl extends ServiceImpl return ""; } } - - @Override - public void sendBillNotice(Long billId, String noticeTitle) { - EduBill bill = eduBillService.getById(billId); - if (Objects.isNull(bill) || bill.getBillEndDate().isAfter(LocalDateTime.now())) { - log.error("当前账单无法进行催缴功能!"); - } - // 查询学生信息 - ListStudentDTO studentDTO = ListStudentDTO.builder().schoolId(FebsUtil.getDeptId()) - .isQueryUserDept(false).isQuerySchoolName(false) - .build(); - List studentList = remoteStudentService.listStudent(studentDTO).getData(); - - // 学生分组 - Map> studentMap = studentList.stream().collect( - Collectors.groupingBy(EduStudent::getId)); - if (CollUtil.isNotEmpty(studentList)) { - // 需要推送的家长集合 - List parentList = new ArrayList<>(); - // 查询账单人员列表 - List list = baseMapper.listBillUserPage(null, - BillStudentSelectPageDTO.builder() - .billId(billId) - .build(), - studentList); - list.forEach(billStudentInfoVO -> { - // 匹配学生信息 - EduStudent student = studentMap.get(billStudentInfoVO.getStudentId()).get(0); - BigDecimal payOrderPrice = eduBillOrderService.sumPayOrderPrice(billId, student.getId()); - if (Objects.isNull(payOrderPrice) && CollUtil.isNotEmpty(student.getParents())) { - // 添加需要推送的家长信息 - parentList.addAll(student.getParents()); - } - }); - - // 推送消息 - List appUserIds = parentList.stream().map(EduParent::getYidaAppUserId) - .filter(StringUtils::isNotBlank).collect(Collectors.toList()); - if (CollUtil.isNotEmpty(appUserIds)) { - EduYidaApp yidaApp = new EduYidaApp(); - yidaApp.setAppUrl(pushUrl); - // 创建发送对象 - AppNotice notice = new AppNotice(); - // 消息主体 - PushMessage message = new PushMessage(); - message.setTitle(noticeTitle); - message.setContent(String.format("您有一条待缴费信息:%s,截止日期:%s,点击查询详情。", bill.getBillTitle(), - LocalDateTimeUtil.format(bill.getBillEndDate(), "yyyy年MM月dd日HH时mm分秒"))); - message.setUrl(billUrl); - message.setMsgType(PushMessage.NORMAL); - message.setMsgSubType(PushMessage.H5_SUB_MSG_TYPE); - notice.setPushMessage(message); - notice.setUserIdList(appUserIds); - AppUtil.sendPushMsg(notice, yidaApp); - } - } - } - - public static void main(String[] args) { - EduYidaApp yidaApp = new EduYidaApp(); - yidaApp.setAppUrl("https://push.pzhdqrmtzx.com"); - // 创建发送对象 - AppNotice notice = new AppNotice(); - // 消息主体 - PushMessage message = new PushMessage(); - message.setTitle("测试"); - message.setContent(String.format("您有一条待缴费信息:%s,截止日期:%s,点击查询详情。", "sdad", - LocalDateTimeUtil.format(LocalDateTime.now(), "yyyy年MM月dd日HH时mm分秒"))); - message.setUrl("https://jyjf.pzhdqrmtzx.com/view/billApp/#/index?deptId=10548&loginType=2"); - message.setMsgType(PushMessage.NORMAL); - message.setMsgSubType(PushMessage.H5_SUB_MSG_TYPE); - notice.setPushMessage(message); - notice.setUserIdList(CollUtil.toList("f15f25a55fad4b61a527c67abbf1dcd1")); - AppUtil.sendPushMsg(notice, yidaApp); - } } diff --git a/febs-server/edu-mall/edu-mall-biz/src/main/java/com/yida/data/mall/service/impl/H5EduBillServiceImpl.java b/febs-server/edu-mall/edu-mall-biz/src/main/java/com/yida/data/mall/service/impl/H5EduBillServiceImpl.java index 39a42e6..53ae6fc 100644 --- a/febs-server/edu-mall/edu-mall-biz/src/main/java/com/yida/data/mall/service/impl/H5EduBillServiceImpl.java +++ b/febs-server/edu-mall/edu-mall-biz/src/main/java/com/yida/data/mall/service/impl/H5EduBillServiceImpl.java @@ -7,7 +7,6 @@ import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.core.lang.Snowflake; -import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.RandomUtil; import cn.hutool.crypto.SecureUtil; @@ -21,7 +20,6 @@ import com.yida.data.common.core.common.ResultMsgType; import com.yida.data.common.core.entity.CurrentUser; import com.yida.data.common.core.entity.apply.EduApplyProductOrder; import com.yida.data.common.core.entity.constant.CachePrefixConstant; -import com.yida.data.common.core.entity.constant.LockPrefixConstant; import com.yida.data.common.core.entity.constant.StringConstant; import com.yida.data.common.core.entity.constant.UnionPayConstant; import com.yida.data.common.core.entity.mall.*; @@ -82,12 +80,12 @@ public class H5EduBillServiceImpl implements H5EduBillService { private final EduBillService eduBillService; private final EduBillItemService eduBillItemService; - private final EduBillOrderService eduBillOrderService; private final EduBillItemSubService eduBillItemSubService; + private final EduBillOrderService eduBillOrderService; private final EduBillOrderItemService eduBillOrderItemService; - private final EduBillOrderRefundService eduBillOrderRefundService; private final EduBillOrderItemSubService eduBillOrderItemSubService; private final EduBillOrderStudentService eduBillOrderStudentService; + private final EduBillOrderRefundService eduBillOrderRefundService; private final EduBillMapper eduBillMapper; private final EduBillOrderMapper eduBillOrderMapper; @@ -185,26 +183,16 @@ public class H5EduBillServiceImpl implements H5EduBillService { public BillPayInfoVO createBillOrder(CreateBillOrderDTO createBillOrderDTO) { CurrentUser currentUser = FebsUtil.getCurrentUser(); - // 判断学生账单订单锁 - String lockKey = LockPrefixConstant.STUDENT_BILL_ORDER_LOCK + createBillOrderDTO.getStudentId() + StringConstant.DOT + createBillOrderDTO.getBillId(); - Asserts.isFalse(redisService.hasKey(lockKey), "该学生正在缴费中,请稍后再试!"); - // 加锁 - redisService.lock(lockKey); - // 判断是否有下单缓存信息 BillOrderStudentCacheVO existBillOrderStudent = (BillOrderStudentCacheVO) redisService.get( CachePrefixConstant.BILL_ORDER_STUDENT + createBillOrderDTO.getStudentId().toString() + StringConstant.DOT + createBillOrderDTO.getBillId().toString()); if (Objects.nonNull(existBillOrderStudent)) { - // 解锁 - redisService.unlock(lockKey); throw new FebsException(String.format("%s%s正在支付中, 请耐心等待", existBillOrderStudent.getStudentName(), existBillOrderStudent.getParentType())); } if (StringUtils.isEmpty(createBillOrderDTO.getPayWay()) || PayWay.ALIPAY.getValue().equals(createBillOrderDTO.getPayWay())) { - // 解锁 - redisService.unlock(lockKey); throw new FebsException(ResultMsgType.PAY_TYPE_ERROR.getValue()); } // 查询账单信息 @@ -212,15 +200,11 @@ public class H5EduBillServiceImpl implements H5EduBillService { if (Objects.isNull(bill) || BillStatusEnum.DISABLE_STATUS.getStatus().equals(bill.getEnableStatus()) || bill.getBillEndDate().isBefore(LocalDateTime.now())) { - // 解锁 - redisService.unlock(lockKey); throw new FebsException("当前账单暂时无法缴费"); } // 查询学生信息 EduStudent student = remoteStudentService.getStudentNoPermission(createBillOrderDTO.getStudentId()).getData(); if (Objects.isNull(student)) { - // 解锁 - redisService.unlock(lockKey); throw new FebsException("学生信息错误"); } // 家长信息 @@ -228,8 +212,6 @@ public class H5EduBillServiceImpl implements H5EduBillService { EduParent orderParent = parents.stream().filter( x -> currentUser.getMobile().equals(x.getMobile())).collect(Collectors.toList()).get(0); if (Objects.isNull(orderParent)) { - // 解锁 - redisService.unlock(lockKey); throw new FebsException("家长信息错误"); } @@ -237,7 +219,7 @@ public class H5EduBillServiceImpl implements H5EduBillService { try { // 订单号 需要根据支付方式生成不同的订单号 String orderNo = ""; - if (PayWay.WEIXIN.getValue().equals(createBillOrderDTO.getPayWay())) { + if (PayWay.WEI_XIN.getValue().equals(createBillOrderDTO.getPayWay())) { // 微信 orderNo = String.valueOf(ORDER_CODE_GENERATOR.nextId()); } else if (PayWay.UNION.getValue().equals(createBillOrderDTO.getPayWay())) { @@ -276,9 +258,6 @@ public class H5EduBillServiceImpl implements H5EduBillService { redisService.del(CachePrefixConstant.BILL_ORDER_FLAG + orderCode); } throw new FebsException(e.getMessage()); - } finally { - // 解锁 - redisService.unlock(lockKey); } } @@ -311,11 +290,6 @@ public class H5EduBillServiceImpl implements H5EduBillService { for (CreateBillOrderDTO.CreateBillOrderItemDTO itemDTO : createBillOrderDTO.getItemList()) { // 根据项目id查询具体信息 EduBillItem billItem = eduBillItemService.getById(itemDTO.getItemId()); - // TODO: 2023/9/19 判断当前费项是否缴费(排除多项选择多项,此处直接查询主费项) - int itemPayCount = eduBillOrderItemService.countItemPayInfo(bill.getId(), student.getId(), itemDTO.getItemId()); - if (itemPayCount > 0) { - throw new FebsException(String.format("【%s】已支付,请刷新页面后重新操作", billItem.getItemName())); - } String itemFamilyType = billItem.getFamilyType(); // 判断当前学生能否减免 boolean reductionFlag = false; @@ -521,7 +495,7 @@ public class H5EduBillServiceImpl implements H5EduBillService { // 下单返回信息 String result = ""; try { - if (PayWay.WEIXIN.getValue().equals(eduBillOrder.getPayWay())) { + if (PayWay.WEI_XIN.getValue().equals(eduBillOrder.getPayWay())) { // 微信支付 EduPayWxConfig config = commonService.getPayWxConfigBySchool(student.getSchoolId()); EduApplyProductOrder order = new EduApplyProductOrder(); @@ -579,7 +553,7 @@ public class H5EduBillServiceImpl implements H5EduBillService { public BillPayInfoVO getPayInfo(String orderCode, String billOrderFlag, Long deptId, boolean needToPay, String payWay, Integer payType) { BillPayInfoVO billPayInfoVO = null; - if (PayWay.WEIXIN.getValue().equals(payWay)) { + if (PayWay.WEI_XIN.getValue().equals(payWay)) { // 微信 billPayInfoVO = getWxJsSign(orderCode, billOrderFlag, deptId, needToPay, payType); } else if (PayWay.UNION.getValue().equals(payWay)) { @@ -613,7 +587,7 @@ public class H5EduBillServiceImpl implements H5EduBillService { BillPayInfoVO infoVO = new BillPayInfoVO(); infoVO.setOrderCode(orderCode); infoVO.setNeedToPay(needToPay); - infoVO.setPayWay(PayWay.WEIXIN.getValue()); + infoVO.setPayWay(PayWay.WEI_XIN.getValue()); infoVO.setPayType(wxPayType); // js api类型 @@ -647,7 +621,7 @@ public class H5EduBillServiceImpl implements H5EduBillService { if (Objects.nonNull(order) && (OrderStatusEnum.NOT_PAY.getStatus().equals(order.getOrderStatus()) || OrderStatusEnum.USER_PAYING.getStatus().equals(order.getOrderStatus()))) { - if (PayWay.WEIXIN.getValue().equals(order.getPayWay())) { + if (PayWay.WEI_XIN.getValue().equals(order.getPayWay())) { // 微信 wxBillOrderSuccess(order); } else if (PayWay.UNION.getValue().equals(order.getPayWay())) { @@ -701,7 +675,7 @@ public class H5EduBillServiceImpl implements H5EduBillService { if (flag) { break; } - ThreadUtil.sleep(1000L); + Thread.sleep(1000L); } catch (Exception e) { log.error("账单订单(微信支付方式)完成失败, orderNo: {}", orderCode, e); } @@ -760,9 +734,9 @@ public class H5EduBillServiceImpl implements H5EduBillService { if (flag) { break; } - ThreadUtil.sleep(1000L); + Thread.sleep(1000L); } catch (Exception e) { - log.error("账单订单(微信支付方式)完成失败, orderNo: {}", orderCode, e); + log.error("账单订单(云闪付支付方式)完成失败, orderNo: {}", orderCode, e); } } } @@ -840,7 +814,7 @@ public class H5EduBillServiceImpl implements H5EduBillService { eduBillOrderService.updateById(order); try { // 判断支付方式 - if (PayWay.WEIXIN.getValue().equals(order.getPayWay())) { + if (PayWay.WEI_XIN.getValue().equals(order.getPayWay())) { // 关闭微信订单 WxPayUtil.closeOrder(commonService.getPayWxConfigBySchool(order.getDeptId()), order.getOrderCode()); } else if (PayWay.UNION.getValue().equals(order.getPayWay()) @@ -877,7 +851,7 @@ public class H5EduBillServiceImpl implements H5EduBillService { eduBillOrderRefund.setOrderCode(orderCode); // 生成退款订单号 String refundOrderCode = ""; - if (PayWay.WEIXIN.getValue().equals(order.getPayWay())) { + if (PayWay.WEI_XIN.getValue().equals(order.getPayWay())) { // 微信 refundOrderCode = "R" + orderCode; } else if (PayWay.UNION.getValue().equals(order.getPayWay())) { @@ -899,7 +873,7 @@ public class H5EduBillServiceImpl implements H5EduBillService { PayWay.class.getMethod("getValue")); switch (Objects.requireNonNull(payWay)) { // 微信 - case WEIXIN: + case WEI_XIN: // 查询学校微信支付配置 EduPayWxConfig config = commonService.getPayWxConfigBySchool(order.getDeptId()); WxPayUtil.refund(config, eduBillOrderRefund.getOrderCode(), diff --git a/febs-server/edu-mall/edu-mall-biz/src/main/resources/mapper/EduBillOrderItemMapper.xml b/febs-server/edu-mall/edu-mall-biz/src/main/resources/mapper/EduBillOrderItemMapper.xml index 378359e..faf7c2c 100644 --- a/febs-server/edu-mall/edu-mall-biz/src/main/resources/mapper/EduBillOrderItemMapper.xml +++ b/febs-server/edu-mall/edu-mall-biz/src/main/resources/mapper/EduBillOrderItemMapper.xml @@ -125,19 +125,5 @@ - - - - + diff --git a/febs-server/edu-mall/edu-mall-biz/src/main/resources/mapper/EduBillOrderMapper.xml b/febs-server/edu-mall/edu-mall-biz/src/main/resources/mapper/EduBillOrderMapper.xml index 8268f1a..35295e3 100644 --- a/febs-server/edu-mall/edu-mall-biz/src/main/resources/mapper/EduBillOrderMapper.xml +++ b/febs-server/edu-mall/edu-mall-biz/src/main/resources/mapper/EduBillOrderMapper.xml @@ -25,10 +25,6 @@ AND s.del_flag = 0 AND o.pay_status = '1' AND o.bill_id = #{billId} - AND s.student_id IN - - #{item} - diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/classCall/ClassCallAddDTO.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/classCall/ClassCallAddDTO.java new file mode 100644 index 0000000..e7fd5f0 --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/classCall/ClassCallAddDTO.java @@ -0,0 +1,43 @@ +package com.yida.data.school.dto.classCall; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.util.List; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import lombok.Data; + +@ApiModel("添加点名记录对象") +@Data +public class ClassCallAddDTO { + + /** + * 班级ID + */ + @ApiModelProperty(required = true, value = "班级ID") + @NotNull(message = "不能为空") + private Long classId; + + /** + * 课程名称 + */ + @ApiModelProperty(required = true, value = "课程名称") + @NotBlank(message = "不能为空") + private String subjectName; + + /** + * 点名教师id + */ + @ApiModelProperty(required = true, value = "点名教师id") + @NotNull(message = "不能为空") + private Long teacherId; + + + /** + * 点名学生集合 + */ + @ApiModelProperty(required = true, value = "点名学生集合") + @NotEmpty(message = "不能为空") + List studentList; +} diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/classCall/ClassCallPageDTO.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/classCall/ClassCallPageDTO.java new file mode 100644 index 0000000..8ba4970 --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/classCall/ClassCallPageDTO.java @@ -0,0 +1,39 @@ +package com.yida.data.school.dto.classCall; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.yida.data.common.core.common.BaseDTO; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.time.LocalDate; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +@ApiModel("分页查询点名记录条件") +@Data +public class ClassCallPageDTO extends BaseDTO { + + /** + * 学校ID + */ + @ApiModelProperty(required = false, value = "学校ID") + private Long schoolId; + + /** + * 职工ID + */ + @ApiModelProperty(required = false, value = "职工ID") + private Long staffId; + + /** + * 班级ID + */ + @ApiModelProperty(required = false, value = "班级ID") + private Long classId; + + + @ApiModelProperty(required = false, value = "点名日期") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") + private LocalDate date; + +} diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/classCall/StudentDTO.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/classCall/StudentDTO.java new file mode 100644 index 0000000..0bddc58 --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/classCall/StudentDTO.java @@ -0,0 +1,18 @@ +package com.yida.data.school.dto.classCall; + +import com.yida.data.common.core.entity.user.EduStudent; +import io.swagger.annotations.ApiModelProperty; +import javax.validation.constraints.NotNull; +import lombok.Data; + +@Data +public class StudentDTO { + + @ApiModelProperty(required = true, value = "点名状态:0=异常,1=正常") + @NotNull(message = "不能为空") + private Integer status; + + @ApiModelProperty(required = true, value = "学生主键ID") + @NotNull(message = "不能为空") + private Long studentId; +} diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/config/EduSchoolFunctionConfigDTO.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/config/EduSchoolFunctionConfigDTO.java new file mode 100644 index 0000000..48d3397 --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/config/EduSchoolFunctionConfigDTO.java @@ -0,0 +1,29 @@ +package com.yida.data.school.dto.config; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + + +@ApiModel("学校关键功能点配置条件请求类") +@Data +public class EduSchoolFunctionConfigDTO { + + @ApiModelProperty(value = "主键") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @ApiModelProperty(value = "学校主键") + @TableId(value = "school_id") + private Long school_id; + + @ApiModelProperty(value = "关键功能点code") + @TableId(value = "function_code") + private String functionCode; + + @ApiModelProperty(value = "是否启用1启用,其他未启用") + @TableId(value = "function_code") + private Integer state; +} diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/index/SaveDeptHomeAppDTO.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/index/SaveDeptHomeAppDTO.java new file mode 100644 index 0000000..883f350 --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/index/SaveDeptHomeAppDTO.java @@ -0,0 +1,30 @@ +package com.yida.data.school.dto.index; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.yida.data.common.core.entity.school.EduSchoolHomeMicroCol; +import io.swagger.annotations.ApiModelProperty; +import java.util.List; +import lombok.Data; + +@Data +public class SaveDeptHomeAppDTO { + + private Long id; + + @ApiModelProperty(value = "应用类型. 0:系统应用, 1:第三方应用,2:微信小程序") + private Integer appType; + private Integer userType; + private Long baseAppId; + private String name; + private String logo; + private String appSrc; + private Integer enableStatus; + private Integer sort; + @ApiModelProperty(value = "微信小程序appid") + private String appId; + /** + * 微信小程序secret + */ + @ApiModelProperty(value = "微信小程序secret") + private String appSecret; +} diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/screen/SchoolDashboardBaseSaveDTO.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/screen/SchoolDashboardBaseSaveDTO.java new file mode 100644 index 0000000..d6b220c --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/screen/SchoolDashboardBaseSaveDTO.java @@ -0,0 +1,33 @@ +package com.yida.data.school.dto.screen; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 保存校园大数据基础建设 + * + * @author ZYJ + * @date 2023/4/20 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "SchoolDashboardBaseSaveDTO", description = "保存校园大数据基础建设") +public class SchoolDashboardBaseSaveDTO implements Serializable { + + private static final long serialVersionUID = -7304594726411432290L; + + @ApiModelProperty(value = "标题") + private String label; + + @ApiModelProperty(value = "数量+单位") + private String unit; + + @ApiModelProperty(value = "图标") + private String icon; +} \ No newline at end of file diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/screen/SchoolDashboardSaveDTO.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/screen/SchoolDashboardSaveDTO.java new file mode 100644 index 0000000..a75a523 --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/screen/SchoolDashboardSaveDTO.java @@ -0,0 +1,130 @@ +package com.yida.data.school.dto.screen; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; + +/** + * 保存校园大数据请求类 + * + * @author ZYJ + * @date 2023/4/20 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "SchoolDashboardSaveDTO", description = "保存校园大数据请求类") +public class SchoolDashboardSaveDTO implements Serializable { + + private static final long serialVersionUID = 3417294163343915202L; + + @ApiModelProperty("主键") + private Long id; + + @ApiModelProperty("创建时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + @ApiModelProperty("学校id") + private Long schoolId; + + @ApiModelProperty("大屏名称") + private String title; + + @ApiModelProperty("学校logo地址") + private String headerUrl; + + @ApiModelProperty("模板类型1:单页,2双页,3.。。") + private Integer modeType; + + @ApiModelProperty(value = "所属区域") + private String area; + + @ApiModelProperty("地址") + private String address; + + @ApiModelProperty("学校创建时间") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") + private LocalDate schoolCreateDate; + + @ApiModelProperty("学校占地面积") + private Integer schoolArea; + + @ApiModelProperty(value = "主管部门") + private String competentDepartment; + + @ApiModelProperty("办学类型") + private String eduType; + + @ApiModelProperty("院校特色") + private String eduFeature; + + @ApiModelProperty("院校类型") + private String institutionType; + + @ApiModelProperty("硕士点") + private Integer masterNum; + + @ApiModelProperty("博士点") + private Integer doctorNum; + + @ApiModelProperty("重点学科数") + private Integer keyDisciplinesNum; + + @ApiModelProperty("科研项目数") + private Integer researchProjectNum; + + @ApiModelProperty("学校简介") + private String eduIntroduction; + + @ApiModelProperty("办学理念") + private String eduPhilosophy; + + @ApiModelProperty("办学使命") + private String eduMission; + + @ApiModelProperty("办学校训") + private String eduMotto; + + @ApiModelProperty("校园风采") + private String campusStyle; + + @ApiModelProperty("官方电话") + private String telephone; + + @ApiModelProperty("教师人数") + private Integer teacherNum; + + @ApiModelProperty("院系数量") + private Integer departmentNum; + + @ApiModelProperty("一级学科数量") + private Integer firstLevelDisciplineNum; + + @ApiModelProperty("二级学科数量") + private Integer secondaryDisciplineNum; + + @ApiModelProperty("班级数") + private Integer classNum; + + @ApiModelProperty("学生人数") + private Integer studentNum; + + @ApiModelProperty("基础建设集合") + private List baseList; + + @ApiModelProperty("师资力量集合") + private List teacherList; +} \ No newline at end of file diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/screen/SchoolDashboardTeacherSaveDTO.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/screen/SchoolDashboardTeacherSaveDTO.java new file mode 100644 index 0000000..89a3259 --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/screen/SchoolDashboardTeacherSaveDTO.java @@ -0,0 +1,30 @@ +package com.yida.data.school.dto.screen; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 保存校园大数据师资力量 + * + * @author ZYJ + * @date 2023/4/20 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "SchoolDashboardTeacherSaveDTO", description = "保存校园大数据师资力量") +public class SchoolDashboardTeacherSaveDTO implements Serializable { + + private static final long serialVersionUID = -1683405994263409134L; + + @ApiModelProperty(value = "标题") + private String title; + + @ApiModelProperty(value = "数量") + private Integer num; +} \ No newline at end of file diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/AddUploadFileStepDTO.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/AddUploadFileStepDTO.java new file mode 100644 index 0000000..dc60331 --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/AddUploadFileStepDTO.java @@ -0,0 +1,41 @@ +package com.yida.data.school.dto.smart; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.io.Serializable; +import java.util.List; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 步骤文件上传类 + * + * @author ZYJ + * @date 2023/6/5 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "AddUploadFileStepDTO", description = "步骤文件上传类") +public class AddUploadFileStepDTO implements Serializable { + + private static final long serialVersionUID = -209072639419583186L; + + @ApiModelProperty(value = "关联关系id", required = true) + private Long relationId; + + @ApiModelProperty(value = "指南id", required = true) + private Long guideId; + + @ApiModelProperty(value = "花名册id", required = true) + private Long rosterId; + + @ApiModelProperty(value = "步骤id", required = true) + private Long stepId; + + @ApiModelProperty(value = "附件地址", required = true) + private List upLoadFileUrlList; +} \ No newline at end of file diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/ClassFixImportDTO.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/ClassFixImportDTO.java new file mode 100644 index 0000000..d51e982 --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/ClassFixImportDTO.java @@ -0,0 +1,63 @@ +package com.yida.data.school.dto.smart; + +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.io.Serializable; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * Excel职工信息导入类 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "ClassFixImportDTO", description = "Excel固定班级学生导入类") +public class ClassFixImportDTO implements Serializable { + + private static final long serialVersionUID = -3772088981386664273L; + /** + * 校区 + */ + @ExcelProperty(index = 0, value = "校区") + @ApiModelProperty(value = "校区") + private String campusName; + + /** + * 学段 + */ + @ExcelProperty(index = 1, value = "学段") + @ApiModelProperty(value = "学段") + private String sectionName; + + /** + * 年级 + */ + @ExcelProperty(index = 2, value = "年级") + @ApiModelProperty(value = "年级") + private String gradeName; + + /** + * 班级 + */ + @ExcelProperty(index = 3, value = "班级") + @ApiModelProperty(value = "班级") + private String className; + + /** + * 姓名 + */ + @ExcelProperty(index = 4, value = "姓名") + @ApiModelProperty(value = "姓名") + private String rosterName; + + /** + * 身份证号 + */ + @ExcelProperty(index = 5, value = "身份证号") + @ApiModelProperty(value = "身份证号") + private String idNumber; + +} \ No newline at end of file diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/ClassImportDTO.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/ClassImportDTO.java new file mode 100644 index 0000000..41a56cf --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/ClassImportDTO.java @@ -0,0 +1,88 @@ +package com.yida.data.school.dto.smart; + +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * Excel职工信息导入类 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "ClassImportDTO", description = "Excel预选班级导入类") +public class ClassImportDTO implements Serializable { + + private static final long serialVersionUID = -8812791024900293183L; + /** + * 校区 + */ + @ExcelProperty(index = 0, value = "校区") + @ApiModelProperty(value = "校区") + private String campusName; + + /** + * 学段 + */ + @ExcelProperty(index = 1, value = "学段") + @ApiModelProperty(value = "学段") + private String sectionName; + + /** + * 年级 + */ + @ExcelProperty(index = 2, value = "年级") + @ApiModelProperty(value = "年级") + private String gradeName; + + /** + * 班级 + */ + @ExcelProperty(index = 3, value = "班级") + @ApiModelProperty(value = "班级") + private String className; + + + /** + * 系部 + */ + @ExcelProperty(index = 4, value = "系部") + @ApiModelProperty(value = "系部") + private String departmentName; + + + /** + * 专业 + */ + @ExcelProperty(index = 5, value = "专业") + @ApiModelProperty(value = "专业") + private String majorName; + + /** + * 预设人数 + */ + @ExcelProperty(index = 6, value = "预设人数") + @ApiModelProperty(value = "预设人数") + private Integer number; + + + /** + * 男生占比 + */ + @ExcelProperty(index = 7, value = "男生占比") + @ApiModelProperty(value = "男生占比") + private Integer male; + + /** + * 女生占比 + */ + @ExcelProperty(index = 8, value = "女生占比") + @ApiModelProperty(value = "女生占比") + private Integer female; + +} \ No newline at end of file diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/CustomDormImportDTO.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/CustomDormImportDTO.java new file mode 100644 index 0000000..dd55052 --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/CustomDormImportDTO.java @@ -0,0 +1,102 @@ +package com.yida.data.school.dto.smart; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.baomidou.mybatisplus.annotation.TableField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.io.Serializable; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * Excel职工信息导入类 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "CustomDormImportDTO", description = "Excel自定义预选宿舍导入类") +public class CustomDormImportDTO implements Serializable { + + + private static final long serialVersionUID = 4258485996992370675L; + /** + * 系部 + */ + @ExcelProperty(index = 0, value = "系部") + @ApiModelProperty(value = "系部") + private String departmentName; + + + /** + * 专业 + */ + @ExcelProperty(index = 1, value = "专业") + @ApiModelProperty(value = "专业") + private String majorName; + + /** + * 宿舍楼 + */ + @ExcelProperty(index = 2, value = "宿舍楼") + @ApiModelProperty(value = "宿舍楼") + private String dormName; + + /** + * 寝室号 + */ + @ExcelProperty(index = 3, value = "宿舍号") + @ApiModelProperty(value = "宿舍号") + private String dormRoomName; + + /** + * 性别 + */ + @ExcelProperty(index = 4, value = "性别,男/女") + @ApiModelProperty(value = "性别") + private String gender; + + /** + * 人数 + */ + @ExcelProperty(index = 5, value = "人数") + @ApiModelProperty(value = "人数") + private Integer number; + + /** + * 校区ID + */ + @ExcelProperty(index = 6, value = "校区id") + @ApiModelProperty(value = "校区ID") + private Long campusId; + + /** + * 部门id + */ + @ExcelProperty(index = 7, value = "部门id") + @ApiModelProperty(value = "部门id") + private Long deptId; + + + /** + * 指南id + */ + @ExcelProperty(index = 8, value = "指南id") + @ApiModelProperty(value = "指南id") + private Long guideId; + + /** + * 步骤id + */ + @ExcelProperty(index = 9, value = "步骤id") + @ApiModelProperty(value = "步骤id") + private Long stepId; + + /** + * 学校id + */ + @ExcelProperty(index = 10, value = "学校id") + @ApiModelProperty(value = "学校id") + private Long schoolId; + +} \ No newline at end of file diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/DormImportDTO.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/DormImportDTO.java new file mode 100644 index 0000000..7a4c62e --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/DormImportDTO.java @@ -0,0 +1,67 @@ +package com.yida.data.school.dto.smart; + +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.io.Serializable; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * Excel职工信息导入类 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "DormImportDTO", description = "Excel预选宿舍导入类") +public class DormImportDTO implements Serializable { + + private static final long serialVersionUID = -4260457409043932228L; + + + /** + * 系部 + */ + @ExcelProperty(index = 0, value = "系部") + @ApiModelProperty(value = "系部") + private String departmentName; + + + /** + * 专业 + */ + @ExcelProperty(index = 1, value = "专业") + @ApiModelProperty(value = "专业") + private String majorName; + + /** + * 宿舍楼 + */ + @ExcelProperty(index = 2, value = "宿舍楼") + @ApiModelProperty(value = "宿舍楼") + private String dormName; + + /** + * 寝室号 + */ + @ExcelProperty(index = 3, value = "宿舍号") + @ApiModelProperty(value = "宿舍号") + private String dormRoomName; + + /** + * 性别 + */ + @ExcelProperty(index = 4, value = "性别,男/女") + @ApiModelProperty(value = "性别") + private String gender; + + /** + * 人数 + */ + @ExcelProperty(index = 5, value = "人数") + @ApiModelProperty(value = "人数") + private String realNumber; + + +} \ No newline at end of file diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/DormImportFixDTO.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/DormImportFixDTO.java new file mode 100644 index 0000000..16597fa --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/DormImportFixDTO.java @@ -0,0 +1,49 @@ +package com.yida.data.school.dto.smart; + +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.io.Serializable; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * Excel职工信息导入类 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "DormImportDTO", description = "Excel预选宿舍导入类") +public class DormImportFixDTO implements Serializable { + + + /** + * 宿舍楼 + */ + @ExcelProperty(index = 0, value = "宿舍楼") + @ApiModelProperty(value = "宿舍楼") + private String dormName; + + /** + * 寝室号 + */ + @ExcelProperty(index = 1, value = "宿舍号") + @ApiModelProperty(value = "宿舍号") + private String dormRoomName; + /** + * 姓名 + */ + @ExcelProperty(index = 2, value = "姓名") + @ApiModelProperty(value = "姓名") + private String rosterName; + + /** + * 身份证号 + */ + @ExcelProperty(index = 3, value = "身份证号") + @ApiModelProperty(value = "身份证号") + private String idNumber; + + +} \ No newline at end of file diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/GuideFillInfoSaveDTO.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/GuideFillInfoSaveDTO.java new file mode 100644 index 0000000..4a5ca8c --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/GuideFillInfoSaveDTO.java @@ -0,0 +1,70 @@ +package com.yida.data.school.dto.smart; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.List; + +/** + * 保存迎新填报信息请求类 + * + * @author ZYJ + * @date 2023/5/17 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "GuideFillInfoSaveDTO", description = "保存迎新填报信息请求类") +public class GuideFillInfoSaveDTO implements Serializable { + + private static final long serialVersionUID = -5379563542815778231L; + + @ApiModelProperty(value = "微信openId") + private String openId; + + @ApiModelProperty(value = "部门id") + private Long deptId; + + @ApiModelProperty(value = "指南id") + private Long guideId; + + @ApiModelProperty(value = "头像") + private String avatar; + + @ApiModelProperty(value = "姓名") + private String name; + + @ApiModelProperty(value = "性别. 0-男,1-女") + private Integer sex; + + @ApiModelProperty(value = "身份证号码") + private String idNumber; + + @ApiModelProperty(value = "录取专业") + private String admittedMajor; + + @ApiModelProperty(value = "录取专业ID") + private Long admittedMajorId; + + @ApiModelProperty(value = "录取系部") + private String admittedDepartment; + + @ApiModelProperty(value = "录取系部ID") + private Long admittedDepartmentId; + + @ApiModelProperty(value = "身份证正面照片") + private String idCardRight; + + @ApiModelProperty(value = "身份证反面照片") + private String idCardReverse; + + @ApiModelProperty(value = "录取通知书照片") + private String admissionLetter; + + @ApiModelProperty("校区id") + private Long campusId; +} \ No newline at end of file diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/GuideRosterErrorExportDTO.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/GuideRosterErrorExportDTO.java new file mode 100644 index 0000000..12cc1cf --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/GuideRosterErrorExportDTO.java @@ -0,0 +1,30 @@ +package com.yida.data.school.dto.smart; + +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.annotations.ApiModel; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 指南花名册导入错误返回类 + * + * @author ZYJ + * @date 2023/6/1 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "GuideRosterErrorExportDTO", description = "学生信息导入错误返回类") +public class GuideRosterErrorExportDTO implements Serializable { + + private static final long serialVersionUID = 3208630028278503011L; + + /** + * 错误信息 + */ + @ExcelProperty("错误信息") + private String errorMessage; +} \ No newline at end of file diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/GuideRosterImportDTO.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/GuideRosterImportDTO.java new file mode 100644 index 0000000..39546b4 --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/GuideRosterImportDTO.java @@ -0,0 +1,76 @@ +package com.yida.data.school.dto.smart; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.baomidou.mybatisplus.annotation.TableField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * Excel指南花名册信息导入类 + * + * @author ZYJ + * @date 2021/8/24 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "GuideRosterImportDTO", description = "Excel指南花名册信息导入类") +public class GuideRosterImportDTO implements Serializable { + + private static final long serialVersionUID = 3782716915186380684L; + + /** + * 姓名 + */ + @ExcelProperty(index = 0) + private String fullName; + + /** + * 毕业院校 + */ + @ExcelProperty(index = 1) + private String graduateSchool; + + /** + * 身份证号码 + */ + @ExcelProperty(index = 2) + private String idNumber; + + + /** + * 录取系部 + */ + @ExcelProperty(index = 3) + private String admittedDepartment; + + /** + * 录取专业 + */ + @ExcelProperty(index = 4) + private String admittedMajor; + + + /** + * 录取年级 + */ + @ExcelProperty(index = 5) + private String admittedGrade; + + /** + * 录取班级 + */ + @ExcelProperty(index = 6) + private String admittedClass; + + /** + * 手机号码 + */ + @ExcelProperty(index = 7) + private String mobile; +} \ No newline at end of file diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/GuideRosterSelectPageDTO.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/GuideRosterSelectPageDTO.java new file mode 100644 index 0000000..59293da --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/GuideRosterSelectPageDTO.java @@ -0,0 +1,66 @@ +package com.yida.data.school.dto.smart; + +import com.yida.data.common.core.common.BaseDTO; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideRoster; +import com.yida.data.common.core.enums.RegistrationStatusEnum; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.util.List; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +import java.io.Serializable; + +/** + * 迎新指南花名册后台列表请求类 + * + * @author ZYJ + * @date 2023/5/22 + */ +@Data +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@ApiModel(value = "GuideRosterSelectPageDTO", description = "迎新指南花名册后台列表请求类") +public class GuideRosterSelectPageDTO extends BaseDTO implements Serializable { + + private static final long serialVersionUID = 2382158515196055662L; + + @ApiModelProperty(value = "指南id") + private Long guideId; + + @ApiModelProperty(value = "毕业院校") + private String graduateSchool; + + @ApiModelProperty(value = "姓名") + private String fullName; + + @ApiModelProperty(value = "身份证号码") + private String idNumber; + + @ApiModelProperty(value = "录取专业") + private String admittedMajor; + + @ApiModelProperty(value = "未通过的步骤") + private Long notPassStepId; + + @ApiModelProperty(value = "通过的步骤") + private Long passStepId; + + @ApiModelProperty(value = "是否缴费0=否,1=是") + private Integer payStatus; + + /** + * {@link RegistrationStatusEnum} + */ + @ApiModelProperty(value = "报到状态. 0-未报到,1-报到成功(全部步骤通过)") + private Integer registrationStatus; + + + private List passRosterIdList; + +} \ No newline at end of file diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/GuideSaveDTO.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/GuideSaveDTO.java new file mode 100644 index 0000000..1309e79 --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/GuideSaveDTO.java @@ -0,0 +1,51 @@ +package com.yida.data.school.dto.smart; + +import com.baomidou.mybatisplus.annotation.TableField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.math.BigDecimal; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.List; + +/** + * 保存迎新指南请求类 + * + * @author ZYJ + * @date 2023/5/15 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "GuideSaveDTO", description = "保存迎新指南请求类") +public class GuideSaveDTO implements Serializable { + + private static final long serialVersionUID = 8167376276179823069L; + + @ApiModelProperty(value = "指南id") + private Long id; + + @ApiModelProperty(value = "指南标题") + private String guideTitle; + + @ApiModelProperty(value = "指南前言") + private String guideForeword; + + @ApiModelProperty(value = "资料上报字段,多个以英文逗号分隔") + private String formField; + + @ApiModelProperty(value = "缴费金额") + private BigDecimal money; + + @ApiModelProperty(value = "是否启用二维码缴费,0未启用,1启用") + private Integer moneyStatus; + + @ApiModelProperty(value = "学区id") + private Long campusId; + + @ApiModelProperty(value = "指南步骤列表") + private List stepList; +} \ No newline at end of file diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/GuideSelectPageDTO.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/GuideSelectPageDTO.java new file mode 100644 index 0000000..3aeb274 --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/GuideSelectPageDTO.java @@ -0,0 +1,40 @@ +package com.yida.data.school.dto.smart; + +import com.yida.data.common.core.common.BaseDTO; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuide; +import com.yida.data.common.core.enums.EnableStatusEnum; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.*; +import lombok.experimental.SuperBuilder; + +import java.io.Serializable; + +/** + * 迎新指南后台列表请求类 + * + * @author ZYJ + * @date 2023/5/15 + */ +@Data +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@ApiModel(value = "GuideSelectPageDTO", description = "迎新指南后台列表请求类") +public class GuideSelectPageDTO extends BaseDTO implements Serializable { + + private static final long serialVersionUID = -3256496082335396363L; + + @ApiModelProperty(value = "指南标题") + private String guideTitle; + + @ApiModelProperty(value = "部门id", hidden = true) + private Long deptId; + + /** + * {@link EnableStatusEnum} + */ + @ApiModelProperty("启用状态.0:未启用,1:已启用") + private Integer enableStatus; +} \ No newline at end of file diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/GuideStepSaveDTO.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/GuideStepSaveDTO.java new file mode 100644 index 0000000..9ad89ac --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/GuideStepSaveDTO.java @@ -0,0 +1,65 @@ +package com.yida.data.school.dto.smart; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideStepClass; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideStepClassFix; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideStepDorm; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideStepDormFix; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +/** + * 保存迎新指南步骤请求类 + * + * @author ZYJ + * @date 2023/5/15 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "GuideStepSaveDTO", description = "保存迎新指南步骤请求类") +public class GuideStepSaveDTO implements Serializable { + + private static final long serialVersionUID = -2496615484964480529L; + + @ApiModelProperty(value = "步骤类型") + private Integer stepType; + + @ApiModelProperty(value = "步骤名称") + private String stepName; + + @ApiModelProperty(value = "唯一id") + private String uniqueId; + + @ApiModelProperty(value = "前提步骤唯一id") + private String premiseStepUniqueId; + + @ApiModelProperty(value = "步骤说明") + private String stepDescription; + + @ApiModelProperty(value = "缴费金额") + private BigDecimal money; + + @ApiModelProperty(value = "审核是否需要评语,0否,1是") + private Integer isComment; + + @ApiModelProperty(value = "审核人员id列表") + private List staffIdList; + @ApiModelProperty(value = "预分班级列表") + private List classList; + @ApiModelProperty(value = "预分班级列表") + private List dormList; + @ApiModelProperty(value = "固定班级列表") + private List classFixList; + @ApiModelProperty(value = "固定宿舍列表") + private List dormFixList; +} \ No newline at end of file diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/StaffPassStepDTO.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/StaffPassStepDTO.java new file mode 100644 index 0000000..7aec6db --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/StaffPassStepDTO.java @@ -0,0 +1,41 @@ +package com.yida.data.school.dto.smart; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 职工通过步骤请求类 + * + * @author ZYJ + * @date 2023/6/5 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "StaffPassStepDTO", description = "职工通过步骤请求类") +public class StaffPassStepDTO implements Serializable { + + private static final long serialVersionUID = 4784257912777425471L; + + @ApiModelProperty(value = "关联关系id", required = true) + private Long relationId; + + @ApiModelProperty(value = "花名册id", required = true) + private Long rosterId; + + @ApiModelProperty(value = "职工id", required = true) + private Long staffId; + + @ApiModelProperty(value = "步骤id", required = true) + private Long stepId; + + @ApiModelProperty(value = "评语内容", required = false) + private String commentContent; +} \ No newline at end of file diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/UpdateQrCodeInfoDTO.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/UpdateQrCodeInfoDTO.java new file mode 100644 index 0000000..2de0e8e --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/UpdateQrCodeInfoDTO.java @@ -0,0 +1,34 @@ +package com.yida.data.school.dto.smart; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.List; + +/** + * 保存指南二维码配置请求类 + * + * @author ZYJ + * @date 2023/6/13 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "UpdateQrCodeInfoDTO", description = "保存指南二维码配置请求类") +public class UpdateQrCodeInfoDTO implements Serializable { + + private static final long serialVersionUID = -5982188939970322279L; + + @ApiModelProperty(value = "指南id") + private Long guideId; + + @ApiModelProperty(value = "是否启用自动生成二维码状态. 0:未启用,1:已启用") + private Integer qrCodeEnableStatus; + + @ApiModelProperty(value = "没有二维码时的提示") + private String qrCodeNoticeMessage; +} \ No newline at end of file diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/h5/CreateGuideStepOrderDTO.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/h5/CreateGuideStepOrderDTO.java new file mode 100644 index 0000000..fc1b757 --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/h5/CreateGuideStepOrderDTO.java @@ -0,0 +1,60 @@ +package com.yida.data.school.dto.smart.h5; + +import com.yida.data.common.core.enums.PayWay; +import com.yida.data.common.core.enums.UnionPayTypeEnum; +import com.yida.data.common.core.enums.WxPayTypeEnum; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 生成花名册步骤订单请求类 + * + * @author ZYJ + * @date 2023/6/19 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "CreateGuideStepOrderDTO", description = "生成花名册步骤订单请求类") +public class CreateGuideStepOrderDTO implements Serializable { + + private static final long serialVersionUID = 5371030556983911931L; + + @ApiModelProperty("指南id") + private Long guideId; + +// @ApiModelProperty("步骤id") +// private Long stepId; + + @ApiModelProperty("关联关系id") + private Long relationId; + + @ApiModelProperty("微信授权码") + private String code; + + @ApiModelProperty("部门id") + private Long deptId; + + /** + * 支付方式 + * {@link PayWay} + */ + @ApiModelProperty("支付方式. 写死为5") + private String payWay; + + /** + * 支付类型 + * 银联云闪付: {@link UnionPayTypeEnum} + * 微信类型: {@link WxPayTypeEnum} + */ + @ApiModelProperty("支付类型. 当前可以不填写") + private Integer payType; +} \ No newline at end of file diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/h5/RosterFaceMatchDTO.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/h5/RosterFaceMatchDTO.java new file mode 100644 index 0000000..d0673cc --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/h5/RosterFaceMatchDTO.java @@ -0,0 +1,38 @@ +package com.yida.data.school.dto.smart.h5; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 花名册人脸对比请求类 + * + * @author ZYJ + * @date 2023/6/21 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "RosterFaceMatchDTO", description = "花名册人脸对比请求类") +public class RosterFaceMatchDTO implements Serializable { + + private static final long serialVersionUID = 1474013091202762132L; + + @ApiModelProperty("指南id") + private Long guideId; + + @ApiModelProperty("步骤id") + private Long stepId; + + @ApiModelProperty("关联关系id") + private Long relationId; + + @ApiModelProperty("base64图片信息") + private String base64; +} \ No newline at end of file diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/h5/RosterPageDTO.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/h5/RosterPageDTO.java new file mode 100644 index 0000000..0dbb8f8 --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/smart/h5/RosterPageDTO.java @@ -0,0 +1,39 @@ +package com.yida.data.school.dto.smart.h5; + +import com.yida.data.common.core.common.BaseDTO; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuide; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideRoster; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideRosterRelation; +import com.yida.data.common.core.enums.EnableStatusEnum; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +import java.io.Serializable; + +/** + * 花名册列表h5查询请求类 + * + * @author ZYJ + * @date 2023/7/7 + */ +@Data +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@ApiModel(value = "RosterPageDTO", description = "花名册列表h5查询请求类") +public class RosterPageDTO extends BaseDTO implements Serializable { + + private static final long serialVersionUID = 5839750378167181943L; + + @ApiModelProperty(value = "名称") + private String rosterName; + + @ApiModelProperty(value = "部门id") + private Long deptId; +} \ No newline at end of file diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/transaction/ListApplyFunctionDTO.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/transaction/ListApplyFunctionDTO.java new file mode 100644 index 0000000..afb511a --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/transaction/ListApplyFunctionDTO.java @@ -0,0 +1,55 @@ +package com.yida.data.school.dto.transaction; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import java.time.LocalDateTime; +import java.util.List; +import lombok.Builder; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +@Data +@Builder +public class ListApplyFunctionDTO { + + private Integer pageSize; + + private Integer pageNum; + + private Long id; + + private Long studentId; + + private List studentIdList; + + private String studentName; + + private String studentNumber; + + private String applyCode; + + @ApiModelProperty("有效期开始时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime startTime; + + @ApiModelProperty("有效期结束时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime endTime; + + @TableField(exist = false) + private String deptName; + + private Long schoolId; + private Long campusId; + private Long sectionId; + private Long gradeId; + private Long classId; + +} diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/userLeave/AuditRequestDTO.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/userLeave/AuditRequestDTO.java new file mode 100644 index 0000000..14ca169 --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/userLeave/AuditRequestDTO.java @@ -0,0 +1,72 @@ +package com.yida.data.school.dto.userLeave; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 审核请假提交对象 + */ +@Data +@ApiModel +public class AuditRequestDTO { + + /** + * + */ + @ApiModelProperty(value = "") + private Long id; + + /** + * 流程ID + */ + @ApiModelProperty(value = "流程ID") + private Long processId; + + /** + * 请假主体ID + */ + @ApiModelProperty(value = "请假主体ID") + private Long requestId; + + /** + * 审核人ID + */ + @ApiModelProperty(value = "审核人ID") + private Long approvalId; + + + /** + * 审核结果:1=通过,0=不通过,默认0 + */ + @ApiModelProperty(value = "审核结果:1=通过,0=不通过,默认0") + private Integer approvalResult; + + /** + * 审核不通过的原因 + */ + @ApiModelProperty(value = "审核不通过的原因") + private String approvalReason; + + /** + * 审核顺序 + */ + @ApiModelProperty(value = "审核顺序") + private Integer sort; + + + /** + * 审核顺序 + */ + @ApiModelProperty(value = "审核第几流程ID") + private Long viewId; + + /** + * 审核不通过原因 + */ + @ApiModelProperty(value = "审核不通过原因") + private String refuseReason; +} diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/userLeave/EduLeaveRequestProcessConfigDTO.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/userLeave/EduLeaveRequestProcessConfigDTO.java new file mode 100644 index 0000000..0ce11da --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/userLeave/EduLeaveRequestProcessConfigDTO.java @@ -0,0 +1,93 @@ +package com.yida.data.school.dto.userLeave; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.yida.data.common.core.entity.userLeave.EduLeaveRequestProcessConfig; +import com.yida.data.common.core.entity.userLeave.EduLeaveRequestProcessConfigApplicableDepartments; +import com.yida.data.common.core.entity.userLeave.EduLeaveRequestProcessConfigApprovalUser; +import com.yida.data.common.core.entity.userLeave.EduLeaveRequestProcessConfigView; +import io.swagger.annotations.ApiModelProperty; +import java.time.LocalDateTime; +import java.util.List; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * Entity + * + * @author wjm + * @date 2022-12-01 10:45:56 + */ +@Data +public class EduLeaveRequestProcessConfigDTO { + + /** + * + */ + @ApiModelProperty(value = "") + private Long id; + + /** + * 学生id + */ + @ApiModelProperty(value = "学生id") + private String processName; + + /** + * 流程类型:0=教师,1=学生 + */ + @ApiModelProperty(value = "流程类型:0=教师,1=学生") + private Integer processType; + + /** + * 最小天数 + */ + @ApiModelProperty(value = "最小天数") + private Integer minDays; + + /** + * 最大天数 + */ + @ApiModelProperty(value = "最大天数") + private Integer maxDays; + + + /** + * 是否小于半天 + */ + @ApiModelProperty(value = "是否小于半天1=是,0=否") + private Integer lessHalfDay; + + + /** + * 基于less_half_day 定义半天是几小时 + */ + @ApiModelProperty(value = "基于less_half_day 定义半天是几小时") + private Integer hours; + + /** + * 学校id + */ + @ApiModelProperty(value = "学校id") + private Long schoolId; + + + /** + * 具体的审核流程 + */ + @ApiModelProperty(value = "具体的审核流程") + private List eduLeaveRequestProcessConfigViewList; + + + /** + * 适用人员部门 + */ + @ApiModelProperty(value = "适用人员部门") + private List applicableDepartmentsList; + +} \ No newline at end of file diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/userLeave/LeaveRequestPageDTO.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/userLeave/LeaveRequestPageDTO.java new file mode 100644 index 0000000..eb379eb --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/userLeave/LeaveRequestPageDTO.java @@ -0,0 +1,51 @@ +package com.yida.data.school.dto.userLeave; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.yida.data.common.core.common.BaseDTO; +import io.swagger.annotations.ApiModelProperty; + +import java.time.LocalDateTime; +import java.util.List; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class LeaveRequestPageDTO extends BaseDTO { + + @ApiModelProperty("请假人姓名") + private String requestUserName; + @ApiModelProperty("请假类型:0教师请假,1学生请假") + private Integer requestType; + @ApiModelProperty("所属学校ID") + private Long schoolId; + @ApiModelProperty("审核状态:0待审核,3审核中,4已审核(包含1已通过,2已拒绝)") + private Integer status; + private List statusList; + private List studentIdList; + @ApiModelProperty("请假主体ID集合") + private List idList; + + @ApiModelProperty(value = "开始时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime startDateTime; + + @ApiModelProperty(value = "结束时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime endDateTime; + + private Long campusId; + private Long sectionId; + private Long gradeId; + private Long classId; + + @ApiModelProperty("mysql查询学生列表. 0:不查询, 1:查询") + private Integer selectStudentId; +} diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/userLeave/ListUserRequestDTO.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/userLeave/ListUserRequestDTO.java new file mode 100644 index 0000000..1b4e4a5 --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/userLeave/ListUserRequestDTO.java @@ -0,0 +1,36 @@ +package com.yida.data.school.dto.userLeave; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.time.LocalDateTime; +import java.util.List; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +@ApiModel("查询用户请假数据") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class ListUserRequestDTO { + + @ApiModelProperty("请假人ID") + private List userIdList; + + @ApiModelProperty("0教师请假,1学生请假") + private Integer requestType; + + @ApiModelProperty("开始时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime startTime; + + @ApiModelProperty("结束时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime endTime; +} diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/userLeave/SendStaffNoticeDTO.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/userLeave/SendStaffNoticeDTO.java new file mode 100644 index 0000000..6f741c3 --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/dto/userLeave/SendStaffNoticeDTO.java @@ -0,0 +1,96 @@ +package com.yida.data.school.dto.userLeave; + +import com.fasterxml.jackson.annotation.JsonFormat; +import java.time.LocalDateTime; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * 发送职工模板消息 数据封装类 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SendStaffNoticeDTO { + + /** + * 学校ID + */ + private Long schoolId; + /** + * 本次审核职工 + */ + private String staffWxId; + + /** + * 本次审核职工 + */ + private String staffName; + + /** + * 学校类型 + */ + private String schoolType; + + /** + * 上一位审核职工 + */ + private String preStaffName; + /** + * 上一位审核职工角色 + */ + private String preStaffRoleName; + + /** + * 学生姓名 / 职工姓名 + */ + private String requestUserName; + /** + * 学生所属班级名称 / 职工所属部门 + */ + private String requestUserDeptName; + /** + * 请假时间 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime requestTime; + /** + * 请假原因 + */ + private String requestReason; + + /** + * 请假去向 + */ + private String requestFor; + + /** + * 请假开始时间 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH") + private LocalDateTime requestStartTime; + /** + * 请假结束时间 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH") + private LocalDateTime requestEndTime; + + + /** + * 审批结果 1已通过,0未通过 + */ + private Integer status; + + /** + * 请假类型 + */ + private Integer Type; + +} diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/fallback/facility/RemoteDormitoryServiceFallback.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/fallback/facility/RemoteDormitoryServiceFallback.java index a75b8af..a4ae5a5 100644 --- a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/fallback/facility/RemoteDormitoryServiceFallback.java +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/fallback/facility/RemoteDormitoryServiceFallback.java @@ -3,6 +3,7 @@ package com.yida.data.school.fallback.facility; import com.yida.data.common.core.annotation.Fallback; import com.yida.data.common.core.common.ResultBean; import com.yida.data.common.core.entity.school.EduDormitory; +import com.yida.data.common.core.entity.school.EduDormitoryMaster; import com.yida.data.common.core.entity.school.EduDormitoryRoom; import com.yida.data.school.dto.index.EditPersonNumDTO; import com.yida.data.school.dto.index.ListDormRoomDTO; @@ -105,6 +106,11 @@ public class RemoteDormitoryServiceFallback implements FallbackFactory dtos) { + return null; + } + /** * 获取宿舍 * @@ -128,6 +134,16 @@ public class RemoteDormitoryServiceFallback implements FallbackFactory getDormNoPermission(Long id) { return null; } + + @Override + public ResultBean> getDormBySchoolId(Long schoolId) { + return null; + } + + @Override + public ResultBean> listDormRoomNoAuth(ListDormRoomDTO dto) { + return null; + } }; } } diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/fallback/index/RemoteDeptHomeInfoServiceFallback.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/fallback/index/RemoteDeptHomeInfoServiceFallback.java new file mode 100644 index 0000000..d6561ba --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/fallback/index/RemoteDeptHomeInfoServiceFallback.java @@ -0,0 +1,37 @@ +package com.yida.data.school.fallback.index; + +import com.yida.data.common.core.annotation.Fallback; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.school.EduDeptHomeApp; +import com.yida.data.school.dto.leave.ListStudentRequestDetailDTO; +import com.yida.data.school.dto.userLeave.ListUserRequestDTO; +import com.yida.data.school.feign.index.RemoteDeptHomeIndexService; +import com.yida.data.school.feign.leave.RemoteLeaveRequestService; +import com.yida.data.school.vo.userLeave.EduLeaveRequestUserVO; +import feign.hystrix.FallbackFactory; +import java.util.List; +import lombok.extern.slf4j.Slf4j; + +/** + * RemoteDeptHomeIndexService fallback处理类 + * + * @author ZYJ + * @date 2022/8/26 + */ +@Slf4j +@Fallback +public class RemoteDeptHomeInfoServiceFallback implements FallbackFactory { + + @Override + public RemoteDeptHomeIndexService create(Throwable throwable) { + log.error("RemoteDeptHomeIndexService fallback reason:{}", throwable.getMessage()); + + return new RemoteDeptHomeIndexService() { + + @Override + public ResultBean> getDeptAppList(Long schoolId) { + return null; + } + }; + } +} diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/fallback/leave/RemoteLeaveRequestServiceFallback.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/fallback/leave/RemoteLeaveRequestServiceFallback.java index 2116044..eb6b663 100644 --- a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/fallback/leave/RemoteLeaveRequestServiceFallback.java +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/fallback/leave/RemoteLeaveRequestServiceFallback.java @@ -3,8 +3,11 @@ package com.yida.data.school.fallback.leave; import com.yida.data.common.core.annotation.Fallback; import com.yida.data.common.core.common.ResultBean; import com.yida.data.school.dto.leave.ListStudentRequestDetailDTO; +import com.yida.data.school.dto.userLeave.ListUserRequestDTO; import com.yida.data.school.feign.leave.RemoteLeaveRequestService; +import com.yida.data.school.vo.userLeave.EduLeaveRequestUserVO; import feign.hystrix.FallbackFactory; +import java.util.List; import lombok.extern.slf4j.Slf4j; /** @@ -22,16 +25,16 @@ public class RemoteLeaveRequestServiceFallback implements FallbackFactory existRequest(ListStudentRequestDetailDTO dto) { return null; } + + @Override + public ResultBean> findList(ListUserRequestDTO dto) { + return null; + } }; } } diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/fallback/schoolConfig/RemoteEduSchoolFuncationConfigServiceFallback.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/fallback/schoolConfig/RemoteEduSchoolFuncationConfigServiceFallback.java new file mode 100644 index 0000000..ce6b031 --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/fallback/schoolConfig/RemoteEduSchoolFuncationConfigServiceFallback.java @@ -0,0 +1,37 @@ +package com.yida.data.school.fallback.schoolConfig; + +import com.yida.data.common.core.annotation.Fallback; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.school.EduSchoolFunctionConfig; +import com.yida.data.school.feign.schoolConfig.RemoteEduSchoolFuncationConfigService; +import feign.hystrix.FallbackFactory; +import java.util.List; +import lombok.extern.slf4j.Slf4j; + +/** + * RemoteEduSchoolFuncationConfigService fallback处理类 + */ +@Slf4j +@Fallback +public class RemoteEduSchoolFuncationConfigServiceFallback implements FallbackFactory { + + @Override + public RemoteEduSchoolFuncationConfigService create(Throwable throwable) { + log.error("RemoteEduSchoolFuncationConfigService fallback reason:{}", throwable.getMessage()); + + return new RemoteEduSchoolFuncationConfigService() { + + @Override + public ResultBean> getSchoolFunctionConfigListByCondition() { + return null; + } + + @Override + public ResultBean checkSchoolFunctionCode(Long schoolId, String code) { + return null; + } + + + }; + } +} diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/fallback/smart/RemoteSmartWelcomeServiceFallback.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/fallback/smart/RemoteSmartWelcomeServiceFallback.java new file mode 100644 index 0000000..e23cddf --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/fallback/smart/RemoteSmartWelcomeServiceFallback.java @@ -0,0 +1,46 @@ +package com.yida.data.school.fallback.smart; + +import com.yida.data.common.core.annotation.Fallback; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideRosterRelation; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideStep; +import com.yida.data.school.feign.smart.RemoteSmartWelcomeService; +import com.yida.data.school.feign.transaction.RemoteProductOrderService; +import feign.hystrix.FallbackFactory; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +/** + * RemoteSmartWelcomeService fallback处理类 + * + * @author ZYJ + * @date 2023/5/17 + */ +@Slf4j +@Fallback +public class RemoteSmartWelcomeServiceFallback implements FallbackFactory { + + @Override + public RemoteSmartWelcomeService create(Throwable throwable) { + log.error("RemoteSmartWelcomeService fallback reason:{}", throwable.getMessage()); + + return new RemoteSmartWelcomeService() { + + @Override + public ResultBean getOpenIdRelation(String openId, Long deptId) { + return null; + } + + @Override + public ResultBean> listStepInfo(Long relationId, Long guideId) { + return null; + } + + @Override + public ResultBean updateGuideRosterOrderStatus() { + return null; + } + }; + } +} diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/feign/facility/RemoteDormitoryService.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/feign/facility/RemoteDormitoryService.java index 9028158..d5392d2 100644 --- a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/feign/facility/RemoteDormitoryService.java +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/feign/facility/RemoteDormitoryService.java @@ -3,6 +3,7 @@ package com.yida.data.school.feign.facility; import com.yida.data.common.core.common.ResultBean; import com.yida.data.common.core.entity.constant.FebsServerConstant; import com.yida.data.common.core.entity.school.EduDormitory; +import com.yida.data.common.core.entity.school.EduDormitoryMaster; import com.yida.data.common.core.entity.school.EduDormitoryRoom; import com.yida.data.school.dto.index.EditPersonNumDTO; import com.yida.data.school.dto.index.ListDormRoomDTO; @@ -17,7 +18,7 @@ import org.springframework.web.bind.annotation.RequestParam; import java.util.List; @FeignClient(value = FebsServerConstant.EDU_SCHOOL, contextId = "dormitoryServiceClient", - fallbackFactory = RemoteDormitoryServiceFallback.class) + fallbackFactory = RemoteDormitoryServiceFallback.class) public interface RemoteDormitoryService { /** @@ -36,6 +37,9 @@ public interface RemoteDormitoryService { @PostMapping("/facility/dormRoom/listDormRoom") ResultBean> listDormRoom(@RequestBody ListDormRoomDTO dto); + @PostMapping("/in/facility/dormRoom/listDormRoom") + ResultBean> listDormRoomNoAuth(@RequestBody ListDormRoomDTO dto); + /** * 查询寝室 * @@ -62,7 +66,7 @@ public interface RemoteDormitoryService { */ @GetMapping("/facility/dormRoom/getDormRoomByNameAndDorm") ResultBean getDormRoomByNameAndDorm(@RequestParam("name") String name, - @RequestParam("dormId") Long dormId); + @RequestParam("dormId") Long dormId); /** * 根据名称查询宿舍 @@ -72,7 +76,7 @@ public interface RemoteDormitoryService { */ @GetMapping("/facility/dorm/getDormByName") ResultBean getDormByName(@RequestParam("name") String name, - @RequestParam("schoolId") Long schoolId); + @RequestParam("schoolId") Long schoolId); /** * 修改寝室入住的人数 @@ -82,6 +86,14 @@ public interface RemoteDormitoryService { @PostMapping("/facility/dormRoom/editPersonNum") ResultBean editPersonNum(@RequestBody List dtos); + /** + * 修改寝室入住的人数 + * + * @return + */ + @PostMapping("in/facility/dormRoom/editPersonNum") + ResultBean editPersonNumNoPermission(@RequestBody List dtos); + /** * 获取宿舍 * @@ -101,4 +113,8 @@ public interface RemoteDormitoryService { */ @GetMapping("/in/facility/dorm/getDorm") ResultBean getDormNoPermission(@RequestParam("id") Long id); + + @GetMapping("/in/facility/dorm/getDormListBySchoolId") + ResultBean> getDormBySchoolId(@RequestParam("schoolId") Long schoolId); + } diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/feign/index/RemoteDeptHomeIndexService.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/feign/index/RemoteDeptHomeIndexService.java new file mode 100644 index 0000000..7dacde0 --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/feign/index/RemoteDeptHomeIndexService.java @@ -0,0 +1,27 @@ +package com.yida.data.school.feign.index; + +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.constant.FebsServerConstant; +import com.yida.data.common.core.entity.school.EduDeptHomeApp; +import com.yida.data.school.dto.leave.ListStudentRequestDetailDTO; +import com.yida.data.school.dto.userLeave.ListUserRequestDTO; +import com.yida.data.school.fallback.index.RemoteDeptHomeInfoServiceFallback; +import com.yida.data.school.fallback.leave.RemoteLeaveRequestServiceFallback; +import com.yida.data.school.vo.userLeave.EduLeaveRequestUserVO; +import java.util.List; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; + +@FeignClient(value = FebsServerConstant.EDU_SCHOOL, contextId = "deptHomeIndexServiceClient", + fallbackFactory = RemoteDeptHomeInfoServiceFallback.class) +public interface RemoteDeptHomeIndexService { + + /** + * 查询学校对应的小程序 + */ + @GetMapping("/in/index/home/getDeptAppList") + ResultBean> getDeptAppList(@RequestParam Long schoolId); + +} diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/feign/leave/RemoteLeaveRequestService.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/feign/leave/RemoteLeaveRequestService.java index cf2edff..1ef904f 100644 --- a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/feign/leave/RemoteLeaveRequestService.java +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/feign/leave/RemoteLeaveRequestService.java @@ -3,7 +3,10 @@ package com.yida.data.school.feign.leave; import com.yida.data.common.core.common.ResultBean; import com.yida.data.common.core.entity.constant.FebsServerConstant; import com.yida.data.school.dto.leave.ListStudentRequestDetailDTO; +import com.yida.data.school.dto.userLeave.ListUserRequestDTO; import com.yida.data.school.fallback.leave.RemoteLeaveRequestServiceFallback; +import com.yida.data.school.vo.userLeave.EduLeaveRequestUserVO; +import java.util.List; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; @@ -11,7 +14,7 @@ import org.springframework.web.bind.annotation.PostMapping; * @author ccl */ @FeignClient(value = FebsServerConstant.EDU_SCHOOL, contextId = "leaveRequestServiceClient", - fallbackFactory = RemoteLeaveRequestServiceFallback.class) + fallbackFactory = RemoteLeaveRequestServiceFallback.class) public interface RemoteLeaveRequestService { /** @@ -22,4 +25,12 @@ public interface RemoteLeaveRequestService { */ @PostMapping("/in/request/leaveRequest/existRequest") ResultBean existRequest(ListStudentRequestDetailDTO dto); + + /** + * @param dto + * @return + */ + @PostMapping("/in/eduLeaveRequestUser/findList") + ResultBean> findList(ListUserRequestDTO dto); + } diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/feign/schoolConfig/RemoteEduSchoolFuncationConfigService.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/feign/schoolConfig/RemoteEduSchoolFuncationConfigService.java new file mode 100644 index 0000000..c618304 --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/feign/schoolConfig/RemoteEduSchoolFuncationConfigService.java @@ -0,0 +1,36 @@ +package com.yida.data.school.feign.schoolConfig; + +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.constant.FebsServerConstant; +import com.yida.data.common.core.entity.school.EduSchoolFunctionConfig; +import com.yida.data.school.fallback.schoolConfig.RemoteEduSchoolFuncationConfigServiceFallback; +import java.util.List; +import org.apache.ibatis.annotations.Param; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; + +@FeignClient(value = FebsServerConstant.EDU_SCHOOL, contextId = "RemoteEduSchoolFuncationConfigServiceClient", + fallbackFactory = RemoteEduSchoolFuncationConfigServiceFallback.class) +public interface RemoteEduSchoolFuncationConfigService { + + + /** + * 查询学校关键功能点配置 + * + * @param + * @return + */ + @GetMapping("/in/schoolFunctionConfig/getSchoolFunctionConfigListByCondition") + ResultBean> getSchoolFunctionConfigListByCondition(); + + + /** + * 查询学校关键功能点配置 + * + * @param + * @return + */ + @GetMapping("/in/schoolFunctionConfig/checkSchoolFuncationCode") + ResultBean checkSchoolFunctionCode(@RequestParam("schoolId") Long schoolId, @RequestParam("code") String code); +} diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/feign/smart/RemoteSmartWelcomeService.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/feign/smart/RemoteSmartWelcomeService.java new file mode 100644 index 0000000..a23352d --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/feign/smart/RemoteSmartWelcomeService.java @@ -0,0 +1,60 @@ +package com.yida.data.school.feign.smart; + +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.constant.FebsServerConstant; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideRosterRelation; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideStep; +import com.yida.data.school.fallback.smart.RemoteSmartWelcomeServiceFallback; +import com.yida.data.school.fallback.transaction.RemoteProductOrderServiceFallback; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.List; + +/** + * RemoteSmartWelcomeService远程接口 + * + * @author ZYJ + * @date 2023/5/17 + */ +@FeignClient(value = FebsServerConstant.EDU_SCHOOL, contextId = "smartWelcomeServiceClient", + fallbackFactory = RemoteSmartWelcomeServiceFallback.class) +public interface RemoteSmartWelcomeService { + + /** + * 查询openId是否绑定了对应的信息 + * + * @param openId 微信openId + * @param deptId 学校id + * @return com.yida.data.common.core.common.ResultBean + * @author ZYJ + * @date 2023/5/17 15:12 + */ + @GetMapping("/in/eduSmartWelcome/getOpenIdRelation") + ResultBean getOpenIdRelation(@RequestParam String openId, + @RequestParam Long deptId); + + /** + * 查询人员步骤信息 + * + * @param relationId 绑定关系id + * @param guideId 指南id + * @return com.yida.data.common.core.common.ResultBean> + * @author ZYJ + * @date 2023/5/19 15:43 + */ + @GetMapping("/in/eduSmartWelcome/listStepInfo") + ResultBean> listStepInfo(@RequestParam Long relationId, + @RequestParam Long guideId); + + /** + * 更新超时迎新订单状态 + * + * @return com.yida.data.common.core.common.ResultBean + * @author ZYJ + * @date 2023/6/21 13:41 + */ + @GetMapping("/in/eduGuideStepOrder/updateGuideRosterOrderStatus") + ResultBean updateGuideRosterOrderStatus(); +} diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/classCall/ClassCallPushConfigPageInfoVO.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/classCall/ClassCallPushConfigPageInfoVO.java new file mode 100644 index 0000000..6e5722e --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/classCall/ClassCallPushConfigPageInfoVO.java @@ -0,0 +1,37 @@ +package com.yida.data.school.vo.classCall; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.time.LocalDateTime; +import lombok.Data; + +@Data +@ApiModel("点名消息推送配置分页查询信息") +public class ClassCallPushConfigPageInfoVO { + + @ApiModelProperty("课表id") + private Long id; + + @ApiModelProperty("课表名称") + private String name; + + @ApiModelProperty("校区") + private String districtName; + + @ApiModelProperty("年级id") + private Long gradeId; + + @ApiModelProperty("年级") + private String gradeName; + + @ApiModelProperty("学期") + private String semesterName; + + @ApiModelProperty("使用状态,0-使用,1-停用") + private String status; + + @ApiModelProperty("创建时间") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; +} diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/index/HomeInfoVO.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/index/HomeInfoVO.java index 0eac9db..585efdd 100644 --- a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/index/HomeInfoVO.java +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/index/HomeInfoVO.java @@ -1,6 +1,7 @@ package com.yida.data.school.vo.index; import com.yida.data.common.core.entity.home.EduHomeFunction; +import com.yida.data.common.core.entity.school.EduDeptHomeApp; import com.yida.data.common.core.entity.school.EduSchoolHomeAnnouncement; import com.yida.data.common.core.entity.school.EduSchoolHomeApp; import com.yida.data.common.core.entity.school.EduSchoolHomeCover; @@ -39,4 +40,6 @@ public class HomeInfoVO { private EduSchoolHomeNews news; private Integer deptType; + @ApiModelProperty("关联小程序List:新版") + private List eduDeptHomeAppList; } diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/index/ManuscriptPageInfoVO.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/index/ManuscriptPageInfoVO.java index 8287cf4..189b871 100644 --- a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/index/ManuscriptPageInfoVO.java +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/index/ManuscriptPageInfoVO.java @@ -11,7 +11,6 @@ import lombok.Data; @ApiModel("稿件分页信息") @Data public class ManuscriptPageInfoVO { - private Long id; @ApiModelProperty("标题") @@ -42,7 +41,4 @@ public class ManuscriptPageInfoVO { @ApiModelProperty("标签:以逗号分隔") private String labels; - - @ApiModelProperty("状态") - private Integer status; } diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/news/SchoolNoticePageVO.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/news/SchoolNoticePageVO.java index 273bcdf..b2a12d9 100644 --- a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/news/SchoolNoticePageVO.java +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/news/SchoolNoticePageVO.java @@ -13,6 +13,7 @@ import lombok.Data; @Data @ApiModel("分页查询数据") public class SchoolNoticePageVO { + private Long id; @ApiModelProperty("发送时间") @@ -23,6 +24,9 @@ public class SchoolNoticePageVO { @ApiModelProperty("标题") private String title; + @ApiModelProperty("作者") + private String author; + @ApiModelProperty("描述") private String description; diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/screen/SchoolDashboardInfoVO.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/screen/SchoolDashboardInfoVO.java new file mode 100644 index 0000000..b6a3703 --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/screen/SchoolDashboardInfoVO.java @@ -0,0 +1,130 @@ +package com.yida.data.school.vo.screen; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.yida.data.common.core.entity.screen.EduSchoolDashboardDataBase; +import com.yida.data.common.core.entity.screen.EduSchoolDashboardDataTeacher; +import com.yida.data.school.dto.screen.SchoolDashboardBaseSaveDTO; +import com.yida.data.school.dto.screen.SchoolDashboardTeacherSaveDTO; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalDate; +import java.util.List; + +/** + * 校园大数据详情返回数据 + * + * @author ZYJ + * @date 2021/12/24 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "SchoolDashboardInfoVO", description = "校园大数据详情返回数据") +public class SchoolDashboardInfoVO implements Serializable { + + private static final long serialVersionUID = -6252907885213608870L; + + @ApiModelProperty(value = "主键") + private Long id; + + @ApiModelProperty(value = "学校id") + private Long schoolId; + + @ApiModelProperty(value = "大屏名称") + private String title; + + @ApiModelProperty(value = "学校logo地址") + private String headerUrl; + + @ApiModelProperty(value = "模板类型1:单页,2双页,3.。。") + private Integer modeType; + + @ApiModelProperty(value = "所属区域") + private String area; + + @ApiModelProperty(value = "地址") + private String address; + + @ApiModelProperty(value = "学校创建时间") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") + private LocalDate schoolCreateDate; + + @ApiModelProperty(value = "学校占地面积") + private Integer schoolArea; + + @ApiModelProperty(value = "主管部门") + private String competentDepartment; + + @ApiModelProperty(value = "办学类型") + private String eduType; + + @ApiModelProperty(value = "院校特色") + private String eduFeature; + + @ApiModelProperty(value = "院校类型") + private String institutionType; + + @ApiModelProperty(value = "硕士点") + private Integer masterNum; + + @ApiModelProperty(value = "博士点") + private Integer doctorNum; + + @ApiModelProperty(value = "重点学科数") + private Integer keyDisciplinesNum; + + @ApiModelProperty(value = "科研项目数") + private Integer researchProjectNum; + + @ApiModelProperty(value = "学校简介") + private String eduIntroduction; + + @ApiModelProperty(value = "办学理念") + private String eduPhilosophy; + + @ApiModelProperty(value = "办学使命") + private String eduMission; + + @ApiModelProperty(value = "办学校训") + private String eduMotto; + + @ApiModelProperty(value = "校园风采") + private String campusStyle; + + @ApiModelProperty(value = "官方电话") + private String telephone; + + @ApiModelProperty(value = "教师人数") + private Integer teacherNum; + + @ApiModelProperty(value = "院系数量") + private Integer departmentNum; + + @ApiModelProperty(value = "一级学科数量") + private Integer firstLevelDisciplineNum; + + @ApiModelProperty(value = "二级学科数量") + private Integer secondaryDisciplineNum; + + @ApiModelProperty(value = "班级数") + private Integer classNum; + + @ApiModelProperty(value = "学生人数") + private Integer studentNum; + + @ApiModelProperty(value = "基础建设集合") + private List baseList; + + @ApiModelProperty(value = "师资力量集合") + private List teacherList; +} \ No newline at end of file diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/ClassFixImportVO.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/ClassFixImportVO.java new file mode 100644 index 0000000..55eae30 --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/ClassFixImportVO.java @@ -0,0 +1,106 @@ +package com.yida.data.school.vo.smart; + +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.List; + +/** + * Excel职工信息导入类 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "ClassFixImportDTO", description = "Excel固定班级学生导入类") +public class ClassFixImportVO implements Serializable { + + private static final long serialVersionUID = -3772088981386664273L; + + /** + * 身份证号 + */ + @ApiModelProperty(value = "错误数据LIST-身份证号") + private List errorIdNumberList; + + + private List fixImportVOList; + + + @Data + public class FixImportVO { + + /** + * 校区 + */ + @ApiModelProperty(value = "校区") + private Long campusId; + + /** + * 校区 + */ + @ApiModelProperty(value = "校区") + private String campusName; + + /** + * 学段 + */ + @ApiModelProperty(value = "学段") + private Long sectionId; + + /** + * 学段 + */ + @ApiModelProperty(value = "学段") + private String sectionName; + + /** + * 年级 + */ + @ApiModelProperty(value = "年级") + private Long gradeId; + + /** + * 年级 + */ + @ApiModelProperty(value = "年级") + private String gradeName; + + /** + * 班级 + */ + @ApiModelProperty(value = "班级") + private Long classId; + + /** + * 班级 + */ + @ApiModelProperty(value = "班级") + private String className; + + /** + * 姓名 + */ + @ApiModelProperty(value = "姓名") + private Long rosterId; + + /** + * 姓名 + */ + @ApiModelProperty(value = "姓名") + private String rosterName; + + + /** + * 身份证号 + */ + @ApiModelProperty(value = "身份证号") + private String idNumber; + } + + +} \ No newline at end of file diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/ClassImportVO.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/ClassImportVO.java new file mode 100644 index 0000000..9eebaa7 --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/ClassImportVO.java @@ -0,0 +1,116 @@ +package com.yida.data.school.vo.smart; + +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.io.Serializable; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * Excel职工信息导入类 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "ClassImportDTO", description = "Excel预选班级导入类") +public class ClassImportVO implements Serializable { + + + private static final long serialVersionUID = -5111122101235379190L; + /** + * 校区 + */ + @ApiModelProperty(value = "校区") + private Long campusId; + + /** + * 校区 + */ + @ApiModelProperty(value = "校区") + private String campusName; + + /** + * 学段 + */ + @ApiModelProperty(value = "学段") + private Long sectionId; + + /** + * 学段 + */ + @ApiModelProperty(value = "学段") + private String sectionName; + + /** + * 年级 + */ + @ApiModelProperty(value = "年级") + private Long gradeId; + + /** + * 年级 + */ + @ApiModelProperty(value = "年级") + private String gradeName; + + /** + * 班级 + */ + @ApiModelProperty(value = "班级") + private Long classId; + + /** + * 班级 + */ + @ApiModelProperty(value = "班级") + private String className; + + + /** + * 系部 + */ + @ApiModelProperty(value = "系部") + private Long departmentId; + + + /** + * 系部 + */ + @ApiModelProperty(value = "系部") + private String departmentName; + + /** + * 专业 + */ + @ApiModelProperty(value = "专业") + private Long majorId; + + + /** + * 专业 + */ + @ApiModelProperty(value = "专业") + private String majorName; + + /** + * 预设人数 + */ + @ApiModelProperty(value = "预设人数") + private Integer number; + + + /** + * 男生占比 + */ + @ApiModelProperty(value = "男生占比") + private Integer male; + + /** + * 女生占比 + */ + @ApiModelProperty(value = "女生占比") + private Integer female; + +} \ No newline at end of file diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/DormImportFixVO.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/DormImportFixVO.java new file mode 100644 index 0000000..ad6428d --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/DormImportFixVO.java @@ -0,0 +1,77 @@ +package com.yida.data.school.vo.smart; + +import com.yida.data.school.vo.smart.ClassFixImportVO.FixImportVO; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.io.Serializable; +import java.util.List; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * Excel职工信息导入类 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "DormImportDTO", description = "Excel预选宿舍导入类") +public class DormImportFixVO implements Serializable { + + /** + * 身份证号 + */ + @ApiModelProperty(value = "错误数据LIST-身份证号") + private List errorIdNumberList; + + + private List fixImportVOList; + + + @Data + public class FixImportVO { + + /** + * 花名册ID + */ + @ApiModelProperty(value = "花名册ID") + private Long rosterId; + + /** + * 花名册ID + */ + @ApiModelProperty(value = "花名册姓名") + private String rosterName; + + /** + * 身份证号 + */ + @ApiModelProperty(value = "身份证号") + private String idNumber; + + /** + * 宿舍楼 + */ + @ApiModelProperty(value = "宿舍楼") + private String dormName; + + /** + * 宿舍楼 + */ + @ApiModelProperty(value = "宿舍楼") + private Long dormId; + + /** + * 寝室号 + */ + @ApiModelProperty(value = "宿舍号") + private String dormRoomName; + /** + * 寝室号 + */ + @ApiModelProperty(value = "宿舍号") + private Long dormRoomId; + + } + +} \ No newline at end of file diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/DormImportVO.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/DormImportVO.java new file mode 100644 index 0000000..2ea5030 --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/DormImportVO.java @@ -0,0 +1,80 @@ +package com.yida.data.school.vo.smart; + +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.io.Serializable; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * Excel职工信息导入类 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "DormImportDTO", description = "Excel预选宿舍导入类") +public class DormImportVO implements Serializable { + + private static final long serialVersionUID = -7185619098630344263L; + /** + * 系部 + */ + @ApiModelProperty(value = "系部") + private Long departmentId; + + /** + * 系部 + */ + @ApiModelProperty(value = "系部") + private String departmentName; + + /** + * 专业 + */ + @ApiModelProperty(value = "专业") + private Long majorId; + + /** + * 专业 + */ + @ApiModelProperty(value = "专业") + private String majorName; + + /** + * 宿舍楼 + */ + @ApiModelProperty(value = "宿舍楼") + private String dormName; + + /** + * 宿舍楼 + */ + @ApiModelProperty(value = "宿舍楼") + private Long dormId; + + /** + * 寝室号 + */ + @ApiModelProperty(value = "宿舍号") + private String dormRoomName; + /** + * 寝室号 + */ + @ApiModelProperty(value = "宿舍号") + private Long dormRoomId; + + /** + * 性别 + */ + @ApiModelProperty(value = "性别,0男1女") + private Integer gender; + + /** + * 人数 + */ + @ApiModelProperty(value = "人数") + private String realNumber; + +} \ No newline at end of file diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/ExportRosterDataVO.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/ExportRosterDataVO.java new file mode 100644 index 0000000..ada6495 --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/ExportRosterDataVO.java @@ -0,0 +1,46 @@ +package com.yida.data.school.vo.smart; + +import com.yida.data.common.core.enums.FileDealStatusEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 下载花名册情况-实体 + * + * @author ZYJ + * @date 2023-06-12 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class ExportRosterDataVO implements Serializable { + + private static final long serialVersionUID = 5078408929378786595L; + + @ApiModelProperty("本次操作标识") + private String key; + + @ApiModelProperty("进度 0-100") + private Integer percent; + + /** + * {@link FileDealStatusEnum} + */ + @ApiModelProperty("导出状态") + private Integer exportStatus; + + @ApiModelProperty("下载总数") + private Integer totalNum; + + @ApiModelProperty("当前下载到第几个") + private Integer currentNum; + + @ApiModelProperty("文件路径") + private String filePath; +} diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/GuideInfoVO.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/GuideInfoVO.java new file mode 100644 index 0000000..099109e --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/GuideInfoVO.java @@ -0,0 +1,71 @@ +package com.yida.data.school.vo.smart; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideStep; +import com.yida.data.common.core.enums.BillStatusEnum; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotEmpty; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +/** + * 迎新指南详情返回数据 + * + * @author ZYJ + * @date 2023/5/15 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "GuideInfoVO", description = "迎新指南详情返回数据") +public class GuideInfoVO implements Serializable { + + private static final long serialVersionUID = 1323061977795150232L; + + @ApiModelProperty("指南id") + private Long id; + + @ApiModelProperty("创建时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + @ApiModelProperty("指南标题") + private String guideTitle; + + @ApiModelProperty(value = "指南前言") + private String guideForeword; + + @ApiModelProperty("启用状态(一个学校只能有一个启用的指南). 0:未启用,1:已启用") + private Integer enableStatus; + + @ApiModelProperty(value = "是否启用自动生成二维码状态. 0:未启用,1:已启用") + private Integer qrCodeEnableStatus; + + @ApiModelProperty(value = "没有二维码时的提示") + private String qrCodeNoticeMessage; + + @ApiModelProperty("步骤集合") + private List stepList; + + @ApiModelProperty(value = "资料上报字段,多个以英文逗号分隔") + private String formField; + + @ApiModelProperty(value = "缴费金额") + private BigDecimal money; + + @ApiModelProperty(value = "是否启用二维码缴费. 0未启用,1启用") + private Integer moneyStatus; + + @ApiModelProperty(value = "学区id") + private Long campusId; +} \ No newline at end of file diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/GuideRosterInfoVO.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/GuideRosterInfoVO.java new file mode 100644 index 0000000..382aecf --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/GuideRosterInfoVO.java @@ -0,0 +1,60 @@ +package com.yida.data.school.vo.smart; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideStep; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; + +/** + * 指南花名册详情返回数据 + * + * @author ZYJ + * @date 2021/12/30 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "GuideRosterInfoVO", description = "指南花名册详情返回数据") +public class GuideRosterInfoVO implements Serializable { + + private static final long serialVersionUID = 8505121253286253299L; + + @ApiModelProperty("花名册id") + private Long rosterId; + + @ApiModelProperty(value = "毕业院校") + private String graduateSchool; + + @ApiModelProperty(value = "姓名") + private String fullName; + + @ApiModelProperty(value = "身份证号码") + private String idNumber; + + @ApiModelProperty(value = "录取专业") + private String admittedMajor; + + @ApiModelProperty("报到时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime checkInTime; + + @ApiModelProperty("头像") + private String avatar; + + @ApiModelProperty(value = "性别. 0-男,1-女") + private Integer sex; + + @ApiModelProperty("步骤信息") + private List stepList; +} \ No newline at end of file diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/GuideRosterSelectPageVO.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/GuideRosterSelectPageVO.java new file mode 100644 index 0000000..3aa5ee8 --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/GuideRosterSelectPageVO.java @@ -0,0 +1,75 @@ +package com.yida.data.school.vo.smart; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.yida.data.common.core.enums.RegistrationStatusEnum; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * 指南花名册返回数据 + * + * @author ZYJ + * @date 2021/12/30 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "GuideRosterSelectPageVO", description = "指南花名册返回数据") +public class GuideRosterSelectPageVO implements Serializable { + + private static final long serialVersionUID = -2482210113912005941L; + + @ApiModelProperty("花名册id") + private Long rosterId; + + @ApiModelProperty(value = "毕业院校") + private String graduateSchool; + + @ApiModelProperty(value = "姓名") + private String fullName; + + @ApiModelProperty(value = "身份证号码") + private String idNumber; + + @ApiModelProperty(value = "录取专业") + private String admittedMajor; + + @ApiModelProperty("报到时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime checkInTime; + + @ApiModelProperty(value = "二维码地址") + private String qrCodeUrl; + + /** + * {@link RegistrationStatusEnum} + */ + @ApiModelProperty(value = "报到状态. 0-未报到,1-报到成功(全部步骤通过)") + private Integer registrationStatus; + + @ApiModelProperty(value = "宿舍楼") + private String dormitory; + + @ApiModelProperty(value = "宿舍号") + private String dormitoryRoom; + + @ApiModelProperty(value = "校区") + private String campusName; + + @ApiModelProperty(value = "系部") + private String sectionName; + @ApiModelProperty(value = "年级") + private String gradeName; + @ApiModelProperty(value = "年级") + private String className; +} \ No newline at end of file diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/GuideSelectPageVO.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/GuideSelectPageVO.java new file mode 100644 index 0000000..28982c0 --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/GuideSelectPageVO.java @@ -0,0 +1,64 @@ +package com.yida.data.school.vo.smart; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * 迎新指南后台列表返回数据 + * + * @author ZYJ + * @date 2023/5/15 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "GuideSelectPageVO", description = "迎新指南后台列表返回数据") +public class GuideSelectPageVO implements Serializable { + + private static final long serialVersionUID = -4164845998590719742L; + + @ApiModelProperty("指南id") + private Long id; + + @ApiModelProperty("创建时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + @ApiModelProperty("指南标题") + private String guideTitle; + + @ApiModelProperty("启用状态(一个学校只能有一个启用的指南). 0:未启用,1:已启用") + private Integer enableStatus; + + @ApiModelProperty(value = "最后一次启用时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime lastEnableDate; + + @ApiModelProperty("花名册总人数") + private Long totalNumber; + + @ApiModelProperty("报名成功人数") + private Long completeNumber; + + @ApiModelProperty(value = "是否启用自动生成二维码状态. 0:未启用,1:已启用") + private Integer qrCodeEnableStatus; + + @ApiModelProperty(value = "没有二维码时的提示") + private String qrCodeNoticeMessage; + + @ApiModelProperty("校区id") + private Long campusId; + + @ApiModelProperty("校区名称") + private String campusName; +} \ No newline at end of file diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/GuideStepColVO.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/GuideStepColVO.java new file mode 100644 index 0000000..8836133 --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/GuideStepColVO.java @@ -0,0 +1,33 @@ +package com.yida.data.school.vo.smart; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 迎新指南花名册表头返回数据 + * + * @author ZYJ + * @date 2023/5/23 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "GuideStepColVO", description = "迎新指南花名册表头返回数据") +public class GuideStepColVO implements Serializable { + + private static final long serialVersionUID = 6687262239147344982L; + + @ApiModelProperty("步骤id") + private Long id; + + @ApiModelProperty("步骤名称") + private String stepName; + + @ApiModelProperty("步骤类型") + private Integer stepType; +} \ No newline at end of file diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/ImportRosterDataVO.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/ImportRosterDataVO.java new file mode 100644 index 0000000..56e33ac --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/ImportRosterDataVO.java @@ -0,0 +1,35 @@ +package com.yida.data.school.vo.smart; + +import io.swagger.annotations.ApiModelProperty; +import java.io.Serializable; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 导入花名册情况-实体 + * + * @author ZYJ + * @date 2023-06-12 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class ImportRosterDataVO implements Serializable { + + private static final long serialVersionUID = -6388906950409396682L; + + @ApiModelProperty("本次操作标识") + private String key; + + @ApiModelProperty("进度 0-100") + private Integer percent; + + @ApiModelProperty("是否下载完成,0-否,1-是") + private Integer finish; + + @ApiModelProperty("错误文件路径") + private String filePath; +} diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/StatisticsGuideRosterVO.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/StatisticsGuideRosterVO.java new file mode 100644 index 0000000..5a00293 --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/StatisticsGuideRosterVO.java @@ -0,0 +1,35 @@ +package com.yida.data.school.vo.smart; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 迎新指南花名册统计信息 + * + * @author ZYJ + * @date 2023/8/28 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "StatisticsGuideRosterVO", description = "迎新指南花名册统计信息") +public class StatisticsGuideRosterVO implements Serializable { + + private static final long serialVersionUID = 8889668433802480660L; + + @ApiModelProperty("卡片名称") + private String cardName; + + @ApiModelProperty("总数量") + private Integer totalNumber; + + @ApiModelProperty("执行数量") + private Integer executeNumber; +} \ No newline at end of file diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/WelcomeImportProgress.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/WelcomeImportProgress.java new file mode 100644 index 0000000..5a77b83 --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/WelcomeImportProgress.java @@ -0,0 +1,39 @@ +package com.yida.data.school.vo.smart; + +import com.yida.data.common.core.enums.FileDealStatusEnum; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.io.Serializable; +import java.util.List; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * Excel职工信息导入类 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "WelcomImportProgress", description = "Excel预选班级导入进度类") +public class WelcomeImportProgress implements Serializable { + + private static final long serialVersionUID = -8812791024900293183L; + @ApiModelProperty(value = "本次导入KEY指") + private String importKey; + /** + * {@link FileDealStatusEnum} + */ + @ApiModelProperty("导出状态") + private Integer importStatus = 0; + @ApiModelProperty(value = "总数,默认100") + private Integer total = 100; + @ApiModelProperty(value = "当前处理数据,默认0") + private Integer current = 0; + @ApiModelProperty(value = "返回数据LIST") + private List dataList; + @ApiModelProperty(value = "错误数据下载地址,若为null,表示无错误数据") + private String errorPath; +} \ No newline at end of file diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/WxConfigVO.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/WxConfigVO.java new file mode 100644 index 0000000..349da6e --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/WxConfigVO.java @@ -0,0 +1,38 @@ +package com.yida.data.school.vo.smart; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 微信js配置信息 + * + * @author ZYJ + * @date 2023/6/5 14:19 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "WxConfigVO", description = "微信js配置信息") +public class WxConfigVO implements Serializable { + + private static final long serialVersionUID = -4691293726173736995L; + + @ApiModelProperty("公众号的唯一标识") + private String appId; + + @ApiModelProperty("生成签名的时间戳") + private String timestamp; + + @ApiModelProperty("生成签名的随机串") + private String nonceStr; + + @ApiModelProperty("签名") + private String signature; +} diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/h5/GuideStepOrderRosterCacheVO.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/h5/GuideStepOrderRosterCacheVO.java new file mode 100644 index 0000000..e219272 --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/h5/GuideStepOrderRosterCacheVO.java @@ -0,0 +1,41 @@ +package com.yida.data.school.vo.smart.h5; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 花名册迎新订单缓存类 + * + * @author ZYJ + * @date 2023/6/20 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "GuideStepOrderRosterCacheVO", description = "花名册迎新订单缓存类") +public class GuideStepOrderRosterCacheVO implements Serializable { + + private static final long serialVersionUID = -2020113248907832940L; + + @ApiModelProperty("指南id") + private Long guideId; + + @ApiModelProperty("步骤id") + private Long stepId; + + @ApiModelProperty("关联关系id") + private Long relationId; + + @ApiModelProperty("学校id") + private Long deptId; + + @ApiModelProperty("订单号") + private String orderNo; +} \ No newline at end of file diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/h5/RosterFaceMatchVO.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/h5/RosterFaceMatchVO.java new file mode 100644 index 0000000..ba126d4 --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/h5/RosterFaceMatchVO.java @@ -0,0 +1,35 @@ +package com.yida.data.school.vo.smart.h5; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 花名册人脸对比返回类 + * + * @author ZYJ + * @date 2023/6/21 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "RosterFaceMatchVO", description = "花名册人脸对比返回类") +public class RosterFaceMatchVO implements Serializable { + + private static final long serialVersionUID = 1474013091202762132L; + + @ApiModelProperty("0-对比成功,1-对比不成功") + private Integer valid; + + @ApiModelProperty("对比分数") + private String score; + + @ApiModelProperty("对比成功的图片") + private String url; +} \ No newline at end of file diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/h5/RosterStepPayInfoVO.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/h5/RosterStepPayInfoVO.java new file mode 100644 index 0000000..62ae386 --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/smart/h5/RosterStepPayInfoVO.java @@ -0,0 +1,53 @@ +package com.yida.data.school.vo.smart.h5; + +import com.yida.data.common.core.enums.PayWay; +import com.yida.data.common.core.enums.UnionPayTypeEnum; +import com.yida.data.common.core.enums.WxPayTypeEnum; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 生成花名册步骤订单返回信息 + * + * @author ZYJ + * @date 2023/6/19 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "RosterStepPayInfoVO", description = "生成花名册步骤订单返回信息") +public class RosterStepPayInfoVO implements Serializable { + + private static final long serialVersionUID = 8825620519104393894L; + + @ApiModelProperty("订单号") + private String orderCode; + + @ApiModelProperty("是否需要跳转支付") + private Boolean needToPay; + + /** + * 支付方式 + * {@link PayWay} + */ + @ApiModelProperty("支付方式") + private String payWay; + + /** + * 支付类型 + * 银联云闪付: {@link UnionPayTypeEnum} + * 微信类型: {@link WxPayTypeEnum} + */ + @ApiModelProperty("具体支付子类型") + private Integer payType; + + @ApiModelProperty("支付地址") + private String payUrl; +} diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/transcation/DownStudentBuyDataVO.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/transcation/DownStudentBuyDataVO.java new file mode 100644 index 0000000..7cc88b9 --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/transcation/DownStudentBuyDataVO.java @@ -0,0 +1,35 @@ +package com.yida.data.school.vo.transcation; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 下载商品购买情况-实体 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class DownStudentBuyDataVO { + + @ApiModelProperty("本次操作标识") + private String key; + + @ApiModelProperty("进度 0-100") + private Integer percent; + + @ApiModelProperty("是否下载完成,0-否,1-是") + private Integer finish; + + @ApiModelProperty("下载总数") + private Integer totalNum; + + @ApiModelProperty("当前下载到第几个") + private Integer currentNum; + + @ApiModelProperty("文件路径") + private String filePath; +} diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/transcation/EduProductBuyStudentVO.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/transcation/EduProductBuyStudentVO.java new file mode 100644 index 0000000..08d98b4 --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/transcation/EduProductBuyStudentVO.java @@ -0,0 +1,44 @@ +package com.yida.data.school.vo.transcation; + + +import com.alibaba.excel.annotation.ExcelProperty; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.yida.data.common.core.entity.EasyExcelExportBaseDTO; +import io.swagger.annotations.ApiModelProperty; +import java.io.Serializable; +import java.time.LocalDateTime; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * @author chenbo + */ +@Data +public class EduProductBuyStudentVO extends EasyExcelExportBaseDTO implements Serializable { + + @ApiModelProperty("学校ID") + private Long schoolId; + @ExcelProperty(index = 0, value = "学校") + @ApiModelProperty("学校名字") + private String schoolName; + @ExcelProperty(index = 1, value = "校区") + @ApiModelProperty("校区名字") + private String campusName; + @ExcelProperty(index = 2, value = "学段") + @ApiModelProperty("学段") + private String sectionName; + @ExcelProperty(index = 3, value = "年级") + @ApiModelProperty("年级名字") + private String gradeName; + @ExcelProperty(index = 4, value = "班级") + @ApiModelProperty("班级名字") + private String className; + @ApiModelProperty("学生ID") + private Long studentId; + @ExcelProperty(index = 5, value = "姓名") + @ApiModelProperty("学生名字") + private String studentName; + @ExcelProperty(index = 6, value = "学号") + @ApiModelProperty("学生学号") + private String studentNumber; +} diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/userLeave/EduLeaveRequestProcessConfigVO.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/userLeave/EduLeaveRequestProcessConfigVO.java new file mode 100644 index 0000000..7160ba4 --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/userLeave/EduLeaveRequestProcessConfigVO.java @@ -0,0 +1,31 @@ +package com.yida.data.school.vo.userLeave; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.yida.data.common.core.entity.userLeave.EduLeaveRequestProcessConfig; +import com.yida.data.common.core.entity.userLeave.EduLeaveRequestProcessConfigApplicableDepartments; +import com.yida.data.common.core.entity.userLeave.EduLeaveRequestProcessConfigApprovalUser; +import com.yida.data.common.core.entity.userLeave.EduLeaveRequestProcessConfigView; +import io.swagger.annotations.ApiModelProperty; +import java.util.List; +import lombok.Data; + +/** + * Entity + * + * @author wjm + * @date 2022-12-01 10:45:56 + */ +@Data +public class EduLeaveRequestProcessConfigVO extends EduLeaveRequestProcessConfig { + + /** + * 具体的审核流程 + */ + private List eduLeaveRequestProcessConfigViewList; + + /** + * 适用人员 + */ + private List applicableDepartmentsList; + +} \ No newline at end of file diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/userLeave/EduLeaveRequestStatisticsVO.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/userLeave/EduLeaveRequestStatisticsVO.java new file mode 100644 index 0000000..cc36d35 --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/userLeave/EduLeaveRequestStatisticsVO.java @@ -0,0 +1,30 @@ +package com.yida.data.school.vo.userLeave; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 请假统计返回类 + * + * @author ZYJ + * @date 2023/12/16 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class EduLeaveRequestStatisticsVO implements Serializable { + + private static final long serialVersionUID = 5765795717989616560L; + + @ApiModelProperty("周统计") + private Long weekNumber; + + @ApiModelProperty("月统计") + private Long monthNumber; +} \ No newline at end of file diff --git a/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/userLeave/EduLeaveRequestUserVO.java b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/userLeave/EduLeaveRequestUserVO.java new file mode 100644 index 0000000..080e836 --- /dev/null +++ b/febs-server/edu-school/edu-school-api/src/main/java/com/yida/data/school/vo/userLeave/EduLeaveRequestUserVO.java @@ -0,0 +1,151 @@ +package com.yida.data.school.vo.userLeave; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.yida.data.common.core.entity.user.EduStaff; +import com.yida.data.common.core.entity.user.EduStudent; +import com.yida.data.common.core.entity.userLeave.EduLeaveRequestProcessRecord; +import com.yida.data.common.core.entity.userLeave.EduLeaveRequestUserView; +import io.swagger.annotations.ApiModelProperty; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * Entity + * + * @author wjm + * @date 2022-12-01 10:51:19 + */ +@Data +public class EduLeaveRequestUserVO { + + /** + * + */ + @ApiModelProperty(value = "") + private Long id; + + /** + * 请假人ID + */ + @ApiModelProperty(value = "请假人ID") + private Long userId; + + /** + * 请假人姓名 + */ + @ApiModelProperty(value = "请假人姓名") + private String userName; + + /** + * 请假人所属部门 + */ + @ApiModelProperty(value = "请假人所属部门") + private String userDeptName; + + /** + * 1:病假,2:事假,0:其他,3年假,4调休假,5婚嫁,6产假,7陪产假 + */ + @ApiModelProperty(value = "1:病假,2:事假,0:其他,3年假,4调休假,5婚嫁,6产假,7陪产假") + private Integer type; + /** + * 0教师请假,1学生请假 + */ + @ApiModelProperty(value = "0教师请假,1学生请假") + private Integer requestType; + + @ApiModelProperty(value = "请假去向") + private String requestFor; + + /** + * 请假理由 + */ + @ApiModelProperty(value = "请假理由") + private String requestReason; + + /** + * 审核不通过原因 + */ + @ApiModelProperty(value = "审核不通过原因") + private String refuseReason; + + /** + * 开始时间 + */ + @ApiModelProperty(value = "开始时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime startTime; + + /** + * 结束时间 + */ + @ApiModelProperty(value = "结束时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime endTime; + + /** + * 审核状态:审核状态:默认0待审核审核,1已通过,2已拒绝,3审核中 + */ + @ApiModelProperty(value = "审核状态:默认0待审核审核,1已通过,2已拒绝,3审核中") + private Integer status; + + /** + * 图片路径,用逗号分割 + */ + @ApiModelProperty(value = "图片路径,用逗号分割") + private String picUrl; + + /** + * + */ + @ApiModelProperty(value = "") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + /** + * + */ + @ApiModelProperty(value = "") + private Long createId; + + /** + * + */ + @ApiModelProperty(value = "") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateDate; + + /** + * + */ + @ApiModelProperty(value = "") + private Long updateId; + + + /** + * 审核流程 + */ + @ApiModelProperty(value = "审核流程") + List eduLeaveRequestUserViewList; + + /** + * 学生信息 + */ + private EduStudent student; + /** + * 职工信息 + */ + private EduStaff staff; +} \ No newline at end of file diff --git a/febs-server/edu-school/edu-school-api/src/main/resources/META-INF/spring.factories b/febs-server/edu-school/edu-school-api/src/main/resources/META-INF/spring.factories index 0a141c4..a01d0cd 100644 --- a/febs-server/edu-school/edu-school-api/src/main/resources/META-INF/spring.factories +++ b/febs-server/edu-school/edu-school-api/src/main/resources/META-INF/spring.factories @@ -9,5 +9,5 @@ com.yida.data.school.fallback.news.RemoteNoticeSystemUserServiceFallback,\ com.yida.data.school.fallback.news.RemoteNoticeUpdateServiceFallback,\ com.yida.data.school.fallback.transaction.RemoteProductOrderServiceFallback,\ com.yida.data.school.fallback.transaction.RemoteProductServiceFallback,\ -com.yida.data.school.fallback.transaction.RemoteStudentApplyServiceFallback,\ -com.yida.data.school.fallback.visitor.RemoteVisitorServiceFallback +com.yida.data.school.fallback.visitor.RemoteVisitorServiceFallback,\ +com.yida.data.school.fallback.smart.RemoteSmartWelcomeServiceFallback diff --git a/febs-server/edu-school/edu-school-biz/pom.xml b/febs-server/edu-school/edu-school-biz/pom.xml index ec149d9..45c854b 100644 --- a/febs-server/edu-school/edu-school-biz/pom.xml +++ b/febs-server/edu-school/edu-school-biz/pom.xml @@ -1,78 +1,84 @@ - - edu-school - com.yida.data.school - 2.2-RELEASE - - 4.0.0 + xmlns="http://maven.apache.org/POM/4.0.0" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + + edu-school + com.yida.data.school + 2.2-RELEASE + + 4.0.0 - edu-school-biz - - - com.yida.data.school - edu-school-api - ${febs-cloud.version} - compile - - - com.yida.data.job - febs-server-job-api - ${febs-cloud.version} - compile - - - com.yida.data.device - edu-device-api - ${febs-cloud.version} - compile - - - com.yida.data.system - febs-server-system-api - ${febs-cloud.version} - compile - - - com.yida.data.user - edu-user-api - ${febs-cloud.version} - compile - - - com.yida.data.common - edu-common - ${febs-cloud.version} - compile - - - com.vdurmont - emoji-java - ${emoji.version} - - - com.yida.data.websocket - edu-websocket-api - 2.2-RELEASE - compile - - + edu-school-biz + + + com.yida.data.school + edu-school-api + ${febs-cloud.version} + compile + + + com.yida.data.job + febs-server-job-api + ${febs-cloud.version} + compile + + + com.yida.data.device + edu-device-api + ${febs-cloud.version} + compile + + + com.yida.data.system + febs-server-system-api + ${febs-cloud.version} + compile + + + com.yida.data.user + edu-user-api + ${febs-cloud.version} + compile + + + com.yida.data.common + edu-common + ${febs-cloud.version} + compile + + + com.vdurmont + emoji-java + ${emoji.version} + + + com.yida.data.websocket + edu-websocket-api + 2.2-RELEASE + compile + + + com.yida.data.attendance + attendance-api + ${febs-cloud.version} + compile + + - - 8 - 8 - - - - - org.springframework.boot - spring-boot-maven-plugin - - ../../../febs-jar - - - - + + 8 + 8 + + + + + org.springframework.boot + spring-boot-maven-plugin + + ../../../febs-jar + + + + \ No newline at end of file diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/EduSchoolApplication.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/EduSchoolApplication.java index 518653c..8dded13 100644 --- a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/EduSchoolApplication.java +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/EduSchoolApplication.java @@ -13,11 +13,9 @@ import org.springframework.context.annotation.EnableAspectJAutoProxy; import org.springframework.scheduling.annotation.EnableAsync; import cc.mrbird.febs.common.security.starter.annotation.EnableFebsCloudResourceServer; -import org.springframework.transaction.annotation.EnableTransactionManagement; @SpringBootConfiguration @EnableAsync -@EnableTransactionManagement @EnableFeignClients(basePackages = "com.yida.data") @SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) @EnableFebsCloudResourceServer diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/controller/EduClassCallController.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/controller/EduClassCallController.java new file mode 100644 index 0000000..de6664d --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/controller/EduClassCallController.java @@ -0,0 +1,58 @@ +package com.yida.data.school.classCall.controller; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.CurrentUser; +import com.yida.data.common.core.entity.classCall.EduClassCall; +import com.yida.data.common.core.entity.classschedule.EduClassSchedule; +import com.yida.data.common.core.utils.FebsUtil; +import com.yida.data.school.classCall.service.EduClassCallService; +import com.yida.data.school.dto.classCall.ClassCallAddDTO; +import com.yida.data.school.dto.classCall.ClassCallPageDTO; +import com.yida.data.school.dto.classSchedule.ClassSchedulePageDTO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@Api(tags = "点名系统") +@Slf4j +@Validated +@RestController +@RequestMapping("/classCall") +@RequiredArgsConstructor +public class EduClassCallController { + + private final EduClassCallService eduClassCallService; + + @ApiOperation("保存课堂点名") + @PostMapping("/saveClassCall") + public ResultBean saveClassCall(@RequestBody ClassCallAddDTO dto) { + eduClassCallService.save(dto); + return ResultBean.buildSuccess(); + } + + @ApiOperation("分页查询历史点名") + @PostMapping("/listClassCallPage") + public ResultBean> listClassCallPage(@Validated @RequestBody ClassCallPageDTO dto) { + if (dto.getSchoolId() == null) { + CurrentUser currentUser = FebsUtil.getCurrentUser(); + dto.setSchoolId(currentUser.getDeptId()); + } + return ResultBean.buildSuccess(eduClassCallService.listClassCallPage(dto)); + } + + @ApiOperation("点名详情") + @GetMapping("/detail") + public ResultBean getDetail(@RequestParam Long callId) { + return ResultBean.buildSuccess(eduClassCallService.getDetailById(callId)); + } + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/controller/EduClassCallPushConfigController.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/controller/EduClassCallPushConfigController.java new file mode 100644 index 0000000..6086cb7 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/controller/EduClassCallPushConfigController.java @@ -0,0 +1,48 @@ +package com.yida.data.school.classCall.controller; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.CurrentUser; +import com.yida.data.common.core.entity.classCall.EduClassCall; +import com.yida.data.common.core.entity.classCall.EduClassCallPushConfig; +import com.yida.data.common.core.utils.FebsUtil; +import com.yida.data.school.classCall.service.EduClassCallPushConfigService; +import com.yida.data.school.classCall.service.EduClassCallService; +import com.yida.data.school.dto.classCall.ClassCallAddDTO; +import com.yida.data.school.dto.classSchedule.ClassSchedulePageDTO; +import com.yida.data.school.vo.classSchedule.ClassSchedulePageInfoVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.v3.oas.annotations.parameters.RequestBody; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +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.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@Api(tags = "点名系统-消息推送配置") +@Slf4j +@Validated +@RestController +@RequestMapping("/classCall/config") +@RequiredArgsConstructor +public class EduClassCallPushConfigController { + + private final EduClassCallPushConfigService eduClassCallPushConfigService; + + @ApiOperation("获取配置信息") + @GetMapping("/get") + public ResultBean getEduClassCallPushConfig() { + return ResultBean.buildSuccess(eduClassCallPushConfigService.getBySchoolId()); + } + + @ApiOperation("保存配置信息") + @PostMapping("/add") + public ResultBean addEduClassCallPushConfig(@RequestBody EduClassCallPushConfig config) { + eduClassCallPushConfigService.addConfig(config); + return ResultBean.buildSuccess(); + } +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/mapper/EduClassCallMapper.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/mapper/EduClassCallMapper.java new file mode 100644 index 0000000..6049246 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/mapper/EduClassCallMapper.java @@ -0,0 +1,19 @@ +package com.yida.data.school.classCall.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yida.data.common.core.entity.classCall.EduClassCall; +import com.yida.data.common.core.entity.classschedule.EduClassSchedule; +import com.yida.data.school.dto.classCall.ClassCallPageDTO; +import com.yida.data.school.dto.classSchedule.ClassSchedulePageDTO; +import com.yida.data.school.vo.classSchedule.ClassSchedulePageInfoVO; +import org.apache.ibatis.annotations.Param; + +/** + * 课堂点名 Mapper + */ +public interface EduClassCallMapper extends BaseMapper { + + IPage listClassCallPage(Page page, @Param("dto") ClassCallPageDTO dto); +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/mapper/EduClassCallPushConfigMapper.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/mapper/EduClassCallPushConfigMapper.java new file mode 100644 index 0000000..7e230ec --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/mapper/EduClassCallPushConfigMapper.java @@ -0,0 +1,8 @@ +package com.yida.data.school.classCall.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.classCall.EduClassCallPushConfig; + +public interface EduClassCallPushConfigMapper extends BaseMapper { + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/mapper/EduClassCallPushConfigProcessMapper.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/mapper/EduClassCallPushConfigProcessMapper.java new file mode 100644 index 0000000..953ab93 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/mapper/EduClassCallPushConfigProcessMapper.java @@ -0,0 +1,8 @@ +package com.yida.data.school.classCall.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.classCall.EduClassCallPushConfigProcess; + +public interface EduClassCallPushConfigProcessMapper extends BaseMapper { + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/mapper/EduClassCallPushConfigProcessStaffMapper.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/mapper/EduClassCallPushConfigProcessStaffMapper.java new file mode 100644 index 0000000..e6117f2 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/mapper/EduClassCallPushConfigProcessStaffMapper.java @@ -0,0 +1,8 @@ +package com.yida.data.school.classCall.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.classCall.EduClassCallPushConfigProcessStaff; + +public interface EduClassCallPushConfigProcessStaffMapper extends BaseMapper { + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/mapper/EduClassCallStudentRecordMapper.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/mapper/EduClassCallStudentRecordMapper.java new file mode 100644 index 0000000..7638a72 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/mapper/EduClassCallStudentRecordMapper.java @@ -0,0 +1,8 @@ +package com.yida.data.school.classCall.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.classCall.EduClassCallStudentRecord; + +public interface EduClassCallStudentRecordMapper extends BaseMapper { + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/service/EduClassCallPushConfigProcessService.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/service/EduClassCallPushConfigProcessService.java new file mode 100644 index 0000000..986569e --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/service/EduClassCallPushConfigProcessService.java @@ -0,0 +1,9 @@ +package com.yida.data.school.classCall.service; + + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.classCall.EduClassCallPushConfigProcess; + +public interface EduClassCallPushConfigProcessService extends IService { + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/service/EduClassCallPushConfigProcessStaffService.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/service/EduClassCallPushConfigProcessStaffService.java new file mode 100644 index 0000000..f833e90 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/service/EduClassCallPushConfigProcessStaffService.java @@ -0,0 +1,9 @@ +package com.yida.data.school.classCall.service; + + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.classCall.EduClassCallPushConfigProcessStaff; + +public interface EduClassCallPushConfigProcessStaffService extends IService { + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/service/EduClassCallPushConfigService.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/service/EduClassCallPushConfigService.java new file mode 100644 index 0000000..2bd8f03 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/service/EduClassCallPushConfigService.java @@ -0,0 +1,12 @@ +package com.yida.data.school.classCall.service; + + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.classCall.EduClassCallPushConfig; + +public interface EduClassCallPushConfigService extends IService { + + EduClassCallPushConfig getBySchoolId(); + + void addConfig(EduClassCallPushConfig eduClassCallPushConfig); +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/service/EduClassCallService.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/service/EduClassCallService.java new file mode 100644 index 0000000..3321520 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/service/EduClassCallService.java @@ -0,0 +1,30 @@ +package com.yida.data.school.classCall.service; + + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.classCall.EduClassCall; +import com.yida.data.common.core.entity.classschedule.EduClassSchedule; +import com.yida.data.school.dto.classCall.ClassCallAddDTO; +import com.yida.data.school.dto.classCall.ClassCallPageDTO; +import com.yida.data.school.dto.classSchedule.ClassSchedulePageDTO; +import com.yida.data.school.vo.classSchedule.ClassSchedulePageInfoVO; + +/** + * 课堂点名 Service接口 + */ +public interface EduClassCallService extends IService { + + /** + * 分页查询点名记录 + * + * @param dto + * @return + */ + IPage listClassCallPage(ClassCallPageDTO dto); + + void save(ClassCallAddDTO dto); + + EduClassCall getDetailById(Long id); + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/service/EduClassCallStudentRecordService.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/service/EduClassCallStudentRecordService.java new file mode 100644 index 0000000..f668110 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/service/EduClassCallStudentRecordService.java @@ -0,0 +1,17 @@ +package com.yida.data.school.classCall.service; + + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.classCall.EduClassCall; +import com.yida.data.common.core.entity.classCall.EduClassCallStudentRecord; +import com.yida.data.school.dto.classCall.ClassCallAddDTO; +import com.yida.data.school.dto.classCall.StudentDTO; +import java.util.List; +import org.springframework.scheduling.annotation.Async; + + +public interface EduClassCallStudentRecordService extends IService { + + @Async + void saveRecord(Long callId, List list); +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/service/impl/EduClassCallPushConfigProcessServiceImpl.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/service/impl/EduClassCallPushConfigProcessServiceImpl.java new file mode 100644 index 0000000..4fe1493 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/service/impl/EduClassCallPushConfigProcessServiceImpl.java @@ -0,0 +1,19 @@ +package com.yida.data.school.classCall.service.impl; + + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.classCall.EduClassCallPushConfigProcess; +import com.yida.data.school.classCall.mapper.EduClassCallPushConfigProcessMapper; +import com.yida.data.school.classCall.service.EduClassCallPushConfigProcessService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + + +@Service +@RequiredArgsConstructor +@Transactional +public class EduClassCallPushConfigProcessServiceImpl extends ServiceImpl + implements EduClassCallPushConfigProcessService { + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/service/impl/EduClassCallPushConfigProcessStaffServiceImpl.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/service/impl/EduClassCallPushConfigProcessStaffServiceImpl.java new file mode 100644 index 0000000..5c2096a --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/service/impl/EduClassCallPushConfigProcessStaffServiceImpl.java @@ -0,0 +1,20 @@ +package com.yida.data.school.classCall.service.impl; + + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.classCall.EduClassCallPushConfigProcessStaff; +import com.yida.data.school.classCall.mapper.EduClassCallPushConfigProcessStaffMapper; +import com.yida.data.school.classCall.service.EduClassCallPushConfigProcessStaffService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + + +@Service +@RequiredArgsConstructor +@Transactional +public class EduClassCallPushConfigProcessStaffServiceImpl extends ServiceImpl + implements + EduClassCallPushConfigProcessStaffService { + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/service/impl/EduClassCallPushConfigServiceImpl.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/service/impl/EduClassCallPushConfigServiceImpl.java new file mode 100644 index 0000000..a67aa67 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/service/impl/EduClassCallPushConfigServiceImpl.java @@ -0,0 +1,62 @@ +package com.yida.data.school.classCall.service.impl; + + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.CurrentUser; +import com.yida.data.common.core.entity.classCall.EduClassCallPushConfig; +import com.yida.data.common.core.entity.classCall.EduClassCallPushConfigProcessStaff; +import com.yida.data.common.core.utils.FebsUtil; +import com.yida.data.school.classCall.mapper.EduClassCallPushConfigMapper; +import com.yida.data.school.classCall.service.EduClassCallPushConfigProcessStaffService; +import com.yida.data.school.classCall.service.EduClassCallPushConfigService; +import java.util.ArrayList; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + + +@Service +@RequiredArgsConstructor +@Transactional +public class EduClassCallPushConfigServiceImpl extends ServiceImpl + implements EduClassCallPushConfigService { + + private final EduClassCallPushConfigProcessStaffService eduClassCallPushConfigProcessStaffService; + + @Override + public EduClassCallPushConfig getBySchoolId() { + CurrentUser currentUser = FebsUtil.getCurrentUser(); + List list = list(Wrappers.lambdaQuery(new EduClassCallPushConfig()) + .eq(EduClassCallPushConfig::getSchoolId, currentUser.getDeptId())); + if (CollUtil.isNotEmpty(list)) { + EduClassCallPushConfig eduClassCallPushConfig = list.get(0); + List staffList = eduClassCallPushConfigProcessStaffService + .list(Wrappers.lambdaQuery(new EduClassCallPushConfigProcessStaff()) + .eq(EduClassCallPushConfigProcessStaff::getConfigId, eduClassCallPushConfig.getId())); + eduClassCallPushConfig.setStaffList(staffList); + return eduClassCallPushConfig; + } else { + return new EduClassCallPushConfig(); + } + } + + @Override + public void addConfig(EduClassCallPushConfig eduClassCallPushConfig) { + //保存主体 + saveOrUpdate(eduClassCallPushConfig); + if (ObjectUtil.isNotNull(eduClassCallPushConfig.getId())) { + eduClassCallPushConfigProcessStaffService.remove(Wrappers.lambdaQuery(new EduClassCallPushConfigProcessStaff()) + .eq(EduClassCallPushConfigProcessStaff::getConfigId, eduClassCallPushConfig.getId())); + } + List staffList = new ArrayList<>(); + for (EduClassCallPushConfigProcessStaff eduClassCallPushConfigProcessStaff : eduClassCallPushConfig.getStaffList()) { + eduClassCallPushConfigProcessStaff.setConfigId(eduClassCallPushConfig.getId()); + staffList.add(eduClassCallPushConfigProcessStaff); + } + eduClassCallPushConfigProcessStaffService.saveBatch(staffList); + } +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/service/impl/EduClassCallServiceImpl.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/service/impl/EduClassCallServiceImpl.java new file mode 100644 index 0000000..80bc58d --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/service/impl/EduClassCallServiceImpl.java @@ -0,0 +1,103 @@ +package com.yida.data.school.classCall.service.impl; + + +import static com.yida.data.common.core.entity.constant.CachePrefixConstant.STAFF_DATA; + +import cc.mrbird.febs.common.redis.service.RedisService; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.CurrentUser; +import com.yida.data.common.core.entity.classCall.EduClassCall; +import com.yida.data.common.core.entity.classCall.EduClassCallStudentRecord; +import com.yida.data.common.core.entity.constant.CachePrefixConstant; +import com.yida.data.common.core.entity.user.EduStaff; +import com.yida.data.common.core.entity.user.EduStudent; +import com.yida.data.common.core.entity.user.EduUserDept; +import com.yida.data.common.core.utils.FebsUtil; +import com.yida.data.common.service.CommonService; +import com.yida.data.school.classCall.mapper.EduClassCallMapper; +import com.yida.data.school.classCall.service.EduClassCallService; +import com.yida.data.school.classCall.service.EduClassCallStudentRecordService; +import com.yida.data.school.dto.classCall.ClassCallAddDTO; +import com.yida.data.school.dto.classCall.ClassCallPageDTO; +import com.yida.data.school.dto.classCall.StudentDTO; +import com.yida.data.system.feign.RemoteDeptService; +import com.yida.data.user.feign.RemoteStaffService; +import com.yida.data.user.feign.RemoteStudentService; +import com.yida.data.user.feign.RemoteTeacherService; +import com.yida.data.user.feign.RemoteUserDeptService; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; +import lombok.RequiredArgsConstructor; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * 课堂点名 Service实现 + */ +@Service +@RequiredArgsConstructor +@Transactional +public class EduClassCallServiceImpl extends ServiceImpl + implements EduClassCallService { + + private final RemoteUserDeptService remoteUserDeptService; + + private final RemoteStaffService remoteStaffService; + + private final RemoteStudentService remoteStudentService; + + private final RedisService redisService; + + private final CommonService commonService; + + private final EduClassCallStudentRecordService eduClassCallStudentRecordService; + + @Override + public IPage listClassCallPage(ClassCallPageDTO dto) { + return baseMapper.listClassCallPage(dto.toPage(), dto); + } + + @Override + public void save(ClassCallAddDTO dto) { + EduClassCall classCall = new EduClassCall(); + BeanUtils.copyProperties(dto, classCall); + CurrentUser currentUser = FebsUtil.getCurrentUser(); + classCall.setSchoolId(currentUser.getDeptId()); + EduUserDept grade = remoteUserDeptService.getParentByDeptId(dto.getClassId()).getData(); + EduUserDept clazz = commonService.getUserDept(dto.getClassId()); + classCall.setClassName(String.join("/", grade.getDeptName(), clazz.getDeptName())); + classCall + .setAbnormalNumber(dto.getStudentList().stream().filter(s -> s.getStatus() == 0).collect(Collectors.toList()).size()); + classCall + .setStudentNum(dto.getStudentList().size()); + + EduStaff staff = (EduStaff) redisService.hget(STAFF_DATA, dto.getTeacherId().toString()); + if (ObjectUtil.isNull(staff)) { + staff = remoteStaffService.getStaff(dto.getTeacherId()).getData(); + } + classCall.setTeacherName(staff.getName()); + save(classCall); + + //保存记录 + eduClassCallStudentRecordService.saveRecord(classCall.getId(), dto.getStudentList()); + + //TODO 推送考勤记录 + } + + @Override + public EduClassCall getDetailById(Long id) { + EduClassCall eduClassCall = getById(id); + List list = eduClassCallStudentRecordService + .list(Wrappers.lambdaQuery(new EduClassCallStudentRecord()) + .eq(EduClassCallStudentRecord::getCallId, id)); + eduClassCall.setStudentRecordList(list); + return eduClassCall; + } +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/service/impl/EduClassCallStudentRecordServiceImpl.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/service/impl/EduClassCallStudentRecordServiceImpl.java new file mode 100644 index 0000000..290cee7 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/classCall/service/impl/EduClassCallStudentRecordServiceImpl.java @@ -0,0 +1,61 @@ +package com.yida.data.school.classCall.service.impl; + + +import cc.mrbird.febs.common.redis.service.RedisService; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.classCall.EduClassCallStudentRecord; +import com.yida.data.common.core.entity.constant.CachePrefixConstant; +import com.yida.data.common.core.entity.user.EduStudent; +import com.yida.data.school.classCall.mapper.EduClassCallStudentRecordMapper; +import com.yida.data.school.classCall.service.EduClassCallStudentRecordService; +import com.yida.data.school.dto.classCall.StudentDTO; +import com.yida.data.user.feign.RemoteStudentService; +import java.util.ArrayList; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + + +@Service +@RequiredArgsConstructor +@Transactional +public class EduClassCallStudentRecordServiceImpl extends ServiceImpl + implements EduClassCallStudentRecordService { + + private final RedisService redisService; + + private final RemoteStudentService remoteStudentService; + + @Override + public void saveRecord(Long callId, List list) { + List eduClassCallStudentRecordList = new ArrayList<>(); + for (StudentDTO studentDTO : list) { + EduStudent student = (EduStudent) redisService + .hget(CachePrefixConstant.STUDENT_DATA, studentDTO.getStudentId().toString()); + if (student == null) { + student = remoteStudentService.getStudentNoPermission(studentDTO.getStudentId()).getData(); + } + EduClassCallStudentRecord eduClassCallStudentRecord = new EduClassCallStudentRecord(); + eduClassCallStudentRecord.setStudentId(student.getId()); + eduClassCallStudentRecord.setStudentName(student.getStuName()); + eduClassCallStudentRecord.setSchoolId(student.getSchoolId()); + eduClassCallStudentRecord.setCampusId(student.getCampusId()); + eduClassCallStudentRecord.setCampusName(student.getCampusName()); + eduClassCallStudentRecord.setSectionId(student.getSectionId()); + eduClassCallStudentRecord.setSectionName(student.getSectionName()); + eduClassCallStudentRecord.setGradeId(student.getGradeId()); + eduClassCallStudentRecord.setGradeName(student.getGradeName()); + eduClassCallStudentRecord.setClassId(student.getClassId()); + eduClassCallStudentRecord.setClassName(student.getClassName()); + eduClassCallStudentRecord + .setGender(ObjectUtil.isNull(student.getStuSex()) ? null : Integer.parseInt(student.getStuSex())); + eduClassCallStudentRecord.setAvatar(student.getAvatar()); + eduClassCallStudentRecord.setStatus(studentDTO.getStatus()); + eduClassCallStudentRecord.setCallId(callId); + eduClassCallStudentRecordList.add(eduClassCallStudentRecord); + } + saveBatch(eduClassCallStudentRecordList); + } +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/config/controller/in/EduSchoolFunctionConfigController.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/config/controller/in/EduSchoolFunctionConfigController.java new file mode 100644 index 0000000..1aabd7d --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/config/controller/in/EduSchoolFunctionConfigController.java @@ -0,0 +1,104 @@ +package com.yida.data.school.config.controller.in; + +import cc.mrbird.febs.common.redis.service.RedisService; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.constant.CachePrefixConstant; +import com.yida.data.common.core.entity.school.EduSchoolFunctionConfig; +import com.yida.data.common.core.enums.EnableStatusEnum; +import com.yida.data.school.config.service.EduSchoolFunctionConfigService; +import com.yida.data.school.dto.config.EduSchoolFunctionConfigDTO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import java.util.ArrayList; +import java.util.List; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.annotations.Param; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@Api(tags = "学校关键功能点配置") +@Slf4j +@RestController +@RequestMapping("/in/schoolFunctionConfig") +@RequiredArgsConstructor +public class EduSchoolFunctionConfigController { + + private final EduSchoolFunctionConfigService eduSchoolFunctionConfigService; + + private final RedisService redisService; + + @ApiOperation("获取当前学校关键功能点配置") + @GetMapping("/getSchoolFunctionConfigListByCondition") + public ResultBean> getSchoolFunctionConfigListByCondition() { + List eduSchoolFunctionConfig = new ArrayList<>(); + +// if (ObjectUtil.isNotNull(dto.getSchool_id())) { +// if (redisService.hHasKey(CachePrefixConstant.SCHOOL_FUNCATION_CODE, dto.getSchool_id().toString())) { +// List eduSchoolFunctionConfigList = (List) redisService +// .hget(CachePrefixConstant.SCHOOL_FUNCATION_CODE, dto.getSchool_id().toString()); +// eduSchoolFunctionConfig.addAll(eduSchoolFunctionConfigList); +// } +// +// if (CollUtil.isEmpty(eduSchoolFunctionConfig)) { +// ResultBean> listResultBean = ResultBean +// .buildSuccess(eduSchoolFunctionConfigService.list(Wrappers.lambdaQuery(new EduSchoolFunctionConfig()) +// .eq(EduSchoolFunctionConfig::getSchool_id, +// dto.getSchool_id()))); +// eduSchoolFunctionConfig.addAll(listResultBean.getData()); +// redisService +// .hset(CachePrefixConstant.SCHOOL_FUNCATION_CODE, dto.getSchool_id().toString(), eduSchoolFunctionConfig); +// } +// } else { +// ResultBean> listResultBean = ResultBean +// .buildSuccess(eduSchoolFunctionConfigService.list()); +// eduSchoolFunctionConfig.addAll(listResultBean.getData()); +// } + + ResultBean> listResultBean = ResultBean + .buildSuccess(eduSchoolFunctionConfigService.list()); + eduSchoolFunctionConfig.addAll(listResultBean.getData()); + + return ResultBean.buildSuccess(eduSchoolFunctionConfig); + } + + + /** + * 查询学校是否开始功能 + * + * @param schoolId + * @param code + * @return + */ + @ApiOperation("查询学校关键功能点配置信息") + @GetMapping("/checkSchoolFuncationCode") + private ResultBean checkSchoolFuncationCode(@Param("schoolId") Long schoolId, @Param("code") String code) { + EduSchoolFunctionConfig eduSchoolFunctionConfig = null; + if (redisService.hHasKey(CachePrefixConstant.SCHOOL_FUNCATION_CODE + schoolId, code)) { + eduSchoolFunctionConfig = (EduSchoolFunctionConfig) redisService + .hget(CachePrefixConstant.SCHOOL_FUNCATION_CODE + schoolId, code); + } else { + eduSchoolFunctionConfig = eduSchoolFunctionConfigService + .getOne(Wrappers.lambdaQuery(new EduSchoolFunctionConfig()) + .eq(EduSchoolFunctionConfig::getSchoolId, schoolId) + .eq(EduSchoolFunctionConfig::getFunctionCode, code)); + if (ObjectUtil.isNotNull(eduSchoolFunctionConfig)) { + redisService + .hset(CachePrefixConstant.SCHOOL_FUNCATION_CODE + schoolId, code, eduSchoolFunctionConfig, + 60 * 60L); + } + } + if (ObjectUtil.isNotNull(eduSchoolFunctionConfig) && ObjectUtil + .equals(EnableStatusEnum.ENABLE_STATUS.getStatus(), eduSchoolFunctionConfig.getState())) { + return ResultBean.buildSuccess(true); + } + return ResultBean.buildSuccess(false); + } + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/config/mapper/EduSchoolFunctionConfigMapper.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/config/mapper/EduSchoolFunctionConfigMapper.java new file mode 100644 index 0000000..8bf4b68 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/config/mapper/EduSchoolFunctionConfigMapper.java @@ -0,0 +1,11 @@ +package com.yida.data.school.config.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.school.EduSchoolFunctionConfig; + +/** + * 学校关键功能点配置 + */ +public interface EduSchoolFunctionConfigMapper extends BaseMapper { + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/config/service/EduSchoolFunctionConfigService.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/config/service/EduSchoolFunctionConfigService.java new file mode 100644 index 0000000..02fbe08 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/config/service/EduSchoolFunctionConfigService.java @@ -0,0 +1,12 @@ +package com.yida.data.school.config.service; + + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.school.EduSchoolFunctionConfig; + +/** + * 学校关键功能点配置 service + */ +public interface EduSchoolFunctionConfigService extends IService { + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/config/service/impl/EduSchoolFunctionConfigServiceImpl.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/config/service/impl/EduSchoolFunctionConfigServiceImpl.java new file mode 100644 index 0000000..6fad543 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/config/service/impl/EduSchoolFunctionConfigServiceImpl.java @@ -0,0 +1,18 @@ +package com.yida.data.school.config.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.school.EduSchoolFunctionConfig; +import com.yida.data.school.config.mapper.EduSchoolFunctionConfigMapper; +import com.yida.data.school.config.service.EduSchoolFunctionConfigService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +@Transactional(propagation = Propagation.SUPPORTS, readOnly = true) +public class EduSchoolFunctionConfigServiceImpl extends ServiceImpl + implements EduSchoolFunctionConfigService { + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/exam/service/impl/CoreExaminationPublishServiceImpl.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/exam/service/impl/CoreExaminationPublishServiceImpl.java index 5b8a7f3..975bca6 100644 --- a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/exam/service/impl/CoreExaminationPublishServiceImpl.java +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/exam/service/impl/CoreExaminationPublishServiceImpl.java @@ -225,7 +225,7 @@ public class CoreExaminationPublishServiceImpl extends private void pushScoreNotice(CoreExamination coreExamination, List studentList) { Dept school = commonService.getDept(coreExamination.getSchoolId()); - EduApp eduApp = commonService.getAppByCodeAndSchool(AppConstant.SCORE_PARENT, null, school.getDeptId()); + EduApp eduApp = commonService.getAppByCodeAndSchool(AppConstant.INDEX_PARENT, null, school.getDeptId()); List studentId = studentList.stream().map(x -> x.getCoreStudentId()).collect(Collectors.toList()); String accessToken = null; EduYidaApp yidaApp = null; diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/facility/controller/InEduDormitoryController.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/facility/controller/InEduDormitoryController.java index 03c8e59..344b76a 100644 --- a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/facility/controller/InEduDormitoryController.java +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/facility/controller/InEduDormitoryController.java @@ -1,10 +1,20 @@ package com.yida.data.school.facility.controller; +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.yida.data.common.core.common.ResultBean; import com.yida.data.common.core.entity.school.EduDormitory; +import com.yida.data.common.core.entity.school.EduDormitoryMaster; +import com.yida.data.common.core.entity.school.EduDormitoryRoom; +import com.yida.data.school.dto.index.ListDormRoomDTO; +import com.yida.data.school.facility.mapper.EduDormitoryRoomMapper; +import com.yida.data.school.facility.service.EduDormitoryMasterService; import com.yida.data.school.facility.service.EduDormitoryService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.validation.annotation.Validated; @@ -29,9 +39,35 @@ public class InEduDormitoryController { private final EduDormitoryService eduDormitoryService; + private final EduDormitoryRoomMapper eduDormitoryRoomMapper; + + private final EduDormitoryMasterService eduDormitoryMasterService; + @ApiOperation("获取宿舍楼") @GetMapping("/getDorm") ResultBean getDorm(@RequestParam("id") Long id) { return ResultBean.buildSuccess(eduDormitoryService.getDorm(id)); } + + @ApiOperation("根据学校ID获取宿舍楼List") + @GetMapping("/getDormListBySchoolId") + ResultBean> getDormListBySchoolId(@RequestParam("schoolId") Long schoolId) { + List list = eduDormitoryService + .list(Wrappers.lambdaQuery(new EduDormitory()).eq(EduDormitory::getSchoolId, schoolId)); + + list.forEach(eduDormitory -> { + ListDormRoomDTO dto = new ListDormRoomDTO(); + dto.setDormIds(Collections.singletonList(eduDormitory.getId())); + List eduDormitoryRooms = eduDormitoryRoomMapper.listDormRoom(dto); + eduDormitory.setDormRoomList(eduDormitoryRooms); + //宿管 + List masterList = eduDormitoryMasterService + .list(Wrappers.lambdaQuery(new EduDormitoryMaster()).eq(EduDormitoryMaster::getSchoolId, schoolId) + .eq(EduDormitoryMaster::getDormitoryId, eduDormitory.getId())); + if (CollUtil.isNotEmpty(masterList)) { + eduDormitory.setMasterIds(masterList.stream().map(EduDormitoryMaster::getMasterId).collect(Collectors.toList())); + } + }); + return ResultBean.buildSuccess(list); + } } diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/facility/controller/InEduDormitoryRoomController.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/facility/controller/InEduDormitoryRoomController.java index 9f460e3..e842c05 100644 --- a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/facility/controller/InEduDormitoryRoomController.java +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/facility/controller/InEduDormitoryRoomController.java @@ -2,9 +2,15 @@ package com.yida.data.school.facility.controller; import com.yida.data.common.core.common.ResultBean; import com.yida.data.common.core.entity.school.EduDormitoryRoom; +import com.yida.data.school.dto.index.EditPersonNumDTO; +import com.yida.data.school.dto.index.ListDormRoomDTO; import com.yida.data.school.facility.service.EduDormitoryRoomService; +import io.swagger.annotations.ApiOperation; +import java.util.List; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @@ -28,4 +34,17 @@ public class InEduDormitoryRoomController { ResultBean getDormRoomNoPermission(@RequestParam("id") Long id) { return ResultBean.buildSuccess(eduDormitoryRoomService.getDormRoom(id)); } + + @ApiOperation("寝室入住") + @PostMapping("/editPersonNum") + public ResultBean editPersonNumNoPermission(@RequestBody List dtos) { + eduDormitoryRoomService.editPersonNum(dtos); + return ResultBean.buildSuccess(); + } + + @ApiOperation("查询寝室列表") + @PostMapping("/listDormRoom") + public ResultBean> listDormRoom(@RequestBody ListDormRoomDTO dto) { + return ResultBean.buildSuccess(eduDormitoryRoomService.listDormRoom(dto)); + } } diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/facility/service/EduDormitoryMasterService.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/facility/service/EduDormitoryMasterService.java index fda9698..394f696 100644 --- a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/facility/service/EduDormitoryMasterService.java +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/facility/service/EduDormitoryMasterService.java @@ -11,7 +11,5 @@ import com.yida.data.common.core.entity.school.EduDormitoryMaster; * @date 2022/8/22 */ public interface EduDormitoryMasterService extends IService { - - - + } diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/facility/service/EduDormitoryService.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/facility/service/EduDormitoryService.java index 529ab04..d9b4996 100644 --- a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/facility/service/EduDormitoryService.java +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/facility/service/EduDormitoryService.java @@ -54,4 +54,6 @@ public interface EduDormitoryService extends IService { * @date 2022/7/15 14:31 */ EduDormitory getDorm(Long id); + + } diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/facility/service/impl/EduDormitoryServiceImpl.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/facility/service/impl/EduDormitoryServiceImpl.java index 38af579..92d2f8b 100644 --- a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/facility/service/impl/EduDormitoryServiceImpl.java +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/facility/service/impl/EduDormitoryServiceImpl.java @@ -45,7 +45,7 @@ import java.util.stream.Collectors; @RequiredArgsConstructor @Transactional(rollbackFor = Exception.class) public class EduDormitoryServiceImpl extends ServiceImpl - implements EduDormitoryService { + implements EduDormitoryService { private final EduDormitoryRoomMapper eduDormitoryRoomMapper; private final EduDormitoryMasterMapper eduDormitoryMasterMapper; @@ -62,14 +62,15 @@ public class EduDormitoryServiceImpl extends ServiceImpl public IPage listDormPage(PageDormDTO dto) { if (Objects.nonNull(dto.getMasterId())) { - List masterList = eduDormitoryMasterMapper.selectList(Wrappers.lambdaQuery(new EduDormitoryMaster()) + List masterList = eduDormitoryMasterMapper + .selectList(Wrappers.lambdaQuery(new EduDormitoryMaster()) .eq(EduDormitoryMaster::getMasterId, dto.getMasterId()).select(EduDormitoryMaster::getDormitoryId)); if (CollUtil.isEmpty(masterList)) { return new Page<>(); } dto.setDormIds(masterList.stream().map(EduDormitoryMaster::getDormitoryId) - .distinct() - .collect(Collectors.toList())); + .distinct() + .collect(Collectors.toList())); } IPage dormPage = baseMapper.listDormPage(dto.toPage(), dto); // 查询宿管名称 @@ -77,18 +78,18 @@ public class EduDormitoryServiceImpl extends ServiceImpl // 查询宿管id集合 for (DormInfoVO dormInfoVO : dormPage.getRecords()) { List masterIds = eduDormitoryMasterMapper.selectList(Wrappers.lambdaQuery(new EduDormitoryMaster()) - .eq(EduDormitoryMaster::getDormitoryId, dormInfoVO.getDormId()) - .select(EduDormitoryMaster::getMasterId) + .eq(EduDormitoryMaster::getDormitoryId, dormInfoVO.getDormId()) + .select(EduDormitoryMaster::getMasterId) ).stream().map(EduDormitoryMaster::getMasterId).collect(Collectors.toList()); dormInfoVO.setMasterIds(masterIds); List staffList = CollUtil.isNotEmpty(masterIds) - ? remoteStaffService.listStaff(ListStaffDTO.builder().ids(masterIds).build()).getData() - : Collections.emptyList(); + ? remoteStaffService.listStaff(ListStaffDTO.builder().ids(masterIds).build()).getData() + : Collections.emptyList(); // 匹配宿管 if (CollUtil.isNotEmpty(staffList)) { dormInfoVO.setMasterName(staffList.stream().map(EduStaff::getName) - .collect(Collectors.joining(StringConstant.COMMA))); + .collect(Collectors.joining(StringConstant.COMMA))); } } } @@ -106,8 +107,8 @@ public class EduDormitoryServiceImpl extends ServiceImpl } } LambdaQueryWrapper condition = Wrappers.lambdaQuery() - .eq(EduDormitory::getSchoolId, dorm.getSchoolId()) - .eq(EduDormitory::getName, dorm.getName()); + .eq(EduDormitory::getSchoolId, dorm.getSchoolId()) + .eq(EduDormitory::getName, dorm.getName()); if (dorm.getId() != null) { condition.ne(EduDormitory::getId, dorm.getId()); } @@ -115,13 +116,14 @@ public class EduDormitoryServiceImpl extends ServiceImpl saveOrUpdate(dorm); // 删除旧宿管数据 - eduDormitoryMasterMapper.delete(Wrappers.lambdaQuery().in(EduDormitoryMaster::getDormitoryId, dorm.getId())); + eduDormitoryMasterMapper + .delete(Wrappers.lambdaQuery().in(EduDormitoryMaster::getDormitoryId, dorm.getId())); dorm.getMasterIds().forEach(masterId -> { EduDormitoryMaster master = EduDormitoryMaster.builder() - .dormitoryId(dorm.getId()) - .masterId(masterId) - .schoolId(dorm.getSchoolId()) - .build(); + .dormitoryId(dorm.getId()) + .masterId(masterId) + .schoolId(dorm.getSchoolId()) + .build(); eduDormitoryMasterMapper.insert(master); }); } @@ -129,7 +131,7 @@ public class EduDormitoryServiceImpl extends ServiceImpl @Override public void delDormBatch(List ids) { List rooms = eduDormitoryRoomMapper.selectList( - Wrappers.lambdaQuery().in(EduDormitoryRoom::getDormId, ids).select(EduDormitoryRoom::getId)); + Wrappers.lambdaQuery().in(EduDormitoryRoom::getDormId, ids).select(EduDormitoryRoom::getId)); //删除寝室 eduDormitoryRoomMapper.delete(Wrappers.lambdaQuery().in(EduDormitoryRoom::getDormId, ids)); // 删除宿舍楼 @@ -145,14 +147,15 @@ public class EduDormitoryServiceImpl extends ServiceImpl EduDormitory eduDormitory = getById(id); Optional.ofNullable(eduDormitory).ifPresent(dormitory -> { // 查询宿管信息 - List masterList = eduDormitoryMasterMapper.selectList(Wrappers.lambdaQuery(new EduDormitoryMaster()) + List masterList = eduDormitoryMasterMapper + .selectList(Wrappers.lambdaQuery(new EduDormitoryMaster()) .eq(EduDormitoryMaster::getDormitoryId, dormitory.getId()).select(EduDormitoryMaster::getMasterId)); if (CollUtil.isNotEmpty(masterList)) { dormitory.setEduStaffList( - remoteStaffService.listStaff( - ListStaffDTO.builder().ids(masterList.stream().map(EduDormitoryMaster::getMasterId) - .collect(Collectors.toList())).build()) - .getData()); + remoteStaffService.listStaff( + ListStaffDTO.builder().ids(masterList.stream().map(EduDormitoryMaster::getMasterId) + .collect(Collectors.toList())).build()) + .getData()); } }); return eduDormitory; diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/health/service/impl/EduHealthStudentPhysicalExaminationGroupServiceImpl.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/health/service/impl/EduHealthStudentPhysicalExaminationGroupServiceImpl.java index 416678f..f7452ab 100644 --- a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/health/service/impl/EduHealthStudentPhysicalExaminationGroupServiceImpl.java +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/health/service/impl/EduHealthStudentPhysicalExaminationGroupServiceImpl.java @@ -94,7 +94,7 @@ public class EduHealthStudentPhysicalExaminationGroupServiceImpl extends Service public void sendHealthNotice(Long groupId,Long schoolId) { List studentId = baseMapper.findStudentId(groupId); EduHealthStudentPhysicalExaminationGroup group = getById(groupId); - EduApp app = commonService.getAppByCodeAndSchool(AppConstant.PRODUCT_PARENT, null, + EduApp app = commonService.getAppByCodeAndSchool(AppConstant.INDEX_PARENT, null, schoolId); String accessToken = wxUtil.getAccessToken(app.getWxCorpId(), app.getWxSecret()); diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/index/controller/EduDeptHomeAppController.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/index/controller/EduDeptHomeAppController.java new file mode 100644 index 0000000..5e895be --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/index/controller/EduDeptHomeAppController.java @@ -0,0 +1,79 @@ +package com.yida.data.school.index.controller; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.CurrentUser; +import com.yida.data.common.core.entity.school.EduDeptHomeApp; +import com.yida.data.common.core.utils.FebsUtil; +import com.yida.data.school.dto.index.SaveDeptHomeAppDTO; +import com.yida.data.school.index.service.EduDeptHomeAppService; +import com.yida.data.school.vo.index.ContactVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import java.util.List; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +/** + * 部门微官网应用配置 Controller + * + * @author ZYJ + * @date 2023-06-28 15:24:25 + */ +@Slf4j +@RestController +@RequiredArgsConstructor +@RequestMapping("eduDeptHomeApp") +@Api(tags = "部门微官网应用配置api") +public class EduDeptHomeAppController { + + private final EduDeptHomeAppService eduDeptHomeAppService; + + @ApiOperation("应用列表") + @PostMapping("/listApp") + public ResultBean> listApp(@RequestBody EduDeptHomeApp app) { + return ResultBean.buildSuccess(eduDeptHomeAppService + .list(Wrappers.lambdaQuery().eq(EduDeptHomeApp::getDeptId, FebsUtil.getDeptId()) + .eq(ObjectUtil.isNotEmpty(app.getAppType()), EduDeptHomeApp::getAppType, app.getAppType()) + .eq(ObjectUtil.isNotEmpty(app.getUserType()), EduDeptHomeApp::getUserType, app.getUserType()) + .like(ObjectUtil.isNotEmpty(app.getName()), EduDeptHomeApp::getName, app.getName()) + .orderByAsc(EduDeptHomeApp::getSort))); + } + + @ApiOperation("添加/编辑应用") + @PostMapping("/addApp") + public ResultBean addDeptHomeApp(@Validated @RequestBody SaveDeptHomeAppDTO dto) { + eduDeptHomeAppService.addDeptHomeApp(dto); + return ResultBean.buildSuccess(); + } + + @ApiOperation("删除应用") + @GetMapping("/deleteApp") + public ResultBean deleteDeptHomeApp(@RequestParam Long id) { + eduDeptHomeAppService.removeById(id); + return ResultBean.buildSuccess(); + } + + @ApiOperation("应用详情") + @GetMapping("/getApp") + public ResultBean getApp(@RequestParam Long id) { + return ResultBean.buildSuccess(eduDeptHomeAppService.getById(id)); + } + + @ApiOperation("启用/停用应用") + @GetMapping("/enableApp") + public ResultBean enableApp(@ApiParam("主键ID") @RequestParam Long id, + @ApiParam("启用状态:0:停用,1:启用") @RequestParam Integer status) { + eduDeptHomeAppService.enableApp(id, status); + return ResultBean.buildSuccess(); + } +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/index/controller/EduSchoolHomeController.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/index/controller/EduSchoolHomeController.java index 620795f..308c4ea 100644 --- a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/index/controller/EduSchoolHomeController.java +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/index/controller/EduSchoolHomeController.java @@ -13,6 +13,7 @@ import com.yida.data.common.core.entity.school.EduSchoolHomeMicroPic; import com.yida.data.common.core.entity.school.EduSchoolHomeNews; import com.yida.data.common.core.entity.school.EduSchoolManuscript; import com.yida.data.common.core.utils.FebsUtil; +import com.yida.data.school.index.service.EduDeptHomeAppService; import com.yida.data.school.index.service.EduHomeFunctionService; import com.yida.data.school.index.service.EduSchoolHomeAnnouncementService; import com.yida.data.school.index.service.EduSchoolHomeAppService; @@ -63,14 +64,15 @@ public class EduSchoolHomeController { private final EduSchoolHomeMicroIndexService eduSchoolHomeMicroIndexService; private final EduSchoolHomeMicroPicService eduSchoolHomeMicroPicService; private final EduSchoolManuscriptService eduSchoolManuscriptService; + private final EduDeptHomeAppService eduDeptHomeAppService; @ApiOperation("主页信息查询") @GetMapping("/getHomeInfo") - public ResultBean getHomeInfo(@ApiParam("学校id") Long schoolId) { + public ResultBean getHomeInfo(@ApiParam("学校id") Long schoolId, @RequestParam(required = false) Integer userType) { if (schoolId == null) { schoolId = FebsUtil.getTopDeptId(); } - return ResultBean.buildSuccess(eduSchoolHomeCoverService.getHomeInfo(schoolId)); + return ResultBean.buildSuccess(eduSchoolHomeCoverService.getHomeInfo(schoolId, userType)); } @ApiOperation("更新轮播图(新增、编辑、删除)") @@ -202,4 +204,15 @@ public class EduSchoolHomeController { eduHomeFunctionService.updateFunction(functionData); return ResultBean.buildSuccess(); } + + + @GetMapping("/getWxPublicURLLink") + @ApiOperation("获取微信小程序短链接") + ResultBean getWxPublicURLLink( + @RequestParam @ApiParam(value = "学校ID", required = true) String schoolId, + @RequestParam @ApiParam(value = "用户ID", required = true) Long userId, + @RequestParam @ApiParam(value = "用户类型", required = true) Integer userType, + @RequestParam @ApiParam(value = "系统内部小程序ID", required = true) Long localAppId) { + return ResultBean.buildSuccess(eduDeptHomeAppService.getWxPublicURLLink(schoolId, userId, userType, localAppId)); + } } diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/index/controller/InEduSchoolHomeController.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/index/controller/InEduSchoolHomeController.java index c9e2610..055b60f 100644 --- a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/index/controller/InEduSchoolHomeController.java +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/index/controller/InEduSchoolHomeController.java @@ -2,7 +2,9 @@ package com.yida.data.school.index.controller; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.school.EduDeptHomeApp; import com.yida.data.common.core.entity.school.EduSchoolHomeMicroPic; +import com.yida.data.school.index.service.EduDeptHomeAppService; import com.yida.data.school.index.service.EduSchoolHomeCoverService; import com.yida.data.school.index.service.EduSchoolHomeMicroIndexService; import com.yida.data.school.index.service.EduSchoolHomeMicroPicService; @@ -26,9 +28,11 @@ import lombok.RequiredArgsConstructor; @RestController @RequiredArgsConstructor public class InEduSchoolHomeController { + private final EduSchoolHomeMicroIndexService eduSchoolHomeMicroIndexService; private final EduSchoolHomeMicroPicService eduSchoolHomeMicroPicService; private final EduSchoolHomeCoverService eduSchoolHomeCoverService; + private final EduDeptHomeAppService eduDeptHomeAppService; @ApiOperation("查询校园概况") @@ -44,13 +48,20 @@ public class InEduSchoolHomeController { @GetMapping("/listPicByCol") public ResultBean> listPicByCol(@ApiParam("栏目id") Long colId) { return ResultBean.buildSuccess(eduSchoolHomeMicroPicService.list(Wrappers.lambdaQuery(new EduSchoolHomeMicroPic()) - .eq(EduSchoolHomeMicroPic::getColId, colId) - .orderByAsc(EduSchoolHomeMicroPic::getSort))); + .eq(EduSchoolHomeMicroPic::getColId, colId) + .orderByAsc(EduSchoolHomeMicroPic::getSort))); } @ApiOperation("主页信息查询") @GetMapping("/getHomeInfo") - public ResultBean getHomeInfo(@ApiParam("学校id") Long schoolId) { - return ResultBean.buildSuccess(eduSchoolHomeCoverService.getHomeInfo(schoolId)); + public ResultBean getHomeInfo(@ApiParam("学校id") Long schoolId, @RequestParam(required = false) Integer userType) { + return ResultBean.buildSuccess(eduSchoolHomeCoverService.getHomeInfo(schoolId, userType)); + } + + @ApiOperation("主页信息查询") + @GetMapping("/getDeptAppList") + public ResultBean> getDeptAppList(@RequestParam("schoolId") Long schoolId) { + return ResultBean.buildSuccess(eduDeptHomeAppService.list(Wrappers.lambdaQuery(new EduDeptHomeApp()) + .eq(EduDeptHomeApp::getDeptId, schoolId))); } } diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/index/mapper/EduDeptHomeAppMapper.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/index/mapper/EduDeptHomeAppMapper.java new file mode 100644 index 0000000..9668fbb --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/index/mapper/EduDeptHomeAppMapper.java @@ -0,0 +1,16 @@ +package com.yida.data.school.index.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.school.EduDeptHomeApp; +import com.yida.data.common.core.entity.system.EduBaseApp; + +/** + * 部门微官网应用配置 Mapper + * + * @author ZYJ + * @date 2023-06-28 15:24:25 + */ +public interface EduDeptHomeAppMapper extends BaseMapper { + + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/index/service/EduDeptHomeAppService.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/index/service/EduDeptHomeAppService.java new file mode 100644 index 0000000..6c97f17 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/index/service/EduDeptHomeAppService.java @@ -0,0 +1,22 @@ +package com.yida.data.school.index.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.school.EduDeptHomeApp; +import com.yida.data.school.dto.index.SaveDeptHomeAppDTO; +import io.swagger.annotations.ApiParam; +import org.springframework.web.bind.annotation.RequestParam; + +/** + * 部门微官网应用配置 Service接口 + * + * @author ZYJ + * @date 2023-06-28 15:24:25 + */ +public interface EduDeptHomeAppService extends IService { + + void addDeptHomeApp(SaveDeptHomeAppDTO dto); + + void enableApp(Long id, Integer status); + + String getWxPublicURLLink(String schoolId, Long userId, Integer userType, Long localAppId); +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/index/service/EduSchoolHomeAppService.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/index/service/EduSchoolHomeAppService.java index 4e38e00..1268e77 100644 --- a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/index/service/EduSchoolHomeAppService.java +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/index/service/EduSchoolHomeAppService.java @@ -3,7 +3,9 @@ package com.yida.data.school.index.service; import com.baomidou.mybatisplus.extension.service.IService; import com.yida.data.common.core.entity.school.EduSchoolHomeApp; +import io.swagger.annotations.ApiParam; import java.util.List; +import org.springframework.web.bind.annotation.RequestParam; /** * Service接口 diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/index/service/EduSchoolHomeCoverService.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/index/service/EduSchoolHomeCoverService.java index d3531cb..48d2ac1 100644 --- a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/index/service/EduSchoolHomeCoverService.java +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/index/service/EduSchoolHomeCoverService.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.yida.data.common.core.entity.school.EduSchoolHomeCover; import com.yida.data.school.vo.index.HomeInfoVO; +import io.swagger.models.auth.In; import java.util.List; /** @@ -14,7 +15,7 @@ import java.util.List; */ public interface EduSchoolHomeCoverService extends IService { - HomeInfoVO getHomeInfo(Long schoolId); + HomeInfoVO getHomeInfo(Long schoolId, Integer userType); /** * 更新轮播图 diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/index/service/impl/EduDeptHomeAppServiceImpl.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/index/service/impl/EduDeptHomeAppServiceImpl.java new file mode 100644 index 0000000..9a4faba --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/index/service/impl/EduDeptHomeAppServiceImpl.java @@ -0,0 +1,147 @@ +package com.yida.data.school.index.service.impl; + +import cc.mrbird.febs.common.redis.service.RedisService; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.GenerateUrlLink; +import com.yida.data.common.core.entity.constant.CachePrefixConstant; +import com.yida.data.common.core.entity.school.EduDeptHomeApp; +import com.yida.data.common.core.entity.system.EduBaseApp; +import com.yida.data.common.core.entity.user.EduStaff; +import com.yida.data.common.core.entity.user.EduStudent; +import com.yida.data.common.core.enums.UserTypeEnum; +import com.yida.data.common.core.exception.FebsException; +import com.yida.data.common.core.utils.Asserts; +import com.yida.data.common.core.utils.FebsUtil; +import com.yida.data.common.core.utils.WxPublicUtil; +import com.yida.data.common.service.CommonService; +import com.yida.data.school.dto.index.SaveDeptHomeAppDTO; +import com.yida.data.school.index.mapper.EduDeptHomeAppMapper; +import com.yida.data.school.index.service.EduDeptHomeAppService; +import com.yida.data.system.feign.RemoteBaseAppService; +import javax.sound.sampled.Line.Info; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * 部门微官网应用配置 Service实现 + * + * @author ZYJ + * @date 2023-06-28 15:24:25 + */ +@Slf4j +@Service +@RequiredArgsConstructor +@Transactional(rollbackFor = Exception.class) +public class EduDeptHomeAppServiceImpl extends ServiceImpl + implements EduDeptHomeAppService { + + private final RemoteBaseAppService remoteBaseAppService; + + private final CommonService commonService; + + private final WxPublicUtil wxPublicUtil; + + private final RedisService redisService; + + @Override + public void addDeptHomeApp(SaveDeptHomeAppDTO dto) { + EduDeptHomeApp already = this + .getOne(Wrappers.lambdaQuery().eq(EduDeptHomeApp::getDeptId, FebsUtil.getDeptId()) + .eq(EduDeptHomeApp::getBaseAppId, dto.getBaseAppId())); + + if (ObjectUtil.isNull(dto.getId())) { + Asserts.isTrue(ObjectUtil.isNull(already), "该学校已创建此应用"); + } else { + if (ObjectUtil.isNotNull(already) && ObjectUtil.notEqual(dto.getId(), already.getId())) { + throw new FebsException("该学校已创建此应用"); + } + } + EduBaseApp baseApp = null; + if (dto.getAppType() == 0) { + baseApp = remoteBaseAppService.getById(dto.getBaseAppId()).getData(); + Asserts.isTrue(ObjectUtil.isNotNull(baseApp), "不存在此基础应用"); + } + + EduDeptHomeApp homeApp = new EduDeptHomeApp(); + BeanUtils.copyProperties(dto, homeApp); + homeApp.setDeptId(FebsUtil.getDeptId()); + if (dto.getAppType() == 0) { + homeApp.setAppSrc(baseApp.getAppSrc()); + homeApp.setCode(baseApp.getCode()); + } + if (ObjectUtil.isNotNull(dto.getId())) { + redisService.del(CachePrefixConstant.DEPT_HOME_APP_INFO, String.valueOf(dto.getId())); + } + saveOrUpdate(homeApp); + } + + @Override + public void enableApp(Long id, Integer status) { + EduDeptHomeApp homeApp = new EduDeptHomeApp(); + homeApp.setId(id); + homeApp.setEnableStatus(status); + updateById(homeApp); + } + + @Override + public String getWxPublicURLLink(String schoolId, Long userId, Integer userType, Long localAppId) { + if (redisService.hasKey(CachePrefixConstant.USER_GENERATE_URL_LINK + userId + "" + userType + "" + localAppId)) { + return (String) redisService + .get(CachePrefixConstant.USER_GENERATE_URL_LINK + userId + "" + userType + "" + localAppId); + } + + EduDeptHomeApp homeApp = null; + if (redisService.hHasKey(CachePrefixConstant.DEPT_HOME_APP_INFO, String.valueOf(localAppId))) { + homeApp = (EduDeptHomeApp) redisService.hget(CachePrefixConstant.DEPT_HOME_APP_INFO, String.valueOf(localAppId)); + } else { + homeApp = getById(localAppId); + if (ObjectUtil.isNotNull(homeApp)) { + redisService.hset(CachePrefixConstant.DEPT_HOME_APP_INFO, String.valueOf(localAppId), homeApp); + } + } + if (ObjectUtil.isNull(homeApp)) { + log.error("获取小程序链接失败:【{}】", localAppId); + throw new FebsException("获取小程序链接失败"); + } + String avatar = ""; + if (ObjectUtil.equals(UserTypeEnum.PARENT_USER_TYPE.getType(), userType)) { + EduStudent student = commonService.getStudentById(userId); + if (ObjectUtil.isNull(student)) { + log.error("获取小程序链接失败:用户信息不存在:【{}】", userId); + throw new FebsException("获取小程序链接失败,用户信息不存在"); + } + if (ObjectUtil.isNull(student.getAvatar())) { + log.error("获取小程序链接失败:用户头像信息不存在:【{}】", userId); + throw new FebsException("获取小程序链接失败,用户头像信息不存在"); + } + avatar = student.getAvatar(); + } else { + EduStaff staff = commonService.getStaffById(userId); + if (ObjectUtil.isNull(staff)) { + log.error("获取小程序链接失败:用户信息不存在:【{}】", userId); + throw new FebsException("获取小程序链接失败,用户信息不存在"); + } + if (ObjectUtil.isNull(staff.getAvatar())) { + log.error("获取小程序链接失败:用户头像信息不存在:【{}】", userId); + throw new FebsException("获取小程序链接失败,用户头像信息不存在"); + } + avatar = staff.getAvatar(); + } + GenerateUrlLink generateUrlLink = new GenerateUrlLink(); + generateUrlLink.setPath(homeApp.getAppSrc()); + generateUrlLink.setExpireType(1); + generateUrlLink.setQuery("schoolId=" + schoolId + "&userId=" + userId + "&userType=" + userType + "&avatar=" + avatar); + String urlLink = wxPublicUtil + .generateUrlLink(wxPublicUtil.getAccessToken(homeApp.getAppId(), homeApp.getAppSecret()), generateUrlLink); + //缓存学生信息 29天 + redisService.set(CachePrefixConstant.USER_GENERATE_URL_LINK + userId + "" + userType + "" + localAppId, urlLink, + 60 * 60 * 24 * 29L); + return urlLink; + } +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/index/service/impl/EduSchoolHomeAppServiceImpl.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/index/service/impl/EduSchoolHomeAppServiceImpl.java index 9fe9c5b..43c5aa8 100644 --- a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/index/service/impl/EduSchoolHomeAppServiceImpl.java +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/index/service/impl/EduSchoolHomeAppServiceImpl.java @@ -1,9 +1,11 @@ package com.yida.data.school.index.service.impl; +import cc.mrbird.febs.common.redis.service.RedisService; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.constant.CachePrefixConstant; import com.yida.data.common.core.entity.school.EduSchoolHomeApp; import com.yida.data.common.core.entity.school.EduSchoolHomeAppShow; import com.yida.data.common.core.entity.user.EduStaffDept; @@ -39,6 +41,7 @@ public class EduSchoolHomeAppServiceImpl extends ServiceImpl private final RemoteDeptService remoteDeptService; private final RemoteUserDeptService remoteUserDeptService; private final EduSchoolMatterService eduSchoolMatterService; + private final RedisService redisService; @Override @Transactional diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/index/service/impl/EduSchoolHomeCoverServiceImpl.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/index/service/impl/EduSchoolHomeCoverServiceImpl.java index af9e35b..02942eb 100644 --- a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/index/service/impl/EduSchoolHomeCoverServiceImpl.java +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/index/service/impl/EduSchoolHomeCoverServiceImpl.java @@ -1,10 +1,15 @@ package com.yida.data.school.index.service.impl; +import cc.mrbird.febs.common.redis.service.RedisService; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.constant.CachePrefixConstant; import com.yida.data.common.core.entity.home.EduHomeFunction; import com.yida.data.common.core.entity.notice.EduNoticeSchool; +import com.yida.data.common.core.entity.school.EduDeptHomeApp; import com.yida.data.common.core.entity.school.EduSchoolHomeAnnouncement; import com.yida.data.common.core.entity.school.EduSchoolHomeCover; import com.yida.data.common.core.entity.school.EduSchoolHomeMicro; @@ -13,11 +18,13 @@ import com.yida.data.common.core.entity.school.EduSchoolManuscript; import com.yida.data.common.core.entity.system.Dept; import com.yida.data.common.core.entity.system.EduYidaApp; import com.yida.data.common.core.entity.system.enums.DeptTypeEnum; +import com.yida.data.common.core.enums.EnableStatusEnum; import com.yida.data.common.core.utils.AppUtil; import com.yida.data.common.service.CommonService; import com.yida.data.school.index.mapper.EduSchoolHomeAppMapper; import com.yida.data.school.index.mapper.EduSchoolHomeCoverMapper; import com.yida.data.school.index.mapper.EduSchoolHomeNewsMapper; +import com.yida.data.school.index.service.EduDeptHomeAppService; import com.yida.data.school.index.service.EduHomeFunctionService; import com.yida.data.school.index.service.EduSchoolHomeAnnouncementService; import com.yida.data.school.index.service.EduSchoolHomeCoverService; @@ -48,89 +55,112 @@ public class EduSchoolHomeCoverServiceImpl extends ServiceImpl private final EduSchoolMatterService eduSchoolMatterService; private final EduSchoolHomeMicroService eduSchoolHomeMicroService; private final EduSchoolHomeAnnouncementService eduSchoolHomeAnnouncementService; - + private final EduDeptHomeAppService eduDeptHomeAppService; private final EduNoticeSchoolMapper eduNoticeSchoolMapper; private final EduSchoolHomeAppMapper eduSchoolHomeAppMapper; private final EduSchoolHomeNewsMapper eduSchoolHomeNewsMapper; private final EduSchoolManuscriptMapper eduSchoolManuscriptMapper; private final CommonService commonService; + private final RedisService redisService; @Override - public HomeInfoVO getHomeInfo(Long schoolId) { - Dept dept = commonService.getDept(schoolId); + public HomeInfoVO getHomeInfo(Long schoolId, Integer userType) { HomeInfoVO homeInfoVO = new HomeInfoVO(); - homeInfoVO.setDeptType(dept.getDeptType()); - homeInfoVO.setCoverList(list(Wrappers.lambdaQuery(new EduSchoolHomeCover()) - .eq(EduSchoolHomeCover::getSchoolId, schoolId))); - if (dept.getDeptType().equals(DeptTypeEnum.SCHOOL_TYPE.getValue())) { - homeInfoVO.setParentAppList(eduSchoolHomeAppMapper.listApp(schoolId, 0, null, null)); - homeInfoVO.setTeacherAppList(eduSchoolHomeAppMapper.listApp(schoolId, 1, null, null)); - // 查询公告区 - EduSchoolHomeAnnouncement announcement = - eduSchoolHomeAnnouncementService.getOne(Wrappers.lambdaQuery(new EduSchoolHomeAnnouncement()) - .eq(EduSchoolHomeAnnouncement::getSchoolId, schoolId)); - // 无公告进行保存操作 - if (announcement == null) { - announcement = new EduSchoolHomeAnnouncement(); - announcement.setSchoolId(schoolId); - announcement.setName("公示公告"); - eduSchoolHomeAnnouncementService.saveAnnouncement(announcement); - } - // 设置了置顶公告则进行查询 - if (announcement.getTopAnnouncementId() != null) { - EduNoticeSchool topNotice = eduNoticeSchoolMapper.selectById(announcement.getTopAnnouncementId()); - if (topNotice != null) { - announcement.setTopAnnouncementPubDate(topNotice.getSendDate()); - announcement.setTopAnnouncement(topNotice); + //缓存主页信息 + if (redisService.hHasKey(CachePrefixConstant.SCHOOL_HOME_INFO, schoolId + "" + userType)) { + homeInfoVO = (HomeInfoVO) redisService + .hget(CachePrefixConstant.SCHOOL_HOME_INFO, schoolId + "" + userType); + } else { + Dept dept = commonService.getDept(schoolId); + homeInfoVO.setDeptType(dept.getDeptType()); + homeInfoVO.setCoverList(list(Wrappers.lambdaQuery(new EduSchoolHomeCover()) + .eq(EduSchoolHomeCover::getSchoolId, schoolId))); + if (dept.getDeptType().equals(DeptTypeEnum.SCHOOL_TYPE.getValue())) { + homeInfoVO.setParentAppList(eduSchoolHomeAppMapper.listApp(schoolId, 0, null, null)); + homeInfoVO.setTeacherAppList(eduSchoolHomeAppMapper.listApp(schoolId, 1, null, null)); + // 查询公告区 + EduSchoolHomeAnnouncement announcement = + eduSchoolHomeAnnouncementService.getOne(Wrappers.lambdaQuery(new EduSchoolHomeAnnouncement()) + .eq(EduSchoolHomeAnnouncement::getSchoolId, schoolId)); + // 无公告进行保存操作 + if (announcement == null) { + announcement = new EduSchoolHomeAnnouncement(); + announcement.setSchoolId(schoolId); + announcement.setName("公示公告"); + eduSchoolHomeAnnouncementService.saveAnnouncement(announcement); + } + // 设置了置顶公告则进行查询 + if (announcement.getTopAnnouncementId() != null) { + EduNoticeSchool topNotice = eduNoticeSchoolMapper.selectById(announcement.getTopAnnouncementId()); + if (topNotice != null) { + announcement.setTopAnnouncementPubDate(topNotice.getSendDate()); + announcement.setTopAnnouncement(topNotice); + } + } + // 查询公告区公告 + LambdaQueryWrapper condition = Wrappers.lambdaQuery(new EduNoticeSchool()) + .eq(EduNoticeSchool::getSchoolId, schoolId) + .eq(EduNoticeSchool::getIsPublic, 1) + .orderByDesc(EduNoticeSchool::getSendDate) + .last(announcement.getTopAnnouncementId() == null ? "limit 3" : "limit 2"); + if (announcement.getTopAnnouncementId() != null) { + condition.ne(EduNoticeSchool::getId, announcement.getTopAnnouncementId()); + } + announcement.setManuscriptList(eduNoticeSchoolMapper.selectList(condition)); + homeInfoVO.setAnnouncement(announcement); + // 微官网区 + EduSchoolHomeMicro microInfo = eduSchoolHomeMicroService.getInfo(schoolId); + if (microInfo == null) { + eduSchoolHomeMicroService.initMicro(schoolId); + microInfo = eduSchoolHomeMicroService.getInfo(schoolId); + } + homeInfoVO.setMicro(microInfo); + // 查询新闻区 + EduSchoolHomeNews news = eduSchoolHomeNewsMapper.selectOne(Wrappers.lambdaQuery(new EduSchoolHomeNews()) + .eq(EduSchoolHomeNews::getSchoolId, schoolId)); + if (news == null) { + news = new EduSchoolHomeNews(); + news.setSchoolId(schoolId); + news.setName("学校新闻"); + eduSchoolHomeNewsMapper.insert(news); + } + homeInfoVO.setNews(news); + if (homeInfoVO.getNews().getTopNewsId() != null) { + EduSchoolManuscript topNews = eduSchoolManuscriptMapper.getInfo(homeInfoVO.getNews().getTopNewsId()); + homeInfoVO.getNews().setTopNews(topNews); } } - // 查询公告区公告 - LambdaQueryWrapper condition = Wrappers.lambdaQuery(new EduNoticeSchool()) - .eq(EduNoticeSchool::getSchoolId, schoolId) - .eq(EduNoticeSchool::getIsPublic, 1) - .orderByDesc(EduNoticeSchool::getSendDate) - .last(announcement.getTopAnnouncementId() == null ? "limit 3" : "limit 2"); - if (announcement.getTopAnnouncementId() != null) { - condition.ne(EduNoticeSchool::getId, announcement.getTopAnnouncementId()); + // 查询功能区 + EduHomeFunction function = eduHomeFunctionService + .getOne(Wrappers.lambdaQuery().eq(EduHomeFunction::getDeptId, schoolId)); + if (function == null) { + function = new EduHomeFunction(); + function.setDeptId(schoolId); + function.setSearchSchool(0); + function.setMatchSchool(0); + function.setEnrolSign(0); + function.setEnrolQa(0); + eduHomeFunctionService.save(function); } - announcement.setManuscriptList(eduNoticeSchoolMapper.selectList(condition)); - homeInfoVO.setAnnouncement(announcement); - // 微官网区 - EduSchoolHomeMicro microInfo = eduSchoolHomeMicroService.getInfo(schoolId); - if (microInfo == null) { - eduSchoolHomeMicroService.initMicro(schoolId); - microInfo = eduSchoolHomeMicroService.getInfo(schoolId); + + if (ObjectUtil.isNotNull(userType)) { + List list = eduDeptHomeAppService.list(Wrappers.lambdaQuery() + .eq(EduDeptHomeApp::getDeptId, schoolId) + .eq(EduDeptHomeApp::getUserType, userType) + .eq(EduDeptHomeApp::getEnableStatus, EnableStatusEnum.ENABLE_STATUS.getStatus()) + .orderByAsc(EduDeptHomeApp::getSort)); + if (CollUtil.isNotEmpty(list)) { + homeInfoVO.setEduDeptHomeAppList(list); + } + } - homeInfoVO.setMicro(microInfo); - // 查询新闻区 - EduSchoolHomeNews news = eduSchoolHomeNewsMapper.selectOne(Wrappers.lambdaQuery(new EduSchoolHomeNews()) - .eq(EduSchoolHomeNews::getSchoolId, schoolId)); - if (news == null) { - news = new EduSchoolHomeNews(); - news.setSchoolId(schoolId); - news.setName("学校新闻"); - eduSchoolHomeNewsMapper.insert(news); - } - homeInfoVO.setNews(news); - if (homeInfoVO.getNews().getTopNewsId() != null) { - EduSchoolManuscript topNews = eduSchoolManuscriptMapper.getInfo(homeInfoVO.getNews().getTopNewsId()); - homeInfoVO.getNews().setTopNews(topNews); + homeInfoVO.setFunction(function); + + if (ObjectUtil.isNotNull(homeInfoVO)) { + redisService.hset(CachePrefixConstant.SCHOOL_HOME_INFO, schoolId + "" + userType, homeInfoVO); } } - // 查询功能区 - EduHomeFunction function = eduHomeFunctionService - .getOne(Wrappers.lambdaQuery().eq(EduHomeFunction::getDeptId, schoolId)); - if (function == null) { - function = new EduHomeFunction(); - function.setDeptId(schoolId); - function.setSearchSchool(0); - function.setMatchSchool(0); - function.setEnrolSign(0); - function.setEnrolQa(0); - eduHomeFunctionService.save(function); - } - homeInfoVO.setFunction(function); return homeInfoVO; } @@ -157,5 +187,8 @@ public class EduSchoolHomeCoverServiceImpl extends ServiceImpl EduYidaApp yidaApp = commonService.getYidaApp(schoolId); AppUtil.bannerUpdate(school.getYidaAppColId(), urlList, sortList, yidaApp); } + + redisService.del(CachePrefixConstant.SCHOOL_HOME_INFO, schoolId + "" + 0); + redisService.del(CachePrefixConstant.SCHOOL_HOME_INFO, schoolId + "" + 1); } } diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/leave/service/impl/EduLeaveRequestServiceImpl.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/leave/service/impl/EduLeaveRequestServiceImpl.java index eb73cb4..fd1f84e 100644 --- a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/leave/service/impl/EduLeaveRequestServiceImpl.java +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/leave/service/impl/EduLeaveRequestServiceImpl.java @@ -135,7 +135,7 @@ public class EduLeaveRequestServiceImpl extends ServiceImpl //发送企业微信通知 if (school.getSchoolType().contains("0")) { - EduApp app = commonService.getAppByCodeAndSchool(AppConstant.TEACHER_LEAVE_REQUEST, null, + EduApp app = commonService.getAppByCodeAndSchool(AppConstant.CONTACT_SELECT, null, staff.getSchoolId()); String accessToken = wxUtil.getAccessToken(app.getWxCorpId(), app.getWxSecret()); @@ -246,7 +246,7 @@ public class EduLeaveRequestServiceImpl extends ServiceImpl //通知企业微信对应家长 Dept dept = commonService.getDept(schoolId); if (dept.getSchoolType().contains("0")) { - EduApp app = commonService.getAppByCodeAndSchool(AppConstant.TEACHER_LEAVE_REQUEST, null, + EduApp app = commonService.getAppByCodeAndSchool(AppConstant.CONTACT_SELECT, null, schoolId); String accessToken = wxUtil.getAccessToken(app.getWxCorpId(), app.getWxSecret()); List list = new ArrayList<>(); diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/letter/controller/EduLetterBoxConfigController.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/letter/controller/EduLetterBoxConfigController.java index e686019..bc77e35 100644 --- a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/letter/controller/EduLetterBoxConfigController.java +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/letter/controller/EduLetterBoxConfigController.java @@ -1,21 +1,25 @@ package com.yida.data.school.letter.controller; import com.yida.data.common.core.annotation.ControllerLog; +import com.yida.data.common.core.common.ModuleName; import com.yida.data.common.core.common.ResultBean; import com.yida.data.common.core.entity.letter.EduLetterBoxConfig; -import com.yida.data.common.core.entity.letter.EduLetterBoxReplyPerson; +import com.yida.data.common.core.entity.system.enums.OperationLogTypeEnum; import com.yida.data.common.core.utils.FebsUtil; +import com.yida.data.log.annotation.OperationLog; import com.yida.data.school.dto.letterbox.LetterBoxConfigDTO; import com.yida.data.school.letter.service.EduLetterBoxConfigService; import com.yida.data.school.letter.service.EduLetterBoxReplyPersonService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import org.springframework.cloud.context.config.annotation.RefreshScope; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; import java.util.List; +import javax.annotation.Resource; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; /** * @author ccl @@ -33,7 +37,6 @@ public class EduLetterBoxConfigController { @ApiOperation("滚动图列表") @GetMapping("/findBannerList") - @ControllerLog(operation = "撤回") public ResultBean> findBannerList() { return ResultBean.buildSuccess(configService.findBannerList(FebsUtil.getCurrentUser().getDeptId())); @@ -41,16 +44,14 @@ public class EduLetterBoxConfigController { @ApiOperation("滚动图列表") @GetMapping("/findConfig") - @ControllerLog(operation = "撤回") public ResultBean findConfig() { - return ResultBean.buildSuccess(configService.findConfig(FebsUtil.getCurrentUser().getDeptId())); } @ApiOperation("新增或修改配置") @PostMapping("/saveOrUpdateConfig") - @ControllerLog(operation = "撤回") + @OperationLog(module = ModuleName.LETTER_BOX, methods = "新增或修改配置", type = OperationLogTypeEnum.SAVE) public ResultBean saveOrUpdateConfig(@RequestBody LetterBoxConfigDTO config) { replyPersonService.saveOrUpdateConfig(config,FebsUtil.getCurrentUser().getDeptId()); return ResultBean.buildSuccess(); diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/letter/controller/EduLetterBoxController.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/letter/controller/EduLetterBoxController.java index 7b3f07a..96104e1 100644 --- a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/letter/controller/EduLetterBoxController.java +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/letter/controller/EduLetterBoxController.java @@ -9,13 +9,16 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.vdurmont.emoji.EmojiParser; import com.yida.data.common.core.annotation.ControllerLog; +import com.yida.data.common.core.common.ModuleName; import com.yida.data.common.core.common.ResultBean; import com.yida.data.common.core.entity.CurrentUser; import com.yida.data.common.core.entity.letter.EduLetterBox; import com.yida.data.common.core.entity.letter.EduLetterBoxReply; import com.yida.data.common.core.entity.system.Dept; +import com.yida.data.common.core.entity.system.enums.OperationLogTypeEnum; import com.yida.data.common.core.utils.FebsUtil; import com.yida.data.common.core.vo.NameValueVO; +import com.yida.data.log.annotation.OperationLog; import com.yida.data.school.dto.letterbox.LetterBoxDTO; import com.yida.data.school.letter.mapper.EduLetterBoxMapper; import com.yida.data.school.letter.service.EduLetterBoxService; @@ -47,6 +50,7 @@ import org.springframework.web.client.RestTemplate; @RefreshScope @RequiredArgsConstructor public class EduLetterBoxController { + private final EduLetterBoxService eduLetterBoxService; private final EduLetterBoxMapper eduLetterBoxMapper; @@ -61,14 +65,13 @@ public class EduLetterBoxController { */ @ApiOperation("分页查询信箱列表") @GetMapping("/findLetterPageList") - @ControllerLog(operation = "分页查询信箱列表") public ResultBean> findLetterPageList(@ApiParam("问题名称") @RequestParam(required = false) String title, - @ApiParam("学校id") @RequestParam Long schoolId, - @ApiParam("信件类型") @RequestParam(required = false) String contentType, - @ApiParam("手机号") @RequestParam(required = false) String appPhone, - @ApiParam("是否已回复0=否,1是") @RequestParam Integer reply, - @ApiParam("页码") @RequestParam(defaultValue = "1") Integer pageNo, - @ApiParam("数量") @RequestParam(defaultValue = "10") Integer pageSize) { + @ApiParam("学校id") @RequestParam Long schoolId, + @ApiParam("信件类型") @RequestParam(required = false) String contentType, + @ApiParam("手机号") @RequestParam(required = false) String appPhone, + @ApiParam("是否已回复0=否,1是") @RequestParam Integer reply, + @ApiParam("页码") @RequestParam(defaultValue = "1") Integer pageNo, + @ApiParam("数量") @RequestParam(defaultValue = "10") Integer pageSize) { //查询分页数据 Page page = new Page(); page.setCurrent(pageNo); @@ -85,7 +88,7 @@ public class EduLetterBoxController { @ApiOperation("提交回复信息") @PostMapping("/submitReplyLetter") - @ControllerLog(operation = "提交回复信息") + @OperationLog(module = ModuleName.LETTER_BOX, methods = "提交回复信息", type = OperationLogTypeEnum.INSERT) public ResultBean submitReplyLetter(@RequestBody EduLetterBox eduLetterBox) { CurrentUser currentUser = FebsUtil.getCurrentUser(); if (ObjectUtil.isEmpty(currentUser)) { @@ -106,7 +109,7 @@ public class EduLetterBoxController { */ @ApiOperation("提交审核") @PostMapping("/submitExamineLetter") - @ControllerLog(operation = "提交审核") + @OperationLog(module = ModuleName.LETTER_BOX, methods = "提交审核", type = OperationLogTypeEnum.INSERT) public ResultBean submitExamineLetter(@RequestBody EduLetterBox eduLetterBox) { EduLetterBox eduLetterBox1 = eduLetterBoxMapper.selectById(eduLetterBox.getId()); if ("0".equals(eduLetterBox1.getStatus())) { @@ -125,7 +128,7 @@ public class EduLetterBoxController { */ @ApiOperation("撤回") @GetMapping("/retract") - @ControllerLog(operation = "撤回") + @OperationLog(module = ModuleName.LETTER_BOX, methods = "撤回", type = OperationLogTypeEnum.UPDATE) public ResultBean retract(@ApiParam("信箱id") @RequestParam Long id) { eduLetterBoxMapper.updateByReply(id); return ResultBean.buildSuccess(); @@ -134,7 +137,7 @@ public class EduLetterBoxController { @ApiOperation("批量公开") @PostMapping("/listOpenLetter") - @ControllerLog(operation = "批量公开") + @OperationLog(module = ModuleName.LETTER_BOX, methods = "批量公开", type = OperationLogTypeEnum.UPDATE) public ResultBean listOpenLetter(@RequestBody List ids) { Collection eduLetterBoxes = eduLetterBoxService.listByIds(ids); for (EduLetterBox eduLetterBox : eduLetterBoxes) { @@ -146,7 +149,7 @@ public class EduLetterBoxController { @ApiOperation("批量回复") @PostMapping("/listReplyLetter") - @ControllerLog(operation = "批量回复") + @OperationLog(module = ModuleName.LETTER_BOX, methods = "批量回复", type = OperationLogTypeEnum.UPDATE) public ResultBean listReplyLetter(@RequestBody LetterBoxDTO letterBoxDTO) { CurrentUser currentUser = FebsUtil.getCurrentUser(); Collection eduLetterBoxes = eduLetterBoxService.listByIds(letterBoxDTO.getIds()); @@ -156,11 +159,11 @@ public class EduLetterBoxController { @ApiOperation("进行置顶或公开操作") @GetMapping(value = "updateTopOrOpen") - @ControllerLog(operation = "进行置顶或公开操作") + @OperationLog(module = ModuleName.LETTER_BOX, methods = "进行置顶或公开操作", type = OperationLogTypeEnum.UPDATE) public ResultBean updateTopOrOpen(@ApiParam("信箱id") @RequestParam Long id, - @ApiParam("学校id") @RequestParam Long schoolId, - @ApiParam("1为置顶,null为取消置顶") @RequestParam(required = false) Integer top, - @ApiParam("1为公开,0为取消公开") @RequestParam(required = false) Integer open) { + @ApiParam("学校id") @RequestParam Long schoolId, + @ApiParam("1为置顶,null为取消置顶") @RequestParam(required = false) Integer top, + @ApiParam("1为公开,0为取消公开") @RequestParam(required = false) Integer open) { CurrentUser currentUser = FebsUtil.getCurrentUser(); if (ObjectUtil.isEmpty(currentUser)) { @@ -183,9 +186,9 @@ public class EduLetterBoxController { @ApiOperation("取消置顶") @GetMapping(value = "updateTop") - @ControllerLog(operation = "取消置顶") + @OperationLog(module = ModuleName.LETTER_BOX, methods = "取消置顶", type = OperationLogTypeEnum.UPDATE) public ResultBean updateTop(@ApiParam("信箱id") @RequestParam Long id, - @ApiParam("1为置顶,null为取消置顶") @RequestParam(required = false) Integer top) { + @ApiParam("1为置顶,null为取消置顶") @RequestParam(required = false) Integer top) { if (ObjectUtil.isEmpty(FebsUtil.getCurrentUser())) { return ResultBean.buildError("登录失效请重新登录"); @@ -196,7 +199,7 @@ public class EduLetterBoxController { @GetMapping("/viewLetter") public ResultBean viewLetter(Long id, String title, - Integer status, String contentType) { + Integer status, String contentType) { EduLetterBox eduLetterBox = eduLetterBoxMapper.selectById(id); if (StrUtil.isNotBlank(eduLetterBox.getContent())) { eduLetterBox.setContent(EmojiParser.parseToUnicode(eduLetterBox.getContent())); @@ -232,7 +235,7 @@ public class EduLetterBoxController { for (int i = 0; i < listViewLetter.size(); i++) { // 判断是否只有一条数据 if (Objects.equals(listViewLetter.get(0).getId(), id) && Objects - .equals(listViewLetter.get(listViewLetter.size() - 1).getId(), id)) { + .equals(listViewLetter.get(listViewLetter.size() - 1).getId(), id)) { previousShow = false; nextShow = false; break; @@ -273,15 +276,16 @@ public class EduLetterBoxController { @GetMapping("/getStaData") public ResultBean getStaData(String startDate, String endDate) { List schoolIds = remoteDeptService.getSchoolByArea(null, null).getData().stream().map(Dept::getDeptId).collect( - Collectors.toList()); - return ResultBean.buildSuccess(eduLetterBoxService.getStaData(LocalDate.parse(startDate), LocalDate.parse(endDate), schoolIds)); + Collectors.toList()); + return ResultBean + .buildSuccess(eduLetterBoxService.getStaData(LocalDate.parse(startDate), LocalDate.parse(endDate), schoolIds)); } @ApiOperation("校长信息标题词云") @GetMapping("/titleCloud") public ResultBean>> titleCloud(String startDate, String endDate) { List schoolIds = remoteDeptService.getSchoolByArea(null, null).getData().stream().map(Dept::getDeptId).collect( - Collectors.toList()); + Collectors.toList()); return ResultBean.buildSuccess(eduLetterBoxService.titleCloud(startDate, endDate, schoolIds)); } } diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/letter/controller/H5EduLetterBoxController.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/letter/controller/H5EduLetterBoxController.java index 457502d..6420084 100644 --- a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/letter/controller/H5EduLetterBoxController.java +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/letter/controller/H5EduLetterBoxController.java @@ -7,13 +7,16 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.vdurmont.emoji.EmojiManager; import com.vdurmont.emoji.EmojiParser; import com.yida.data.common.core.annotation.ControllerLog; +import com.yida.data.common.core.common.ModuleName; import com.yida.data.common.core.common.ResultBean; import com.yida.data.common.core.entity.CurrentUser; import com.yida.data.common.core.entity.letter.EduLetterBox; import com.yida.data.common.core.entity.letter.EduLetterBoxConfig; import com.yida.data.common.core.entity.letter.EduLetterBoxReply; +import com.yida.data.common.core.entity.system.enums.OperationLogTypeEnum; import com.yida.data.common.core.utils.Asserts; import com.yida.data.common.core.utils.FebsUtil; +import com.yida.data.log.annotation.OperationLog; import com.yida.data.school.letter.service.EduLetterBoxReplyService; import com.yida.data.school.letter.service.EduLetterBoxService; import io.swagger.annotations.Api; @@ -32,6 +35,7 @@ import java.util.Optional; @RestController @RequestMapping(value = "/letter/H5/letter") public class H5EduLetterBoxController { + @Autowired private EduLetterBoxService eduLetterBoxService; @@ -47,28 +51,16 @@ public class H5EduLetterBoxController { * @apiParam {Integer} coreOrderId 参加的点单id:必传,作为判断 * @apiParam {String} header 用户头像 * @apiParam {String} nikeName 用户昵称 - * @apiParamExample {json} 请求样例: - * { - * coreOrderId : 1 - * appId : demoData - * nikeName : demoData - * header : demoData - * } + * @apiParamExample {json} 请求样例: { coreOrderId : 1 appId : demoData nikeName : demoData header : demoData } * @apiSuccess (200) {String} msg 信息 * @apiSuccess (200) {int} code 200 代表无错误 其他 代表错误 * @apiSuccess (200) {int} count 总条数 * @apiSuccess (200) {object} data 数据详情 - * @apiSuccessExample {json} 返回样例: - * { - * "code": 200, - * "msg": "操作成功", - * "count": 0, - * "data": null - * } + * @apiSuccessExample {json} 返回样例: { "code": 200, "msg": "操作成功", "count": 0, "data": null } */ @ApiOperation("新增信箱提问") @PostMapping("/addLetter") - @ControllerLog(operation = "新增信箱提问") + @OperationLog(module = ModuleName.LETTER_BOX, methods = "新增信箱提问", type = OperationLogTypeEnum.INSERT) public ResultBean addLetter(@RequestBody EduLetterBox eduLetterBox) { CurrentUser currentUser = FebsUtil.getCurrentUser(); if (ObjectUtil.isEmpty(currentUser)) { @@ -84,7 +76,7 @@ public class H5EduLetterBoxController { if (EmojiManager.containsEmoji(eduLetterBox.getTitle())) { return ResultBean.buildError("标题不能含有表情符号"); } - eduLetterBoxService.addLetter(eduLetterBox,currentUser); + eduLetterBoxService.addLetter(eduLetterBox, currentUser); return ResultBean.buildSuccess(); } @@ -96,16 +88,15 @@ public class H5EduLetterBoxController { */ @ApiOperation("分页信箱列表") @GetMapping("/findLetterPageList") - @ControllerLog(operation = "分页查询信息列表") public ResultBean> findLetterPageList(@RequestParam(defaultValue = "1") Integer pageNo, - @RequestParam(defaultValue = "10") Integer pageSize, - @ApiParam("学校id") @RequestParam Long schoolId, - @ApiParam("标题") @RequestParam(required = false) String title, - @ApiParam("浏览次数传0按照创建时间排序,传1按照浏览数量排序") @RequestParam(required = false) Integer viewsNum, - @ApiParam("identityId") @RequestParam(required = false) Long identityId) { + @RequestParam(defaultValue = "10") Integer pageSize, + @ApiParam("学校id") @RequestParam Long schoolId, + @ApiParam("标题") @RequestParam(required = false) String title, + @ApiParam("浏览次数传0按照创建时间排序,传1按照浏览数量排序") @RequestParam(required = false) Integer viewsNum, + @ApiParam("identityId") @RequestParam(required = false) Long identityId) { Asserts.isNotNull(schoolId, "学校id为空"); IPage list = eduLetterBoxService.findViewList(new Page(pageNo, pageSize), title, schoolId, - identityId, viewsNum); + identityId, viewsNum); return ResultBean.buildSuccess(list); } @@ -117,10 +108,8 @@ public class H5EduLetterBoxController { */ @ApiOperation("查询信箱详情") @GetMapping("/getLetter") - @ControllerLog(operation = "当前提问详情") public ResultBean getLetter(@ApiParam("信箱表id") @RequestParam Integer id) { - if (ObjectUtil.isEmpty(id)) { return ResultBean.buildError("id为空"); } @@ -137,11 +126,11 @@ public class H5EduLetterBoxController { */ @ApiOperation("回复信箱") @PostMapping("/replyLetter") - @ControllerLog(operation = "回复信箱") + @OperationLog(module = ModuleName.LETTER_BOX, methods = "回复信箱", type = OperationLogTypeEnum.INSERT) public ResultBean replyLetter(@RequestBody EduLetterBox eduLetterBox) { if (ObjectUtil.isEmpty(eduLetterBox.getIdentityId()) || - ObjectUtil.isEmpty(eduLetterBox.getReplyContent()) || - ObjectUtil.isEmpty(eduLetterBox.getId())) { + ObjectUtil.isEmpty(eduLetterBox.getReplyContent()) || + ObjectUtil.isEmpty(eduLetterBox.getId())) { return ResultBean.buildError("需传入id,appId,replyContent"); } // 需要处理是处理初次提问的问题还是追问的问题 @@ -162,11 +151,11 @@ public class H5EduLetterBoxController { @ApiOperation("信箱点赞") @GetMapping("/upOrDownLetter") - @ControllerLog(operation = "信箱点赞") + @OperationLog(module = ModuleName.LETTER_BOX, methods = "信箱点赞", type = OperationLogTypeEnum.INSERT) public ResultBean upOrDownLetter(@ApiParam("信箱表id") @RequestParam Integer letterId, - @ApiParam("0为有用,1为没用") @RequestParam Integer status, - @ApiParam("0为点赞,1为取消") @RequestParam Integer type) { - eduLetterBoxService.upOrDownLetter(letterId, status, FebsUtil.getCurrentUser().getUserId(),type); + @ApiParam("0为有用,1为没用") @RequestParam Integer status, + @ApiParam("0为点赞,1为取消") @RequestParam Integer type) { + eduLetterBoxService.upOrDownLetter(letterId, status, FebsUtil.getCurrentUser().getUserId(), type); return ResultBean.buildSuccess(); } diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/letter/controller/out/OutEduLetterBoxController.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/letter/controller/out/OutEduLetterBoxController.java index 24bb0f5..2ab9420 100644 --- a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/letter/controller/out/OutEduLetterBoxController.java +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/letter/controller/out/OutEduLetterBoxController.java @@ -11,13 +11,16 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.vdurmont.emoji.EmojiManager; import com.vdurmont.emoji.EmojiParser; import com.yida.data.common.core.annotation.ControllerLog; +import com.yida.data.common.core.common.ModuleName; import com.yida.data.common.core.common.ResultBean; import com.yida.data.common.core.entity.CurrentUser; import com.yida.data.common.core.entity.letter.EduLetterBox; import com.yida.data.common.core.entity.letter.EduLetterBoxConfig; import com.yida.data.common.core.entity.letter.EduLetterBoxReply; +import com.yida.data.common.core.entity.system.enums.OperationLogTypeEnum; import com.yida.data.common.core.utils.FebsUtil; import com.yida.data.common.core.vo.NameValueVO; +import com.yida.data.log.annotation.OperationLog; import com.yida.data.school.dto.letterbox.LetterBoxConfigDTO; import com.yida.data.school.dto.letterbox.LetterBoxDTO; import com.yida.data.school.letter.mapper.EduLetterBoxMapper; @@ -100,28 +103,16 @@ public class OutEduLetterBoxController { * @apiParam {Integer} coreOrderId 参加的点单id:必传,作为判断 * @apiParam {String} header 用户头像 * @apiParam {String} nikeName 用户昵称 - * @apiParamExample {json} 请求样例: - * { - * coreOrderId : 1 - * appId : demoData - * nikeName : demoData - * header : demoData - * } + * @apiParamExample {json} 请求样例: { coreOrderId : 1 appId : demoData nikeName : demoData header : demoData } * @apiSuccess (200) {String} msg 信息 * @apiSuccess (200) {int} code 200 代表无错误 其他 代表错误 * @apiSuccess (200) {int} count 总条数 * @apiSuccess (200) {object} data 数据详情 - * @apiSuccessExample {json} 返回样例: - * { - * "code": 200, - * "msg": "操作成功", - * "count": 0, - * "data": null - * } + * @apiSuccessExample {json} 返回样例: { "code": 200, "msg": "操作成功", "count": 0, "data": null } */ @ApiOperation("新增信箱提问") @PostMapping("/addLetter") - @ControllerLog(operation = "新增信箱提问") + @OperationLog(module = ModuleName.LETTER_BOX, methods = "新增信箱提问", type = OperationLogTypeEnum.INSERT) public ResultBean addLetter(@RequestBody EduLetterBox eduLetterBox) { CurrentUser currentUser = new CurrentUser(); @@ -129,7 +120,7 @@ public class OutEduLetterBoxController { return ResultBean.buildError("标题不能含有表情符号"); } - eduLetterBoxService.addLetter(eduLetterBox,currentUser); + eduLetterBoxService.addLetter(eduLetterBox, currentUser); return ResultBean.buildSuccess(); } @@ -141,10 +132,8 @@ public class OutEduLetterBoxController { */ @ApiOperation("查询信箱详情") @GetMapping("/getLetter") - @ControllerLog(operation = "当前提问详情") public ResultBean getLetter(@ApiParam("信箱表id") @RequestParam Integer id) { - if (ObjectUtil.isEmpty(id)) { return ResultBean.buildError("id为空"); } @@ -161,11 +150,11 @@ public class OutEduLetterBoxController { */ @ApiOperation("回复信箱") @PostMapping("/replyLetter") - @ControllerLog(operation = "回复信箱") + @OperationLog(module = ModuleName.LETTER_BOX, methods = "回复信箱", type = OperationLogTypeEnum.INSERT) public ResultBean replyLetter(@RequestBody EduLetterBox eduLetterBox) { if (ObjectUtil.isEmpty(eduLetterBox.getIdentityId()) || - ObjectUtil.isEmpty(eduLetterBox.getReplyContent()) || - ObjectUtil.isEmpty(eduLetterBox.getId())) { + ObjectUtil.isEmpty(eduLetterBox.getReplyContent()) || + ObjectUtil.isEmpty(eduLetterBox.getId())) { return ResultBean.buildError("需传入id,appId,replyContent"); } // 需要处理是处理初次提问的问题还是追问的问题 @@ -186,11 +175,11 @@ public class OutEduLetterBoxController { @ApiOperation("信箱点赞") @GetMapping("/upOrDownLetter") - @ControllerLog(operation = "信箱点赞") + @OperationLog(module = ModuleName.LETTER_BOX, methods = "信箱点赞", type = OperationLogTypeEnum.INSERT) public ResultBean upOrDownLetter(@ApiParam("信箱表id") @RequestParam Integer letterId, - @ApiParam("0为有用,1为没用") @RequestParam Integer status, - @ApiParam("0为点赞,1为取消") @RequestParam Integer type) { - eduLetterBoxService.upOrDownLetter(letterId, status, FebsUtil.getCurrentUser().getUserId(),type); + @ApiParam("0为有用,1为没用") @RequestParam Integer status, + @ApiParam("0为点赞,1为取消") @RequestParam Integer type) { + eduLetterBoxService.upOrDownLetter(letterId, status, FebsUtil.getCurrentUser().getUserId(), type); return ResultBean.buildSuccess(); } @@ -201,14 +190,13 @@ public class OutEduLetterBoxController { */ @ApiOperation("分页查询信箱列表") @GetMapping("/findLetterPageList") - @ControllerLog(operation = "分页查询信箱列表") public ResultBean> findLetterPageList(@ApiParam("问题名称") @RequestParam(required = false) String title, - @ApiParam("学校id") @RequestParam Long schoolId, - @ApiParam("信件类型") @RequestParam(required = false) String contentType, - @ApiParam("手机号") @RequestParam(required = false) String appPhone, - @ApiParam("是否已回复0=否,1是") @RequestParam Integer reply, - @ApiParam("页码") @RequestParam(defaultValue = "1") Integer pageNo, - @ApiParam("数量") @RequestParam(defaultValue = "10") Integer pageSize) { + @ApiParam("学校id") @RequestParam Long schoolId, + @ApiParam("信件类型") @RequestParam(required = false) String contentType, + @ApiParam("手机号") @RequestParam(required = false) String appPhone, + @ApiParam("是否已回复0=否,1是") @RequestParam Integer reply, + @ApiParam("页码") @RequestParam(defaultValue = "1") Integer pageNo, + @ApiParam("数量") @RequestParam(defaultValue = "10") Integer pageSize) { //查询分页数据 Page page = new Page(); page.setCurrent(pageNo); @@ -225,7 +213,7 @@ public class OutEduLetterBoxController { @ApiOperation("提交回复信息") @PostMapping("/submitReplyLetter") - @ControllerLog(operation = "提交回复信息") + @OperationLog(module = ModuleName.LETTER_BOX, methods = "提交回复信息", type = OperationLogTypeEnum.INSERT) public ResultBean submitReplyLetter(@RequestBody EduLetterBox eduLetterBox) { if (ObjectUtil.isEmpty(eduLetterBox.getReplyContent())) { @@ -243,7 +231,7 @@ public class OutEduLetterBoxController { */ @ApiOperation("提交审核") @PostMapping("/submitExamineLetter") - @ControllerLog(operation = "提交审核") + @OperationLog(module = ModuleName.LETTER_BOX, methods = "提交审核", type = OperationLogTypeEnum.UPDATE) public ResultBean submitExamineLetter(@RequestBody EduLetterBox eduLetterBox) { EduLetterBox eduLetterBox1 = eduLetterBoxMapper.selectById(eduLetterBox.getId()); if ("0".equals(eduLetterBox1.getStatus())) { @@ -262,7 +250,7 @@ public class OutEduLetterBoxController { */ @ApiOperation("撤回") @GetMapping("/retract") - @ControllerLog(operation = "撤回") + @OperationLog(module = ModuleName.LETTER_BOX, methods = "撤回", type = OperationLogTypeEnum.UPDATE) public ResultBean retract(@ApiParam("信箱id") @RequestParam Long id) { eduLetterBoxMapper.updateByReply(id); return ResultBean.buildSuccess(); @@ -271,7 +259,7 @@ public class OutEduLetterBoxController { @ApiOperation("批量公开") @PostMapping("/listOpenLetter") - @ControllerLog(operation = "批量公开") + @OperationLog(module = ModuleName.LETTER_BOX, methods = "批量公开", type = OperationLogTypeEnum.UPDATE) public ResultBean listOpenLetter(@RequestBody List ids) { Collection eduLetterBoxes = eduLetterBoxService.listByIds(ids); for (EduLetterBox eduLetterBox : eduLetterBoxes) { @@ -283,7 +271,7 @@ public class OutEduLetterBoxController { @ApiOperation("批量回复") @PostMapping("/listReplyLetter") - @ControllerLog(operation = "批量回复") + @OperationLog(module = ModuleName.LETTER_BOX, methods = "批量回复", type = OperationLogTypeEnum.UPDATE) public ResultBean listReplyLetter(@RequestBody LetterBoxDTO letterBoxDTO) { CurrentUser currentUser = FebsUtil.getCurrentUser(); Collection eduLetterBoxes = eduLetterBoxService.listByIds(letterBoxDTO.getIds()); @@ -293,11 +281,11 @@ public class OutEduLetterBoxController { @ApiOperation("进行置顶或公开操作") @GetMapping(value = "updateTopOrOpen") - @ControllerLog(operation = "进行置顶或公开操作") + @OperationLog(module = ModuleName.LETTER_BOX, methods = "进行置顶或公开操作", type = OperationLogTypeEnum.UPDATE) public ResultBean updateTopOrOpen(@ApiParam("信箱id") @RequestParam Long id, - @ApiParam("学校id") @RequestParam Long schoolId, - @ApiParam("1为置顶,null为取消置顶") @RequestParam(required = false) Integer top, - @ApiParam("1为公开,0为取消公开") @RequestParam(required = false) Integer open) { + @ApiParam("学校id") @RequestParam Long schoolId, + @ApiParam("1为置顶,null为取消置顶") @RequestParam(required = false) Integer top, + @ApiParam("1为公开,0为取消公开") @RequestParam(required = false) Integer open) { if (ObjectUtil.isNotEmpty(top)) { Integer num = eduLetterBoxMapper.getTopNum(schoolId); @@ -315,10 +303,9 @@ public class OutEduLetterBoxController { @ApiOperation("取消置顶") @GetMapping(value = "updateTop") - @ControllerLog(operation = "取消置顶") + @OperationLog(module = ModuleName.LETTER_BOX, methods = "取消置顶", type = OperationLogTypeEnum.UPDATE) public ResultBean updateTop(@ApiParam("信箱id") @RequestParam Long id, - @ApiParam("1为置顶,null为取消置顶") @RequestParam(required = false) Integer top) { - + @ApiParam("1为置顶,null为取消置顶") @RequestParam(required = false) Integer top) { eduLetterBoxMapper.updateTop(id, top); return ResultBean.buildSuccess(); @@ -326,7 +313,7 @@ public class OutEduLetterBoxController { @GetMapping("/viewLetter") public ResultBean viewLetter(Long id, String title, - Integer status, String contentType) { + Integer status, String contentType) { EduLetterBox eduLetterBox = eduLetterBoxMapper.selectById(id); if (StrUtil.isNotBlank(eduLetterBox.getContent())) { eduLetterBox.setContent(EmojiParser.parseToUnicode(eduLetterBox.getContent())); @@ -362,7 +349,7 @@ public class OutEduLetterBoxController { for (int i = 0; i < listViewLetter.size(); i++) { // 判断是否只有一条数据 if (Objects.equals(listViewLetter.get(0).getId(), id) && Objects - .equals(listViewLetter.get(listViewLetter.size() - 1).getId(), id)) { + .equals(listViewLetter.get(listViewLetter.size() - 1).getId(), id)) { previousShow = false; nextShow = false; break; @@ -401,7 +388,6 @@ public class OutEduLetterBoxController { @ApiOperation("查询滚动图列表") @GetMapping("/findBannerList") - @ControllerLog(operation = "查询滚动图列表") public ResultBean> findBannerList(@RequestParam Long deptId) { return ResultBean.buildSuccess(configService.findBannerList(deptId)); @@ -409,7 +395,6 @@ public class OutEduLetterBoxController { @ApiOperation("查询学校对应配置") @GetMapping("/findConfig") - @ControllerLog(operation = "查询学校对应配置") public ResultBean findConfig(@RequestParam Long deptId) { return ResultBean.buildSuccess(configService.findConfig(deptId)); @@ -418,9 +403,9 @@ public class OutEduLetterBoxController { @ApiOperation("新增或修改配置") @PostMapping("/saveOrUpdateConfig") - @ControllerLog(operation = "新增或修改配置") + @OperationLog(module = ModuleName.LETTER_BOX, methods = "新增或修改配置", type = OperationLogTypeEnum.UPDATE) public ResultBean saveOrUpdateConfig(@RequestBody LetterBoxConfigDTO config) { - replyPersonService.saveOrUpdateConfig(config,config.getDeptId()); + replyPersonService.saveOrUpdateConfig(config, config.getDeptId()); return ResultBean.buildSuccess(); } } diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/letter/service/impl/EduLetterBoxServiceImpl.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/letter/service/impl/EduLetterBoxServiceImpl.java index 9cde1e7..065f580 100644 --- a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/letter/service/impl/EduLetterBoxServiceImpl.java +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/letter/service/impl/EduLetterBoxServiceImpl.java @@ -163,7 +163,7 @@ public class EduLetterBoxServiceImpl extends ServiceImpl list = new ArrayList<>(); - List userList = redisService.lGet(AppConstant.LETTER_BOX_LIKE + letterId.toString(), 0L, -1L); + List userList = redisService.lGet(AppConstant.INDEX_PARENT + letterId, 0L, -1L); for (Object o : userList) { String id = String.valueOf(o); list.add(Long.valueOf(id)); } list.add(userId); - redisService.llSet(AppConstant.LETTER_BOX_LIKE + letterId.toString(), list); + redisService.llSet(AppConstant.INDEX_PARENT + letterId, list); } else { List userList = new ArrayList<>(); userList.add(userId); - redisService.llSet(AppConstant.LETTER_BOX_LIKE + letterId.toString(), userList); + redisService.llSet(AppConstant.INDEX_PARENT + letterId, userList); } } //没用 else if (status == 1) { - if (redisService.hasKey(AppConstant.LETTER_BOX_DISLIKE + letterId.toString())) { + if (redisService.hasKey(AppConstant.INDEX_PARENT + "d" + letterId.toString())) { List list = new ArrayList<>(); - List userList = redisService.lGet(AppConstant.LETTER_BOX_DISLIKE + letterId.toString(), 0L, -1L); + List userList = redisService.lGet(AppConstant.INDEX_PARENT + "d" + letterId, 0L, -1L); for (Object o : userList) { String id = String.valueOf(o); list.add(Long.valueOf(id)); } list.add(userId); - redisService.llSet(AppConstant.LETTER_BOX_DISLIKE + letterId.toString(), list); + redisService.llSet(AppConstant.INDEX_PARENT + "d" + letterId, list); } else { List userList = new ArrayList<>(); userList.add(userId); - redisService.llSet(AppConstant.LETTER_BOX_DISLIKE + letterId.toString(), userList); + redisService.llSet(AppConstant.INDEX_PARENT + "d" + letterId, userList); } } } //取消点赞 else { - if (redisService.hasKey(AppConstant.LETTER_BOX_DISLIKE + letterId.toString())) { + if (redisService.hasKey(AppConstant.INDEX_PARENT + "d" + letterId)) { List list = new ArrayList<>(); - List userList = redisService.lGet(AppConstant.LETTER_BOX_DISLIKE + letterId.toString(), 0L, -1L); + List userList = redisService.lGet(AppConstant.INDEX_PARENT + "d" + letterId, 0L, -1L); for (Object o : userList) { String id = String.valueOf(o); list.add(Long.valueOf(id)); @@ -280,12 +280,12 @@ public class EduLetterBoxServiceImpl extends ServiceImpl list = new ArrayList<>(); - List userList = redisService.lGet(AppConstant.LETTER_BOX_LIKE + letterId.toString(), 0L, -1L); + List userList = redisService.lGet(AppConstant.INDEX_PARENT + letterId, 0L, -1L); if (CollectionUtil.isNotEmpty(userList)) { for (Object o : userList) { String id = String.valueOf(o); @@ -293,7 +293,7 @@ public class EduLetterBoxServiceImpl extends ServiceImpl list = new ArrayList<>(); - List userList = redisService.lGet(AppConstant.LETTER_BOX_DISLIKE + eduLetterBox.getId().toString(), 0L, -1L); + List userList = redisService.lGet(AppConstant.INDEX_PARENT + "d" + eduLetterBox.getId(), 0L, -1L); for (Object o : userList) { String id = String.valueOf(o); list.add(Long.valueOf(id)); @@ -396,10 +396,10 @@ public class EduLetterBoxServiceImpl extends ServiceImpl list = new ArrayList<>(); - List userList = redisService.lGet(AppConstant.LETTER_BOX_LIKE + eduLetterBox.getId().toString(), 0L, -1L); + List userList = redisService.lGet(AppConstant.INDEX_PARENT + eduLetterBox.getId().toString(), 0L, -1L); for (Object o : userList) { String id = String.valueOf(o); list.add(Long.valueOf(id)); diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/news/controller/EduSchoolManuscriptController.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/news/controller/EduSchoolManuscriptController.java index 9e64636..c4249e4 100644 --- a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/news/controller/EduSchoolManuscriptController.java +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/news/controller/EduSchoolManuscriptController.java @@ -22,7 +22,6 @@ import com.yida.data.system.feign.RemoteDeptService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; -import java.util.Map; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; @@ -73,7 +72,6 @@ public class EduSchoolManuscriptController { pageSize), schoolId, keyword, author, publishDate, path, notShowId, type, status, label)); } - @ApiOperation("保存、编辑稿件") @PostMapping("/saveManuscript") public ResultBean saveManuscript(@RequestBody EduSchoolManuscript manuscript) { @@ -153,12 +151,4 @@ public class EduSchoolManuscriptController { .in(EduSchoolManuscript::getSchoolId, schoolIds) .eq(EduSchoolManuscript::getType, type)) : 0); } - - @ApiOperation("查询稿件可以发布的位置") - @GetMapping("/getManuscriptPublishPath") - public ResultBean> getManuscriptPublishPath() { - return ResultBean.buildSuccess(null); - } - - } diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/news/service/EduSchoolManuscriptService.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/news/service/EduSchoolManuscriptService.java index 5bce83a..a38a321 100644 --- a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/news/service/EduSchoolManuscriptService.java +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/news/service/EduSchoolManuscriptService.java @@ -45,5 +45,4 @@ public interface EduSchoolManuscriptService extends IService findManuscriptByLabel(Page page, String label); - } diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/news/service/impl/EduNoticeBuyServiceImpl.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/news/service/impl/EduNoticeBuyServiceImpl.java index 8dff873..99b898b 100644 --- a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/news/service/impl/EduNoticeBuyServiceImpl.java +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/news/service/impl/EduNoticeBuyServiceImpl.java @@ -143,7 +143,7 @@ public class EduNoticeBuyServiceImpl extends ServiceImpl implements EduSchoolManuscriptService { + implements EduSchoolManuscriptService { private final static String JOB_BEAN_NAME = "schoolManuscriptTask"; private final static String JOB_METHOD_NAME = "publishManuscript"; private static final Pattern BASE64_IMG_HEAD_PATTERN = Pattern - .compile("\\s*data:([a-z]+\\/[a-z0-9-+.]+(;[a-z-]+=[a-z0-9-]+)?)?(;" + - "base64)?,([A-Za-z0-9+/]{4}){2,}(?:[A-Za-z0-9+=]{4})"); + .compile("\\s*data:([a-z]+\\/[a-z0-9-+.]+(;[a-z-]+=[a-z0-9-]+)?)?(;" + + "base64)?,([A-Za-z0-9+/]{4}){2,}(?:[A-Za-z0-9+=]{4})"); private static final Pattern BASE64_IMG_PATTERN = Pattern.compile("([A-Za-z0-9+/]{4}){2,}(?:[A-Za-z0-9+=]{4})"); private static final Pattern URL_IMG_PATTERN = Pattern.compile("http:\\/\\/((?!http:\\/\\/).)+?(\\.jpg|\\.png)"); - private static final String URL_IMG_PATTERN_MINE = "((http|https|ftp):\\/\\/)?([\\w\\-]+\\.)+[\\w\\-]+(:[0-9]+)?(/[\\w \\-.~!*:@&=+$,/?#%;]*)"; + // private static final Pattern URL_IMG_PATTERN_MINE = Pattern +// .compile("http:\\/\\/((?!https:\\/\\/).)+?(\\/jpg|\\/png|\\/GIF|\\/gif|\\/PNG|\\/JPG)"); + private static final String URL_IMG_PATTERN_MINE = "((http|https|ftp):\\/\\/)?([\\w\\-]+\\.)+[\\w\\-]+(:[0-9]+)?(/[\\w \\-.~!*:@&=+$,/?#%]*)"; + // private static final String LOCAL_IMG_URL_HRAD = "http://zbz.yd-data.com"; private static final ExecutorService PUBLISH_THREAD_POOL = - new ThreadPoolExecutor(5, 10, 30, TimeUnit.SECONDS, new LinkedBlockingQueue<>()); + new ThreadPoolExecutor(5, 10, 30, TimeUnit.SECONDS, new LinkedBlockingQueue<>()); private final RemoteJobService remoteJobService; private final EduSchoolHomeAnnouncementMapper eduSchoolHomeAnnouncementMapper; private final EduSchoolManuscriptAuthorMapper eduSchoolManuscriptAuthorMapper; @@ -94,14 +96,12 @@ public class EduSchoolManuscriptServiceImpl extends ServiceImpl @Value("${febs.uploadUrl}") private String uploadUrl; - private final TransactionTemplate transactionTemplate; - @Override public IPage listManuscriptPage(Page page, Long schoolId, String keyword, - String author, String publishDate, Integer path, - Long notShowId, Integer type, Integer status, Integer label) { + String author, String publishDate, Integer path, + Long notShowId, Integer type, Integer status, Integer label) { IPage ipage = baseMapper.listManuscriptPage(page, schoolId, keyword, author, - publishDate, path, notShowId, type, status, label); + publishDate, path, notShowId, type, status, label); for (ManuscriptPageInfoVO record : ipage.getRecords()) { String htmlStr = HtmlUtil.cleanHtmlTag(record.getContent()); if (StrUtil.isBlank(htmlStr) || htmlStr.length() < 50) { @@ -128,179 +128,156 @@ public class EduSchoolManuscriptServiceImpl extends ServiceImpl } @Override + @Transactional(rollbackFor = Exception.class) public void saveManuscript(EduSchoolManuscript manuscript, String key) { - // 添加处理进度 + redisService + .hset(CachePrefixConstant.ADD_MANUSCRIPT_PROGRESS, key, AddManuscriptProgress.builder().key(key).finish(0).build()); + AddManuscriptProgress addManuscriptProgress = new AddManuscriptProgress(); addManuscriptProgress.setKey(key); - try { - // 添加初始缓存 - redisService - .hset(CachePrefixConstant.ADD_MANUSCRIPT_PROGRESS, key, AddManuscriptProgress.builder().key(key).finish(0).build()); - Dept school = commonService.getDept(manuscript.getSchoolId()); - if (StrUtil.isBlank(school.getWxPublicAppId()) && manuscript.getPublishPath() - .contains(EduSchoolManuscript.WX_PUBLIC_PATH)) { - addManuscriptProgress.setErrorMsg("该学校未绑定微信公众号"); - throw new FebsException("该学校未绑定微信公众号"); - } - - if (school.getSchoolType().contains(Dept.TYPE_YIDA_APP)) { - EduSchoolManuscriptAuthor author = eduSchoolManuscriptAuthorMapper.selectById(manuscript.getAuthorId()); - if (StrUtil.isBlank(author.getYidaAppUserId())) { - addManuscriptProgress.setErrorMsg("该作者未在易达APP中创建,请选择其他作者"); - throw new FebsException("该作者未在易达APP中创建,请选择其他作者"); - } - } - // 正则匹配base64为url - Matcher matcher1 = BASE64_IMG_HEAD_PATTERN.matcher(manuscript.getContent()); - Matcher matcher2 = BASE64_IMG_PATTERN.matcher(manuscript.getContent()); - List saveMatter = new ArrayList<>(); - if (matcher1.find()) { - matcher2.find(); - for (int i = 0; i < matcher1.groupCount(); i++) { - try { - String base64 = matcher1.group(i); - if (base64 == null || base64.length() < 22 || matcher2.group(i) == null || StrUtil - .isBlankIfStr(matcher2.group(i))) { - continue; - } - String base64Code = matcher2.group(i); - String url = remoteCommonService.uploadImg(base64Code).getData(); - manuscript.setContent(manuscript.getContent().replace(base64, url)); - } catch (Exception e) { - log.error("处理base图片失败", e); - } - } - } - //正则匹配非本地媒资系统URL - List urlList = ReUtil.findAll(URL_IMG_PATTERN_MINE, manuscript.getContent(), 0, new ArrayList<>()); - log.info("匹配出的图片:【{}】", urlList); - for (String url : urlList) { - try { - if (url == null || url.length() < 12 || url.contains(uploadUrl)) { - continue; - } - String path = com.yida.data.common.core.utils.FileUtil.downloadToLocal(url); - log.info("缓存本地图片地址:【{}】", path); - // 上传本地媒资系统 -// String base64 = com.yida.data.common.core.utils.FileUtil.convertFileToBase64(new File(path)); -// String newUrl = remoteCommonService.uploadImg(base64).getData(); - String newUrl = com.yida.data.common.core.utils.FileUtil.uploadFileToMediaServer(uploadUrl, path); - FileUtil.del(path); - manuscript.setContent(manuscript.getContent().replace(url, newUrl)); - } catch (Exception e) { - log.error("处理图片失败, url: {}", url, e); - } - } - // 上传图片到素材库 - if (CollUtil.isNotEmpty(saveMatter)) { - List list = eduSchoolMatterService.list(Wrappers.lambdaQuery(new EduSchoolMatter()) - .eq(EduSchoolMatter::getSchoolId, manuscript.getSchoolId()) - .in(EduSchoolMatter::getUrl, saveMatter) - .select(EduSchoolMatter::getUrl)); - if (CollUtil.isNotEmpty(list)) { - // 已存在的素材库 - List collect = list.stream().map(EduSchoolMatter::getUrl).collect(Collectors.toList()); - saveMatter = saveMatter.stream().filter(x -> !collect.contains(x)).collect(Collectors.toList()); - } - if (CollUtil.isNotEmpty(saveMatter)) { - eduSchoolMatterService.saveMatterBatch(saveMatter, manuscript.getSchoolId(), 0); - } - } - // 使用编程式事务 - transactionTemplate.executeWithoutResult(transactionStatus -> { - try { - saveOrUpdate(manuscript); - if (CollUtil.isNotEmpty(manuscript.getTags())) { - List labels = manuscript.getTags(); - List list = new ArrayList<>(); - for (Long label : labels) { - EduSchoolManuscriptLabel eduSchoolManuscriptLabel = new EduSchoolManuscriptLabel(); - eduSchoolManuscriptLabel.setLabel(label); - eduSchoolManuscriptLabel.setManuscriptId(manuscript.getId()); - list.add(eduSchoolManuscriptLabel); - } - labelService.saveBatch(list); - } - if (Objects.isNull(manuscript.getContentType())) { - // 如果没有则默认为文章类型 - manuscript.setContentType(1); - } - if (manuscript.getStatus() != 0 && manuscript.getContentType() != 2) { - if (manuscript.getIsTiming() == 0) { - // 定时发送 - StringBuilder cron = new StringBuilder(); - // cron表达式 - cron.append("0") - .append(" ") - .append(manuscript.getPublishDate().getMinute()) - .append(" ") - .append(manuscript.getPublishDate().getHour()) - .append(" ") - .append(manuscript.getPublishDate().getDayOfMonth()) - .append(" ") - .append(manuscript.getPublishDate().getMonthValue()) - .append(" ") - .append("?") - .append(" ") - .append(manuscript.getPublishDate().getYear()); - Job job = new Job(); - job.setBeanName(JOB_BEAN_NAME); - job.setMethodName(JOB_METHOD_NAME); - job.setParams(manuscript.getId().toString()); - job.setCronExpression(cron.toString()); - job.setRemark(String.format("学校稿件定时发送,name:[%s],id:[%d]", manuscript.getTitle(), - manuscript.getId())); - job.setStatus(Job.ScheduleStatus.NORMAL.getValue()); - remoteJobService.saveJob(job); - } else { - // 立即发送 - manuscript.setPublishDate(LocalDateTime.now()); - updateById(manuscript); - publishManuscript(manuscript); - } - } - } catch (Exception e) { - // 手动回滚事务 - transactionStatus.setRollbackOnly(); - } - }); - } catch (Exception e) { - throw new FebsException(e instanceof FebsException ? e.getMessage() : "保存失败"); - } finally { - // 添加完成信息 + Dept school = commonService.getDept(manuscript.getSchoolId()); + if (StrUtil.isBlank(school.getWxPublicAppId()) && manuscript.getPublishPath() + .contains(EduSchoolManuscript.WX_PUBLIC_PATH)) { addManuscriptProgress.setFinish(1); + addManuscriptProgress.setErrorMsg("该学校未绑定微信公众号"); redisService - .hset(CachePrefixConstant.ADD_MANUSCRIPT_PROGRESS, key, addManuscriptProgress); + .hset(CachePrefixConstant.ADD_MANUSCRIPT_PROGRESS, key, addManuscriptProgress); + + throw new FebsException("该学校未绑定微信公众号"); +// Asserts.isFalse(StrUtil.isBlank(school.getWxPublicAppId()) && manuscript.getPublishPath() +// .contains(EduSchoolManuscript.WX_PUBLIC_PATH), "该学校未绑定微信公众号"); } + + if (school.getSchoolType().contains(Dept.TYPE_YIDA_APP)) { + EduSchoolManuscriptAuthor author = eduSchoolManuscriptAuthorMapper.selectById(manuscript.getAuthorId()); + if (StrUtil.isBlank(author.getYidaAppUserId())) { + addManuscriptProgress.setFinish(1); + addManuscriptProgress.setErrorMsg("该作者未在易达APP中创建,请选择其他作者"); + redisService + .hset(CachePrefixConstant.ADD_MANUSCRIPT_PROGRESS, key, addManuscriptProgress); + throw new FebsException("该作者未在易达APP中创建,请选择其他作者"); + } +// Asserts.isTrue(StrUtil.isNotBlank(author.getYidaAppUserId()), "该作者未在易达APP中创建,请选择其他作者"); + } + // 正则匹配base64为url + Matcher matcher1 = BASE64_IMG_HEAD_PATTERN.matcher(manuscript.getContent()); + Matcher matcher2 = BASE64_IMG_PATTERN.matcher(manuscript.getContent()); + List saveMatter = new ArrayList<>(); + if (matcher1.find()) { + matcher2.find(); + for (int i = 0; i < matcher1.groupCount(); i++) { + String base64 = matcher1.group(i); + if (base64 == null || base64.length() < 22 || matcher2.group(i) == null || StrUtil + .isBlankIfStr(matcher2.group(i))) { + continue; + } + String base64Code = matcher2.group(i); + String url = remoteCommonService.uploadImg(base64Code).getData(); + manuscript.setContent(manuscript.getContent().replace(base64, url)); + } + } + //正则匹配非本地媒资系统URL + List urlList = ReUtil.findAll(URL_IMG_PATTERN_MINE, manuscript.getContent(), 0, new ArrayList<>()); + log.info("匹配出的图片:【{}】", urlList); + for (String url : urlList) { + if (url == null || url.length() < 12 || url.contains(uploadUrl)) { + continue; + } + String path = com.yida.data.common.core.utils.FileUtil.downloadToLocal(url); + + log.info("缓存本地图片地址:【{}】", path); + //上传本地媒资系统 + String newUrl = com.yida.data.common.core.utils.FileUtil.uploadFileToMediaServer(uploadUrl, path); + FileUtil.del(path); + manuscript.setContent(manuscript.getContent().replace(url, newUrl)); + } + // 上传图片到素材库 + if (CollUtil.isNotEmpty(saveMatter)) { + List list = eduSchoolMatterService.list(Wrappers.lambdaQuery(new EduSchoolMatter()) + .eq(EduSchoolMatter::getSchoolId, manuscript.getSchoolId()) + .in(EduSchoolMatter::getUrl, saveMatter) + .select(EduSchoolMatter::getUrl)); + if (CollUtil.isNotEmpty(list)) { + // 已存在的素材库 + List collect = list.stream().map(x -> x.getUrl()).collect(Collectors.toList()); + saveMatter = saveMatter.stream().filter(x -> !collect.contains(x)).collect(Collectors.toList()); + } + if (CollUtil.isNotEmpty(saveMatter)) { + eduSchoolMatterService.saveMatterBatch(saveMatter, manuscript.getSchoolId(), 0); + } + } + saveOrUpdate(manuscript); + if (CollUtil.isNotEmpty(manuscript.getTags())) { + List labels = manuscript.getTags(); + List list = new ArrayList<>(); + for (Long label : labels) { + EduSchoolManuscriptLabel eduSchoolManuscriptLabel = new EduSchoolManuscriptLabel(); + eduSchoolManuscriptLabel.setLabel(label); + eduSchoolManuscriptLabel.setManuscriptId(manuscript.getId()); + list.add(eduSchoolManuscriptLabel); + } + labelService.saveBatch(list); + } + if (Objects.isNull(manuscript.getContentType())) { + // 如果没有则默认为文章类型 + manuscript.setContentType(1); + } + if (manuscript.getStatus() != 0 && manuscript.getContentType() != 2) { + if (manuscript.getIsTiming() == 0) { + // 定时发送 + StringBuilder cron = new StringBuilder(); + // cron表达式 + cron.append("0") + .append(" ") + .append(manuscript.getPublishDate().getMinute()) + .append(" ") + .append(manuscript.getPublishDate().getHour()) + .append(" ") + .append(manuscript.getPublishDate().getDayOfMonth()) + .append(" ") + .append(manuscript.getPublishDate().getMonthValue()) + .append(" ") + .append("?") + .append(" ") + .append(manuscript.getPublishDate().getYear()); + Job job = new Job(); + job.setBeanName(JOB_BEAN_NAME); + job.setMethodName(JOB_METHOD_NAME); + job.setParams(manuscript.getId().toString()); + job.setCronExpression(cron.toString()); + job.setRemark(String.format("学校稿件定时发送,name:[%s],id:[%d]", manuscript.getTitle(), + manuscript.getId())); + job.setStatus(Job.ScheduleStatus.NORMAL.getValue()); + remoteJobService.saveJob(job); + } else { + // 立即发送 + manuscript.setPublishDate(LocalDateTime.now()); + updateById(manuscript); + publishManuscript(manuscript); + } + } + addManuscriptProgress.setFinish(1); + redisService + .hset(CachePrefixConstant.ADD_MANUSCRIPT_PROGRESS, key, addManuscriptProgress); } @Override @Transactional public void delManuscript(List ids) { Collection manuscriptList = listByIds(ids); - String yidaAppUserId = null; for (EduSchoolManuscript manuscript : manuscriptList) { - if (ObjectUtil.isNull(yidaAppUserId)) { - if (ObjectUtil.isNotNull(manuscript.getAuthorId())) { - EduSchoolManuscriptAuthor author = eduSchoolManuscriptAuthorMapper - .selectById(manuscript.getAuthorId()); - if (ObjectUtil.isNotNull(author)) { - yidaAppUserId = author.getYidaAppUserId(); - } - } - } - if (manuscript.getStatus() == 1 && manuscript.getIsTiming() == 0) { remoteJobService.delJobByMethod(JOB_BEAN_NAME, JOB_METHOD_NAME, manuscript.getId().toString()); } } + removeByIds(ids); List manuscriptYidaIds = manuscriptList.stream().map(EduSchoolManuscript::getYidaAppMunascriptId) - .filter(StrUtil::isNotBlank).collect(Collectors.toList()); + .filter(StrUtil::isNotBlank).collect(Collectors.toList()); if (CollUtil.isNotEmpty(manuscriptYidaIds)) { EduYidaApp yidaApp = commonService.getYidaApp(manuscriptList.toArray(new EduSchoolManuscript[0])[0].getSchoolId()); - AppUtil.manuscriptDel(manuscriptYidaIds, yidaApp, yidaAppUserId); + AppUtil.manuscriptDel(manuscriptYidaIds, yidaApp); } } @@ -309,18 +286,9 @@ public class EduSchoolManuscriptServiceImpl extends ServiceImpl EduSchoolManuscript manuscript = getById(id); // 判断是否调用易达app撤回稿件接口 if (Objects.nonNull(manuscript.getYidaAppMunascriptId())) { - String yidaAppUserId = null; EduYidaApp yidaApp = commonService.getYidaApp(manuscript.getSchoolId()); - - if (ObjectUtil.isNotNull(manuscript.getAuthorId())) { - EduSchoolManuscriptAuthor author = eduSchoolManuscriptAuthorMapper - .selectById(manuscript.getAuthorId()); - if (ObjectUtil.isNotNull(author)) { - yidaAppUserId = author.getYidaAppUserId(); - } - } - AppUtil.manuscriptDel(Collections.singletonList(manuscript.getYidaAppMunascriptId()), yidaApp, yidaAppUserId); -// manuscript.setYidaAppMunascriptId(""); + AppUtil.manuscriptDel(Collections.singletonList(manuscript.getYidaAppMunascriptId()), yidaApp); + manuscript.setYidaAppMunascriptId(""); } // 修改为撤回(待发送)状态 manuscript.setStatus(1); @@ -354,11 +322,11 @@ public class EduSchoolManuscriptServiceImpl extends ServiceImpl EduSchoolManuscriptAuthor author; if (manuscript.getAuthorId() == null) { author = eduSchoolManuscriptAuthorMapper - .selectOne(Wrappers.lambdaQuery() - .eq(EduSchoolManuscriptAuthor::getSchoolId, school.getDeptId()) - .isNotNull(EduSchoolManuscriptAuthor::getYidaAppUserId) - .orderByAsc(EduSchoolManuscriptAuthor::getCreateDate) - .last("limit 1")); + .selectOne(Wrappers.lambdaQuery() + .eq(EduSchoolManuscriptAuthor::getSchoolId, school.getDeptId()) + .isNotNull(EduSchoolManuscriptAuthor::getYidaAppUserId) + .orderByAsc(EduSchoolManuscriptAuthor::getCreateDate) + .last("limit 1")); } else { author = eduSchoolManuscriptAuthorMapper.selectById(manuscript.getAuthorId()); } @@ -369,11 +337,11 @@ public class EduSchoolManuscriptServiceImpl extends ServiceImpl // 公告同步的稿件放入公告区 if (manuscript.getNoticeSchoolId() != null) { EduSchoolHomeAnnouncement announcement = eduSchoolHomeAnnouncementMapper - .selectOne(Wrappers.lambdaQuery(new EduSchoolHomeAnnouncement()) - .eq(EduSchoolHomeAnnouncement::getSchoolId, school.getDeptId())); + .selectOne(Wrappers.lambdaQuery(new EduSchoolHomeAnnouncement()) + .eq(EduSchoolHomeAnnouncement::getSchoolId, school.getDeptId())); if (StrUtil.isNotBlank(announcement.getYidaAppRegionId())) { AppUtil.regionSaveContent(announcement.getYidaAppRegionId(), manuscriptId, null, - school.getYidaAppColId(), yidaApp); + school.getYidaAppColId(), yidaApp); } } } @@ -381,7 +349,7 @@ public class EduSchoolManuscriptServiceImpl extends ServiceImpl @Override public IPage findManuscriptByLabel(Page page, String label) { List labelList = labelService.list(Wrappers.query(new EduSchoolManuscriptLabel()) - .lambda().eq(EduSchoolManuscriptLabel::getLabel, label)); + .lambda().eq(EduSchoolManuscriptLabel::getLabel, label)); List manuscriptId = new ArrayList<>(); for (EduSchoolManuscriptLabel item : labelList) { manuscriptId.add(item.getManuscriptId()); @@ -391,7 +359,7 @@ public class EduSchoolManuscriptServiceImpl extends ServiceImpl } return page(page, Wrappers.query(new EduSchoolManuscript()).lambda().eq(EduSchoolManuscript::getType, 2) - .in(EduSchoolManuscript::getId, manuscriptId)); + .in(EduSchoolManuscript::getId, manuscriptId)); } /** @@ -415,7 +383,7 @@ public class EduSchoolManuscriptServiceImpl extends ServiceImpl wxPublishPublic(manuscript, school); } // 发布公告到易达app - if (school.getSchoolType().contains(Dept.TYPE_YIDA_APP) && publishPath.contains(EduSchoolManuscript.NEWS_PATH)) { + if (school.getSchoolType().contains(Dept.TYPE_YIDA_APP)) { saveManuscriptToYidaApp(manuscript, school, yidaApp); } // 稿件不是从学校通知同步且学校绑定企业微信才发送微信通知 @@ -433,7 +401,7 @@ public class EduSchoolManuscriptServiceImpl extends ServiceImpl } private void wxPublishNotice(EduSchoolManuscript manuscript) { - EduApp eduApp = commonService.getAppByCodeAndSchool(AppConstant.NOTICE_PARENT, null, manuscript.getSchoolId()); + EduApp eduApp = commonService.getAppByCodeAndSchool(AppConstant.INDEX_PARENT, null, manuscript.getSchoolId()); String accessToken = wxUtil.getAccessToken(eduApp.getWxCorpId(), eduApp.getWxSecret()); String contentText = HtmlUtil.cleanHtmlTag(manuscript.getContent()); MpNewsSchoolNotice notice = new MpNewsSchoolNotice(); @@ -443,8 +411,8 @@ public class EduSchoolManuscriptServiceImpl extends ServiceImpl if (manuscript.getCoverType() != 0) { try { String path = - com.yida.data.common.core.utils.FileUtil - .downloadCompressBase64Img(manuscript.getCoverUrl().split(",")[0], 2048L); + com.yida.data.common.core.utils.FileUtil + .downloadCompressBase64Img(manuscript.getCoverUrl().split(",")[0], 2048L); File file = new File(path); article.setThumb_media_id(wxUtil.uploadTempFile(accessToken, "image", file)); FileUtil.del(path); @@ -476,7 +444,7 @@ public class EduSchoolManuscriptServiceImpl extends ServiceImpl if (manuscript.getCoverType() != 0) { try { String path = com.yida.data.common.core.utils.FileUtil - .downloadCompressBase64Img(manuscript.getCoverUrl().split(",")[0], 64L); + .downloadCompressBase64Img(manuscript.getCoverUrl().split(",")[0], 64L); File file = new File(path); article.setThumb_media_id(wxPublicUtil.uploadTempMaterial("thumb", file, token)); FileUtil.del(path); diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/news/service/impl/EduSchoolMatterServiceImpl.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/news/service/impl/EduSchoolMatterServiceImpl.java index 5038f1a..0dbcfe6 100644 --- a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/news/service/impl/EduSchoolMatterServiceImpl.java +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/news/service/impl/EduSchoolMatterServiceImpl.java @@ -125,10 +125,21 @@ public class EduSchoolMatterServiceImpl extends ServiceImpl eduSchoolMatterMatterGroupService.remove(Wrappers.lambdaQuery(new EduSchoolMatterMatterGroup()) .in(EduSchoolMatterMatterGroup::getMatterId, ids)); if (StrUtil.isNotBlank(school.getWxPublicAppId())) { - String token = wxPublicUtil.getAccessToken(school.getWxPublicAppId(), school.getWxPublicSecret()); + String token; + try { + token = wxPublicUtil.getAccessToken(school.getWxPublicAppId(), school.getWxPublicSecret()); + } catch (Exception e) { + log.error("获取token失败", e); + return; + } for (EduSchoolMatter matter : eduSchoolMatters) { if (StrUtil.isNotBlank(matter.getWxPublicMediaId())) { - wxPublicUtil.deleteMaterial(matter.getWxPublicMediaId(), token); + try { + wxPublicUtil.deleteMaterial(matter.getWxPublicMediaId(), token); + } catch (Exception e) { + log.error("删除微信公众号素材失败", e); + } + } } } diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/screen/controller/EduSchoolDashboardDataController.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/screen/controller/EduSchoolDashboardDataController.java new file mode 100644 index 0000000..bce59ac --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/screen/controller/EduSchoolDashboardDataController.java @@ -0,0 +1,42 @@ +package com.yida.data.school.screen.controller; + +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.utils.FebsUtil; +import com.yida.data.school.dto.screen.SchoolDashboardSaveDTO; +import com.yida.data.school.screen.service.EduSchoolDashboardDataService; +import com.yida.data.school.vo.screen.SchoolDashboardInfoVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.*; + +/** + * 校园大数据仪表盘数据中心Controller + * + * @author ZYJ + * @date 2023-04-19 16:42:57 + */ +@Slf4j +@RestController +@RequiredArgsConstructor +@Api(tags = "校园大数据仪表盘api") +@RequestMapping("eduSchoolDashboardData") +public class EduSchoolDashboardDataController { + + private final EduSchoolDashboardDataService eduSchoolDashboardDataService; + + @GetMapping(value = "getSchoolDashboardInfo") + @ApiOperation(value = "获取校园大数据详细信息", consumes = MediaType.APPLICATION_JSON_VALUE) + public ResultBean getSchoolDashboardInfo() { + return ResultBean.buildSuccess(eduSchoolDashboardDataService.getSchoolDashboardInfo(FebsUtil.getDeptId())); + } + + @PostMapping(value = "/saveSchoolDashboard", consumes = MediaType.APPLICATION_JSON_VALUE) + @ApiOperation(value = "保存校园大数据", consumes = MediaType.APPLICATION_JSON_VALUE) + public ResultBean saveSchoolDashboard(@RequestBody SchoolDashboardSaveDTO dto) { + eduSchoolDashboardDataService.saveSchoolDashboard(dto); + return ResultBean.buildSuccess(); + } +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/screen/controller/out/OutEduSchoolDashboardDataController.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/screen/controller/out/OutEduSchoolDashboardDataController.java new file mode 100644 index 0000000..5bb388b --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/screen/controller/out/OutEduSchoolDashboardDataController.java @@ -0,0 +1,34 @@ +package com.yida.data.school.screen.controller.out; + +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.school.dto.screen.SchoolDashboardSaveDTO; +import com.yida.data.school.screen.service.EduSchoolDashboardDataService; +import com.yida.data.school.vo.screen.SchoolDashboardInfoVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.*; + +/** + * 校园大数据仪表盘数据中心Controller(不鉴权) + * + * @author ZYJ + * @date 2023-04-19 16:42:57 + */ +@Slf4j +@RestController +@RequiredArgsConstructor +@Api(tags = "校园大数据仪表盘api(不鉴权)") +@RequestMapping("out/eduSchoolDashboardData") +public class OutEduSchoolDashboardDataController { + + private final EduSchoolDashboardDataService eduSchoolDashboardDataService; + + @GetMapping(value = "getSchoolDashboardInfo") + @ApiOperation(value = "获取校园大数据详细信息", consumes = MediaType.APPLICATION_JSON_VALUE) + public ResultBean getSchoolDashboardInfo(@RequestParam Long schoolId) { + return ResultBean.buildSuccess(eduSchoolDashboardDataService.getSchoolDashboardInfo(schoolId)); + } +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/screen/mapper/EduSchoolDashboardDataBaseMapper.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/screen/mapper/EduSchoolDashboardDataBaseMapper.java new file mode 100644 index 0000000..2621890 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/screen/mapper/EduSchoolDashboardDataBaseMapper.java @@ -0,0 +1,14 @@ +package com.yida.data.school.screen.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.screen.EduSchoolDashboardDataBase; + +/** + * 校园大数据仪表盘数据中心-基础建设Mapper + * + * @author ZYJ + * @date 2023-04-19 16:52:15 + */ +public interface EduSchoolDashboardDataBaseMapper extends BaseMapper { + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/screen/mapper/EduSchoolDashboardDataMapper.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/screen/mapper/EduSchoolDashboardDataMapper.java new file mode 100644 index 0000000..6223704 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/screen/mapper/EduSchoolDashboardDataMapper.java @@ -0,0 +1,14 @@ +package com.yida.data.school.screen.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.screen.EduSchoolDashboardData; + +/** + * 校园大数据仪表盘数据中心Mapper + * + * @author ZYJ + * @date 2023-04-19 16:42:57 + */ +public interface EduSchoolDashboardDataMapper extends BaseMapper { + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/screen/mapper/EduSchoolDashboardDataTeacherMapper.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/screen/mapper/EduSchoolDashboardDataTeacherMapper.java new file mode 100644 index 0000000..1429ed9 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/screen/mapper/EduSchoolDashboardDataTeacherMapper.java @@ -0,0 +1,14 @@ +package com.yida.data.school.screen.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.screen.EduSchoolDashboardDataTeacher; + +/** + * 校园大数据仪表盘数据中心-师资力量Mapper + * + * @author ZYJ + * @date 2023-04-19 16:58:48 + */ +public interface EduSchoolDashboardDataTeacherMapper extends BaseMapper { + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/screen/service/EduSchoolDashboardDataBaseService.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/screen/service/EduSchoolDashboardDataBaseService.java new file mode 100644 index 0000000..a446d2b --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/screen/service/EduSchoolDashboardDataBaseService.java @@ -0,0 +1,14 @@ +package com.yida.data.school.screen.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.screen.EduSchoolDashboardDataBase; + +/** + * 校园大数据仪表盘数据中心-基础建设Service接口 + * + * @author ZYJ + * @date 2023-04-19 16:52:15 + */ +public interface EduSchoolDashboardDataBaseService extends IService { + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/screen/service/EduSchoolDashboardDataService.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/screen/service/EduSchoolDashboardDataService.java new file mode 100644 index 0000000..1e6676f --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/screen/service/EduSchoolDashboardDataService.java @@ -0,0 +1,34 @@ +package com.yida.data.school.screen.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.screen.EduSchoolDashboardData; +import com.yida.data.school.dto.screen.SchoolDashboardSaveDTO; +import com.yida.data.school.vo.screen.SchoolDashboardInfoVO; + +/** + * 校园大数据仪表盘数据中心Service接口 + * + * @author ZYJ + * @date 2023-04-19 16:42:57 + */ +public interface EduSchoolDashboardDataService extends IService { + + /** + * 获取校园大数据详细信息 + * + * @param deptId 学校id + * @return com.yida.data.school.vo.screen.SchoolDashboardInfoVO + * @author ZYJ + * @date 2023/4/19 17:35 + */ + SchoolDashboardInfoVO getSchoolDashboardInfo(Long deptId); + + /** + * 保存校园大数据 + * + * @param dto 保存校园大数据请求类 + * @author ZYJ + * @date 2023/4/20 11:31 + */ + void saveSchoolDashboard(SchoolDashboardSaveDTO dto); +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/screen/service/EduSchoolDashboardDataTeacherService.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/screen/service/EduSchoolDashboardDataTeacherService.java new file mode 100644 index 0000000..ebc2664 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/screen/service/EduSchoolDashboardDataTeacherService.java @@ -0,0 +1,14 @@ +package com.yida.data.school.screen.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.screen.EduSchoolDashboardDataTeacher; + +/** + * 校园大数据仪表盘数据中心-师资力量Service接口 + * + * @author ZYJ + * @date 2023-04-19 16:58:48 + */ +public interface EduSchoolDashboardDataTeacherService extends IService { + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/screen/service/impl/EduSchoolDashboardDataBaseServiceImpl.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/screen/service/impl/EduSchoolDashboardDataBaseServiceImpl.java new file mode 100644 index 0000000..640796c --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/screen/service/impl/EduSchoolDashboardDataBaseServiceImpl.java @@ -0,0 +1,25 @@ +package com.yida.data.school.screen.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.screen.EduSchoolDashboardDataBase; +import com.yida.data.school.screen.mapper.EduSchoolDashboardDataBaseMapper; +import com.yida.data.school.screen.service.EduSchoolDashboardDataBaseService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * 校园大数据仪表盘数据中心-基础建设Service实现 + * + * @author ZYJ + * @date 2023-04-19 16:52:15 + */ +@Slf4j +@Service +@RequiredArgsConstructor +@Transactional(rollbackFor = Exception.class) +public class EduSchoolDashboardDataBaseServiceImpl extends ServiceImpl + implements EduSchoolDashboardDataBaseService { + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/screen/service/impl/EduSchoolDashboardDataServiceImpl.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/screen/service/impl/EduSchoolDashboardDataServiceImpl.java new file mode 100644 index 0000000..c74c1c7 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/screen/service/impl/EduSchoolDashboardDataServiceImpl.java @@ -0,0 +1,122 @@ +package com.yida.data.school.screen.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.json.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.screen.EduSchoolDashboardData; +import com.yida.data.common.core.entity.screen.EduSchoolDashboardDataBase; +import com.yida.data.common.core.entity.screen.EduSchoolDashboardDataTeacher; +import com.yida.data.common.core.utils.FebsUtil; +import com.yida.data.school.dto.screen.SchoolDashboardBaseSaveDTO; +import com.yida.data.school.dto.screen.SchoolDashboardSaveDTO; +import com.yida.data.school.dto.screen.SchoolDashboardTeacherSaveDTO; +import com.yida.data.school.screen.mapper.EduSchoolDashboardDataMapper; +import com.yida.data.school.screen.service.EduSchoolDashboardDataBaseService; +import com.yida.data.school.screen.service.EduSchoolDashboardDataService; +import com.yida.data.school.screen.service.EduSchoolDashboardDataTeacherService; +import com.yida.data.school.vo.screen.SchoolDashboardInfoVO; +import com.yida.data.user.feign.RemoteStudentService; +import com.yida.data.user.feign.RemoteTeacherService; +import com.yida.data.user.feign.RemoteUserDeptService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * 校园大数据仪表盘数据中心Service实现 + * + * @author ZYJ + * @date 2023-04-19 16:42:57 + */ +@Slf4j +@Service +@RequiredArgsConstructor +@Transactional(rollbackFor = Exception.class) +public class EduSchoolDashboardDataServiceImpl extends ServiceImpl + implements EduSchoolDashboardDataService { + + private final EduSchoolDashboardDataBaseService eduSchoolDashboardDataBaseService; + private final EduSchoolDashboardDataTeacherService eduSchoolDashboardDataTeacherService; + + private final RemoteStudentService remoteStudentService; + + @Override + public SchoolDashboardInfoVO getSchoolDashboardInfo(Long deptId) { + SchoolDashboardInfoVO vo = new SchoolDashboardInfoVO(); + // 查询校园大数据详情数据 + EduSchoolDashboardData dashboardData = getOne(Wrappers.lambdaQuery(new EduSchoolDashboardData()) + .eq(EduSchoolDashboardData::getSchoolId, deptId)); + if (Objects.nonNull(dashboardData)) { + BeanUtils.copyProperties(dashboardData, vo); + // 查询基础建设集合 + List baseList = eduSchoolDashboardDataBaseService.list(Wrappers.lambdaQuery(new EduSchoolDashboardDataBase()) + .eq(EduSchoolDashboardDataBase::getDataId, dashboardData.getId())).stream().map(base -> { + SchoolDashboardBaseSaveDTO baseDTO = new SchoolDashboardBaseSaveDTO(); + BeanUtils.copyProperties(base, baseDTO); + return baseDTO; + }).collect(Collectors.toList()); + vo.setBaseList(baseList); + // 查询师资力量集合 + List teacherList = eduSchoolDashboardDataTeacherService.list(Wrappers.lambdaQuery(new EduSchoolDashboardDataTeacher()) + .eq(EduSchoolDashboardDataTeacher::getDataId, dashboardData.getId())).stream().map(teacher -> { + SchoolDashboardTeacherSaveDTO teacherDTO = new SchoolDashboardTeacherSaveDTO(); + BeanUtils.copyProperties(teacher, teacherDTO); + return teacherDTO; + }).collect(Collectors.toList()); + vo.setTeacherList(teacherList); + } + return vo; + } + + @Override + public void saveSchoolDashboard(SchoolDashboardSaveDTO dto) { + EduSchoolDashboardData dashboardData = new EduSchoolDashboardData(); + BeanUtils.copyProperties(dto, dashboardData); + // 统计班级人数、学生人数、教师人数 + JSONObject jsonObject = remoteStudentService.countUserDashboardNum(FebsUtil.getTopDeptId()).getData(); + // 新增 + if (Objects.isNull(dto.getId())) { + dashboardData.setSchoolId(FebsUtil.getTopDeptId()); + } else { + // 编辑, 需要删除旧的关联数据 + eduSchoolDashboardDataBaseService.remove(Wrappers.lambdaQuery(new EduSchoolDashboardDataBase()) + .eq(EduSchoolDashboardDataBase::getDataId, dto.getId())); + eduSchoolDashboardDataTeacherService.remove(Wrappers.lambdaQuery(new EduSchoolDashboardDataTeacher()) + .eq(EduSchoolDashboardDataTeacher::getDataId, dto.getId())); + } + dashboardData.setStudentNum(jsonObject.getInt("studentNum")); + dashboardData.setClassNum(jsonObject.getInt("classNum")); + dashboardData.setTeacherNum(jsonObject.getInt("teacherNum")); + saveOrUpdate(dashboardData); + // 保存基础设施 + if (CollUtil.isNotEmpty(dto.getBaseList())) { + List baseList = new ArrayList<>(); + dto.getBaseList().forEach(baseDTO -> { + EduSchoolDashboardDataBase dataBase = new EduSchoolDashboardDataBase(); + BeanUtils.copyProperties(baseDTO, dataBase); + dataBase.setDataId(dashboardData.getId()); + baseList.add(dataBase); + }); + eduSchoolDashboardDataBaseService.saveBatch(baseList); + } + // 保存师资力量 + if (CollUtil.isNotEmpty(dto.getTeacherList())) { + List teacherList = new ArrayList<>(); + dto.getTeacherList().forEach(teacherDTO -> { + EduSchoolDashboardDataTeacher dataTeacher = new EduSchoolDashboardDataTeacher(); + BeanUtils.copyProperties(teacherDTO, dataTeacher); + dataTeacher.setDataId(dashboardData.getId()); + teacherList.add(dataTeacher); + }); + eduSchoolDashboardDataTeacherService.saveBatch(teacherList); + } + } +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/screen/service/impl/EduSchoolDashboardDataTeacherServiceImpl.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/screen/service/impl/EduSchoolDashboardDataTeacherServiceImpl.java new file mode 100644 index 0000000..8e40c5f --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/screen/service/impl/EduSchoolDashboardDataTeacherServiceImpl.java @@ -0,0 +1,23 @@ +package com.yida.data.school.screen.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.screen.EduSchoolDashboardDataTeacher; +import com.yida.data.school.screen.mapper.EduSchoolDashboardDataTeacherMapper; +import com.yida.data.school.screen.service.EduSchoolDashboardDataTeacherService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * 校园大数据仪表盘数据中心-师资力量Service实现 + * + * @author ZYJ + * @date 2023-04-19 16:58:48 + */ +@Service +@RequiredArgsConstructor +@Transactional(rollbackFor = Exception.class) +public class EduSchoolDashboardDataTeacherServiceImpl extends ServiceImpl + implements EduSchoolDashboardDataTeacherService { + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/secondClass/service/impl/EduSecondClassContentServiceImpl.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/secondClass/service/impl/EduSecondClassContentServiceImpl.java index 9afbe27..52b29f6 100644 --- a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/secondClass/service/impl/EduSecondClassContentServiceImpl.java +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/secondClass/service/impl/EduSecondClassContentServiceImpl.java @@ -72,12 +72,10 @@ public class EduSecondClassContentServiceImpl implements EduSecondClassContentSe existIds.add(subject.getId()); } } - if (CollUtil.isNotEmpty(existIds)) { - eduSecondClassSubjectService - .remove(Wrappers.lambdaQuery().eq(EduSecondClassSubject::getDeptId, deptId) - .eq(EduSecondClassSubject::getTopicType, dto.getType()) - .notIn(EduSecondClassSubject::getId, existIds)); - } + eduSecondClassSubjectService + .remove(Wrappers.lambdaQuery().eq(EduSecondClassSubject::getDeptId, deptId) + .eq(EduSecondClassSubject::getTopicType, dto.getType()) + .notIn(EduSecondClassSubject::getId, existIds)); eduSecondClassSubjectService.saveOrUpdateBatch(dto.getSubjectList()); } else { eduSecondClassSubjectService diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/secondClass/service/impl/EduSecondClassVenueOrderServiceImpl.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/secondClass/service/impl/EduSecondClassVenueOrderServiceImpl.java index 384abbd..88d0630 100644 --- a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/secondClass/service/impl/EduSecondClassVenueOrderServiceImpl.java +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/secondClass/service/impl/EduSecondClassVenueOrderServiceImpl.java @@ -1,6 +1,5 @@ package com.yida.data.school.secondClass.service.impl; -import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import com.yida.data.common.core.entity.school.secondClass.EduSecondClassVenueGuide; import com.yida.data.common.core.entity.school.secondClass.EduSecondClassVenueOrder; @@ -34,10 +33,8 @@ public class EduSecondClassVenueOrderServiceImpl extends ServiceImpl @Override public void saveOrder(EduSecondClassVenueOrder order) { - if (ObjectUtil.isNotNull(order.getGuideId())) { - EduSecondClassVenueGuide guide = eduSecondClassVenueGuideMapper.selectById(order.getGuideId()); - order.setDeptId(guide.getDeptId()); - } + EduSecondClassVenueGuide guide = eduSecondClassVenueGuideMapper.selectById(order.getGuideId()); + order.setDeptId(guide.getDeptId()); save(order); for (EduSecondClassVenueOrderMember member : order.getMemberList()) { member.setOrderId(order.getId()); diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/config/ExcelConfiguration.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/config/ExcelConfiguration.java new file mode 100644 index 0000000..8f720dc --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/config/ExcelConfiguration.java @@ -0,0 +1,30 @@ +package com.yida.data.school.smart.config; + +import cc.mrbird.febs.common.redis.service.RedisService; +import com.yida.data.common.core.entity.constant.CachePrefixConstant; +import com.yida.data.school.smart.service.EduSmartWelcomeGuideRosterService; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * excel功能配置类 + * + * @author ZYJ + * @date 2023/10/20 + */ +@Configuration +public class ExcelConfiguration { + + @Value("${febs.uploadUrl}") + private String uploadUrl; + + @Bean + ExportGuidePicClient exportGuidePicClient( + EduSmartWelcomeGuideRosterService eduSmartWelcomeGuideRosterService, + RedisService redisService) { + return new ExportGuidePicClient(eduSmartWelcomeGuideRosterService, redisService, + CachePrefixConstant.GUIDE_ROSTER_PIC_DATA_DOWNLOAD, uploadUrl); + } + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/config/ExportGuidePicClient.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/config/ExportGuidePicClient.java new file mode 100644 index 0000000..3ab0ce5 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/config/ExportGuidePicClient.java @@ -0,0 +1,67 @@ +package com.yida.data.school.smart.config; + +import cc.mrbird.febs.common.redis.service.RedisService; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.yida.data.common.core.entity.constant.StringConstant; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideRoster; +import com.yida.data.common.excel.DefaultExportLargeClient; +import com.yida.data.school.smart.excel.SelectGuidePicExportData; +import com.yida.data.school.smart.service.EduSmartWelcomeGuideRosterService; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * smart大文件导出处理类 + * + * @author ZYJ + * @date 2023/10/20 15:00 + */ +public class ExportGuidePicClient + extends DefaultExportLargeClient { + + public ExportGuidePicClient(EduSmartWelcomeGuideRosterService eduSmartWelcomeGuideRosterService, RedisService redisService, + String exportCacheKey, String uploadUrl) { + super(eduSmartWelcomeGuideRosterService, redisService, exportCacheKey, uploadUrl); + } + + @Override + public Map selectExportData(SelectGuidePicExportData selectGuidePicExportData) { + // 返回数据 + Map map = new HashMap<>(); + // 查询指定数据 + List guideRosterList = this.baseService.list(Wrappers.lambdaQuery(new EduSmartWelcomeGuideRoster()) + .eq(EduSmartWelcomeGuideRoster::getGuideId, selectGuidePicExportData.getGuideId())); + for (EduSmartWelcomeGuideRoster guideRoster : guideRosterList) { + if (Objects.nonNull(guideRoster)) { + // 姓名 + String fullName = guideRoster.getFullName(); + if (StrUtil.isEmpty(fullName)) { + continue; + } + // 身份证号码 + String idNumber = guideRoster.getIdNumber(); + if (StrUtil.isEmpty(idNumber)) { + continue; + } + String mapKey = fullName + StringConstant.DASH + idNumber + StringConstant.DASH; + // 身份证正面照片 + if (StrUtil.isNotBlank(guideRoster.getIdCardRight())) { + map.put(mapKey + "身份证正面", guideRoster.getIdCardRight()); + } + // 身份证反面 + if (StrUtil.isNotBlank(guideRoster.getIdCardReverse())) { + map.put(mapKey + "身份证反面", guideRoster.getIdCardReverse()); + } + // 通知书 + if (StrUtil.isNotBlank(guideRoster.getAdmissionLetter())) { + map.put(mapKey + "通知书", guideRoster.getAdmissionLetter()); + } + } + } + return map; + } +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/controller/EduSmartWelcomeGuideController.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/controller/EduSmartWelcomeGuideController.java new file mode 100644 index 0000000..692ffe4 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/controller/EduSmartWelcomeGuideController.java @@ -0,0 +1,242 @@ +package com.yida.data.school.smart.controller; + +import cc.mrbird.febs.common.redis.service.RedisService; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.common.ResultMsgType; +import com.yida.data.common.core.entity.CurrentUser; +import com.yida.data.common.core.entity.constant.CachePrefixConstant; +import com.yida.data.common.core.entity.constant.FebsConstant; +import com.yida.data.common.core.enums.FileDealStatusEnum; +import com.yida.data.common.core.file.common.DownloadFileChunk; +import com.yida.data.common.core.file.common.export.ExportLargeData; +import com.yida.data.common.core.utils.Asserts; +import com.yida.data.common.core.utils.FebsUtil; +import com.yida.data.common.core.utils.FileUtil; +import com.yida.data.school.dto.smart.GuideRosterSelectPageDTO; +import com.yida.data.school.dto.smart.GuideSaveDTO; +import com.yida.data.school.dto.smart.GuideSelectPageDTO; +import com.yida.data.school.dto.smart.UpdateQrCodeInfoDTO; +import com.yida.data.school.smart.service.EduSmartWelcomeGuideRosterService; +import com.yida.data.school.smart.service.EduSmartWelcomeGuideService; +import com.yida.data.school.smart.service.EduSmartWelcomeGuideStepService; +import com.yida.data.school.vo.smart.*; +import com.yida.data.user.vo.ImportFaceVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; + +/** + * 智慧迎新指南后台Controller + * + * @author ZYJ + * @date 2023-05-15 15:33:18 + */ +@Slf4j +@RestController +@RequiredArgsConstructor +@Api(tags = "智慧迎新指南后台api") +@RequestMapping("eduSmartWelcomeGuide") +public class EduSmartWelcomeGuideController { + + private final EduSmartWelcomeGuideService eduSmartWelcomeGuideService; + private final EduSmartWelcomeGuideStepService eduSmartWelcomeGuideStepService; + private final EduSmartWelcomeGuideRosterService eduSmartWelcomeGuideRosterService; + + private final RedisService redisService; + + @PostMapping(value = "listGuidePage") + @ApiOperation(value = "查询迎新指南列表数据") + public ResultBean> listGuidePage(GuideSelectPageDTO dto) { + IPage page = eduSmartWelcomeGuideService.listGuidePage(dto); + return ResultBean.buildSuccess(page); + } + + @GetMapping(value = "getGuideInfo") + @ApiOperation(value = "获取迎新指南详细信息") + public ResultBean getGuideInfo(@ApiParam(value = "指南id", required = true) @RequestParam Long guideId) { + return ResultBean.buildSuccess(eduSmartWelcomeGuideService.getGuideInfo(guideId)); + } + + @PostMapping(value = "saveGuide", consumes = MediaType.APPLICATION_JSON_VALUE) + @ApiOperation(value = "保存迎新指南数据", consumes = MediaType.APPLICATION_JSON_VALUE) + public ResultBean saveGuide(@RequestBody GuideSaveDTO dto) { + eduSmartWelcomeGuideService.saveGuide(dto); + return ResultBean.buildSuccess(); + } + + @GetMapping("updateGuideEnableStatus") + @ApiOperation("修改指南状态") + public ResultBean updateGuideEnableStatus( + @ApiParam(value = "指南id", required = true) @RequestParam Long guideId, + @ApiParam(value = "状态. 0:未启用, 1:已启用", required = true) @RequestParam Integer enableStatus) { + eduSmartWelcomeGuideService.updateGuideEnableStatus(guideId, enableStatus); + return ResultBean.buildSuccess(); + } + + @PostMapping("updateQrCodeInfo") + @ApiOperation("保存指南二维码配置") + public ResultBean updateQrCodeInfo(@RequestBody UpdateQrCodeInfoDTO dto) { + eduSmartWelcomeGuideService.updateQrCodeInfo(dto); + return ResultBean.buildSuccess(); + } + + @GetMapping(value = "deleteGuide") + @ApiOperation(value = "删除指南") + public ResultBean deleteGuide(@ApiParam(value = "指南id", required = true) @RequestParam Long guideId) { + eduSmartWelcomeGuideService.deleteGuide(guideId); + return ResultBean.buildSuccess(); + } + + @GetMapping(value = "listGuideRosterTableCol") + @ApiOperation(value = "查询花名册动态表头") + public ResultBean> listGuideRosterTableCol( + @ApiParam(value = "指南id", required = true) @RequestParam Long guideId) { + return ResultBean.buildSuccess(eduSmartWelcomeGuideStepService.listGuideRosterTableCol(guideId)); + } + + @PostMapping("/listGuideRoster") + @ApiOperation("查询指南花名册列表") + public ResultBean>> listGuideRoster(GuideRosterSelectPageDTO dto) { + IPage> page = eduSmartWelcomeGuideRosterService.listGuideRoster(dto); + return ResultBean.buildSuccess(page); + } + + @PostMapping("/statisticsGuideRoster") + @ApiOperation("查询指南花名册统计信息") + public ResultBean> statisticsGuideRoster( + @ApiParam(value = "指南id", required = true) @RequestParam Long guideId) { + return ResultBean.buildSuccess(eduSmartWelcomeGuideRosterService.statisticsGuideRoster(guideId)); + } + + @GetMapping(value = "getGuideRosterInfo") + @ApiOperation(value = "获取花名册详细信息") + public ResultBean getGuideRosterInfo( + @ApiParam(value = "花名册id", required = true) @RequestParam Long rosterId) { + return ResultBean.buildSuccess(eduSmartWelcomeGuideRosterService.getGuideRosterInfo(rosterId)); + } + + @GetMapping(value = "createRosterQrCode") + @ApiOperation(value = "生成花名册二维码") + public ResultBean createRosterQrCode( + @ApiParam(value = "花名册id", required = true) @RequestParam Long rosterId, + @ApiParam(value = "指南id", required = true) @RequestParam Long guideId) { + eduSmartWelcomeGuideRosterService.createRosterQrCode(rosterId, guideId); + return ResultBean.buildSuccess(); + } + + @ApiOperation("导入指南花名册数据") + @PostMapping(value = "/importGuideRoster", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + public ResultBean importGuideRoster( + @ApiParam(value = "导入的excel文件", required = true) @RequestParam("file") MultipartFile file, + @ApiParam(value = "指南id", required = true) @RequestParam("guideId") Long guideId) { + // 验证文件类型 + if (!FileUtil.checkMultipartFile(file, FebsConstant.EXCEL_FILE_TYPE)) { + return ResultBean.buildError(ResultMsgType.FILE_TYPE_ERROR.getValue()); + } + String uuid = StrUtil.uuid(); + // 当前登录用户信息 + CurrentUser currentUser = FebsUtil.getCurrentUser(); + String fileUrl = FileUtil.uploadMultipartFile(file); + // 导入花名册数据 + eduSmartWelcomeGuideRosterService.importGuideRoster(fileUrl, guideId, currentUser, uuid); + return ResultBean + .buildSuccess(ImportRosterDataVO.builder().percent(0).finish(0).key(uuid).build()); + } + + + @ApiOperation("查询导入指南花名册数据进度") + @GetMapping("/getImportGuideRosterPercent") + public ResultBean getImportGuideRosterPercent(String key) { + return ResultBean.buildSuccess( + redisService.get(CachePrefixConstant.IMPORT_GUIDE_ROSTER_KEY + key)); + } + + @ApiOperation("下载指南花名册导入模板") + @PostMapping("/downloadGuideTemplate") + public void downloadTemplate(HttpServletResponse response) { + eduSmartWelcomeGuideRosterService.downloadGuideTemplate(response); + } + + @PostMapping("/exportRosterInfoData") + @ApiOperation("导出花名册数据") + public ResultBean exportRosterInfoData(@RequestBody GuideRosterSelectPageDTO dto) { + String uuid = IdUtil.simpleUUID(); + ExportRosterDataVO vo = ExportRosterDataVO.builder() + .key(uuid) + .exportStatus(FileDealStatusEnum.DEALING.getStatus()) + .totalNum(100) + .currentNum(0).build(); + redisService.hset(CachePrefixConstant.GUIDE_ROSTER_DATA_DOWNLOAD, uuid, vo); + // 异步导出花名册数据 + eduSmartWelcomeGuideRosterService.exportRosterInfoData(dto, uuid); + return ResultBean.buildSuccess(vo); + } + + @ApiOperation("获取导出花名册数据下载进度") + @GetMapping("/getExportProgress") + public ResultBean getExportProgress(String key) { + return ResultBean.buildSuccess( + (ExportRosterDataVO) redisService.hget(CachePrefixConstant.GUIDE_ROSTER_DATA_DOWNLOAD, key)); + } + + @ApiOperation("批量上传人脸寸照") + @PostMapping("/uploadAvatarBatch") + public ResultBean uploadFaceBatch(@RequestParam("file") MultipartFile file, + @ApiParam("指南ID") @RequestParam Long guideId) { + Long userId = FebsUtil.getCurrentUser().getUserId(); + Object o = redisService.get(CachePrefixConstant.IMPORT_GUIDE_AVATAR_KEY + userId.toString()); + Asserts.isTrue(o == null || ((ImportFaceVO) o).getFinish() == 1, "有文件正在上传中"); + eduSmartWelcomeGuideService.uploadStudentAvatarBatch(FileUtil.uploadMultipartFile(file), guideId, userId); + return ResultBean.buildSuccess(); + } + + @ApiOperation("查询批量上传人脸寸照进度") + @GetMapping("/getUploadAvatarBatchPercent") + public ResultBean getUploadAvatarBatchPercent() { + return ResultBean.buildSuccess( + redisService.get(CachePrefixConstant.IMPORT_GUIDE_AVATAR_KEY + FebsUtil.getCurrentUser().getUserId().toString())); + } + + @PostMapping("/exportRosterPic") + @ApiOperation("导出花名册身份证和通知书") + public ResultBean exportRosterPic( + @ApiParam(value = "指南id", required = true) @RequestParam Long guideId) { + String key = IdUtil.simpleUUID(); + ExportLargeData vo = ExportLargeData.builder() + .key(key) + .exportStatus(FileDealStatusEnum.DEALING.getStatus()) + // 初始化数据 + .total(1) + .finish(0) + .build(); + + redisService.hset(CachePrefixConstant.GUIDE_ROSTER_PIC_DATA_DOWNLOAD, key, vo); + // 异步导出花名册身份证和通知书 + eduSmartWelcomeGuideRosterService.exportRosterPic(guideId, key); + return ResultBean.buildSuccess(vo); + } + + @ApiOperation("查询导出花名册身份证和通知书详情") + @GetMapping("/getExportRosterPicInfo") + public ResultBean getExportRosterPicInfo(@RequestParam String key) { + return ResultBean.buildSuccess(eduSmartWelcomeGuideRosterService.getExportRosterPicInfo(key)); + } + + @ApiOperation("分片下载花名册身份证和通知书图片") + @PostMapping("/downloadRosterPicChunk") + public void downloadRosterPicChunk(DownloadFileChunk dto, HttpServletResponse response) { + eduSmartWelcomeGuideRosterService.downloadRosterPicChunk(dto, response); + } +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/controller/EduSmartWelcomeGuideStepClassController.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/controller/EduSmartWelcomeGuideStepClassController.java new file mode 100644 index 0000000..fc84822 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/controller/EduSmartWelcomeGuideStepClassController.java @@ -0,0 +1,78 @@ +package com.yida.data.school.smart.controller; + +import cc.mrbird.febs.common.redis.service.RedisService; +import cn.hutool.core.lang.UUID; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.constant.CachePrefixConstant; +import com.yida.data.common.core.utils.FebsUtil; +import com.yida.data.school.dto.smart.ClassFixImportDTO; +import com.yida.data.school.smart.service.EduSmartWelcomeGuideStepClassService; +import com.yida.data.school.vo.smart.ClassFixImportVO; +import com.yida.data.school.vo.smart.ClassImportVO; +import com.yida.data.school.vo.smart.WelcomeImportProgress; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +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.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +@Slf4j +@RestController +@RequiredArgsConstructor +@Api(tags = "智慧迎新指南后台api") +@RequestMapping("eduSmartWelcomeGuideStepClass") +public class EduSmartWelcomeGuideStepClassController { + + private final EduSmartWelcomeGuideStepClassService eduSmartWelcomeGuideStepClassService; + private final RedisService redisService; + + @PostMapping(value = "importClassData") + @ApiOperation(value = "导入预选班级数据") + public ResultBean> importClassData( + @ApiParam(value = "导入的excel文件", required = true) @RequestParam("file") MultipartFile file) { + String uuid = UUID.randomUUID().toString(); + eduSmartWelcomeGuideStepClassService.importClassData(file, uuid, FebsUtil.getCurrentUser()); + WelcomeImportProgress progress = WelcomeImportProgress.builder().importKey(uuid) + .importStatus(0).current(0).build(); + redisService.set(CachePrefixConstant.WELCOME_CLASS_IMPOST_PROGRESS + uuid, progress); + return ResultBean.buildSuccess(progress); + } + + @PostMapping(value = "downLoadImportClassDataTemplate") + @ApiOperation(value = "下载导入预选班级模板") + public void downLoadImportClassDataTemplate(HttpServletResponse response) { + eduSmartWelcomeGuideStepClassService.downloadClassTemplate(response); + } + + @GetMapping(value = "getImportClassDataProgress") + @ApiOperation(value = "获取导入预选班级数据进度") + public ResultBean> getImportClassDataProgress(String importKey) { + WelcomeImportProgress o = (WelcomeImportProgress) redisService + .get(CachePrefixConstant.WELCOME_CLASS_IMPOST_PROGRESS + importKey); + return ResultBean.buildSuccess(o); + } + + @PostMapping(value = "downLoadImportClassFixDataTemplate") + @ApiOperation(value = "下载导入固定班级学生模板") + public void downLoadImportClassFixDataTemplate(HttpServletResponse response) { + eduSmartWelcomeGuideStepClassService.downloadClassFixTemplate(response); + } + + @PostMapping(value = "importClassFixData") + @ApiOperation(value = "导入固定班级学生数据") + public ResultBean importClassFixData( + @ApiParam(value = "导入的excel文件", required = true) @RequestParam("file") MultipartFile file, @RequestParam Long guideId) { + return ResultBean + .buildSuccess(eduSmartWelcomeGuideStepClassService.importClassFixData(file, FebsUtil.getCurrentUser(), guideId)); + } + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/controller/EduSmartWelcomeGuideStepDormController.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/controller/EduSmartWelcomeGuideStepDormController.java new file mode 100644 index 0000000..897b8b0 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/controller/EduSmartWelcomeGuideStepDormController.java @@ -0,0 +1,103 @@ +package com.yida.data.school.smart.controller; + +import cc.mrbird.febs.common.redis.service.RedisService; +import cn.hutool.core.lang.UUID; +import cn.hutool.core.util.StrUtil; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.common.ResultMsgType; +import com.yida.data.common.core.entity.CurrentUser; +import com.yida.data.common.core.entity.constant.CachePrefixConstant; +import com.yida.data.common.core.entity.constant.FebsConstant; +import com.yida.data.common.core.utils.FebsUtil; +import com.yida.data.common.core.utils.FileUtil; +import com.yida.data.school.dto.smart.ClassFixImportDTO; +import com.yida.data.school.dto.smart.ClassImportDTO; +import com.yida.data.school.dto.smart.DormImportDTO; +import com.yida.data.school.smart.service.EduSmartWelcomeGuideStepClassService; +import com.yida.data.school.smart.service.EduSmartWelcomeGuideStepDormService; +import com.yida.data.school.vo.smart.ClassImportVO; +import com.yida.data.school.vo.smart.DormImportFixVO; +import com.yida.data.school.vo.smart.DormImportVO; +import com.yida.data.school.vo.smart.ImportRosterDataVO; +import com.yida.data.school.vo.smart.WelcomeImportProgress; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +@Slf4j +@RestController +@RequiredArgsConstructor +@Api(tags = "智慧迎新指南后台api") +@RequestMapping("eduSmartWelcomeGuideStepDorm") +public class EduSmartWelcomeGuideStepDormController { + + private final EduSmartWelcomeGuideStepDormService eduSmartWelcomeGuideStepDormService; + private final RedisService redisService; + + @PostMapping(value = "importDormData") + @ApiOperation(value = "导入预选宿舍数据") + public ResultBean> importDormData( + @ApiParam(value = "导入的excel文件", required = true) @RequestParam("file") MultipartFile file) { + String uuid = UUID.randomUUID().toString(); + eduSmartWelcomeGuideStepDormService.importDormData(file, uuid, FebsUtil.getCurrentUser()); + WelcomeImportProgress progress = WelcomeImportProgress.builder().importKey(uuid) + .importStatus(0).total(100).current(0).build(); + redisService.set(CachePrefixConstant.WELCOME_DORM_IMPOST_PROGRESS + uuid, progress); + return ResultBean.buildSuccess(progress); + } + + + @PostMapping(value = "downLoadImportDormDataTemplate") + @ApiOperation(value = "下载导入预选宿舍模板") + public void downLoadImportDormDataTemplate(HttpServletResponse response) { + eduSmartWelcomeGuideStepDormService.downloadDormTemplate(response); + } + + @GetMapping(value = "getImportDormDataProgress") + @ApiOperation(value = "获取导入预选宿舍数据进度") + public ResultBean> getImportDormDataProgress(String importKey) { + WelcomeImportProgress o = (WelcomeImportProgress) redisService + .get(CachePrefixConstant.WELCOME_DORM_IMPOST_PROGRESS + importKey); + return ResultBean.buildSuccess(o); + } + + + @PostMapping(value = "downLoadImportDormFixDataTemplate") + @ApiOperation(value = "下载导入固定宿舍模板") + public void downLoadImportDormFixDataTemplate(HttpServletResponse response) { + eduSmartWelcomeGuideStepDormService.downloadDormFixTemplate(response); + } + + @PostMapping(value = "importDormFixData") + @ApiOperation(value = "导入固定宿舍数据") + public ResultBean importDormFixData( + @ApiParam(value = "导入的excel文件", required = true) @RequestParam("file") MultipartFile file, + @RequestParam Long guideId) { + return ResultBean + .buildSuccess(eduSmartWelcomeGuideStepDormService.importDormFixData(file, FebsUtil.getCurrentUser(), guideId)); + } + + @PostMapping(value = "importDormDataByCustom") + @ApiOperation(value = "导入预选宿舍数据") + public ResultBean importDormDataByCustom( + @ApiParam(value = "导入的excel文件", required = true) @RequestParam("file") MultipartFile file, Long guideId) { + // 验证文件类型 + if (!FileUtil.checkMultipartFile(file, FebsConstant.EXCEL_FILE_TYPE)) { + return ResultBean.buildError(ResultMsgType.FILE_TYPE_ERROR.getValue()); + } + // 当前登录用户信息 + CurrentUser currentUser = FebsUtil.getCurrentUser(); + String fileUrl = FileUtil.uploadMultipartFile(file); + // 导入花名册数据 + eduSmartWelcomeGuideStepDormService.importDormDataByCustom(fileUrl, currentUser); + return ResultBean.buildSuccess(); + } +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/controller/H5EduSmartWelcomeController.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/controller/H5EduSmartWelcomeController.java new file mode 100644 index 0000000..b585da9 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/controller/H5EduSmartWelcomeController.java @@ -0,0 +1,117 @@ +package com.yida.data.school.smart.controller; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideRoster; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideRosterRelation; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideStep; +import com.yida.data.school.dto.smart.AddUploadFileStepDTO; +import com.yida.data.school.dto.smart.StaffPassStepDTO; +import com.yida.data.school.dto.smart.h5.CreateGuideStepOrderDTO; +import com.yida.data.school.dto.smart.h5.RosterFaceMatchDTO; +import com.yida.data.school.dto.smart.h5.RosterPageDTO; +import com.yida.data.school.smart.service.EduSmartWelcomeGuideRosterService; +import com.yida.data.school.smart.service.EduSmartWelcomeGuideStepService; +import com.yida.data.school.smart.service.H5EduSmartWelcomeService; +import com.yida.data.school.vo.smart.h5.RosterFaceMatchVO; +import com.yida.data.school.vo.smart.h5.RosterStepPayInfoVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import java.util.List; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +/** + * 智慧迎新api + * + * @author ZYJ + * @date 2023-05-15 15:33:18 + */ +@Slf4j +@RestController +@RequiredArgsConstructor +@Api(tags = "智慧迎新api(登录后接口)") +@RequestMapping("/h5/eduSmartWelcomeGuide") +public class H5EduSmartWelcomeController { + + private final H5EduSmartWelcomeService h5EduSmartWelcomeService; + private final EduSmartWelcomeGuideStepService eduSmartWelcomeGuideStepService; + private final EduSmartWelcomeGuideRosterService eduSmartWelcomeGuideRosterService; + + @PostMapping("/addUploadFile") + @ApiOperation("提交上传附件(家长端使用)") + ResultBean addUploadFile(@RequestBody AddUploadFileStepDTO dto) { + eduSmartWelcomeGuideStepService.addUploadFile(dto); + return ResultBean.buildSuccess(); + } + + + @GetMapping("/getStudentStepInfo") + @ApiOperation("查询学生步骤信息列表(家长端使用)") + ResultBean> getStudentStepInfo( + @RequestParam @ApiParam(value = "关联关系id", required = true) Long relationId, + @RequestParam @ApiParam(value = "指南id", required = true) Long guideId) { + return ResultBean.buildSuccess(eduSmartWelcomeGuideStepService.listStepInfo(relationId, guideId)); + } + + @GetMapping("/staff/getRosterInfo") + @ApiOperation("职工扫码后查询花名册人员详细信息") + ResultBean getRosterInfo( + @RequestParam @ApiParam(value = "花名册id", required = true) Long rosterId, + @RequestParam @ApiParam(value = "职工id", required = true) Long staffId) { + return ResultBean.buildSuccess(eduSmartWelcomeGuideRosterService.getRosterInfo(rosterId, staffId)); + } + + @PostMapping(value = "/staff/passStep", consumes = MediaType.APPLICATION_JSON_VALUE) + @ApiOperation(value = "职工通过步骤", consumes = MediaType.APPLICATION_JSON_VALUE) + ResultBean passStep(@RequestBody StaffPassStepDTO dto) { + eduSmartWelcomeGuideRosterService.passStep(dto); + return ResultBean.buildSuccess(); + } + + @GetMapping(value = "/staff/getPayQrCodeUrl") + @ApiOperation(value = "职工获取缴费二维码地址") + ResultBean getPayQrCodeUrl(@RequestParam Long deptId) { + return ResultBean.buildSuccess(h5EduSmartWelcomeService.getPayQrCodeUrl(deptId)); + } + + @PostMapping("/createGuideStepOrder") + @ApiOperation("生成迎新步骤订单") + public ResultBean createGuideStepOrder(@RequestBody CreateGuideStepOrderDTO dto) { + return ResultBean.buildSuccess(h5EduSmartWelcomeService.createGuideStepOrder(dto)); + } + + @GetMapping("/guideStepOrderSuccess") + @ApiOperation("迎新步骤订单完成(前台支付完成后调用)") + public ResultBean guideStepOrderSuccess( + @ApiParam(value = "订单号", required = true) @RequestParam String orderCode) { + h5EduSmartWelcomeService.guideStepOrderSuccess(orderCode); + return ResultBean.buildSuccess(); + } + + @PostMapping("/rosterFaceMatch") + @ApiOperation("花名册人脸对比") + public ResultBean rosterFaceMatch(@RequestBody RosterFaceMatchDTO dto) { + return ResultBean.buildSuccess(h5EduSmartWelcomeService.rosterFaceMatch(dto)); + } + + @GetMapping("/getUserQrCodeUrl") + @ApiOperation("获取花名册二维码") + public ResultBean getUserQrCodeUrl(@RequestParam Long rosterId) { + return ResultBean.buildSuccess(h5EduSmartWelcomeService.getUserQrCodeUrl(rosterId)); + } + + @PostMapping("/listRoster") + @ApiOperation("根据名称查询花名册列表信息") + public ResultBean> listRoster(@RequestBody RosterPageDTO dto) { + return ResultBean.buildSuccess(h5EduSmartWelcomeService.listRoster(dto)); + } +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/controller/InEduGuideStepOrderController.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/controller/InEduGuideStepOrderController.java new file mode 100644 index 0000000..9a6f073 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/controller/InEduGuideStepOrderController.java @@ -0,0 +1,46 @@ +package com.yida.data.school.smart.controller; + +import cn.hutool.json.JSONUtil; +import com.beust.jcommander.internal.Maps; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.smart.ConstructionPayNotifyDTO; +import com.yida.data.school.smart.service.EduGuideStepOrderService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import java.util.Map; + +/** + * 迎新订单 Controller(不鉴权) + * + * @author ZYJ + * @date 2023/6/21 + */ +@Slf4j +@RestController +@RequiredArgsConstructor +@RequestMapping("in/eduGuideStepOrder") +@Api(tags = "迎新订单后台api") +public class InEduGuideStepOrderController { + + private final EduGuideStepOrderService eduGuideStepOrderService; + + @ApiOperation("建行支付通知结果回调") + @PostMapping("/constructionPayNotify") + public String constructionPayNotify(ConstructionPayNotifyDTO dto) { + log.info("建行支付通知结果回调, result: {}", dto.toString()); + eduGuideStepOrderService.constructionPayNotify(dto); + return "success"; + } + + @GetMapping(value = "updateGuideRosterOrderStatus") + @ApiOperation(value = "更新超时迎新订单状态") + public ResultBean updateGuideRosterOrderStatus() { + eduGuideStepOrderService.updateGuideRosterOrderStatus(); + return ResultBean.buildSuccess(); + } +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/controller/InEduSmartWelcomeController.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/controller/InEduSmartWelcomeController.java new file mode 100644 index 0000000..802c2e1 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/controller/InEduSmartWelcomeController.java @@ -0,0 +1,61 @@ +package com.yida.data.school.smart.controller; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuide; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideRoster; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideRosterRelation; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideStep; +import com.yida.data.common.core.enums.EnableStatusEnum; +import com.yida.data.school.dto.smart.GuideSaveDTO; +import com.yida.data.school.dto.smart.GuideSelectPageDTO; +import com.yida.data.school.smart.service.EduSmartWelcomeGuideRosterRelationService; +import com.yida.data.school.smart.service.EduSmartWelcomeGuideRosterService; +import com.yida.data.school.smart.service.EduSmartWelcomeGuideService; +import com.yida.data.school.smart.service.EduSmartWelcomeGuideStepService; +import com.yida.data.school.vo.smart.GuideInfoVO; +import com.yida.data.school.vo.smart.GuideSelectPageVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * 智慧迎新内部api(不鉴权) + * + * @author ZYJ + * @date 2023-05-15 15:33:18 + */ +@Slf4j +@RestController +@RequiredArgsConstructor +@Api(tags = "智慧迎新内部api(不鉴权)") +@RequestMapping("/in/eduSmartWelcome") +public class InEduSmartWelcomeController { + + private final EduSmartWelcomeGuideStepService eduSmartWelcomeGuideStepService; + private final EduSmartWelcomeGuideRosterRelationService eduSmartWelcomeGuideRosterRelationService; + + @GetMapping("/getOpenIdRelation") + @ApiOperation("查询openId是否绑定了对应的信息") + ResultBean getOpenIdRelation(@RequestParam String openId, @RequestParam Long deptId) { + EduSmartWelcomeGuideRosterRelation rosterRelation = eduSmartWelcomeGuideRosterRelationService.getOpenIdRelation(openId,deptId); + return ResultBean.buildSuccess(rosterRelation); + } + + @GetMapping("/listStepInfo") + @ApiOperation("查询人员步骤信息") + ResultBean> listStepInfo(@RequestParam Long relationId, @RequestParam Long guideId) { + List list = eduSmartWelcomeGuideStepService.listStepInfo(relationId, guideId); + return ResultBean.buildSuccess(list); + } +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/controller/OutEduSmartWelcomeController.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/controller/OutEduSmartWelcomeController.java new file mode 100644 index 0000000..f5dd193 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/controller/OutEduSmartWelcomeController.java @@ -0,0 +1,80 @@ +package com.yida.data.school.smart.controller; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeCampus; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeDepartment; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuide; +import com.yida.data.common.core.enums.EnableStatusEnum; +import com.yida.data.school.dto.smart.GuideFillInfoSaveDTO; +import com.yida.data.school.dto.smart.h5.CreateGuideStepOrderDTO; +import com.yida.data.school.smart.service.*; +import com.yida.data.school.vo.smart.h5.RosterStepPayInfoVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * 智慧迎新外部api(不鉴权) + * + * @author ZYJ + * @date 2023-05-15 15:33:18 + */ +@Slf4j +@RestController +@RequiredArgsConstructor +@Api(tags = "智慧迎新外部不鉴权api(学生端登录前接口)") +@RequestMapping("/out/eduSmartWelcomeGuide") +public class OutEduSmartWelcomeController { + + private final H5EduSmartWelcomeService h5EduSmartWelcomeService; + private final EduSmartWelcomeGuideService eduSmartWelcomeGuideService; + private final EduSmartWelcomeCampusService eduSmartWelcomeCampusService; + private final EduSmartWelcomeDepartmentService eduSmartWelcomeDepartmentService; + private final EduSmartWelcomeGuideRosterService eduSmartWelcomeGuideRosterService; + + @GetMapping("/getGuide") + @ApiOperation("查询指南详情") + ResultBean getGuide( + @RequestParam @ApiParam(value = "部门id", required = true) Long deptId, + @RequestParam(required = false) @ApiParam(value = "校区id", required = true) Long campusId) { + return ResultBean.buildSuccess( + eduSmartWelcomeGuideService.getOne(Wrappers.lambdaQuery(new EduSmartWelcomeGuide()) + .eq(EduSmartWelcomeGuide::getDeptId, deptId) + .eq(Objects.nonNull(campusId), EduSmartWelcomeGuide::getCampusId, campusId) + .eq(EduSmartWelcomeGuide::getEnableStatus, EnableStatusEnum.ENABLE_STATUS.getStatus())) + ); + } + + @PostMapping("/saveGuideFillInfo") + @ApiOperation("保存填报信息") + public ResultBean saveGuideFillInfo(@RequestBody GuideFillInfoSaveDTO dto) { + eduSmartWelcomeGuideRosterService.saveGuideFillInfo(dto); + return ResultBean.buildSuccess(); + } + + @GetMapping("/getDepartmentTree") + @ApiOperation("获取系部") + public ResultBean> getDepartmentTree(@RequestParam Long deptId) { + return ResultBean.buildSuccess(eduSmartWelcomeDepartmentService.getDepartmentTree(deptId)); + } + + @PostMapping("/createGuideStepOrder") + @ApiOperation("生成迎新步骤订单") + public ResultBean createGuideStepOrder(@RequestBody CreateGuideStepOrderDTO dto) { + return ResultBean.buildSuccess(h5EduSmartWelcomeService.createGuideStepOrder(dto)); + } + + @GetMapping("/getCampusList") + @ApiOperation("获取校区信息") + public ResultBean> getCampusList(@RequestParam Long deptId) { + return ResultBean.buildSuccess(eduSmartWelcomeCampusService + .list(Wrappers.lambdaQuery().eq(EduSmartWelcomeCampus::getDeptId, deptId))); + } +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/excel/CustomDormExcelListener.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/excel/CustomDormExcelListener.java new file mode 100644 index 0000000..b9c2cdd --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/excel/CustomDormExcelListener.java @@ -0,0 +1,104 @@ +package com.yida.data.school.smart.excel; + +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; +import com.alibaba.fastjson.JSON; +import com.yida.data.common.core.entity.CurrentUser; +import com.yida.data.school.dto.smart.CustomDormImportDTO; +import com.yida.data.school.dto.smart.GuideRosterErrorExportDTO; +import com.yida.data.school.dto.smart.GuideRosterImportDTO; +import com.yida.data.school.smart.service.EduSmartWelcomeGuideStepDormService; +import com.yida.data.school.smart.service.ImportGuideRosterService; +import java.util.List; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.ehcache.impl.internal.concurrent.ConcurrentHashMap; + +/** + * Excel导入指南花名册信息监听类 + * + * @author ZYJ + * @date 2023/6/1 + */ +@Slf4j +@RequiredArgsConstructor +public class CustomDormExcelListener extends AnalysisEventListener { + + private final EduSmartWelcomeGuideStepDormService eduSmartWelcomeGuideStepDormService; + + + /** + * 当前登录用户信息 + */ + private final CurrentUser currentUser; + + /** + * 每次存储条数 每隔5条存储数据库, 实际使用中可以3000条, 然后清理list, 方便内存回收 + */ + private static final int BATCH_COUNT = 3000; + + /** + * 需要保存的数据集合 + */ + ConcurrentHashMap concurrentHashMap = new ConcurrentHashMap<>(); + + /** + * excel总数量 + */ + private static Integer totalCount = 0; + + /** + * 处理次数 + */ + private static Integer handleNumber = 0; + + /** + * 解析成功一条数据调用一次 + * + * @param dto Excel指南花名册信息导入类 + * @param analysisContext analysisContext类型 + * @author ZYJ + * @date 2021/8/23 16:12 + */ + @Override + public void invoke(CustomDormImportDTO dto, AnalysisContext analysisContext) { + totalCount = analysisContext.readSheetHolder().getApproximateTotalRowNumber() - 1; + // 获取读取的第几条数据 + Integer i = analysisContext.readRowHolder().getRowIndex(); + log.info("解析到第: {}条数据: {}", i, JSON.toJSONString(dto)); + concurrentHashMap.put(i, dto); + // 达到BATCH_COUNT了, 需要去存储一次数据库, 防止数据几万条数据在内存, 容易OOM + if (concurrentHashMap.size() >= BATCH_COUNT) { + handleNumber += 1; + saveData(); + // 存储完成清理集合 + concurrentHashMap.clear(); + } + } + + /** + * 所有数据解析完成调用 + * + * @param analysisContext analysisContext类 + * @author ZYJ + * @date 2021/8/23 16:18 + */ + @Override + public void doAfterAllAnalysed(AnalysisContext analysisContext) { + // 这里也要保存数据, 确保最后遗留的数据也存储到数据库 + saveData(); + log.info("所有数据解析完成!"); + } + + /** + * 保存导入数据 + * + * @author ZYJ + * @date 2021/8/23 16:20 + */ + private void saveData() { + log.info("{}条数据,开始存储数据库!", concurrentHashMap.size()); + eduSmartWelcomeGuideStepDormService.saveCusTomDormData(concurrentHashMap, currentUser); + log.info("存储数据库成功!"); + } +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/excel/ExcelListener.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/excel/ExcelListener.java new file mode 100644 index 0000000..0a13fd6 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/excel/ExcelListener.java @@ -0,0 +1,62 @@ +package com.yida.data.school.smart.excel; + +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; +import java.util.List; + +/** + * Excel excel监听类 + */ +@Slf4j +@RequiredArgsConstructor +public class ExcelListener extends AnalysisEventListener { + + + /** + * 自定义用于暂时存储data + * 可以通过实例获取该值 + */ + private List datas = new ArrayList<>(); + + /** + * 每解析一行都会回调invoke()方法 + * + * @param object 读取后的数据对象 + * @param context 内容 + */ + @Override + @SuppressWarnings("unchecked") + public void invoke(Object object, AnalysisContext context) { + T map = (T) object; + //数据存储到list,供批量处理,或后续自己业务逻辑处理。 + datas.add(map); + } + + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + //解析结束销毁不用的资源 + //注意不要调用datas.clear(),否则getDatas为null + } + + /** + * 返回数据 + * + * @return 返回读取的数据集合 + **/ + public List getDatas() { + return datas; + } + + /** + * 设置读取的数据集合 + * + * @param datas 设置读取的数据集合 + **/ + public void setDatas(List datas) { + this.datas = datas; + } +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/excel/GuideRosterExcelListener.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/excel/GuideRosterExcelListener.java new file mode 100644 index 0000000..5599f50 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/excel/GuideRosterExcelListener.java @@ -0,0 +1,122 @@ +package com.yida.data.school.smart.excel; + +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; +import com.alibaba.fastjson.JSON; +import com.yida.data.common.core.entity.CurrentUser; +import com.yida.data.school.dto.smart.GuideRosterErrorExportDTO; +import com.yida.data.school.dto.smart.GuideRosterImportDTO; +import com.yida.data.school.smart.service.ImportGuideRosterService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.ehcache.impl.internal.concurrent.ConcurrentHashMap; + +import java.util.List; + +/** + * Excel导入指南花名册信息监听类 + * + * @author ZYJ + * @date 2023/6/1 + */ +@Slf4j +@RequiredArgsConstructor +public class GuideRosterExcelListener extends AnalysisEventListener { + + private final ImportGuideRosterService importGuideRosterService; + + /** + * 错误信息集合 + */ + private final List errorList; + + /** + * 指南id + */ + private final Long guideId; + + /** + * 当前导入数据唯一标识 + */ + private final String uuid; + + /** + * 当前登录用户信息 + */ + private final CurrentUser currentUser; + + /** + * 每次存储条数 + * 每隔5条存储数据库, 实际使用中可以3000条, 然后清理list, 方便内存回收 + */ + private static final int BATCH_COUNT = 3000; + + /** + * 需要保存的数据集合 + */ + ConcurrentHashMap concurrentHashMap = new ConcurrentHashMap<>(); + + /** + * excel总数量 + */ + private static Integer totalCount = 0; + + /** + * 处理次数 + */ + private static Integer handleNumber = 0; + + /** + * 解析成功一条数据调用一次 + * + * @param dto Excel指南花名册信息导入类 + * @param analysisContext analysisContext类型 + * @author ZYJ + * @date 2021/8/23 16:12 + */ + @Override + public void invoke(GuideRosterImportDTO dto, AnalysisContext analysisContext) { + totalCount = analysisContext.readSheetHolder().getApproximateTotalRowNumber() - 1; + // 获取读取的第几条数据 + Integer i = analysisContext.readRowHolder().getRowIndex(); + log.info("解析到第: {}条数据: {}", i, JSON.toJSONString(dto)); + concurrentHashMap.put(i, dto); + // 达到BATCH_COUNT了, 需要去存储一次数据库, 防止数据几万条数据在内存, 容易OOM + if (concurrentHashMap.size() >= BATCH_COUNT) { + handleNumber += 1; + saveData(); + // 存储完成清理集合 + concurrentHashMap.clear(); + } + } + + /** + * 所有数据解析完成调用 + * + * @param analysisContext analysisContext类 + * @author ZYJ + * @date 2021/8/23 16:18 + */ + @Override + public void doAfterAllAnalysed(AnalysisContext analysisContext) { + // 这里也要保存数据, 确保最后遗留的数据也存储到数据库 + saveData(); + log.info("所有数据解析完成!"); + if (errorList.size() > 0) { + log.error("错误数据有: {}条", errorList.size()); + } + } + + /** + * 保存导入数据 + * + * @author ZYJ + * @date 2021/8/23 16:20 + */ + private void saveData() { + log.info("{}条数据,开始存储数据库!", concurrentHashMap.size()); + importGuideRosterService.saveGuideRosterExcelData(concurrentHashMap, errorList, guideId, uuid, + currentUser, totalCount, handleNumber * BATCH_COUNT); + log.info("存储数据库成功!"); + } +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/excel/SelectGuidePicExportData.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/excel/SelectGuidePicExportData.java new file mode 100644 index 0000000..b596d2b --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/excel/SelectGuidePicExportData.java @@ -0,0 +1,31 @@ +package com.yida.data.school.smart.excel; + +import com.yida.data.common.core.file.common.export.SelectExportData; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +import java.io.Serializable; + +/** + * 导出指南花名册身份证、通知书图片查询类 + * + * @author ZYJ + * @date 2023/10/20 15:41 + */ +@Data +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class SelectGuidePicExportData extends SelectExportData implements Serializable { + + private static final long serialVersionUID = 8067293275859870239L; + + /** + * 指南id + */ + private Long guideId; +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/mapper/EduGuideStepOrderMapper.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/mapper/EduGuideStepOrderMapper.java new file mode 100644 index 0000000..6b36f19 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/mapper/EduGuideStepOrderMapper.java @@ -0,0 +1,25 @@ +package com.yida.data.school.smart.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.smart.EduGuideStepOrder; + +import java.util.List; + +/** + * 指南步骤订单表 Mapper + * + * @author ZYJ + * @date 2023-06-20 16:48:14 + */ +public interface EduGuideStepOrderMapper extends BaseMapper { + + /** + * 查询所有已经超时订单 + * 未支付状态 + * + * @return java.util.List + * @author ZYJ + * @date 2023/6/21 13:51 + */ + List selectTimeOutOrder(); +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/mapper/EduSmartWelcomeCampusMapper.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/mapper/EduSmartWelcomeCampusMapper.java new file mode 100644 index 0000000..25c5529 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/mapper/EduSmartWelcomeCampusMapper.java @@ -0,0 +1,8 @@ +package com.yida.data.school.smart.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeCampus; + +public interface EduSmartWelcomeCampusMapper extends BaseMapper { + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/mapper/EduSmartWelcomeDepartmentMapper.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/mapper/EduSmartWelcomeDepartmentMapper.java new file mode 100644 index 0000000..de625ab --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/mapper/EduSmartWelcomeDepartmentMapper.java @@ -0,0 +1,8 @@ +package com.yida.data.school.smart.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeDepartment; + +public interface EduSmartWelcomeDepartmentMapper extends BaseMapper { + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/mapper/EduSmartWelcomeGuideClassRecordMapper.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/mapper/EduSmartWelcomeGuideClassRecordMapper.java new file mode 100644 index 0000000..a1615da --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/mapper/EduSmartWelcomeGuideClassRecordMapper.java @@ -0,0 +1,11 @@ +package com.yida.data.school.smart.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideClassRecord; + +/** + * 智慧迎新班级分配记录Mapper + */ +public interface EduSmartWelcomeGuideClassRecordMapper extends BaseMapper { + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/mapper/EduSmartWelcomeGuideDormRecordMapper.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/mapper/EduSmartWelcomeGuideDormRecordMapper.java new file mode 100644 index 0000000..2804305 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/mapper/EduSmartWelcomeGuideDormRecordMapper.java @@ -0,0 +1,11 @@ +package com.yida.data.school.smart.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideDormRecord; + +/** + * 智慧迎新宿舍分配记录Mapper + */ +public interface EduSmartWelcomeGuideDormRecordMapper extends BaseMapper { + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/mapper/EduSmartWelcomeGuideMapper.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/mapper/EduSmartWelcomeGuideMapper.java new file mode 100644 index 0000000..e0dff48 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/mapper/EduSmartWelcomeGuideMapper.java @@ -0,0 +1,30 @@ +package com.yida.data.school.smart.mapper; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuide; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.school.dto.smart.GuideSelectPageDTO; +import com.yida.data.school.vo.smart.GuideSelectPageVO; +import org.apache.ibatis.annotations.Param; + +/** + * 智慧迎新指南表Mapper + * + * @author ZYJ + * @date 2023-05-15 15:33:18 + */ +public interface EduSmartWelcomeGuideMapper extends BaseMapper { + + /** + * 查询迎新指南列表数据 + * + * @param page 分页信息 + * @param dto 迎新指南后台列表请求类 + * @return com.baomidou.mybatisplus.core.metadata.IPage + * @author ZYJ + * @date 2023/5/15 17:04 + */ + IPage listGuidePage(Page page, + @Param("dto") GuideSelectPageDTO dto); +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/mapper/EduSmartWelcomeGuideRosterMapper.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/mapper/EduSmartWelcomeGuideRosterMapper.java new file mode 100644 index 0000000..cde2b79 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/mapper/EduSmartWelcomeGuideRosterMapper.java @@ -0,0 +1,42 @@ +package com.yida.data.school.smart.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideRoster; +import com.yida.data.school.dto.smart.GuideRosterSelectPageDTO; +import com.yida.data.school.vo.smart.GuideRosterSelectPageVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 智慧迎新指南花名册表Mapper + * + * @author ZYJ + * @date 2023-05-16 15:06:19 + */ +public interface EduSmartWelcomeGuideRosterMapper extends BaseMapper { + + /** + * 查询指南花名册分页列表 + * + * @param page 分页信息 + * @param dto 迎新指南花名册后台列表请求类 + * @return com.baomidou.mybatisplus.core.metadata.IPage + * @author ZYJ + * @date 2023/5/22 14:21 + */ + IPage listGuideRoster(Page page, + @Param("dto") GuideRosterSelectPageDTO dto); + + /** + * 查询指南花名册列表 + * + * @param dto 迎新指南花名册后台列表请求类 + * @return java.util.List + * @author ZYJ + * @date 2023/6/13 10:24 + */ + List listGuideRoster(@Param("dto") GuideRosterSelectPageDTO dto); +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/mapper/EduSmartWelcomeGuideRosterRelationMapper.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/mapper/EduSmartWelcomeGuideRosterRelationMapper.java new file mode 100644 index 0000000..f665c26 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/mapper/EduSmartWelcomeGuideRosterRelationMapper.java @@ -0,0 +1,29 @@ +package com.yida.data.school.smart.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideRosterRelation; +import com.yida.data.school.dto.smart.h5.RosterPageDTO; +import org.apache.ibatis.annotations.Param; + +/** + * 智慧迎新指南花名册-微信用户绑定关系表Mapper + * + * @author ZYJ + * @date 2023-05-17 13:53:18 + */ +public interface EduSmartWelcomeGuideRosterRelationMapper extends BaseMapper { + + /** + * 根据名称查询花名册列表信息 + * + * @param page 分页信息 + * @param dto 花名册列表h5查询请求类 + * @return com.baomidou.mybatisplus.core.metadata.IPage + * @author ZYJ + * @date 2023/7/7 13:41 + */ + IPage listRoster(Page page, + @Param("dto") RosterPageDTO dto); +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/mapper/EduSmartWelcomeGuideRosterRelationStepMapper.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/mapper/EduSmartWelcomeGuideRosterRelationStepMapper.java new file mode 100644 index 0000000..b26cffd --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/mapper/EduSmartWelcomeGuideRosterRelationStepMapper.java @@ -0,0 +1,26 @@ +package com.yida.data.school.smart.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideRosterRelationStep; +import org.apache.ibatis.annotations.Param; + +/** + * 智慧迎新指南花名册-微信用户绑定关系-执行步骤表 Mapper + * + * @author ZYJ + * @date 2023-05-19 14:37:43 + */ +public interface EduSmartWelcomeGuideRosterRelationStepMapper extends BaseMapper { + + /** + * 查询报名成功人数 + * + * @param guideId 指南id + * @param stepNumber 步骤数量 + * @return long + * @author ZYJ + * @date 2023/5/30 17:45 + */ + long countCompleteRoster(@Param("guideId") Long guideId, + @Param("stepNumber") long stepNumber); +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/mapper/EduSmartWelcomeGuideStepClassFixMapper.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/mapper/EduSmartWelcomeGuideStepClassFixMapper.java new file mode 100644 index 0000000..6685393 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/mapper/EduSmartWelcomeGuideStepClassFixMapper.java @@ -0,0 +1,11 @@ +package com.yida.data.school.smart.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideStepClassFix; + +/** + * 智慧迎新班级固定人员表Mapper + */ +public interface EduSmartWelcomeGuideStepClassFixMapper extends BaseMapper { + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/mapper/EduSmartWelcomeGuideStepClassMapper.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/mapper/EduSmartWelcomeGuideStepClassMapper.java new file mode 100644 index 0000000..8eb3e95 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/mapper/EduSmartWelcomeGuideStepClassMapper.java @@ -0,0 +1,16 @@ +package com.yida.data.school.smart.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideStepClass; +import org.apache.ibatis.annotations.Param; + +/** + * 智慧迎新班级预分表Mapper + */ +public interface EduSmartWelcomeGuideStepClassMapper extends BaseMapper { + + void incrMale(@Param("id") Long id); + + void incrFemale(@Param("id") Long id); + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/mapper/EduSmartWelcomeGuideStepDormFixMapper.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/mapper/EduSmartWelcomeGuideStepDormFixMapper.java new file mode 100644 index 0000000..6123095 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/mapper/EduSmartWelcomeGuideStepDormFixMapper.java @@ -0,0 +1,11 @@ +package com.yida.data.school.smart.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideStepDormFix; + +/** + * 智慧迎新宿舍固定人员表Mapper + */ +public interface EduSmartWelcomeGuideStepDormFixMapper extends BaseMapper { + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/mapper/EduSmartWelcomeGuideStepDormMapper.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/mapper/EduSmartWelcomeGuideStepDormMapper.java new file mode 100644 index 0000000..bd17739 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/mapper/EduSmartWelcomeGuideStepDormMapper.java @@ -0,0 +1,13 @@ +package com.yida.data.school.smart.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideStepDorm; +import org.apache.ibatis.annotations.Param; + +/** + * 智慧迎新宿舍预分表Mapper + */ +public interface EduSmartWelcomeGuideStepDormMapper extends BaseMapper { + + void incr(@Param("id") Long id); +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/mapper/EduSmartWelcomeGuideStepMapper.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/mapper/EduSmartWelcomeGuideStepMapper.java new file mode 100644 index 0000000..10e2f54 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/mapper/EduSmartWelcomeGuideStepMapper.java @@ -0,0 +1,14 @@ +package com.yida.data.school.smart.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideStep; + +/** + * 智慧迎新指南步骤表Mapper + * + * @author ZYJ + * @date 2023-05-15 15:33:18 + */ +public interface EduSmartWelcomeGuideStepMapper extends BaseMapper { + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/mapper/EduSmartWelcomeGuideStepStaffMapper.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/mapper/EduSmartWelcomeGuideStepStaffMapper.java new file mode 100644 index 0000000..0ff2d91 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/mapper/EduSmartWelcomeGuideStepStaffMapper.java @@ -0,0 +1,14 @@ +package com.yida.data.school.smart.mapper; + +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideStepStaff; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * 智慧迎新指南步骤-审核人员表Mapper + * + * @author ZYJ + * @date 2023-05-15 15:33:18 + */ +public interface EduSmartWelcomeGuideStepStaffMapper extends BaseMapper { + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/EduGuideStepOrderService.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/EduGuideStepOrderService.java new file mode 100644 index 0000000..49d8069 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/EduGuideStepOrderService.java @@ -0,0 +1,31 @@ +package com.yida.data.school.smart.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.smart.EduGuideStepOrder; +import com.yida.data.common.core.entity.smart.ConstructionPayNotifyDTO; + +/** + * 指南步骤订单表 Service接口 + * + * @author ZYJ + * @date 2023-06-20 16:48:14 + */ +public interface EduGuideStepOrderService extends IService { + + /** + * 建行支付通知结果回调 + * + * @param dto 建行支付通知结果回调接收类 + * @author ZYJ + * @date 2023/6/22 1:23 + */ + void constructionPayNotify(ConstructionPayNotifyDTO dto); + + /** + * 更新超时迎新订单状态 + * + * @author ZYJ + * @date 2023/6/21 13:50 + */ + void updateGuideRosterOrderStatus(); +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/EduSmartWelcomeCampusService.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/EduSmartWelcomeCampusService.java new file mode 100644 index 0000000..096e021 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/EduSmartWelcomeCampusService.java @@ -0,0 +1,9 @@ +package com.yida.data.school.smart.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeCampus; + + +public interface EduSmartWelcomeCampusService extends IService { + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/EduSmartWelcomeDepartmentService.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/EduSmartWelcomeDepartmentService.java new file mode 100644 index 0000000..9789fad --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/EduSmartWelcomeDepartmentService.java @@ -0,0 +1,10 @@ +package com.yida.data.school.smart.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeDepartment; +import java.util.List; + +public interface EduSmartWelcomeDepartmentService extends IService { + + List getDepartmentTree(Long deptId); +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/EduSmartWelcomeGuideClassRecordService.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/EduSmartWelcomeGuideClassRecordService.java new file mode 100644 index 0000000..2b5733b --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/EduSmartWelcomeGuideClassRecordService.java @@ -0,0 +1,11 @@ +package com.yida.data.school.smart.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideClassRecord; + +/** + * 智慧迎新班级预分记录Service接口 + */ +public interface EduSmartWelcomeGuideClassRecordService extends IService { + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/EduSmartWelcomeGuideDormRecordService.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/EduSmartWelcomeGuideDormRecordService.java new file mode 100644 index 0000000..f61aacb --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/EduSmartWelcomeGuideDormRecordService.java @@ -0,0 +1,11 @@ +package com.yida.data.school.smart.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideDormRecord; + +/** + * 智慧迎新班级预分记录Service接口 + */ +public interface EduSmartWelcomeGuideDormRecordService extends IService { + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/EduSmartWelcomeGuideRosterRelationService.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/EduSmartWelcomeGuideRosterRelationService.java new file mode 100644 index 0000000..96ae04c --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/EduSmartWelcomeGuideRosterRelationService.java @@ -0,0 +1,24 @@ +package com.yida.data.school.smart.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideRosterRelation; + +/** + * 智慧迎新指南花名册-微信用户绑定关系表Service接口 + * + * @author ZYJ + * @date 2023-05-17 13:53:18 + */ +public interface EduSmartWelcomeGuideRosterRelationService extends IService { + + /** + * 查询openId是否绑定了对应的信息 + * + * @param openId 微信openId + * @param deptId 部门id + * @return com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideRosterRelation + * @author ZYJ + * @date 2023/6/30 17:07 + */ + EduSmartWelcomeGuideRosterRelation getOpenIdRelation(String openId, Long deptId); +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/EduSmartWelcomeGuideRosterRelationStepService.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/EduSmartWelcomeGuideRosterRelationStepService.java new file mode 100644 index 0000000..8d3ab07 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/EduSmartWelcomeGuideRosterRelationStepService.java @@ -0,0 +1,24 @@ +package com.yida.data.school.smart.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideRosterRelationStep; + +/** + * 智慧迎新指南花名册-微信用户绑定关系-执行步骤表 Service接口 + * + * @author ZYJ + * @date 2023-05-19 14:37:43 + */ +public interface EduSmartWelcomeGuideRosterRelationStepService extends IService { + + /** + * 查询报名成功人数 + * + * @param guideId 指南id + * @param stepNumber 步骤数量 + * @return long + * @author ZYJ + * @date 2023/5/30 17:40 + */ + long countCompleteRoster(Long guideId, long stepNumber); +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/EduSmartWelcomeGuideRosterService.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/EduSmartWelcomeGuideRosterService.java new file mode 100644 index 0000000..d96de27 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/EduSmartWelcomeGuideRosterService.java @@ -0,0 +1,170 @@ +package com.yida.data.school.smart.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.CurrentUser; +import com.yida.data.common.core.entity.constant.FebsConstant; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideRoster; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideRosterRelation; +import com.yida.data.common.core.file.common.DownloadFileChunk; +import com.yida.data.school.dto.smart.GuideFillInfoSaveDTO; +import com.yida.data.school.dto.smart.GuideRosterSelectPageDTO; +import com.yida.data.school.dto.smart.StaffPassStepDTO; +import com.yida.data.school.vo.smart.GuideRosterInfoVO; +import com.yida.data.school.vo.smart.StatisticsGuideRosterVO; +import org.springframework.scheduling.annotation.Async; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; + +/** + * 智慧迎新指南花名册表Service接口 + * + * @author ZYJ + * @date 2023-05-16 15:06:19 + */ +public interface EduSmartWelcomeGuideRosterService extends IService { + + /** + * 保存填报信息 + * + * @param dto 保存迎新填报信息请求类 + * @author ZYJ + * @date 2023/9/13 20:43 + */ + void saveGuideFillInfo(GuideFillInfoSaveDTO dto); + + /** + * 删除花名册相关信息 + * + * @param rosterId 花名册id + * @author ZYJ + * @date 2023/9/13 21:07 + */ + void deleteRosterInfo(Long rosterId); + + /** + * 查询指南花名册列表 + * + * @param dto 迎新指南花名册后台列表请求类 + * @return com.baomidou.mybatisplus.core.metadata.IPage> + * @author ZYJ + * @date 2023/5/24 11:05 + */ + IPage> listGuideRoster(GuideRosterSelectPageDTO dto); + + /** + * 查询指南花名册统计信息 + * + * @param guideId 指南id + * @return java.util.List + * @author ZYJ + * @date 2023/8/28 16:27 + */ + List statisticsGuideRoster(Long guideId); + + /** + * 获取花名册详细信息 + * + * @param rosterId 花名册id + * @return com.yida.data.school.vo.smart.GuideRosterInfoVO + * @author ZYJ + * @date 2023/5/22 15:53 + */ + GuideRosterInfoVO getGuideRosterInfo(Long rosterId); + + /** + * 导入指南花名册数据 + * + * @param fileUrl 导入的excel文件地址 + * @param guideId 指南id + * @param currentUser 当前登录用户信息 + * @author ZYJ + * @date 2023/6/1 11:14 + */ + @Async(FebsConstant.ASYNC_POOL) + void importGuideRoster(String fileUrl, Long guideId, CurrentUser currentUser, String uuid); + + /** + * 下载指南花名册导入模板 + * + * @param response HttpServletResponse + * @author ZYJ + * @date 2023/6/1 16:55 + */ + void downloadGuideTemplate(HttpServletResponse response); + + /** + * 职工扫码后查询花名册人员详细信息 + * + * @param rosterId 花名册id + * @param staffId 职工id + * @return com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideRosterRelation + * @author ZYJ + * @date 2023/6/5 13:50 + */ + EduSmartWelcomeGuideRosterRelation getRosterInfo(Long rosterId, Long staffId); + + /** + * 职工通过步骤 + * + * @param dto 职工通过步骤请求类 + * @author ZYJ + * @date 2023/6/5 13:57 + */ + void passStep(StaffPassStepDTO dto); + + /** + * 导出花名册数据 + * + * @param dto 迎新指南花名册后台列表请求类 + * @param uuid uuid + * @author ZYJ + * @date 2023/6/13 9:35 + */ + @Async + void exportRosterInfoData(GuideRosterSelectPageDTO dto, String uuid); + + /** + * 生成花名册二维码 + * + * @param rosterId 花名册id + * @param guideId 指南id + * @author ZYJ + * @date 2023/6/13 15:56 + */ + void createRosterQrCode(Long rosterId, Long guideId); + + /** + * 花名册身份证和通知书 + * + * @param guideId 指南id + * @param key 当前操作标识 + * @author ZYJ + * @date 2023/10/19 15:51 + */ + @Async + void exportRosterPic(Long guideId, String key); + + /** + * 查询导出进度 + * + * @param key 导出唯一标识 + * @return java.lang.Object + * @author ZYJ + * @date 2023/12/12 14:05 + */ + Object getExportRosterPicInfo(String key); + + /** + * 分片下载花名册身份证和通知书图片 + * + * @param dto 分片下载请求类 + * @param response response返回流信息 + * @author ZYJ + * @date 2023/10/19 16:38 + */ + void downloadRosterPicChunk(DownloadFileChunk dto, HttpServletResponse response); + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/EduSmartWelcomeGuideService.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/EduSmartWelcomeGuideService.java new file mode 100644 index 0000000..69d2317 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/EduSmartWelcomeGuideService.java @@ -0,0 +1,83 @@ +package com.yida.data.school.smart.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.constant.FebsConstant; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuide; +import com.yida.data.common.core.enums.EnableStatusEnum; +import com.yida.data.school.dto.smart.GuideSaveDTO; +import com.yida.data.school.dto.smart.GuideSelectPageDTO; +import com.yida.data.school.dto.smart.UpdateQrCodeInfoDTO; +import com.yida.data.school.vo.smart.GuideInfoVO; +import com.yida.data.school.vo.smart.GuideSelectPageVO; +import org.springframework.scheduling.annotation.Async; + +/** + * 智慧迎新指南表Service接口 + * + * @author ZYJ + * @date 2023-05-15 15:33:18 + */ +public interface EduSmartWelcomeGuideService extends IService { + + /** + * 查询迎新指南列表数据 + * + * @param dto 迎新指南后台列表请求类 + * @return com.baomidou.mybatisplus.core.metadata.IPage + * @author ZYJ + * @date 2023/5/15 16:56 + */ + IPage listGuidePage(GuideSelectPageDTO dto); + + /** + * 获取迎新指南详细信息 + * + * @param guideId 指南id + * @return com.yida.data.school.vo.smart.GuideInfoVO + * @author ZYJ + * @date 2023/5/15 17:36 + */ + GuideInfoVO getGuideInfo(Long guideId); + + /** + * 保存迎新指南数据 + * + * @param dto 保存迎新指南请求类 + * @author ZYJ + * @date 2023/5/15 20:18 + */ + void saveGuide(GuideSaveDTO dto); + + /** + * 删除指南 + * + * @param guideId 指南id + * @author ZYJ + * @date 2023/5/15 20:36 + */ + void deleteGuide(Long guideId); + + /** + * 修改指南状态 + * + * @param guideId 指南id + * @param enableStatus 状态. 0:未启用, 1:已启用 {@link EnableStatusEnum} + * @author ZYJ + * @date 2023/5/15 20:45 + */ + void updateGuideEnableStatus(Long guideId, Integer enableStatus); + + /** + * 保存指南二维码配置 + * + * @param dto 保存指南二维码配置请求类 + * @author ZYJ + * @date 2023/6/13 15:05 + */ + void updateQrCodeInfo(UpdateQrCodeInfoDTO dto); + + + @Async(FebsConstant.ASYNC_POOL) + void uploadStudentAvatarBatch(String file, Long guideId, Long createUserId); +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/EduSmartWelcomeGuideStepClassFixService.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/EduSmartWelcomeGuideStepClassFixService.java new file mode 100644 index 0000000..ecfad59 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/EduSmartWelcomeGuideStepClassFixService.java @@ -0,0 +1,11 @@ +package com.yida.data.school.smart.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideStepClassFix; + +/** + * 智慧迎新班级固定人员Service接口 + */ +public interface EduSmartWelcomeGuideStepClassFixService extends IService { + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/EduSmartWelcomeGuideStepClassService.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/EduSmartWelcomeGuideStepClassService.java new file mode 100644 index 0000000..902bfd6 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/EduSmartWelcomeGuideStepClassService.java @@ -0,0 +1,67 @@ +package com.yida.data.school.smart.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.CurrentUser; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideStep; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideStepClass; +import com.yida.data.school.dto.smart.AddUploadFileStepDTO; +import com.yida.data.school.dto.smart.ClassFixImportDTO; +import com.yida.data.school.dto.smart.ClassImportDTO; +import com.yida.data.school.vo.smart.ClassFixImportVO; +import com.yida.data.school.vo.smart.ClassImportVO; +import com.yida.data.school.vo.smart.GuideStepColVO; +import org.ehcache.impl.internal.concurrent.ConcurrentHashMap; +import org.springframework.scheduling.annotation.Async; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 智慧迎新班级预分表Service接口 + */ +public interface EduSmartWelcomeGuideStepClassService extends IService { + + /** + * 下载导入预选班级模板 + * + * @param response + */ + void downloadClassTemplate(HttpServletResponse response); + + + /** + * 下载导入预选班级模板 + * + * @param response + */ + void downloadClassFixTemplate(HttpServletResponse response); + + /** + * 导入班级预分信息,返回List对象 + * + * @param file + * @return + */ + @Async + void importClassData(MultipartFile file, String importKey, CurrentUser currentUser); + + + /** + * 导入固定班级学生信息,返回List对象 Fix * @param file + * + * @return + */ + ClassFixImportVO importClassFixData(MultipartFile file, CurrentUser currentUser, Long guideId); + + /** + * 分配班级 + * + * @param guideId + * @param stepId + * @param rosterId + */ + void classBanding(Long guideId, Long stepId, Long rosterId); + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/EduSmartWelcomeGuideStepDormFixService.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/EduSmartWelcomeGuideStepDormFixService.java new file mode 100644 index 0000000..49e6547 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/EduSmartWelcomeGuideStepDormFixService.java @@ -0,0 +1,11 @@ +package com.yida.data.school.smart.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideStepDormFix; + +/** + * 智慧迎新宿舍固定人员Service接口 + */ +public interface EduSmartWelcomeGuideStepDormFixService extends IService { + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/EduSmartWelcomeGuideStepDormService.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/EduSmartWelcomeGuideStepDormService.java new file mode 100644 index 0000000..e438fc4 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/EduSmartWelcomeGuideStepDormService.java @@ -0,0 +1,68 @@ +package com.yida.data.school.smart.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.CurrentUser; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideStepClass; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideStepDorm; +import com.yida.data.school.dto.smart.ClassImportDTO; +import com.yida.data.school.dto.smart.CustomDormImportDTO; +import com.yida.data.school.dto.smart.DormImportDTO; +import com.yida.data.school.dto.smart.DormImportFixDTO; +import com.yida.data.school.dto.smart.GuideRosterErrorExportDTO; +import com.yida.data.school.dto.smart.GuideRosterImportDTO; +import com.yida.data.school.vo.smart.ClassFixImportVO; +import com.yida.data.school.vo.smart.DormImportFixVO; +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.ehcache.impl.internal.concurrent.ConcurrentHashMap; +import org.springframework.scheduling.annotation.Async; +import org.springframework.web.multipart.MultipartFile; + +/** + * 智慧迎新宿舍预分表Service接口 + */ +public interface EduSmartWelcomeGuideStepDormService extends IService { + + + /** + * 下载导入宿舍模板 + * + * @param response + */ + void downloadDormTemplate(HttpServletResponse response); + + /** + * 下载导入宿舍模板 + * + * @param response + */ + void downloadDormFixTemplate(HttpServletResponse response); + + /** + * 导入宿舍预分信息,返回List对象 + * + * @param file + * @return + */ + @Async + void importDormData(MultipartFile file, String importKey, CurrentUser currentUser); + + + @Async + void importDormDataByCustom(String file, CurrentUser currentUser); + + + DormImportFixVO importDormFixData(MultipartFile file, CurrentUser currentUser, Long guideId); + + /** + * 分配宿舍 + * + * @param guideId + * @param stepId + * @param rosterId + */ + void dormBanding(Long guideId, Long stepId, Long rosterId); + + + void saveCusTomDormData(ConcurrentHashMap concurrentHashMap, CurrentUser currentUser); +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/EduSmartWelcomeGuideStepService.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/EduSmartWelcomeGuideStepService.java new file mode 100644 index 0000000..2e5bb08 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/EduSmartWelcomeGuideStepService.java @@ -0,0 +1,70 @@ +package com.yida.data.school.smart.service; + +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideStep; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.school.dto.smart.AddUploadFileStepDTO; +import com.yida.data.school.vo.smart.GuideStepColVO; + +import java.util.List; + +/** + * 智慧迎新指南步骤表Service接口 + * + * @author ZYJ + * @date 2023-05-15 15:33:18 + */ +public interface EduSmartWelcomeGuideStepService extends IService { + + + void addUploadFile(AddUploadFileStepDTO dto); + + /** + * 查询人员步骤信息 + * + * @param relationId 绑定关系id + * @param guideId 指南id + * @return java.util.List + * @author ZYJ + * @date 2023/5/19 16:01 + */ + List listStepInfo(Long relationId, Long guideId); + + /** + * 查询花名册动态表头 + * + * @param guideId 指南id + * @return java.util.List + * @author ZYJ + * @date 2023/5/23 16:15 + */ + List listGuideRosterTableCol(Long guideId); + + /** + * 查询人员步骤详细信息(包括审核信息) 后台花名册详情页面使用 + * + * @param rosterId 花名册id + * @param guideId 指南id + * @return java.util.List + * @author ZYJ + * @date 2023/6/1 10:02 + */ + List listStepDetailInfo(Long rosterId, Long guideId); + + /** + * 查询人员步骤详细信息(包括审核信息) 职工扫码显示信息 + * + * @param rosterId 花名册id + * @param guideId 指南id + * @param staffId 职工id + * @return java.util.List + * @author ZYJ + * @date 2023/6/5 13:45 + */ + List listExamineStepInfo(Long rosterId, Long guideId, Long staffId); + + /** + * 获取上一步需要审核的步骤 + */ + EduSmartWelcomeGuideStep premiseStep(Long stepId, EduSmartWelcomeGuideStep step); + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/EduSmartWelcomeGuideStepStaffService.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/EduSmartWelcomeGuideStepStaffService.java new file mode 100644 index 0000000..a257a5d --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/EduSmartWelcomeGuideStepStaffService.java @@ -0,0 +1,13 @@ +package com.yida.data.school.smart.service; + +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideStepStaff; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * 智慧迎新指南步骤-审核人员表Service接口 + * + * @author ZYJ + * @date 2023-05-15 15:33:18 + */ +public interface EduSmartWelcomeGuideStepStaffService extends IService { +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/H5EduSmartWelcomeService.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/H5EduSmartWelcomeService.java new file mode 100644 index 0000000..d11015f --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/H5EduSmartWelcomeService.java @@ -0,0 +1,83 @@ +package com.yida.data.school.smart.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideRoster; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideRosterRelation; +import com.yida.data.school.dto.smart.h5.CreateGuideStepOrderDTO; +import com.yida.data.school.dto.smart.h5.RosterFaceMatchDTO; +import com.yida.data.school.dto.smart.h5.RosterPageDTO; +import com.yida.data.school.vo.smart.h5.RosterFaceMatchVO; +import com.yida.data.school.vo.smart.h5.RosterStepPayInfoVO; + +import java.time.LocalDateTime; +import java.util.Map; + +/** + * 智慧迎新H5接口 service + * + * @author ZYJ + * @date 2023/6/19 17:19 + */ +public interface H5EduSmartWelcomeService { + + /** + * 生成花名册步骤订单 + * + * @param dto 生成花名册步骤订单请求类 + * @return com.yida.data.school.vo.smart.h5.RosterStepPayInfoVO + * @author ZYJ + * @date 2023/6/19 17:35 + */ + RosterStepPayInfoVO createGuideStepOrder(CreateGuideStepOrderDTO dto); + + /** + * 迎新订单支付成功 + * + * @param orderCode 订单号 + * @param payDate 支付完成时间 + * @author ZYJ + * @date 2023/6/20 17:26 + */ + void guideStepOrderPaySuccess(String orderCode, LocalDateTime payDate); + + /** + * 迎新步骤订单完成(前台支付完成后调用) + * + * @param orderCode 订单号 + * @author ZYJ + * @date 2023/6/20 17:31 + */ + void guideStepOrderSuccess(String orderCode); + + /** + * 花名册人脸对比 + * + * @param dto 花名册人脸对比请求类 + * @return com.yida.data.school.vo.smart.h5.RosterFaceMatchVO + * @author ZYJ + * @date 2023/6/21 11:21 + */ + RosterFaceMatchVO rosterFaceMatch(RosterFaceMatchDTO dto); + + EduSmartWelcomeGuideRoster getUserQrCodeUrl(Long rosterId); + + /** + * 职工获取缴费二维码地址 + * + * @param deptId 部门id + * @return java.lang.String + * @author ZYJ + * @date 2023/7/4 17:04 + */ + String getPayQrCodeUrl(Long deptId); + + /** + * 根据名称查询花名册列表信息 + * + * @param dto 花名册列表h5查询请求类 + * @return com.baomidou.mybatisplus.core.metadata.IPage + * @author ZYJ + * @date 2023/7/7 11:45 + */ + IPage listRoster(RosterPageDTO dto); +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/ImportGuideRosterService.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/ImportGuideRosterService.java new file mode 100644 index 0000000..48e0f18 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/ImportGuideRosterService.java @@ -0,0 +1,37 @@ +package com.yida.data.school.smart.service; + +import com.yida.data.common.core.entity.CurrentUser; +import com.yida.data.school.dto.smart.GuideRosterErrorExportDTO; +import com.yida.data.school.dto.smart.GuideRosterImportDTO; +import com.yida.data.user.dto.*; +import org.ehcache.impl.internal.concurrent.ConcurrentHashMap; + +import java.util.List; + +/** + * 指南花名册信息导入service层 + * + * @author ZYJ + * @date 2023/6/1 + */ +public interface ImportGuideRosterService { + + /** + * 保存指南花名册导入数据 + * + * @param concurrentHashMap 需要保存的用户数据 + * @param errorList 导入错误数据集合 + * @param guideId 指南id + * @param uuid 当前导入数据唯一标识 + * @param currentUser 当前登录用户信息 + * @param totalCount 总数量 + * @param handleCount 已处理数量 + * @author ZYJ + * @date 2023/6/1 14:17 + */ + void saveGuideRosterExcelData(ConcurrentHashMap concurrentHashMap, + List errorList, + Long guideId, String uuid, + CurrentUser currentUser, Integer totalCount, + Integer handleCount); +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/EduGuideStepOrderServiceImpl.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/EduGuideStepOrderServiceImpl.java new file mode 100644 index 0000000..e7deb58 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/EduGuideStepOrderServiceImpl.java @@ -0,0 +1,170 @@ +package com.yida.data.school.smart.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.LocalDateTimeUtil; +import cn.hutool.json.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.common.ResultMsgType; +import com.yida.data.common.core.entity.constant.ConstructionPayConstant; +import com.yida.data.common.core.entity.smart.ConstructionPayNotifyDTO; +import com.yida.data.common.core.entity.smart.EduGuideStepOrder; +import com.yida.data.common.core.entity.system.ConstructionPayConfig; +import com.yida.data.common.core.enums.ConstructionTradeStateEnum; +import com.yida.data.common.core.enums.OrderStatusEnum; +import com.yida.data.common.core.enums.PayStatusEnum; +import com.yida.data.common.core.enums.PayWay; +import com.yida.data.common.core.exception.FebsException; +import com.yida.data.common.core.utils.ConstructionPayUtil; +import com.yida.data.common.core.utils.EnumUtils; +import com.yida.data.common.service.CommonService; +import com.yida.data.school.smart.mapper.EduGuideStepOrderMapper; +import com.yida.data.school.smart.service.EduGuideStepOrderService; +import com.yida.data.school.smart.service.H5EduSmartWelcomeService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Objects; + +/** + * 指南步骤订单表 Service实现 + * + * @author ZYJ + * @date 2023-06-20 16:48:14 + */ +@Slf4j +@Service +@RequiredArgsConstructor +@Transactional(rollbackFor = Exception.class) +public class EduGuideStepOrderServiceImpl extends ServiceImpl + implements EduGuideStepOrderService { + + @Lazy + @Resource + private H5EduSmartWelcomeService h5EduSmartWelcomeService; + + private final CommonService commonService; + + @Override + public void constructionPayNotify(ConstructionPayNotifyDTO dto) { + // 根据订单号查询对应的订单信息 + EduGuideStepOrder order = getOne(new LambdaQueryWrapper<>(new EduGuideStepOrder()) + .eq(EduGuideStepOrder::getOrderCode, dto.getORDERID())); + if (Objects.isNull(order)) { + log.error("建行支付回调, 未找到订单信息, orderNO: {}", dto.getORDERID()); + throw new FebsException(ResultMsgType.ORDER_NOT_FOUND.getValue()); + } + // 返回的订单状态 + String status = dto.getSUCCESS(); + if ("N".equals(status)) { + log.error("错误状态: {}", order.getOrderCode()); + throw new FebsException(ResultMsgType.SERVER_ERROR.getValue()); + } + // 判断支付结果是否处理 + if (OrderStatusEnum.PAY_SUCCESS.getStatus().equals(order.getOrderStatus())) { + log.info("建行支付回调, 该订单已经处理: {}", order.getOrderCode()); + return; + } + // 验证金额 + if (order.getPracticalMoney().compareTo(new BigDecimal(dto.getPAYMENT())) != 0) { + log.error("订单金额错误: {}", order.getOrderCode()); + throw new FebsException(ResultMsgType.ORDER_MONEY_ERROR.getValue()); + } + // 获取建行配置信息 + ConstructionPayConfig config = commonService.getConstructionPayConfigByDept(order.getDeptId()); + if (Objects.isNull(config)) { + log.info("建行支付回调, 该学校没有对应的配置信息: {}", order.getDeptId()); + throw new FebsException(ResultMsgType.SERVER_ERROR.getValue()); + } + // 签名 + String signature = dto.getSIGN(); + // TODO 此处调用查询接口处理数据 + // 验签 +// boolean checkFlag = ConstructionPayUtil.validateSign(dto, signature, config.getPublicKey()); +// if (!checkFlag) { +// log.error("建行支付回调, 验签失败"); +// throw new FebsException(ResultMsgType.SERVER_ERROR.getValue()); +// } + if ("Y".equals(status)) { + h5EduSmartWelcomeService.guideStepOrderPaySuccess(order.getOrderCode(), LocalDateTime.now()); + } + } + + @Override + public void updateGuideRosterOrderStatus() { + // 查询超时订单 + List list = baseMapper.selectTimeOutOrder(); + if (CollUtil.isNotEmpty(list)) { + for (EduGuideStepOrder order : list) { + // 建行订单 + if (PayWay.CONSTRUCTION_PAY.getValue().equals(order.getPayWay())) { + updateConstructionGuideStepOrderStatus(order); + } + } + } + } + + private void updateConstructionGuideStepOrderStatus(EduGuideStepOrder order) { + try { + // 查询建行支付配置 + ConstructionPayConfig config = commonService.getConstructionPayConfigByDept(order.getDeptId()); + if (Objects.isNull(config)) { + log.error("当前学校赞未配置建行支付信息"); + return; + } + // 主动查询订单支付状态 + JSONObject resultJson = ConstructionPayUtil.queryOrder(config, order.getOrderCode()); + log.info("建行订单查询返回数据, orderCode: {}, resultJson: {}", order.getOrderCode(), resultJson); + // 返回code + String code = resultJson.getStr(ConstructionPayConstant.RETURN_CODE_NAME); + // 无法找到指定的订单 需要直接关闭订单 + if (ConstructionPayConstant.NO_ORDER_CODE.equalsIgnoreCase(code)) { + order.setOrderStatus(OrderStatusEnum.CLOSED.getStatus()); + order.setPayStatus(PayStatusEnum.CANCEL.getStatus()); + baseMapper.updateById(order); + return; + } + + // 支付信息 + JSONObject queryOrder = resultJson.getJSONObject("QUERYORDER"); + // 支付状态 + String status = (String) queryOrder.get("STATUSCODE"); + // 不确定不处理 + if (ConstructionTradeStateEnum.WAIT_BANK_CONFIRM.getStatus().equals(status) + || ConstructionTradeStateEnum.WAIT_BANK_CONFIRM_OTHER.getStatus().equals(status)) { + return; + } + ConstructionTradeStateEnum tradeStateEnum = EnumUtils.valueOf(ConstructionTradeStateEnum.class, status, + ConstructionTradeStateEnum.class.getMethod("getStatus")); + switch (Objects.requireNonNull(tradeStateEnum)) { + // 支付成功 + case TRADE_SUCCESS: + h5EduSmartWelcomeService.guideStepOrderPaySuccess(order.getOrderCode(), + LocalDateTimeUtil.parse((String) resultJson.get("ORDERDATE"), DatePattern.NORM_DATETIME_PATTERN)); + break; + // 作废订单 + case TRADE_FAIL: + case WAIT_BANK_CONFIRM: + case WAIT_BANK_CONFIRM_OTHER: + order.setOrderStatus(OrderStatusEnum.CLOSED.getStatus()); + order.setPayStatus(PayStatusEnum.CANCEL.getStatus()); + break; + default: + break; + } + if (OrderStatusEnum.CLOSED.getStatus().equals(order.getOrderStatus())) { + baseMapper.updateById(order); + } + } catch (Exception e) { + log.error("更新建行迎新订单状态失败, order: {}", order, e); + } + } +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/EduSmartWelcomeCampusServiceImpl.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/EduSmartWelcomeCampusServiceImpl.java new file mode 100644 index 0000000..04c8b35 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/EduSmartWelcomeCampusServiceImpl.java @@ -0,0 +1,20 @@ +package com.yida.data.school.smart.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeCampus; +import com.yida.data.school.smart.mapper.EduSmartWelcomeCampusMapper; +import com.yida.data.school.smart.service.EduSmartWelcomeCampusService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Slf4j +@Service +@RequiredArgsConstructor +@Transactional(rollbackFor = Exception.class) +public class EduSmartWelcomeCampusServiceImpl extends ServiceImpl + implements EduSmartWelcomeCampusService { + + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/EduSmartWelcomeDepartmentServiceImpl.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/EduSmartWelcomeDepartmentServiceImpl.java new file mode 100644 index 0000000..0b925c4 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/EduSmartWelcomeDepartmentServiceImpl.java @@ -0,0 +1,52 @@ +package com.yida.data.school.smart.service.impl; + +import cc.mrbird.febs.common.redis.service.RedisService; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.constant.CachePrefixConstant; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeDepartment; +import com.yida.data.school.smart.mapper.EduSmartWelcomeDepartmentMapper; +import com.yida.data.school.smart.service.EduSmartWelcomeDepartmentService; +import java.util.List; +import lombok.Data; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + + +@Slf4j +@Service +@RequiredArgsConstructor +@Transactional(rollbackFor = Exception.class) +public class EduSmartWelcomeDepartmentServiceImpl extends ServiceImpl + implements EduSmartWelcomeDepartmentService { + + private final RedisService redisService; + + @Override + public List getDepartmentTree(Long deptId) { +// String returnStr = (String) redisService.hget(CachePrefixConstant.WELCOME_DEPARTMENT_DATA, deptId.toString()); +// +// if (ObjectUtil.isNotNull(returnStr)) { +// return JSONUtil.toList(returnStr, EduSmartWelcomeDepartment.class); +// } + List departmentList = list(Wrappers.lambdaQuery(new EduSmartWelcomeDepartment()) + .eq(EduSmartWelcomeDepartment::getDeptId, deptId) + .isNull(EduSmartWelcomeDepartment::getParentId)); + for (EduSmartWelcomeDepartment department : departmentList) { + List list = list(Wrappers.lambdaQuery(new EduSmartWelcomeDepartment()) + .eq(EduSmartWelcomeDepartment::getDeptId, deptId) + .eq(EduSmartWelcomeDepartment::getParentId, department.getId())); + department.setChildrenList(list); + } + log.info("缓存数据:{}", JSONUtil.toJsonStr(departmentList)); +// if (CollUtil.isNotEmpty(departmentList)) { +// redisService.set(CachePrefixConstant.WELCOME_DEPARTMENT_DATA + deptId, JSONUtil.toJsonStr(departmentList)); +// } + return departmentList; + } +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/EduSmartWelcomeGuideClassRecordServiceImpl.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/EduSmartWelcomeGuideClassRecordServiceImpl.java new file mode 100644 index 0000000..ec4c644 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/EduSmartWelcomeGuideClassRecordServiceImpl.java @@ -0,0 +1,23 @@ +package com.yida.data.school.smart.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideClassRecord; +import com.yida.data.school.smart.mapper.EduSmartWelcomeGuideClassRecordMapper; +import com.yida.data.school.smart.service.EduSmartWelcomeGuideClassRecordService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * 智慧迎新班级预分记录Service实现 + */ +@Slf4j +@Service +@RequiredArgsConstructor +@Transactional(rollbackFor = Exception.class) +public class EduSmartWelcomeGuideClassRecordServiceImpl extends ServiceImpl + implements EduSmartWelcomeGuideClassRecordService { + + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/EduSmartWelcomeGuideDormRecordServiceImpl.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/EduSmartWelcomeGuideDormRecordServiceImpl.java new file mode 100644 index 0000000..e5d6930 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/EduSmartWelcomeGuideDormRecordServiceImpl.java @@ -0,0 +1,23 @@ +package com.yida.data.school.smart.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideDormRecord; +import com.yida.data.school.smart.mapper.EduSmartWelcomeGuideDormRecordMapper; +import com.yida.data.school.smart.service.EduSmartWelcomeGuideDormRecordService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * 智慧迎新班级预分记录Service实现 + */ +@Slf4j +@Service +@RequiredArgsConstructor +@Transactional(rollbackFor = Exception.class) +public class EduSmartWelcomeGuideDormRecordServiceImpl extends ServiceImpl + implements EduSmartWelcomeGuideDormRecordService { + + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/EduSmartWelcomeGuideRosterRelationServiceImpl.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/EduSmartWelcomeGuideRosterRelationServiceImpl.java new file mode 100644 index 0000000..a69fb52 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/EduSmartWelcomeGuideRosterRelationServiceImpl.java @@ -0,0 +1,78 @@ +package com.yida.data.school.smart.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuide; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideRoster; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideRosterRelation; +import com.yida.data.common.core.enums.EnableStatusEnum; +import com.yida.data.school.smart.mapper.EduSmartWelcomeGuideRosterRelationMapper; +import com.yida.data.school.smart.service.EduSmartWelcomeGuideRosterRelationService; +import com.yida.data.school.smart.service.EduSmartWelcomeGuideRosterService; +import com.yida.data.school.smart.service.EduSmartWelcomeGuideService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 智慧迎新指南花名册-微信用户绑定关系表Service实现 + * + * @author ZYJ + * @date 2023-05-17 13:53:18 + */ +@Slf4j +@Service +@Transactional(rollbackFor = Exception.class) +public class EduSmartWelcomeGuideRosterRelationServiceImpl extends ServiceImpl + implements + EduSmartWelcomeGuideRosterRelationService { + + @Lazy + @Resource + private EduSmartWelcomeGuideService eduSmartWelcomeGuideService; + + @Lazy + @Resource + private EduSmartWelcomeGuideRosterService eduSmartWelcomeGuideRosterService; + + @Override + public EduSmartWelcomeGuideRosterRelation getOpenIdRelation(String openId, Long deptId) { + List relationList = list( + Wrappers.lambdaQuery(new EduSmartWelcomeGuideRosterRelation()) + .eq(EduSmartWelcomeGuideRosterRelation::getOpenId, openId) + .eq(EduSmartWelcomeGuideRosterRelation::getDeptId, deptId)); + + log.info("openID:【{}】,deptId:【{}】", openId, deptId); + EduSmartWelcomeGuideRosterRelation returnRelation = null; + + if (CollUtil.isNotEmpty(relationList)) { + for (EduSmartWelcomeGuideRosterRelation relation : relationList) { + //判断当前指南是否启用 + EduSmartWelcomeGuide guide = eduSmartWelcomeGuideService.getById(relation.getGuideId()); + if (ObjectUtil.isNotNull(guide)) { + if (guide.getEnableStatus().equals(EnableStatusEnum.ENABLE_STATUS.getStatus())) { + EduSmartWelcomeGuideRoster guideRoster = eduSmartWelcomeGuideRosterService + .getOne(Wrappers.lambdaQuery(new EduSmartWelcomeGuideRoster()) + .eq(EduSmartWelcomeGuideRoster::getId, relation.getRosterId())); + if(ObjectUtil.isNotNull(guideRoster)){ + guideRoster.setQrCodeNoticeMessage(guide.getQrCodeNoticeMessage()); + relation.setGuideRoster(guideRoster); + returnRelation = relation; + break; + } + + } + } + } + } + return returnRelation; + } +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/EduSmartWelcomeGuideRosterRelationStepServiceImpl.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/EduSmartWelcomeGuideRosterRelationStepServiceImpl.java new file mode 100644 index 0000000..87c36bb --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/EduSmartWelcomeGuideRosterRelationStepServiceImpl.java @@ -0,0 +1,29 @@ +package com.yida.data.school.smart.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideRosterRelationStep; +import com.yida.data.school.smart.mapper.EduSmartWelcomeGuideRosterRelationStepMapper; +import com.yida.data.school.smart.service.EduSmartWelcomeGuideRosterRelationStepService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * 智慧迎新指南花名册-微信用户绑定关系-执行步骤表 Service实现 + * + * @author ZYJ + * @date 2023-05-19 14:37:43 + */ +@Slf4j +@Service +@RequiredArgsConstructor +@Transactional(rollbackFor = Exception.class) +public class EduSmartWelcomeGuideRosterRelationStepServiceImpl extends ServiceImpl + implements EduSmartWelcomeGuideRosterRelationStepService { + + @Override + public long countCompleteRoster(Long guideId, long stepNumber) { + return baseMapper.countCompleteRoster(guideId, stepNumber); + } +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/EduSmartWelcomeGuideRosterServiceImpl.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/EduSmartWelcomeGuideRosterServiceImpl.java new file mode 100644 index 0000000..265ff52 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/EduSmartWelcomeGuideRosterServiceImpl.java @@ -0,0 +1,738 @@ +package com.yida.data.school.smart.service.impl; + +import cc.mrbird.febs.common.redis.service.RedisService; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.UUID; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.support.ExcelTypeEnum; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.TypeReference; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.CurrentUser; +import com.yida.data.common.core.entity.constant.CachePrefixConstant; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideClassRecord; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideDormRecord; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideRoster; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideRosterRelation; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideRosterRelationStep; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideStep; +import com.yida.data.common.core.entity.system.SystemUser; +import com.yida.data.common.core.entity.user.EduParent; +import com.yida.data.common.core.entity.user.EduStudent; +import com.yida.data.common.core.enums.*; +import com.yida.data.common.core.file.common.DownloadFileChunk; +import com.yida.data.common.core.exception.FebsException; +import com.yida.data.common.core.utils.*; +import com.yida.data.school.dto.smart.*; +import com.yida.data.school.smart.config.ExportGuidePicClient; +import com.yida.data.school.smart.excel.GuideRosterExcelListener; +import com.yida.data.school.smart.excel.SelectGuidePicExportData; +import com.yida.data.school.smart.mapper.EduSmartWelcomeGuideRosterMapper; +import com.yida.data.school.smart.service.*; +import com.yida.data.school.vo.smart.*; +import com.yida.data.system.feign.RemoteUserService; +import com.yida.data.user.feign.RemoteStudentService; + +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.Lazy; +import org.springframework.core.io.ClassPathResource; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StopWatch; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.InputStream; +import java.time.LocalDateTime; +import java.util.*; + +/** + * 智慧迎新指南花名册表Service实现 + * + * @author ZYJ + * @date 2023-05-16 15:06:19 + */ +@Slf4j +@Service +@RequiredArgsConstructor +@Transactional(rollbackFor = Exception.class) +public class EduSmartWelcomeGuideRosterServiceImpl extends ServiceImpl + implements EduSmartWelcomeGuideRosterService { + + @Lazy + @Resource + private ImportGuideRosterService importGuideRosterService; + + private final EduSmartWelcomeGuideStepService eduSmartWelcomeGuideStepService; + private final EduSmartWelcomeGuideRosterRelationService eduSmartWelcomeGuideRosterRelationService; + private final EduSmartWelcomeGuideRosterRelationStepService eduSmartWelcomeGuideRosterRelationStepService; + + private final RemoteUserService remoteUserService; + private final RemoteStudentService remoteStudentService; + private final EduSmartWelcomeGuideStepClassService eduSmartWelcomeGuideStepClassService; + private final EduSmartWelcomeGuideClassRecordService eduSmartWelcomeGuideClassRecordService; + private final EduSmartWelcomeGuideStepDormService eduSmartWelcomeGuideStepDormService; + private final EduSmartWelcomeGuideDormRecordService eduSmartWelcomeGuideDormRecordService; + + private final RedisService redisService; + + @Autowired + ApplicationContext applicationContext; + + @Value("${febs.uploadUrl}") + private String uploadUrl; + + @Lazy + @Resource + private ExportGuidePicClient exportGuidePicClient; + + @Override + public void saveGuideFillInfo(GuideFillInfoSaveDTO dto) { + // 查询花名册基础信息 + EduSmartWelcomeGuideRoster guideRoster = getOne(Wrappers.lambdaQuery(new EduSmartWelcomeGuideRoster()) + .eq(EduSmartWelcomeGuideRoster::getDeptId, dto.getDeptId()) + .eq(EduSmartWelcomeGuideRoster::getGuideId, dto.getGuideId()) + .eq(EduSmartWelcomeGuideRoster::getFullName, dto.getName()) + .eq(EduSmartWelcomeGuideRoster::getIdNumber, dto.getIdNumber()) + .eq(EduSmartWelcomeGuideRoster::getAdmittedMajor, dto.getAdmittedMajor()) + ); + if (Objects.isNull(guideRoster)) { + throw new FebsException("您填写的信息与教育系统内不一致,请修改后再试"); + } + // 判断是否绑定过当前指南的信息 + EduSmartWelcomeGuideRosterRelation exist = eduSmartWelcomeGuideRosterRelationService + .getOne(Wrappers.lambdaQuery(new EduSmartWelcomeGuideRosterRelation()) + .eq(EduSmartWelcomeGuideRosterRelation::getGuideId, dto.getGuideId()) + .eq(EduSmartWelcomeGuideRosterRelation::getOpenId, dto.getOpenId()) + ); + if (Objects.nonNull(exist)) { + throw new FebsException("当前账号已经绑定过信息!"); + } + // 判断是否绑定过 + EduSmartWelcomeGuideRosterRelation relation = eduSmartWelcomeGuideRosterRelationService + .getOne(Wrappers.lambdaQuery(new EduSmartWelcomeGuideRosterRelation()) + .eq(EduSmartWelcomeGuideRosterRelation::getRosterId, guideRoster.getId()) +// .eq(EduSmartWelcomeGuideRosterRelation::getOpenId, dto.getOpenId()) + ); + if (Objects.nonNull(relation)) { + if (Objects.nonNull(guideRoster.getDormitoryId()) || Objects.nonNull(guideRoster.getClassId())) { + throw new FebsException("该信息已被绑定!请联系工作人员"); + } else { + // 清除绑定数据 + EduSmartWelcomeGuideRosterServiceImpl bean = applicationContext + .getBean(EduSmartWelcomeGuideRosterServiceImpl.class); + bean.deleteRosterInfo(guideRoster.getId()); + } + } + // 判断是否需要添加登录用户信息 + SystemUser user = remoteUserService.getInfoByUsernameNoPermission(guideRoster.getMobile()).getData(); + if (Objects.isNull(user)) { + user = new SystemUser(); + user.setDeptId(dto.getDeptId()); + user.setUsername(guideRoster.getMobile()); + user.setNickname(guideRoster.getMobile()); + user.setMobile(guideRoster.getMobile()); + user.setSex(ObjectUtil.isNull(dto.getSex()) ? null : String.valueOf(dto.getSex())); + user.setAvatar(dto.getAvatar()); + user.setUserOrigin(0); + user = remoteUserService.addUser(user).getData(); + } + // 添加关联关系 + relation = new EduSmartWelcomeGuideRosterRelation(); + BeanUtils.copyProperties(dto, relation); + relation.setRosterId(guideRoster.getId()); + relation.setUserId(user.getUserId()); + eduSmartWelcomeGuideRosterRelationService.saveOrUpdate(relation); + + //变更花名册信息 + guideRoster.setAdmissionLetter(dto.getAdmissionLetter()); + guideRoster.setAdmittedDepartment(dto.getAdmittedDepartment()); + guideRoster.setAdmittedDepartmentId(dto.getAdmittedDepartmentId()); + guideRoster.setAdmittedMajor(dto.getAdmittedMajor()); + guideRoster.setAdmittedMajorId(dto.getAdmittedMajorId()); + guideRoster.setIdCardReverse(dto.getIdCardReverse()); + guideRoster.setIdCardRight(dto.getIdCardRight()); + updateById(guideRoster); + } + + @Override + public void deleteRosterInfo(Long rosterId) { + // 删除绑定人员步骤信息 + eduSmartWelcomeGuideRosterRelationStepService.remove(Wrappers.lambdaQuery(new EduSmartWelcomeGuideRosterRelationStep()) + .eq(EduSmartWelcomeGuideRosterRelationStep::getRosterId, rosterId)); + // 删除绑定关系 + eduSmartWelcomeGuideRosterRelationService.remove(Wrappers.lambdaQuery(new EduSmartWelcomeGuideRosterRelation()) + .eq(EduSmartWelcomeGuideRosterRelation::getRosterId, rosterId)); + } + + @Override + public IPage> listGuideRoster(GuideRosterSelectPageDTO dto) { + if (ObjectUtil.isNotNull(dto.getPassStepId())) { + // 查询出完成步骤的人员信息 + List relationStepList = eduSmartWelcomeGuideRosterRelationStepService + .list(Wrappers.lambdaQuery(new EduSmartWelcomeGuideRosterRelationStep()) + .eq(EduSmartWelcomeGuideRosterRelationStep::getGuideId, dto.getGuideId()) + .eq(EduSmartWelcomeGuideRosterRelationStep::getStatus, AuditStatusEnum.PASS_STATUS.getStatus()) + .eq(EduSmartWelcomeGuideRosterRelationStep::getStepId, dto.getPassStepId())); + if (CollUtil.isNotEmpty(relationStepList)) { + dto.setPassRosterIdList(relationStepList.stream().map(EduSmartWelcomeGuideRosterRelationStep::getRosterId) + .collect(Collectors.toList())); + } + } + IPage page = baseMapper.listGuideRoster(dto.toPage(), dto); + // 实际返回的分页数据 + Page> returnPage = new Page<>(); + BeanUtils.copyProperties(page, returnPage); + List> returnList = new ArrayList<>(); + + for (GuideRosterSelectPageVO vo : page.getRecords()) { + Map map = JSONObject + .parseObject(JSONObject.toJSONString(vo), new TypeReference>() { + }); + EduSmartWelcomeGuideRosterRelation relation = eduSmartWelcomeGuideRosterRelationService + .getOne(Wrappers.lambdaQuery(new EduSmartWelcomeGuideRosterRelation()) + .eq(EduSmartWelcomeGuideRosterRelation::getRosterId, vo.getRosterId()) + ); + // 处理步骤信息 + List stepList = eduSmartWelcomeGuideStepService. + listStepInfo(Objects.nonNull(relation) ? relation.getId() : null, dto.getGuideId()); + if (CollUtil.isNotEmpty(stepList)) { + stepList.forEach(step -> map.put(step.getId().toString(), step.getStatus().toString())); + } + returnList.add(map); + } + returnPage.setRecords(returnList); + return returnPage; + } + + @Override + public List statisticsGuideRoster(Long guideId) { + List list = new ArrayList<>(); + // 查询花名册数量 + long totalNumber = count(Wrappers.lambdaQuery(new EduSmartWelcomeGuideRoster()) + .eq(EduSmartWelcomeGuideRoster::getGuideId, guideId)); + // 查询报到成功人数 + long successNumber = count(Wrappers.lambdaQuery(new EduSmartWelcomeGuideRoster()) + .eq(EduSmartWelcomeGuideRoster::getGuideId, guideId) + .eq(EduSmartWelcomeGuideRoster::getRegistrationStatus, RegistrationStatusEnum.REGISTRATION_SUCCESS.getStatus()) + ); + list.add(StatisticsGuideRosterVO.builder() + .cardName("报到完成") + .totalNumber(Math.toIntExact(totalNumber)) + .executeNumber(Math.toIntExact(successNumber)) + .build()); + // 查询需要审核的步骤信息 + List stepList = eduSmartWelcomeGuideStepService + .list(Wrappers.lambdaQuery(new EduSmartWelcomeGuideStep()) + .eq(EduSmartWelcomeGuideStep::getGuideId, guideId) + .in(EduSmartWelcomeGuideStep::getStepType, + Arrays.asList(GuideStepTypeEnum.EXAMINE_TYPE.getType(), + GuideStepTypeEnum.MATCH_FACE.getType(), + GuideStepTypeEnum.CLASS.getType(), + GuideStepTypeEnum.DORM.getType() + ) + ) + ); + for (EduSmartWelcomeGuideStep step : stepList) { + long executeNumber = 0; + // 花名册信息不为0 + if (totalNumber != 0) { + // 查询步骤通过数量 + executeNumber = eduSmartWelcomeGuideRosterRelationStepService + .count(Wrappers.lambdaQuery(new EduSmartWelcomeGuideRosterRelationStep()) + .eq(EduSmartWelcomeGuideRosterRelationStep::getStepId, step.getId()) + .eq(EduSmartWelcomeGuideRosterRelationStep::getStatus, AuditStatusEnum.PASS_STATUS.getStatus()) + ); + } + list.add(StatisticsGuideRosterVO.builder() + .cardName(step.getStepName()) + .totalNumber(Math.toIntExact(totalNumber)) + .executeNumber(Math.toIntExact(executeNumber)) + .build()); + } + return list; + } + + @Override + public GuideRosterInfoVO getGuideRosterInfo(Long rosterId) { + GuideRosterInfoVO vo = new GuideRosterInfoVO(); + EduSmartWelcomeGuideRoster guideRoster = getById(rosterId); + if (Objects.nonNull(guideRoster)) { + BeanUtils.copyProperties(guideRoster, vo); + vo.setRosterId(guideRoster.getId()); + // 处理步骤信息 + List stepList = + eduSmartWelcomeGuideStepService.listStepDetailInfo(rosterId, guideRoster.getGuideId()); + vo.setStepList(stepList); + // 查询关联关系 + EduSmartWelcomeGuideRosterRelation relation = eduSmartWelcomeGuideRosterRelationService + .getOne(Wrappers.lambdaQuery(new EduSmartWelcomeGuideRosterRelation()) + .eq(EduSmartWelcomeGuideRosterRelation::getRosterId, rosterId)); + if (Objects.nonNull(relation)) { + vo.setAvatar(relation.getAvatar()); + vo.setSex(relation.getSex()); + } + } + return vo; + } + + @Override + public void importGuideRoster(String fileUrl, Long guideId, CurrentUser currentUser, String uuid) { + // 上传的excel文件 + File file = null; + // 错误信息文件excel + File errorFile = null; + try { + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); + // 调用导入方法 + List errorList = new ArrayList<>(); + file = new File(fileUrl); + EasyExcel.read(file, GuideRosterImportDTO.class, + new GuideRosterExcelListener(importGuideRosterService, errorList, guideId, uuid, currentUser)) + .sheet().headRowNumber(1).doRead(); + stopWatch.stop(); + log.info("导入指南花名册数据总共耗时: {}", stopWatch.getTotalTimeSeconds() + "秒"); + // 判断是否有错误数据 + if (CollUtil.isNotEmpty(errorList)) { + // 错误信息文件名称 + String fileName = FileUtil.getLocalUploadAddress() + uuid + ".xlsx"; + EasyExcel.write(fileName, GuideRosterErrorExportDTO.class) + .sheet("错误信息") + .doWrite(errorList); + // 上传到媒资 + errorFile = new File(fileName); + String url = FileUtil.uploadFileToMediaServer(uploadUrl, errorFile); + // 保存导入不成功的数据和原因 + redisService.set(CachePrefixConstant.IMPORT_GUIDE_ROSTER_KEY + uuid, + ImportRosterDataVO.builder().percent(100).finish(1).key(uuid).filePath(url) + .build()); + } else { + redisService.set(CachePrefixConstant.IMPORT_GUIDE_ROSTER_KEY + uuid, + ImportRosterDataVO.builder().percent(100).finish(1).key(uuid) + .build()); + } + } catch (Exception e) { + log.error("导入指南花名册数据失败: {}", e.getMessage(), e); + throw new FebsException("导入失败!请重新操作"); + } finally { + if (Objects.nonNull(file)) { + cn.hutool.core.io.FileUtil.del(file); + } + if (Objects.nonNull(errorFile)) { + cn.hutool.core.io.FileUtil.del(errorFile); + } + } + } + + @Override + public void downloadGuideTemplate(HttpServletResponse response) { + try { + String fileName = "花名册导入模板.xls"; + // 获取导入文件模板 + ClassPathResource classPathResource = new ClassPathResource("template/" + fileName); + InputStream inputStream = classPathResource.getInputStream(); + FileUtil.download(FileUtil.inputStreamToFile(inputStream), fileName, false, response); + } catch (Exception e) { + throw new FebsException("下载指南花名册导入模板失败!"); + } + } + + @Override + public EduSmartWelcomeGuideRosterRelation getRosterInfo(Long rosterId, Long staffId) { + EduSmartWelcomeGuideRoster guideRoster = getById(rosterId); + if (Objects.isNull(guideRoster)) { + throw new FebsException("人员信息错误!"); + } + EduSmartWelcomeGuideRosterRelation relation = eduSmartWelcomeGuideRosterRelationService + .getOne(Wrappers.lambdaQuery(new EduSmartWelcomeGuideRosterRelation()) + .eq(EduSmartWelcomeGuideRosterRelation::getRosterId, rosterId)); + if (Objects.isNull(relation)) { + throw new FebsException("人员信息错误!"); + } + relation.setGuideRoster(guideRoster); + // 查询步骤信息 + List stepList = eduSmartWelcomeGuideStepService + .listExamineStepInfo(guideRoster.getId(), guideRoster.getGuideId(), staffId); + relation.setStepList(stepList); + return relation; + } + + @Override + public void passStep(StaffPassStepDTO dto) { + EduSmartWelcomeGuideRoster guideRoster = (EduSmartWelcomeGuideRoster) redisService + .hget(CachePrefixConstant.WELCOME_ROSTER, dto.getRosterId().toString()); + + if (ObjectUtil.isNull(guideRoster)) { + guideRoster = getById(dto.getRosterId()); + } + + if (Objects.isNull(guideRoster)) { + throw new FebsException("人员信息错误!"); + } + // 判断前提步骤信息 + EduSmartWelcomeGuideStep step = eduSmartWelcomeGuideStepService.getById(dto.getStepId()); + if (Objects.isNull(step)) { + throw new FebsException("步骤信息错误!"); + } + if (Objects.nonNull(step.getPremiseStepId())) { + EduSmartWelcomeGuideStep premiseStep = eduSmartWelcomeGuideStepService + .premiseStep(step.getPremiseStepId(), new EduSmartWelcomeGuideStep()); + if (ObjectUtil.isNotNull(premiseStep)) { + if (ObjectUtil.equals(GuideStepTypeEnum.EXAMINE_TYPE.getType(), premiseStep.getStepType()) || ObjectUtil + .equals(GuideStepTypeEnum.CLASS.getType(), premiseStep.getStepType()) || + ObjectUtil.equals(GuideStepTypeEnum.DORM.getType(), premiseStep.getStepType()) + || ObjectUtil.equals(GuideStepTypeEnum.MATCH_FACE.getType(), premiseStep.getStepType())) { + EduSmartWelcomeGuideRosterRelationStep premiseRelationStep = eduSmartWelcomeGuideRosterRelationStepService + .getOne(Wrappers.lambdaQuery(new EduSmartWelcomeGuideRosterRelationStep()) + .eq(EduSmartWelcomeGuideRosterRelationStep::getRosterId, dto.getRosterId()) + .eq(EduSmartWelcomeGuideRosterRelationStep::getStepId, premiseStep.getId()) + .eq(EduSmartWelcomeGuideRosterRelationStep::getStatus, AuditStatusEnum.PASS_STATUS.getStatus()) + ); + if (Objects.isNull(premiseRelationStep)) { + throw new FebsException(String.format("请审核通过【%s】后执行其它步骤!", premiseStep.getStepName())); + } + } + } + } + // 判断是否审核通过 + EduSmartWelcomeGuideRosterRelationStep relationStep = eduSmartWelcomeGuideRosterRelationStepService + .getOne(Wrappers.lambdaQuery(new EduSmartWelcomeGuideRosterRelationStep()) + .eq(EduSmartWelcomeGuideRosterRelationStep::getRosterId, dto.getRosterId()) + .eq(EduSmartWelcomeGuideRosterRelationStep::getStepId, dto.getStepId()) + .eq(EduSmartWelcomeGuideRosterRelationStep::getStatus, AuditStatusEnum.PASS_STATUS.getStatus())); + if (Objects.nonNull(relationStep)) { + throw new FebsException("该步骤已经审核通过!请勿重复操作"); + } + // 保存审核信息 + EduSmartWelcomeGuideRosterRelationStep smartWelcomeGuideRosterRelationStep = eduSmartWelcomeGuideRosterRelationStepService + .getOne(Wrappers.lambdaQuery(new EduSmartWelcomeGuideRosterRelationStep()) + .eq(EduSmartWelcomeGuideRosterRelationStep::getGuideId, guideRoster.getGuideId()) + .eq(EduSmartWelcomeGuideRosterRelationStep::getStepId, dto.getStepId()) + .eq(EduSmartWelcomeGuideRosterRelationStep::getRelationId, dto.getRelationId())); + + if (ObjectUtil.isNull(smartWelcomeGuideRosterRelationStep)) { + EduSmartWelcomeGuideRosterRelationStep saveInfo = new EduSmartWelcomeGuideRosterRelationStep(); + BeanUtils.copyProperties(dto, saveInfo); + saveInfo.setDeptId(guideRoster.getDeptId()); + saveInfo.setGuideId(guideRoster.getGuideId()); + saveInfo.setRosterId(guideRoster.getId()); + saveInfo.setRelationId(dto.getRelationId()); + saveInfo.setOperateTime(LocalDateTime.now()); + saveInfo.setStatus(AuditStatusEnum.PASS_STATUS.getStatus()); + saveInfo.setCommentContent(dto.getCommentContent()); + eduSmartWelcomeGuideRosterRelationStepService.save(saveInfo); + } else { + eduSmartWelcomeGuideRosterRelationStepService + .update(Wrappers.lambdaUpdate(new EduSmartWelcomeGuideRosterRelationStep()) + .eq(EduSmartWelcomeGuideRosterRelationStep::getId, smartWelcomeGuideRosterRelationStep.getId()) + .set(EduSmartWelcomeGuideRosterRelationStep::getStatus, AuditStatusEnum.PASS_STATUS.getStatus()) + .set(EduSmartWelcomeGuideRosterRelationStep::getCommentContent, dto.getCommentContent())); + } + + //判断步骤类型分配班级和宿舍 + if (ObjectUtil.equals(GuideStepTypeEnum.CLASS.getType(), step.getStepType())) { + eduSmartWelcomeGuideStepClassService.classBanding(guideRoster.getGuideId(), step.getId(), dto.getRosterId()); + } + + if (ObjectUtil.equals(GuideStepTypeEnum.DORM.getType(), step.getStepType())) { + eduSmartWelcomeGuideStepDormService.dormBanding(guideRoster.getGuideId(), step.getId(), dto.getRosterId()); + } + + // 判断是否全部通过 + long passCount = eduSmartWelcomeGuideRosterRelationStepService + .count(Wrappers.lambdaQuery(new EduSmartWelcomeGuideRosterRelationStep()) + .eq(EduSmartWelcomeGuideRosterRelationStep::getRosterId, dto.getRosterId()) + .eq(EduSmartWelcomeGuideRosterRelationStep::getStatus, AuditStatusEnum.PASS_STATUS.getStatus()) + ); + List stepList = eduSmartWelcomeGuideStepService + .list(Wrappers.lambdaQuery(new EduSmartWelcomeGuideStep()) + .eq(EduSmartWelcomeGuideStep::getGuideId, guideRoster.getGuideId())); + + //需要审核的步骤 + List needStepList = stepList.stream() + .filter(s -> !s.getStepType().equals(GuideStepTypeEnum.NOTICE.getType())).collect(Collectors.toList()); + + if (passCount == needStepList.size()) { + EduSmartWelcomeGuideRoster saveRoster = new EduSmartWelcomeGuideRoster(); + saveRoster.setId(guideRoster.getId()); + saveRoster.setRegistrationStatus(RegistrationStatusEnum.REGISTRATION_SUCCESS.getStatus()); + updateById(saveRoster); + + //增加新生到学生库,以及分配宿舍 + //@Async注解是通过aop代理实现的,而我们调用自己类的异步方法时,绕过了aop代理从而导致其异步失效 + EduSmartWelcomeGuideRosterServiceImpl bean = applicationContext.getBean(EduSmartWelcomeGuideRosterServiceImpl.class); + bean.addStudent(dto.getRosterId(), FebsUtil.getTopDeptId()); + } + } + + @Async + public void addStudent(Long rosterId, Long schoolId) { + + EduSmartWelcomeGuideRoster roster = (EduSmartWelcomeGuideRoster) redisService + .hget(CachePrefixConstant.WELCOME_ROSTER, rosterId.toString()); + if (ObjectUtil.isNull(roster)) { + roster = this.getById(rosterId); + } + EduSmartWelcomeGuideClassRecord classRecord = eduSmartWelcomeGuideClassRecordService + .getOne(Wrappers.lambdaQuery(new EduSmartWelcomeGuideClassRecord()) + .eq(EduSmartWelcomeGuideClassRecord::getRosterId, rosterId)); + + EduSmartWelcomeGuideDormRecord dormRecord = eduSmartWelcomeGuideDormRecordService + .getOne(Wrappers.lambdaQuery(new EduSmartWelcomeGuideDormRecord()) + .eq(EduSmartWelcomeGuideDormRecord::getRosterId, rosterId)); + + EduStudent student = new EduStudent(); + student.setStuName(roster.getFullName()); + student.setStuSex(roster.getGender().toString()); + student.setAvatar(roster.getAvatar()); + student.setIdNumber(roster.getIdNumber()); + if (ObjectUtil.isNotNull(classRecord)) { + student.setSchoolId(classRecord.getSchoolId()); + student.setCampusId(classRecord.getCampusId()); + student.setSectionId(classRecord.getSectionId()); + student.setGradeId(classRecord.getGradeId()); + student.setClassId(classRecord.getClassId()); + } else { + //查询校区 +// Dept dept = remoteDeptService.getSchoolByName(roster.getAdmittedDepartment()).getData(); + student.setSchoolId(schoolId); +// student.setCampusId(dept.getDeptId()); + } + + if (ObjectUtil.isNotNull(dormRecord)) { + student.setDormId(dormRecord.getDormId()); + student.setDormRoomId(dormRecord.getDormRoomId()); + student.setType(1);//住宿 + } + + EduParent parent = new EduParent(); + parent.setParentType("本人"); + parent.setMobile(roster.getMobile()); + student.setParents(Stream.of(parent).collect(Collectors.toList())); + log.info("智慧迎新完成增加学生:【{}】", student); + EduStudent eduStudent = remoteStudentService.saveStudent(student).getData(); + //保存宿舍 +// if (ObjectUtil.isNotNull(eduStudent)) { +// eduStudent.setDormId(student.getDormId()); +// eduStudent.setDormRoomId(student.getDormRoomId()); +// remoteStudentService.saveStudentDorm(eduStudent); +// } + } + + + @Override + public void exportRosterInfoData(GuideRosterSelectPageDTO dto, String uuid) { + String fileName = FileUtil.getLocalUploadAddress() + uuid + ".xls"; + File file = null; + try { + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); + // 查询花名册信息 + if (ObjectUtil.isNotNull(dto.getPassStepId())) { + // 查询出完成步骤的人员信息 + List relationStepList = eduSmartWelcomeGuideRosterRelationStepService + .list(Wrappers.lambdaQuery(new EduSmartWelcomeGuideRosterRelationStep()) + .eq(EduSmartWelcomeGuideRosterRelationStep::getGuideId, dto.getGuideId()) + .eq(EduSmartWelcomeGuideRosterRelationStep::getStepId, dto.getPassStepId())); + if (CollUtil.isNotEmpty(relationStepList)) { + dto.setPassRosterIdList(relationStepList.stream().map(EduSmartWelcomeGuideRosterRelationStep::getRosterId) + .collect(Collectors.toList())); + } + } + List list = baseMapper.listGuideRoster(dto); + int listSize = list.size(); + // 导出的信息 + List> exportDataList = new ArrayList<>(); + for (int i = 0; i < listSize; i++) { + GuideRosterSelectPageVO vo = list.get(i); + if (redisService.hasKey(CachePrefixConstant.GUIDE_ROSTER_STEP_DATA + vo.getRosterId())) { + String str = (String) redisService.get(CachePrefixConstant.GUIDE_ROSTER_STEP_DATA + vo.getRosterId()); + List strings = JSON.parseArray(str, String.class); + exportDataList.add(strings); + continue; + } + + Boolean isCache = true; + + redisService.hset(CachePrefixConstant.GUIDE_ROSTER_DATA_DOWNLOAD, uuid, ExportRosterDataVO.builder() + .key(uuid) + .exportStatus(FileDealStatusEnum.DEALING.getStatus()) + .totalNum(listSize) + .currentNum(i).build()); + // 查询绑定关系 + EduSmartWelcomeGuideRosterRelation relation = eduSmartWelcomeGuideRosterRelationService + .getOne(Wrappers.lambdaQuery(new EduSmartWelcomeGuideRosterRelation()) + .eq(EduSmartWelcomeGuideRosterRelation::getRosterId, vo.getRosterId()) + ); + // 封装每一行数据 + ArrayList singleList = CollUtil.newArrayList(vo.getIdNumber(), + vo.getFullName(), vo.getAdmittedMajor(), vo.getGraduateSchool(), vo.getDormitory(), vo.getDormitoryRoom(), + vo.getCampusName(), vo.getSectionName(), vo.getClassName()); + // 处理步骤信息 + List stepList = eduSmartWelcomeGuideStepService. + listStepInfo(Objects.nonNull(relation) ? relation.getId() : null, dto.getGuideId()); + if (CollUtil.isNotEmpty(stepList)) { + for (EduSmartWelcomeGuideStep step : stepList) { + try { + // 获取步骤类型 + GuideStepTypeEnum stepTypeEnum = EnumUtils.valueOf(GuideStepTypeEnum.class, step.getStepType(), + GuideStepTypeEnum.class.getMethod("getType")); + if (!Objects.requireNonNull(stepTypeEnum).isExamineFlag()) { + singleList.add("√"); + } else { + singleList.add(step.getStatus() == 0 ? "√" : "--"); + if (step.getStatus() != 0) { + isCache = false; + } + } + } catch (Exception e) { + isCache = false; + } + } + } + // 添加excel数据 + if (isCache) { + redisService + .set(CachePrefixConstant.GUIDE_ROSTER_STEP_DATA + vo.getRosterId(), + JSONObject.toJSON(singleList).toString()); + } + exportDataList.add(singleList); + } + file = new File(fileName); + // 导出数据 + EasyExcel.write(file) + .excelType(ExcelTypeEnum.XLS) + // 这里放入动态头 + .head(getExportHead(dto.getGuideId())).sheet("花名册") + // 当然这里数据也可以用 List> 去传入 + .doWrite(exportDataList); + // 上传文件到媒资 + String fileUrl = FileUtil.uploadFileToMediaServer(uploadUrl, file); + redisService.hset(CachePrefixConstant.GUIDE_ROSTER_DATA_DOWNLOAD, uuid, ExportRosterDataVO.builder() + .key(uuid) + .filePath(fileUrl) + .exportStatus(FileDealStatusEnum.DEAL_SUCCESS.getStatus()) + .totalNum(listSize == 0 ? 1 : listSize) + .currentNum(listSize == 0 ? 1 : listSize).build()); + stopWatch.stop(); + log.info("导出花名册信息总共耗时: {}", stopWatch.getTotalTimeSeconds() + "秒"); + } catch (Exception e) { + log.error("导出花名册信息错误", e); + redisService.hset(CachePrefixConstant.GUIDE_ROSTER_DATA_DOWNLOAD, uuid, ExportRosterDataVO.builder() + .key(uuid) + .exportStatus(FileDealStatusEnum.DEAL_FAIL.getStatus()).build()); + } finally { + if (Objects.nonNull(file)) { + cn.hutool.core.io.FileUtil.del(file); + } + } + } + + /** + * 生成花名册导出数据excel表头 + * + * @param guideId 指南id + * @return java.util.List> + * @author ZYJ + * @date 2023/8/26 14:20 + */ + private List> getExportHead(Long guideId) { + // 表头list的生成,实际的表头信息可以从数据库或者缓存等处动态读取 + List> allColList = new ArrayList<>(); + // 身份证号表头 + allColList.add(CollUtil.newArrayList("身份证号")); + // 姓名表头 + allColList.add(CollUtil.newArrayList("姓名")); + // 录取专业表头 + allColList.add(CollUtil.newArrayList("录取专业")); + // 毕业学校表头 + allColList.add(CollUtil.newArrayList("毕业学校")); + allColList.add(CollUtil.newArrayList("分配宿舍楼")); + allColList.add(CollUtil.newArrayList("分配宿舍号")); + allColList.add(CollUtil.newArrayList("分配校区")); + allColList.add(CollUtil.newArrayList("分配系部")); + allColList.add(CollUtil.newArrayList("分配班级")); + // 动态表头 + List colList = eduSmartWelcomeGuideStepService.listGuideRosterTableCol(guideId); + colList.forEach(item -> allColList.add(CollUtil.newArrayList(item.getStepName()))); + return allColList; + } + + @Override + public void createRosterQrCode(Long rosterId, Long guideId) { + EduSmartWelcomeGuideRoster guideRoster = getById(rosterId); + if (Objects.isNull(guideRoster)) { + throw new FebsException("花名册信息错误"); + } + if (StrUtil.isNotBlank(guideRoster.getQrCodeUrl())) { + throw new FebsException("该人员已经生成过二维码了!请勿重复操作"); + } + File qrCodeFile = null; + try { + cn.hutool.json.JSONObject obj = JSONUtil.createObj() + .set("rosterId", guideRoster.getId()) + .set("deptId", Objects.requireNonNull(FebsUtil.getCurrentUser()).getDeptId()) + .set("guideId", guideId) + .set("fullName", guideRoster.getFullName()) + .set("graduateSchool", guideRoster.getGraduateSchool()) + .set("idNumber", guideRoster.getIdNumber()) + .set("admittedMajor", guideRoster.getAdmittedMajor()); + // 生成文件名称 + String fileName = UUID.randomUUID().toString(true) + ".png"; + String filePath = FileUtil.getLocalUploadAddress() + fileName; + QrCodeUtil.generateQrCodeImage(obj.toString(), 400, 400, filePath); + // 上传文件到媒资 + qrCodeFile = new File(filePath); + String qrCodeAddress = FileUtil.uploadFileToMediaServer(uploadUrl, qrCodeFile); + baseMapper.updateById( + EduSmartWelcomeGuideRoster.builder() + .id(guideRoster.getId()) + .qrCodeUrl(qrCodeAddress) + .build()); + } catch (Exception e) { + log.error("生成二维码失败", e); + throw new FebsException("生成二维码失败"); + } finally { + if (Objects.nonNull(qrCodeFile)) { + cn.hutool.core.io.FileUtil.del(qrCodeFile); + } + } + } + + @Override + public void exportRosterPic(Long guideId, String key) { + exportGuidePicClient.exportLargeData(SelectGuidePicExportData.builder() + .key(key) + .guideId(guideId) + .build() + ); + } + + @Override + public Object getExportRosterPicInfo(String key) { + return exportGuidePicClient.selectExportInfo(key); + } + + @Override + public void downloadRosterPicChunk(DownloadFileChunk dto, HttpServletResponse response) { + exportGuidePicClient.downLoadChunk(dto, response); + } +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/EduSmartWelcomeGuideServiceImpl.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/EduSmartWelcomeGuideServiceImpl.java new file mode 100644 index 0000000..551f444 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/EduSmartWelcomeGuideServiceImpl.java @@ -0,0 +1,470 @@ +package com.yida.data.school.smart.service.impl; + +import cc.mrbird.febs.common.redis.service.RedisService; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.CharsetUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.core.util.ZipUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.CurrentUser; +import com.yida.data.common.core.entity.constant.CachePrefixConstant; +import com.yida.data.common.core.entity.school.EduDormitory; +import com.yida.data.common.core.entity.school.EduDormitoryRoom; +import com.yida.data.common.core.entity.smart.*; +import com.yida.data.common.core.entity.system.Dept; +import com.yida.data.common.core.entity.user.EduParent; +import com.yida.data.common.core.entity.user.EduStaff; +import com.yida.data.common.core.entity.user.EduStudent; +import com.yida.data.common.core.entity.user.EduUserDept; +import com.yida.data.common.core.enums.EnableStatusEnum; +import com.yida.data.common.core.enums.GuideStepTypeEnum; +import com.yida.data.common.core.enums.RegistrationStatusEnum; +import com.yida.data.common.core.exception.FebsException; +import com.yida.data.common.core.utils.ExcelUtil; +import com.yida.data.common.core.utils.FebsUtil; +import com.yida.data.school.dto.index.ListDormRoomDTO; +import com.yida.data.school.dto.smart.GuideSaveDTO; +import com.yida.data.school.dto.smart.GuideSelectPageDTO; +import com.yida.data.school.dto.smart.GuideStepSaveDTO; +import com.yida.data.school.dto.smart.UpdateQrCodeInfoDTO; +import com.yida.data.school.facility.service.EduDormitoryRoomService; +import com.yida.data.school.facility.service.EduDormitoryService; +import com.yida.data.school.smart.mapper.EduSmartWelcomeGuideMapper; +import com.yida.data.school.smart.service.*; +import com.yida.data.school.vo.smart.GuideInfoVO; +import com.yida.data.school.vo.smart.GuideSelectPageVO; +import com.yida.data.user.vo.ImportFaceVO; + +import java.io.File; +import java.io.IOException; +import java.util.*; + +import java.util.stream.Stream; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.Workbook; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.stream.Collectors; + +/** + * 智慧迎新指南表Service实现 + * + * @author ZYJ + * @date 2023-05-15 15:33:18 + */ +@Slf4j +@Service +@RequiredArgsConstructor +@Transactional(rollbackFor = Exception.class) +public class EduSmartWelcomeGuideServiceImpl extends ServiceImpl + implements EduSmartWelcomeGuideService { + + private final EduSmartWelcomeCampusService eduSmartWelcomeCampusService; + private final EduSmartWelcomeGuideStepService eduSmartWelcomeGuideStepService; + private final EduSmartWelcomeGuideRosterService eduSmartWelcomeGuideRosterService; + private final EduSmartWelcomeGuideStepStaffService eduSmartWelcomeGuideStepStaffService; + private final EduSmartWelcomeGuideRosterRelationStepService eduSmartWelcomeGuideRosterRelationStepService; + private final EduSmartWelcomeGuideStepClassService eduSmartWelcomeGuideStepClassService; + private final EduSmartWelcomeGuideStepDormService eduSmartWelcomeGuideStepDormService; + private final EduSmartWelcomeGuideStepClassFixService eduSmartWelcomeGuideStepClassFixService; + private final EduSmartWelcomeDepartmentService eduSmartWelcomeDepartmentService; + private final EduSmartWelcomeGuideStepDormFixService eduSmartWelcomeGuideStepDormFixService; + private final RedisService redisService; + private final EduDormitoryRoomService eduDormitoryRoomService; + @Value("${febs.uploadUrl}") + private String uploadUrl; + + @Override + public IPage listGuidePage(GuideSelectPageDTO dto) { + // 登陆用户信息 + CurrentUser currentUser = FebsUtil.getCurrentUser(); + dto.setDeptId(currentUser.getDeptId()); + + IPage page = baseMapper.listGuidePage(dto.toPage(), dto); + // 统计报名人数问题 + for (GuideSelectPageVO record : page.getRecords()) { + // 花名册总人数 + long totalNumber = eduSmartWelcomeGuideRosterService.count(Wrappers.lambdaQuery(new EduSmartWelcomeGuideRoster()) + .eq(EduSmartWelcomeGuideRoster::getGuideId, record.getId())); + record.setTotalNumber(totalNumber); + if (totalNumber > 0) { + // 查询报名成功人数 + long countedNumber = eduSmartWelcomeGuideRosterService + .count(Wrappers.lambdaQuery(new EduSmartWelcomeGuideRoster()) + .eq(EduSmartWelcomeGuideRoster::getGuideId, record.getId()) + .eq(EduSmartWelcomeGuideRoster::getRegistrationStatus, RegistrationStatusEnum.REGISTRATION_SUCCESS.getStatus()) + ); + record.setCompleteNumber(countedNumber); + } + // 校区信息 + if (Objects.nonNull(record.getCampusId())) { + EduSmartWelcomeCampus campus = eduSmartWelcomeCampusService.getById(record.getCampusId()); + Optional.ofNullable(campus).ifPresent(x -> record.setCampusName(x.getCampusName())); + } + } + return page; + } + + @Override + public GuideInfoVO getGuideInfo(Long guideId) { + EduSmartWelcomeGuide welcomeGuide = getById(guideId); + GuideInfoVO guideInfoVO = new GuideInfoVO(); + if (Objects.nonNull(welcomeGuide)) { + BeanUtils.copyProperties(welcomeGuide, guideInfoVO); + // 查询步骤信息 + List stepList = eduSmartWelcomeGuideStepService + .list(Wrappers.lambdaQuery(new EduSmartWelcomeGuideStep()) + .eq(EduSmartWelcomeGuideStep::getGuideId, welcomeGuide.getId())); + if (CollUtil.isNotEmpty(stepList)) { + for (EduSmartWelcomeGuideStep guideStep : stepList) { + if (ObjectUtil.equals(GuideStepTypeEnum.EXAMINE_TYPE.getType(), guideStep.getStepType()) + || ObjectUtil.equals(GuideStepTypeEnum.CLASS.getType(), guideStep.getStepType()) + || ObjectUtil.equals(GuideStepTypeEnum.DORM.getType(), guideStep.getStepType())) { + List staffIdList = eduSmartWelcomeGuideStepStaffService + .list(Wrappers.lambdaQuery(new EduSmartWelcomeGuideStepStaff()) + .eq(EduSmartWelcomeGuideStepStaff::getStepId, guideStep.getId())) + .stream().map(EduSmartWelcomeGuideStepStaff::getStaffId).collect(Collectors.toList()); + guideStep.setStaffIdList(staffIdList); + } + + if (ObjectUtil.equals(GuideStepTypeEnum.CLASS.getType(), guideStep.getStepType())) { + List classList = eduSmartWelcomeGuideStepClassService + .list(Wrappers.lambdaQuery(new EduSmartWelcomeGuideStepClass()) + .eq(EduSmartWelcomeGuideStepClass::getGuideId, guideId) + .eq(EduSmartWelcomeGuideStepClass::getStepId, guideStep.getId())); + + List classFixList = eduSmartWelcomeGuideStepClassFixService + .list(Wrappers.lambdaQuery(new EduSmartWelcomeGuideStepClassFix()) + .eq(EduSmartWelcomeGuideStepClassFix::getGuideId, guideId) + .eq(EduSmartWelcomeGuideStepClassFix::getStepId, guideStep.getId())); + guideStep.setClassList(classList); + guideStep.setClassFixList(classFixList); + } + if (ObjectUtil.equals(GuideStepTypeEnum.DORM.getType(), guideStep.getStepType())) { + List dormList = eduSmartWelcomeGuideStepDormService + .list(Wrappers.lambdaQuery(new EduSmartWelcomeGuideStepDorm()) + .eq(EduSmartWelcomeGuideStepDorm::getGuideId, guideId) + .eq(EduSmartWelcomeGuideStepDorm::getStepId, guideStep.getId())); + guideStep.setDormList(dormList); + List dormFixList = eduSmartWelcomeGuideStepDormFixService + .list(Wrappers.lambdaQuery(new EduSmartWelcomeGuideStepDormFix()) + .eq(EduSmartWelcomeGuideStepDormFix::getGuideId, guideId) + .eq(EduSmartWelcomeGuideStepDormFix::getStepId, guideStep.getId())); + guideStep.setDormFixList(dormFixList); + } + } + guideInfoVO.setStepList(stepList); + } + } + return guideInfoVO; + } + + @Override + public void saveGuide(GuideSaveDTO dto) { + EduSmartWelcomeGuide guide = new EduSmartWelcomeGuide(); + BeanUtils.copyProperties(dto, guide); + if (Objects.isNull(dto.getId())) { + // 新增 + guide.setDeptId(FebsUtil.getTopDeptId()); + } else { + // 删除附表数据 + eduSmartWelcomeGuideStepService.remove(Wrappers.lambdaQuery(new EduSmartWelcomeGuideStep()) + .eq(EduSmartWelcomeGuideStep::getGuideId, dto.getId())); + eduSmartWelcomeGuideStepStaffService.remove(Wrappers.lambdaQuery(new EduSmartWelcomeGuideStepStaff()) + .eq(EduSmartWelcomeGuideStepStaff::getGuideId, dto.getId())); + eduSmartWelcomeGuideStepClassService.remove(Wrappers.lambdaQuery(new EduSmartWelcomeGuideStepClass()) + .eq(EduSmartWelcomeGuideStepClass::getGuideId, dto.getId())); + eduSmartWelcomeGuideStepClassFixService.remove(Wrappers.lambdaQuery(new EduSmartWelcomeGuideStepClassFix()) + .eq(EduSmartWelcomeGuideStepClassFix::getGuideId, dto.getId())); + eduSmartWelcomeGuideStepDormService.remove(Wrappers.lambdaQuery(new EduSmartWelcomeGuideStepDorm()) + .eq(EduSmartWelcomeGuideStepDorm::getGuideId, dto.getId())); + eduSmartWelcomeGuideStepDormFixService.remove(Wrappers.lambdaQuery(new EduSmartWelcomeGuideStepDormFix()) + .eq(EduSmartWelcomeGuideStepDormFix::getGuideId, dto.getId())); + } + saveOrUpdate(guide); + // 步骤信息集合 + List stepList = new ArrayList<>(); + if (CollUtil.isNotEmpty(dto.getStepList())) { + // 保存步骤信息 + for (GuideStepSaveDTO stepSaveDTO : dto.getStepList()) { + EduSmartWelcomeGuideStep guideStep = new EduSmartWelcomeGuideStep(); + BeanUtils.copyProperties(stepSaveDTO, guideStep); + guideStep.setDeptId(FebsUtil.getTopDeptId()); + guideStep.setGuideId(guide.getId()); + eduSmartWelcomeGuideStepService.save(guideStep); + stepList.add(guideStep); + // 处理审核人员数据 + if (CollUtil.isNotEmpty(stepSaveDTO.getStaffIdList())) { + for (Long staffId : stepSaveDTO.getStaffIdList()) { + EduSmartWelcomeGuideStepStaff stepStaff = new EduSmartWelcomeGuideStepStaff(); + stepStaff.setDeptId(FebsUtil.getTopDeptId()); + stepStaff.setGuideId(guide.getId()); + stepStaff.setStepId(guideStep.getId()); + stepStaff.setStaffId(staffId); + eduSmartWelcomeGuideStepStaffService.save(stepStaff); + } + } + //处理预分班级数据 + if (ObjectUtil.equals(GuideStepTypeEnum.CLASS.getType(), guideStep.getStepType())) { + if (CollUtil.isNotEmpty(stepSaveDTO.getClassList())) { + List departmentList = eduSmartWelcomeDepartmentService.list(); + List classList = new ArrayList<>(); + for (EduSmartWelcomeGuideStepClass eduSmartWelcomeGuideStepClass : stepSaveDTO.getClassList()) { + eduSmartWelcomeGuideStepClass.setId(null); + eduSmartWelcomeGuideStepClass.setGuideId(guide.getId()); + eduSmartWelcomeGuideStepClass.setStepId(guideStep.getId()); + eduSmartWelcomeGuideStepClass.setDeptId(FebsUtil.getTopDeptId()); + eduSmartWelcomeGuideStepClass.setSchoolId(FebsUtil.getTopDeptId()); + int total = eduSmartWelcomeGuideStepClass.getMale() + eduSmartWelcomeGuideStepClass.getFemale(); +// int femaleNumber = +// eduSmartWelcomeGuideStepClass.getMale() * (eduSmartWelcomeGuideStepClass.getMale() / total); +// int maleNumber = +// eduSmartWelcomeGuideStepClass.getFemaleNumber() * (eduSmartWelcomeGuideStepClass.getFemaleNumber() +// / total); + eduSmartWelcomeGuideStepClass.setFemaleNumber(eduSmartWelcomeGuideStepClass.getFemale()); + eduSmartWelcomeGuideStepClass.setMaleNumber(eduSmartWelcomeGuideStepClass.getMale()); + classList.add(eduSmartWelcomeGuideStepClass); + } + + if (CollUtil.isNotEmpty(classList)) { + eduSmartWelcomeGuideStepClassService.saveBatch(classList); + } + } + + if (CollUtil.isNotEmpty(stepSaveDTO.getClassFixList())) { + List classFixList = new ArrayList<>(); + for (EduSmartWelcomeGuideStepClassFix eduSmartWelcomeGuideStepClassFix : stepSaveDTO.getClassFixList()) { + eduSmartWelcomeGuideStepClassFix.setGuideId(guide.getId()); + eduSmartWelcomeGuideStepClassFix.setStepId(guideStep.getId()); + eduSmartWelcomeGuideStepClassFix.setDeptId(FebsUtil.getTopDeptId()); + eduSmartWelcomeGuideStepClassFix.setSchoolId(FebsUtil.getTopDeptId()); + eduSmartWelcomeGuideStepClassFix.setId(null); + //查询人员ID + EduSmartWelcomeGuideRoster roster = eduSmartWelcomeGuideRosterService + .getOne(Wrappers.lambdaQuery(new EduSmartWelcomeGuideRoster()) + .eq(EduSmartWelcomeGuideRoster::getGuideId, guide.getId()) + .eq(EduSmartWelcomeGuideRoster::getIdNumber, eduSmartWelcomeGuideStepClassFix.getIdNumber()) + .eq(EduSmartWelcomeGuideRoster::getFullName, + eduSmartWelcomeGuideStepClassFix.getRosterName())); + if (ObjectUtil.isNotNull(roster)) { + eduSmartWelcomeGuideStepClassFix.setRosterId(roster.getId()); + classFixList.add(eduSmartWelcomeGuideStepClassFix); + } + } + if (CollUtil.isNotEmpty(classFixList)) { + eduSmartWelcomeGuideStepClassFixService.saveBatch(classFixList); + } + } + } + + //处理预分宿舍数据 + if (ObjectUtil.equals(GuideStepTypeEnum.DORM.getType(), guideStep.getStepType())) { + if (CollUtil.isNotEmpty(stepSaveDTO.getDormList())) { + List dormList = new ArrayList<>(); + for (EduSmartWelcomeGuideStepDorm eduSmartWelcomeGuideStepDorm : stepSaveDTO.getDormList()) { + eduSmartWelcomeGuideStepDorm.setGuideId(guide.getId()); + eduSmartWelcomeGuideStepDorm.setStepId(guideStep.getId()); + eduSmartWelcomeGuideStepDorm.setDeptId(FebsUtil.getTopDeptId()); + eduSmartWelcomeGuideStepDorm.setSchoolId(FebsUtil.getTopDeptId()); + eduSmartWelcomeGuideStepDorm.setId(null); + //增加宿舍床位总数 + EduDormitoryRoom dormitoryRoom = eduDormitoryRoomService + .getById(eduSmartWelcomeGuideStepDorm.getDormRoomId()); + eduSmartWelcomeGuideStepDorm.setNumber(dormitoryRoom.getBedNum()); + + dormList.add(eduSmartWelcomeGuideStepDorm); + } + if (CollUtil.isNotEmpty(dormList)) { + eduSmartWelcomeGuideStepDormService.saveBatch(dormList); + } + } + if (CollUtil.isNotEmpty(stepSaveDTO.getDormFixList())) { + List dormFixList = new ArrayList<>(); + for (EduSmartWelcomeGuideStepDormFix eduSmartWelcomeGuideStepDormFix : stepSaveDTO.getDormFixList()) { + eduSmartWelcomeGuideStepDormFix.setGuideId(guide.getId()); + eduSmartWelcomeGuideStepDormFix.setStepId(guideStep.getId()); + eduSmartWelcomeGuideStepDormFix.setDeptId(FebsUtil.getTopDeptId()); + eduSmartWelcomeGuideStepDormFix.setSchoolId(FebsUtil.getTopDeptId()); + eduSmartWelcomeGuideStepDormFix.setId(null); + dormFixList.add(eduSmartWelcomeGuideStepDormFix); + } + if (CollUtil.isNotEmpty(dormFixList)) { + eduSmartWelcomeGuideStepDormFixService.saveBatch(dormFixList); + } + } + } + + } + // 再次循环处理前提步骤信息 + for (GuideStepSaveDTO stepSaveDTO : dto.getStepList()) { + if (StringUtils.isNotBlank(stepSaveDTO.getPremiseStepUniqueId())) { + // 需要保存的基础信息 + List baseList = stepList.stream() + .filter(x -> x.getUniqueId().equals(stepSaveDTO.getUniqueId())).collect(Collectors.toList()); + if (CollUtil.isEmpty(baseList)) { + continue; + } + // 前提步骤 + List premiseList = stepList.stream() + .filter(x -> x.getUniqueId().equals(stepSaveDTO.getPremiseStepUniqueId())).collect(Collectors.toList()); + if (CollUtil.isEmpty(premiseList)) { + continue; + } + EduSmartWelcomeGuideStep base = baseList.get(0); + base.setPremiseStepId(premiseList.get(0).getId()); + eduSmartWelcomeGuideStepService.updateById(base); + } + } + } + } + + @Override + public void deleteGuide(Long guideId) { + // 删除附表数据 + eduSmartWelcomeGuideStepService.remove(Wrappers.lambdaQuery(new EduSmartWelcomeGuideStep()) + .eq(EduSmartWelcomeGuideStep::getGuideId, guideId)); + eduSmartWelcomeGuideStepStaffService.remove(Wrappers.lambdaQuery(new EduSmartWelcomeGuideStepStaff()) + .eq(EduSmartWelcomeGuideStepStaff::getGuideId, guideId)); + eduSmartWelcomeGuideStepClassService.remove(Wrappers.lambdaQuery(new EduSmartWelcomeGuideStepClass()) + .eq(EduSmartWelcomeGuideStepClass::getGuideId, guideId)); + eduSmartWelcomeGuideStepClassFixService.remove(Wrappers.lambdaQuery(new EduSmartWelcomeGuideStepClassFix()) + .eq(EduSmartWelcomeGuideStepClassFix::getGuideId, guideId)); + eduSmartWelcomeGuideStepDormService.remove(Wrappers.lambdaQuery(new EduSmartWelcomeGuideStepDorm()) + .eq(EduSmartWelcomeGuideStepDorm::getGuideId, guideId)); + // TODO 2023/5/15 需要处理人员数据 + + removeById(guideId); + } + + @Override + public void updateGuideEnableStatus(Long guideId, Integer enableStatus) { + EduSmartWelcomeGuide welcomeGuide = getById(guideId); + if (Objects.isNull(welcomeGuide) || Objects.isNull(welcomeGuide.getCampusId())) { + throw new FebsException("迎新指南信息错误!"); + } + // 判断当前已经启用的指南数量 + long count = count(Wrappers.lambdaQuery(new EduSmartWelcomeGuide()) + .eq(EduSmartWelcomeGuide::getDeptId, FebsUtil.getDeptId()) + .eq(EduSmartWelcomeGuide::getCampusId, welcomeGuide.getCampusId()) + .eq(EduSmartWelcomeGuide::getEnableStatus, EnableStatusEnum.ENABLE_STATUS.getStatus()) + ); + if (EnableStatusEnum.ENABLE_STATUS.getStatus().equals(enableStatus) && count >= 1) { + throw new FebsException("每个校区只能同时启用一个迎新指南"); + } + EduSmartWelcomeGuide guide = new EduSmartWelcomeGuide(); + guide.setId(guideId); + guide.setEnableStatus(enableStatus); + guide.setLastEnableDate(LocalDateTime.now()); + saveOrUpdate(guide); + } + + @Override + public void updateQrCodeInfo(UpdateQrCodeInfoDTO dto) { + EduSmartWelcomeGuide guide = new EduSmartWelcomeGuide(); + guide.setId(dto.getGuideId()); + guide.setQrCodeEnableStatus(dto.getQrCodeEnableStatus()); + guide.setQrCodeNoticeMessage(dto.getQrCodeNoticeMessage()); + saveOrUpdate(guide); + } + + @Override + public void uploadStudentAvatarBatch(String file, Long guideId, Long createUserId) { + int total; + int finish = 0; + int percent = 0; + // 上传信息 + ImportFaceVO faceVO = new ImportFaceVO(); + faceVO.setFinish(0); + faceVO.setFileName(cn.hutool.core.io.FileUtil.getName(file)); + faceVO.setPercent(0); + redisService.set(CachePrefixConstant.IMPORT_GUIDE_AVATAR_KEY + createUserId.toString(), faceVO); + try { + // 解压文件到本地 + File zipFile = new File(file); + ZipUtil.unzip(zipFile, CharsetUtil.charset(CharsetUtil.GBK)); + // 遍历图片 + String imgPath; + String zipPath = zipFile.getAbsolutePath(); + List files = cn.hutool.core.io.FileUtil.loopFiles(zipPath.split("\\.")[0]); + total = files.size(); + // 无法导入的图片 + List errorFiles = new ArrayList<>(); + for (File img : files) { + String userFlag = img.getName().split("\\.")[0]; + // 按身份证号/名字导入 + EduSmartWelcomeGuideRoster roster = eduSmartWelcomeGuideRosterService + .getOne(Wrappers.lambdaQuery(new EduSmartWelcomeGuideRoster()) + .eq(EduSmartWelcomeGuideRoster::getIdNumber, userFlag) + .eq(EduSmartWelcomeGuideRoster::getGuideId, guideId)); + if (ObjectUtil.isNull(roster)) { + List rosterList = eduSmartWelcomeGuideRosterService + .list(Wrappers.lambdaQuery(new EduSmartWelcomeGuideRoster()) + .eq(EduSmartWelcomeGuideRoster::getFullName, userFlag) + .eq(EduSmartWelcomeGuideRoster::getGuideId, guideId)); + if (CollUtil.isNotEmpty(rosterList)) { + if (rosterList.size() > 1) { + errorFiles.add(img); + continue; + } else { + roster = rosterList.get(0); + } + } + } + + if (ObjectUtil.isNull(roster)) { + errorFiles.add(img); + continue; + } + // 压缩图片至1000KB + File compressImg = null; + try { + compressImg = com.yida.data.common.core.utils.FileUtil.compressImg(img, 100L); + } catch (Exception e) { + log.error("压缩图片失败", e); + errorFiles.add(img); + continue; + } + + imgPath = com.yida.data.common.core.utils.FileUtil.uploadFileToMediaServer(uploadUrl, compressImg); + + eduSmartWelcomeGuideRosterService.update(Wrappers.lambdaUpdate(new EduSmartWelcomeGuideRoster()) + .eq(EduSmartWelcomeGuideRoster::getId, roster.getId()) + .set(EduSmartWelcomeGuideRoster::getAvatar, imgPath)); + + // TODO: 2023/10/18 后续优化花名册缓存信息 + // 更新缓存 +// redisService.hset(CachePrefixConstant.WELCOME_ROSTER, roster.getId().toString(), +// eduSmartWelcomeGuideRosterService.getById(roster.getId())); + + // 进度增加更新进度 + if (finish * 100 / total > percent) { + faceVO.setPercent(finish * 100 / total); + redisService.set(CachePrefixConstant.IMPORT_GUIDE_AVATAR_KEY + createUserId, faceVO); + } + finish++; + } + // 打包错误文件 + if (CollUtil.isNotEmpty(errorFiles)) { + String failPath = com.yida.data.common.core.utils.FileUtil.getRandomPath("zip"); + ZipUtil.zip(new File(failPath), false, errorFiles.toArray(new File[0])); + faceVO.setFailPath(failPath); + } + } catch (Exception e) { + log.error("上传出现异常", e); + } finally { + faceVO.setFinish(1); + redisService.set(CachePrefixConstant.IMPORT_GUIDE_AVATAR_KEY + createUserId, faceVO); + } + } +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/EduSmartWelcomeGuideStepClassFixServiceImpl.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/EduSmartWelcomeGuideStepClassFixServiceImpl.java new file mode 100644 index 0000000..c0d3461 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/EduSmartWelcomeGuideStepClassFixServiceImpl.java @@ -0,0 +1,27 @@ +package com.yida.data.school.smart.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideStepClass; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideStepClassFix; +import com.yida.data.school.smart.mapper.EduSmartWelcomeGuideStepClassFixMapper; +import com.yida.data.school.smart.mapper.EduSmartWelcomeGuideStepClassMapper; +import com.yida.data.school.smart.service.EduSmartWelcomeGuideStepClassFixService; +import com.yida.data.school.smart.service.EduSmartWelcomeGuideStepClassService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * 智慧迎新班级固定人员Service实现 + */ +@Slf4j +@Service +@RequiredArgsConstructor +@Transactional(rollbackFor = Exception.class) +public class EduSmartWelcomeGuideStepClassFixServiceImpl extends ServiceImpl + implements + EduSmartWelcomeGuideStepClassFixService { + + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/EduSmartWelcomeGuideStepClassServiceImpl.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/EduSmartWelcomeGuideStepClassServiceImpl.java new file mode 100644 index 0000000..1628cd5 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/EduSmartWelcomeGuideStepClassServiceImpl.java @@ -0,0 +1,476 @@ +package com.yida.data.school.smart.service.impl; + +import cc.mrbird.febs.common.redis.service.RedisService; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.EasyExcelFactory; +import com.alibaba.excel.ExcelReader; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.CurrentUser; +import com.yida.data.common.core.entity.constant.CachePrefixConstant; +import com.yida.data.common.core.entity.constant.FebsConstant; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeDepartment; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideClassRecord; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideRoster; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideStepClass; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideStepClassFix; +import com.yida.data.common.core.entity.user.EduUserDept; +import com.yida.data.common.core.exception.FebsException; +import com.yida.data.common.core.utils.FileUtil; +import com.yida.data.common.service.CommonService; +import com.yida.data.school.dto.smart.ClassFixImportDTO; +import com.yida.data.school.dto.smart.ClassImportDTO; +import com.yida.data.school.smart.excel.ExcelListener; +import com.yida.data.school.smart.mapper.EduSmartWelcomeGuideRosterMapper; +import com.yida.data.school.smart.mapper.EduSmartWelcomeGuideStepClassMapper; +import com.yida.data.school.smart.service.EduSmartWelcomeDepartmentService; +import com.yida.data.school.smart.service.EduSmartWelcomeGuideClassRecordService; +import com.yida.data.school.smart.service.EduSmartWelcomeGuideStepClassFixService; +import com.yida.data.school.smart.service.EduSmartWelcomeGuideStepClassService; +import com.yida.data.school.vo.smart.ClassFixImportVO; +import com.yida.data.school.vo.smart.ClassImportVO; +import com.yida.data.school.vo.smart.WelcomeImportProgress; +import com.yida.data.user.feign.RemoteUserDeptService; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.UUID; +import java.util.stream.Collectors; +import javax.servlet.http.HttpServletResponse; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.io.ClassPathResource; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StopWatch; +import org.springframework.web.multipart.MultipartFile; + +/** + * 智慧迎新班级预分表Service实现 + */ +@Slf4j +@Service +@RequiredArgsConstructor +@Transactional(rollbackFor = Exception.class) +public class EduSmartWelcomeGuideStepClassServiceImpl extends ServiceImpl + implements EduSmartWelcomeGuideStepClassService { + + private final RedisService redisService; + private final EduSmartWelcomeGuideRosterMapper eduSmartWelcomeGuideRosterMapper; + private final EduSmartWelcomeGuideClassRecordService eduSmartWelcomeGuideClassRecordService; + private final EduSmartWelcomeGuideStepClassFixService eduSmartWelcomeGuideStepClassFixService; + private final CommonService commonService; + private final RemoteUserDeptService remoteUserDeptService; + private final EduSmartWelcomeDepartmentService eduSmartWelcomeDepartmentService; + @Value("${febs.uploadUrl}") + private String uploadUrl; + + @Override + public void downloadClassTemplate(HttpServletResponse response) { + try { + String fileName = "班级预选导入模板.xlsx"; + // 获取导入文件模板 + ClassPathResource classPathResource = new ClassPathResource("template/" + fileName); + InputStream inputStream = classPathResource.getInputStream(); + com.yida.data.common.core.utils.FileUtil + .download(com.yida.data.common.core.utils.FileUtil.inputStreamToFile(inputStream), fileName, false, response); + } catch (Exception e) { + throw new FebsException("下载班级预选导入模板失败"); + } + } + + @Override + public void downloadClassFixTemplate(HttpServletResponse response) { + try { + String fileName = "固定班级学生导入模板.xlsx"; + // 获取导入文件模板 + ClassPathResource classPathResource = new ClassPathResource("template/" + fileName); + InputStream inputStream = classPathResource.getInputStream(); + com.yida.data.common.core.utils.FileUtil + .download(com.yida.data.common.core.utils.FileUtil.inputStreamToFile(inputStream), fileName, false, response); + } catch (Exception e) { + throw new FebsException("固定班级学生导入模板模板失败"); + } + } + + @Override + public void importClassData(MultipartFile file, String importKey, CurrentUser currentUser) { + // 错误信息文件excel + File errorFile = null; + try { + // 验证文件类型 + if (!FileUtil.checkMultipartFile(file, FebsConstant.EXCEL_FILE_TYPE)) { + return; + } + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); + // 调用导入方法 + ExcelListener listener = new ExcelListener(); + List listMap = new ArrayList<>(); + try { + ExcelReader excelReader = EasyExcelFactory.read(file.getInputStream(), ClassImportDTO.class, listener) + .headRowNumber(1).build(); + excelReader.readAll(); + listMap = listener.getDatas(); + excelReader.finish(); + + } catch (IOException e) { + throw new RuntimeException(e); + } + + Integer current = 0; + redisService.set(CachePrefixConstant.WELCOME_CLASS_IMPOST_PROGRESS + importKey, + WelcomeImportProgress.builder().importKey(importKey).total(listMap.size()).importStatus(0) + .current(0).build()); + + List classImportVOList = new ArrayList<>(); + List eduUserDeptList = remoteUserDeptService + .findListByParent(-currentUser.getDeptId()) + .getData(); + List departmentList = eduSmartWelcomeDepartmentService.list(); + + List errorList = new ArrayList<>(); + + for (ClassImportDTO classImportDTO : listMap) { + current++; + redisService.set(CachePrefixConstant.WELCOME_CLASS_IMPOST_PROGRESS + importKey, + WelcomeImportProgress.builder().importKey(importKey).total(listMap.size()).current(current).importStatus(0) + .build()); + + ClassImportVO vo = new ClassImportVO(); + BeanUtils.copyProperties(classImportDTO, vo); + //学区ID + List campusList = eduUserDeptList.stream() + .filter(dept -> dept.getDeptName().equals(vo.getCampusName())) + .collect(Collectors.toList()); + if (CollUtil.isEmpty(campusList)) { + errorList.add(classImportDTO); + continue; + } + Long campusId = campusList.get(0).getDeptId(); + //学段ID + List sectionList = eduUserDeptList.stream() + .filter(dept -> dept.getDeptName().equals(vo.getSectionName()) && + dept.getParentId().equals(campusId)) + .collect(Collectors.toList()); + if (CollUtil.isEmpty(sectionList)) { + errorList.add(classImportDTO); + continue; + } + Long sectionId = sectionList.get(0).getDeptId(); + //年级ID + List gradeList = eduUserDeptList.stream() + .filter(dept -> dept.getDeptName().equals(vo.getGradeName()) && + dept.getParentId().equals(sectionId)) + .collect(Collectors.toList()); + if (CollUtil.isEmpty(gradeList)) { + errorList.add(classImportDTO); + continue; + } + Long gradeId = gradeList.get(0).getDeptId(); + //班级ID + List classList = eduUserDeptList.stream() + .filter(dept -> dept.getDeptName().equals(vo.getClassName()) && + dept.getParentId().equals(gradeId)) + .collect(Collectors.toList()); + if (CollUtil.isEmpty(classList)) { + errorList.add(classImportDTO); + continue; + } + Long classId = classList.get(0).getDeptId(); + //系部ID + List departmentList1 = departmentList.stream() + .filter(d -> d.getName().equals(vo.getDepartmentName())) + .collect(Collectors.toList()); + if (CollUtil.isEmpty(departmentList1)) { + errorList.add(classImportDTO); + continue; + } + Long departmentId = departmentList1.get(0).getId(); + //专业ID + List majorList = departmentList.stream() + .filter(d -> d.getName().equals(vo.getMajorName())) + .collect(Collectors.toList()); + if (CollUtil.isEmpty(majorList)) { + errorList.add(classImportDTO); + continue; + } + Long majorId = majorList.get(0).getId(); + + vo.setCampusId(campusId); + vo.setSectionId(sectionId); + vo.setGradeId(gradeId); + vo.setClassId(classId); + vo.setDepartmentId(departmentId); + vo.setMajorId(majorId); + + classImportVOList.add(vo); + } + WelcomeImportProgress build = WelcomeImportProgress.builder().importKey(importKey) + .total(listMap.size()).current(listMap.size()) + .importStatus(1) + .dataList(classImportVOList).build(); + + if (CollUtil.isNotEmpty(errorList)) { + // 错误信息文件名称 + String fileName = FileUtil.getLocalUploadAddress() + UUID.randomUUID() + ".xlsx"; + EasyExcel.write(fileName, ClassImportDTO.class) + .sheet("错误信息") + .doWrite(errorList); + // 上传到媒资 + errorFile = new File(fileName); + String url = FileUtil.uploadFileToMediaServer(uploadUrl, errorFile); + build.setErrorPath(url); + build.setImportStatus(2); + } + + redisService.set(CachePrefixConstant.WELCOME_CLASS_IMPOST_PROGRESS + importKey, build); + stopWatch.stop(); + log.info("导入班级预分数据总共耗时: {}", stopWatch.getTotalTimeSeconds() + "秒"); + } catch (Exception e) { + log.error("导入指预选班级数据失败: {}", e.getMessage(), e); + redisService.set(CachePrefixConstant.WELCOME_CLASS_IMPOST_PROGRESS + importKey, + WelcomeImportProgress.builder().importKey(importKey) + .total(100).current(100) + .importStatus(2).build()); + throw new FebsException("导入失败!请重新操作"); + } finally { + if (Objects.nonNull(errorFile)) { + cn.hutool.core.io.FileUtil.del(errorFile); + } + } + } + + @Override + public ClassFixImportVO importClassFixData(MultipartFile file, CurrentUser currentUser, Long guideId) { + // 验证文件类型 + if (!FileUtil.checkMultipartFile(file, FebsConstant.EXCEL_FILE_TYPE)) { + return null; + } + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); + + ClassFixImportVO classFixImportVO = new ClassFixImportVO(); + List voList = new ArrayList<>(); + // 调用导入方法 + ExcelListener listener = new ExcelListener(); + try { + ExcelReader excelReader = EasyExcelFactory.read(file.getInputStream(), ClassFixImportDTO.class, listener) + .headRowNumber(1).build(); + excelReader.readAll(); + List listMap = listener.getDatas(); + List errorIdNumberList = new ArrayList<>(); + excelReader.finish(); + List eduUserDeptList = remoteUserDeptService + .findListByParent(-currentUser.getDeptId()) + .getData(); + List eduSmartWelcomeGuideRosters = eduSmartWelcomeGuideRosterMapper + .selectList(Wrappers.lambdaQuery(new EduSmartWelcomeGuideRoster()) + .eq(EduSmartWelcomeGuideRoster::getGuideId, guideId)); + + for (ClassFixImportDTO classFixImportDTO : listMap) { + ClassFixImportVO.FixImportVO vo = new ClassFixImportVO().new FixImportVO(); + BeanUtils.copyProperties(classFixImportDTO, vo); + + //学区ID + List campusList = eduUserDeptList.stream() + .filter(dept -> dept.getDeptName().equals(vo.getCampusName())) + .collect(Collectors.toList()); + if (CollUtil.isEmpty(campusList)) { + errorIdNumberList.add(classFixImportDTO.getIdNumber()); + continue; + } + Long campusId = campusList.get(0).getDeptId(); + //学段ID + List sectionList = eduUserDeptList.stream() + .filter(dept -> dept.getDeptName().equals(vo.getSectionName()) && + dept.getParentId().equals(campusId)) + .collect(Collectors.toList()); + if (CollUtil.isEmpty(sectionList)) { + errorIdNumberList.add(classFixImportDTO.getIdNumber()); + continue; + } + Long sectionId = sectionList.get(0).getDeptId(); + //年级ID + List gradeList = eduUserDeptList.stream() + .filter(dept -> dept.getDeptName().equals(vo.getGradeName()) && + dept.getParentId().equals(sectionId)) + .collect(Collectors.toList()); + if (CollUtil.isEmpty(gradeList)) { + errorIdNumberList.add(classFixImportDTO.getIdNumber()); + continue; + } + Long gradeId = gradeList.get(0).getDeptId(); + //班级ID + List classList = eduUserDeptList.stream() + .filter(dept -> dept.getDeptName().equals(vo.getClassName()) && + dept.getParentId().equals(gradeId)) + .collect(Collectors.toList()); + if (CollUtil.isEmpty(classList)) { + errorIdNumberList.add(classFixImportDTO.getIdNumber()); + continue; + } + Long classId = classList.get(0).getDeptId(); + + List rosters = eduSmartWelcomeGuideRosters.stream() + .filter(g -> g.getFullName().equals(classFixImportDTO.getRosterName())).collect(Collectors.toList()); + + if (CollUtil.isEmpty(rosters)) { + errorIdNumberList.add(classFixImportDTO.getIdNumber()); + continue; + } + Long rosterId = rosters.get(0).getId(); + + vo.setCampusId(campusId); + vo.setSectionId(sectionId); + vo.setGradeId(gradeId); + vo.setClassId(classId); + vo.setRosterId(rosterId); + voList.add(vo); + } + + if (CollUtil.isNotEmpty(errorIdNumberList)) { + classFixImportVO.setErrorIdNumberList(errorIdNumberList); + } + + if (CollUtil.isNotEmpty(voList)) { + classFixImportVO.setFixImportVOList(voList); + } + } catch (IOException e) { + throw new RuntimeException(e); + } + stopWatch.stop(); + log.info("导入固定班级学生数据总共耗时: {}", stopWatch.getTotalTimeSeconds() + "秒"); + return classFixImportVO; + } + + @Override + public void classBanding(Long guideId, Long stepId, Long rosterId) { + //比对专业查找出对应的班级 + Long schoolId = null; + Long campusId = null; + Long sectionId = null; + Long gradeId = null; + Long classId = null; + + EduSmartWelcomeGuideRoster roster = (EduSmartWelcomeGuideRoster) redisService + .hget(CachePrefixConstant.WELCOME_ROSTER, rosterId.toString()); + if (ObjectUtil.isNull(roster)) { + roster = eduSmartWelcomeGuideRosterMapper.selectById(rosterId); + } + + if (ObjectUtil.isNull(roster)) { + log.info("花名册无人员信息:【{}】", rosterId); + return; + } + //排除固定班级里面学生 + List fixRosterList = eduSmartWelcomeGuideStepClassFixService + .list(Wrappers.lambdaQuery(new EduSmartWelcomeGuideStepClassFix()) + .eq(EduSmartWelcomeGuideStepClassFix::getRosterId, rosterId)); + if (CollUtil.isNotEmpty(fixRosterList)) { + log.info("花名册人员【{}】已在固定班级【{}】", roster.getFullName(), fixRosterList.get(0).getClassId()); + schoolId = fixRosterList.get(0).getSchoolId(); + campusId = fixRosterList.get(0).getCampusId(); + sectionId = fixRosterList.get(0).getSectionId(); + gradeId = fixRosterList.get(0).getGradeId(); + classId = fixRosterList.get(0).getClassId(); + } else { + //查询预分班级信息 + List classList = new ArrayList<>(); + String str = (String) redisService.get(CachePrefixConstant.WELCOME_CLASS_DATA + guideId + stepId); + if (ObjectUtil.isNotNull(str)) { + classList = JSON.parseArray(str, EduSmartWelcomeGuideStepClass.class); + } else { + classList = this.list(Wrappers.lambdaQuery(new EduSmartWelcomeGuideStepClass()) + .eq(EduSmartWelcomeGuideStepClass::getGuideId, guideId) + .eq(EduSmartWelcomeGuideStepClass::getStepId, stepId)); + + if (CollUtil.isNotEmpty(classList)) { + redisService + .set(CachePrefixConstant.WELCOME_CLASS_DATA + guideId + stepId, JSONObject.toJSON(classList).toString()); + } + } + if (CollUtil.isEmpty(classList)) { + log.info("无预分班级信息:guideId=【{}】", guideId); + return; + } + //当前校区系部专业对应的班级 + EduSmartWelcomeGuideRoster finalRoster = roster; + + List departMajorClassList = classList.stream() + .filter(c -> c.getDepartmentId().equals(finalRoster.getAdmittedDepartmentId()) && c.getMajorId() + .equals(finalRoster.getAdmittedMajorId())) + .collect( + Collectors.toList()); + + for (EduSmartWelcomeGuideStepClass eduSmartWelcomeGuideStepClass : departMajorClassList) { + String key = ObjectUtil.equals(0, roster.getGender()) ? "male:" : "female:"; + if (redisService + .hHasKey(CachePrefixConstant.WELCOME_CLASS_STUDENT_NUMBER, key + eduSmartWelcomeGuideStepClass.getId())) { + Integer number = (Integer) redisService + .hget(CachePrefixConstant.WELCOME_CLASS_STUDENT_NUMBER, key + eduSmartWelcomeGuideStepClass.getId()); + Integer planNumber = ObjectUtil.equals(0, roster.getGender()) ? eduSmartWelcomeGuideStepClass.getMaleNumber() + : eduSmartWelcomeGuideStepClass.getFemaleNumber(); + if (number >= planNumber) { + continue; + } + } + //分配学生到此班级 + //人数+1 + redisService + .hincr(CachePrefixConstant.WELCOME_CLASS_STUDENT_NUMBER, key + eduSmartWelcomeGuideStepClass.getId(), 1D); + //填充数据库数据 + if (ObjectUtil.equals(0, roster.getGender())) { //男 + baseMapper.incrMale(eduSmartWelcomeGuideStepClass.getId()); + } else { + baseMapper.incrFemale(eduSmartWelcomeGuideStepClass.getId()); + } + + schoolId = eduSmartWelcomeGuideStepClass.getSchoolId(); + campusId = eduSmartWelcomeGuideStepClass.getCampusId(); + sectionId = eduSmartWelcomeGuideStepClass.getSectionId(); + gradeId = eduSmartWelcomeGuideStepClass.getGradeId(); + classId = eduSmartWelcomeGuideStepClass.getClassId(); + + log.info("学生【{}】分配到【{}】班级", roster.getFullName(), eduSmartWelcomeGuideStepClass.getClassId()); + break; + } + } + if (ObjectUtil.isNotNull(schoolId) && ObjectUtil.isNotNull(campusId) && ObjectUtil.isNotNull(sectionId) && ObjectUtil + .isNotNull(gradeId) && ObjectUtil.isNotNull(classId)) { + + //增加分班记录 + EduSmartWelcomeGuideClassRecord classRecord = new EduSmartWelcomeGuideClassRecord(); + classRecord.setSchoolId(schoolId); + classRecord.setCampusId(campusId); + classRecord.setSectionId(sectionId); + classRecord.setGradeId(gradeId); + classRecord.setClassId(classId); + classRecord.setRosterId(rosterId); + classRecord.setGuideId(guideId); + eduSmartWelcomeGuideClassRecordService.save(classRecord); + + //填充花名册数据 + roster.setCampusId(campusId); + roster.setCampusName(commonService.getUserDept(campusId).getDeptName()); + roster.setSectionId(sectionId); + roster.setSectionName(commonService.getUserDept(sectionId).getDeptName()); + roster.setGradeId(gradeId); + roster.setGradeName(commonService.getUserDept(gradeId).getDeptName()); + roster.setClassId(classId); + roster.setClassName(commonService.getUserDept(classId).getDeptName()); + eduSmartWelcomeGuideRosterMapper.updateById(roster); + } + } +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/EduSmartWelcomeGuideStepDormFixServiceImpl.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/EduSmartWelcomeGuideStepDormFixServiceImpl.java new file mode 100644 index 0000000..fe370ae --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/EduSmartWelcomeGuideStepDormFixServiceImpl.java @@ -0,0 +1,24 @@ +package com.yida.data.school.smart.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideStepDormFix; +import com.yida.data.school.smart.mapper.EduSmartWelcomeGuideStepDormFixMapper; +import com.yida.data.school.smart.service.EduSmartWelcomeGuideStepDormFixService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * 智慧迎新宿舍固定人员Service实现 + */ +@Slf4j +@Service +@RequiredArgsConstructor +@Transactional(rollbackFor = Exception.class) +public class EduSmartWelcomeGuideStepDormFixServiceImpl extends ServiceImpl + implements + EduSmartWelcomeGuideStepDormFixService { + + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/EduSmartWelcomeGuideStepDormServiceImpl.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/EduSmartWelcomeGuideStepDormServiceImpl.java new file mode 100644 index 0000000..ce030bd --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/EduSmartWelcomeGuideStepDormServiceImpl.java @@ -0,0 +1,623 @@ +package com.yida.data.school.smart.service.impl; + +import cc.mrbird.febs.common.redis.service.RedisService; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.EasyExcelFactory; +import com.alibaba.excel.ExcelReader; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.common.ResultMsgType; +import com.yida.data.common.core.entity.CurrentUser; +import com.yida.data.common.core.entity.constant.CachePrefixConstant; +import com.yida.data.common.core.entity.constant.FebsConstant; +import com.yida.data.common.core.entity.school.EduDormitory; +import com.yida.data.common.core.entity.school.EduDormitoryRoom; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeDepartment; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideDormRecord; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideRoster; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideStep; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideStepDorm; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideStepDormFix; +import com.yida.data.common.core.entity.user.EduUserDept; +import com.yida.data.common.core.exception.FebsException; +import com.yida.data.common.core.utils.FebsUtil; +import com.yida.data.common.core.utils.FileUtil; +import com.yida.data.common.core.utils.QrCodeUtil; +import com.yida.data.school.dto.index.ListDormRoomDTO; +import com.yida.data.school.dto.smart.ClassFixImportDTO; +import com.yida.data.school.dto.smart.ClassImportDTO; +import com.yida.data.school.dto.smart.CustomDormImportDTO; +import com.yida.data.school.dto.smart.DormImportDTO; +import com.yida.data.school.dto.smart.DormImportFixDTO; +import com.yida.data.school.dto.smart.GuideRosterErrorExportDTO; +import com.yida.data.school.dto.smart.GuideRosterImportDTO; +import com.yida.data.school.facility.service.EduDormitoryRoomService; +import com.yida.data.school.facility.service.EduDormitoryService; +import com.yida.data.school.smart.excel.CustomDormExcelListener; +import com.yida.data.school.smart.excel.ExcelListener; +import com.yida.data.school.smart.excel.GuideRosterExcelListener; +import com.yida.data.school.smart.mapper.EduSmartWelcomeGuideRosterMapper; +import com.yida.data.school.smart.mapper.EduSmartWelcomeGuideStepDormMapper; +import com.yida.data.school.smart.service.EduSmartWelcomeDepartmentService; +import com.yida.data.school.smart.service.EduSmartWelcomeGuideDormRecordService; +import com.yida.data.school.smart.service.EduSmartWelcomeGuideStepDormFixService; +import com.yida.data.school.smart.service.EduSmartWelcomeGuideStepDormService; +import com.yida.data.school.vo.smart.ClassFixImportVO; +import com.yida.data.school.vo.smart.ClassImportVO; +import com.yida.data.school.vo.smart.DormImportFixVO; +import com.yida.data.school.vo.smart.DormImportVO; +import com.yida.data.school.vo.smart.ImportRosterDataVO; +import com.yida.data.school.vo.smart.WelcomeImportProgress; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.UUID; +import java.util.stream.Collectors; +import javax.servlet.http.HttpServletResponse; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.ehcache.impl.internal.concurrent.ConcurrentHashMap; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.io.ClassPathResource; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StopWatch; +import org.springframework.web.multipart.MultipartFile; + +/** + * 智慧迎新宿舍预分表Service实现 + */ +@Slf4j +@Service +@RequiredArgsConstructor +@Transactional(rollbackFor = Exception.class) +public class EduSmartWelcomeGuideStepDormServiceImpl extends ServiceImpl + implements EduSmartWelcomeGuideStepDormService { + + private final RedisService redisService; + private final EduSmartWelcomeGuideRosterMapper eduSmartWelcomeGuideRosterMapper; + private final EduSmartWelcomeGuideDormRecordService eduSmartWelcomeGuideDormRecordService; + private final EduDormitoryService eduDormitoryService; + private final EduDormitoryRoomService eduDormitoryRoomService; + private final EduSmartWelcomeDepartmentService eduSmartWelcomeDepartmentService; + private final EduSmartWelcomeGuideStepDormFixService eduSmartWelcomeGuideStepDormFixService; + @Value("${febs.uploadUrl}") + private String uploadUrl; + + @Override + public void downloadDormTemplate(HttpServletResponse response) { + try { + String fileName = "宿舍预选导入模板.xlsx"; + // 获取导入文件模板 + ClassPathResource classPathResource = new ClassPathResource("template/" + fileName); + InputStream inputStream = classPathResource.getInputStream(); + com.yida.data.common.core.utils.FileUtil + .download(com.yida.data.common.core.utils.FileUtil.inputStreamToFile(inputStream), fileName, false, response); + } catch (Exception e) { + throw new FebsException("下载宿舍预选导入模板失败"); + } + } + + @Override + public void downloadDormFixTemplate(HttpServletResponse response) { + try { + String fileName = "固定宿舍学生导入模板.xlsx"; + // 获取导入文件模板 + ClassPathResource classPathResource = new ClassPathResource("template/" + fileName); + InputStream inputStream = classPathResource.getInputStream(); + com.yida.data.common.core.utils.FileUtil + .download(com.yida.data.common.core.utils.FileUtil.inputStreamToFile(inputStream), fileName, false, response); + } catch (Exception e) { + throw new FebsException("下载固定宿舍学生导入模板失败"); + } + } + + @Override + public void importDormData(MultipartFile file, String importKey, CurrentUser currentUser) { + // 错误信息文件excel + File errorFile = null; + try { + // 验证文件类型 + if (!FileUtil.checkMultipartFile(file, FebsConstant.EXCEL_FILE_TYPE)) { + return; + } + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); + // 调用导入方法 + ExcelListener listener = new ExcelListener(); + List listMap = new ArrayList<>(); + try { + ExcelReader excelReader = EasyExcelFactory.read(file.getInputStream(), DormImportDTO.class, listener) + .headRowNumber(1).build(); + excelReader.readAll(); + listMap = listener.getDatas(); + excelReader.finish(); + } catch (IOException e) { + throw new RuntimeException(e); + } + + Integer current = 0; + redisService.set(CachePrefixConstant.WELCOME_DORM_IMPOST_PROGRESS + importKey, + WelcomeImportProgress.builder().importKey(importKey).total(listMap.size()).current(0) + .importStatus(0).build()); + + List dormImportVOList = new ArrayList<>(); + + List departmentList = eduSmartWelcomeDepartmentService.list(); + List dormitoryList = eduDormitoryService.list(Wrappers.lambdaQuery(new EduDormitory()) + .eq(EduDormitory::getSchoolId, currentUser.getDeptId())); + ListDormRoomDTO listDormRoomDTO = new ListDormRoomDTO(); + listDormRoomDTO.setSchoolId(currentUser.getDeptId()); + List eduDormitoryRooms = eduDormitoryRoomService.listDormRoom(listDormRoomDTO); + + List errorList = new ArrayList<>(); + + for (DormImportDTO dormImportDTO : listMap) { + current++; + redisService.set(CachePrefixConstant.WELCOME_DORM_IMPOST_PROGRESS + importKey, + WelcomeImportProgress.builder().importKey(importKey).total(listMap.size()).current(current).importStatus(0) + .build()); + + DormImportVO vo = new DormImportVO(); + BeanUtils.copyProperties(dormImportDTO, vo); + + //宿舍楼 + List dormitories = dormitoryList.stream().filter(d -> d.getName().equals(vo.getDormName())) + .collect(Collectors.toList()); + + if (CollUtil.isEmpty(dormitories)) { + errorList.add(dormImportDTO); + continue; + } + + Long dormId = dormitories.get(0).getId(); + //寝室号 + List dormitoryRoomList = eduDormitoryRooms.stream() + .filter(d -> d.getDormName().equals(vo.getDormName()) && d.getName().equals(vo.getDormRoomName())) + .collect(Collectors.toList()); + if (CollUtil.isEmpty(dormitoryRoomList)) { + errorList.add(dormImportDTO); + continue; + } + Long dormRoomId = dormitoryRoomList.get(0).getId(); + + //系部ID + List departmentList1 = departmentList.stream() + .filter(d -> d.getName().equals(vo.getDepartmentName())) + .collect(Collectors.toList()); + if (CollUtil.isEmpty(departmentList1)) { + errorList.add(dormImportDTO); + continue; + } + Long departmentId = departmentList1.get(0).getId(); + //专业ID + List majorList = departmentList.stream() + .filter(d -> d.getName().equals(vo.getMajorName())) + .collect(Collectors.toList()); + if (CollUtil.isEmpty(majorList)) { + errorList.add(dormImportDTO); + continue; + } + Long majorId = majorList.get(0).getId(); + + vo.setDepartmentId(departmentId); + vo.setMajorId(majorId); + vo.setDormId(dormId); + vo.setDormRoomId(dormRoomId); + vo.setGender("男".equals(dormImportDTO.getGender()) ? 0 : 1); + dormImportVOList.add(vo); + } + WelcomeImportProgress build = WelcomeImportProgress.builder().importKey(importKey) + .total(listMap.size()).current(listMap.size()) + .importStatus(1) + .dataList(dormImportVOList).build(); + + if (CollUtil.isNotEmpty(errorList)) { + // 错误信息文件名称 + String fileName = FileUtil.getLocalUploadAddress() + UUID.randomUUID() + ".xlsx"; + EasyExcel.write(fileName, DormImportDTO.class) + .sheet("错误信息") + .doWrite(errorList); + // 上传到媒资 + errorFile = new File(fileName); + String url = FileUtil.uploadFileToMediaServer(uploadUrl, errorFile); + build.setErrorPath(url); + build.setImportStatus(2); + } + redisService.set(CachePrefixConstant.WELCOME_DORM_IMPOST_PROGRESS + importKey, build); + stopWatch.stop(); + log.info("导入宿舍预分数据总共耗时: {}", stopWatch.getTotalTimeSeconds() + "秒"); + } catch (Exception e) { + log.error("导入宿舍班级数据失败: {}", e.getMessage(), e); + redisService.set(CachePrefixConstant.WELCOME_DORM_IMPOST_PROGRESS + importKey, + WelcomeImportProgress.builder().importKey(importKey) + .total(100).current(100) + .importStatus(2).build()); + throw new FebsException("导入失败!请重新操作"); + } finally { + if (Objects.nonNull(errorFile)) { + cn.hutool.core.io.FileUtil.del(errorFile); + } + } + } + + @Override + public void importDormDataByCustom(String fileUrl, CurrentUser currentUser) { + // 上传的excel文件 + File file = null; + // 错误信息文件excel + File errorFile = null; + try { + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); + // 调用导入方法 + file = new File(fileUrl); + EasyExcel.read(file, CustomDormImportDTO.class, + new CustomDormExcelListener(this, currentUser)) + .sheet().headRowNumber(1).doRead(); + stopWatch.stop(); + log.info("导入宿舍预选数据总共耗时: {}", stopWatch.getTotalTimeSeconds() + "秒"); + } catch (Exception e) { + log.error("导入宿舍预选数据总共耗时: {}", e.getMessage(), e); + throw new FebsException("导入失败!请重新操作"); + } finally { + if (Objects.nonNull(file)) { + cn.hutool.core.io.FileUtil.del(file); + } + if (Objects.nonNull(errorFile)) { + cn.hutool.core.io.FileUtil.del(errorFile); + } + } + } + + @Override + public DormImportFixVO importDormFixData(MultipartFile file, CurrentUser currentUser, Long guideId) { + // 验证文件类型 + if (!FileUtil.checkMultipartFile(file, FebsConstant.EXCEL_FILE_TYPE)) { + return null; + } + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); + + DormImportFixVO dormImportFixVO = new DormImportFixVO(); + List voList = new ArrayList<>(); + // 调用导入方法 + ExcelListener listener = new ExcelListener(); + try { + ExcelReader excelReader = EasyExcelFactory.read(file.getInputStream(), DormImportFixDTO.class, listener) + .headRowNumber(1).build(); + excelReader.readAll(); + List listMap = listener.getDatas(); + List errorIdNumberList = new ArrayList<>(); + excelReader.finish(); + + List eduSmartWelcomeGuideRosters = eduSmartWelcomeGuideRosterMapper + .selectList(Wrappers.lambdaQuery(new EduSmartWelcomeGuideRoster()) + .eq(EduSmartWelcomeGuideRoster::getGuideId, guideId)); + + List dormitoryList = eduDormitoryService.list(Wrappers.lambdaQuery(new EduDormitory()) + .eq(EduDormitory::getSchoolId, currentUser.getDeptId())); + ListDormRoomDTO listDormRoomDTO = new ListDormRoomDTO(); + listDormRoomDTO.setSchoolId(currentUser.getDeptId()); + List eduDormitoryRooms = eduDormitoryRoomService.listDormRoom(listDormRoomDTO); + + for (DormImportFixDTO dormImportFixDTO : listMap) { + DormImportFixVO.FixImportVO vo = new DormImportFixVO().new FixImportVO(); + BeanUtils.copyProperties(dormImportFixDTO, vo); + + //宿舍楼 + List dormitories = dormitoryList.stream().filter(d -> d.getName().equals(vo.getDormName())) + .collect(Collectors.toList()); + + if (CollUtil.isEmpty(dormitories)) { + errorIdNumberList.add(dormImportFixDTO.getIdNumber()); + continue; + } + + Long dormId = dormitories.get(0).getId(); + //寝室号 + List dormitoryRoomList = eduDormitoryRooms.stream() + .filter(d -> d.getDormName().equals(vo.getDormName()) && d.getName().equals(vo.getDormRoomName())) + .collect(Collectors.toList()); + if (CollUtil.isEmpty(dormitoryRoomList)) { + errorIdNumberList.add(dormImportFixDTO.getIdNumber()); + continue; + } + Long dormRoomId = dormitoryRoomList.get(0).getId(); + + List rosters = eduSmartWelcomeGuideRosters.stream() + .filter(g -> g.getFullName().equals(dormImportFixDTO.getRosterName())).collect(Collectors.toList()); + + if (CollUtil.isEmpty(rosters)) { + errorIdNumberList.add(dormImportFixDTO.getIdNumber()); + continue; + } + Long rosterId = rosters.get(0).getId(); + + vo.setDormId(dormId); + vo.setDormRoomId(dormRoomId); + vo.setRosterId(rosterId); + voList.add(vo); + } + + if (CollUtil.isNotEmpty(errorIdNumberList)) { + dormImportFixVO.setErrorIdNumberList(errorIdNumberList); + } + + if (CollUtil.isNotEmpty(voList)) { + dormImportFixVO.setFixImportVOList(voList); + } + } catch (IOException e) { + throw new RuntimeException(e); + } + stopWatch.stop(); + log.info("导入固定班级学生数据总共耗时: {}", stopWatch.getTotalTimeSeconds() + "秒"); + return dormImportFixVO; + } + + @Override + public void dormBanding(Long guideId, Long stepId, Long rosterId) { + EduSmartWelcomeGuideRoster roster = (EduSmartWelcomeGuideRoster) redisService + .hget(CachePrefixConstant.WELCOME_ROSTER, rosterId.toString()); + if (ObjectUtil.isNull(roster)) { + roster = eduSmartWelcomeGuideRosterMapper.selectById(rosterId); + } + if (ObjectUtil.isNull(roster)) { + log.info("花名册无人员信息:【{}】", rosterId); + return; + } + Long dormId = null; + Long dormRoomId = null; + Long schoolId = null; + EduSmartWelcomeGuideStepDormFix dormFix = eduSmartWelcomeGuideStepDormFixService + .getOne(Wrappers.lambdaQuery(new EduSmartWelcomeGuideStepDormFix()) + .eq(EduSmartWelcomeGuideStepDormFix::getRosterId, rosterId)); + if (ObjectUtil.isNotNull(dormFix)) { + dormId = dormFix.getDormId(); + dormRoomId = dormFix.getDormRoomId(); + schoolId = dormFix.getSchoolId(); + log.info("花名册人员【{}】已在固定宿舍【{}{}】", roster.getFullName(), dormId, dormRoomId); + } else { + //比对专业查找出对应的班级 + //查询预分宿舍信息 + List dormList = new ArrayList<>(); + String str = (String) redisService.get(CachePrefixConstant.WELCOME_DORM_DATA + guideId + stepId); + + if (ObjectUtil.isNotNull(str)) { + dormList = JSON.parseArray(str, EduSmartWelcomeGuideStepDorm.class); + } else { + dormList = this.list(Wrappers.lambdaQuery(new EduSmartWelcomeGuideStepDorm()) + .eq(EduSmartWelcomeGuideStepDorm::getGuideId, guideId) + .eq(EduSmartWelcomeGuideStepDorm::getStepId, stepId)); + + if (CollUtil.isNotEmpty(dormList)) { + redisService + .set(CachePrefixConstant.WELCOME_DORM_DATA + guideId + stepId, JSONObject.toJSON(dormList).toString()); + } + } + if (CollUtil.isEmpty(dormList)) { + log.info("无预分宿舍信息:guideId=【{}】", guideId); + return; + } + //当前校区系部专业性别对应的宿舍 + EduSmartWelcomeGuideRoster finalRoster = roster; + List departMajorGenderDormList = dormList.stream() + .filter(c -> c.getDepartmentId().equals(finalRoster.getAdmittedDepartmentId()) && c.getMajorId() + .equals(finalRoster.getAdmittedMajorId()) && c.getGender().equals(finalRoster.getGender())) + .collect( + Collectors.toList()); + + for (EduSmartWelcomeGuideStepDorm eduSmartWelcomeGuideStepDorm : departMajorGenderDormList) { + if (guideId == 5) { + //是否指定宿舍人数 + if (redisService + .hHasKey(CachePrefixConstant.WELCOME_DROM_STUDENT_NUMBER_BUDING, + eduSmartWelcomeGuideStepDorm.getDormRoomId().toString())) { + //当前已分配人数 + Integer alreadyNumber = (Integer) redisService + .hget(CachePrefixConstant.WELCOME_DROM_STUDENT_NUMBER_BUDING, + eduSmartWelcomeGuideStepDorm.getDormRoomId().toString()); + + //宿舍可容纳人数 + Integer planNumber = eduSmartWelcomeGuideStepDorm.getNumber(); + if (alreadyNumber >= planNumber) { + continue; + } + if (ObjectUtil.isNotNull(eduSmartWelcomeGuideStepDorm.getRealNumber())) { + //当前宿舍专业已分配人数 + if (redisService.hHasKey(CachePrefixConstant.WELCOME_DROM_STUDENT_NUMBER_BUDING, + eduSmartWelcomeGuideStepDorm.getDormRoomId() + "-" + eduSmartWelcomeGuideStepDorm.getId())) { + Integer alreadyMajorNumber = (Integer) redisService + .hget(CachePrefixConstant.WELCOME_DROM_STUDENT_NUMBER_BUDING, + eduSmartWelcomeGuideStepDorm.getDormRoomId() + "-" + eduSmartWelcomeGuideStepDorm + .getId()); + Integer realNumber = eduSmartWelcomeGuideStepDorm.getRealNumber(); + if (alreadyMajorNumber >= realNumber) { + continue; + } + } + } + } + //分配学生到此宿舍 + //人数+1 + redisService + .hincr(CachePrefixConstant.WELCOME_DROM_STUDENT_NUMBER_BUDING, + eduSmartWelcomeGuideStepDorm.getDormRoomId().toString(), + 1D); + if (ObjectUtil.isNotNull(eduSmartWelcomeGuideStepDorm.getRealNumber())) { + redisService + .hincr(CachePrefixConstant.WELCOME_DROM_STUDENT_NUMBER_BUDING, + eduSmartWelcomeGuideStepDorm.getDormRoomId() + "-" + eduSmartWelcomeGuideStepDorm.getId(), + 1D); + } + dormId = eduSmartWelcomeGuideStepDorm.getDormId(); + dormRoomId = eduSmartWelcomeGuideStepDorm.getDormRoomId(); + schoolId = eduSmartWelcomeGuideStepDorm.getSchoolId(); + log.info("学生【{}】分配到【{}】宿舍寝室【{}】", roster.getFullName(), dormId, dormRoomId); + break; + } else { + //是否指定宿舍人数 + if (redisService + .hHasKey(CachePrefixConstant.WELCOME_DROM_STUDENT_NUMBER, + eduSmartWelcomeGuideStepDorm.getDormRoomId().toString())) { + //当前已分配人数 + Integer alreadyNumber = (Integer) redisService + .hget(CachePrefixConstant.WELCOME_DROM_STUDENT_NUMBER, + eduSmartWelcomeGuideStepDorm.getDormRoomId().toString()); + + //宿舍可容纳人数 + Integer planNumber = eduSmartWelcomeGuideStepDorm.getNumber(); + if (alreadyNumber >= planNumber) { + continue; + } + if (ObjectUtil.isNotNull(eduSmartWelcomeGuideStepDorm.getRealNumber())) { + //当前宿舍专业已分配人数 + if (redisService.hHasKey(CachePrefixConstant.WELCOME_DROM_STUDENT_NUMBER, + eduSmartWelcomeGuideStepDorm.getDormRoomId() + "-" + eduSmartWelcomeGuideStepDorm.getId())) { + Integer alreadyMajorNumber = (Integer) redisService + .hget(CachePrefixConstant.WELCOME_DROM_STUDENT_NUMBER, + eduSmartWelcomeGuideStepDorm.getDormRoomId() + "-" + eduSmartWelcomeGuideStepDorm + .getId()); + Integer realNumber = eduSmartWelcomeGuideStepDorm.getRealNumber(); + if (alreadyMajorNumber >= realNumber) { + continue; + } + } + } + } + //分配学生到此宿舍 + //人数+1 + redisService + .hincr(CachePrefixConstant.WELCOME_DROM_STUDENT_NUMBER, + eduSmartWelcomeGuideStepDorm.getDormRoomId().toString(), + 1D); + if (ObjectUtil.isNotNull(eduSmartWelcomeGuideStepDorm.getRealNumber())) { + redisService + .hincr(CachePrefixConstant.WELCOME_DROM_STUDENT_NUMBER, + eduSmartWelcomeGuideStepDorm.getDormRoomId() + "-" + eduSmartWelcomeGuideStepDorm.getId(), + 1D); + } + dormId = eduSmartWelcomeGuideStepDorm.getDormId(); + dormRoomId = eduSmartWelcomeGuideStepDorm.getDormRoomId(); + schoolId = eduSmartWelcomeGuideStepDorm.getSchoolId(); + log.info("学生【{}】分配到【{}】宿舍寝室【{}】", roster.getFullName(), dormId, dormRoomId); + break; + } + } + } + if (ObjectUtil.isNotNull(dormId) && ObjectUtil.isNotNull(dormRoomId) && ObjectUtil.isNotNull(schoolId)) { + //增加分宿舍记录 + EduSmartWelcomeGuideDormRecord dormRecord = new EduSmartWelcomeGuideDormRecord(); + dormRecord.setSchoolId(schoolId); + dormRecord.setRosterId(rosterId); + dormRecord.setGuideId(guideId); + dormRecord.setDormId(dormId); + dormRecord.setDormRoomId(dormRoomId); + eduSmartWelcomeGuideDormRecordService.save(dormRecord); + //填充花名册数据 + EduDormitoryRoom dormRoom = eduDormitoryRoomService.getDormRoom(dormRoomId); + if (ObjectUtil.isNotNull(dormRoom)) { + roster.setDormitoryId(dormId); + roster.setDormitory(dormRoom.getDormName()); + roster.setDormitoryRoomId(dormRoomId); + roster.setDormitoryRoom(dormRoom.getName()); + eduSmartWelcomeGuideRosterMapper.updateById(roster); + } + } else { + log.info("学生【{}无法分配宿舍", roster.getFullName()); + } + + } + + @Override + public void saveCusTomDormData(ConcurrentHashMap concurrentHashMap, + CurrentUser currentUser) { + int temp = 0; + if (!CollectionUtils.isEmpty(concurrentHashMap)) { + List dormitoryList = eduDormitoryService.list(Wrappers.lambdaQuery(new EduDormitory()) + .eq(EduDormitory::getSchoolId, currentUser.getDeptId())); + ListDormRoomDTO listDormRoomDTO = new ListDormRoomDTO(); + listDormRoomDTO.setSchoolId(currentUser.getDeptId()); + List eduDormitoryRooms = eduDormitoryRoomService.listDormRoom(listDormRoomDTO); + List departmentList = eduSmartWelcomeDepartmentService.list(); + // 保存前判断是否已存在 + List dormImportVOList = new ArrayList(); + for (Map.Entry entry : concurrentHashMap.entrySet()) { + temp++; + EduSmartWelcomeGuideStepDorm importVo = new EduSmartWelcomeGuideStepDorm(); + try { + CustomDormImportDTO value = entry.getValue(); + BeanUtils.copyProperties(value, importVo); + //宿舍楼 + List dormitories = dormitoryList.stream() + .filter(d -> d.getName().equals(importVo.getDormName())) + .collect(Collectors.toList()); + if (CollUtil.isEmpty(dormitories)) { + log.info("宿舍无法查找:【{}】", importVo.getDormName()); + continue; + } + + Long dormId = dormitories.get(0).getId(); + //寝室号 + List dormitoryRoomList = eduDormitoryRooms.stream() + .filter(d -> d.getDormName().equals(importVo.getDormName()) && d.getName() + .equals(importVo.getDormRoomName())) + .collect(Collectors.toList()); + if (CollUtil.isEmpty(dormitoryRoomList)) { + log.info("寝室号无法查找:【{}】", importVo.getDormRoomName()); + continue; + } + Long dormRoomId = dormitoryRoomList.get(0).getId(); + //系部ID + List departmentList1 = departmentList.stream() + .filter(d -> d.getName().equals(importVo.getDepartmentName())) + .collect(Collectors.toList()); + if (CollUtil.isEmpty(departmentList1)) { + log.info("系部无法查找:【{}】", importVo.getDepartmentName()); + continue; + } + Long departmentId = departmentList1.get(0).getId(); + //专业ID + List majorList = departmentList.stream() + .filter(d -> d.getName().equals(importVo.getMajorName())) + .collect(Collectors.toList()); + if (CollUtil.isEmpty(majorList)) { + log.info("专业无法查找:【{}】", importVo.getMajorName()); + continue; + } + Long majorId = majorList.get(0).getId(); + + importVo.setDepartmentId(departmentId); + importVo.setMajorId(majorId); + importVo.setDormId(dormId); + importVo.setDormRoomId(dormRoomId); + importVo.setGender("男".equals(value.getGender()) ? 0 : 1); + + dormImportVOList.add(importVo); + } catch (Exception e) { + log.error("导入自定义宿舍失败"); + } finally { + } + } + if (CollUtil.isNotEmpty(dormImportVOList)) { + log.info("保存数据", dormImportVOList); + saveBatch(dormImportVOList); + } + } + } +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/EduSmartWelcomeGuideStepServiceImpl.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/EduSmartWelcomeGuideStepServiceImpl.java new file mode 100644 index 0000000..ed80b8b --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/EduSmartWelcomeGuideStepServiceImpl.java @@ -0,0 +1,294 @@ +package com.yida.data.school.smart.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.constant.StringConstant; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideRoster; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideRosterRelationStep; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideStep; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideStepStaff; +import com.yida.data.common.core.entity.user.EduStaff; +import com.yida.data.common.core.enums.AuditStatusEnum; +import com.yida.data.common.core.enums.GuideStepTypeEnum; +import com.yida.data.common.core.exception.FebsException; +import com.yida.data.common.core.utils.FebsUtil; +import com.yida.data.school.dto.smart.AddUploadFileStepDTO; +import com.yida.data.school.smart.mapper.EduSmartWelcomeGuideRosterMapper; +import com.yida.data.school.smart.mapper.EduSmartWelcomeGuideStepMapper; +import com.yida.data.school.smart.service.EduSmartWelcomeGuideRosterRelationService; +import com.yida.data.school.smart.service.EduSmartWelcomeGuideRosterRelationStepService; +import com.yida.data.school.smart.service.EduSmartWelcomeGuideStepService; +import com.yida.data.school.smart.service.EduSmartWelcomeGuideStepStaffService; +import com.yida.data.school.vo.smart.GuideStepColVO; +import com.yida.data.user.feign.RemoteStaffService; +import java.util.ArrayList; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + + +/** + * 智慧迎新指南步骤表Service实现 + * + * @author ZYJ + * @date 2023-05-15 15:33:18 + */ +@Slf4j +@Service +@RequiredArgsConstructor +@Transactional(rollbackFor = Exception.class) +public class EduSmartWelcomeGuideStepServiceImpl extends ServiceImpl + implements EduSmartWelcomeGuideStepService { + + private final EduSmartWelcomeGuideStepStaffService eduSmartWelcomeGuideStepStaffService; + private final EduSmartWelcomeGuideRosterRelationStepService eduSmartWelcomeGuideRosterRelationStepService; + private final RemoteStaffService remoteStaffService; + private final EduSmartWelcomeGuideRosterMapper eduSmartWelcomeGuideRosterMapper; + + @Override + public void addUploadFile(AddUploadFileStepDTO dto) { + //判断前提步骤 + EduSmartWelcomeGuideStep preStep = getById(dto.getStepId()); + if (Objects.isNull(preStep)) { + throw new FebsException("步骤信息错误!"); + } + if (Objects.nonNull(preStep.getPremiseStepId())) { + EduSmartWelcomeGuideRosterRelationStep premiseRelationStep = eduSmartWelcomeGuideRosterRelationStepService + .getOne(Wrappers.lambdaQuery(new EduSmartWelcomeGuideRosterRelationStep()) + .eq(EduSmartWelcomeGuideRosterRelationStep::getRosterId, dto.getRosterId()) + .eq(EduSmartWelcomeGuideRosterRelationStep::getStepId, preStep.getPremiseStepId()) + .eq(EduSmartWelcomeGuideRosterRelationStep::getStatus, AuditStatusEnum.PASS_STATUS.getStatus()) + ); + if (Objects.isNull(premiseRelationStep)) { + EduSmartWelcomeGuideStep premiseStep = getById(preStep.getPremiseStepId()); + throw new FebsException(String.format("请审核通过【%s】后执行其它步骤!", premiseStep.getStepName())); + } + } + + EduSmartWelcomeGuideRosterRelationStep relationStep = eduSmartWelcomeGuideRosterRelationStepService + .getOne(Wrappers.lambdaQuery(new EduSmartWelcomeGuideRosterRelationStep()) + .eq(EduSmartWelcomeGuideRosterRelationStep::getRelationId, dto.getRelationId()) + .eq(EduSmartWelcomeGuideRosterRelationStep::getStepId, dto.getStepId())); + + if (ObjectUtil.isNull(relationStep)) { + if (CollUtil.isNotEmpty(dto.getUpLoadFileUrlList())) { + relationStep = new EduSmartWelcomeGuideRosterRelationStep(); + BeanUtils.copyProperties(dto, relationStep); + relationStep.setUploadFileUrl(CollUtil.join(dto.getUpLoadFileUrlList(), ",")); + eduSmartWelcomeGuideRosterRelationStepService.save(relationStep); + } + } else { + if (CollUtil.isNotEmpty(dto.getUpLoadFileUrlList())) { + eduSmartWelcomeGuideRosterRelationStepService + .update(Wrappers.lambdaUpdate(new EduSmartWelcomeGuideRosterRelationStep()) + .eq(EduSmartWelcomeGuideRosterRelationStep::getId, relationStep.getId()) + .set(EduSmartWelcomeGuideRosterRelationStep::getUploadFileUrl, + CollUtil.join(dto.getUpLoadFileUrlList(), ","))); + } + } + } + + @Override + public List listStepInfo(Long relationId, Long guideId) { + // 查询步骤信息 + List stepList = list(Wrappers.lambdaQuery(new EduSmartWelcomeGuideStep()) + .eq(EduSmartWelcomeGuideStep::getGuideId, guideId)); + // 查询步骤状态 + int current = 0; + if (CollUtil.isNotEmpty(stepList)) { + for (EduSmartWelcomeGuideStep step : stepList) { + EduSmartWelcomeGuideRosterRelationStep relationStep = eduSmartWelcomeGuideRosterRelationStepService + .getOne(Wrappers.lambdaQuery(new EduSmartWelcomeGuideRosterRelationStep()) + .eq(EduSmartWelcomeGuideRosterRelationStep::getRelationId, relationId) + .eq(EduSmartWelcomeGuideRosterRelationStep::getStepId, step.getId())); + step.setUploadFileUrl(Objects.isNull(relationStep) ? null : relationStep.getUploadFileUrl()); + // 执行状态. -1:未执行, 0:通过 + if (Objects.isNull(relationStep) || relationStep.getStatus() == 1) { + step.setStatus(-1); + } else { + step.setStatus(relationStep.getStatus()); + } + + if (current == 0) { + if (ObjectUtil.isNotNull(relationStep)) { + EduSmartWelcomeGuideRoster roster = eduSmartWelcomeGuideRosterMapper + .selectById(relationStep.getRosterId()); + step.setRoster(roster); + } + } + current++; + } + } + return stepList; + } + + @Override + public List listGuideRosterTableCol(Long guideId) { + return list(Wrappers.lambdaQuery(new EduSmartWelcomeGuideStep()) + .eq(EduSmartWelcomeGuideStep::getGuideId, guideId)) + .stream().map(step -> { + GuideStepColVO vo = new GuideStepColVO(); + BeanUtils.copyProperties(step, vo); + return vo; + }).collect(Collectors.toList()); + } + + @Override + public List listStepDetailInfo(Long rosterId, Long guideId) { + // 查询步骤信息 + List stepList = list(Wrappers.lambdaQuery(new EduSmartWelcomeGuideStep()) + .eq(EduSmartWelcomeGuideStep::getGuideId, guideId)); + // 查询步骤状态 + if (CollUtil.isNotEmpty(stepList)) { + for (EduSmartWelcomeGuideStep step : stepList) { + EduSmartWelcomeGuideRosterRelationStep relationStep = eduSmartWelcomeGuideRosterRelationStepService + .getOne(Wrappers.lambdaQuery(new EduSmartWelcomeGuideRosterRelationStep()) + .eq(EduSmartWelcomeGuideRosterRelationStep::getRosterId, rosterId) + .eq(EduSmartWelcomeGuideRosterRelationStep::getStepId, step.getId())); + // 查询可以审核的职工信息 + List stepStaffList = eduSmartWelcomeGuideStepStaffService + .list(Wrappers.lambdaQuery(new EduSmartWelcomeGuideStepStaff()) + .eq(EduSmartWelcomeGuideStepStaff::getStepId, step.getId())); + if (CollUtil.isNotEmpty(stepStaffList)) { + List eduStaffs = remoteStaffService.getStaffList(stepStaffList.stream() + .map(EduSmartWelcomeGuideStepStaff::getStaffId).collect(Collectors.toList())).getData(); + step.setStaffNameStr(CollUtil.isNotEmpty(eduStaffs) ? + eduStaffs.stream().map(EduStaff::getName).collect(Collectors.joining(StringConstant.COMMA)) : ""); + } else { + step.setStaffNameStr(""); + } + // 执行状态. -1:未执行, 0:通过 + if (Objects.isNull(relationStep) || relationStep.getStatus() == 1) { + step.setStatus(-1); + } else { + step.setStatus(relationStep.getStatus()); + } + if (step.getStatus() == 0) { + step.setOperateTime(relationStep.getOperateTime()); + // 查询审核人信息 + EduStaff staff = remoteStaffService.getStaff(relationStep.getStaffId()).getData(); + if (Objects.nonNull(staff)) { + step.setStaffName(staff.getName()); + } + } + } + } + return stepList; + } + + @Override + public List listExamineStepInfo(Long rosterId, Long guideId, Long staffId) { + // 查询步骤信息 + List stepList = list(Wrappers.lambdaQuery(new EduSmartWelcomeGuideStep()) + .eq(EduSmartWelcomeGuideStep::getGuideId, guideId)); + // 查询步骤状态 + if (CollUtil.isNotEmpty(stepList)) { + for (EduSmartWelcomeGuideStep step : stepList) { + EduSmartWelcomeGuideRosterRelationStep relationStep = eduSmartWelcomeGuideRosterRelationStepService + .getOne(Wrappers.lambdaQuery(new EduSmartWelcomeGuideRosterRelationStep()) + .eq(EduSmartWelcomeGuideRosterRelationStep::getRosterId, rosterId) + .eq(EduSmartWelcomeGuideRosterRelationStep::getStepId, step.getId())); + step.setCommentContent(Objects.isNull(relationStep) ? null : relationStep.getCommentContent()); + step.setUploadFileUrl(Objects.isNull(relationStep) ? null : relationStep.getUploadFileUrl()); + // 执行状态. -1:未执行, 0:通过 + if (Objects.isNull(relationStep) || relationStep.getStatus() != 0) { + step.setStatus(-1); + } else { + step.setStatus(0); + } + + if (step.getStatus() == 0) { + step.setOperateTime(relationStep.getOperateTime()); + // 查询审核人信息 + EduStaff staff = remoteStaffService.getStaff(relationStep.getStaffId()).getData(); + if (Objects.nonNull(staff)) { + step.setStaffName(staff.getName()); + } + step.setButtonStatus(1); + continue; + } + // 判断是否显示通过按钮. 没有人通过的情况下 + EduSmartWelcomeGuideStepStaff stepStaff = eduSmartWelcomeGuideStepStaffService + .getOne(Wrappers.lambdaQuery(new EduSmartWelcomeGuideStepStaff()) + .eq(EduSmartWelcomeGuideStepStaff::getStepId, step.getId()) + .eq(EduSmartWelcomeGuideStepStaff::getStaffId, staffId)); + // 判断按钮状态. 0-代表显示通过按钮,1-代表不显示通过按钮 + if (Objects.isNull(stepStaff)) { + step.setButtonStatus(1); + } else { + // 判断是否有前提步骤 + if (Objects.isNull(step.getPremiseStepId())) { + step.setButtonStatus(0); + } else { + // 判断前提步骤是否通过 + EduSmartWelcomeGuideStep premiseStep = premiseStep(step.getPremiseStepId(), + new EduSmartWelcomeGuideStep()); + if (ObjectUtil.isNotNull(premiseStep)) { + if (ObjectUtil.equals(GuideStepTypeEnum.EXAMINE_TYPE.getType(), premiseStep.getStepType()) + || ObjectUtil + .equals(GuideStepTypeEnum.CLASS.getType(), premiseStep.getStepType()) || + ObjectUtil.equals(GuideStepTypeEnum.DORM.getType(), premiseStep.getStepType()) || + ObjectUtil.equals(GuideStepTypeEnum.MATCH_FACE.getType(), premiseStep.getStepType())) { + //需要审核 + EduSmartWelcomeGuideRosterRelationStep premiseRelationStep = eduSmartWelcomeGuideRosterRelationStepService + .getOne(Wrappers.lambdaQuery(new EduSmartWelcomeGuideRosterRelationStep()) + .eq(EduSmartWelcomeGuideRosterRelationStep::getRosterId, rosterId) + .eq(EduSmartWelcomeGuideRosterRelationStep::getStatus, 0) + .eq(EduSmartWelcomeGuideRosterRelationStep::getStepId, premiseStep.getId())); + step.setButtonStatus(Objects.isNull(premiseRelationStep) ? 1 : 0); + } else { + step.setButtonStatus(0); + } + } else { + step.setButtonStatus(0); + } + } + } + } + } + return stepList; + } + + @Override + public EduSmartWelcomeGuideStep premiseStep(Long stepId, EduSmartWelcomeGuideStep step) { + EduSmartWelcomeGuideStep currentStep = getById(stepId); + if (ObjectUtil.equals(GuideStepTypeEnum.EXAMINE_TYPE.getType(), currentStep.getStepType()) || ObjectUtil + .equals(GuideStepTypeEnum.CLASS.getType(), currentStep.getStepType()) || + ObjectUtil.equals(GuideStepTypeEnum.DORM.getType(), currentStep.getStepType()) + || ObjectUtil.equals(GuideStepTypeEnum.MATCH_FACE.getType(), currentStep.getStepType())) { + step = currentStep; + } else { + if (ObjectUtil.isNotNull(currentStep.getPremiseStepId())) { + step = premiseStep(currentStep.getPremiseStepId(), step); + } else { + step = currentStep; + } + } + return step; + } + + + /** + * 递归获取上一步需要审核的步骤 + * + * @param stepId + * @return + */ + public EduSmartWelcomeGuideStep loopPremiseStep(Long stepId) { + EduSmartWelcomeGuideStep currentStep = getById(stepId); + if (ObjectUtil.isNull(currentStep.getPremiseStepId())) { + return null; + } + + return null; + } + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/EduSmartWelcomeGuideStepStaffServiceImpl.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/EduSmartWelcomeGuideStepStaffServiceImpl.java new file mode 100644 index 0000000..5cdb89a --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/EduSmartWelcomeGuideStepStaffServiceImpl.java @@ -0,0 +1,26 @@ +package com.yida.data.school.smart.service.impl; + +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideStepStaff; +import com.yida.data.school.smart.mapper.EduSmartWelcomeGuideStepStaffMapper; +import com.yida.data.school.smart.service.EduSmartWelcomeGuideStepStaffService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import lombok.RequiredArgsConstructor; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +/** + * 智慧迎新指南步骤-审核人员表Service实现 + * + * @author ZYJ + * @date 2023-05-15 15:33:18 + */ +@Slf4j +@Service +@RequiredArgsConstructor +@Transactional(rollbackFor = Exception.class) +public class EduSmartWelcomeGuideStepStaffServiceImpl extends ServiceImpl + implements EduSmartWelcomeGuideStepStaffService { + + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/H5EduSmartWelcomeServiceImpl.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/H5EduSmartWelcomeServiceImpl.java new file mode 100644 index 0000000..f3dccde --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/H5EduSmartWelcomeServiceImpl.java @@ -0,0 +1,604 @@ +package com.yida.data.school.smart.service.impl; + +import cc.mrbird.febs.common.redis.service.RedisService; +import cn.hutool.core.codec.Base64; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.LocalDateTimeUtil; +import cn.hutool.core.lang.Snowflake; +import cn.hutool.core.lang.UUID; +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.yida.data.common.core.common.ResultMsgType; +import com.yida.data.common.core.entity.constant.CachePrefixConstant; +import com.yida.data.common.core.entity.constant.StringConstant; +import com.yida.data.common.core.entity.pay.ConstructionPayOrder; +import com.yida.data.common.core.entity.smart.*; +import com.yida.data.common.core.entity.system.BaiduApiConfig; +import com.yida.data.common.core.entity.system.ConstructionPayConfig; +import com.yida.data.common.core.entity.system.Dept; +import com.yida.data.common.core.entity.system.UnionPayConfig; +import com.yida.data.common.core.enums.*; +import com.yida.data.common.core.exception.FebsException; +import com.yida.data.common.core.utils.*; +import com.yida.data.common.service.CommonService; +import com.yida.data.school.dto.smart.h5.CreateGuideStepOrderDTO; +import com.yida.data.school.dto.smart.h5.RosterFaceMatchDTO; +import com.yida.data.school.dto.smart.h5.RosterPageDTO; +import com.yida.data.school.smart.mapper.EduSmartWelcomeGuideRosterRelationMapper; +import com.yida.data.school.smart.service.*; +import com.yida.data.school.vo.smart.h5.GuideStepOrderRosterCacheVO; +import com.yida.data.school.vo.smart.h5.RosterFaceMatchVO; +import com.yida.data.school.vo.smart.h5.RosterStepPayInfoVO; +import jodd.util.ThreadUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.io.File; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.Date; +import java.util.Objects; +import java.util.concurrent.ExecutorService; + +/** + * 智慧迎新H5接口 service + * + * @author ZYJ + * @date 2023/6/19 17:19 + */ +@Slf4j +@Service +@RequiredArgsConstructor +@Transactional(rollbackFor = Exception.class) +public class H5EduSmartWelcomeServiceImpl implements H5EduSmartWelcomeService { + + private final EduGuideStepOrderService eduGuideStepOrderService; + private final EduSmartWelcomeGuideService eduSmartWelcomeGuideService; + private final EduSmartWelcomeGuideStepService eduSmartWelcomeGuideStepService; + private final EduSmartWelcomeGuideRosterService eduSmartWelcomeGuideRosterService; + private final EduSmartWelcomeGuideRosterRelationService eduSmartWelcomeGuideRosterRelationService; + private final EduSmartWelcomeGuideRosterRelationStepService eduSmartWelcomeGuideRosterRelationStepService; + + private final EduSmartWelcomeGuideRosterRelationMapper eduSmartWelcomeGuideRosterRelationMapper; + + private final RedisService redisService; + private final CommonService commonService; + + private final WxPublicUtil wxPublicUtil; + + @Value("${febs.uploadUrl}") + private String uploadUrl; + + @Value("${febs.welcomePayUrl}") + private String welcomePayUrl; + + private static final Snowflake ORDER_CODE_GENERATOR = new Snowflake(1, 1); + + private static final ExecutorService GUIDE_STEP_ORDER_SUCCESS_POOL = + ThreadPoolUtil.getThreadPool("guide-step-order-pool-%d"); + + @Override + public RosterStepPayInfoVO createGuideStepOrder(CreateGuideStepOrderDTO dto) { + + Dept school = commonService.getDept(dto.getDeptId()); + if (Objects.isNull(school)) { + throw new FebsException("学校信息错误"); + } + // 查询用户信息 + String openId = wxPublicUtil.getOpenId(school.getWxPublicAppId(), school.getWxPublicSecret(), dto.getCode()); + // 查询openId是否绑定了对应的信息 + EduSmartWelcomeGuideRosterRelation rosterRelation = eduSmartWelcomeGuideRosterRelationService + .getOpenIdRelation(openId, dto.getDeptId()); + if (Objects.isNull(rosterRelation)) { + throw new FebsException("请绑定基础信息后再扫码进行操作!"); + } + dto.setGuideId(rosterRelation.getGuideId()); + dto.setRelationId(rosterRelation.getId()); + // 判断是否有下单缓存信息 + GuideStepOrderRosterCacheVO cacheVO = (GuideStepOrderRosterCacheVO) redisService.get( + CachePrefixConstant.GUIDE_STEP_ORDER_ROSTER + rosterRelation.getId()); + if (Objects.nonNull(cacheVO)) { + Object orderFlag = redisService.get(CachePrefixConstant.GUIDE_STEP_ORDER_FLAG + cacheVO.getOrderNo()); + // 判断是否还存在支付链接 + if (Objects.nonNull(orderFlag)) { + EduGuideStepOrder order = eduGuideStepOrderService.getOne(new LambdaQueryWrapper<>(new EduGuideStepOrder()) + .eq(EduGuideStepOrder::getOrderCode, cacheVO.getOrderNo())); + if (Objects.isNull(order) || OrderStatusEnum.CLOSED.getStatus().equals(order.getOrderStatus())) { + throw new FebsException("支付异常!请稍后重试"); + } + return getPayInfo(order, orderFlag.toString(), true); + } + } +// // 查询步骤信息 +// EduSmartWelcomeGuideStep step = eduSmartWelcomeGuideStepService.getById(dto.getStepId()); +// if (Objects.isNull(step)) { +// throw new FebsException("当前步骤不支持缴费功能"); +// } +// if (!GuideStepTypeEnum.PAY_TYPE.getType().equals(step.getStepType())) { +// throw new FebsException("当前步骤不支持缴费功能"); +// } +// // 查询绑定信息 +// EduSmartWelcomeGuideRosterRelation rosterRelation = +// eduSmartWelcomeGuideRosterRelationService.getById(dto.getRelationId()); +// if (Objects.isNull(rosterRelation)) { +// throw new FebsException("信息错误"); +// } +// +// EduSmartWelcomeGuideRoster guideRoster = eduSmartWelcomeGuideRosterService.getById(rosterRelation.getRosterId()); +// if (Objects.isNull(guideRoster)) { +// throw new FebsException("信息错误"); +// } +// rosterRelation.setGuideRoster(guideRoster); +// // 判断是否已经缴费过 +// EduSmartWelcomeGuideRosterRelationStep relationStep = eduSmartWelcomeGuideRosterRelationStepService +// .getOne(Wrappers.lambdaQuery(new EduSmartWelcomeGuideRosterRelationStep()) +// .eq(EduSmartWelcomeGuideRosterRelationStep::getRosterId, guideRoster.getId()) +// .eq(EduSmartWelcomeGuideRosterRelationStep::getStepId, step.getId()) +// .eq(EduSmartWelcomeGuideRosterRelationStep::getPayStatus, PayStatusEnum.PAY_SUCCESS.getStatus()) +// .eq(EduSmartWelcomeGuideRosterRelationStep::getStatus, AuditStatusEnum.PASS_STATUS.getStatus()) +// ); +// if (Objects.nonNull(relationStep)) { +// throw new FebsException("请勿重复缴费"); +// } +// // 判断前提步骤执行状态 +// if (Objects.nonNull(step.getPremiseStepId())) { +// EduSmartWelcomeGuideRosterRelationStep premiseRelationStep = eduSmartWelcomeGuideRosterRelationStepService +// .getOne(Wrappers.lambdaQuery(new EduSmartWelcomeGuideRosterRelationStep()) +// .eq(EduSmartWelcomeGuideRosterRelationStep::getRosterId, guideRoster.getId()) +// .eq(EduSmartWelcomeGuideRosterRelationStep::getStepId, step.getPremiseStepId()) +// .eq(EduSmartWelcomeGuideRosterRelationStep::getStatus, AuditStatusEnum.PASS_STATUS.getStatus()) +// ); +// if (Objects.isNull(premiseRelationStep)) { +// EduSmartWelcomeGuideStep premiseStep = eduSmartWelcomeGuideStepService.getById(step.getPremiseStepId()); +// throw new FebsException(String.format("请审核通过【%s】后执行其它步骤!", premiseStep.getStepName())); +// } +// } + + String orderCode = ""; + try { + // 订单号 需要根据支付方式生成不同的订单号 + String orderNo = ""; + if (PayWay.WEI_XIN.getValue().equals(dto.getPayWay())) { + // 微信 + orderNo = String.valueOf(ORDER_CODE_GENERATOR.nextId()); + } else if (PayWay.UNION.getValue().equals(dto.getPayWay())) { + // 银联 + // 获取银联商户号相关信息 + UnionPayConfig config = commonService.getUnionPayConfigByDept(rosterRelation.getDeptId()); + if (Objects.isNull(config)) { + log.error("获取银联商户号相关信息错误deptId: {}", rosterRelation.getDeptId()); + throw new FebsException("暂未配置支付信息"); + } + orderNo = UnionPayUtil.getOrderNumber(Objects.nonNull(config.getParentConfig()) + ? config.getParentConfig().getSourceNumber() : config.getSourceNumber()); + } else if (PayWay.CONSTRUCTION_PAY.getValue().equals(dto.getPayWay())) { + // 建行 + // 获取建行支付配置相关信息 + ConstructionPayConfig config = commonService.getConstructionPayConfigByDept(rosterRelation.getDeptId()); + if (Objects.isNull(config)) { + log.error("获取建行支付配置相关信息错误deptId: {}", rosterRelation.getDeptId()); + throw new FebsException("暂未配置支付信息"); + } + orderNo = ConstructionPayUtil.getOrderNumber(config.getMerchantId()); + } + + if (StringUtils.isEmpty(orderNo)) { + log.error("生成订单号失败!"); + throw new FebsException(ResultMsgType.ORDER_FAIL.getValue()); + } + orderCode = orderNo; + GuideStepOrderRosterCacheVO orderRosterCacheVO = GuideStepOrderRosterCacheVO.builder() + .guideId(dto.getGuideId()) +// .stepId(dto.getStepId()) + .relationId(dto.getRelationId()) + .deptId(rosterRelation.getDeptId()) + .orderNo(orderNo) + .build(); + // 添加花名册人员迎新订单缓存 + redisService.set(CachePrefixConstant.GUIDE_STEP_ORDER_ROSTER + dto.getRelationId(), + orderRosterCacheVO, 900L); + return createOrder(dto, null, rosterRelation, orderNo); + } catch (Exception e) { + if (log != null) { + log.error("下单失败", e); + } + // 删除花名册人员迎新订单缓存 + redisService.del(CachePrefixConstant.GUIDE_STEP_ORDER_ROSTER + dto.getRelationId()); + // 删除迎新订单对应缓存 + if (StringUtils.isNotBlank(orderCode)) { + redisService.del(CachePrefixConstant.GUIDE_STEP_ORDER + orderCode); + redisService.del(CachePrefixConstant.GUIDE_STEP_ORDER_FLAG + orderCode); + } + throw new FebsException(e instanceof FebsException ? e.getMessage() : ResultMsgType.ORDER_FAIL.getValue()); + } + } + + /** + * 生成订单并返回支付信息 + * + * @param dto 生成花名册步骤订单请求类 + * @param step 步骤信息 + * @param rosterRelation 关联关系信息 + * @param orderNo 订单号 + * @return com.yida.data.school.vo.smart.h5.RosterStepPayInfoVO + * @author ZYJ + * @date 2023/6/20 17:28 + */ + private RosterStepPayInfoVO createOrder(CreateGuideStepOrderDTO dto, EduSmartWelcomeGuideStep step, + EduSmartWelcomeGuideRosterRelation rosterRelation, String orderNo) { + // 生成迎新订单信息 + EduGuideStepOrder eduGuideStepOrder = new EduGuideStepOrder(); + eduGuideStepOrder.setOrderCode(orderNo); + // 流水号 + eduGuideStepOrder.setTransactionNumber(PayUtil.generateSerialNumber("P", rosterRelation.getDeptId(), "")); + eduGuideStepOrder.setGuideId(dto.getGuideId()); +// eduGuideStepOrder.setStepId(dto.getStepId()); + eduGuideStepOrder.setRosterId(rosterRelation.getRosterId()); + eduGuideStepOrder.setRelationId(dto.getRelationId()); + // 指南信息 + EduSmartWelcomeGuide guide = eduSmartWelcomeGuideService.getById(dto.getGuideId()); + // 金额 + BigDecimal money = guide.getMoney(); + eduGuideStepOrder.setTotalMoney(money); + eduGuideStepOrder.setPracticalMoney(money); + eduGuideStepOrder.setPhone(rosterRelation.getGuideRoster().getMobile()); + // 订单状态和支付状态 + eduGuideStepOrder.setOrderStatus(OrderStatusEnum.NOT_PAY.getStatus()); + eduGuideStepOrder.setPayStatus(PayStatusEnum.NOT_PAY.getStatus()); + eduGuideStepOrder.setPayWay(dto.getPayWay()); + eduGuideStepOrder.setPayType(dto.getPayType()); + eduGuideStepOrder.setDeptId(rosterRelation.getDeptId()); + // 保存订单主体信息 + eduGuideStepOrderService.save(eduGuideStepOrder); + + // 返回值 + RosterStepPayInfoVO payInfoVO = new RosterStepPayInfoVO(); + // 金额为0,直接为成功订单 + if (NumberUtil.isLessOrEqual(eduGuideStepOrder.getPracticalMoney(), BigDecimal.ZERO)) { + guideStepOrderPaySuccess(eduGuideStepOrder.getOrderCode(), LocalDateTime.now()); + payInfoVO.setNeedToPay(false); + payInfoVO.setOrderCode(eduGuideStepOrder.getOrderCode()); + } else { + // 下单返回信息 + String result = placeOrder(eduGuideStepOrder); + // 添加迎新订单缓存 + redisService.set(CachePrefixConstant.GUIDE_STEP_ORDER + eduGuideStepOrder.getOrderCode(), eduGuideStepOrder, 900L); + redisService.set(CachePrefixConstant.GUIDE_STEP_ORDER_FLAG + eduGuideStepOrder.getOrderCode(), result, 900L); + payInfoVO = getPayInfo(eduGuideStepOrder, result, true); + } + return payInfoVO; + } + + /** + * 调用第三方接口生成支付信息 + * + * @param eduGuideStepOrder 迎新订单信息 + * @return java.lang.String + * @author ZYJ + * @date 2023/6/20 17:17 + */ + private String placeOrder(EduGuideStepOrder eduGuideStepOrder) { + // 下单返回信息 + String result = ""; + try { + if (PayWay.CONSTRUCTION_PAY.getValue().equals(eduGuideStepOrder.getPayWay())) { + // 建行支付 + result = ConstructionPayUtil.getQrPayUrl( + commonService.getConstructionPayConfigByDept(eduGuideStepOrder.getDeptId()), + ConstructionPayOrder.builder() + .orderNo(eduGuideStepOrder.getOrderCode()) + .payMoney(eduGuideStepOrder.getPracticalMoney()) + .orderTime(Date.from(eduGuideStepOrder.getCreateDate().atZone(ZoneId.systemDefault()).toInstant())) + .build()); + } + } catch (Exception e) { + log.error("迎新订单下单失败", e); + throw new FebsException(ResultMsgType.ORDER_FAIL.getValue()); + } + if (StringUtils.isEmpty(result)) { + log.error("迎新订单失败, 没有支付信息"); + throw new FebsException(ResultMsgType.ORDER_FAIL.getValue()); + } + return result; + } + + /** + * 获取订单支付信息 + * + * @param order 迎新订单信息 + * @param orderFlag 订单支付标识 + * @param needToPay 是否需要跳转支付 + * @return com.yida.data.school.vo.smart.h5.RosterStepPayInfoVO + * @author ZYJ + * @date 2023/6/20 17:16 + */ + public RosterStepPayInfoVO getPayInfo(EduGuideStepOrder order, String orderFlag, boolean needToPay) { + RosterStepPayInfoVO payInfoVO = null; + if (PayWay.CONSTRUCTION_PAY.getValue().equals(order.getPayWay())) { + // 建行 + payInfoVO = RosterStepPayInfoVO.builder() + .orderCode(order.getOrderCode()) + .payWay(order.getPayWay()) + .payType(order.getPayType()) + .needToPay(needToPay) + .payUrl(orderFlag) + .build(); + } + return payInfoVO; + } + + @Override + public void guideStepOrderPaySuccess(String orderCode, LocalDateTime payDate) { +// File qrCodeFile = null; + try { + // 修改订单信息 + EduGuideStepOrder order = eduGuideStepOrderService.getOne(new LambdaQueryWrapper<>(new EduGuideStepOrder()) + .eq(EduGuideStepOrder::getOrderCode, orderCode)); + order.setPayDate(payDate); + order.setOrderStatus(OrderStatusEnum.PAY_SUCCESS.getStatus()); + order.setPayStatus(PayStatusEnum.PAY_SUCCESS.getStatus()); + eduGuideStepOrderService.updateById(order); +// // 修改步骤支付状态 +// EduSmartWelcomeGuideRosterRelationStep relationStep = eduSmartWelcomeGuideRosterRelationStepService +// .getOne(Wrappers.lambdaQuery(new EduSmartWelcomeGuideRosterRelationStep()) +// .eq(EduSmartWelcomeGuideRosterRelationStep::getRelationId, order.getRelationId()) +// .eq(EduSmartWelcomeGuideRosterRelationStep::getStepId, order.getStepId()) +// ); +// if (!Objects.nonNull(relationStep)) { +// relationStep = new EduSmartWelcomeGuideRosterRelationStep(); +// relationStep.setDeptId(order.getDeptId()); +// relationStep.setGuideId(order.getGuideId()); +// relationStep.setRosterId(order.getRosterId()); +// relationStep.setRelationId(order.getRelationId()); +// relationStep.setStepId(order.getStepId()); +// } +// relationStep.setStatus(AuditStatusEnum.PASS_STATUS.getStatus()); +// relationStep.setPayStatus(PayStatusEnum.PAY_SUCCESS.getStatus()); +// eduSmartWelcomeGuideRosterRelationStepService.saveOrUpdate(relationStep); + + // 更新用户支付状态 + EduSmartWelcomeGuideRoster guideRoster = eduSmartWelcomeGuideRosterService.getById(order.getRosterId()); + eduSmartWelcomeGuideRosterService.updateById( + EduSmartWelcomeGuideRoster.builder() + .id(guideRoster.getId()) + .payStatus(1) + .build()); + // 生成花名册二维码信息 +// EduSmartWelcomeGuideRoster guideRoster = eduSmartWelcomeGuideRosterService.getById(order.getRosterId()); +// JSONObject obj = JSONUtil.createObj() +// .set("rosterId", guideRoster.getId()) +// .set("deptId", order.getDeptId()) +// .set("guideId", order.getGuideId()) +// .set("fullName", guideRoster.getFullName()) +// .set("graduateSchool", guideRoster.getGraduateSchool()) +// .set("idNumber", guideRoster.getIdNumber()) +// .set("admittedMajor", guideRoster.getAdmittedMajor()); +// // 生成文件名称 +// String fileName = UUID.randomUUID().toString(true) + ".png"; +// String filePath = FileUtil.getLocalUploadAddress() + fileName; +// QrCodeUtil.generateQrCodeImage(obj.toString(), 400, 400, filePath); +// // 上传文件到媒资 +// qrCodeFile = new File(filePath); +// String qrCodeAddress = FileUtil.uploadFileToMediaServer(uploadUrl, qrCodeFile); +// eduSmartWelcomeGuideRosterService.updateById( +// EduSmartWelcomeGuideRoster.builder() +// .id(guideRoster.getId()) +// .qrCodeUrl(qrCodeAddress) +// .build()); + + // 删除花名册人员迎新订单缓存 + redisService.del(CachePrefixConstant.GUIDE_STEP_ORDER_ROSTER + order.getRelationId()); + // 删除迎新订单对应缓存 + redisService.del(CachePrefixConstant.GUIDE_STEP_ORDER + orderCode); + redisService.del(CachePrefixConstant.GUIDE_STEP_ORDER_FLAG + orderCode); + } catch (Exception e) { + log.error("迎新订单支付成功接口调用失败", e); + throw new FebsException("调用失败"); + } + } + + @Override + public void guideStepOrderSuccess(String orderCode) { + GUIDE_STEP_ORDER_SUCCESS_POOL.execute(() -> { + EduGuideStepOrder order = eduGuideStepOrderService.getOne(new LambdaQueryWrapper<>(new EduGuideStepOrder()) + .eq(EduGuideStepOrder::getOrderCode, orderCode)); + + if (Objects.nonNull(order) + && (OrderStatusEnum.NOT_PAY.getStatus().equals(order.getOrderStatus()) + || OrderStatusEnum.USER_PAYING.getStatus().equals(order.getOrderStatus()))) { + if (PayWay.CONSTRUCTION_PAY.getValue().equals(order.getPayWay())) { + // 建行 + constructionGuideStepOrderSuccess(order); + } + } + }); + } + + /** + * 处理建行查询订单 + * + * @param order 订单信息 + * @author ZYJ + * @date 2023/6/20 17:36 + */ + private void constructionGuideStepOrderSuccess(EduGuideStepOrder order) { + boolean flag = false; + // 订单号 + String orderCode = order.getOrderCode(); + // 查询建行支付配置 + ConstructionPayConfig config = commonService.getConstructionPayConfigByDept(order.getDeptId()); + if (Objects.isNull(config)) { + log.error("当前学校赞未配置建行支付信息"); + return; + } + + while (LocalDateTimeUtil.between(order.getCreateDate(), LocalDateTime.now()).getSeconds() < 900L) { + try { + JSONObject resJson = ConstructionPayUtil.queryOrder(config, orderCode); + // 支付信息 + JSONObject queryOrder = resJson.getJSONObject("QUERYORDER"); + // 金额 + BigDecimal amount = new BigDecimal(queryOrder.getStr("AMOUNT")); + if (order.getPracticalMoney().compareTo(amount) != 0) { + log.error("支付信息金额错误"); + break; + } + // 支付状态 + String status = (String) queryOrder.get("STATUSCODE"); + if (ConstructionTradeStateEnum.WAIT_BANK_CONFIRM.getStatus().equals(status) + || ConstructionTradeStateEnum.WAIT_BANK_CONFIRM_OTHER.getStatus().equals(status)) { + continue; + } + ConstructionTradeStateEnum tradeStateEnum = EnumUtils.valueOf(ConstructionTradeStateEnum.class, status, + ConstructionTradeStateEnum.class.getMethod("getStatus")); + switch (Objects.requireNonNull(tradeStateEnum)) { + // 支付成功 + case TRADE_SUCCESS: + guideStepOrderPaySuccess(order.getOrderCode(), + LocalDateTimeUtil.parse((String) queryOrder.get("ORDERDATE"), DatePattern.PURE_DATETIME_PATTERN)); + flag = true; + break; + // 订单关闭 + case TRADE_FAIL: + order.setOrderStatus(OrderStatusEnum.CLOSED.getStatus()); + order.setPayStatus(PayStatusEnum.CANCEL.getStatus()); + eduGuideStepOrderService.updateById(order); + flag = true; + break; + default: + break; + } + if (flag) { + break; + } + ThreadUtil.sleep(1500L); + } catch (Exception e) { + ThreadUtil.sleep(1500L); + log.error("迎新订单(建行支付方式)完成失败, orderNo: {}", orderCode, e); + } + } + } + + @Override + public RosterFaceMatchVO rosterFaceMatch(RosterFaceMatchDTO dto) { + File file = null; + try { + // 查询步骤信息 + EduSmartWelcomeGuideStep step = eduSmartWelcomeGuideStepService.getById(dto.getStepId()); + if (Objects.isNull(step)) { + throw new FebsException("当前步骤不支持人脸对比功能"); + } + if (!GuideStepTypeEnum.MATCH_FACE.getType().equals(step.getStepType())) { + throw new FebsException("当前步骤不支持人脸对比功能"); + } + // 查询绑定信息 + EduSmartWelcomeGuideRosterRelation rosterRelation = + eduSmartWelcomeGuideRosterRelationService.getById(dto.getRelationId()); + if (Objects.isNull(rosterRelation)) { + throw new FebsException("信息错误"); + } + EduSmartWelcomeGuideRoster guideRoster = eduSmartWelcomeGuideRosterService.getById(rosterRelation.getRosterId()); + if (Objects.isNull(guideRoster)) { + throw new FebsException("信息错误"); + } + // 判断前提步骤执行状态 + if (Objects.nonNull(step.getPremiseStepId())) { + EduSmartWelcomeGuideRosterRelationStep premiseRelationStep = eduSmartWelcomeGuideRosterRelationStepService + .getOne(Wrappers.lambdaQuery(new EduSmartWelcomeGuideRosterRelationStep()) + .eq(EduSmartWelcomeGuideRosterRelationStep::getRosterId, guideRoster.getId()) + .eq(EduSmartWelcomeGuideRosterRelationStep::getStepId, step.getPremiseStepId()) + .eq(EduSmartWelcomeGuideRosterRelationStep::getStatus, AuditStatusEnum.PASS_STATUS.getStatus()) + ); + if (Objects.isNull(premiseRelationStep)) { + EduSmartWelcomeGuideStep premiseStep = eduSmartWelcomeGuideStepService.getById(step.getPremiseStepId()); + throw new FebsException(String.format("请审核通过【%s】后执行其它步骤!", premiseStep.getStepName())); + } + } + // 查询百度api配置信息 + BaiduApiConfig config = commonService + .getBaiDuApiConfigByDept(rosterRelation.getDeptId(), BaiDuModuleEnum.FACE_DETECT.getValue()); + if (Objects.isNull(config)) { + log.error("获取百度api相关信息错误deptId: {}", rosterRelation.getDeptId()); + throw new FebsException("暂未配置人脸对比信息"); + } + // 人脸对比 阈值80 + String score = BaiDuUtil.faceMatch(config, guideRoster.getAvatar(), dto.getBase64()); + int valid = NumberUtil.isLess(new BigDecimal("60"), new BigDecimal(score)) ? 1 : 0; + RosterFaceMatchVO matchVO = RosterFaceMatchVO.builder() + .valid(valid) + .score(score) + .build(); + // 对比成功则上传图片 + if (valid == 1) { + String fileName = FileUtil.getLocalUploadAddress() + UUID.randomUUID() + ".png"; + file = new File(fileName); + // 上传图片 + file = Base64.decodeToFile(dto.getBase64(), file); + String url = FileUtil.uploadFileToMediaServer(uploadUrl, file); + matchVO.setUrl(url); + // 保存人脸图片信息 + EduSmartWelcomeGuideRosterRelationStep relationStep = eduSmartWelcomeGuideRosterRelationStepService + .getOne(Wrappers.lambdaQuery(new EduSmartWelcomeGuideRosterRelationStep()) + .eq(EduSmartWelcomeGuideRosterRelationStep::getRelationId, dto.getRelationId()) + .eq(EduSmartWelcomeGuideRosterRelationStep::getStepId, dto.getStepId()) + ); + if (Objects.nonNull(relationStep)) { + relationStep.setStatus(AuditStatusEnum.PASS_STATUS.getStatus()); + relationStep.setUploadFileUrl(url); + } else { + relationStep = new EduSmartWelcomeGuideRosterRelationStep(); + relationStep.setDeptId(guideRoster.getDeptId()); + relationStep.setGuideId(dto.getGuideId()); + relationStep.setRosterId(guideRoster.getId()); + relationStep.setRelationId(dto.getRelationId()); + relationStep.setStepId(dto.getStepId()); + relationStep.setStatus(AuditStatusEnum.PASS_STATUS.getStatus()); + relationStep.setUploadFileUrl(url); + } + eduSmartWelcomeGuideRosterRelationStepService.saveOrUpdate(relationStep); + } + return matchVO; + } catch (Exception e) { + throw new FebsException(e instanceof FebsException ? e.getMessage() : "人脸对比失败"); + } finally { + if (Objects.nonNull(file)) { + cn.hutool.core.io.FileUtil.del(file); + } + } + + } + + @Override + public EduSmartWelcomeGuideRoster getUserQrCodeUrl(Long rosterId) { + EduSmartWelcomeGuideRoster roster = (EduSmartWelcomeGuideRoster) redisService + .hget(CachePrefixConstant.WELCOME_ROSTER, rosterId.toString()); + if (ObjectUtil.isNull(roster)) { + roster = eduSmartWelcomeGuideRosterService.getById(rosterId); + } + return roster; + } + + @Override + public String getPayQrCodeUrl(Long deptId) { + Dept dept = commonService.getDept(deptId); + if (Objects.isNull(dept)) { + throw new FebsException("学校信息错误"); + } + return welcomePayUrl + StringConstant.QUESTION_MARK + "deptId=" + dept.getDeptId() + + StringConstant.AMPERSAND + "appId=" + dept.getWxPublicAppId(); + } + + @Override + public IPage listRoster(RosterPageDTO dto) { + return eduSmartWelcomeGuideRosterRelationMapper.listRoster(dto.toPage(), dto); + } +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/ImportGuideRosterServiceImpl.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/ImportGuideRosterServiceImpl.java new file mode 100644 index 0000000..556bc02 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/smart/service/impl/ImportGuideRosterServiceImpl.java @@ -0,0 +1,171 @@ +package com.yida.data.school.smart.service.impl; + +import cc.mrbird.febs.common.redis.service.RedisService; +import cn.hutool.core.lang.UUID; +import cn.hutool.core.util.NumberUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.yida.data.common.core.common.ResultMsgType; +import com.yida.data.common.core.entity.CurrentUser; +import com.yida.data.common.core.entity.constant.CachePrefixConstant; +import com.yida.data.common.core.entity.smart.EduSmartWelcomeGuideRoster; +import com.yida.data.common.core.utils.FebsUtil; +import com.yida.data.common.core.utils.FileUtil; +import com.yida.data.common.core.utils.QrCodeUtil; +import com.yida.data.school.dto.smart.GuideRosterErrorExportDTO; +import com.yida.data.school.dto.smart.GuideRosterImportDTO; +import com.yida.data.school.smart.mapper.EduSmartWelcomeGuideRosterMapper; +import com.yida.data.school.smart.service.ImportGuideRosterService; +import com.yida.data.school.vo.smart.ImportRosterDataVO; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.ehcache.impl.internal.concurrent.ConcurrentHashMap; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import java.io.File; +import java.math.BigDecimal; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * 注释 + * + * @author ZYJ + * @date 2023/6/1 14:54 + */ +@Slf4j +@Service +@RequiredArgsConstructor +@Transactional(rollbackFor = Exception.class) +public class ImportGuideRosterServiceImpl implements ImportGuideRosterService { + + private final EduSmartWelcomeGuideRosterMapper eduSmartWelcomeGuideRosterMapper; + private final RedisService redisService; + + @Value("${febs.uploadUrl}") + private String uploadUrl; + + @Override + public void saveGuideRosterExcelData(ConcurrentHashMap concurrentHashMap, + List errorList, Long guideId, String uuid, + CurrentUser currentUser, Integer totalCount, Integer handleCount) { + + int temp = 0; + if (!CollectionUtils.isEmpty(concurrentHashMap)) { + // 保存前判断是否已存在 + for (Map.Entry entry : concurrentHashMap.entrySet()) { + temp++; + + GuideRosterErrorExportDTO dto = new GuideRosterErrorExportDTO(); + GuideRosterImportDTO importDTO = new GuideRosterImportDTO(); + File qrCodeFile = null; + try { + importDTO = entry.getValue(); + BeanUtils.copyProperties(importDTO, dto); + // 验证导入信息是否为空 + if (!checkRosterImportInfo(dto, importDTO)) { + errorList.add(dto); + continue; + } + // 验证学号在当前学校的学生表中是否重复 + EduSmartWelcomeGuideRoster exist = eduSmartWelcomeGuideRosterMapper.selectOne( + Wrappers.lambdaQuery(new EduSmartWelcomeGuideRoster()) + .eq(EduSmartWelcomeGuideRoster::getIdNumber, importDTO.getIdNumber()) + .eq(EduSmartWelcomeGuideRoster::getGuideId, guideId)); + + if (Objects.nonNull(exist)) { + log.error("身份证号码已存在: {}", JSONUtil.toJsonStr(importDTO)); + dto.setErrorMessage(ResultMsgType.ID_CARD_EXIST.getValue()); + errorList.add(dto); + continue; + } + // 保存指南花名册信息 + EduSmartWelcomeGuideRoster guideRoster = new EduSmartWelcomeGuideRoster(); + BeanUtils.copyProperties(importDTO, guideRoster); + guideRoster.setDeptId(Objects.requireNonNull(currentUser).getDeptId()); + guideRoster.setGuideId(guideId); + guideRoster.setGender(FebsUtil.getSexByIdCardNo(importDTO.getIdNumber())); + eduSmartWelcomeGuideRosterMapper.insert(guideRoster); + + // 判断指南二维码开启状态 +// EduSmartWelcomeGuide guide = eduSmartWelcomeGuideService.getById(guideId); +// if (Objects.nonNull(guide) && EnableStatusEnum.ENABLE_STATUS.getStatus() +// .equals(guide.getQrCodeEnableStatus())) { + // 转换二维码信息 + JSONObject obj = JSONUtil.parseObj(importDTO) + .set("rosterId", guideRoster.getId()) + .set("deptId", Objects.requireNonNull(currentUser).getDeptId()) + .set("guideId", guideId); + // 生成文件名称 + String fileName = UUID.randomUUID().toString(true) + ".png"; + String filePath = FileUtil.getLocalUploadAddress() + fileName; + QrCodeUtil.generateQrCodeImage(obj.toString(), 400, 400, filePath); + // 上传文件到媒资 + qrCodeFile = new File(filePath); + String qrCodeAddress = FileUtil.uploadFileToMediaServer(uploadUrl, qrCodeFile); + eduSmartWelcomeGuideRosterMapper.updateById( + EduSmartWelcomeGuideRoster.builder() + .id(guideRoster.getId()) + .qrCodeUrl(qrCodeAddress) + .build()); +// } + // TODO: 2023/10/18 后续优化花名册缓存信息 + // 缓存花名册信息 +// redisService.hset(CachePrefixConstant.WELCOME_ROSTER, guideRoster.getId().toString(), +// eduSmartWelcomeGuideRosterMapper.selectById(guideRoster.getId())); + } catch (Exception e) { + log.error("导入指南花名册失败: {}", JSONUtil.toJsonStr(importDTO), e); + dto.setErrorMessage("数据异常!"); + errorList.add(dto); + } finally { + if (Objects.nonNull(qrCodeFile)) { + cn.hutool.core.io.FileUtil.del(qrCodeFile); + } + // 计算百分比 + BigDecimal percent = NumberUtil + .div(new BigDecimal((temp + handleCount) * 100), new BigDecimal(totalCount), 2); + redisService.set(CachePrefixConstant.IMPORT_GUIDE_ROSTER_KEY + uuid, + ImportRosterDataVO.builder().percent(percent.intValue()).finish(0).key(uuid) + .build()); + } + } + } + } + + private boolean checkRosterImportInfo(GuideRosterErrorExportDTO dto, GuideRosterImportDTO importDTO) { + BeanUtils.copyProperties(importDTO, dto); + // 判断姓名是否为空 + if (!StringUtils.isNotBlank(importDTO.getFullName())) { + dto.setErrorMessage("姓名为空"); + return false; + } + // 判断身份证号码是否为空 + else if (!StringUtils.isNotBlank(importDTO.getIdNumber())) { + dto.setErrorMessage("身份证号码为空"); + return false; + } + // 判断录取专业是否为空 + else if (!StringUtils.isNotBlank(importDTO.getAdmittedDepartment())) { + dto.setErrorMessage("录取系部为空"); + return false; + } + // 判断录取专业是否为空 + else if (!StringUtils.isNotBlank(importDTO.getAdmittedMajor())) { + dto.setErrorMessage("录取专业为空"); + return false; + } + // 判断手机号码是否为空 + else if (!StringUtils.isNotBlank(importDTO.getMobile())) { + dto.setErrorMessage("手机号码为空"); + return false; + } + return true; + } +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/transaction/controller/EduApplyController.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/transaction/controller/EduApplyController.java index 4397422..a83917d 100644 --- a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/transaction/controller/EduApplyController.java +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/transaction/controller/EduApplyController.java @@ -4,20 +4,26 @@ import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.yida.data.common.core.annotation.ControllerLog; +import com.yida.data.common.core.common.ModuleName; import com.yida.data.common.core.common.ResultBean; import com.yida.data.common.core.entity.apply.EduApply; import com.yida.data.common.core.entity.apply.EduProductApply; +import com.yida.data.common.core.entity.system.enums.OperationLogTypeEnum; +import com.yida.data.log.annotation.OperationLog; import com.yida.data.school.transaction.mapper.EduProductApplyMapper; import com.yida.data.school.transaction.service.EduAppService; import com.yida.data.school.vo.transcation.EduApplyVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; /** @@ -34,7 +40,6 @@ public class EduApplyController { @ApiOperation("应用分页查询") @GetMapping("/listApply") - @ControllerLog(operation = "分页查询应用") public ResultBean> listApply(@ApiParam("app名字") @RequestParam String applyName, @ApiParam("当前页码") @RequestParam(defaultValue = "1") Integer pageNum, @ApiParam("页面大小") @RequestParam(defaultValue = "10") Integer pageSize) { @@ -47,7 +52,7 @@ public class EduApplyController { @ApiOperation("新增应用") @PostMapping("/insertApply") - @ControllerLog(operation = "新增应用") + @OperationLog(module = ModuleName.SCHOOL, methods = "新增应用", type = OperationLogTypeEnum.INSERT) public ResultBean insertApply(@ApiParam("应用名字") @RequestBody EduApplyVO applyFunction) { eduAppService.insertEduApplyService(applyFunction); return ResultBean.buildSuccess(); @@ -56,7 +61,7 @@ public class EduApplyController { @ApiOperation("修改应用") @PostMapping("/updateApply") - @ControllerLog(operation = "修改应用") + @OperationLog(module = ModuleName.SCHOOL, methods = "修改应用", type = OperationLogTypeEnum.UPDATE) public ResultBean upDataApply(@ApiParam("应用名字") @RequestBody EduApplyVO eduApply) { eduAppService.upDataApplyService(eduApply); return ResultBean.buildSuccess(); @@ -65,7 +70,7 @@ public class EduApplyController { @ApiOperation("删除应用") @GetMapping("/removeEduApply") - @ControllerLog(operation = "删除应用") + @OperationLog(module = ModuleName.SCHOOL, methods = "删除应用", type = OperationLogTypeEnum.DELETE) public ResultBean removeEduApply(@ApiParam("应用id") @RequestParam Long applyId) { List eduProductApplies = eduProductApplyMapper.selectList(Wrappers.lambdaQuery(new EduProductApply()) diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/transaction/controller/EduApplyFunctionController.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/transaction/controller/EduApplyFunctionController.java index 800ac31..217c5d2 100644 --- a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/transaction/controller/EduApplyFunctionController.java +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/transaction/controller/EduApplyFunctionController.java @@ -2,8 +2,11 @@ package com.yida.data.school.transaction.controller; import com.yida.data.common.core.annotation.ControllerLog; +import com.yida.data.common.core.common.ModuleName; import com.yida.data.common.core.common.ResultBean; import com.yida.data.common.core.entity.apply.EduApplyFunction; +import com.yida.data.common.core.entity.system.enums.OperationLogTypeEnum; +import com.yida.data.log.annotation.OperationLog; import com.yida.data.school.transaction.service.EduApplyFunctionService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -25,7 +28,7 @@ public class EduApplyFunctionController { @ApiOperation("新增应用功能") @PostMapping("/insertApplyFunction") - @ControllerLog(operation = "新增应用功能") + @OperationLog(module = ModuleName.TRANSATION, methods = "新增应用功能", type = OperationLogTypeEnum.INSERT) public ResultBean insertApply(@ApiParam("应用名字") @RequestParam EduApplyFunction eduApplyFunction) { eduApplyFunctionService.insertEduApplyFunctionService(eduApplyFunction); return ResultBean.buildSuccess(); @@ -34,7 +37,7 @@ public class EduApplyFunctionController { @ApiOperation("修改应用功能") @PostMapping("/updateApplyFunction") - @ControllerLog(operation = "修改应用功能") + @OperationLog(module = ModuleName.TRANSATION, methods = "修改应用功能", type = OperationLogTypeEnum.UPDATE) public ResultBean upDataApplyFunction(@ApiParam("应用名字") @RequestParam EduApplyFunction eduApplyFunction) { eduApplyFunctionService.upDataEduApplyFunctionService(eduApplyFunction); @@ -44,7 +47,7 @@ public class EduApplyFunctionController { @ApiOperation("删除应用功能") @GetMapping("/removeEduApplyFunction") - @ControllerLog(operation = "删除应用功能") + @OperationLog(module = ModuleName.TRANSATION, methods = "删除应用功能", type = OperationLogTypeEnum.DELETE) public ResultBean removeEduApply(@ApiParam("功能id") @RequestParam Long functionId) { eduApplyFunctionService.removeById(functionId); return ResultBean.buildSuccess(); diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/transaction/controller/EduProductController.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/transaction/controller/EduProductController.java index 8b97346..6d6dbed 100644 --- a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/transaction/controller/EduProductController.java +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/transaction/controller/EduProductController.java @@ -4,13 +4,16 @@ import cc.mrbird.febs.common.redis.service.RedisService; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.yida.data.common.core.annotation.ControllerLog; +import com.yida.data.common.core.common.ModuleName; import com.yida.data.common.core.common.ResultBean; import com.yida.data.common.core.entity.CurrentUser; import com.yida.data.common.core.entity.apply.EduProduct; import com.yida.data.common.core.entity.apply.EduProductApply; import com.yida.data.common.core.entity.constant.FebsConstant; +import com.yida.data.common.core.entity.system.enums.OperationLogTypeEnum; import com.yida.data.common.core.utils.Asserts; import com.yida.data.common.core.utils.FebsUtil; +import com.yida.data.log.annotation.OperationLog; import com.yida.data.school.dto.transaction.ListBuyStudentDTO; import com.yida.data.school.dto.transaction.ProductSelectDTO; import com.yida.data.school.transaction.service.EduProductApplyService; @@ -43,7 +46,6 @@ public class EduProductController { // @Secured({"ROLE_role:agent:normal", "ROLE_role:agent:admin"}) @ApiOperation("商品分页查询") @PostMapping("/listProduct") - @ControllerLog(operation = "商品分页查询") public ResultBean listProduct(@RequestBody ProductSelectDTO dto) { Page page = new Page(); page.setCurrent(dto.getCurrent()); @@ -53,14 +55,13 @@ public class EduProductController { @ApiOperation("查询商品详情") @GetMapping("/selectProduct") - @ControllerLog(operation = "商品详情查询") public ResultBean selectProduct(@ApiParam("商品id") @RequestParam Long productId) { return ResultBean.buildSuccess(eduProductService.getInfo(productId)); } @ApiOperation("修改商品") @PostMapping("/upDateProduct") - @ControllerLog(operation = "修改商品") + @OperationLog(module = ModuleName.PRODUCT, methods = "修改商品", type = OperationLogTypeEnum.INSERT) public ResultBean upDataProduct(@ApiParam("商品") @RequestBody EduProduct eduProduct) { Asserts.isTrue(eduProductService.count(Wrappers.lambdaQuery(new EduProduct()) .eq(EduProduct::getProductCode, eduProduct.getProductCode()) @@ -72,7 +73,7 @@ public class EduProductController { @ApiOperation("商品上架") @GetMapping("/upDateProductById") - @ControllerLog(operation = "修改商品") + @OperationLog(module = ModuleName.PRODUCT, methods = "商品上架", type = OperationLogTypeEnum.UPDATE) public ResultBean upDateProductById(@ApiParam("商品") @RequestParam("id") Long id) { EduProduct eduProduct = new EduProduct(); eduProduct.setProductId(id); @@ -83,7 +84,7 @@ public class EduProductController { @ApiOperation("下架商品") @GetMapping("/soldOutProduct") - @ControllerLog(operation = "下架商品") + @OperationLog(module = ModuleName.PRODUCT, methods = "下架商品", type = OperationLogTypeEnum.UPDATE) public ResultBean soldOutProduct(@ApiParam("商品") @RequestParam Long productId) { EduProduct eduProduct = new EduProduct(); eduProduct.setProductId(productId); @@ -96,7 +97,7 @@ public class EduProductController { @ApiOperation("新增商品") @PostMapping("/insertProduct") - @ControllerLog(operation = "新增商品") + @OperationLog(module = ModuleName.PRODUCT, methods = "新增商品", type = OperationLogTypeEnum.INSERT) public ResultBean insertProduct(@RequestBody EduProduct eduProduct) { Asserts.isTrue(eduProductService.count(Wrappers.lambdaQuery(new EduProduct()) .eq(EduProduct::getProductCode, eduProduct.getProductCode())) == 0, "商品编码重复,请修改后重试"); @@ -107,7 +108,7 @@ public class EduProductController { @ApiOperation("删除商品") @GetMapping("/removeProduct") - @ControllerLog(operation = "删除商品") + @OperationLog(module = ModuleName.PRODUCT, methods = "删除商品", type = OperationLogTypeEnum.DELETE) public ResultBean removeProduct(@ApiParam("商品id") @RequestParam Long productId) { eduProductService.removeEduProductService(productId); return ResultBean.buildSuccess(); @@ -115,7 +116,6 @@ public class EduProductController { @ApiOperation("手机端商品列表查询") @GetMapping("/selectProductList") - @ControllerLog(operation = "须知查询") public ResultBean listApply(@ApiParam("学校id") @RequestParam Long schoolId) { CurrentUser currentUser = FebsUtil.getCurrentUser(); assert currentUser != null; @@ -124,14 +124,13 @@ public class EduProductController { @ApiOperation("手机商品详情") @GetMapping("/selectProductAndApply") - @ControllerLog(operation = "新增须知") public ResultBean selectProductAndApply(@ApiParam("商品id") @RequestParam Long productId) { return ResultBean.buildSuccess(eduProductService.selectProductAndApply(productId)); } @ApiOperation("商品与应用取消关联") @GetMapping("/delEduProductApply") - @ControllerLog(operation = "商品与应用取消关联") + @OperationLog(module = ModuleName.PRODUCT, methods = "商品与应用取消关联", type = OperationLogTypeEnum.DELETE) public ResultBean delEduProductApply(@ApiParam("应用id") @RequestParam Long applyId) { eduProductApplyService.remove(Wrappers.lambdaQuery(new EduProductApply()) diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/transaction/controller/EduProductModelController.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/transaction/controller/EduProductModelController.java index e335ea9..9e6c8d6 100644 --- a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/transaction/controller/EduProductModelController.java +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/transaction/controller/EduProductModelController.java @@ -3,8 +3,11 @@ package com.yida.data.school.transaction.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.yida.data.common.core.annotation.ControllerLog; +import com.yida.data.common.core.common.ModuleName; import com.yida.data.common.core.common.ResultBean; import com.yida.data.common.core.entity.apply.EduProductModel; +import com.yida.data.common.core.entity.system.enums.OperationLogTypeEnum; +import com.yida.data.log.annotation.OperationLog; import com.yida.data.school.transaction.service.EduProductModelService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -26,7 +29,6 @@ public class EduProductModelController { @ApiOperation("须知查询") @GetMapping("/selectProductModel") - @ControllerLog(operation = "须知查询") public ResultBean listModel(@ApiParam("须知名字") @RequestParam String modelName, @RequestParam Integer pageNum, @RequestParam Integer pageSize) { @@ -38,7 +40,7 @@ public class EduProductModelController { @ApiOperation("新增须知") @PostMapping("/insertProductModel") - @ControllerLog(operation = "新增须知") + @OperationLog(module = ModuleName.PRODUCT, methods = "新增商品须知", type = OperationLogTypeEnum.INSERT) public ResultBean insertModel(@RequestBody EduProductModel eduProductModel) { eduProductModelService.insertEduProductModelService(eduProductModel); return ResultBean.buildSuccess(); @@ -47,7 +49,7 @@ public class EduProductModelController { @ApiOperation("修改须知") @PostMapping("/updateProductModel") - @ControllerLog(operation = "修改须知") + @OperationLog(module = ModuleName.PRODUCT, methods = "修改商品须知", type = OperationLogTypeEnum.UPDATE) public ResultBean upDataModel(@RequestBody EduProductModel eduProductModel) { eduProductModelService.updateEduProductModelService(eduProductModel); return ResultBean.buildSuccess(); @@ -56,7 +58,7 @@ public class EduProductModelController { @ApiOperation("删除须知") @GetMapping("/removeEduProductModel") - @ControllerLog(operation = "删除须知") + @OperationLog(module = ModuleName.PRODUCT, methods = "删除商品须知", type = OperationLogTypeEnum.DELETE) public ResultBean removeModel(@ApiParam("应用id") @RequestParam Integer modelId) { eduProductModelService.removeEduProductModelService(modelId); return ResultBean.buildSuccess(); diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/transaction/controller/EduProductNoticeStudentController.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/transaction/controller/EduProductNoticeStudentController.java index 6a2b9c4..d424a58 100644 --- a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/transaction/controller/EduProductNoticeStudentController.java +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/transaction/controller/EduProductNoticeStudentController.java @@ -1,16 +1,22 @@ package com.yida.data.school.transaction.controller; +import cc.mrbird.febs.common.redis.service.RedisService; +import cn.hutool.core.util.IdUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.yida.data.common.core.common.ResultBean; import com.yida.data.common.core.entity.apply.EduProductNoticeStudent; +import com.yida.data.common.core.entity.constant.CachePrefixConstant; import com.yida.data.common.core.utils.FebsUtil; import com.yida.data.school.dto.transaction.ListBuyStudentDTO; import com.yida.data.school.transaction.service.EduProductNoticeService; import com.yida.data.school.transaction.service.EduProductNoticeStudentService; +import com.yida.data.school.vo.transcation.DownStudentBuyDataVO; +import com.yida.data.user.vo.DownLoadStaffAttendanceRecordVO; import com.yida.data.user.vo.ListParentByStudentIdsVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.validation.annotation.Validated; @@ -36,6 +42,7 @@ public class EduProductNoticeStudentController { private final EduProductNoticeStudentService eduProductNoticeStudentService; private final EduProductNoticeService eduProductNoticeService; + private final RedisService redisService; @PostMapping("/batchPutNotice") @ApiOperation("批量催缴") @@ -54,8 +61,8 @@ public class EduProductNoticeStudentController { @ApiOperation("通知记录") @GetMapping("/findRecordList") public ResultBean> findRecordList(@RequestParam Long productId, - @RequestParam Integer size, - @RequestParam Integer pageNum) { + @RequestParam Integer size, + @RequestParam Integer pageNum) { Page page = new Page(); page.setSize(size); page.setCurrent(pageNum); @@ -65,8 +72,8 @@ public class EduProductNoticeStudentController { @ApiOperation("查询通知记录对应家长") @GetMapping("/findRecordParent") public ResultBean> findRecordParent(@RequestParam Long noticeId, - @RequestParam Integer size, - @RequestParam Integer pageNum) { + @RequestParam Integer size, + @RequestParam Integer pageNum) { Page page = new Page(); page.setSize(size); page.setCurrent(pageNum); @@ -92,8 +99,25 @@ public class EduProductNoticeStudentController { @ApiOperation("导出需要续费的学生") @ResponseBody @PostMapping("/studentBuyExport") - public void studentBuyExport(@RequestBody ListBuyStudentDTO listBuyStudentDTO, HttpServletResponse response) { - - eduProductNoticeStudentService.studentBuyExport(listBuyStudentDTO, response); + public ResultBean studentBuyExport(@RequestBody ListBuyStudentDTO listBuyStudentDTO, + HttpServletResponse response) { + String uuid = IdUtil.simpleUUID(); + DownStudentBuyDataVO vo = DownStudentBuyDataVO.builder() + .key(uuid) + .finish(0) + .totalNum(100) + .currentNum(0).build(); + redisService.hset(CachePrefixConstant.PRODUCT_BUY_DATA_DOWNLOAD, uuid, vo); + eduProductNoticeStudentService.studentBuyExport(listBuyStudentDTO, response, uuid); + return ResultBean.buildSuccess(vo); } + + + @ApiOperation("获取导出需要续费的学生进度") + @GetMapping("/getStudentBuyExportProgress") + public ResultBean getStudentBuyExportProgress(String key) { + return ResultBean.buildSuccess( + (DownStudentBuyDataVO) redisService.hget(CachePrefixConstant.PRODUCT_BUY_DATA_DOWNLOAD, key)); + } + } diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/transaction/controller/EduProductOrderController.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/transaction/controller/EduProductOrderController.java index 210ed53..aae6133 100644 --- a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/transaction/controller/EduProductOrderController.java +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/transaction/controller/EduProductOrderController.java @@ -4,12 +4,15 @@ import cc.mrbird.febs.common.redis.service.RedisService; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.yida.data.common.core.annotation.ControllerLog; +import com.yida.data.common.core.common.ModuleName; import com.yida.data.common.core.common.ResultBean; import com.yida.data.common.core.entity.CurrentUser; import com.yida.data.common.core.entity.apply.EduApplyProductOrder; import com.yida.data.common.core.entity.apply.EduApplyProductRefund; import com.yida.data.common.core.entity.constant.CachePrefixConstant; +import com.yida.data.common.core.entity.system.enums.OperationLogTypeEnum; import com.yida.data.common.core.utils.FebsUtil; +import com.yida.data.log.annotation.OperationLog; import com.yida.data.school.dto.transaction.EduApplyProductOrderDTO; import com.yida.data.school.transaction.service.EduProductOrderService; import com.yida.data.school.vo.transcation.PayInfoVO; @@ -33,14 +36,13 @@ public class EduProductOrderController { @ApiOperation("修改支付状态") @GetMapping("/upDateEduProductOrder") - @ControllerLog(operation = "修改支付状态") + @OperationLog(module = ModuleName.PRODUCT, methods = "修改支付状态", type = OperationLogTypeEnum.UPDATE) public ResultBean upDateEduProductOrder(@ApiParam("生成订单") @RequestParam EduApplyProductOrder eduApplyProductOrder) { return eduProductOrderService.updateProductOder(eduApplyProductOrder); } @ApiOperation("待付款/交易成功订单批量分页查询") @PostMapping("/selectPageListProductOrder") - @ControllerLog(operation = "待付款/交易成功订单批量分页查询") public ResultBean> selectPageListProductOrder(@ApiParam("订单查询条件") @RequestBody EduApplyProductOrderDTO dto) { Page page = new Page(); page.setSize(dto.getSize()); @@ -52,7 +54,6 @@ public class EduProductOrderController { @ApiOperation("手机端待付款/交易成功订单批量查询") @GetMapping("/selectListProductOrder") - @ControllerLog(operation = "待付款/交易成功订单批量分页查询") public ResultBean> selectListProductOrder(@ApiParam("用户手机号") @RequestParam String phone, @ApiParam("studentId") @RequestParam Long studentId) { CurrentUser currentUser = FebsUtil.getCurrentUser(); @@ -63,7 +64,7 @@ public class EduProductOrderController { @ApiOperation("生成订单") @GetMapping("/createOrder") - @ControllerLog(operation = "生成订单") + @OperationLog(module = ModuleName.PRODUCT, methods = "生成订单", type = OperationLogTypeEnum.INSERT) public ResultBean insertEduProductOrder(@ApiParam("商品id") Long productId, @ApiParam("学生id") Long[] studentId, @ApiParam("支付方式,0-微信jsapi,1-微信h5") Integer payType) { @@ -73,6 +74,7 @@ public class EduProductOrderController { @ApiOperation("发起支付") @GetMapping("/payOrder") + @OperationLog(module = ModuleName.PRODUCT, methods = "发起支付", type = OperationLogTypeEnum.INSERT) public ResultBean payOrder(String orderCode) { Object prepay = redisService.get(CachePrefixConstant.ORDER_FLAG + orderCode); PayInfoVO infoVO = eduProductOrderService.getWxJsSign(orderCode, prepay.toString()); @@ -82,6 +84,7 @@ public class EduProductOrderController { @ApiOperation("发起退款") @GetMapping("/refund") + @OperationLog(module = ModuleName.PRODUCT, methods = "发起退款", type = OperationLogTypeEnum.UPDATE) public ResultBean refund(EduApplyProductRefund refund) { eduProductOrderService.refund(refund, FebsUtil.getCurrentUser()); return ResultBean.buildSuccess(); @@ -112,13 +115,13 @@ public class EduProductOrderController { @ApiOperation("订单详情查询") @GetMapping("/selectEduProductOrder") - @ControllerLog(operation = "订单详情查询") public ResultBean selectEduProductOrder(@ApiParam("订单id") Long orderId) { return ResultBean.buildSuccess(eduProductOrderService.selectEduProductOrder(orderId)); } @ApiOperation("订单完成(前台支付完成后调用)") @GetMapping("/orderSuccess") + @OperationLog(module = ModuleName.PRODUCT, methods = "订单完成(前台支付完成后调用)", type = OperationLogTypeEnum.UPDATE) public ResultBean orderSuccess(@ApiParam("订单号") String orderCode) { eduProductOrderService.orderSuccess(orderCode); return ResultBean.buildSuccess(); diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/transaction/controller/InEduProductController.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/transaction/controller/InEduProductController.java index 471fb37..5424101 100644 --- a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/transaction/controller/InEduProductController.java +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/transaction/controller/InEduProductController.java @@ -1,21 +1,22 @@ package com.yida.data.school.transaction.controller; -import com.yida.data.common.core.annotation.ControllerLog; +import com.yida.data.common.core.common.ModuleName; import com.yida.data.common.core.common.ResultBean; import com.yida.data.common.core.entity.apply.EduProduct; +import com.yida.data.common.core.entity.system.enums.OperationLogTypeEnum; +import com.yida.data.log.annotation.OperationLog; import com.yida.data.school.transaction.service.EduProductNoticeService; import com.yida.data.school.transaction.service.EduProductService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; +import javax.annotation.Resource; import lombok.AllArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import javax.annotation.Resource; - /** * @author chenbo */ @@ -31,7 +32,7 @@ public class InEduProductController { @ApiOperation("商品上架") @GetMapping("/upDateProductById") - @ControllerLog(operation = "修改商品") + @OperationLog(module = ModuleName.PRODUCT, methods = "商品上架", type = OperationLogTypeEnum.UPDATE) public ResultBean upDateProductById(@ApiParam("商品") @RequestParam("id") Long id) { EduProduct eduProduct = new EduProduct(); eduProduct.setProductId(id); @@ -42,7 +43,7 @@ public class InEduProductController { @ApiOperation("发送商品催缴续费通知") @GetMapping("/productSendNotice") - @ControllerLog(operation = "发送商品催缴续费通知") + @OperationLog(module = ModuleName.PRODUCT, methods = "发送商品催缴续费通知", type = OperationLogTypeEnum.SELECT) public ResultBean productSendNotice(@ApiParam("通知id") @RequestParam("id") Long id) { eduProductNoticeService.productSendNotice(id); return ResultBean.buildSuccess(); @@ -50,7 +51,7 @@ public class InEduProductController { @ApiOperation("修改商品的状态为已失效") @GetMapping("/productMonitor") - @ControllerLog(operation = "修改商品的状态为已失效") + @OperationLog(module = ModuleName.PRODUCT, methods = "修改商品的状态为已失效", type = OperationLogTypeEnum.UPDATE) public ResultBean productMonitor() { eduProductNoticeService.productMonitor(); return ResultBean.buildSuccess(); diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/transaction/service/EduProductNoticeStudentService.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/transaction/service/EduProductNoticeStudentService.java index 1565701..c642f9e 100644 --- a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/transaction/service/EduProductNoticeStudentService.java +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/transaction/service/EduProductNoticeStudentService.java @@ -9,6 +9,7 @@ import com.yida.data.user.vo.ListParentByStudentIdsVO; import javax.servlet.http.HttpServletResponse; import java.util.List; +import org.springframework.scheduling.annotation.Async; /** * 催缴通知对应接收学生表 Service接口 @@ -17,6 +18,7 @@ import java.util.List; * @date 2021-09-03 15:33:47 */ public interface EduProductNoticeStudentService extends IService { + /** * 批量催缴 * @@ -38,7 +40,8 @@ public interface EduProductNoticeStudentService extends IService implements EduProductNoticeStudentService { + implements EduProductNoticeStudentService { private final EduProductNoticeStudentMapper eduProductNoticeStudentMapper; @Resource @@ -69,9 +75,14 @@ public class EduProductNoticeStudentServiceImpl extends ServiceImpl @Resource private EduProductMapper eduProductMapper; + private final RedisService redisService; + @Value("${febs.pageUrl}") private String pageUrl; + @Value("${febs.uploadUrl}") + private String uploadUrl; + @Override @Transactional(rollbackFor = Exception.class) public void batchPutNotice(List noticeStudents) { @@ -89,8 +100,8 @@ public class EduProductNoticeStudentServiceImpl extends ServiceImpl Long productId = noticeStudents.get(0).getProductId(); Long schoolId = eduProductService.getById(productId).getSchoolId(); - EduApp app = commonService.getAppByCodeAndSchool(AppConstant.PRODUCT_PARENT, null, - schoolId); + EduApp app = commonService.getAppByCodeAndSchool(AppConstant.INDEX_PARENT, null, + schoolId); String accessToken = wxUtil.getAccessToken(app.getWxCorpId(), app.getWxSecret()); //家长wxId @@ -113,7 +124,7 @@ public class EduProductNoticeStudentServiceImpl extends ServiceImpl @Override public IPage findRecordList(Page page, Long productId) { List list = eduProductNoticeService.list(Wrappers.lambdaQuery(new EduProductNotice()) - .eq(EduProductNotice::getProductId, productId)); + .eq(EduProductNotice::getProductId, productId)); if (CollectionUtil.isEmpty(list)) { return new Page<>(); @@ -140,7 +151,7 @@ public class EduProductNoticeStudentServiceImpl extends ServiceImpl } } List list = list(Wrappers.lambdaQuery(new EduProductNoticeStudent()) - .in(EduProductNoticeStudent::getNoticeId, noticeId)); + .in(EduProductNoticeStudent::getNoticeId, noticeId)); ArrayList studentIds = new ArrayList<>(); for (EduProductNoticeStudent eduProductNoticeStudent : list) { studentIds.add(eduProductNoticeStudent.getStudentId()); @@ -179,45 +190,83 @@ public class EduProductNoticeStudentServiceImpl extends ServiceImpl // 导出Excel EasyExcelUtil.exportExcelData(list, StudentNotBuyExportVO.class, "导出未购买导出数据", - ExcelTypeEnum.XLS, response); + ExcelTypeEnum.XLS, response); stopWatch.stop(); log.info("导出未购买学生数据总共耗时: {}", stopWatch.getTotalTimeSeconds() + "秒"); } + @Override - public void studentBuyExport(ListBuyStudentDTO listBuyStudentDTO, HttpServletResponse response) { - List list1 = eduProductMapper.listBuyStudent(listBuyStudentDTO); - List studentId = new ArrayList<>(); - for (EduProductNoticeVO eduProductNoticeVO : list1) { - studentId.add(eduProductNoticeVO.getStudentId()); + public void studentBuyExport(ListBuyStudentDTO listBuyStudentDTO, HttpServletResponse response, String uuid) { + File file = null; + String fileName = com.yida.data.common.core.utils.FileUtil.getLocalUploadAddress() + uuid + ".xlsx"; + file = new File(fileName); + + try { + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); + + List list1 = eduProductMapper.listBuyStudent(listBuyStudentDTO); + List studentId = new ArrayList<>(); + for (EduProductNoticeVO eduProductNoticeVO : list1) { + studentId.add(eduProductNoticeVO.getStudentId()); + } + ArrayList list = new ArrayList<>(); + + for (int i = 0; i < studentId.size(); i++) { + + log.info("学生ID:{}", studentId.get(i)); + + redisService.hset(CachePrefixConstant.PRODUCT_BUY_DATA_DOWNLOAD, uuid, DownStudentBuyDataVO.builder() + .key(uuid) + .finish(0) + .totalNum(studentId.size()) + .currentNum(i + 1).build()); + + EduStudent data = remoteStudentService.getStudentNoPermission(studentId.get(i)).getData(); + + StudentNotBuyExportVO studentNotBuyExportVO = new StudentNotBuyExportVO(); + studentNotBuyExportVO.setCampusName(ObjectUtil.isNull(data) ? "" : data.getCampusName()); + studentNotBuyExportVO.setSectionName(ObjectUtil.isNull(data) ? "" : data.getSectionName()); + studentNotBuyExportVO.setGradeName(ObjectUtil.isNull(data) ? "" : data.getGradeName()); + studentNotBuyExportVO.setClassName(ObjectUtil.isNull(data) ? "" : data.getClassName()); + studentNotBuyExportVO.setStudentName(ObjectUtil.isNull(data) ? "" : data.getStuName()); + studentNotBuyExportVO.setIndexNo((long) i + 1); + studentNotBuyExportVO.setStudentNumber(ObjectUtil.isNull(data) ? "" : data.getStuNumber()); + list.add(studentNotBuyExportVO); + } + + // 根据查询条件导出未购买学生数据 + // 导出数据 + EasyExcel.write(file) + .excelType(ExcelTypeEnum.XLSX) + // 这里放入动态头 + .head(StudentNotBuyExportVO.class).sheet("职工通行记录") + // 当然这里数据也可以用 List> 去传入 + .doWrite(list); + // 上传文件到媒资 + String fileUrl = com.yida.data.common.core.utils.FileUtil.uploadFileToMediaServer(uploadUrl, file); + + redisService + .hset(CachePrefixConstant.PRODUCT_BUY_DATA_DOWNLOAD, uuid, DownStudentBuyDataVO.builder() + .key(uuid) + .finish(1) + .filePath(fileUrl) + .totalNum(list.size()) + .currentNum(list.size()).build()); + +// // 导出Excel +// EasyExcelUtil.exportExcelData(list, StudentNotBuyExportVO.class, "导出需要已购买学生", +// ExcelTypeEnum.XLS, response); + stopWatch.stop(); + log.info("导出已购买学生数据总共耗时: {}", stopWatch.getTotalTimeSeconds() + "秒"); + } catch (IllegalStateException e) { + log.error("导出已购买学生数据出错:{}", e); + } finally { + if (Objects.nonNull(file)) { + cn.hutool.core.io.FileUtil.del(file); + } } - - ArrayList list = new ArrayList<>(); - - - for (int i = 0; i < studentId.size(); i++) { - EduStudent data = remoteStudentService.getStudentNoPermission(studentId.get(i)).getData(); - StudentNotBuyExportVO welcomeStudentExportDTO = new StudentNotBuyExportVO(); - welcomeStudentExportDTO.setCampusName(data.getCampusName()); - welcomeStudentExportDTO.setSectionName(data.getSectionName()); - welcomeStudentExportDTO.setGradeName(data.getGradeName()); - welcomeStudentExportDTO.setClassName(data.getClassName()); - welcomeStudentExportDTO.setStudentName(data.getStuName()); - welcomeStudentExportDTO.setIndexNo((long) i + 1); - welcomeStudentExportDTO.setStudentNumber(data.getStuNumber()); - list.add(welcomeStudentExportDTO); - } - - - StopWatch stopWatch = new StopWatch(); - stopWatch.start(); - // 根据查询条件导出未购买学生数据 - - // 导出Excel - EasyExcelUtil.exportExcelData(list, StudentNotBuyExportVO.class, "导出需要已购买学生", - ExcelTypeEnum.XLS, response); - stopWatch.stop(); - log.info("导出已购买学生数据总共耗时: {}", stopWatch.getTotalTimeSeconds() + "秒"); } @Override @@ -256,8 +305,8 @@ public class EduProductNoticeStudentServiceImpl extends ServiceImpl notBuyStudentIds.add(student.getId()); } - EduApp app = commonService.getAppByCodeAndSchool(AppConstant.PRODUCT_PARENT, null, - schoolId); + EduApp app = commonService.getAppByCodeAndSchool(AppConstant.INDEX_PARENT, null, + schoolId); String accessToken = wxUtil.getAccessToken(app.getWxCorpId(), app.getWxSecret()); //家长wxId diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/transaction/service/impl/EduProductOrderServiceImpl.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/transaction/service/impl/EduProductOrderServiceImpl.java index 5cd34b4..5a13770 100644 --- a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/transaction/service/impl/EduProductOrderServiceImpl.java +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/transaction/service/impl/EduProductOrderServiceImpl.java @@ -36,7 +36,6 @@ import com.yida.data.school.transaction.mapper.EduApplyProductOrderStudentMapper import com.yida.data.school.transaction.mapper.EduApplyProductRefundMapper; import com.yida.data.school.transaction.mapper.EduProductMapper; import com.yida.data.school.transaction.service.EduProductOrderService; -import com.yida.data.school.transaction.service.EduStudentApplyService; import com.yida.data.school.transaction.util.GuuidUtil; import com.yida.data.school.vo.transcation.EduProductOrderVO; import com.yida.data.school.vo.transcation.PayInfoVO; @@ -71,8 +70,6 @@ public class EduProductOrderServiceImpl extends ServiceImpl()); @Resource - private EduStudentApplyService eduStudentApplyService; - @Resource private EduProductMapper eduProductMapper; @Resource private EduApplyProductOrderStudentMapper eduApplyProductOrderStudentMapper; @@ -142,7 +139,8 @@ public class EduProductOrderServiceImpl extends ServiceImpl { EduApplyProductOrder order = baseMapper.getOrderByCode(orderCode); //EduProduct product = eduProductMapper.selectById(order.getProductId()); - if (order != null && order.getPraccticalMoney() > 0D && PayWay.WEIXIN.getValue().equals(order.getPayWay()) && "0,1" + if (order != null && order.getPraccticalMoney() > 0D && PayWay.WEI_XIN.getValue().equals(order.getPayWay()) && "0,1" .contains(order.getOrderStatus())) { boolean flag = false; EduPayWxConfig config = commonService.getPayWxConfigBySchool(order.getSchoolId()); @@ -498,21 +497,23 @@ public class EduProductOrderServiceImpl extends ServiceImpl realProductList = product.getRealProductList(); // 学生-应用关联关系 - List studentApplyList = new ArrayList<>(); +// List studentApplyList = new ArrayList<>(); for (EduApplyProductOrderStudent orderStudent : studentList) { // 删除学生订单缓存 - redisService.del(CachePrefixConstant.STUDENT_ORDER + orderStudent.getStudentId().toString() + "." + product.getProductId().toString()); - // 购买了应用 - if (CollUtil.isNotEmpty(applyList)) { - for (EduProductApply apply : applyList) { - EduStudentApply studentApply = new EduStudentApply(); - studentApply.setStudentId(orderStudent.getStudentId()); - studentApply.setApplyCode(apply.getApplyCode()); - studentApply.setStartTime(apply.getBeginValidDate().atTime(0, 0, 0)); - studentApply.setEndTime(apply.getEndValidDate().atTime(23, 59, 59)); - studentApplyList.add(studentApply); - } - } + redisService.del( + CachePrefixConstant.STUDENT_ORDER + orderStudent.getStudentId().toString() + "." + product.getProductId() + .toString()); +// // 购买了应用 +// if (CollUtil.isNotEmpty(applyList)) { +// for (EduProductApply apply : applyList) { +// EduStudentApply studentApply = new EduStudentApply(); +// studentApply.setStudentId(orderStudent.getStudentId()); +// studentApply.setApplyCode(apply.getApplyCode()); +// studentApply.setStartTime(apply.getBeginValidDate().atTime(0, 0, 0)); +// studentApply.setEndTime(apply.getEndValidDate().atTime(23, 59, 59)); +// studentApplyList.add(studentApply); +// } +// } // 购买了商品 if (CollUtil.isNotEmpty(realProductList)) { for (EduRealProduct realProduct : realProductList) { @@ -524,10 +525,10 @@ public class EduProductOrderServiceImpl extends ServiceImpl orderStudentList = - eduApplyProductOrderStudentMapper.selectList( - Wrappers.lambdaQuery(new EduApplyProductOrderStudent()) - .eq(EduApplyProductOrderStudent::getOrderId, order.getOrderId())); + eduApplyProductOrderStudentMapper.selectList( + Wrappers.lambdaQuery(new EduApplyProductOrderStudent()) + .eq(EduApplyProductOrderStudent::getOrderId, order.getOrderId())); if (CollUtil.isNotEmpty(orderStudentList)) { orderStudentList.forEach(student -> { // 删除学生订单缓存 - redisService.del(CachePrefixConstant.STUDENT_ORDER + student.getStudentId().toString() + "." + order.getProductId().toString()); + redisService.del( + CachePrefixConstant.STUDENT_ORDER + student.getStudentId().toString() + "." + order + .getProductId().toString()); }); } } diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/transaction/service/impl/Scheduler.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/transaction/service/impl/Scheduler.java index 4f6aa0b..c724d89 100644 --- a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/transaction/service/impl/Scheduler.java +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/transaction/service/impl/Scheduler.java @@ -49,7 +49,7 @@ public class Scheduler { List expireOrder = eduApplyProductOrderMapper.selectExpireOrder(LocalDateTime.now()); if (CollUtil.isNotEmpty(expireOrder)) { for (EduApplyProductOrder order : expireOrder) { - if (PayWay.WEIXIN.getValue().equals(order.getPayWay())) { + if (PayWay.WEI_XIN.getValue().equals(order.getPayWay())) { EduPayWxConfig config = commonService.getPayWxConfigBySchool(order.getSchoolId()); // 主动查询是否已经支付了 try { diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/controller/EduLeaveRequestProcessConfigApplicableDepartmentsController.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/controller/EduLeaveRequestProcessConfigApplicableDepartmentsController.java new file mode 100644 index 0000000..c060277 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/controller/EduLeaveRequestProcessConfigApplicableDepartmentsController.java @@ -0,0 +1,25 @@ +package com.yida.data.school.userLeave.controller; + +import com.yida.data.school.userLeave.service.EduLeaveRequestProcessConfigApplicableDepartmentsService; +import lombok.extern.slf4j.Slf4j; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + + +/** + * Controller + * + * @author wjm + * @date 2022-12-01 10:45:56 + */ +@Slf4j +@Validated +@RestController +@RequestMapping("eduLeaveRequestProcessConfigApplicableDepartments") +@RequiredArgsConstructor +public class EduLeaveRequestProcessConfigApplicableDepartmentsController { + + private final EduLeaveRequestProcessConfigApplicableDepartmentsService eduLeaveRequestProcessConfigApplicableDepartmentsService; + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/controller/EduLeaveRequestProcessConfigApprovalUserController.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/controller/EduLeaveRequestProcessConfigApprovalUserController.java new file mode 100644 index 0000000..08e954b --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/controller/EduLeaveRequestProcessConfigApprovalUserController.java @@ -0,0 +1,25 @@ +package com.yida.data.school.userLeave.controller; + +import com.yida.data.school.userLeave.service.EduLeaveRequestProcessConfigApprovalUserService; +import lombok.extern.slf4j.Slf4j; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + + +/** +* Controller +* +* @author wjm +* @date 2022-12-01 10:45:56 +*/ +@Slf4j +@Validated +@RestController +@RequestMapping("eduLeaveRequestProcessConfigApprovalUser") +@RequiredArgsConstructor +public class EduLeaveRequestProcessConfigApprovalUserController { + +private final EduLeaveRequestProcessConfigApprovalUserService eduLeaveRequestProcessConfigApprovalUserService; + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/controller/EduLeaveRequestProcessConfigController.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/controller/EduLeaveRequestProcessConfigController.java new file mode 100644 index 0000000..3b83793 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/controller/EduLeaveRequestProcessConfigController.java @@ -0,0 +1,67 @@ +package com.yida.data.school.userLeave.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.vdurmont.emoji.EmojiManager; +import com.yida.data.common.core.annotation.ControllerLog; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.leave.EduLeaveRequest; +import com.yida.data.common.core.entity.userLeave.EduLeaveRequestProcessConfig; +import com.yida.data.common.core.entity.userLeave.EduLeaveRequestUser; +import com.yida.data.school.dto.userLeave.EduLeaveRequestProcessConfigDTO; +import com.yida.data.school.userLeave.service.EduLeaveRequestProcessConfigService; +import com.yida.data.school.vo.userLeave.EduLeaveRequestProcessConfigVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import java.util.List; +import lombok.extern.slf4j.Slf4j; +import lombok.RequiredArgsConstructor; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +/** + * Controller + * + * @author wjm + * @date 2022-12-01 10:45:56 + */ +@Slf4j +@Validated +@RestController +@RequestMapping("eduLeaveRequestProcessConfig") +@RequiredArgsConstructor +@Api(tags = "请假管理") +public class EduLeaveRequestProcessConfigController { + + private final EduLeaveRequestProcessConfigService eduLeaveRequestProcessConfigService; + + + @ApiOperation("查询策略列表") + @GetMapping("findPageList") + public ResultBean> findPageList( + @RequestParam(required = false) @ApiParam("策略名称") String processName, + @RequestParam(required = true) @ApiParam("所属学校ID") Long schoolId, + @RequestParam(defaultValue = "1") Long pageNum, + @RequestParam(defaultValue = "10") Long pageSize) { + Page page = new Page<>(); + page.setSize(pageSize); + page.setCurrent(pageNum); + return ResultBean.buildSuccess(eduLeaveRequestProcessConfigService.findPageList(page, processName, schoolId)); + } + + @ApiOperation("新增/编辑请假策略") + @PostMapping("add") + public ResultBean add(@RequestBody EduLeaveRequestProcessConfigDTO dto) { + eduLeaveRequestProcessConfigService.add(dto); + return ResultBean.buildSuccess(); + } + + @ApiOperation("批量删除请假策略") + @PostMapping("/delBatch") + public ResultBean deleteBatch(@RequestBody List ids) { + eduLeaveRequestProcessConfigService.deleteBatch(ids); + return ResultBean.buildSuccess(); + } + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/controller/EduLeaveRequestProcessRecordController.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/controller/EduLeaveRequestProcessRecordController.java new file mode 100644 index 0000000..ea3f867 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/controller/EduLeaveRequestProcessRecordController.java @@ -0,0 +1,30 @@ +package com.yida.data.school.userLeave.controller; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.userLeave.EduLeaveRequestUser; +import com.yida.data.school.userLeave.service.EduLeaveRequestProcessRecordService; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import java.util.Collections; +import lombok.extern.slf4j.Slf4j; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +/** + * Controller + * + * @author wjm + * @date 2022-12-01 10:45:56 + */ +@Slf4j +@Validated +@RestController +@RequestMapping("eduLeaveRequestProcessRecord") +@RequiredArgsConstructor +public class EduLeaveRequestProcessRecordController { + + private final EduLeaveRequestProcessRecordService eduLeaveRequestProcessRecordService; +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/controller/EduLeaveRequestUserController.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/controller/EduLeaveRequestUserController.java new file mode 100644 index 0000000..d426308 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/controller/EduLeaveRequestUserController.java @@ -0,0 +1,170 @@ +package com.yida.data.school.userLeave.controller; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.vdurmont.emoji.EmojiManager; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.userLeave.EduLeaveRequestUser; +import com.yida.data.school.dto.userLeave.AuditRequestDTO; +import com.yida.data.school.dto.userLeave.LeaveRequestPageDTO; +import com.yida.data.school.userLeave.service.EduLeaveRequestUserService; +import com.yida.data.school.vo.userLeave.EduLeaveRequestStatisticsVO; +import com.yida.data.school.vo.userLeave.EduLeaveRequestUserVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import lombok.extern.slf4j.Slf4j; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + + +/** + * Controller + * + * @author wjm + * @date 2022-12-01 10:51:19 + */ +@Slf4j +@Validated +@RestController +@RequestMapping("eduLeaveRequestUser") +@RequiredArgsConstructor +@Api(tags = "请假管理") +public class EduLeaveRequestUserController { + + private final EduLeaveRequestUserService eduLeaveRequestUserService; + + @ApiOperation("查询请假统计信息") + @PostMapping("selectLeaveRequestStatistics") + public ResultBean selectLeaveRequestStatistics() { + EduLeaveRequestStatisticsVO vo = eduLeaveRequestUserService.selectLeaveRequestStatistics(); + return ResultBean.buildSuccess(vo); + } + + @ApiOperation("查询请假记录列表") + @PostMapping("findPageList") + public ResultBean> findPageList(@RequestBody LeaveRequestPageDTO dto) { + List statusList = new ArrayList<>(); + if (dto.getStatus() == 4) { + statusList.add(1); + statusList.add(2); + } else { + statusList.add(dto.getStatus()); + } + dto.setStatusList(statusList); + return ResultBean + .buildSuccess( + eduLeaveRequestUserService.findPageList(dto)); + } + + @ApiOperation("新增请假") + @PostMapping("add") + public ResultBean addLeave(@RequestBody EduLeaveRequestUser leaveRequestUser) { + //判断是否包含表情 + if (EmojiManager.containsEmoji(leaveRequestUser.getRequestReason())) { + return ResultBean.buildError("请假理由中不能包含表情,请重新输入请假理由"); + } + eduLeaveRequestUserService.addLeaveRequest(leaveRequestUser); + return ResultBean.buildSuccess(); + } + + @ApiOperation("请假审核") + @PostMapping("audit") + public ResultBean auditRequest(@RequestBody AuditRequestDTO dto) { + eduLeaveRequestUserService.auditRequest(dto); + return ResultBean.buildSuccess(); + } + + + @ApiOperation("获取单条请假详情") + @GetMapping("get") + public ResultBean getRequest(@RequestParam(required = true) @ApiParam("请假主体ID") Long requestId) { + return ResultBean.buildSuccess(eduLeaveRequestUserService.getRequest(requestId)); + } + + + @ApiOperation("我申请的请假条") + @GetMapping("findUserLeaveList") + public ResultBean> findUserLeaveList( + @RequestParam(required = true) @ApiParam("学生id") Long studentId, + @RequestParam(required = true) @ApiParam("请假类型:0教师请假,1学生请假") Integer requestType, + @RequestParam(required = true) @ApiParam("所属学校ID") Long schoolId, + @RequestParam(required = false) @ApiParam("0为未审核,空为全部,1为已通过,2为未通过,3审核中,4已失效,5全部") Integer status, + @RequestParam(defaultValue = "1") Integer pageNum, + @RequestParam(defaultValue = "10") Integer pageSize) { + + LeaveRequestPageDTO dto = new LeaveRequestPageDTO(); + dto.setStudentIdList(Collections.singletonList(studentId)); + dto.setRequestType(requestType); + dto.setSchoolId(schoolId); + dto.setPageNum(pageNum); + dto.setPageSize(pageSize); + + if (ObjectUtil.isNotNull(status)) { + dto.setStatusList(Collections.singletonList(status)); + } + + return ResultBean.buildSuccess(eduLeaveRequestUserService.findPageList(dto)); + } + + + @ApiOperation("我审批的请假条") + @GetMapping("findApprovalUserLeaveList") + public ResultBean> findApprovalUserLeaveList( + @RequestParam(required = true) @ApiParam("教师ID") Long userId, + @RequestParam(required = false) @ApiParam("请假类型:0教师请假,1学生请假") Integer requestType, + @RequestParam(required = false) @ApiParam("状态,0未处理,1已处理") Integer currentUserStatus, + @RequestParam(required = true) @ApiParam("所属学校ID") Long schoolId, + @RequestParam(required = false) @ApiParam("0未审核,1已通过,2未通过,3审核中,4已失效, 5全部") Integer status, + @RequestParam(defaultValue = "1") Long pageNum, + @RequestParam(defaultValue = "10") Long pageSize) { + Page page = new Page<>(); + page.setSize(pageSize); + page.setCurrent(pageNum); + +// List statusList = new ArrayList<>(); +// if (ObjectUtil.isNotNull(status)) { +// if (status == 5) { +// statusList.add(0); +// statusList.add(1); +// statusList.add(2); +// statusList.add(3); +// statusList.add(4); +// } else { +// statusList = Collections.singletonList(status); +// } +// } else { +// if(ObjectUtil.isNotNull(currentUserStatus)){ +// if (currentUserStatus == 0) { +// //待处理 +// statusList.add(0); +// statusList.add(3); +// } else if (currentUserStatus == 1) { +// statusList = null; +// } +// }else { +// statusList = null; +// } +// } + + return ResultBean + .buildSuccess( + eduLeaveRequestUserService + .findApprovalUserLeaveList(page, userId, requestType, schoolId, null, currentUserStatus)); + } + + @ApiOperation("测试模板消息") + @GetMapping("testTamplateCardNotice") + public ResultBean testTamplateCardNotice(String wxId, Long schoolId) { + eduLeaveRequestUserService.testTamplateCardNotice(wxId, schoolId); + return ResultBean.buildSuccess(); + } + + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/controller/in/InEduLeaveRequestUserController.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/controller/in/InEduLeaveRequestUserController.java new file mode 100644 index 0000000..7158759 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/controller/in/InEduLeaveRequestUserController.java @@ -0,0 +1,52 @@ +package com.yida.data.school.userLeave.controller.in; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.vdurmont.emoji.EmojiManager; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.userLeave.EduLeaveRequestUser; +import com.yida.data.school.dto.userLeave.AuditRequestDTO; +import com.yida.data.school.dto.userLeave.ListUserRequestDTO; +import com.yida.data.school.userLeave.service.EduLeaveRequestUserService; +import com.yida.data.school.vo.userLeave.EduLeaveRequestUserVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + + +/** + * Controller + * + * @author wjm + * @date 2022-12-01 10:51:19 + */ +@Slf4j +@Validated +@RestController +@RequestMapping("in/eduLeaveRequestUser") +@RequiredArgsConstructor +@Api(tags = "请假管理") +public class InEduLeaveRequestUserController { + + private final EduLeaveRequestUserService eduLeaveRequestUserService; + + @ApiOperation("查询用户是否请假") + @PostMapping("findList") + public ResultBean> findUserRequestList(@RequestBody ListUserRequestDTO dto) { + return ResultBean + .buildSuccess( + eduLeaveRequestUserService.findUserRequestList(dto)); + } +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/mapper/EduLeaveRequestProcessConfigApplicableDepartmentsMapper.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/mapper/EduLeaveRequestProcessConfigApplicableDepartmentsMapper.java new file mode 100644 index 0000000..568ea6e --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/mapper/EduLeaveRequestProcessConfigApplicableDepartmentsMapper.java @@ -0,0 +1,15 @@ +package com.yida.data.school.userLeave.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.userLeave.EduLeaveRequestProcessConfigApplicableDepartments; + +/** + * Mapper + * + * @author wjm + * @date 2022-12-01 10:45:56 + */ +public interface EduLeaveRequestProcessConfigApplicableDepartmentsMapper extends + BaseMapper { + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/mapper/EduLeaveRequestProcessConfigApprovalUserMapper.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/mapper/EduLeaveRequestProcessConfigApprovalUserMapper.java new file mode 100644 index 0000000..7abc9d7 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/mapper/EduLeaveRequestProcessConfigApprovalUserMapper.java @@ -0,0 +1,15 @@ +package com.yida.data.school.userLeave.mapper; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.userLeave.EduLeaveRequestProcessConfigApprovalUser; + +/** + * Mapper + * + * @author wjm + * @date 2022-12-01 10:45:56 + */ +public interface EduLeaveRequestProcessConfigApprovalUserMapper extends BaseMapper { + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/mapper/EduLeaveRequestProcessConfigMapper.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/mapper/EduLeaveRequestProcessConfigMapper.java new file mode 100644 index 0000000..db9e44b --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/mapper/EduLeaveRequestProcessConfigMapper.java @@ -0,0 +1,26 @@ +package com.yida.data.school.userLeave.mapper; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yida.data.common.core.entity.leave.EduLeaveRequest; +import com.yida.data.common.core.entity.userLeave.EduLeaveRequestProcessConfig; +import com.yida.data.school.vo.userLeave.EduLeaveRequestProcessConfigVO; +import java.time.LocalDateTime; +import java.util.List; +import org.apache.ibatis.annotations.Param; + +/** + * Mapper + * + * @author wjm + * @date 2022-12-01 10:45:56 + */ +public interface EduLeaveRequestProcessConfigMapper extends BaseMapper { + + Page findPage(@Param("page") Page page, + @Param("processName") String processName, @Param("schoolId") Long schoolId); + + List findConfigByDeptIds(@Param("deptIds") List deptIds, @Param("type") Integer type, + @Param("requestDays") Long requestDays); +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/mapper/EduLeaveRequestProcessConfigViewMapper.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/mapper/EduLeaveRequestProcessConfigViewMapper.java new file mode 100644 index 0000000..d0b5d8d --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/mapper/EduLeaveRequestProcessConfigViewMapper.java @@ -0,0 +1,16 @@ +package com.yida.data.school.userLeave.mapper; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.userLeave.EduLeaveRequestProcessConfig; +import com.yida.data.common.core.entity.userLeave.EduLeaveRequestProcessConfigView; + +/** + * Mapper + * + * @author wjm + * @date 2022-12-01 10:45:56 + */ +public interface EduLeaveRequestProcessConfigViewMapper extends BaseMapper { + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/mapper/EduLeaveRequestProcessRecordMapper.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/mapper/EduLeaveRequestProcessRecordMapper.java new file mode 100644 index 0000000..dac3150 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/mapper/EduLeaveRequestProcessRecordMapper.java @@ -0,0 +1,15 @@ +package com.yida.data.school.userLeave.mapper; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.userLeave.EduLeaveRequestProcessRecord; + +/** + * Mapper + * + * @author wjm + * @date 2022-12-01 10:45:56 + */ +public interface EduLeaveRequestProcessRecordMapper extends BaseMapper { + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/mapper/EduLeaveRequestUserMapper.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/mapper/EduLeaveRequestUserMapper.java new file mode 100644 index 0000000..c8b174e --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/mapper/EduLeaveRequestUserMapper.java @@ -0,0 +1,60 @@ +package com.yida.data.school.userLeave.mapper; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yida.data.common.core.entity.userLeave.EduLeaveRequestProcessConfig; +import com.yida.data.common.core.entity.userLeave.EduLeaveRequestUser; +import com.yida.data.school.dto.userLeave.LeaveRequestPageDTO; +import com.yida.data.school.dto.userLeave.ListUserRequestDTO; +import com.yida.data.school.vo.userLeave.EduLeaveRequestProcessConfigVO; +import com.yida.data.school.vo.userLeave.EduLeaveRequestUserVO; + +import java.time.LocalDateTime; +import java.util.List; + +import org.apache.ibatis.annotations.Param; + +/** + * Mapper + * + * @author wjm + * @date 2022-12-01 10:51:19 + */ +public interface EduLeaveRequestUserMapper extends BaseMapper { + +// Page findPage(@Param("page") Page page, +// @Param("requestUserName") String requestUserName, @Param("requestType") Integer requestType, +// @Param("schoolId") Long schoolId, @Param("statusList") List statusList, +// @Param("studentIdList") List studentIdList, @Param("idList") List idList); + + Page findPage(@Param("page") Page page, @Param("dto") LeaveRequestPageDTO dto); + + List findApprovalUserLeaveList( + @Param("userId") Long userId, @Param("requestType") Integer requestType, + @Param("schoolId") Long schoolId, @Param("statusList") List statusList, + @Param("currentUserStatusList") List currentUserStatusList, + @Param("createDate") LocalDateTime createDate); + + List findUserRequestList(@Param("dto") ListUserRequestDTO dto); + + /** + * 查询周统计 + * + * @param studentIdList 学生id集合 + * @return long + * @author ZYJ + * @date 2023/12/16 14:15 + */ + long selectWeekNumber(@Param("studentIdList") List studentIdList); + + /** + * 查询月统计 + * + * @param studentIdList 学生id集合 + * @return long + * @author ZYJ + * @date 2023/12/16 14:35 + */ + long selectMonthNumber(@Param("studentIdList") List studentIdList); +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/mapper/EduLeaveRequestUserViewMapper.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/mapper/EduLeaveRequestUserViewMapper.java new file mode 100644 index 0000000..83b6bf8 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/mapper/EduLeaveRequestUserViewMapper.java @@ -0,0 +1,16 @@ +package com.yida.data.school.userLeave.mapper; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.userLeave.EduLeaveRequestUserView; + + +/** + * Mapper + * + * @author wjm + * @date 2022-12-01 10:51:19 + */ +public interface EduLeaveRequestUserViewMapper extends BaseMapper { + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/service/EduLeaveRequestProcessConfigApplicableDepartmentsService.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/service/EduLeaveRequestProcessConfigApplicableDepartmentsService.java new file mode 100644 index 0000000..4ce6a8e --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/service/EduLeaveRequestProcessConfigApplicableDepartmentsService.java @@ -0,0 +1,16 @@ +package com.yida.data.school.userLeave.service; + + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.userLeave.EduLeaveRequestProcessConfigApplicableDepartments; + +/** + * Service接口 + * + * @author wjm + * @date 2022-12-01 10:45:56 + */ +public interface EduLeaveRequestProcessConfigApplicableDepartmentsService extends + IService { + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/service/EduLeaveRequestProcessConfigApprovalUserService.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/service/EduLeaveRequestProcessConfigApprovalUserService.java new file mode 100644 index 0000000..7e445c8 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/service/EduLeaveRequestProcessConfigApprovalUserService.java @@ -0,0 +1,14 @@ +package com.yida.data.school.userLeave.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.userLeave.EduLeaveRequestProcessConfigApprovalUser; + +/** + * Service接口 + * + * @author wjm + * @date 2022-12-01 10:45:56 + */ +public interface EduLeaveRequestProcessConfigApprovalUserService extends IService { + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/service/EduLeaveRequestProcessConfigService.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/service/EduLeaveRequestProcessConfigService.java new file mode 100644 index 0000000..7cbf876 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/service/EduLeaveRequestProcessConfigService.java @@ -0,0 +1,37 @@ +package com.yida.data.school.userLeave.service; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; + +import com.yida.data.common.core.entity.leave.EduLeaveRequest; +import com.yida.data.common.core.entity.userLeave.EduLeaveRequestProcessConfig; +import com.yida.data.school.dto.userLeave.EduLeaveRequestProcessConfigDTO; +import com.yida.data.school.vo.userLeave.EduLeaveRequestProcessConfigVO; +import java.util.List; + +/** + * Service接口 + * + * @author wjm + * @date 2022-12-01 10:45:56 + */ +public interface EduLeaveRequestProcessConfigService extends IService { + + void add(EduLeaveRequestProcessConfigDTO dto); + + void deleteBatch(List idList); + + Page findPageList(Page page, String processName, Long schoolId); + + /** + * 查询匹配策略 + * + * @param deptIds + * @param type + * @param requesUserDays + * @return + */ + List findConfigByDeptIds(List deptIds, Integer type, Long requesUserDays); + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/service/EduLeaveRequestProcessConfigViewService.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/service/EduLeaveRequestProcessConfigViewService.java new file mode 100644 index 0000000..d491706 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/service/EduLeaveRequestProcessConfigViewService.java @@ -0,0 +1,17 @@ +package com.yida.data.school.userLeave.service; + + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.userLeave.EduLeaveRequestProcessConfig; +import com.yida.data.common.core.entity.userLeave.EduLeaveRequestProcessConfigView; + +/** + * Service接口 + * + * @author wjm + * @date 2022-12-01 10:45:56 + */ +public interface EduLeaveRequestProcessConfigViewService extends IService { + + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/service/EduLeaveRequestProcessRecordService.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/service/EduLeaveRequestProcessRecordService.java new file mode 100644 index 0000000..b408429 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/service/EduLeaveRequestProcessRecordService.java @@ -0,0 +1,15 @@ +package com.yida.data.school.userLeave.service; + + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.userLeave.EduLeaveRequestProcessRecord; + +/** + * Service接口 + * + * @author wjm + * @date 2022-12-01 10:45:56 + */ +public interface EduLeaveRequestProcessRecordService extends IService { + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/service/EduLeaveRequestUserService.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/service/EduLeaveRequestUserService.java new file mode 100644 index 0000000..13e5a77 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/service/EduLeaveRequestUserService.java @@ -0,0 +1,80 @@ +package com.yida.data.school.userLeave.service; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.userLeave.EduLeaveRequestUser; +import com.yida.data.school.dto.userLeave.AuditRequestDTO; +import com.yida.data.school.dto.userLeave.LeaveRequestPageDTO; +import com.yida.data.school.dto.userLeave.ListUserRequestDTO; +import com.yida.data.school.dto.userLeave.SendStaffNoticeDTO; +import com.yida.data.school.vo.userLeave.EduLeaveRequestStatisticsVO; +import com.yida.data.school.vo.userLeave.EduLeaveRequestUserVO; +import org.springframework.scheduling.annotation.Async; + +import java.util.List; + +/** + * Service接口 + * + * @author wjm + * @date 2022-12-01 10:51:19 + */ +public interface EduLeaveRequestUserService extends IService { + + /** + * 查询请假统计信息 + * + * @return com.yida.data.school.vo.userLeave.EduLeaveRequestStatisticsVO + * @author ZYJ + * @date 2023/12/16 13:33 + */ + EduLeaveRequestStatisticsVO selectLeaveRequestStatistics(); + + Page findPageList(LeaveRequestPageDTO dto); + + /** + * 我审批的请假条 + * + * @param page + * @param userId + * @param requestType + * @param schoolId + * @param statusList + * @param currentUserStatus + * @return + */ + Page findApprovalUserLeaveList(Page page, Long userId, Integer requestType, + Long schoolId, + List statusList, + Integer currentUserStatus); + + + /** + * 新增请假 + * + * @param eduLeaveRequestUser + */ + void addLeaveRequest(EduLeaveRequestUser eduLeaveRequestUser); + + /** + * 审核请假 + * + * @param dto + */ + void auditRequest(AuditRequestDTO dto); + + /** + * 获取请假详情 + * + * @param requestId + * @return + */ + EduLeaveRequestUserVO getRequest(Long requestId); + + + void testTamplateCardNotice(String wxId, Long schoolId); + + + List findUserRequestList(ListUserRequestDTO dto); +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/service/EduLeaveRequestUserViewService.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/service/EduLeaveRequestUserViewService.java new file mode 100644 index 0000000..6c26159 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/service/EduLeaveRequestUserViewService.java @@ -0,0 +1,15 @@ +package com.yida.data.school.userLeave.service; + + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.userLeave.EduLeaveRequestUserView; + +/** + * Service接口 + * + * @author wjm + * @date 2022-12-01 10:51:19 + */ +public interface EduLeaveRequestUserViewService extends IService { + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/service/impl/EduLeaveRequestProcessConfigApplicableDepartmentsServiceImpl.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/service/impl/EduLeaveRequestProcessConfigApplicableDepartmentsServiceImpl.java new file mode 100644 index 0000000..571670b --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/service/impl/EduLeaveRequestProcessConfigApplicableDepartmentsServiceImpl.java @@ -0,0 +1,26 @@ +package com.yida.data.school.userLeave.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.userLeave.EduLeaveRequestProcessConfigApplicableDepartments; +import com.yida.data.school.userLeave.mapper.EduLeaveRequestProcessConfigApplicableDepartmentsMapper; +import com.yida.data.school.userLeave.service.EduLeaveRequestProcessConfigApplicableDepartmentsService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.annotation.Propagation; +import lombok.RequiredArgsConstructor; + +/** +* Service实现 +* +* @author wjm +* @date 2022-12-01 10:45:56 +*/ +@Service +@RequiredArgsConstructor +@Transactional(propagation = Propagation.SUPPORTS, readOnly = true) +public class EduLeaveRequestProcessConfigApplicableDepartmentsServiceImpl extends ServiceImpl + implements EduLeaveRequestProcessConfigApplicableDepartmentsService { + +private final EduLeaveRequestProcessConfigApplicableDepartmentsMapper eduLeaveRequestProcessConfigApplicableDepartmentsMapper; + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/service/impl/EduLeaveRequestProcessConfigApprovalUserServiceImpl.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/service/impl/EduLeaveRequestProcessConfigApprovalUserServiceImpl.java new file mode 100644 index 0000000..c603d8d --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/service/impl/EduLeaveRequestProcessConfigApprovalUserServiceImpl.java @@ -0,0 +1,26 @@ +package com.yida.data.school.userLeave.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.userLeave.EduLeaveRequestProcessConfigApprovalUser; +import com.yida.data.school.userLeave.mapper.EduLeaveRequestProcessConfigApprovalUserMapper; +import com.yida.data.school.userLeave.service.EduLeaveRequestProcessConfigApprovalUserService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.annotation.Propagation; +import lombok.RequiredArgsConstructor; + +/** +* Service实现 +* +* @author wjm +* @date 2022-12-01 10:45:56 +*/ +@Service +@RequiredArgsConstructor +@Transactional(propagation = Propagation.SUPPORTS, readOnly = true) +public class EduLeaveRequestProcessConfigApprovalUserServiceImpl extends ServiceImpl + implements EduLeaveRequestProcessConfigApprovalUserService { + +private final EduLeaveRequestProcessConfigApprovalUserMapper eduLeaveRequestProcessConfigApprovalUserMapper; + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/service/impl/EduLeaveRequestProcessConfigServiceImpl.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/service/impl/EduLeaveRequestProcessConfigServiceImpl.java new file mode 100644 index 0000000..1e16d7b --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/service/impl/EduLeaveRequestProcessConfigServiceImpl.java @@ -0,0 +1,138 @@ +package com.yida.data.school.userLeave.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.userLeave.EduLeaveRequestProcessConfig; +import com.yida.data.common.core.entity.userLeave.EduLeaveRequestProcessConfigApplicableDepartments; +import com.yida.data.common.core.entity.userLeave.EduLeaveRequestProcessConfigApprovalUser; +import com.yida.data.common.core.entity.userLeave.EduLeaveRequestProcessConfigView; +import com.yida.data.school.dto.userLeave.EduLeaveRequestProcessConfigDTO; +import com.yida.data.school.userLeave.mapper.EduLeaveRequestProcessConfigApprovalUserMapper; +import com.yida.data.school.userLeave.mapper.EduLeaveRequestProcessConfigMapper; +import com.yida.data.school.userLeave.service.EduLeaveRequestProcessConfigApplicableDepartmentsService; +import com.yida.data.school.userLeave.service.EduLeaveRequestProcessConfigApprovalUserService; +import com.yida.data.school.userLeave.service.EduLeaveRequestProcessConfigService; +import com.yida.data.school.userLeave.service.EduLeaveRequestProcessConfigViewService; +import com.yida.data.school.vo.userLeave.EduLeaveRequestProcessConfigVO; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.annotation.Propagation; +import lombok.RequiredArgsConstructor; + +/** + * Service实现 + * + * @author wjm + * @date 2022-12-01 10:45:56 + */ +@Service +@RequiredArgsConstructor +@Transactional(propagation = Propagation.SUPPORTS, readOnly = true) +public class EduLeaveRequestProcessConfigServiceImpl extends ServiceImpl + implements EduLeaveRequestProcessConfigService { + + private final EduLeaveRequestProcessConfigMapper eduLeaveRequestProcessConfigMapper; + + private final EduLeaveRequestProcessConfigApprovalUserService eduLeaveRequestProcessConfigApprovalUserService; + + private final EduLeaveRequestProcessConfigApplicableDepartmentsService eduLeaveRequestProcessConfigApplicableDepartmentsService; + + private final EduLeaveRequestProcessConfigViewService eduLeaveRequestProcessConfigViewService; + + + @Override + public void add(EduLeaveRequestProcessConfigDTO dto) { + if (ObjectUtil.isNotNull(dto.getId())) { + deleteBatch(Collections.singletonList(dto.getId())); + dto.setId(null); + } + EduLeaveRequestProcessConfig config = new EduLeaveRequestProcessConfig(); + BeanUtils.copyProperties(dto, config); + + //保存流程主体 + eduLeaveRequestProcessConfigMapper.insert(config); + + //保存流程步骤 + List eduLeaveRequestProcessConfigApprovalUserList = new ArrayList<>(); + + int index = 0; + dto.getEduLeaveRequestProcessConfigViewList().forEach(eduLeaveRequestProcessConfigView -> { + eduLeaveRequestProcessConfigView.setProcessId(config.getId()); + //保存流程步骤 + eduLeaveRequestProcessConfigViewService.save(eduLeaveRequestProcessConfigView); + + eduLeaveRequestProcessConfigView.getEduLeaveRequestProcessConfigApprovalUserList().forEach(user -> { + user.setProcessId(config.getId()); + user.setViewId(eduLeaveRequestProcessConfigView.getId()); + eduLeaveRequestProcessConfigApprovalUserList.add(user); + }); + }); + eduLeaveRequestProcessConfigApprovalUserService.saveBatch(eduLeaveRequestProcessConfigApprovalUserList); + + //保存适用人员部门 + List eduLeaveRequestProcessConfigApplicableDepartmentsList = new ArrayList<>(); + dto.getApplicableDepartmentsList().forEach(eduLeaveRequestProcessConfigApplicableDepartments -> { + eduLeaveRequestProcessConfigApplicableDepartments.setProcessId(config.getId()); + eduLeaveRequestProcessConfigApplicableDepartmentsList.add(eduLeaveRequestProcessConfigApplicableDepartments); + }); + eduLeaveRequestProcessConfigApplicableDepartmentsService + .saveBatch(eduLeaveRequestProcessConfigApplicableDepartmentsList); + + } + + @Override + public void deleteBatch(List idList) { + idList.forEach(id -> { + eduLeaveRequestProcessConfigApprovalUserService.remove( + Wrappers.lambdaQuery(new EduLeaveRequestProcessConfigApprovalUser()) + .eq(EduLeaveRequestProcessConfigApprovalUser::getProcessId, id)); + eduLeaveRequestProcessConfigApplicableDepartmentsService + .remove(Wrappers.lambdaQuery(new EduLeaveRequestProcessConfigApplicableDepartments()) + .eq(EduLeaveRequestProcessConfigApplicableDepartments::getProcessId, id)); + eduLeaveRequestProcessConfigViewService.remove(Wrappers.lambdaQuery(new EduLeaveRequestProcessConfigView()) + .eq(EduLeaveRequestProcessConfigView::getProcessId, id)); + + this.remove(Wrappers.lambdaQuery(new EduLeaveRequestProcessConfig()) + .eq(EduLeaveRequestProcessConfig::getId, id)); + }); + } + + @Override + public Page findPageList(Page page, String processName, + Long schoolId) { + Page returnPage = eduLeaveRequestProcessConfigMapper + .findPage(page, processName, schoolId); + returnPage.getRecords().forEach(eduLeaveRequestProcessConfigVO -> { + List eduLeaveRequestProcessConfigViewList = eduLeaveRequestProcessConfigViewService + .list(Wrappers.lambdaQuery(new EduLeaveRequestProcessConfigView()) + .eq(EduLeaveRequestProcessConfigView::getProcessId, eduLeaveRequestProcessConfigVO.getId())); + eduLeaveRequestProcessConfigViewList.forEach(eduLeaveRequestProcessConfigView -> { + List approvalUserList = eduLeaveRequestProcessConfigApprovalUserService + .list(Wrappers.lambdaQuery(new EduLeaveRequestProcessConfigApprovalUser()) + .eq(EduLeaveRequestProcessConfigApprovalUser::getViewId, eduLeaveRequestProcessConfigView.getId())); + eduLeaveRequestProcessConfigView.setEduLeaveRequestProcessConfigApprovalUserList(approvalUserList); + }); + + List applicableDepartmentsList = eduLeaveRequestProcessConfigApplicableDepartmentsService + .list(Wrappers.lambdaQuery(new EduLeaveRequestProcessConfigApplicableDepartments()) + .eq(EduLeaveRequestProcessConfigApplicableDepartments::getProcessId, eduLeaveRequestProcessConfigVO.getId())); + + eduLeaveRequestProcessConfigVO.setEduLeaveRequestProcessConfigViewList(eduLeaveRequestProcessConfigViewList); + eduLeaveRequestProcessConfigVO.setApplicableDepartmentsList(applicableDepartmentsList); + }); + return returnPage; + } + + @Override + public List findConfigByDeptIds(List deptIds, Integer type, Long requestDays) { + return baseMapper.findConfigByDeptIds(deptIds, type, requestDays); + } + + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/service/impl/EduLeaveRequestProcessConfigViewServiceImpl.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/service/impl/EduLeaveRequestProcessConfigViewServiceImpl.java new file mode 100644 index 0000000..d5d0384 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/service/impl/EduLeaveRequestProcessConfigViewServiceImpl.java @@ -0,0 +1,26 @@ +package com.yida.data.school.userLeave.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.userLeave.EduLeaveRequestProcessConfigView; +import com.yida.data.school.userLeave.mapper.EduLeaveRequestProcessConfigViewMapper; +import com.yida.data.school.userLeave.service.EduLeaveRequestProcessConfigViewService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +/** + * Service实现 + * + * @author wjm + * @date 2022-12-01 10:45:56 + */ +@Service +@RequiredArgsConstructor +@Transactional(propagation = Propagation.SUPPORTS, readOnly = true) +public class EduLeaveRequestProcessConfigViewServiceImpl extends ServiceImpl + implements + EduLeaveRequestProcessConfigViewService { + + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/service/impl/EduLeaveRequestProcessRecordServiceImpl.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/service/impl/EduLeaveRequestProcessRecordServiceImpl.java new file mode 100644 index 0000000..31e858c --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/service/impl/EduLeaveRequestProcessRecordServiceImpl.java @@ -0,0 +1,28 @@ +package com.yida.data.school.userLeave.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.userLeave.EduLeaveRequestProcessRecord; +import com.yida.data.school.userLeave.mapper.EduLeaveRequestProcessRecordMapper; +import com.yida.data.school.userLeave.service.EduLeaveRequestProcessRecordService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.annotation.Propagation; +import lombok.RequiredArgsConstructor; + +import java.util.List; + +/** +* Service实现 +* +* @author wjm +* @date 2022-12-01 10:45:56 +*/ +@Service +@RequiredArgsConstructor +@Transactional(propagation = Propagation.SUPPORTS, readOnly = true) +public class EduLeaveRequestProcessRecordServiceImpl extends ServiceImpl + implements EduLeaveRequestProcessRecordService { + +private final EduLeaveRequestProcessRecordMapper eduLeaveRequestProcessRecordMapper; + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/service/impl/EduLeaveRequestUserServiceImpl.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/service/impl/EduLeaveRequestUserServiceImpl.java new file mode 100644 index 0000000..bba67c3 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/service/impl/EduLeaveRequestUserServiceImpl.java @@ -0,0 +1,1381 @@ +package com.yida.data.school.userLeave.service.impl; + +import cc.mrbird.febs.common.redis.service.RedisService; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.LocalDateTimeUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.attendance.dto.AddLeaveRequestStrategyDTO; +import com.yida.data.attendance.feign.RemoteAttendanceStrategyService; +import com.yida.data.common.core.entity.constant.AppConstant; +import com.yida.data.common.core.entity.constant.CachePrefixConstant; +import com.yida.data.common.core.entity.constant.NoticeTypeConstant; +import com.yida.data.common.core.entity.notice.qywx.TemplateCardStaffNotice; +import com.yida.data.common.core.entity.notice.qywx.TextSchoolNotice; +import com.yida.data.common.core.entity.notice.qywx.inside.TemplateCardNotice; +import com.yida.data.common.core.entity.notice.qywx.inside.Text; +import com.yida.data.common.core.entity.notice.qywx.inside.templateCard.CardAction; +import com.yida.data.common.core.entity.notice.qywx.inside.templateCard.HorizontalContent; +import com.yida.data.common.core.entity.notice.qywx.inside.templateCard.Jump; +import com.yida.data.common.core.entity.notice.qywx.inside.templateCard.MainTitle; +import com.yida.data.common.core.entity.system.Dept; +import com.yida.data.common.core.entity.system.EduApp; +import com.yida.data.common.core.entity.system.enums.RoleEnum; +import com.yida.data.common.core.entity.system.enums.SchoolNatureEnum; +import com.yida.data.common.core.entity.user.EduStaff; +import com.yida.data.common.core.entity.user.EduStaffDept; +import com.yida.data.common.core.entity.user.EduStudent; +import com.yida.data.common.core.entity.user.EduUserDept; +import com.yida.data.common.core.entity.userLeave.EduLeaveRequestProcessConfig; +import com.yida.data.common.core.entity.userLeave.EduLeaveRequestProcessConfigApprovalUser; +import com.yida.data.common.core.entity.userLeave.EduLeaveRequestProcessConfigView; +import com.yida.data.common.core.entity.userLeave.EduLeaveRequestProcessRecord; +import com.yida.data.common.core.entity.userLeave.EduLeaveRequestUser; +import com.yida.data.common.core.entity.userLeave.EduLeaveRequestUserView; +import com.yida.data.common.core.enums.RoleName; +import com.yida.data.common.core.enums.UserTypeEnum; +import com.yida.data.common.core.enums.leave.ApprovalResultEnum; +import com.yida.data.common.core.enums.leave.AuditModeEnum; +import com.yida.data.common.core.enums.leave.LeaveRequestTypeEnum; +import com.yida.data.common.core.exception.FebsException; +import com.yida.data.common.core.utils.FebsUtil; +import com.yida.data.common.core.utils.ThreadPoolUtil; +import com.yida.data.common.core.utils.WxUtil; +import com.yida.data.common.service.CommonService; +import com.yida.data.school.dto.userLeave.AuditRequestDTO; +import com.yida.data.school.dto.userLeave.LeaveRequestPageDTO; +import com.yida.data.school.dto.userLeave.ListUserRequestDTO; +import com.yida.data.school.dto.userLeave.SendStaffNoticeDTO; +import com.yida.data.school.userLeave.mapper.EduLeaveRequestUserMapper; +import com.yida.data.school.userLeave.service.EduLeaveRequestProcessConfigApprovalUserService; +import com.yida.data.school.userLeave.service.EduLeaveRequestProcessConfigService; +import com.yida.data.school.userLeave.service.EduLeaveRequestProcessConfigViewService; +import com.yida.data.school.userLeave.service.EduLeaveRequestProcessRecordService; +import com.yida.data.school.userLeave.service.EduLeaveRequestUserService; +import com.yida.data.school.userLeave.service.EduLeaveRequestUserViewService; +import com.yida.data.school.vo.userLeave.EduLeaveRequestStatisticsVO; +import com.yida.data.school.vo.userLeave.EduLeaveRequestUserVO; +import com.yida.data.system.feign.RemoteDeptService; +import com.yida.data.user.dto.ListStaffDTO; +import com.yida.data.user.dto.ListStudentDTO; +import com.yida.data.user.feign.RemoteStaffService; +import com.yida.data.user.feign.RemoteStudentService; +import com.yida.data.user.feign.RemoteTeacherService; +import com.yida.data.user.feign.RemoteUserDeptService; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Objects; +import java.util.concurrent.ExecutorService; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.ApplicationContext; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * Service实现 + * + * @author wjm + * @date 2022-12-01 10:51:19 + */ +@Slf4j +@Service +@RequiredArgsConstructor +@Transactional(rollbackFor = Exception.class) +public class EduLeaveRequestUserServiceImpl extends ServiceImpl + implements EduLeaveRequestUserService { + + private final EduLeaveRequestProcessConfigService eduLeaveRequestProcessConfigService; + private final EduLeaveRequestProcessConfigApprovalUserService eduLeaveRequestProcessConfigApprovalUserService; + private final EduLeaveRequestProcessRecordService eduLeaveRequestProcessRecordService; + private final EduLeaveRequestProcessConfigViewService eduLeaveRequestProcessConfigViewService; + private final EduLeaveRequestUserViewService eduLeaveRequestUserViewService; + + private final RemoteStudentService remoteStudentService; + private final RemoteStaffService remoteStaffService; + private final RemoteDeptService remoteDeptService; + private final RemoteUserDeptService remoteUserDeptService; + private final RemoteTeacherService remoteTeacherService; + private final RemoteAttendanceStrategyService remoteAttendanceStrategyService; + + private final WxUtil wxUtil; + private final RedisService redisService; + private final CommonService commonService; + + @Value("${febs.teacherLeaveRequestUrl}") + private String teacherLeaveRequestUrl; + + @Value("${febs.studentLeaveRequestUrl}") + private String studentLeaveRequestUrl; + + @Autowired + ApplicationContext applicationContext; + + private static final ExecutorService ADD_LEAVE_REQUEST_POOL = + ThreadPoolUtil.getThreadPool("add-leave-request-pool-%d"); + + @Override + public EduLeaveRequestStatisticsVO selectLeaveRequestStatistics() { + // 学生id + List studentIdList; + // 查询权限对应的班级的学生 + String rolePerms = FebsUtil.getCurrentUser().getRolePerms(); + // 查询学生条件 + ListStudentDTO param = new ListStudentDTO(); + param.setOnlyId(true); + param.setIsQueryParent(false); + param.setIsQuerySchoolName(false); + param.setIsQueryUserDept(false); + // 非学校管理员 + if (!rolePerms.contains(RoleEnum.ROLE_SCHOOL_PRINCIPAL.getValue())) { + List classIdList = remoteStaffService.listClassIdByStaffId().getData(); + param.setClassIds(classIdList); + } else { + param.setSchoolId(FebsUtil.getDeptId()); + } + studentIdList = remoteStudentService.listStudent(param).getData().stream().map(EduStudent::getId) + .collect(Collectors.toList()); + if (CollUtil.isEmpty(studentIdList)) { + studentIdList = new ArrayList<>(); + studentIdList.add(-1L); + } + // 周统计 + long weekNumber = baseMapper.selectWeekNumber(studentIdList); + // 月统计 + long monthNumber = baseMapper.selectMonthNumber(studentIdList); + return EduLeaveRequestStatisticsVO.builder() + .weekNumber(weekNumber) + .monthNumber(monthNumber) + .build(); + } + + @Override + public Page findPageList(LeaveRequestPageDTO dto) { +// dto.setSelectStudentId(0); +// //查询权限 +// if (CollUtil.isEmpty(dto.getStudentIdList()) && ObjectUtil +// .equals(UserTypeEnum.PARENT_USER_TYPE.getType(), dto.getRequestType())) { +// // 查询学生条件 +// ListStudentDTO param = new ListStudentDTO(); +// param.setOnlyId(true); +// param.setIsQueryParent(false); +// param.setIsQuerySchoolName(false); +// param.setIsQueryUserDept(false); +// // 查询权限对应的班级的学生 +// String rolePerms = FebsUtil.getCurrentUser().getRolePerms(); +// if (Objects.nonNull(dto.getCampusId())) { +// param.setCampusId(dto.getCampusId()); +// param.setSectionId(dto.getSectionId()); +// param.setGradeId(dto.getGradeId()); +// param.setClassId(dto.getClassId()); +// List studentIdList = remoteStudentService.listStudent(param).getData().stream().map(EduStudent::getId) +// .collect(Collectors.toList()); +// dto.setStudentIdList(studentIdList); +// dto.setSelectStudentId(1); +// } else { +// // 非学校管理员 +// if (!rolePerms.contains(RoleEnum.ROLE_SCHOOL_PRINCIPAL.getValue())) { +// List classIdList = remoteStaffService.listClassIdByStaffId().getData(); +// param.setClassIds(classIdList); +// List studentIdList = remoteStudentService.listStudent(param).getData().stream().map(EduStudent::getId) +// .collect(Collectors.toList()); +// dto.setStudentIdList(studentIdList); +// dto.setSelectStudentId(1); +// } +// } +// } +// if (CollUtil.isEmpty(dto.getStudentIdList())) { +// dto.setStudentIdList(Collections.singletonList(-1L)); +// } + //查询权限 + if (CollUtil.isEmpty(dto.getStudentIdList()) && ObjectUtil + .equals(UserTypeEnum.PARENT_USER_TYPE.getType(), dto.getRequestType())) { + //查询权限对应的班级的学生 + String rolePerms = FebsUtil.getCurrentUser().getRolePerms(); + //非学校管理员 + if (!rolePerms.contains(RoleEnum.ROLE_SCHOOL_PRINCIPAL.getValue())) { + List classIdList = remoteStaffService.listClassIdByStaffId().getData(); + ListStudentDTO param = new ListStudentDTO(); + param.setClassIds(classIdList); + param.setIsQueryParent(false); + param.setIsQuerySchoolName(false); + param.setIsQueryUserDept(false); + List studentIdList = remoteStudentService.listStudent(param).getData().stream().map(EduStudent::getId) + .collect(Collectors.toList()); + dto.setStudentIdList(studentIdList); + } + } + // 查询请假列表 + Page eduLeaveRequestUserPage = baseMapper.findPage(dto.toPage(), dto); + List records = eduLeaveRequestUserPage.getRecords(); + for (EduLeaveRequestUser eduLeaveRequestUser : records) { + if (eduLeaveRequestUser.getRequestType() == 1) { + //学生 + EduStudent student = (EduStudent) redisService + .hget(CachePrefixConstant.STUDENT_DATA, eduLeaveRequestUser.getUserId().toString()); + if (student == null) { + student = remoteStudentService.getStudentNoPermission(eduLeaveRequestUser.getUserId()).getData(); + if (student == null) { + log.error("学生不存在,无法处理请假数据,id:[{}]", eduLeaveRequestUser.getUserId().toString()); + continue; + } else { + redisService + .hset(CachePrefixConstant.STUDENT_DATA, eduLeaveRequestUser.getUserId().toString(), + student); + } + } + + EduUserDept userGreadeDept = (EduUserDept) redisService + .hget(CachePrefixConstant.USER_DEPT_DATA, student.getGradeId().toString()); + EduUserDept userClassDept = (EduUserDept) redisService + .hget(CachePrefixConstant.USER_DEPT_DATA, student.getClassId().toString()); + if (ObjectUtil.isNull(userGreadeDept)) { + userGreadeDept = remoteUserDeptService.getByDeptId(student.getGradeId()).getData(); + if (ObjectUtil.isNotNull(userGreadeDept)) { + redisService.hset(CachePrefixConstant.USER_DEPT_DATA, student.getGradeId().toString(), userGreadeDept); + } + } + + if (ObjectUtil.isNull(userClassDept)) { + userClassDept = remoteUserDeptService.getByDeptId(student.getClassId()).getData(); + if (ObjectUtil.isNotNull(userClassDept)) { + redisService.hset(CachePrefixConstant.USER_DEPT_DATA, student.getClassId().toString(), userClassDept); + } + } + + eduLeaveRequestUser + .setUserDeptName((ObjectUtil.isNull(userGreadeDept) ? "" + : userGreadeDept.getDeptName()) + (ObjectUtil.isNull(userClassDept) ? "" + : userClassDept.getDeptName())); //TODO 判断dept + eduLeaveRequestUser.setUserPicUrl(student.getAvatar()); + } else { + //教师 + //TODO 缓存获取职工信息 + List eduStaffDeptList = remoteStaffService + .getStaffDeptByStaffIds(Collections.singletonList(eduLeaveRequestUser.getUserId())).getData(); + log.info("职工信息:【{}】", eduStaffDeptList); + List deptNameList = eduStaffDeptList.stream().map(EduStaffDept::getDeptName).collect(Collectors.toList()); + eduLeaveRequestUser.setUserDeptName(StrUtil.join(",", deptNameList)); + eduLeaveRequestUser.setUserPicUrl(eduStaffDeptList.get(0).getAvatar()); + } + + //查询下一步审核人信息 + //查询已审核的sort + EduLeaveRequestProcessRecord arr = eduLeaveRequestProcessRecordService + .getOne(Wrappers.lambdaQuery(new EduLeaveRequestProcessRecord()) + .eq(EduLeaveRequestProcessRecord::getRequestId, eduLeaveRequestUser.getId()) + .eq(EduLeaveRequestProcessRecord::getApprovalResult, 1) + .orderByAsc(EduLeaveRequestProcessRecord::getSort).last("limit 1")); + + List eduLeaveRequestProcessRecordList = eduLeaveRequestProcessRecordService + .list(Wrappers.lambdaQuery(new EduLeaveRequestProcessRecord()) + .eq(EduLeaveRequestProcessRecord::getRequestId, eduLeaveRequestUser.getId()) + .eq(EduLeaveRequestProcessRecord::getApprovalResult, 0) + .eq(EduLeaveRequestProcessRecord::getSort, ObjectUtil.isNull(arr) ? 0 : arr.getSort() + 1) + .orderByAsc(EduLeaveRequestProcessRecord::getSort)); + + eduLeaveRequestUser.setEduLeaveRequestProcessRecordList(eduLeaveRequestProcessRecordList); + + } + return eduLeaveRequestUserPage.setRecords(records); + } + + /** + * @param page + * @param userId + * @param requestType + * @param schoolId + * @param statusList + * @param currentUserStatus 0=待处理,1=已处理 + * @return + */ + @Override + public Page findApprovalUserLeaveList(Page page, Long userId, Integer requestType, + Long schoolId, List statusList, Integer currentUserStatus) { + LocalDateTime preDateTime = LocalDate.now().minusMonths(1).atTime(23, 59, 59); + //用户参与审核的请假 + List approvalUserLeaveList = baseMapper + .findApprovalUserLeaveList(userId, requestType, schoolId, null, null, preDateTime); + + //如果请假已通过或者未通过,表示已处理了 + List dealEdList = approvalUserLeaveList.stream() + .filter(e -> ObjectUtil.equals(ApprovalResultEnum.AUDIT_PASS.getResult(), e.getStatus()) + || ObjectUtil.equals(ApprovalResultEnum.AUDIT_NO.getResult(), e.getStatus())) + .collect(Collectors.toList()); + + //待处理/正在处理的请假 + List dealIngList = approvalUserLeaveList.stream() + .filter(e -> ObjectUtil.equals(ApprovalResultEnum.AUDIT.getResult(), e.getStatus()) + || ObjectUtil.equals(ApprovalResultEnum.AUDIT_ING.getResult(), e.getStatus())) + .collect(Collectors.toList()); + + List dealIngIdList = new ArrayList<>(); + List dealEdIdList = new ArrayList<>(); + dealEdIdList.addAll(dealEdList.stream().map(EduLeaveRequestUser::getId).collect(Collectors.toList())); + //待审核 + + for (EduLeaveRequestUser eduLeaveRequestUser : dealIngList) { + List viewList = eduLeaveRequestUserViewService + .list(Wrappers.lambdaQuery(new EduLeaveRequestUserView()) + .eq(EduLeaveRequestUserView::getRequestId, eduLeaveRequestUser.getId()) + .eq(EduLeaveRequestUserView::getStatus, ApprovalResultEnum.AUDIT.getResult()) + .orderByAsc(EduLeaveRequestUserView::getSort)); + if (CollUtil.isEmpty(viewList)) { + continue; + } + EduLeaveRequestUserView view = viewList.get(0); //下一级审核 + List leaveRequestProcessRecordList = eduLeaveRequestProcessRecordService + .list(Wrappers.lambdaQuery(new EduLeaveRequestProcessRecord()) + .eq(EduLeaveRequestProcessRecord::getRequestId, eduLeaveRequestUser.getId()) + .eq(EduLeaveRequestProcessRecord::getViewId, view.getId())); + if (leaveRequestProcessRecordList.stream().map(EduLeaveRequestProcessRecord::getApprovalId) + .collect(Collectors.toList()).contains(userId)) { + dealIngIdList.add(eduLeaveRequestUser.getId()); + } + + //已审核通过的请假流程 + List viewPassList = eduLeaveRequestUserViewService + .list(Wrappers.lambdaQuery(new EduLeaveRequestUserView()) + .eq(EduLeaveRequestUserView::getRequestId, eduLeaveRequestUser.getId()) + .eq(EduLeaveRequestUserView::getStatus, ApprovalResultEnum.AUDIT_PASS.getResult())); + if (CollUtil.isNotEmpty(viewPassList)) { + List viewPassRecordList = eduLeaveRequestProcessRecordService + .list(Wrappers.lambdaQuery(new EduLeaveRequestProcessRecord()) + .eq(EduLeaveRequestProcessRecord::getRequestId, eduLeaveRequestUser.getId()) + .in(EduLeaveRequestProcessRecord::getViewId, + viewPassList.stream().map(EduLeaveRequestUserView::getId).collect( + Collectors.toList()))); + if (viewPassRecordList.stream().map(EduLeaveRequestProcessRecord::getApprovalId) + .collect(Collectors.toList()).contains(userId)) { + dealEdIdList.add(eduLeaveRequestUser.getId()); + } + } + } + + if (CollUtil.isEmpty(dealEdIdList)) { + dealEdIdList.add(-1L); + } + + if (CollUtil.isEmpty(dealIngIdList)) { + dealIngIdList.add(-1L); + } + + LeaveRequestPageDTO dto = new LeaveRequestPageDTO(); + dto.setPageNum((int) page.getPages()); + dto.setPageSize((int) page.getSize()); + dto.setSchoolId(schoolId); + dto.setIdList( + ObjectUtil.equals(ApprovalResultEnum.AUDIT.getResult(), currentUserStatus) ? dealIngIdList : dealEdIdList); + Page eduLeaveRequestUserPage = baseMapper.findPage(dto.toPage(), dto); + + List records = eduLeaveRequestUserPage.getRecords(); + for (EduLeaveRequestUser eduLeaveRequestUser : records) { + if (eduLeaveRequestUser.getRequestType() == 1) { + //学生 + EduStudent student = commonService.getStudentById(eduLeaveRequestUser.getUserId()); + if (ObjectUtil.isNull(student)) { + log.error("学生【{}】不存在,无法处理请假数据", eduLeaveRequestUser.getUserId().toString()); + continue; + } + EduUserDept userGreadeDept = (EduUserDept) redisService + .hget(CachePrefixConstant.USER_DEPT_DATA, student.getGradeId().toString()); + + EduUserDept userClassDept = (EduUserDept) redisService + .hget(CachePrefixConstant.USER_DEPT_DATA, student.getClassId().toString()); + + if (ObjectUtil.isNull(userGreadeDept)) { + userGreadeDept = remoteUserDeptService.getByDeptId(student.getGradeId()).getData(); + if (ObjectUtil.isNotNull(userGreadeDept)) { + redisService.hset(CachePrefixConstant.USER_DEPT_DATA, student.getGradeId().toString(), userGreadeDept); + } + } + + if (ObjectUtil.isNull(userClassDept)) { + userClassDept = remoteUserDeptService.getByDeptId(student.getClassId()).getData(); + if (ObjectUtil.isNotNull(userClassDept)) { + redisService.hset(CachePrefixConstant.USER_DEPT_DATA, student.getClassId().toString(), userClassDept); + } + } + if (ObjectUtil.isNull(userGreadeDept) && ObjectUtil.isNull(userGreadeDept)) { + eduLeaveRequestUser.setUserDeptName("未知班级"); + } else { + eduLeaveRequestUser.setUserDeptName( + (ObjectUtil.isNull(userGreadeDept) ? "" : userGreadeDept.getDeptName()) + (ObjectUtil + .isNull(userClassDept) ? "" : userClassDept.getDeptName())); + } + eduLeaveRequestUser.setUserPicUrl(student.getAvatar()); + } else { + //教师 + List eduStaffDeptList = remoteStaffService + .getStaffDeptByStaffIds(Collections.singletonList(eduLeaveRequestUser.getUserId())).getData(); + List deptNameList = eduStaffDeptList.stream().map(EduStaffDept::getDeptName).collect(Collectors.toList()); + eduLeaveRequestUser.setUserDeptName(StrUtil.join(",", deptNameList)); + eduLeaveRequestUser.setUserPicUrl(eduStaffDeptList.get(0).getAvatar()); + } + + //查询下一步审核人信息 + //查询已审核的sort +// EduLeaveRequestProcessRecord arr = eduLeaveRequestProcessRecordService +// .getOne(Wrappers.lambdaQuery(new EduLeaveRequestProcessRecord()) +// .eq(EduLeaveRequestProcessRecord::getRequestId, eduLeaveRequestUser.getId()) +// .eq(EduLeaveRequestProcessRecord::getApprovalResult, 1) +// .orderByAsc(EduLeaveRequestProcessRecord::getSort).last("limit 1")); +// +// List eduLeaveRequestProcessRecordList = eduLeaveRequestProcessRecordService +// .list(Wrappers.lambdaQuery(new EduLeaveRequestProcessRecord()) +// .eq(EduLeaveRequestProcessRecord::getRequestId, eduLeaveRequestUser.getId()) +// .eq(EduLeaveRequestProcessRecord::getApprovalResult, 0) +// .eq(EduLeaveRequestProcessRecord::getSort, ObjectUtil.isNull(arr) ? 0 : arr.getSort() + 1) +// .orderByAsc(EduLeaveRequestProcessRecord::getSort)); +// eduLeaveRequestUser.setEduLeaveRequestProcessRecordList(eduLeaveRequestProcessRecordList); + } + + return eduLeaveRequestUserPage.setRecords(records); + } + + @Override + @Transactional + public void addLeaveRequest(EduLeaveRequestUser eduLeaveRequestUser) { + SendStaffNoticeDTO sendStaffNoticeDTO = new SendStaffNoticeDTO(); + sendStaffNoticeDTO.setRequestFor(eduLeaveRequestUser.getRequestFor()); + sendStaffNoticeDTO.setRequestReason(eduLeaveRequestUser.getRequestReason()); + sendStaffNoticeDTO.setRequestStartTime(eduLeaveRequestUser.getStartTime()); + sendStaffNoticeDTO.setRequestEndTime(eduLeaveRequestUser.getEndTime()); + sendStaffNoticeDTO.setSchoolId(eduLeaveRequestUser.getSchoolId()); + sendStaffNoticeDTO.setRequestTime(LocalDateTime.now()); + sendStaffNoticeDTO.setType(eduLeaveRequestUser.getType()); + if (ObjectUtil.isNull(eduLeaveRequestUser.getId())) { + //查找适用请假策略 + List requestUserDeptIdList = new ArrayList<>(); + if (eduLeaveRequestUser.getRequestType() == 1) { //学生请假 + //1:找出学生所属部门 + EduStudent student = (EduStudent) redisService + .hget(CachePrefixConstant.STUDENT_DATA, eduLeaveRequestUser.getUserId().toString()); + if (student == null) { + student = remoteStudentService.getStudentNoPermission(eduLeaveRequestUser.getUserId()).getData(); + if (student == null) { + log.error("学生不存在,无法处理请假数据,id:[{}]", eduLeaveRequestUser.getUserId().toString()); + } else { + redisService + .hset(CachePrefixConstant.STUDENT_DATA, eduLeaveRequestUser.getUserId().toString(), + student); + } + } + requestUserDeptIdList = Stream + .of(-student.getSchoolId(), student.getCampusId(), student.getSectionId(), student.getGradeId(), + student.getClassId()).collect( + Collectors.toList()); + + sendStaffNoticeDTO.setRequestUserName(student.getStuName()); + sendStaffNoticeDTO.setRequestUserDeptName( + String.join("/", student.getCampusName(), student.getGradeName(), student.getClassName())); + } else { + //找出教师所属部门 + EduStaff staff = remoteStaffService.getStaff(eduLeaveRequestUser.getUserId()).getData(); + eduLeaveRequestUser.setUserName(staff.getName()); + List staffDept = staff.getStaffDept(); + List deptList = remoteDeptService + .listParentDeptByChild(staffDept.stream().map(EduStaffDept::getDeptId).collect(Collectors.toList())) + .getData(); + requestUserDeptIdList = deptList.stream().map(Dept::getDeptId).collect(Collectors.toList()); + + sendStaffNoticeDTO.setRequestUserName(staff.getName()); + sendStaffNoticeDTO.setRequestUserDeptName( + StringUtils.join(deptList.stream().map(Dept::getDeptName).collect(Collectors.toList()), "/")); + } + + EduLeaveRequestProcessConfig config = null; + + //请假时长 + Long requestHours = LocalDateTimeUtil.between(eduLeaveRequestUser.getStartTime(), eduLeaveRequestUser.getEndTime()) + .toHours(); + if (requestHours <= 12) { + //是否启用小于半天 + List list = eduLeaveRequestProcessConfigService + .list(Wrappers.lambdaQuery(new EduLeaveRequestProcessConfig()) + .eq(EduLeaveRequestProcessConfig::getSchoolId, eduLeaveRequestUser.getSchoolId()) + .eq(EduLeaveRequestProcessConfig::getLessHalfDay, 1)); + if (CollUtil.isNotEmpty(list)) { + List collect = list.stream().filter(x -> x.getHours() >= requestHours) + .collect(Collectors.toList()); + if (CollUtil.isNotEmpty(collect)) { + config = collect.get(0); + } + } + } + if (ObjectUtil.isNull(config)) { + //请假天数 + Long requesUserDays = LocalDateTimeUtil + .between(eduLeaveRequestUser.getStartTime(), eduLeaveRequestUser.getEndTime()) + .toDays(); + List configByDeptIds = eduLeaveRequestProcessConfigService + .findConfigByDeptIds(requestUserDeptIdList, eduLeaveRequestUser.getRequestType(), requesUserDays); + if (CollUtil.isNotEmpty(configByDeptIds)) { + config = configByDeptIds.get(0); + } + } + + //适用的请假规则 + if (ObjectUtil.isNull(config)) { + // TODO 如果没有对应的请假规则,学生可以就只有班主任一级审核,教师呢? + throw new FebsException("无匹配的请假规则,请创建!"); + } + //保存请假主体 + eduLeaveRequestUser.setViewSort(0); + save(eduLeaveRequestUser); + + Dept school = commonService.getDept(config.getSchoolId()); + List eduLeaveRequestProcessConfigViewList = eduLeaveRequestProcessConfigViewService + .list(Wrappers.lambdaQuery(new EduLeaveRequestProcessConfigView()) + .eq(EduLeaveRequestProcessConfigView::getProcessId, config.getId()) + .orderByAsc(EduLeaveRequestProcessConfigView::getSort)); + for (int i = 0; i < eduLeaveRequestProcessConfigViewList.size(); i++) { + + log.info("请假流程:【{}】", i); + EduLeaveRequestProcessConfigView view = eduLeaveRequestProcessConfigViewList.get(i); + //保存流程 + EduLeaveRequestUserView eduLeaveRequestUserView = new EduLeaveRequestUserView(); + eduLeaveRequestUserView.setRequestId(eduLeaveRequestUser.getId()); + eduLeaveRequestUserView.setProcessId(config.getId()); + eduLeaveRequestUserView.setSort(view.getSort()); + eduLeaveRequestUserView.setStatus(0); + eduLeaveRequestUserView.setApprovalUserType(view.getApprovalUserType()); + eduLeaveRequestUserView.setApprovalType(view.getApprovalType()); + eduLeaveRequestUserViewService.save(eduLeaveRequestUserView); + + List eduLeaveRequestProcessConfigApprovalUserList = eduLeaveRequestProcessConfigApprovalUserService + .list(Wrappers.lambdaQuery(new EduLeaveRequestProcessConfigApprovalUser()) + .eq(EduLeaveRequestProcessConfigApprovalUser::getProcessId, config.getId()) + .eq(EduLeaveRequestProcessConfigApprovalUser::getViewId, view.getId())); + + for (EduLeaveRequestProcessConfigApprovalUser eduLeaveRequestProcessConfigApprovalUser : eduLeaveRequestProcessConfigApprovalUserList) { + if (ObjectUtil.isNotNull(eduLeaveRequestProcessConfigApprovalUser.getStaffId())) { + EduStaff staff = remoteStaffService + .getStaff(eduLeaveRequestProcessConfigApprovalUser.getStaffId()).getData(); + //人员审核 + EduLeaveRequestProcessRecord eduLeaveRequestProcessRecord = new EduLeaveRequestProcessRecord(); + eduLeaveRequestProcessRecord.setRequestId(eduLeaveRequestUser.getId()); + eduLeaveRequestProcessRecord.setProcessId(config.getId()); + eduLeaveRequestProcessRecord.setSchoolId(eduLeaveRequestUser.getSchoolId()); + eduLeaveRequestProcessRecord.setApprovalId(eduLeaveRequestProcessConfigApprovalUser.getStaffId()); + eduLeaveRequestProcessRecord.setApprovalName(staff.getName()); + eduLeaveRequestProcessRecord.setSort(eduLeaveRequestUserView.getSort()); + eduLeaveRequestProcessRecord.setViewId(eduLeaveRequestUserView.getId()); + eduLeaveRequestProcessRecordService.save(eduLeaveRequestProcessRecord); + // 发送审核信息 + if (eduLeaveRequestUserView.getSort() == 0) { + log.info("==========发送消息=====:{}", eduLeaveRequestUserView.getSort()); + sendStaffNoticeDTO.setStaffWxId(staff.getWxId()); + sendStaffNoticeDTO.setStaffName(staff.getName()); + sendStaffNoticeDTO.setSchoolType(school.getSchoolType()); + EduLeaveRequestUserServiceImpl bean = applicationContext + .getBean(EduLeaveRequestUserServiceImpl.class); + if (config.getProcessType() == 1) { + bean.sendNotice(sendStaffNoticeDTO, 1, 1, eduLeaveRequestUser.getId()); + } else { + bean.sendNotice(sendStaffNoticeDTO, 1, 0, eduLeaveRequestUser.getId()); + } + } + } else { + if (config.getProcessType() == 1) { + //学生请假 + //角色审核 + //查询学生 + EduStudent student = (EduStudent) redisService + .hget(CachePrefixConstant.STUDENT_DATA, eduLeaveRequestUser.getUserId().toString()); + if (student == null) { + student = remoteStudentService.getStudentNoPermission(eduLeaveRequestUser.getUserId()).getData(); + if (student == null) { + log.error("学生不存在,无法处理请假数据,id:[{}]", eduLeaveRequestUser.getUserId().toString()); + } else { + redisService + .hset(CachePrefixConstant.STUDENT_DATA, eduLeaveRequestUser.getUserId().toString(), + student); + } + } + List approvalUserList = new ArrayList<>(); + if (eduLeaveRequestProcessConfigApprovalUser.getStaffRoleId() == 1) { + //班主任 + //查询学生班主任 + approvalUserList = remoteTeacherService.listTeacherByDeptId(student.getClassId(), "3").getData(); + } else { + //高校系主任/K12年级主任 + if (student.getSchoolId() == 10593) { + //技师学院单独处理 + approvalUserList = remoteTeacherService.listTeacherByDeptId(student.getCampusId(), "1") + .getData(); + } else { + Dept dept = commonService.getDept(student.getSchoolId()); + log.info("学校性质:【{}】", dept.getSchoolNature()); + if (ObjectUtil.equals(SchoolNatureEnum.UNI_TYPE.getValue(), + dept.getSchoolNature())) { + //高校 + approvalUserList = remoteTeacherService.listTeacherByDeptId(student.getSectionId(), "5") + .getData(); + } else { + //K12 + approvalUserList = remoteTeacherService.listTeacherByDeptId(student.getGradeId(), "2") + .getData(); + } + } + } + if (CollUtil.isNotEmpty(approvalUserList)) { + for (EduStaff eduStaff : approvalUserList) { + EduLeaveRequestProcessRecord eduLeaveRequestProcessRecord = new EduLeaveRequestProcessRecord(); + eduLeaveRequestProcessRecord.setRequestId(eduLeaveRequestUser.getId()); + eduLeaveRequestProcessRecord.setProcessId(config.getId()); + eduLeaveRequestProcessRecord.setSchoolId(eduLeaveRequestUser.getSchoolId()); + eduLeaveRequestProcessRecord.setApprovalId(eduStaff.getId()); + eduLeaveRequestProcessRecord.setApprovalName(eduStaff.getName()); + eduLeaveRequestProcessRecord.setSort(eduLeaveRequestUserView.getSort()); + eduLeaveRequestProcessRecord.setViewId(eduLeaveRequestUserView.getId()); + eduLeaveRequestProcessRecordService.save(eduLeaveRequestProcessRecord); + + sendStaffNoticeDTO.setStaffWxId(eduStaff.getWxId()); + sendStaffNoticeDTO.setStaffName(eduStaff.getName()); + sendStaffNoticeDTO.setSchoolType(school.getSchoolType()); + EduLeaveRequestUserServiceImpl bean = applicationContext + .getBean(EduLeaveRequestUserServiceImpl.class); + // 发送审核信息 + if (eduLeaveRequestUserView.getSort() == 0) { + bean.sendNotice(sendStaffNoticeDTO, 1, 1, eduLeaveRequestUser.getId()); + } + } + } + } else { + //教师请假 + List approvalDeptUserList = remoteStaffService.listStaff( + ListStaffDTO.builder() + .deptId(eduLeaveRequestProcessConfigApprovalUser.getStaffRoleId().longValue()) + .build()).getData(); + if (ObjectUtil.isNotNull(approvalDeptUserList)) { + for (EduStaff eduStaff : approvalDeptUserList) { + EduLeaveRequestProcessRecord eduLeaveRequestProcessRecord = new EduLeaveRequestProcessRecord(); + eduLeaveRequestProcessRecord.setRequestId(eduLeaveRequestUser.getId()); + eduLeaveRequestProcessRecord.setProcessId(config.getId()); + eduLeaveRequestProcessRecord.setSchoolId(eduLeaveRequestUser.getSchoolId()); + eduLeaveRequestProcessRecord.setApprovalId(eduStaff.getId()); + eduLeaveRequestProcessRecord.setApprovalName(eduStaff.getName()); + eduLeaveRequestProcessRecord.setSort(eduLeaveRequestUserView.getSort()); + eduLeaveRequestProcessRecord.setViewId(eduLeaveRequestUserView.getId()); + eduLeaveRequestProcessRecordService.save(eduLeaveRequestProcessRecord); + + sendStaffNoticeDTO.setStaffWxId(eduStaff.getWxId()); + sendStaffNoticeDTO.setStaffName(eduStaff.getName()); + sendStaffNoticeDTO.setSchoolType(school.getSchoolType()); + // 发送审核信息 + if (eduLeaveRequestUserView.getSort() == 0) { + EduLeaveRequestUserServiceImpl bean = applicationContext + .getBean(EduLeaveRequestUserServiceImpl.class); + bean.sendNotice(sendStaffNoticeDTO, 1, 0, eduLeaveRequestUser.getId()); + } + } + } + } + } + } + } + } + } + + @Override + public void auditRequest(AuditRequestDTO dto) { + //封装发送消息主体 + EduLeaveRequestUser request = this.getById(dto.getRequestId()); + SendStaffNoticeDTO sendStaffNoticeDTO = new SendStaffNoticeDTO(); + sendStaffNoticeDTO.setRequestFor(request.getRequestFor()); + sendStaffNoticeDTO.setRequestReason(request.getRequestReason()); + sendStaffNoticeDTO.setRequestStartTime(request.getStartTime()); + sendStaffNoticeDTO.setRequestEndTime(request.getEndTime()); + sendStaffNoticeDTO.setSchoolId(request.getSchoolId()); + sendStaffNoticeDTO.setRequestUserName(request.getUserName()); + sendStaffNoticeDTO.setRequestTime(request.getCreateDate()); + sendStaffNoticeDTO.setType(request.getType()); + if (request.getRequestType() == 1) { + //学生 + EduStudent student = (EduStudent) redisService + .hget(CachePrefixConstant.STUDENT_DATA, request.getUserId().toString()); + if (student == null) { + student = remoteStudentService.getStudentNoPermission(request.getUserId()).getData(); + if (student == null) { + log.error("学生不存在,无法处理请假数据,id:[{}]", request.getUserId().toString()); + } else { + redisService + .hset(CachePrefixConstant.STUDENT_DATA, request.getUserId().toString(), + student); + } + } + sendStaffNoticeDTO + .setRequestUserDeptName( + String.join("/", remoteUserDeptService.getByDeptId(student.getCampusId()).getData().getDeptName(), + remoteUserDeptService.getByDeptId(student.getGradeId()).getData().getDeptName(), + remoteUserDeptService.getByDeptId(student.getClassId()).getData().getDeptName())); + } else { + //教师 + List eduStaffDeptList = remoteStaffService + .getStaffDeptByStaffIds(Collections.singletonList(request.getUserId())).getData(); + List deptNameList = eduStaffDeptList.stream().map(EduStaffDept::getDeptName).collect(Collectors.toList()); + sendStaffNoticeDTO.setRequestUserDeptName(StrUtil.join(",", deptNameList)); + } + + // 策略id + Long strategyId = 10000000 + dto.getRequestId(); + + //先判断审核权限 + List list = eduLeaveRequestProcessRecordService.list( + Wrappers.lambdaQuery(new EduLeaveRequestProcessRecord()) + .eq(EduLeaveRequestProcessRecord::getRequestId, dto.getRequestId()) + .eq(EduLeaveRequestProcessRecord::getApprovalId, dto.getApprovalId()) + .orderByAsc(EduLeaveRequestProcessRecord::getSort)); + + EduLeaveRequestProcessRecord eduLeaveRequestProcessRecord = new EduLeaveRequestProcessRecord(); + + for (int i = 0; i < list.size(); i++) { + EduLeaveRequestProcessRecord record = list.get(i); + if (record.getApprovalResult() == 0) { + eduLeaveRequestProcessRecord = record; + break; + } + } + + EduLeaveRequestUserView view = eduLeaveRequestUserViewService.getById(eduLeaveRequestProcessRecord.getViewId()); + +// EduLeaveRequestProcessRecord eduLeaveRequestProcessRecord = eduLeaveRequestProcessRecordService.getById(dto.getId()); +// CurrentUser currentUser = FebsUtil.getCurrentUser(); +// if (eduLeaveRequestProcessRecord.getApprovalId() != currentUser.getIdentityId()) { +// throw new FebsException("您无此审核权限"); +// } + + eduLeaveRequestProcessRecord.setApprovalResult(dto.getApprovalResult()); + eduLeaveRequestProcessRecord.setApprovalReason(dto.getApprovalReason()); + eduLeaveRequestProcessRecord.setUpdateDate(LocalDateTime.now()); + eduLeaveRequestProcessRecordService.updateById(eduLeaveRequestProcessRecord); + + EduLeaveRequestProcessConfig config = eduLeaveRequestProcessConfigService + .getById(eduLeaveRequestProcessRecord.getProcessId()); + + sendStaffNoticeDTO.setPreStaffName(eduLeaveRequestProcessRecord.getApprovalName()); + List roleNames = new ArrayList<>(); + + List teacherRoleTypeList = remoteStaffService + .listStaffRolesByStaffId(eduLeaveRequestProcessRecord.getApprovalId()).getData(); + if (teacherRoleTypeList.contains(1)) { + roleNames.add(RoleName.CAMPUS.getName()); + } else if (teacherRoleTypeList.contains(2)) { + roleNames.add(RoleName.GRADE.getName()); + } else if (teacherRoleTypeList.contains(3)) { + roleNames.add(RoleName.MASTER.getName()); + } else if (teacherRoleTypeList.contains(4)) { + roleNames.add(RoleName.COURSE.getName()); + } else if (teacherRoleTypeList.contains(5)) { + roleNames.add(RoleName.SECTION.getName()); + } else { + roleNames.add(RoleName.TEACHER.getName()); + } + sendStaffNoticeDTO.setPreStaffRoleName(StrUtil.join("/", roleNames)); + + if (ObjectUtil.equals(AuditModeEnum.OR_AUDIT.getMode(), view.getApprovalType())) { + //或审 + view.setStatus(dto.getApprovalResult() == 0 ? 2 : 1); + view.setAuditTime(LocalDateTime.now()); + +// EduLeaveRequestProcessConfigView next = eduLeaveRequestProcessConfigViewService +// .getOne(Wrappers.lambdaQuery(new EduLeaveRequestProcessConfigView()) +// .eq(EduLeaveRequestProcessConfigView::getProcessId, dto.getProcessId()) +// .eq(EduLeaveRequestProcessConfigView::getSort, view.getSort() + 1)); + + EduLeaveRequestUserView next = eduLeaveRequestUserViewService + .getOne(Wrappers.lambdaQuery(new EduLeaveRequestUserView()) + .eq(EduLeaveRequestUserView::getRequestId, dto.getRequestId()) + .eq(EduLeaveRequestUserView::getSort, view.getSort() + 1)); + + EduLeaveRequestUser eduLeaveRequestUser = new EduLeaveRequestUser(); + if (ObjectUtil.isNull(next)) { + //无下一流程则表示审核完毕 + eduLeaveRequestUser.setId(dto.getRequestId()); + if (ObjectUtil.equals(ApprovalResultEnum.AUDIT_PASS.getResult(), dto.getApprovalResult())) { //审核通过 + eduLeaveRequestUser.setStrategyId(strategyId); + eduLeaveRequestUser.setStatus(ApprovalResultEnum.AUDIT_PASS.getResult()); + } else { + eduLeaveRequestUser.setStatus(ApprovalResultEnum.AUDIT_NO.getResult());//审核不通过 + eduLeaveRequestUser.setRefuseReason(dto.getRefuseReason()); + } + } else { + eduLeaveRequestUser.setViewSort(view.getSort() + 1); + eduLeaveRequestUser.setId(dto.getRequestId()); + if (ObjectUtil.equals(ApprovalResultEnum.AUDIT_PASS.getResult(), dto.getApprovalResult())) { //审核通过 + eduLeaveRequestUser.setStatus(ApprovalResultEnum.AUDIT_ING.getResult()); + List nextAppUser = eduLeaveRequestProcessRecordService.list( + Wrappers.lambdaQuery(new EduLeaveRequestProcessRecord()) + .eq(EduLeaveRequestProcessRecord::getViewId, next.getId())); + + nextAppUser.forEach(eduLeaveRequestProcessRecord1 -> { + // 发送提示审核消息 + Dept school = commonService.getDept(config.getSchoolId()); + EduStaff staff = remoteStaffService + .getStaff(eduLeaveRequestProcessRecord1.getApprovalId()).getData(); + + sendStaffNoticeDTO.setStaffWxId(staff.getWxId()); + sendStaffNoticeDTO.setStaffName(staff.getName()); + sendStaffNoticeDTO.setSchoolType(school.getSchoolType()); + EduLeaveRequestUserServiceImpl bean = applicationContext + .getBean(EduLeaveRequestUserServiceImpl.class); + if (ObjectUtil.equals(UserTypeEnum.PARENT_USER_TYPE.getType(), request.getRequestType())) { + bean.sendNotice(sendStaffNoticeDTO, 0, 1, eduLeaveRequestUser.getId()); + } else { + bean.sendNotice(sendStaffNoticeDTO, 0, 0, eduLeaveRequestUser.getId()); + } + }); + } else { + eduLeaveRequestUser.setStatus(ApprovalResultEnum.AUDIT_NO.getResult());//审核不通过 + eduLeaveRequestUser.setRefuseReason(dto.getRefuseReason()); + } + } + this.updateById(eduLeaveRequestUser); + + if (ObjectUtil.equals(ApprovalResultEnum.AUDIT_PASS.getResult(), eduLeaveRequestUser.getStatus())) { + // TODO 2023/2/2 eduLeaveRequestUser status=1 添加通行策略 + EduLeaveRequestUser user = getById(eduLeaveRequestUser.getId()); + addLeaveRequestStrategy(strategyId, user); + } + //通知家长 + Dept school = commonService.getDept(config.getSchoolId()); + if (ObjectUtil.equals(UserTypeEnum.PARENT_USER_TYPE.getType(), request.getRequestType())) { + if (ObjectUtil.equals(ApprovalResultEnum.AUDIT_PASS.getResult(), eduLeaveRequestUser.getStatus()) + && ObjectUtil.equals(ApprovalResultEnum.AUDIT_NO.getResult(), eduLeaveRequestUser.getStatus())) { + EduLeaveRequestUser user = getById(eduLeaveRequestUser.getId()); + EduLeaveRequestUserServiceImpl bean = applicationContext + .getBean(EduLeaveRequestUserServiceImpl.class); + bean.sendParentNotice(school, + eduLeaveRequestUser.getStatus(), + user.getUserName(), user.getUserId(), request.getCreateDate(), request.getId()); + } + } else { + //发送教师端审批结果通知 + if (ObjectUtil.equals(ApprovalResultEnum.AUDIT_PASS.getResult(), eduLeaveRequestUser.getStatus()) + && ObjectUtil.equals(ApprovalResultEnum.AUDIT_NO.getResult(), eduLeaveRequestUser.getStatus())) { + EduStaff staff = remoteStaffService.getStaff(request.getUserId()).getData(); + SendStaffNoticeDTO noticeDTO = new SendStaffNoticeDTO(); + noticeDTO.setRequestTime(request.getCreateDate()); + noticeDTO.setRequestStartTime(request.getStartTime()); + noticeDTO.setRequestEndTime(request.getEndTime()); + noticeDTO.setStatus(eduLeaveRequestUser.getStatus()); + noticeDTO.setStaffName(request.getUserName()); + noticeDTO.setStaffWxId(staff.getWxId()); + noticeDTO.setSchoolType(school.getSchoolType()); + EduLeaveRequestUserServiceImpl bean = applicationContext + .getBean(EduLeaveRequestUserServiceImpl.class); + bean.sendStaffNotice(noticeDTO, request.getId()); + } + } + } else { + //会审 + //本次请假此流程对应的全部审核人员 + List eduLeaveRequestProcessRecordList = eduLeaveRequestProcessRecordService + .list(Wrappers.lambdaQuery(new EduLeaveRequestProcessRecord()) + .eq(EduLeaveRequestProcessRecord::getProcessId, eduLeaveRequestProcessRecord.getProcessId()) + .eq(EduLeaveRequestProcessRecord::getRequestId, dto.getRequestId()) + .eq(EduLeaveRequestProcessRecord::getViewId, eduLeaveRequestProcessRecord.getViewId())); + + //已通过的人员 + List passRecordList = eduLeaveRequestProcessRecordList.stream() + .filter(x -> ObjectUtil.equals(ApprovalResultEnum.AUDIT_PASS.getResult(), x.getApprovalResult())) + .collect(Collectors.toList()); + + if (ObjectUtil.equals(ApprovalResultEnum.AUDIT_PASS.getResult(), dto.getApprovalResult())) { + //审核通过 + if (passRecordList.size() == eduLeaveRequestProcessRecordList.size()) { + //1:都审核通过表示此级别审核通过, + //2:查看是否需要下一级别审核 + EduLeaveRequestUserView next = eduLeaveRequestUserViewService + .getOne(Wrappers.lambdaQuery(new EduLeaveRequestUserView()) + .eq(EduLeaveRequestUserView::getRequestId, dto.getRequestId()) + .eq(EduLeaveRequestUserView::getSort, view.getSort() + 1)); + + if (ObjectUtil.isNull(next)) { + EduLeaveRequestUser eduLeaveRequestUser = new EduLeaveRequestUser(); + eduLeaveRequestUser.setId(dto.getRequestId()); + eduLeaveRequestUser.setStatus(ApprovalResultEnum.AUDIT_PASS.getResult()); + eduLeaveRequestUser.setStrategyId(strategyId); + this.updateById(eduLeaveRequestUser); + // TODO 2023/2/2 eduLeaveRequestUser status=1 添加通行策略 + EduLeaveRequestUser user = getById(eduLeaveRequestUser.getId()); + addLeaveRequestStrategy(strategyId, user); +// +// remoteAttendanceStrategyService.addLeaveRequestStrategy( +// AddLeaveRequestStrategyDTO.builder() +// .requestId(user.getId()) +// .userId(user.getUserId()) +// .strategyId(strategyId) +// .requestType(user.getRequestType()) +// .schoolId(user.getSchoolId()) +// .startTime(user.getStartTime()) +// .endTime(user.getEndTime()) +// .build()); + Dept school = commonService.getDept(config.getSchoolId()); + if (ObjectUtil.equals(UserTypeEnum.PARENT_USER_TYPE.getType(), request.getRequestType())) { + //通知家长 + EduLeaveRequestUserServiceImpl bean = applicationContext + .getBean(EduLeaveRequestUserServiceImpl.class); + bean.sendParentNotice(school, ApprovalResultEnum.AUDIT_PASS.getResult(), + user.getUserName(), user.getUserId(), request.getCreateDate(), request.getId()); + } else { + //发送教师端审批结果通知 + EduStaff staff = remoteStaffService.getStaff(request.getUserId()).getData(); + SendStaffNoticeDTO noticeDTO = new SendStaffNoticeDTO(); + noticeDTO.setRequestTime(request.getCreateDate()); + noticeDTO.setRequestStartTime(request.getStartTime()); + noticeDTO.setRequestEndTime(request.getEndTime()); + noticeDTO.setStatus(ApprovalResultEnum.AUDIT_PASS.getResult()); + noticeDTO.setStaffName(request.getUserName()); + noticeDTO.setStaffWxId(staff.getWxId()); + noticeDTO.setSchoolType(school.getSchoolType()); + + EduLeaveRequestUserServiceImpl bean = applicationContext + .getBean(EduLeaveRequestUserServiceImpl.class); + bean.sendStaffNotice(noticeDTO, request.getId()); + } + } else { + EduLeaveRequestUser eduLeaveRequestUser = new EduLeaveRequestUser(); + eduLeaveRequestUser.setId(dto.getRequestId()); + eduLeaveRequestUser.setStatus(ApprovalResultEnum.AUDIT_ING.getResult()); + eduLeaveRequestUser.setViewSort(next.getSort()); + this.updateById(eduLeaveRequestUser); + // 通知下一级审核 + List nextAppUser = eduLeaveRequestProcessRecordService.list( + Wrappers.lambdaQuery(new EduLeaveRequestProcessRecord()) + .eq(EduLeaveRequestProcessRecord::getViewId, next.getId())); + + nextAppUser.forEach(nextRecord -> { + // 发送提示审核消息 + Dept school = commonService.getDept(config.getSchoolId()); + EduStaff staff = remoteStaffService + .getStaff(nextRecord.getApprovalId()).getData(); + + sendStaffNoticeDTO.setStaffWxId(staff.getWxId()); + sendStaffNoticeDTO.setStaffName(staff.getName()); + sendStaffNoticeDTO.setSchoolType(school.getSchoolType()); + EduLeaveRequestUserServiceImpl bean = applicationContext + .getBean(EduLeaveRequestUserServiceImpl.class); + if (ObjectUtil.equals(UserTypeEnum.PARENT_USER_TYPE.getType(), request.getRequestType())) { + bean.sendNotice(sendStaffNoticeDTO, 0, UserTypeEnum.PARENT_USER_TYPE.getType(), + eduLeaveRequestUser.getId()); + } else { + bean.sendNotice(sendStaffNoticeDTO, 0, UserTypeEnum.STAFF_USER_TYPE.getType(), + eduLeaveRequestUser.getId()); + } + }); + } + view.setStatus(ApprovalResultEnum.AUDIT_PASS.getResult()); + view.setAuditTime(LocalDateTime.now()); + } else { + view.setStatus(ApprovalResultEnum.AUDIT_ING.getResult()); //当前流程审核中 + view.setAuditTime(LocalDateTime.now()); + + EduLeaveRequestUser eduLeaveRequestUser = new EduLeaveRequestUser(); + eduLeaveRequestUser.setId(dto.getRequestId()); + eduLeaveRequestUser.setStatus(ApprovalResultEnum.AUDIT_ING.getResult()); + this.updateById(eduLeaveRequestUser); + } + } else { + //审核不通过 + EduLeaveRequestUser eduLeaveRequestUser = new EduLeaveRequestUser(); + eduLeaveRequestUser.setId(dto.getRequestId()); + eduLeaveRequestUser.setStatus(ApprovalResultEnum.AUDIT_NO.getResult()); + eduLeaveRequestUser.setRequestReason(dto.getRefuseReason()); + this.updateById(eduLeaveRequestUser); + + view.setStatus(ApprovalResultEnum.AUDIT_NO.getResult()); + view.setAuditTime(LocalDateTime.now()); + + Dept school = commonService.getDept(config.getSchoolId()); + if (request.getRequestType() == 1) { + //通知家长 + EduLeaveRequestUser user = getById(eduLeaveRequestUser.getId()); + EduLeaveRequestUserServiceImpl bean = applicationContext + .getBean(EduLeaveRequestUserServiceImpl.class); + bean.sendParentNotice(school, ApprovalResultEnum.AUDIT_NO.getResult(), + user.getUserName(), user.getUserId(), request.getCreateDate(), request.getId()); + } else { + //发送教师端审批结果通知 + EduStaff staff = remoteStaffService.getStaff(request.getUserId()).getData(); + SendStaffNoticeDTO noticeDTO = new SendStaffNoticeDTO(); + noticeDTO.setRequestTime(request.getCreateDate()); + noticeDTO.setRequestStartTime(request.getStartTime()); + noticeDTO.setRequestEndTime(request.getEndTime()); + noticeDTO.setStatus(0); + noticeDTO.setStaffName(request.getUserName()); + noticeDTO.setStaffWxId(staff.getWxId()); + noticeDTO.setSchoolType(school.getSchoolType()); + EduLeaveRequestUserServiceImpl bean = applicationContext + .getBean(EduLeaveRequestUserServiceImpl.class); + bean.sendStaffNotice(noticeDTO, request.getId()); + } + } + } + eduLeaveRequestUserViewService.updateById(view); + } + + @Override + public EduLeaveRequestUserVO getRequest(Long requestId) { + EduLeaveRequestUserVO eduLeaveRequestUserVO = new EduLeaveRequestUserVO(); + EduLeaveRequestUser eduLeaveRequestUser = getById(requestId); + BeanUtils.copyProperties(eduLeaveRequestUser, eduLeaveRequestUserVO); + + List userViewList = eduLeaveRequestUserViewService + .list(Wrappers.lambdaQuery(new EduLeaveRequestUserView()).eq(EduLeaveRequestUserView::getRequestId, requestId) + .orderByAsc(EduLeaveRequestUserView::getSort)); + + userViewList.forEach(eduLeaveRequestUserView -> { + List list = eduLeaveRequestProcessRecordService.list( + Wrappers.lambdaQuery(new EduLeaveRequestProcessRecord()) + .eq(EduLeaveRequestProcessRecord::getViewId, eduLeaveRequestUserView.getId()) + .eq(EduLeaveRequestProcessRecord::getRequestId, requestId)); + + ListStaffDTO dto = new ListStaffDTO(); + dto.setIds(list.stream().map(EduLeaveRequestProcessRecord::getApprovalId).collect(Collectors.toList())); + for (EduLeaveRequestProcessRecord eduLeaveRequestProcessRecord : list) { + EduStaff staff = (EduStaff) redisService + .hget(CachePrefixConstant.STAFF_DATA, eduLeaveRequestProcessRecord.getApprovalId().toString()); + if (ObjectUtil.isNull(staff)) { + staff = remoteStaffService.getStaff(eduLeaveRequestProcessRecord.getApprovalId()).getData(); + if (ObjectUtil.isNotNull(staff)) { + redisService + .hset(CachePrefixConstant.STAFF_DATA, eduLeaveRequestProcessRecord.getApprovalId().toString(), staff); + } + } + if (ObjectUtil.isNotNull(staff)) { + eduLeaveRequestProcessRecord.setApprovaler(staff); + } + } +// +// Map> staffMap = remoteStaffService.listStaff(dto).getData().stream() +// .collect(Collectors.groupingBy(EduStaff::getId)); +// +// list.forEach(e -> { +// List staffList = staffMap.get(e.getApprovalId()); +// e.setApprovaler(staffList.get(0)); +// }); + eduLeaveRequestUserView.setEduLeaveRequestProcessRecordList(list); + }); + eduLeaveRequestUserVO.setEduLeaveRequestUserViewList(userViewList); + if (eduLeaveRequestUser.getRequestType() == 1) { + EduStudent student = (EduStudent) redisService + .hget(CachePrefixConstant.STUDENT_DATA, eduLeaveRequestUser.getUserId().toString()); + if (ObjectUtil.isNull(student)) { + student = remoteStudentService.getStudentNoPermission(eduLeaveRequestUser.getUserId()).getData(); + if (ObjectUtil.isNotNull(student)) { + redisService.hset(CachePrefixConstant.STUDENT_DATA, eduLeaveRequestUser.getUserId().toString(), student); + } + } + eduLeaveRequestUserVO + .setStudent(student); + } else { + EduStaff staff = (EduStaff) redisService + .hget(CachePrefixConstant.STAFF_DATA, eduLeaveRequestUser.getUserId().toString()); + if (ObjectUtil.isNull(staff)) { + staff = remoteStaffService.getStaff(eduLeaveRequestUser.getUserId()).getData(); + if (ObjectUtil.isNotNull(staff)) { + redisService + .hset(CachePrefixConstant.STAFF_DATA, eduLeaveRequestUser.getUserId().toString(), staff); + } + } + eduLeaveRequestUserVO.setStaff(staff); + } + return eduLeaveRequestUserVO; + } + + @Override + public void testTamplateCardNotice(String wxId, Long schoolId) { + Integer type = 1; + Integer isFirst = 1; + SendStaffNoticeDTO dto = new SendStaffNoticeDTO(); + dto.setRequestTime(LocalDateTime.now()); + dto.setSchoolId(schoolId); + dto.setStaffName("张无忌"); + dto.setRequestEndTime(LocalDateTime.now()); + dto.setRequestStartTime(LocalDateTime.now()); + dto.setSchoolType("0"); + dto.setStaffWxId(wxId); + dto.setStatus(0); + dto.setRequestUserName("张小小"); + dto.setRequestUserDeptName("三年二班"); + dto.setRequestReason("牙疼,需要做手术"); + log.info("接收发送数据:【{}】", dto); + //发送企业微信通知 + if (dto.getSchoolType().contains("0")) { + EduApp app = commonService.getAppByCodeAndSchool(AppConstant.CONTACT_SELECT, null, + dto.getSchoolId()); + if (ObjectUtil.isNull(app)) { + app = commonService.getAppByCodeAndSchool(AppConstant.TEACHER_LEAVE_REQUEST, null, + dto.getSchoolId()); + } + String accessToken = wxUtil.getAccessToken(app.getWxCorpId(), app.getWxSecret()); +// String url = String +// .format("%s&loginType=0&state=%s&userType=0", teacherLeaveRequestUrl + app.getWxCorpId(), app.getCode()); + String url = String + .format("%s?appId=%s&schoolId=%s&userType=0&titleName=%s", teacherLeaveRequestUrl, app.getWxCorpId(), + FebsUtil.getTopDeptId(), "请假管理"); + //模板卡片消息--文本通知型 + TemplateCardNotice templateCardNotice = new TemplateCardNotice(); + templateCardNotice.setCard_type(NoticeTypeConstant.TEMPLATE_NOTICE_TYPE_TEXT); + templateCardNotice.setMain_title(MainTitle.builder().title(type == 1 ? "学生请假申请提醒" : "职工请假申请提醒").build()); + if (type == 1) { + //学生请假 + if (isFirst == 1) { + templateCardNotice + .setSub_title_text(String.format("尊敬的%s老师,%S同学于%S提交的请假申请,等待您的审批!", + dto.getStaffName(), dto.getRequestUserName(), + LocalDateTimeUtil.format(dto.getRequestTime(), "yyyy-MM-dd HH:mm:ss"))); + } else { + templateCardNotice + .setSub_title_text(String.format("尊敬的%s老师,你好!%S老师【%S】已同意%S同学于%S提交的请假申请,等待您的审批!", + dto.getStaffName(), dto.getPreStaffName(), dto.getPreStaffRoleName(), dto.getRequestUserName(), + LocalDateTimeUtil.format(dto.getRequestTime(), "yyyy-MM-dd HH:mm:ss"))); + } + } else { + if (isFirst == 1) { + templateCardNotice + .setSub_title_text(String.format("尊敬的%s老师,%S职工于%S提交的请假申请,等待您的审批!", + dto.getStaffName(), dto.getRequestUserName(), + LocalDateTimeUtil.format(dto.getRequestTime(), "yyyy-MM-dd HH:mm:ss"))); + } else { + templateCardNotice + .setSub_title_text(String.format("尊敬的%s老师,你好!%S老师【%S】已同意%S职工于%S提交的请假申请,等待您的审批!", + dto.getStaffName(), dto.getPreStaffName(), dto.getPreStaffRoleName(), dto.getRequestUserName(), + LocalDateTimeUtil.format(dto.getRequestTime(), "yyyy-MM-dd HH:mm:ss"))); + } + } + + List horizontalContentList = new ArrayList<>(); + horizontalContentList + .add(HorizontalContent.builder().keyname(type == 1 ? "班级" : "部门").value(dto.getRequestUserDeptName()).build()); + horizontalContentList + .add(HorizontalContent.builder().keyname(type == 1 ? "学生" : "职工").value(dto.getRequestUserName()).build()); + horizontalContentList.add(HorizontalContent.builder().keyname("请假时间") + .value(String.join("至", LocalDateTimeUtil.format(dto.getRequestStartTime(), "yyyy-MM-dd HH:mm"), + LocalDateTimeUtil.format(dto.getRequestEndTime(), "yyyy-MM-dd HH:mm"))).build()); + horizontalContentList.add(HorizontalContent.builder().keyname("请假原因").value(dto.getRequestReason()).build()); + templateCardNotice.setHorizontal_content_list(horizontalContentList); + templateCardNotice.setCard_action(CardAction.builder().type(1).url(url).build()); + templateCardNotice + .setJump_list(Collections.singletonList(Jump.builder().type(1).title("点击查看详情并处理").url(url).build())); + + TemplateCardStaffNotice templateCardStaffNotice = new TemplateCardStaffNotice(); + templateCardStaffNotice.setTouser(dto.getStaffWxId()); + templateCardStaffNotice.setAgentid(app.getWxAgentId()); + templateCardStaffNotice.setTemplate_card(templateCardNotice); + //发送微信通知 + wxUtil.pushStaffNotice(accessToken, templateCardStaffNotice); + } + //TODO 发送易达APP消息 + } + + @Override + public List findUserRequestList(ListUserRequestDTO dto) { + return baseMapper.findUserRequestList(dto); + } + + /** + * 发送职工企业微信端模板消息 + * + * @param dto + * @param type 1学生请假,0职工请假 + * @param isFirst 是否为初次审核 0否,1是 + */ + @Async + public void sendNotice(SendStaffNoticeDTO dto, Integer isFirst, Integer type, Long requestId) { +// log.info("接收发送数据:【{}】", dto); + //发送企业微信通知 + if (dto.getSchoolType().contains("0")) { + + EduApp app = commonService.getAppByCodeAndSchool(AppConstant.CONTACT_SELECT, null, + dto.getSchoolId()); + if (ObjectUtil.isNull(app)) { + app = commonService.getAppByCodeAndSchool(AppConstant.TEACHER_LEAVE_REQUEST, null, + dto.getSchoolId()); + } + String accessToken = wxUtil.getAccessToken(app.getWxCorpId(), app.getWxSecret()); + String url = String + .format("%s?corpId=%s&schoolId=%s&userType=%s&requestId=%s&requestUserType=%s", teacherLeaveRequestUrl, + app.getWxCorpId(), + dto.getSchoolId(), 0, requestId, type == 1 ? 1 : 0); + //模板卡片消息--文本通知型 + TemplateCardNotice templateCardNotice = new TemplateCardNotice(); + templateCardNotice.setCard_type(NoticeTypeConstant.TEMPLATE_NOTICE_TYPE_TEXT); + templateCardNotice.setMain_title(MainTitle.builder().title(type == 1 ? "学生请假申请提醒" : "职工请假申请提醒").build()); + if (type == 1) { + //学生请假 + if (isFirst == 1) { + templateCardNotice + .setSub_title_text(String.format("尊敬的%s老师,%S同学于%S提交的请假申请,等待您的审批!", + dto.getStaffName(), dto.getRequestUserName(), + LocalDateTimeUtil.format(dto.getRequestTime(), "yyyy-MM-dd HH:mm:ss"))); + } else { + templateCardNotice + .setSub_title_text(String.format("尊敬的%s老师,你好!%S老师【%S】已同意%S同学于%S提交的请假申请,等待您的审批!", + dto.getStaffName(), dto.getPreStaffName(), dto.getPreStaffRoleName(), dto.getRequestUserName(), + LocalDateTimeUtil.format(dto.getRequestTime(), "yyyy-MM-dd HH:mm:ss"))); + } + } else { + if (isFirst == 1) { + templateCardNotice + .setSub_title_text(String.format("尊敬的%s老师,%S职工于%S提交的请假申请,等待您的审批!", + dto.getStaffName(), dto.getRequestUserName(), + LocalDateTimeUtil.format(dto.getRequestTime(), "yyyy-MM-dd HH:mm:ss"))); + } else { + templateCardNotice + .setSub_title_text(String.format("尊敬的%s老师,你好!%S老师【%S】已同意%S职工于%S提交的请假申请,等待您的审批!", + dto.getStaffName(), dto.getPreStaffName(), dto.getPreStaffRoleName(), dto.getRequestUserName(), + LocalDateTimeUtil.format(dto.getRequestTime(), "yyyy-MM-dd HH:mm:ss"))); + } + } + + List horizontalContentList = new ArrayList<>(); + horizontalContentList + .add(HorizontalContent.builder().keyname(type == 1 ? "班级" : "部门").value(dto.getRequestUserDeptName()).build()); + horizontalContentList + .add(HorizontalContent.builder().keyname(type == 1 ? "学生" : "职工").value(dto.getRequestUserName()).build()); + horizontalContentList.add(HorizontalContent.builder().keyname("请假类型") + .value(ObjectUtil.isNull(dto.getType()) ? "其他" : LeaveRequestTypeEnum.getName(dto.getType())).build()); + horizontalContentList.add(HorizontalContent.builder().keyname("请假时间") + .value(String.join("至", LocalDateTimeUtil.format(dto.getRequestStartTime(), "yyyy-MM-dd HH:mm"), + LocalDateTimeUtil.format(dto.getRequestEndTime(), "yyyy-MM-dd HH:mm"))).build()); + horizontalContentList.add(HorizontalContent.builder().keyname("请假去向").value(dto.getRequestFor()).build()); + horizontalContentList.add(HorizontalContent.builder().keyname("请假原因").value(dto.getRequestReason()).build()); + templateCardNotice.setHorizontal_content_list(horizontalContentList); + templateCardNotice.setCard_action(CardAction.builder().type(1).url(url).build()); + templateCardNotice + .setJump_list(Collections.singletonList(Jump.builder().type(1).title("点击查看详情并处理").url(url).build())); + + TemplateCardStaffNotice templateCardStaffNotice = new TemplateCardStaffNotice(); + templateCardStaffNotice.setTouser(dto.getStaffWxId()); + templateCardStaffNotice.setAgentid(app.getWxAgentId()); + templateCardStaffNotice.setTemplate_card(templateCardNotice); + //发送微信通知 + wxUtil.pushStaffNotice(accessToken, templateCardStaffNotice); + } + //TODO 发送易达APP消息 + } + + /** + * 发送家长通知 -- 请假结果 + * + * @param school + * @param + */ + @Async + public void sendParentNotice(Dept school, Integer type, String studentName, Long studentId, LocalDateTime requestTime, + Long requestId) { + //发送企业微信通知 + if (school.getSchoolType().contains("0")) { + TextSchoolNotice textSchoolNotice = new TextSchoolNotice(); + + EduApp appByCodeAndSchool = commonService.getAppByCodeAndSchool(AppConstant.INDEX_PARENT, null, + school.getDeptId()); + + List parentId = remoteStudentService.findParentWxId(Collections.singletonList(studentId)).getData(); + + Text text = new Text(); + textSchoolNotice.setText(text); + textSchoolNotice.setAgentid(appByCodeAndSchool.getWxAgentId()); + String url = String + .format("%s?corpId=%s&schoolId=%s&userType=%s&requestId=%s&requestUserType=%s", teacherLeaveRequestUrl, + appByCodeAndSchool.getWxCorpId(), + school.getDeptId(), 1, requestId, 1); + + String msg = ObjectUtil.equals(ApprovalResultEnum.AUDIT_PASS.getResult(), type) ? "已通过" : "未通过"; + text.setContent( + "" + studentName + "同学于" + LocalDateTimeUtil.format(requestTime, "yyyy-MM-dd HH:mm:ss") + + "的请假审核" + msg + ",点击可查看详情" + ""); + textSchoolNotice.setTo_parent_userid(parentId); + String accessToken = wxUtil.getAccessToken(appByCodeAndSchool.getWxCorpId(), appByCodeAndSchool.getWxSecret()); + wxUtil.pushSchoolNotice(accessToken, textSchoolNotice); + } + //TODO 发送易达APP消息 + } + + + /** + * 发送职工请假结果通知 + */ + @Async + public void sendStaffNotice(SendStaffNoticeDTO dto, Long requestId) { + + log.info("发送职工请假结果通知:【{}】", dto); + //发送企业微信通知 + if (dto.getSchoolType().contains("0")) { + EduApp app = commonService.getAppByCodeAndSchool(AppConstant.CONTACT_SELECT, null, + dto.getSchoolId()); + if (ObjectUtil.isNull(app)) { + app = commonService.getAppByCodeAndSchool(AppConstant.TEACHER_LEAVE_REQUEST, null, + dto.getSchoolId()); + } + String accessToken = wxUtil.getAccessToken(app.getWxCorpId(), app.getWxSecret()); + + String url = String + .format("%s?corpId=%s&schoolId=%s&userType=%s&requestId=%s&requestUserType=%s", teacherLeaveRequestUrl, + app.getWxCorpId(), + dto.getSchoolId(), 0, requestId, 0); + //模板卡片消息--文本通知型 + TemplateCardNotice templateCardNotice = new TemplateCardNotice(); + templateCardNotice.setCard_type(NoticeTypeConstant.TEMPLATE_NOTICE_TYPE_TEXT); + templateCardNotice.setMain_title(MainTitle.builder().title("请假结果通知").build()); + + templateCardNotice + .setSub_title_text(String.format("尊敬的%S老师,您好,您于%S的请假申请结果", + dto.getStaffName(), LocalDateTimeUtil.format(dto.getRequestTime(), "yyyy-MM-dd HH:mm:ss"))); + + List horizontalContentList = new ArrayList<>(); + horizontalContentList.add(HorizontalContent.builder().keyname("请假时间") + .value(String.join("至", LocalDateTimeUtil.format(dto.getRequestStartTime(), "yyyy-MM-dd HH:mm"), + LocalDateTimeUtil.format(dto.getRequestEndTime(), "yyyy-MM-dd HH:mm"))).build()); + horizontalContentList + .add(HorizontalContent.builder().keyname("结果").value(dto.getStatus() == 1 ? "审批通过" : "审批未通过").build()); +// horizontalContentList.add(HorizontalContent.builder().keyname("请假原因").value(dto.getRequestReason()).build()); + templateCardNotice.setHorizontal_content_list(horizontalContentList); + templateCardNotice.setCard_action(CardAction.builder().type(1).url(url).build()); + templateCardNotice.setJump_list(Collections.singletonList(Jump.builder().type(1).title("点击查看详情").url(url).build())); + + TemplateCardStaffNotice templateCardStaffNotice = new TemplateCardStaffNotice(); + templateCardStaffNotice.setTouser(dto.getStaffWxId()); + templateCardStaffNotice.setAgentid(app.getWxAgentId()); + templateCardStaffNotice.setTemplate_card(templateCardNotice); + //发送微信通知 + wxUtil.pushStaffNotice(accessToken, templateCardStaffNotice); + } + } + + /** + * 添加请假策略 + */ + public void addLeaveRequestStrategy(Long strategyId, EduLeaveRequestUser user) { + ADD_LEAVE_REQUEST_POOL.execute(() -> { + remoteAttendanceStrategyService.addLeaveRequestStrategy( + AddLeaveRequestStrategyDTO.builder() + .requestId(user.getId()) + .userId(user.getUserId()) + .strategyId(strategyId) + .requestType(user.getRequestType()) + .schoolId(user.getSchoolId()) + .startTime(user.getStartTime()) + .endTime(user.getEndTime()) + .build()); + }); + } +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/service/impl/EduLeaveRequestUserViewServiceImpl.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/service/impl/EduLeaveRequestUserViewServiceImpl.java new file mode 100644 index 0000000..a92795b --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/userLeave/service/impl/EduLeaveRequestUserViewServiceImpl.java @@ -0,0 +1,29 @@ +package com.yida.data.school.userLeave.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.userLeave.EduLeaveRequestProcessConfig; +import com.yida.data.common.core.entity.userLeave.EduLeaveRequestUserView; +import com.yida.data.school.leave.mapper.EduLeaveRequestMapper; +import com.yida.data.school.leave.service.EduLeaveRequestService; +import com.yida.data.school.userLeave.mapper.EduLeaveRequestProcessConfigMapper; +import com.yida.data.school.userLeave.mapper.EduLeaveRequestUserViewMapper; +import com.yida.data.school.userLeave.service.EduLeaveRequestProcessConfigService; +import com.yida.data.school.userLeave.service.EduLeaveRequestUserViewService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +/** + * Service实现 + * + * @author wjm + * @date 2022-12-01 10:45:56 + */ +@Service +@RequiredArgsConstructor +@Transactional(propagation = Propagation.SUPPORTS, readOnly = true) +public class EduLeaveRequestUserViewServiceImpl extends ServiceImpl + implements EduLeaveRequestUserViewService { + +} diff --git a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/visitor/service/impl/EduVisitorRecordServiceImpl.java b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/visitor/service/impl/EduVisitorRecordServiceImpl.java index 9d5fdf4..0538a82 100644 --- a/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/visitor/service/impl/EduVisitorRecordServiceImpl.java +++ b/febs-server/edu-school/edu-school-biz/src/main/java/com/yida/data/school/visitor/service/impl/EduVisitorRecordServiceImpl.java @@ -224,7 +224,7 @@ public class EduVisitorRecordServiceImpl extends ServiceImpl if (staff != null) { try { EduApp app = commonService - .getAppByCodeAndSchool(AppConstant.VISITOR_STAFF, null, visitorRecord.getSchoolId()); + .getAppByCodeAndSchool(AppConstant.CONTACT_SELECT, null, visitorRecord.getSchoolId()); BaseStaffNotice notice = new BaseStaffNotice(); notice .setText(new Text(String diff --git a/febs-server/edu-school/edu-school-biz/src/main/resources/bootstrap.yml b/febs-server/edu-school/edu-school-biz/src/main/resources/bootstrap.yml index a4db71b..fd3e14d 100644 --- a/febs-server/edu-school/edu-school-biz/src/main/resources/bootstrap.yml +++ b/febs-server/edu-school/edu-school-biz/src/main/resources/bootstrap.yml @@ -1,6 +1,7 @@ spring: profiles: active: "@env-name@" +# active: "dev" cloud: nacos: config: diff --git a/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/classCall/EduClassScheduleMapper.xml b/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/classCall/EduClassScheduleMapper.xml new file mode 100644 index 0000000..742f984 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/classCall/EduClassScheduleMapper.xml @@ -0,0 +1,20 @@ + + + + + diff --git a/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/index/EduDeptHomeAppMapper.xml b/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/index/EduDeptHomeAppMapper.xml new file mode 100644 index 0000000..ccf6d5e --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/index/EduDeptHomeAppMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/news/EduNoticeSchoolMapper.xml b/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/news/EduNoticeSchoolMapper.xml index 39f86c4..557ae0e 100644 --- a/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/news/EduNoticeSchoolMapper.xml +++ b/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/news/EduNoticeSchoolMapper.xml @@ -49,20 +49,20 @@ diff --git a/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/screen/EduSchoolDashboardDataBaseMapper.xml b/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/screen/EduSchoolDashboardDataBaseMapper.xml new file mode 100644 index 0000000..2215800 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/screen/EduSchoolDashboardDataBaseMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/screen/EduSchoolDashboardDataMapper.xml b/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/screen/EduSchoolDashboardDataMapper.xml new file mode 100644 index 0000000..16c2931 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/screen/EduSchoolDashboardDataMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/screen/EduSchoolDashboardDataTeacherMapper.xml b/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/screen/EduSchoolDashboardDataTeacherMapper.xml new file mode 100644 index 0000000..b5d505c --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/screen/EduSchoolDashboardDataTeacherMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/smart/EduGuideStepOrderMapper.xml b/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/smart/EduGuideStepOrderMapper.xml new file mode 100644 index 0000000..bdb6f3a --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/smart/EduGuideStepOrderMapper.xml @@ -0,0 +1,17 @@ + + + + + + + + diff --git a/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/smart/EduSmartWelcomeGuideMapper.xml b/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/smart/EduSmartWelcomeGuideMapper.xml new file mode 100644 index 0000000..6f8cb62 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/smart/EduSmartWelcomeGuideMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + diff --git a/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/smart/EduSmartWelcomeGuideRosterMapper.xml b/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/smart/EduSmartWelcomeGuideRosterMapper.xml new file mode 100644 index 0000000..f911416 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/smart/EduSmartWelcomeGuideRosterMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + diff --git a/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/smart/EduSmartWelcomeGuideRosterRelationMapper.xml b/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/smart/EduSmartWelcomeGuideRosterRelationMapper.xml new file mode 100644 index 0000000..96e7c5b --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/smart/EduSmartWelcomeGuideRosterRelationMapper.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/smart/EduSmartWelcomeGuideRosterRelationStepMapper.xml b/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/smart/EduSmartWelcomeGuideRosterRelationStepMapper.xml new file mode 100644 index 0000000..9decd69 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/smart/EduSmartWelcomeGuideRosterRelationStepMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + diff --git a/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/smart/EduSmartWelcomeGuideStepClassMapper.xml b/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/smart/EduSmartWelcomeGuideStepClassMapper.xml new file mode 100644 index 0000000..d65b816 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/smart/EduSmartWelcomeGuideStepClassMapper.xml @@ -0,0 +1,15 @@ + + + + + update edu_smart_welcome_guide_step_class + set real_male_number = real_male_number + 1 + where id = #{id} + + + + update edu_smart_welcome_guide_step_class + set real_female_number = real_female_number + 1 + where id = #{id} + + diff --git a/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/smart/EduSmartWelcomeGuideStepDormMapper.xml b/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/smart/EduSmartWelcomeGuideStepDormMapper.xml new file mode 100644 index 0000000..9d5d08c --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/smart/EduSmartWelcomeGuideStepDormMapper.xml @@ -0,0 +1,9 @@ + + + + + update edu_smart_welcome_guide_step_dorm + set real_number = real_number + 1 + where id = #{id} + + diff --git a/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/smart/EduSmartWelcomeGuideStepMapper.xml b/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/smart/EduSmartWelcomeGuideStepMapper.xml new file mode 100644 index 0000000..7d81a8d --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/smart/EduSmartWelcomeGuideStepMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/smart/EduSmartWelcomeGuideStepStaffMapper.xml b/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/smart/EduSmartWelcomeGuideStepStaffMapper.xml new file mode 100644 index 0000000..628f7dc --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/smart/EduSmartWelcomeGuideStepStaffMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/userLeave/EduLeaveRequestProcessConfigApplicableDepartmentsMapper.xml b/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/userLeave/EduLeaveRequestProcessConfigApplicableDepartmentsMapper.xml new file mode 100644 index 0000000..ce5b4ff --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/userLeave/EduLeaveRequestProcessConfigApplicableDepartmentsMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/userLeave/EduLeaveRequestProcessConfigApprovalUserMapper.xml b/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/userLeave/EduLeaveRequestProcessConfigApprovalUserMapper.xml new file mode 100644 index 0000000..d3a4563 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/userLeave/EduLeaveRequestProcessConfigApprovalUserMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/userLeave/EduLeaveRequestProcessConfigMapper.xml b/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/userLeave/EduLeaveRequestProcessConfigMapper.xml new file mode 100644 index 0000000..158b386 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/userLeave/EduLeaveRequestProcessConfigMapper.xml @@ -0,0 +1,42 @@ + + + + + + + + + + diff --git a/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/userLeave/EduLeaveRequestProcessConfigViewMapper.xml b/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/userLeave/EduLeaveRequestProcessConfigViewMapper.xml new file mode 100644 index 0000000..6f51f68 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/userLeave/EduLeaveRequestProcessConfigViewMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/userLeave/EduLeaveRequestProcessRecordMapper.xml b/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/userLeave/EduLeaveRequestProcessRecordMapper.xml new file mode 100644 index 0000000..341c6f0 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/userLeave/EduLeaveRequestProcessRecordMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/userLeave/EduLeaveRequestUserMapper.xml b/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/userLeave/EduLeaveRequestUserMapper.xml new file mode 100644 index 0000000..0ebc405 --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/userLeave/EduLeaveRequestUserMapper.xml @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + diff --git a/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/userLeave/EduLeaveRequestUserViewMapper.xml b/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/userLeave/EduLeaveRequestUserViewMapper.xml new file mode 100644 index 0000000..48923bb --- /dev/null +++ b/febs-server/edu-school/edu-school-biz/src/main/resources/mapper/userLeave/EduLeaveRequestUserViewMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/febs-server/edu-school/edu-school-biz/src/main/resources/template/固定宿舍学生导入模板.xlsx b/febs-server/edu-school/edu-school-biz/src/main/resources/template/固定宿舍学生导入模板.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..98194951de5679fe6afb15182ba167e8303aeb0a GIT binary patch literal 10105 zcmeHtWmH|uvM%l}ArLgd-GlqWWubxK?k>SKcyI~s5FCQLySqCH5}e?cyGYL2+2QPa z#(O{C7_WcKImcRM{Z-HEnq38yf`mc8_e-C)jgMqa^(9YV%o&g9V!vg&P z_meEXocEd=91P410t^i8?_|0*HuTPx7OBzgl8{VTfJ@&WXcg8hmVg`s1t|1)C{^FM zj8>|A5)H)Dg!gLe#{Aca>c(5;PgsVeGh_j;4-W@DmQr4H81EI5B6F0LNbH&<03k%@ zHIfY_8J>OednL&u88bM6C%y~AlNx-_o5rc`Cybo-9&S^yL8$oC2bXGJ$s65r85@K> z>R??5DWgy!8jjE3@*w;yQb+@lX5h#J-GSDSrqU_wSF2-7h4G`>^z4pc&+h6kMr%d^Wvk zwy#Fqp}n*DR^zKGd%V=6s#Xi#KDAx?1$lU3oIw8xG`Du4g%Sv8BM{K&e+OFM+RpG1 z>9FW=$xg=S{zuTOnO|C@7B&(x_XG^zpg_@tyd$};1teFIj$1_#ceHV913i!@ostP$ z*A4APetba^qwf$S*NKi$tpBz=Yl>0Syxb(3fGD>q ztBKXdZ~);$j1HvSMEt4Qhxid?Ed9Zc83_c=ffpN1tRb9UtcV&+4}H(P^@Rddee``f z177H;9t4|&V!1~Yr%8`PK=lH>Ar5H6VbC8=xEKc>ILD}YKSf(*1an$ zUV5?DKsY7wqH{aqczOS{p#)EIc|QblK%t%Lb(@B1Mbd7!pTXPf+`KvpRw>#9N0!#3 zdMMkPkrwtcA_nX9qhzcf&v>g2#-aqF_^=PS_G1^n+`UZCq9wP*h@Ol@`o8mCl!@$1 zi_5J}i^RNUzNN1h+NBHppJkI#jqis}n?r>Y1r1fh7YVM0B(%J9)${nX|!L zy6Jigi^p^{S5IQ-PwscCz8EdZU38F)sCLX=(VcemcqKVKlpXnuMF?VPsHYHJMw`QV ziw^aotWSlFg1gd#M^^T=6yLhoSXhm<;+4v27A@y`kg}~0Wu`gSt!2@QIUK@Xmy=q$wp_vqtAZnj1`nvc!bfnI06%5K3sf584 z(>Il63jmpPJEUqduK41UOIyhzvo*mnwNI5^43F0+>qoi++^s`4{Jhd!?`m{zWXl~1 zd`d!Kt98yfj!hW?W?k03+*Bh@{Yo4cGh3mv zk9wwuhwmqa*`*V-JbpI#}dp9o39I$QS%VZz$WeGo?%bKkK&&qLK%i%I$Y+vvlL%^7Q?n|KmVOF>)nU%dZTnYF+6@ez(v!9xkEOos7V%Q;Fz$)2W zFK<2;qY_cF<{0`S0}VKVCH~yM_=@~(5BevO?}5>>K(A2_&e4z);b8G;E+}be&JLys zsNN&6(aOPbznceeu{ikfRdBvr)T>5F{8rd2+QznFQ<0fZsUi4_EgBq?=yzm{Ue+#m zx}n!tFUYe_@JdugBW~}Rwaa-gMDX2-dRjJet=TSQv~Fyo(>O;X_yV{B!Y?~$S3BMu z)>NE}2!?T;?)zfQ*0PuQeeMq_u##?*Aap|3qV$IUg3F%6PLA{$9a) z_l{e{Mg5enqF2k$$*OyxdkuqL&BrX0#&cx$(pX)?{uw{kxk7ClK=H#Aw7~zDWy$jC(0NAfN(_PsJJZ> z!X<9}XR{Ham9WQxnRM4L2RR|t^|LMBoNB*Y3}r}xj;@Kqql>+RhiENbX{CWVyB&i> z3x#?ixq?|wLn5^77eyir%kK2{OjJSIgTnVaak4|7$qC6QKjN#nubArtt^PiiMP_q4 z9*jDszRqLOSr210I7SQl-^sN$zoIpdxXO}R<&8wus;2F-6ka?p&n*^xMQ*xH|3>dT zT~0CGM+-MT%G1jR2Yo-QK6N4_EqYlEZ4A-)d4PotNzp-NNDMd~J@nWO8r-mG^cUqQ ztF@lcLKCHw4d?SAVfE88M8eR5d-ZlSSv~fZOB7pv_LkRVqhe?#`Mv!txcsQ)FeRA& z{`?dIwxlZEQaqEjrovV{<{5FYGUij4g_$j1X!vG5H;$2&W)(HY4QqG`@sR=DvQEds zH?s3>tW_svJdIz5a9#i(hHPUt~Xte{M_%YOB^S*zmo?HoVFYJlk!em^X29$g+Jh2AjJSRHTuLGAe0Qu{2~wB);X4Yt$@wV@BU1;AJSg zC0aCH_*y}YRvxkR9$9<$-@7r;If zo-|?eK&M8kbA09vi$<&#nB!_mg!D{eywjZtT2UUAP(8Yi+WH*`0Z3dGR#CI0Nc0Pm zghdWKxDYnTCRrQZ9+Yc4EAj6_6F98$GDn?I!g@nH&7Kzrd&Y8Od&Uu{N4&gEm!0eP zw}F=}wN)wpiySB+h}s_a{Y2VJfL8wN)9KF9fs=}$ALos*qh1eH_;9$aF+1Jc5ngUL zSKZkW+MeIbp<1YpGvJOUgTx)e@H2P`eXM#IOTQQp%hqNQ>3u71BN?M7S(eX)Y+~;& zMw)$DdSZn@Nod$M7_%5&+zgb)qFZ+-`+&cOvR&K_C;%@t(Sk<2q_72!Xh?_D@qV}* zbgs4Cud88^$S^Y!+?{J7zz`eK4AA$7#K81F!zaR2$Xce8BxpPYYTNXSAuMO*` z+&HX3O<0VxhqWMGGoOW2A-<%ZUSQRCvP>ucO|I3d?qnYT0nls6TBbJ=+DFG{ z704kuP|k}N2-t_ULm~+or+;I3OmJuvGS8vK>GgS=Y!WL33O3nHqSP@5ke7|s3^C-gqW z39DHv$~*6{7j8%2>;UTBFC1M|LNX=y0=h01^1g>ZV_$hSpeiSWTTd->M5hah=cEfP zV=OLmEl7E0FbGii06(U10$awYjz8 z({KY{;M@So=Y@4)?xw83%1u$(9&zjh7Rw$J044`jWgH@v{Mdm^f^s#GVoQZBD=}-w zW>9&CoPFDl(WMj*X=~>F2#g>0uH#|+vES>}SSF11Sn;8YF0&wSJz_OSvk%>_Q6Kt}8tPE1Vq zPR1_Vw?RkLYYtP_R~*!x`mx@#xmM&%h-(Y|Z#n|*KlfWyxNi-M<|QOUDc9YXJEbem z6+i|@njsF31q38Y3VU}a#l(5lqZskhKuZ>m_vfgp`RQEs=74cGl#*qmpD2&d`=eWO z-zLQ?@X3pub*zKql?Tstu6Ys^W{gHk)}1h73%0hMr_|IW+J)LDIdn@g`BiQvkdep^ zmdK9N#?UQc@Og^jGV`^06$wL{j>VY!CG4uR5OxCDIjfI-l@y2e}^60!w=9Ok@DqxizDr4f4 z56A$HuPWv=GbufT=h7U<8%;fo39m)qHAqSBQ7`zZ-9@FJ?;%%@US`z1yt)^{^egwt z=QDnRnuC}_fG@CV0Bgx;sxVV!x|dTDZ#iSUw7caV@myWX3BxOWV$Q{WtHR#ygf=Yo z?cC>T0(BF!;vd7X~fsw!lYO}Rgl*u${*Bz2(O zjY$R!4Efh4XYb%*VQBxD$xLflMl7mgKZJLAm20%acCnsFX)UEn?;7+>NFu&100==S z8DbdsMC+r5D-L_BP&*8^WxdRV@Sm2XZKVDRNuVQWQEk!al_$ZHe!*aK*j#f|-|x6V zf#@ zQ*Jtj167l?JypG?4!Ux45@gT%EqYx(uXK%BK!y+TV# zlVFWkx&LL$L$)AV^XKk|ah4WGb$O{^s^T~4Q-kkY?lzbf+l=z~I#fRK8Nk~4Fp>*) zsg%W2+-<@_9n6-EI!&ZZ@k7UpGK}+`o9-KLZL_q+ZtNdgyn{@qP-75|?~h77c!-GO zrbF#3jzX%2WPpo<+C!Rv}{D;uaU{wN}^@x(jh>aDJTTsrmPcuw~ksNShJZ4HX?BmrB{Eu z@}+(bFH16|DM`lDK5;0Kr@eWgVi~h|e2k7I!Iuqd$a#s5!;wYRbS^-%D0+?F49=kb z+4uL)S>t;#u?FWdJhE%vXzdWEZ)VDPJ;R;Ay;e_s_t6ZVGw=$jSEnMIj@^>wgPP0^ z6e0mMOPDgv;3ci>tWYq6z1iogj7fjKA!&_KDT}VtIDgVy$e1 zZr(h~5_5|> z6*CTPt!a(fk}WyD`lWgUa%<6N$7~_bH~K|t%eBe3MW3OE@=Hc$9!je%2zy?op1KA* z$PH6QNzsc9zA=wCoUS%&)~b~jR&TyXn5+HJpgavO>N2mCda(-jy;?F?Yn*m@Dqa&p z@0P}{GOP6UaNon*i4Xf_WWx>dg$<4HxeyKl|QvNaoq6&}Ut`EkhFB_fd#6lEq(K51sGyMW>602*$O$2m~kS{_*@X zCK3t{#n;WL1M9?(_J(=)DKsxn97?6Nw6~EY>IoJD9ACSp6H3nSeURD}NAJ0HPxqfR zZVwuy!#b+jba^e2c(3)kWR09^okFuJ0~r-6vRk&oNS1wF)Uc_4fNgPp-pb`LbJgBm zRmicU&oTyjj(wlYV)`tHJ98#SYU=wLb;+jw(G<+>6xSjooV)c$C*l^bSMBYn%>*z} zli@p%C2fbImW)osu>=4v=#iT8#?E|MjQU#CN;4N<) zP>5(Q3Sn`Cq&u3_g5(9Ej+=;u_Du^0f<6OB;(_HrX^FVy;)H0uMzx^z`0W6afW~(U zT>=|wP1t6gb}opo(-6YZ4im-EJA!D$kt)%IT>8RnpeJdRO8U;o2yf9uwd69%hXk55 z$j$QmAW={d0`6}FG7ss!-Gxo7(xKzPqO;HUtZT-MC zu!8b?1=%^f=Bo|fUE>(%yPD*e2s$AmU^ue(Sqlng&49DjXAsNR5(8WzfkM;tl#;PF zGIg<3Q((Q6{_sMXKs_yl;ren)e=AMOSdPtZOP=S3w%n*&WW@9)WF3^cjTw~kJ?q2S zG6HH#D}KzSIJK8LvE2u}2_Hch5UCsLh%@LS`uHyk%Hj*)G)XBmAeh+->tBRHAA1(u z}x<6f0mKcBt! z%Ge=t9$6-`*Z`fSeNorUgE@Rd!)5#%76*atD1ei>> zr-`(^qsCViU*#Cvq|CIh=w6)IJ;o;l;yWW`7oEv+W8|kk(!{e^E!H!T3~R;^EC%Ts{tG>+{`WUgD%X_qe1lk$+tE_kvkD zTn3vUYi;&!Q7d>d+9RY4B#2w<5&KOPcMG-UsfvFIB9~F8h5FPZ^pcm=bVZMZgY6l{ zb^D4>qV&vFH|Vn>mf*`Fc?g$=V_yaIOXKuh6%o;$36ZeTA9vsGuyTmht+KM%?iDn|DZM1^X0Q(laDE@$0{^@Ho5m~|XxQwW}m~bgg(q~P4H1d(S zaZ1Rkw6@`&kAf5M9TMf&%|upk6;=#I{fm6)SksU>2|m?FKO=0Hyv?R6?iX=*UdfYJF!beztHkPkjuy5f*uX%dCn+7 zk04F&!9Oj;s)$J_5mOYeMp|ScKup+mk6(>Z5v8_ zaF!+cE%M!O7tb`I`aIod77tU2v#9Z?S3N_U_Q1bmt<~9MG*1Vj+e<@w|h*WxwNpD7+gPL=H;D78}somD1VCt zcg=HX$8wJkgbfF%#DMw>pT|;!p0&04&*Qu(8L3VIw16YuAG-66GD%ecsTkkjcn(u+>Px@JKdA+%{)ykm2cByNwwFS7#p%CC1l}udTcT;u|2%p8tQYq zVDmU*M1=vZ?URlk9@XE%xZUyWiQ&dtvNYkG5)E5+1(^7mp0Ucl-NZsvZSdGCf$Z^s zMT;E@;n6k-ftP{pn79wrT~J{?)=A2SAb<&i?1xymOf65FDN+%iLwwxr9jG+=pI&^xY4e^lz}?5te~^O?v4kK^KByn@4I~J zzIMLtUR2n1K7C9htB@3O%z`sKEUPs~-U+hV>$jlQ9_BVlZY~o}bvhvN^@S zT+NP=*cCQb8vyREY#FO(%5FLrb!sE`86|yFeGb>Fhxm>4Y~!xAhGCGr7bo4zY3C}$ zKW_nsc7?Ogm9&FhsSn2JKs-oLJJ97Vc0iztmVMUqJ+j+gwgWZhj(!i?b7yiXq+~YS z77q@^us+P*TtIZZG`kezZkX-_S;Chd#*YbS`wT{{e+Eoz7wDJvpnyOCTB47IVRd0^ zD+fa>2W=%68$)}|$DmLhJ80GMh*jJTYE&&Y6R@C=8X}Z0o=#yGw(jD+NEfOLl7H(_ zmjD?W^u(A9X>Xd_p$0!pc5Z1jv@>lQ$-)G^a^!SWS4Hj(p9(ZD zUtfc_V=5CmZOU0Sry!&@=-+hJ9Ue%qDW%SZ`x49WVIkXr{e3L;CLXP1;A;cF6TkPa zTkqQP4#Toea(xYG-JP+MENl$F&Z!5cAm#Qdqs&#gXh{->)#t$}aD|h$2V!{g z5E)ACWpcVF%WEztaP;ap+HYxfG7qG{YpdWRt_wE9%28mbPma5wAs~8Z6gh~wxhbJ^ zYu&;XA<$b9holk1HYl}i*3NQyQ`$pZ8Q$+tE~uH$c`n4d76MF1)_UoL7CZ_~SI9Sf_}oqR9(diZo!An2f{ORx5LiDquwShzPrU?k6c{)dG3ZK5@{d0ICE%aW z_aB4NukqOR5fYv`K7e*FP@(-(|=R;__qEUkIEj$-@0-B)c3R>=aKlA zK8nAy{i{3YDMU}3On!4mf|mDRO8?z*@|68)gT!xkOi(cS&Hh)r#DAOgV;8`$@i=K~ zsDJeYJWltYUGgVN6GVRtT~7^t8si@I{6gva?`;1O@t(?gnkoI3a|QpZ;7SPs>lgHNO2j+wWr3Qw5{Wj_m|h2{)6{-lgCr@pH|_2OHqXV%lv;? s@bmVwCjWmfMHu7@5cq$a$4@CgE4@G|=%0ZD6SPglfNUOn`KbMW0O(qACjbBd literal 0 HcmV?d00001 diff --git a/febs-server/edu-school/edu-school-biz/src/main/resources/template/固定班级学生导入模板.xlsx b/febs-server/edu-school/edu-school-biz/src/main/resources/template/固定班级学生导入模板.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..9e97fe7fa27ade0ddf6468ec5a640dcae3675d7d GIT binary patch literal 10143 zcmeHtWmH_twl3~2Ng!x~yNBSC#%UUY252O>dvJGxOK`W~?(XjH5-d2u3FJa@&dv^J z-!tC(`NnwlW34s1r_}ns>RGdEPLL!t3=+h{@B^+1Jly|15bqy!%-@5o%q^@LLHA-f z_a7kq6pJb0z2b(1fG~oBfWY{>n3jbFgT1LqQbel+G&2t1!t)14nK`Q|AX7&U2J-`2 z#aAx9r3#NY9kFEL-RhbVpB3Vo(Pr6W)&Z$hAmG)(LBGpF;`28B-8?c>&f-Gx9fMd9 zl*p`Fg02MPlN_&?5MGKV&lO60g)9$CnX8P;Inu!VT?y{1UA zkjyt`jV2*-*e@sa=IPM&)^`-0dG5$Lht}tb9H}E*YiFhgeA!>#IT~QUofFH+Y7JW` z>P#Eg-5(9O*y^sHuD3wcZw=K?+ABV<QS z(T!pGa>yChJ%evKrlP#dO*On?InODl<-*I~#SQBi_D`To$ua=)_dx621C9B2px>KY z={_JG95E`<&h*UZ5Oz83OOxbSXZ!^2u37IF3!Q%EPMSD1~6p((m@u#X9S4=f1_LU zb8ajZz1nOU)GlrfRoKV(>3t(@H-TDv9Z+l^8dsPE6QdQai9_r{Xc>sE2rPtpFpQ7X ztcES2Kjsr+nuf{kg-u4%zjMcVhBTtt&|V>W96Ieac`)puIBRXRp`@@~5l}xIlaBr2 zAnPsnd-dtYy5%l}E9#~MHE^}Ud);_-L;(jHSnMY?jHX~~RyWYXcF6?JA>tqw^1*kq zJ*RAe!zo28zkifeuRD3v=qiyVa?kvNAOFiAaDP&;{aqu5_MQUFdkV1spupDJ z#@zIQgsgCN$#y0j-$U3R!aXkWp$xarOhu>dNWfIN_0eP5s%g>^5kSAo<-ypu4M!r3 z=vy1B4#VP##p@7gLJ8nr9Jx>d5}k}W@PXXrX^kKzOxILdAv`$%DYUIc!OkUm!I&M< z)Je--SS+%wv2q;i{rFy|^7G-sta%%W&`R5kC9O$YmzNTg0~ujYScRY#2D&vF+(BTmMRQ8Pu(U;*U@=NaI zm7p$upYK5<`|U})vqQn^!?z=5K6k6#2>Sjk!@QFj3+PXqXII86hnffYARe&&=Wqjk zkFCAQ&p`9f0%*SkKA2k>TN~)=+B^xik6=@n`c6C zAue&lI0g5cjY)cP0zR?LxT8`{sVC#ch4_fYP*7Xe7ZcNWfA&HV-hx+s(b+D1qFi3D zU)V#G_$hnHFeWoffL@ApR~p#trmDUmw+3B|TqK41+67YPaPx3^5P!X@2?_xQ(v9;V3^3igG7hg@1_bjw_~i^qzs($N^^(_HCgORfRdTqkZZ}1>aLRC^A;KMoa&vXV zt$O(mdx&I3ms5rIbKZlCZ#G@$oYXH5TD-;880eg)ObAh=rW%^Y>4m86w2k=N0Phh7HCTk<}Bkz_S zD`o@$LXh>tqc=&37PtwXOoxh;!ygHz(O%B`zZ;=_syFxk8wGfM1EX=s5lCj1JrrK8oV>%DcmAv- zt3c!>h2a*1lJ;4O%-a+XFkVc!tDD7B%)Rv5q_M!{h(#5Q5oG;mz9tr=`TOO8k&yHZ zup`$P2!kRKUlhX4R=R@n4CE8n?9T>-RZohMiGn`gsc0%gP|8Vd%bj8Cb7yh}z204y5K@cgx#>{}60<%T zXoThB+{}b_%fIV-ilLCEWO+3<6upo}$%q@APBFtFt4$LUntA1jePjBDXClhcc&-$qRk5~5N=B%T^a4}vIUt$M{(PR zXdNmBCGD09FTcoF#R=TRvh!-b`U3A_CF^;t80M`55_b*`qydwLuoMX#)?Jk6eB zqh6=U3FhDdF!jVK)>n4<6ec!7GO>s5+Hmay*>m(EW-bKZ(n^Nw71k@7>arn|+;Ga& ztAAE9VrUX@(*;N-U@2Z+OGBGJLB?2u%smvaqqAT|M;~0n3_6Jx&wcQKbY@N*W3N$@UnX2#;crHho)l?KYGE zG@c@xh*5kP<~eEXJSRRvAUkve&_b&V?aInb?3>WoQ#M)Y!*&>9?Sbt^*Yo{deVLJ6 z{ZRBnUfza__SM@Pzl)~oibS7zPP9N|4VT+qVvPkrGym1eWczU6ahd;*vwHYpx4Q}g z1U$CL?ar-GH>c~%&WunE*KZ{-P1HxJ2#4eTVm849sk}rUW?f80Uvx--)#=3AUkh4D zM;J&KWz(P=I64bZre72tn;}sV>9+Jo&W985A^(9;rUnW)9TIT)@p7pg)F?_ zLd41;Mp?0C*ZTXtxsT@)$}lOi`vk;4(Ad6NZ>E|5D708buoS(YU5%Kata4&POg$B3 z@uLl^(TDPw!J{B{IekfC`vdOW&9Kropw{`^)E4o@ zjPa{-bNJ|u&1E@*b$os^eWayxtHRt3>3-$wBET*&+*nrAE&~8ICv|x=GPUf;zI3cY zC5UoUkv%;wecPg6VTyud%ZkaN2p?s0%6kY-kRL`7>@(i1hq^^L&;y!Zyr!}aI&M>` z6Z5qflOr~4+;Wj;2li>}0x=8yP~lwcc)E;W%}}M!>1&cY!~u4duzM_rjlrMF5Rx4b za|xwIpFE9>?A%V>VgK51i+;sv==hS8ru}`C`*fBW1vB!>T(44_?`>(XNtyHJph$LX z0*pe-veZ%*4*A@NHBX4+R=3G-5i!z5~snQ#T0Th0=zs^YAItmADu zC7Hd-*JH^^f&GQRQMyR_1)NMZxNnLW=r**`i&P&R6{Px7!f860?ovLdUtrgGD&rZU zUs{OMF^$EIoz{Rz{b-`RCk~Me2&DGi4LoSUvA(IE`9|O9dz$X5Uh5miR`^C{&SgMi z;hew3MG~@0ql??-_ElzItfv!?!D7Kwz)+%4+=HB@EGRZ!$y=J|#SzL)Fp7wQ^y0>M zJ8+5@^b&aWy3^U3My2Uuj^MJMn>b-0HA>Y_S~zl+|0%OMx?X*rx_OMglesJ=FSBvE zk%}Tjd7I*h*!UePfOA99n06|$tN%=j^JuN1iz)Wi8$>lS(p&U%ei~;Hsb{;WmBSaQ zRWB}Yg|NL!JaYN;pQC3YXA%+!tn0v=G8xKERT%DO7RH!P=`ZYTI)^?}m9)chOBtJS zu-+`QwmPN@PI@;}T1lvCV05%MisO?eYZt~G!pt9w>o&0FHNUb=e>tn!7FAJ!YOpTz zXA*l5>`hv8zq>I@LqMSZ+T^Tl987erA2OLqHPg^}W!$@v4!07uR`?FKV@dErlGKh) z*O&zIyUze2D0y8h{jP}j=pkBQY(Nug3Yt`!)VpPiv!Sf~1AHUvuy~T5pXsp3KKP}^!Y}Ji;W47{2e&0w%fuNbtM(syQ zn(IYOqk>Yj>%<8+J>yZ5ujAL#$z5)Z+deyfuCv4h(GYCv)V9M{6B$%oO^P&U^P<4w z$!2^4Za(KR)HX1!=i*Vx1V37mVvdZrBUqgAQ+^h>|4bo!bxzzs+Hj|KpJ^L@aodP{ zJKEE1+LZgPV}%j5%|T5EyyW8SIXrLu)3azhrlSmBqijE%^WFqP&fL#PUQ;MsE7PVM z&-%W!ccZLLwyLs{0n`ObDHHwPP2bm;=Ueo$`Pvk7 z_;lc{JeVj1I~0p!D8H}6!|YEN58I6;PVmFVh%k=wof+=wZ*H-+M6K-|n0$avp;TcM zj_D0g+P@2p=B7vQDF{cYgl0sDM&LwL$rk;tIIN|QGVFGCawY6IB}=;p9UYgd74bf* z=Qxgc8ePb$q{F178QLnQiH2X3`Ph#wNJizKVysO#>VNNNp;DnQUY(2q^ze&yFI}h!@E*V`tZpJ@wMM2O1EZN z20e!<>qiyoZ5U)iSk_<#+WreV;IvQxqqR|KMe4W@-++|buq0)suiz$)g^vDB4K4t< zJztX1F<%V~)yiILH%UOL#o{&}n)TD#l^-{h>7^V&=cyJ35pe8$r}|9KG?5^!eL-^9 za>hLr0FAv#lY||OvC^=@V#=NnQ~5%*4z)SI)HXxNRq1`c%3^iGO@1ltKyKmC)Ll`f z2~pR}q!Y&g8<|0>a7hNyekJ1=-N{O$MsT&1uxjHi(oFToI)zC{5rqQ@4%}zpc!~o7IqvHr;S_iwcy{NqxLEURVbBnaFkc9|Wt^g72r zgmbg!iDod<;b~6xZ|+1}nQQY<(h*`T?W(xVcA1V;iA-X!0>1Evd$Ut2gN<@WG3n6B zFFe+RCe)L@N5FwzoG6dk|vGl`6NUZ#_A)cjmdZNyxqa&4c3+O z8>rX!_fKb~*eGZ`lpE_4`{r?s)(I@r19Gg2=r;8BvCq%W znmHV#En7P)3)!~ym`1|RaO`oJOrB&(U>R~2NVr{0a?>YYv0L_ zB*DWLMAK^2XSJUZT_@kDCHPJ4n4sZu;aAyg*~U_L^l{B zV3{6$3&35aegA4H)vkTw`;u(pKC$4s3nigUfwl;@eQB{%veISGRSc^j2h zeJYh~*Xm$~w1CROk{3(S)9MS&sLp-f*iZMDdr>F!A^ZD_$iug+X!FlOlcYtkfB+UV zoPP=Wf9jfZl0hu)DL-?lU@LB%>T9qXYwW<{1we3&wnMIEKvE0&G=OJ8e#6PZDGkVs zN8O51ULL!xTIW|n;6;lEgsnm z)E}3<-4JFr7Xb#S;PviJ8aY=cYox@!STS>L60fm>PN9};Ww9^*6w<16Fgaa9FL>Du zm$XSa*`HutwJv$YNljgL-v6zLBK&ed5y+)x+fxSnLO&%-@r}s#*qh+tAK$-zm!)}O z1+}@3MVk?N7;<-Nf4TCZ{pLc1*fqH?uwf)CKszcWBI~Ivk4Bx1ROp=pN8QbG2SLqC zm^Xc&SJ$_8uCymdvZ9{3IwmJGmI;0;TU|RC2J<<^2l}gxWT`!Ky_>xxzHnb}&k1GV zyVm^PFT-iNiVJL|+##9j*LYhM6=(FOsD(~20$|;QAI|R^#Xosv^ad!H5}g`e6B#0@ zPWGgMk5)DeFIpZoiOw>l^e`Znz$Q+1)#%Lq`h$ln{Ua10o z!vnb%>@W0Dsr6Yi+9v%6*fR$PKO!l;WSNd)QEH2>D8qlDziRBt(2iRq@`a8Eib6IL z@BUGTf#;O!{_)mRCPD7Larqn#MB1xygr&)FlYS@MRhO<&*jnz2mr^LF_ z%!07!dmVYZ7++a!zN>n6V&>A%me?1gFuORP7dyDv$U9H7yRpd~hIgW_Jq=|0cGiSg zU=mGto}_)$P^t&sbvkm<(%LgYxuf8p0*#`1$&7r0;JA@YqBFT_-u`)E%|C#BPmlpR7%2G+v(+mv^mn*PLu!7{o1|^4N zdIuz{6_8LZ$16c{R1D$+lHvos!;+N>c~bO>W!38&Wz-A|vJhVfX{!|asHmw+#-h;xuY>b=Tx zAg_|plR(OHi1W$%JjB$LByE|UBpt9=4vU;}zUSDSv%XVjDsWyd{Y`^oz;U)=ZQ~U8 z@WN(p`_s(qwwJt+JimJV-fUgroBXBPjjN)Kjy%_;<`|esnNKpVTxm}Y&V!1A1-izo zh%jpHxSohM&s1Lb9yBsez2e(n4k>_CAm}Z=ZYimT{#nuZT^SwNHr?gBhmG^T5P|-? z2%&9mZv6A4FI-x(T>!)P(DR4ZY`t`R1wb;=Gj}EkXTlL&9;vtET3XM3w#;4MD!<)1 z?%c@Jz*_z;C5lXArGcp~eOw%fxZP!uc7f~S=2Tak)d8RVI#NU!(A+w1>*7-RHJIBO z-X-9yWpZN(J@ZCBNvT~ivW+8N!3p_^DKp>BXP9UN*eB0QqpVpir z+mU8`1{5KjKXfnD+(lAJ@>IT}*bM4(Ouc>Nx7#;l)Zqhuq6|<+ficSQL_@)^$qx(; zLxt8(iw2P6C)XoX{QwJgl&Ke6u5{vzY_D$pR?_kfWH(tGR!5xRN)MsdP5?xfv&3)e zpws2ZxZ<3HtK-&M-!G)14=l=Qu5mcyBR>7Q7K;B(Hfc{I*K#*J_$rqnvYt&y5;byg zD*RbQz^n;)Aad}>6$#Q2|01vHT<~$Zuy=L2~Iq(9(d&e|}(*pt?AagUYyF+zbIp|ao9C@4!eQ3oFyceROp0_)+!W)+% zJj_b_MLs;q)+7w~qnC5WOf$wA01oc;u$3)e|KSG-zk)(NdQ^a#Pwd;kg$=c4OS-sj zH6U>ydFtSm!1(x9TWk2JYDK>omp6I(?hi7S?v5`p4t(qyVpb>g`5*pwEdOzuyOjUt$kMxqq+mpXfG5_8YZ7lrVhmykcGG=M9As!^^3COy*Ca zy?I?RR9WJ8+TE60gKB(N%%nIx;{-2~M*%nOGShjCC=>SjBmvr>Z7U77B9fuO>JB;7no!JlHLfzUow&RglxT0`Io31(R8|-#5FP1YR#dn1DRr)|XOPl(t zX~1>+{B{l09=-Ul%FhtGwUNKFovwXvu43$`=zf~wX19GA=#xDMN4NC4$C0d!L%s)2 zZ(qz`P{YsR9j>pRBG@|p*)I7_H~YQ{OIxoC-I+awBuWB1UXu&w+u$DT?kqq=j1-3? z(@wC~7c{ET#d@=NLJMcB<-fue49Z-Cl4?6_NF<{3=q{+IIoetFa z;WDy{B4F+53VW3q_sd{DR^+jbe{_)ob6wE2l6=I9W)CaHC3%ioTnrZ(4K0;Br`Z*V zu>ieAg**cFcDH3j%B=B;hp%g2QWz^U?9!p#VNC^vJ7N;ZxMXz&(TcfP=%gWY*_e`u zMyGe(QERX-)}n|e3*k!?c|c70_lX9KaGJ!L`{4a=EICsazpst$tXpJjA+^yJ@eT6J*sFV>!Du zZLK%K?JRwXh#HCn$g6^l@G_KGs^g;$7)Z$OsrfddPEPV@o!}dUd?W@llE7pV_&WKP z_3CLZcPeYBOWoVO@i`Ua8P~Ze$2@@H&`LMG(40%2;qqBgcwIBq!ieaPHjnR<-TQ7g zE60|^uFxP!NGP12d)u#umd7mJ69oYYL2`eUBmGCtei``ZqyL9s^lLoy#uO0!4o!bL zeH@$~bbdJ<`Ag^LkLkZTd-%2f8V}AM#@~8&{`B{_Yv)1ump{tCtNp8o=P^W&TTy;% zhutslznuQNG3BxP<2H)l>e%^$NsNZ(r2!7i6kCf`Mg~umtzb(AP`eos-bGQEn z)}QarcfSq(Rd9Oj@o{D9w@2N-tNpH1JvQ(-{rPP`knpG9zr*(5CjHRt@oPLV9QKRh zKUzQjT-%SEKOS^{vDWY(y1!dN9#8*qf&RA@F#KQB|5x+L&)d&({r|ZY;5`@j;Q#GC bep>li1O`dM{tO)0_uE9|{hZHVJb3>fP4A8V literal 0 HcmV?d00001 diff --git a/febs-server/edu-school/edu-school-biz/src/main/resources/template/宿舍预选导入模板.xlsx b/febs-server/edu-school/edu-school-biz/src/main/resources/template/宿舍预选导入模板.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..27ffb08cbcfa92c57004182204b250725a49354d GIT binary patch literal 10150 zcmeHtbx>T}vN!H7K>`F4+}+)EaJN8kcb5RcgG+F?;O_43?iM6C!3pFI$-O5h-1Ba| zf4{14Rn6YJW?I(jUc0+z{aQ{690CsHX#@f``Je9p9~n2Si#rL7OQ-dFP(l|8zgb>p{z-%ct3Kr*obgl7~ywfX}v4K0F z4AygyG71%>Vz2m`2j*vyLL7)N3qu;{A!iM4DxJc5vo^k57(b><%jyX7;(L9mR0(lF z{3c~`%vfN4#68yN-R^e;gC(w*Mc0m(DXbaeoST=HCcJsu8g3@&ii_g;xgC+qr9GKb zhDQ^@*Smdnb4@m|#vKvHsfT4(HM}S>RzyK7J*ljRK(6z_#+Vr8= zz8Up^e4ov`7GGV}>#Z48y;kU+-+t{EpI>VD*+8{1T-}2-wplF+RpIF z(qYjPl3n!J{wI)YncJ;0iw&8XNBoAWNDyQp&P2C!%E{Hl6IKy~zU!%U1+4+5O*2R> zr;HrCKkPcs2TWyH;yM zc-{M?4{n~fE?)N@-eG6f69P*}_&6VS6(&l%01Y^)sdPriTw_e_eQeZaO9n{y)6Auni(o6OV9l#z@E1m3KTBq%nYiqawP ze%WvxlTaz!0znc?))~N1h~OtQ$X?VrR=ByS7eIyRovkc^CJ}*)=xkSZ@{C(HXMweJ z*LyD{9@E)UGllkU>aa)cg zUOxZtq2otgsRs+AVcKI4<5vEU8+|awL5yQOGug|?SZxdIQ#GS)!@M9*w*BXD0}iyU zi^b1C^UnlGzX+VI?ab{>3=JKg2PK39#cE5SlT0B&K(POV_9qL&&sRpt(t3#y<&oF) z2k2Q#FCeB>*tU>Xy;>q!sl@$O`jkVoCjc~f>ERB49)R!obrAaH@kW~aF}vC__iPAW zJLl)*6e9^qSY|=2%7rf%eb*xkm?Wd$^42BUBB#h~E{tv;SF&cVI+Q`u2!*!nG+eEB zK61zljA&;eG6%&j&Mt3F9w#upa6wHq>mfCD>oB8zxyUelq{;4}E(vN*bH&2k`lceI zUhJVXx);$Rq9^$VZb)<3ahxf-{y6fDE~{r|S$wBizEnDlb`@Z8h`MayQX;L!Mc^Vr ze`cBYa0CbKrL+}Q+=VQ|iU7)uaayfq%xt|db4!T4Po)%;SB!ufx;VshI z-I2YlgEpWJTfY0z5fW6?qP!2xC8%&)!6cMp~{w!~9aE9780%M6O zaI^m}Ta@wV7L6IQTB1i0xrV$$hPX!kGHdyjUqNo3eo@3HLn4`lCXBd~IFO`IezJ^C zL?j&EI4W+3h+vru@5Nk%XchFSKqk%Y>md$s&3D-rs^_}SOQCcrkkPeKxHPffVZqu; zSKFwdF7C&{Q9>bJO0J?eP!S2P_(c&3L9;q(T!<=2dy@HnBTRPaH#s93eSNqnF_D4%X5oG z-;kQ_(yHoTrpqd(`{>}rM|pYMV4)snHKb04q(!f&qm08FV+UB+5EUI&g~Wi;&_a&i zp}>rYMsF)eS*`bm7MdufY`R^nK&-bIhSSSZSwsk`OUUcZ6g1D0t?SuwryxnJ2BTFz0Ys6_LYbGG#BgZKg>;uNYkiks?D*a zJ7_n)W!GWl7NPG?RB5W|^)E?j1*K<+IB?)R0t#b!o$;i-L>&>A9&qbSDoU&#EujKuj~0R@Je@Cq>b-TjZoMXf`}ZKH{w-?H2cldNLe>h6B!1Je zoUYA)7~D!$fxqczi93gNh)IhH*06TEDaO=}nQ%)dtE?Bsh8osUo>;K3KI*}zo}GA1 zI=$%r*^JSicokV4W%`)$unWm>Z9xa(kZDLTTLnzS3h^ZkwESznQ)O=pRCBG?^rren z;6(ZinalJ?L;GoXtpeF42g`YI14Ry@?GT7UCTLX+Pw|h9g1n&l)?G52tQ9uv?{5Tc z{Gh_ct3W20(B(IWhCXneEhSf?lI9KaOE^RV;1@aW!WJR&9v_dc`plm@IouM9|qOs^Z`& z5|nG?$aYj%vJ$iQY=)F)Nm+O8=v_;35q4%jj6wQlQVM4W0M4;fEd!ah~P zq`ATt;LC`;z>10K*~{2x`8wo?e9La?_J*CZ>s{>oxm+t!2Ke>G0oBfchl&AbdZfEvq66SYJ<8Y8MQiYlqfA?N~Gahdsg;p!3(hG0RmS#&(8 z9~Z9ov3rt$A3qyMkB2>_dh7Kf-c1wNtK{K~Sj|8gp_m0eECy?2qozV_>v&^#Yk5>2 z2JRUs5uV%KvWORZVWOYAc((`oV|mqg`xdZB{QRC8L^~>`54~qU9Qyu-OYR^rL&wW zy>HMvDG9IfSws*_$q>!BH~JlNxZ=or6-tMp_N>>LVE!|b)J>FM!13P-SkzcFdFM$m zrC-t69Jkb-Gz>UyQn=b0<=`xxaqM#Ja$l#I>vAp4$-1T4^}*g-t+Oc|nW-z|wc$Hx z{V31$x{hyAR*mzTKIfvLJ53F6`+6~Rz@_^z=)}i)nUX9Pj!u!$dBQfGP0rb>LV39) z1}K|p!^Pv`^_WEL)S>cSIW3>&LrPW2m;KuRF<^I>LkJ$n!EfqbF6HKj+n(|V?6ve9P(?cIxzi%=uwHxK} zcBPP(ABajldW?wUqCxI2jzXvbr-O-uVTV=E6Z@_*re};W=6!j7E95pSPjv_$mzbd! z{VuluERkmpS&aw%CuT~~!CyAP_`z=1g?B_xeoRkgxZ`M(( z`0F;a!A3-`qO_VCtJ@9pxLJ}Z%}Fv|_KCxZ+#M~0l`H7Q6XP^Y3BD{C!!FA-?2b%o zrt<;XMbYcDW-tZ~FTQ=iW{&Se#~7N=@XW4N)!8FV-^!Hnet|QIbE}!^{K*WKBk%^H z?`>r^4XY*7M|GJ!2zY!*rZ8oyp=)ZuoM14Wy;((d#*{zru(Z~g6j@Gyzz(I2f$@Dk zrU+nfsXV)TsSXgKm$%tvk&MuQ#$`Ra5U6*cG-WC~KsJudT_+@m$GZQW{4)*xbh3>8 zHQ{6XCD&*$IQkA{Dta8sdhoj@Jg$zo)XR$|_|W>3`Ii{CHSKGU6~<^?gE1+de7kp(Y1sL02ltT zcA}t!<2TU->G-)A)AE*%xwYukT(psaH;t*z1V+2YzuA89O-a)+Zd6_o!f=&4<#bcg z7@YazFD_iASV7E1WxBfvKZ}-s zv|A5hFb?4T(`5xZ0undbm#yg|>%>p?hItPuRIkq*N~LvlcM&8S@RtG{+1%0zBo_`o zO6`lI_TGD>`%f8n1P#$(oYZc)vPmR9=&+TnlTvJuX;)_;B11&>04j|DtQ(?+%>#oh zOA8BDuE&{c_8w}2j-CCMF_81DhnyBO7dc#+vpG`J-!3Riw%(mgL)}kvE`h^%SbuUN zZ1sNA(Sh884;3{Pz6XwE5O*^vw{LbW%I}ZF$EV%{L+Sab|HjvBQjC)oj1sq)xb?ha z@cc)rz)3r-<(&i4E2^tPXe>eL&Sv!>c>##iW_8Ta^-T;5^*cV3DNpZ z>OmXvy8%Q2P0kA4{F~~{m}XseuJCMWaN#J&iQ=f8K~&-hRVae4{b4qcQ&dVN{TCzz z_b8$|vYDjA{LNaVW(ED=NJwx24|n{T$F%P?%yZjHpezj;gz|NS zB5vSvf-|(_lCd^2^|2JwAbsTiu!5O#`Z{nU4dvwiR@&sT>{~sS+}MV;T*x~lgtR6k zo#c8=8RYW48zb2={OZfAevGA9b=PlWdyaS#J^?R4Qg`H07vM$o=~pJCrI&IuM5T}- z!HiZI{~`?f)Vt^|3tQG-b?I8oT-Gu>*lai1(v8L=0>V1c1-h9HN+Iaqtg|2&IF=Tc z-V9H7+NToh=X20e6+2AI4PYQSU0)sAMGk1Yx$U`clj(-xsmFF#WpQOCs%3h-j@hV6 zCj}!`)Oz2_&tSSc^Gf%9)Wn+Nn;c_%oIBR`oM9Bbd#~HTV3tX-24c^44~6IsA;z2{ zTb#S<^VnhUV_j|!hP%tHZlrw%t$>yv+^7K?`RO0W+Ui{#9=|>~_r;v&+}XR{Nq@;1 znP_`-v%S*MkHpZY1-X_ZzQyHx7&>J;3G?!1y<4{q#-j)m4{yoh^l`Y@Sm+V+7AM|& zz#)E(_~T}v55&shI@knJXRB|AQo)Pf9xi1tLEKuO&~LK1N3cClO?*3uR7R5;BEMJg zH4n4tsy-1r%L}yIj#ZyT>Dike;NOZ^{Ox1X5Kb+}{z}N##_72#!lHYV!eL`SzJL8L zPx;yoY-bCNDm&sN{PDu&X5G2#{#x{vSK44m^LTEser$SlE|xsEZli;A#G@-~oQBAOpWhJuf&j)Z zgMV;rxWIj%)My4FiSULD59HbfVI^lTQqr!3|lT==D)N@3IpI6Krt%_v5;pB&3@hO}*!?>~D^`|j57 z`?c*a6Wq+$HkSBctw{1&6nNY(U1&q}dwI+*9j6jzQQ}grd4)C~fPTYRueV2QnF&;7 zT5n^7SqZp{d00uRsk1)Nygaw^9AZuxj8|S*St?8zS!v-}qCEJr!xf2huB|@@VE%U5 z3R`RuM}3v5f7)DOq;ueY>Zzx9Xo2uZ$~P-Ff#fGU{t1NjUMiLRa_WS0>Gsv1C0;pR zpae4ToH7RZc|!ew2Nd=udUl2eiVk+BR>nUoy{d|`{td=94Q!TJ1|q=Dm36bj1dt|2(lRT6IC zHrJJ;R?gfC<8W6}>3{PS>0gEH^-8z1O6-O_1Rz^6g<_;l+|Z$H#tyW5a^F1DqX zPZ}c*r8^Zv6}s~pHa$+|CRZd}8O)U$E3%nzCpSWho4)4GL`G2J`U!0O21tkZEDv~r z#$yNK5y-!>2z_g7^PlH^Q8H3p{3rn@zCZL9nq-oyMWkYU3+6*HrrmU^VvP2^Dw z*SMNGl=gb2JX*M$nW{9>V~KUwo9P>~rX&Ecd%ZT9*O;E(?u`w(-Oza)F`_~uZ5>mN zo}M*d!?-+f?FnJVTeGxboDvON_xTz47+x>~G`29{)fzo_O2B(Pp;2OoL%4MfLSSW} zJ0~9k^%hl_Pv0hGgW*F3fe(N!UZ<9)%@(PM&m+D>H9CS<+`A{Hh#C$QqXjz+iC0S^ z7!BhfIW{?o5Zt^d9fnVu*^1T-6j^p6%edb4qL!dzW_t)+&nz;L-(hOr7m&pG+h6FrQ1JSiJw0I5;xwAVp{{a5B26PAfUo^B& zlqJz)lHK$uy(hjWC_Ak(&X}kR4s@>%WehyuCrJMoCq<7|KWc3ekf)w*gpNqO-AP{a zFlc(YLa4)#7vAjaDDTT}-S5;Yf9m0)w&E*Z+%g01s$|m%(e(9P|NevD4tMM#Epe2# zhr&2xAQwf9>BPR09Dh0&i%32P-@7+{tSwe@R)goFz3BvUGTc3@ltJ!IP`2#;&9~Op zg$JYSJc-#tV@y=rN>Qnf7Lk}A{XDYg+fXh=prAO$>>PQAPMjqJi%X1X5Jj~76BI+1 zzi74DQYZFl0bYfWWQ^SMPfhK1c0^5RRu74Dejv#@_(9Cr*S#I@%FCiFZg);o!$eysdfA8_1)@_LyGV6K*GW;L?5^Ood>h zswn&|mM*|Q@OYtUGA8YJd9QVZ)(5OxNwfMU3S6g6h}?I{&K1%jOuHBp2J6f1+37Nu zGM?JHdAdM}SZM2Mo{YD@hX_1;wE7WHV%Q+;I2D72DF$V>tY>W;ByCSc2@s7n{I-ze#;8a7OyKKxhai_PzCwRA(IeOT$EJx~$odcfKmoB7I2+1rst)A?PVg2ZR zxgyc=(yUVS`(b*MBnjKS^q&$g4(W{A{*0*Bu8^2VEss z8$)~Tr=U<1J7m@QWUIJ4U$;1G;dg63aUrqWRHdW5Nd}AHfj-gEO zyg6shoQ#0dU|`ElZ)7mRrj#-lW;>Sd<6^c0>xWp%EnI5JKsE!vGrtdRJI?KS$6;A# zxxNO}9xj+k7B+@o<~0LT5OVvJk>;yibtDPH8uDNi3N%$RIKzoM0@1vrIz(nt1pwtuzq zJU7wvj+Ecrk-+W!m(qXtr#xqW-c9kF9UT}YdkI58sc9K1W(KT zXP5kGr5~^U7P_8K^m&YX((}toq=bKC`;UnCT+Z`S>bD$dyq|LZqp*4|;rV&nZwbU` zza;#1`u5+9_2=68fNAhA*y*{(=lIlbjYfZG`;AsT7x29N`7J;k|EJ!+o9(|%`l;vR z*Ld=9AKTGQ=eYHWgf}7hjM%AvXls`@C5P?BXdk6whHRCMY*!$* z-E=F6X*qwF@e4cmt0yuwIz|r2p z+Vb88c~M$2T}-(C2XJ>HeW2tBhMOmr64Op3+Ej&2abx)!S#r|RfPjnTp+v>zLvcoo z&9AF2!%`~c>rm*zDcYZK6(R&l407hQ_Z2Qq8icT5!BbVG2;^eO5uNSIPN292b9N+4 zH$5*A$(YWT+Hvf+=vh01X@9oK50vaL5&mO1W~ZJ?wmqDHko&gLW! z>^SuxN#yBP(K4<^FZaw>rj{qgte!$enaIJB$L{j}Y(_5KE^&|LMb)2u8IC2t;7MNz z0SowDhm7oXrR~gq4$~UG8L{%aUF}6Q4rCeTo6K3jc-%I-GG6<+ZIB=89@~HRHZTxu zoh^R)nSUlg|3&c5+RohG#L&>;p-+-2p#mE~jARA}1@+`VXn(RW|9oSVw5;cta6uV0 zce1Pb zlBx`y+-86GVP11< zGuV04d@QCU3=Ul?_}&|bAW?3y-p; z4X^Mi>fZu4Zq*CG6gUgI^OL5Y7g#o%rn7y@(hcY@GdPv`Qa892dRA#&1%j%irH^L` zq6m*2Kqfd$nCMJOicW4ZI3c9ntCCo!LPH>5*s*(YUYappP~dQVFg|XA8-AC+oH|yy zrs(SWRLqJu13ZHnTr|-@>i+Z;NZcIkS zYtnf1O69;X{~7LXu*j}`pq&2X9q;6YO!2&@i zX($`=#} z5x9U|3zMclJUxm4h{sK+us6dye&W%JQ3_0&s?DPRu(~DutasjI5I^fV@|JtejCyEF8r+DsF@H z*#Zv{{&a+RHNv4#7X9Um0WKJgw>cK7$2#xkLl{%xqU)jv>0_^vpxerp+GycVu0~)m zLtvjuFX1%Ok_s>SMv;mja5%j=5m%4}QTlu*Npa{iIU*evKzSMW6=$`-&ClDi*lb1@ z#H4HL<2(|beLF(?*l6zUcM9$Gub3^LT>)fP`Jbce)zY_Fi_V@@txXUg<>6`b7;87XF>Ne3J$g|ca|FfsiNA#nY4KilaLglm2Dp(Qn21B-(O;CK ztX9AwMJ7tAYtE;GA{xi#D9=JZ+-P)Q0`xhS&e3fJI9gwk4@+R06!v~%B@n=MS$Hx;qsHP4JgkTah+FUo5DLd!qxv37{2G_9yPYFNixM1&^R18_PN z`2m=1XRA3X=WY5j_?l8dc1z(D$CxLVGlXkrU0PT(j`ylhJw(#}c(4VIn{y)<#~q{g79}HIST@BBhrB*bctq|Gg#T-Mv;Kd3|G#eUe?Fz|gJ#Gv=3ruI zY4{*$zPKgA41GY=gUoj)5?-Bd~`u{)3)O%ane%>@wpgXYU!IuL3&o*V(;;qgLO@*4j+w#&5YUQ zRei+OBXpwzV@0;`6Ut{~ZVKF<92ZNpEr6grm&Cz2U0(7fxz7%hwoK8x)lDk8Y?WVr zQL0N4yh>!}(|z>?0c0oP5~%kB4qh>) zz9f~VTCiVfYU?8=_J|z^?mYl|ficv~xsW2QOq5Y+lZvGw8w$x4=j$e|52|Jit%9D0 zfDQ5D$)Z;Z>U8ojRS~sZ*KZ7K>l$}g(E8SP>@VJ!S1)Qi9>N!U`6x?w^}^T_I8Y4kL(ynU>xxAHJ^8_ z-dqKox7OFB`pt8q2czhKZazKNSrBUzxICWh8ty-;3cNdQLKybEtsz1rV2j!6*^KaX z`*G2e6QSery#ltC`Y;pmU_4OLA&e-K@0qt1n5pcG0STZ!`?>zNl6KM&2GT|OESP4F zo)XmQ7iC9Q$W+e^+XrIi!%JF#vbglC?&P6FE9jdgJz^gom6>S6p`26N0zYfY1~>49 zo)0+J+wL~hu}Wo{83}FAv=U=W3~Kqm^@G92@jD@Uj-!yhNH0y?v=7v=`6Pk7m|f^+ z`a$Z4!wT$}#VAKuJL5P@TE}F#rIS@QzOmsO>nPA;BqVS3phHk65vw*B$1jH^8bnl? z-BGTO7mqZXg4`CkBMFy|j<{aPN~REB+Q=Zd>@!}jTd106wX8SZCx$H6Ysglv|2d?O zp5H2fQ@X!`k1#-N7r_pdGtI1knt>NlI*v1z=T(TN!lodyQ zZD8O%&(VBJ6&6K)zo67R8b{IfHk$cR;l(@9^fXhE=!38r{zvT~vazq<8$g&*t*KhvRcBz3f+eEl1EuBX>Zr2Sezj z2P|hbejWY1I~wzuBLxf$!ec~>DUyy!2_?T4Ov;gZRX#bgNa}6D?DsO9jLEACbA%Wz zZB+$BANd1j`bjJ2Rz-N4vjeKv#Q|VRyhK(@u!$HBCv|lk3bp*mo?N1GEs%0Ug*`hd zd&_1(d5VH#(~ildj1YBW>iuVUApuwwZNKq0BeYH8!9L*p;twkOkfToZkCOh*k_yjF zTQ)&T?0|lKLjYE302(~Vi5F}JXN4wrM&FRuEhXku3%AR1&=QtVg_!PwR7fl*f&Vxr zre`a2oBi8>BgQ4Csq0Hlny$C8UekG26wD|qbDvZ@{ckEiSyZ`i42kC_robvU+*CMa zD9(I<35qmB85r^RPm&h#>Pe1?^K3*n;-iI=E*kxmtETR&d(oQ<#q+U@JO}GYd34qf z%aZ3RIbMNZUi74M^$}r3&`j5g2XRs6aHMp@5fh$JTl;BhU0sr0h<&m{j|{VK^?D*X zDPW)!FiICgzkr*o3IAOM6T^WvZjtJptFml=MifmC({09w>~ow3A2k9qj0+nnI;OFt zv6BWMX#h>^`-uZ&6C&9?FB5NC?L_}fpJKD`^nIuyM~`;vow= zWzi*V@%XE;FE-Ih#bdKzDPyWqsO&zPr7S5oUnyFe=ff2)Ofid&f8@(U=(+EfEaWTr zimS)no<_a(e2(a%iRXFBU}mgFfSgFotiWStYYd~NA}#B9V>fGgEIwxQYBO~esOnCY z5y|meG%?PvD(19Pso;TAS(R_s=))lg-wP^CpmtxI0W3<_CsXJ)= zHQlZk>B?&5mC~M>x-wB4v4iGaMV7~Te2cPb zoX5m54?W{yn!oF}lgS+(otu6q0q)b(6p3&g>delAR}(o@+^s4!r}Gkk^2s(rA|8JC zF|YpbJ%yi5>viE75g!28zgHRkztqkR5Ol>&YP1Uqjg z3ZZV5@_5SYbp+VG>GENxvD66xxOj2KQT|iYUE_^S*7n%7-F=I9Fd3BUj3V)$qSE$m zBjR}IG5SiPP-|fr5#ta!k<{}gu2qKhj8TU@PmeD}T&Lt|cVXg^GWDY0#`Ya0@l9h0 z+f{U1RJ6g^#dp7Pb{+v*HlYgC$>nY&(=m4I5~EIiC=w$`T_yf*9koQfVlx$FMCu~W zpz&tuOXCb-wsdN9vYdx~(qIyAM@xUzB2LNZ2t8|}4?FIl^8!7mBdeO}jK5ZK^a_I+ zqCq46_xDfO;(Kv$2WB!sId!VqTO=9lS#qBE1Y-o38fotm%#gSOE>L@Qt8(Z$ELlU< z<+fl^h~ZenlxYXf=>XHhL5%ihl{J~;e*A;7n!_@bx&A^MG&TmtR}FY#fUWt8obLI0 zK!jfYT9-u%Y9ls}_2=0Dy&a`-)7PIUM=*HnMSw&c+t*Yd=$R%`DqGcGJ=u9QhH?&7P%N z!A?hIxjBp8N^~$c7NKS%#@jm8@mTFJ9cnzYh{q24A`tbSol;HPtZ)>I4ukyMdp%@A zEA2WO9{8dF%wZ=DjN)V%5`BXv zXP2ixHE1_fvZajwy?LM9qfepFx@=R9G`cTAm@JajPf{O?|M+Q_3rH0E(p?mq3vy35 zt;9h^=cW9*KCx$=lwfa|f0Ii4;>e*)R$FHiRjQGA-rw<+YsNF_*_}|CZAmQfm3xNY zxN%3|06p$O-MY&wsiYh2SEVZy)T@+QHJNA_u#r80DkA{Ls<>hEr+)VN*;y->{j6ns zcQs+h&OXZ+xEYRJZi~s2T%N3{T$zdQCp4w&Zx1HmuO_(XVG!M|6P!p|JzsWoV6+g! zM~#PX!Jr$&U5o*@&CbOI{m=yj)O!$VK)3oYeayxrxH+I{2usLXk30I0@6v=0+L0`O zIG{hLJu5i3FLucvIYJj{v3^2J5!I zk2G-u3wwn)xVmR+4c=WoHZF8EDJ&IoLP5rM#NL=mB41A;<_ZH8o@Ahs zjZS5S63znZYa5-J~6cA!Pp=tVK5=@q|$53q>=}( z4&}%RsxK`0vXnipKi7@z+2c!0fLtJ?ZWy1PAs6xcUs=)Tp8_XI%izR zo^yMRRNhy8>Qcj2-ZItSY&X`@jm;+p#WC9TXf5XvwXk2a_AD@9I6W+*8HMq%S0&ch zd#9s1c94P>z)XI)vNW)X;oo*~*>lw<*Nw>6@Wf4(-Gzg+j`j9DX0rRAxsF%V=(6I=Tw{BJ9~|wugP3|(9+v?@>|+v*WT19;h3F0umfT`nf*&=7@Rn?DZ-} zp{yLvgG|u0*Lyc;6g-&hkyHB63D@ z<6~cTEO{r%PF?gs{#L{if7z!9=GJuVtAcxBoROy@D!w%)8a8}){q0(w=7k;f#yU1_ zPQ*d@?TPcn%Db+sbMfaM>HWdYBY8pku^G{MkL7uFK03%o+`4dlyjt!iYIq4N+W%p7 zeRKO#e{v)*_KAmUdOBm3P(sz}+WxRMzgu!}pyo)P<`a+G*^B4rUh7>25e)o4bgu_q zb6T$A0XitRNu~yL6zgJ>%tXuD>4c)i>{|(=1pH$KCNIrI0YVvZnNbZf;WAoe_|5#Z z@{t5_N@!_xw&9frL5V~TN%E^^qDuq{ONQcp#oqL6>1bTU1&z`8&k%hx1^b5w3vJk6 z7^6`ev*vV81`e|44i1GPtG;BJj%88pjH{_4d||w5?!nN7S0?_2ju)CjK867DXu!aG zLIrt*XnOysU@lfgLQ08*vSc~Znn&1xH7|AO3q*$9RID8bD~)DYpQd8}!o4EQ=ex17 zjnRcrJ!^$tG$n%lv%l2SDttDA%nmC_BZ}qKPmTp-Lx#30uMeOJpUsAC-?r_AXBU&U zA4|O-FG>qo6uMu{pJ>7MdALu_@28Pu(-6`udxSLaJo=8i(qNC>G8v%Cy3)pixaj{Q z=4LUuw%&S2~K8Qh-TxF6KY+h1bqON zO)H6zSJ3_wd}?Z&w;)R^BkopXaemoE^Ikb@$QGT(zP8=mX zBxuWmJH3=S%9UJH3&R|qo!Q8VfL?O!MHPF9U?va09KS)$;caHEev=VPrnAz_^f7x}3V^f) zw#hoj19`fAY|QIM$mfa?7ZGdg7U*s%Lh^JI9}yywE;mw^-3^+aE|O?7=Z81@ILiA7TK74%${)Hrt1bFS zmb6U5xG33l!Zv+7*1vl1yTKbf$3PaP<*qQo62L-I61Qg8RVHYdl5_tR4m!riB zXw`o#4$gQ6l;iDLq6u_sg16=LYreF$F53CL!k3gIGR#W*MJX!H(IOHr)Ym;{rVaB{ z3?80q*v^rE;NYEfKuM_)J(`%NU!r30!dJ~UTe_rPO~CVD^30)2!SV6U&W@;2jhX>T z?)T)`J9lI(z1?5pUHI8`B<+sri{Jh4SpF-$`A=|?Th&<>V&f~NsvBp%T9-_jOEbQ732&rW}&60aWK;E1skw?Yjx*eYS<|1 zI39zICjoD^;ZeZ;mE9@+#d1!J)V7GRdOvV`X~S3}3$X57+@*uoXO#R+?FnM9KFT+? zleO!%I>rHt-p3i9PFokje))6obW2=)u4J7YN`3G~dy;`dIsq?2upe zvhS(0bbbQSojOySSnGzCDb{UNx6o#x_ z;9l5690D<9i{96kHAJkf91N`-bd+3d4DGeUQA&Oqsc@363ZAmm*c?k zK9**kkWM<_m4WY(?|avcckTK6VcAD{J_dB|&UncdHilnkGy+ml^LmxhXKGxurAfjX z^AQyaHB>UW!^t`VuswL68_Mitak;0+Yb_>n_Uby?Z)kV1^rs@}s1Tv73bi1-ro`45 zA9cY*M)Arlc93v$Q$p|2zCtWUX0Rd&PA5V5sMNk*Kh5n$We&+}^K$o9Dh3{d6~H15v>@K>|TLn}cH z1@#Du1ah?^{YRVq67at}qk93r`eyo`{dP@%Dt+jj?m2!b-TjN_=gaipl-<9rzs7x& z&i(jXKhK}~9(MHH6aUgj`FFN|_4ho4=wX}6Z|+FQ_Wn!hznfMbvOnyx_|1+DaVEdn z|LVB-Z;QTfB=|M%7i|UmueO5w<^Hot{zM6v%}mxcf63;A>A4?9Edd4E~0=|6aX_lZ25 z{=+K%Zz;+Me@*{iohd(WKWqB`=TgKVwt#^Dw{`rK^0QJ5l!3dCVjzbE4paoTwvnEkz(RpxPkcY6*>}0#OyB z8boY!4Tu7Wnh>=hwu0CiqBg`f5OpAe3lKes`ViYfG=OLb(Fme3L=%YZAeurngV-Ko z2Z-n|7=>_c#Y+E!%=SMcY6MAvUm6jT9%MY6Cy{B;BA*_Nz+)I=@PSPzz#}2YsUzu0 zpXg)tk!id7Z@j^?z$7{vguzhzBr=x7QF4r>iJx)QCwv}LKb}8@6(y|jp-c84k)U}x zXx^QSfa8cy0brFefckL^#QyWC^&@*{+Du@E0c0{62fq=N?R!HjBv3X%N*Wmr*W-~v zL9iF=kA3%3>&HI*R*a`9fL^SwM#{9$Ym{g6h&pusJA_YmtCqu&kh>6L$OIT0c%w)> zNrs>BzY)HoWEjCi8IFU21L2AXqY0*=&EeRVI_{!M9Hx$e)JOzA7(Kz(4@%(ODT*IN zm0L_5t*B!gIP%B=isvRpafh+%Hk22T0&Gn3Em*a8#<3X;y?LgTzA$<~zb~Pi0J4A_ zM$svJHcnRs_3A31x2EVk895CU(0y3-vh~uE!55Mwkkdy(7f^N(l2Gu(M3Mv^N$bvs z5ngH&2Gfb+mFmdQRTa?D<{|~Mc`Kl6Dx}NGgZSQZI6>@4+(-bSDKW&EMKxFTh8wGiyyDR$0=m{HGE@PhFWimW$uhb?U5aX> z^UPJdfysD@12UR)A|8Y{oCw7Nc7iLZzDN%sEpuDyF0X_YSjURuqIrX;Yjf4X z!~uR(Ws0gnx}pj&PZ9JqXrj)F^`O<2Cu_^f6qlnb7J*AkQ5d}vi6e9!IeKy7WVMr5 zLRnR=&^HYUFNRpRXe9?|r5Iulkxh>QYn!Y3gJ+t`XOa4dBIW?_PBShuBeeWl>0G+* z9#FGT8M`tGq(F7l^Cuzo)N>_tWGWmNBAo}<_04dndo3mt<#ZgR<&{@NM^t&`|Ci}J zXf#RS)Al4VQc!ka9xudpme^sRm_t>QY8RYoP~{8t^j5Z7*@~#TQgi}6RX&b`0=gJS zf^S6OXfXH^y0aMH@w0GnCd9OFkT6IH&m>|TO}RMugeAYcm|mo(XVl6F^feXZaOJ1% zfHN-!2QDGd_2O(y9vx?B^5{5glSjvy97VrE!r{_{!N=Jhiw+YyMqe>qVoxVZeu3kCAHDJXBIfKKB;wVZmD z`;V+0XuHYMJr&fe2%pwh7RN^cjw1O@sPeKn{t9sDel2SUnvRo79?k-w1*rhzQl`Lw zWMT)Fgl@#5bX#$jz?o#Vpko0(tZ*1mvpJrmJg#`C5q_4S9ftwkn8##x<7A>QtH8Vo z(c%+uq+^1T8kTTC(D5~35eBB2a5Z!0OvwaSOAbv#4ox73hC(4;bJc1I9twptk!Xs9 zra*0MEs5G(n_w4{WO8kS{fx0mRp=+$gbRY5k_Mr4ICDWFFQY>dQJ2sZ=zu*~p_u4B zjF=vtpC~5Rn{efe_9he)XXn%j4hlrVWip9KTr^xilcHslY%W?B$8*{PgSy0X_U_#) zVPHImO=CQVO=CQVO_O*|bCm>7tPZ!CaHUUbMDcPD&~Ob=VGrY~jZ4hZE{TgQOc2+~ zWw3yJshvPZu9#c~p@ad^xi#=)M+r*_1GX!>ODZsg6@`n|M08xJVFF_aZmlrXaIM)9 zcvN6AhakR5j%^D`G$6$U#wKzk;SP>=z#|LgksYeq1ZG=C^k)* zQ17#3oSZ9^LkpqUS};PfX^c>88Y2{&#t2nXQqsaw?DofIRnRXwK^8MW#3$e*GZU2f z0M{EGfrkN+EGknt3%64K)41>)iPg&=_}5PEO+3)Jb#0;vl9!f{u`0`c(tL=f(?7cMhMpYG(09rm0tHV7Da za-ScU@uB}_ljfxYQ?it0T^^4#^NHWElk8}F1T z!@_R`EKDxVq6z*6x+0E@t|~g9E9THeb%-UbKJf0%Kexm#mc|#h6p8QMtVX2yj8Ilm zJ>2E!p)1h?@5r?39i=R2J+A6{5*Ef~u&ZbJx_HiT3f8>uwd8@bZxOQgXY zIVxaDY?Vuc?a7tKNvSk=dq-$ZVuua3EdRZnPHjka>i6PKtqFT9P;~vml^HT^%Qu3e zm_wuLz~&3I?eU}si30}&_wSOlRKRUpV`y7xKFwwc%j{rv#Y2&g96dciPh}i5v>|L$ z2?(#{ScoRGg@{Gyz*Dts7H~#P#wT=O@g9_FDl8ePNGTIgN}7+5XklkGTd(ARSQ)da zv;(tY4qa4(xZqfpHAHqSGlj7%YY2nriirFI=P(&WUVA{q9J;6_jB`pY>Mh5jE=nzm z&vdAlA#D4}SQNVj*PuofO(%x$WdZJ1Vsu18oS~>oT^(p2Jn#Sw?ZDw^+g^wbGWA*AZQn zN+*Txg3yW|P~<_o0kkp>rjG~8DvpCNS8;b4#c|d~-@CdhS6tqh?x|F9DYQtr;_{%q zlqya`j}#b@k*vFd5v2%S zO}dP!UrysYpY6LHv1_c?Vu(I&CrA zdNZW`DW~K+XAB=cPB%HbZ*kk&-j%8SvpQZa$lbZWMtE(%<5kN)ooa^tY&|A$VXwiD zE;l&b?eWynR*UcVk%tOO#qPYKmCiMo?wi170UA$6Ybhw5mZ9<#`^Z7Z9;Qyurd zW9R#&gEnBenDYk&AJ&|jD$;byKES8Te~=K z?%Epdf=IuGZuiTwyuXSC%3*;R`SYFYy0}`E`g^C6URjF zEP1PD988jg6$=tVoF{plvW%Rl>l%L zTv6Q(dHmkHR&$@)>!tPx^c00eXr!O^54d~6 zEL&r`i{puV(~KJJj8n}TRPUwM-VQAC*EFw6EeLy(dZW+0;8*Syt53L}o%hxI4r}%9 z4yj4~`ul^$7sDr<-J%t^<&j`OO33N7y9SreJ<8c!urfDaxasEn^EW)xPOeV5nl8itIZqM*dajg*yacettU0Ec4OZk)^4zfe9*NxF<&z|=X~kw{)M6ilU^J%elRZM z-J6p1lB2?^_a6oq?KwX`pk{hqam4AKW6CSHc_oh5474*nvF<0&m31#t$r-196K?cRc6Y7odCsx(!)*&@)kl`L z6;X-4k1vHhd_J`BIS$TvP}>=geeZ}J}S zUDr=pZaZSzjIocWIFBEg{~}Cdj_;EXu?L3jck>!r?AUkHd6Cl}%?>Zlw$jb-nt9}V zPn%Y=+}6#RN!oB!*W3b)pC z|I9ry=VDg>OBE(IQ(Q|5f?YRekvsM?ldQ~cnLWML?~J-unILD=pAFjrn@ShHyHohP z&}hwe^@_W}qF<8kObI+TbN1QXO5Vw^&u&uFfa)a=lT+b>G<1{H+ zNpL%meFLS-bMO9QbM@6a;bxH2Fng*XCFSxV-6gg)^Qw1VQOUXQt?eVS?*GR#?NTR! z%iIx1SC1}R`Tg0pBRzg|PugxO==^y3#5LvP4*roB6k!xL|3<*5-LbRtQhc8oCNAk? z-`CbU!rsMw)uc9dUoR`FUJ&^%yVP%E{-FC-8#i~WEUOM_n4GolukU!7r>u{}>1JFd z?N)@ZY5wt}pXvNWR|}(|P5ry2-pEz6-*CFBuH$#xLsid3A3Aihw&g>E@CWNlZ$a1g zurYnGbIC7Z6>hpc8bUtIdEoqY(cU0|&Ewf;^3H6? zJYKol+UV^6?cFl4u_5$Q(Memc5F6JaAZ2?x?JLTX(!} zeCSYiwUc|e${f2NUh|d>yS~!+!9!g)hsT>E9~b-IZnrEszvHIc8rIwPbYg>83S(mhe4&Jr) zH@>PYNj52cgou3vF4F!WQy)PwVoHRrmye&Kz1d;{2lV;&2+rh*JuI1s|IGb~xl zF&qsb-yfy#f#7>TI6IY_?b^zC@DZ5~D4;b&c6U(5 ziCv8j$Y}%*?rcu^YI3_C^3%5MDVJYvN2G<4HW>GTSPH5JJ)A8Rbxl1Ub1}Gc0VxJ9 z_Q+tcW(MJX)Tl<*g!g7d(7Q%bj<5(mky*r<%j5~7NFIw;0LXgqi-fJ%IQT{;9zN?y zgHNgOsxS3&|7hwn9}jrXax|F&AN8cMO0Yk!@FB50+;PqYHy-GPva9n3z=s#{@WYQU z*1+=p8dl9<7AoL*5iFPvf?qjL0FjWzUVQR_41+lmz4rx+VV8$!N5We5)v=~waVsp7 zV4ZG9-p8==g$)CE=|CSi{MvxV%tr;{%eG;rVdBfQVOwU1FQ27Smwn|+w z&tUZf9S}`Me^jK~;-jKg&@q{Svf4mj7!1=$ZCs)QPCk49p+jBk!4W?$6p#e1Be*#Wm4t2DJ(g{>}D6(T++e=U$ zi5yth>)}HJO^^y!8sW!>Pl=-Vo>aIjV$M8L1atf%R(sIWNRQG^IS?=eB#W{VAp`YL zTU9EJ_+BQ`G#|ELe=(G%RpCu8FC%GM170)OE-p{__!2L6Jq%P!^RW}-bqr19>5z|9 zyATpY<xN&Hf`c3vzbo|LKBGM1agEf$CDh-9 zqEK?sLmM}rDJMe*ww8P>Jj|=3(|D;&-zEz>pE)ypGHJ1#jJ(X5DbJi4KIY8O|DT*c zP*y(P+@OPfUz3z~BP7R#J?x@lTGR-FmXii#tjk^d@?F0q-5pB=#L@1@8*V_Wgoxt` z=7&IpkR1*O9DAZ5V%`LZSYI|o{BmUxL>yyqLmbDM;}CJo+6_#YRs|+(7vxQa$E1<) zB{e=Qr9v9%h`lhie?*%E0=Fj!q6nwMYpZ#9oo!?(`6eC5v%c_nhWshOodREC(_hA? z0}VfZrpHM*NrEE%Q9l0F^H+;p%ygHn1pS@fm39Z38i%$OXrqu05pCiJ5khtl9B_;c zfrw*oBt(=i1|k#W*#I#xAP)xSjNn)Y1~-UUE)Aj@=?;31q#jP=seb_YyzkNdpe5KN z9zgzWz&72=2>Q3B|GvQI*8lg2pI71^UVnBbsEfXo0}-DCu87k}!@kp-1jD3)&cpuJ z2c|ClU?PLPWE6PLNbsbu;5-_7$S5co4>=g*`KL9|y@@~R22&Y-;PM6RVDNemNO^%T zy2H;8=x$KL6L#J_AngVecSv=Ep9ka(hm;54VBf}Z0pDuyhNCmk-Qm>$jBeD~3%J|> K`QM<(0{;Pt>g2Kj literal 0 HcmV?d00001 diff --git a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/CardErrorExportDTO.java b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/CardErrorExportDTO.java new file mode 100644 index 0000000..848116d --- /dev/null +++ b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/CardErrorExportDTO.java @@ -0,0 +1,33 @@ +package com.yida.data.user.dto; + +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.annotations.ApiModel; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 校园卡号导入错误返回类 + * + * @author ZYJ + * @date 2023/2/19 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "CardErrorExportDTO", description = "校园卡号导入错误返回类") +public class CardErrorExportDTO implements Serializable { + + private static final long serialVersionUID = -3132562554433758713L; + + @ExcelProperty("学生学号") + private String stuNumber; + + @ExcelProperty("校园卡号") + private String stuCardNumber; + + @ExcelProperty("错误信息") + private String errorMessage; +} \ No newline at end of file diff --git a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/CardImportDTO.java b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/CardImportDTO.java new file mode 100644 index 0000000..2d10604 --- /dev/null +++ b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/CardImportDTO.java @@ -0,0 +1,36 @@ +package com.yida.data.user.dto; + +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.annotations.ApiModel; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 校园卡号导入类 + * + * @author ZYJ + * @date 2023/2/19 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "CardImportDTO", description = "校园卡号导入类") +public class CardImportDTO implements Serializable { + + private static final long serialVersionUID = 6536093595406368088L; + + /** + * 学生学号 + */ + @ExcelProperty(value = "学生学号") + private String stuNumber; + + /** + * 校园卡号 + */ + @ExcelProperty(value = "校园卡号") + private String stuCardNumber; +} \ No newline at end of file diff --git a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/ImportStaffInformationDTO.java b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/ImportStaffInformationDTO.java new file mode 100644 index 0000000..1f5baf7 --- /dev/null +++ b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/ImportStaffInformationDTO.java @@ -0,0 +1,25 @@ +package com.yida.data.user.dto; + +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 导入职工dto + */ +@Data +public class ImportStaffInformationDTO { + + @ApiModelProperty("学号") + @ExcelProperty("学号") + private String studentNum; + + + @ApiModelProperty("学生类型:0走读,1住宿") + @ExcelProperty("类型") + private String type; + + @ApiModelProperty("错误原因") + @ExcelProperty("错误原因") + private String error; +} diff --git a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/ImportStudentTypeDTO.java b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/ImportStudentTypeDTO.java new file mode 100644 index 0000000..b648dc8 --- /dev/null +++ b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/ImportStudentTypeDTO.java @@ -0,0 +1,25 @@ +package com.yida.data.user.dto; + +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 导入住宿学生dto + */ +@Data +public class ImportStudentTypeDTO { + + @ApiModelProperty("学号") + @ExcelProperty("学号") + private String studentNum; + + + @ApiModelProperty("学生类型:0走读,1住宿") + @ExcelProperty("类型") + private String type; + + @ApiModelProperty("错误原因") + @ExcelProperty("错误原因") + private String error; +} diff --git a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/ListStudentApplyDTO.java b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/ListStudentApplyDTO.java new file mode 100644 index 0000000..69f40c3 --- /dev/null +++ b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/ListStudentApplyDTO.java @@ -0,0 +1,91 @@ +package com.yida.data.user.dto; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.yida.data.common.core.common.BaseDTO; +import io.swagger.annotations.ApiModelProperty; +import java.time.LocalDateTime; +import java.util.List; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ListStudentApplyDTO { + + @ApiModelProperty("当前页码,默认为1") + private Integer pageNum = 1; + + @ApiModelProperty("页面大小,默认为10") + private Integer pageSize = 10; + + /** + * 学生ID + */ + @ApiModelProperty("学生ID") + private Long studentId; + /** + * 学生姓名 + */ + @ApiModelProperty("学生姓名") + private String studentName; + /** + * 学生学号 + */ + @ApiModelProperty("学生学号") + private String studentNumber; + /** + * 应用编码 + */ + @ApiModelProperty("学生学号") + private String applyCode; + + @ApiModelProperty("有效期开始时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime startTime; + + @ApiModelProperty("有效期结束时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime endTime; + /** + * 学校ID + */ + @ApiModelProperty("学校ID") + private Long schoolId; + + /** + * 学校IDList + */ + @ApiModelProperty("学校IDList") + private List schoolIdList; + + /** + * 学区ID + */ + @ApiModelProperty("学区ID") + private Long campusId; + /** + * 学段ID + */ + @ApiModelProperty("学段ID") + private Long sectionId; + /** + * 年级ID + */ + @ApiModelProperty("年级ID") + private Long gradeId; + /** + * 班级ID + */ + @ApiModelProperty("班级ID") + private Long classId; + + +} diff --git a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/ListStudentApplyForDTO.java b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/ListStudentApplyForDTO.java new file mode 100644 index 0000000..e9ac7d2 --- /dev/null +++ b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/ListStudentApplyForDTO.java @@ -0,0 +1,80 @@ +package com.yida.data.user.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import java.time.LocalDateTime; +import java.util.List; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ListStudentApplyForDTO { + + @ApiModelProperty("当前页码,默认为1") + private Integer pageNum = 1; + + @ApiModelProperty("页面大小,默认为10") + private Integer pageSize = 10; + + /** + * 学生ID + */ + @ApiModelProperty("学生ID") + private Long studentId; + /** + * 学生姓名 + */ + @ApiModelProperty("学生姓名") + private String studentName; + /** + * 学生学号 + */ + @ApiModelProperty("学生学号") + private String studentNumber; + /** + * 应用编码 + */ + @ApiModelProperty("应用编码") + private String applyCode; + + /** + * 学校ID + */ + @ApiModelProperty("学校ID") + private Long schoolId; + + /** + * 学校IDList + */ + @ApiModelProperty("学校IDList") + private List schoolIdList; + + /** + * 学区ID + */ + @ApiModelProperty("学区ID") + private Long campusId; + /** + * 学段ID + */ + @ApiModelProperty("学段ID") + private Long sectionId; + /** + * 年级ID + */ + @ApiModelProperty("年级ID") + private Long gradeId; + /** + * 班级ID + */ + @ApiModelProperty("班级ID") + private Long classId; + + +} diff --git a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/ManagerDTO.java b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/ManagerDTO.java new file mode 100644 index 0000000..c60902b --- /dev/null +++ b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/ManagerDTO.java @@ -0,0 +1,11 @@ +package com.yida.data.user.dto; + +import java.util.List; +import lombok.Data; + +@Data +public class ManagerDTO { + + private List deptIdList; + private Long ruleId; +} diff --git a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/OutPageStudentDTO.java b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/OutPageStudentDTO.java new file mode 100644 index 0000000..8529142 --- /dev/null +++ b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/OutPageStudentDTO.java @@ -0,0 +1,32 @@ +package com.yida.data.user.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * 分页查询学生列表数据请求类 + * + * @author ZYJ + * @date 2023/2/19 + */ +@Data +@ApiModel(value = "OutPageStudentDTO", description = "分页查询学生列表数据请求类") +public class OutPageStudentDTO implements Serializable { + + private static final long serialVersionUID = 4601644422338829002L; + + @NotNull + @ApiModelProperty(value = "学校id", required = true) + private Long schoolId; + + @ApiModelProperty(value = "当前页码", required = true) + private Integer pageNum; + + @NotNull + @ApiModelProperty(value = "每页数量") + private Integer pageSize; +} diff --git a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/PageStudentDTO.java b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/PageStudentDTO.java index e0f76e8..c53a380 100644 --- a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/PageStudentDTO.java +++ b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/PageStudentDTO.java @@ -3,6 +3,7 @@ package com.yida.data.user.dto; import com.yida.data.common.core.common.BaseDTO; import io.swagger.annotations.ApiModelProperty; +import java.util.List; import lombok.Data; @Data @@ -16,12 +17,17 @@ public class PageStudentDTO extends BaseDTO { private Integer type; @ApiModelProperty("校区id") private Long campusId; + @ApiModelProperty("校区id") + private List campusIdList; @ApiModelProperty("学段id") private Long sectionId; + private List sectionIdList; @ApiModelProperty("年级id") private Long gradeId; + private List gradeIdList; @ApiModelProperty("班级id") private Long classId; + private List classIdList; @ApiModelProperty("学号id") private String stuNumber; @ApiModelProperty("名字") diff --git a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/StaffImportDTO.java b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/StaffImportDTO.java new file mode 100644 index 0000000..d744e25 --- /dev/null +++ b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/StaffImportDTO.java @@ -0,0 +1,77 @@ +package com.yida.data.user.dto; + +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.io.Serializable; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * Excel职工信息导入类 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "StaffImportDTO", description = "Excel职工信息导入类") +public class StaffImportDTO implements Serializable { + + + private static final long serialVersionUID = 5414511146002233669L; + /** + * 职工姓名 + */ + @ExcelProperty(index = 0, value = "职工姓名") + @ApiModelProperty(value = "职工姓名") + private String name; + + /** + * 性别 + */ + @ExcelProperty(index = 1, value = "性别") + @ApiModelProperty(value = "性别") + private String sex; + + /** + * 手机号 + */ + @ExcelProperty(index = 2, value = "手机号") + @ApiModelProperty(value = "手机号") + private String mobile; + + /** + * 地址 + */ + @ExcelProperty(index = 3, value = "地址") + @ApiModelProperty(value = "地址") + private String address; + + /** + * 部门 + */ + @ExcelProperty(index = 4, value = "部门") + @ApiModelProperty(value = "部门") + private Long deptId; + + /** + * 身份 + */ + @ExcelProperty(index = 5, value = "身份") + @ApiModelProperty(value = "身份") + private String identity; + + /** + * 职务 + */ + @ExcelProperty(index = 6, value = "职务") + @ApiModelProperty(value = "职务") + private String position; + + /** + * 是否同步企业微信 + */ + @ExcelProperty(index = 7, value = "是否同步企业微信") + @ApiModelProperty(value = "是否同步企业微信") + private String isQw; +} \ No newline at end of file diff --git a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/StrategyPlanSaveDTO.java b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/StrategyPlanSaveDTO.java new file mode 100644 index 0000000..f0f8e99 --- /dev/null +++ b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/StrategyPlanSaveDTO.java @@ -0,0 +1,31 @@ +package com.yida.data.user.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.List; + +/** + * 人脸组-策略-通行计划信息保存类 + * + * @author ZYJ + * @date 2022/12/12 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "StrategyPlanSaveDTO", description = "人脸组-策略-通行计划信息保存类") +public class StrategyPlanSaveDTO implements Serializable { + + private static final long serialVersionUID = 1264394221797979321L; + + @ApiModelProperty("通行计划唯一编码") + private String uniqueCode; + + @ApiModelProperty("通行计划-时间段集合") + private List planTimeList; +} diff --git a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/StrategyPlanTimeSaveDTO.java b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/StrategyPlanTimeSaveDTO.java new file mode 100644 index 0000000..a19b29e --- /dev/null +++ b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/StrategyPlanTimeSaveDTO.java @@ -0,0 +1,37 @@ +package com.yida.data.user.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalTime; + +/** + * 人脸组-策略-通行计划-时间段信息保存类 + * + * @author ZYJ + * @date 2022/12/12 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "StrategyPlanTimeSaveDTO", description = "人脸组-策略-通行计划-时间段信息保存类") +public class StrategyPlanTimeSaveDTO implements Serializable { + + private static final long serialVersionUID = 1666232372793999487L; + + @ApiModelProperty(value = "开始时间") + @DateTimeFormat(pattern = "HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "HH:mm:ss") + private LocalTime planStartTime; + + @ApiModelProperty(value = "结束时间") + @DateTimeFormat(pattern = "HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "HH:mm:ss") + private LocalTime planEndTime; +} diff --git a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/StrategySaveDTO.java b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/StrategySaveDTO.java new file mode 100644 index 0000000..e4a17fb --- /dev/null +++ b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/StrategySaveDTO.java @@ -0,0 +1,71 @@ +package com.yida.data.user.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; + +/** + * 人脸组-策略信息保存类 + * + * @author ZYJ + * @date 2022/12/12 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "StrategySaveDTO", description = "人脸组-策略信息保存类") +public class StrategySaveDTO implements Serializable { + + private static final long serialVersionUID = -4058986401549517015L; + + @ApiModelProperty(value = "策略id") + private Long strategyId; + + @ApiModelProperty(value = "人脸组id") + private Long faceGroupId; + + @ApiModelProperty(value = "策略生效时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime strategyStartDate; + + @ApiModelProperty(value = "策略失效时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime strategyEndDate; + + @ApiModelProperty(value = "星期一通行计划uuid") + private String mondayUniqueCode; + + @ApiModelProperty(value = "星期二通行计划uuid") + private String tuesdayUniqueCode; + + @ApiModelProperty(value = "星期三通行计划uuid") + private String wednesdayUniqueCode; + + @ApiModelProperty(value = "星期四通行计划uuid") + private String thursdayUniqueCode; + + @ApiModelProperty(value = "星期五通行计划uuid") + private String fridayUniqueCode; + + @ApiModelProperty(value = "星期六通行计划uuid") + private String saturdayUniqueCode; + + @ApiModelProperty(value = "星期天通行计划uuid") + private String sundayUniqueCode; + + @ApiModelProperty(value = "通行计划集合") + private List planList; + + @ApiModelProperty(value = "特殊日期集合") + private List specialList; +} diff --git a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/StrategySpecialDateSaveDTO.java b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/StrategySpecialDateSaveDTO.java new file mode 100644 index 0000000..f49e3a5 --- /dev/null +++ b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/StrategySpecialDateSaveDTO.java @@ -0,0 +1,41 @@ +package com.yida.data.user.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalDate; +import java.util.List; + +/** + * 人脸组-策略-特殊日期保存类 + * + * @author ZYJ + * @date 2022/12/12 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "StrategySpecialDateSaveDTO", description = "人脸组-策略-特殊日期保存类") +public class StrategySpecialDateSaveDTO implements Serializable { + + private static final long serialVersionUID = -418058543595524019L; + + @ApiModelProperty("特殊日期开始日期") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") + private LocalDate specialStartDate; + + @ApiModelProperty("特殊日期结束日期") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") + private LocalDate specialEndDate; + + @ApiModelProperty("特殊日期-时间段集合") + private List specialTimeList; +} diff --git a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/StrategySpecialTimeSaveDTO.java b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/StrategySpecialTimeSaveDTO.java new file mode 100644 index 0000000..d6ba66c --- /dev/null +++ b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/StrategySpecialTimeSaveDTO.java @@ -0,0 +1,37 @@ +package com.yida.data.user.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalTime; + +/** + * 人脸组-策略-特殊日期-时间段信息保存类 + * + * @author ZYJ + * @date 2022/12/12 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "StrategySpecialTimeSaveDTO", description = "人脸组-策略-特殊日期-时间段信息保存类") +public class StrategySpecialTimeSaveDTO implements Serializable { + + private static final long serialVersionUID = -3507582697531274693L; + + @ApiModelProperty(value = "开始时间") + @DateTimeFormat(pattern = "HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "HH:mm:ss") + private LocalTime specialStartTime; + + @ApiModelProperty(value = "结束时间") + @DateTimeFormat(pattern = "HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "HH:mm:ss") + private LocalTime specialEndTime; +} diff --git a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/StudentDormExportDTO.java b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/StudentDormExportDTO.java new file mode 100644 index 0000000..5956caa --- /dev/null +++ b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/StudentDormExportDTO.java @@ -0,0 +1,40 @@ +package com.yida.data.user.dto; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.yida.data.common.core.converter.LocalDateTimeConverter; +import com.yida.data.common.core.entity.EasyExcelExportBaseDTO; +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * 学生宿舍信息导出类 + * + * @author ZYJ + * @date 2023/12/13 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@ApiModel(value = "StudentDormExportDTO", description = "学生宿舍信息导出类") +public class StudentDormExportDTO extends EasyExcelExportBaseDTO implements Serializable { + + private static final long serialVersionUID = 3404749621207403889L; + + @ExcelProperty("学生姓名") + private String stuName; + + @ExcelProperty("学号") + private String stuNumber; + + @ExcelProperty("班级信息") + private String deptName; + + @ExcelProperty("入住寝室") + private String dormRoomName; + + @ExcelProperty(value = "入住时间", converter = LocalDateTimeConverter.class) + private LocalDateTime checkInTime; +} \ No newline at end of file diff --git a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/StudentExportDTO.java b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/StudentExportDTO.java index 06582d2..efc8ce0 100644 --- a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/StudentExportDTO.java +++ b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/StudentExportDTO.java @@ -1,12 +1,14 @@ package com.yida.data.user.dto; import com.alibaba.excel.annotation.ExcelProperty; +import com.yida.data.common.core.converter.LocalDateConverter; import com.yida.data.common.core.entity.EasyExcelExportBaseDTO; import io.swagger.annotations.ApiModel; import lombok.Data; import lombok.EqualsAndHashCode; import java.io.Serializable; +import java.time.LocalDate; /** * 学生信息导出类 @@ -17,22 +19,82 @@ import java.io.Serializable; @Data @EqualsAndHashCode(callSuper = true) @ApiModel(value = "StudentExportDTO", description = "学生信息导出类") -public class StudentExportDTO extends EasyExcelExportBaseDTO implements Serializable { +public class StudentExportDTO extends StudentDormExportDTO implements Serializable { private static final long serialVersionUID = 6625908714399734930L; @ExcelProperty("学生姓名") private String stuName; - @ExcelProperty("年级") - private String gradeName; + @ExcelProperty("班级信息") + private String deptName; - @ExcelProperty("班级") - private String className; + @ExcelProperty("曾用名") + private String formerName; @ExcelProperty("学号") private String stuNumber; + @ExcelProperty("考生号") + private String stuExamNumber; + + @ExcelProperty("银行卡号") + private String creditCardNumbers; + + @ExcelProperty("邮箱") + private String email; + + @ExcelProperty("QQ号") + private String qqCode; + + @ExcelProperty("微信号") + private String wxCode; + + @ExcelProperty(value = "入学时间", converter = LocalDateConverter.class) + private LocalDate startDate; + + @ExcelProperty("入学年级") + private String startGrade; + + @ExcelProperty("政治面貌") + private String politicsStatus; + + @ExcelProperty("邮政编码") + private String postalCode; + + @ExcelProperty("籍贯") + private String nativePlace; + + @ExcelProperty("现住址") + private String presentAddress; + + /** + * 学生性别,0-男,1-女" + */ + @ExcelProperty("学生性别") + private String stuSex; + + @ExcelProperty("民族") + private String nation; + + @ExcelProperty("身份证号") + private String idNumber; + + @ExcelProperty("校园卡号") + private String stuCardNumber; + + /** + * 学生类别,0-走读,1-住宿 + */ + @ExcelProperty("学生类型") + private String type; + + /** + * 学籍状态:关联字典表 + */ + @ExcelProperty("学籍状态") + private String studentStatus; + @ExcelProperty("是否采集人脸") private String collectStatus; } \ No newline at end of file diff --git a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/WelcomeInviteImportDTO.java b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/WelcomeInviteImportDTO.java index 96c5fe9..176135c 100644 --- a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/WelcomeInviteImportDTO.java +++ b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/WelcomeInviteImportDTO.java @@ -1,12 +1,15 @@ package com.yida.data.user.dto; import com.alibaba.excel.annotation.ExcelProperty; +import com.yida.data.common.core.converter.LocalDateConverter; import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import java.io.Serializable; +import java.time.LocalDate; /** * Excel一键邀请信息导入类 @@ -111,4 +114,112 @@ public class WelcomeInviteImportDTO implements Serializable { */ @ExcelProperty(index = 14) private String familyName; + + /** + * 住宿类型 + */ + @ExcelProperty(index = 15) + private String type; + + /** + * 曾用名 + */ + @ExcelProperty(index = 16) + private String formerName; + + /** + * 考生号 + */ + @ExcelProperty(index = 17) + private String stuExamNumber; + + /** + * 银行卡号 + */ + @ExcelProperty(index = 18) + private String creditCardNumbers; + + /** + * 邮箱 + */ + @ExcelProperty(index = 19) + private String email; + + /** + * QQ号 + */ + @ExcelProperty(index = 20) + private String qqCode; + + /** + * 微信号 + */ + @ExcelProperty(index = 21) + private String wxCode; + + /** + * 入学时间 + */ + @ExcelProperty(index = 22) + private String startDate; + + /** + * 入学年级 + */ + @ExcelProperty(index = 23) + private String startGrade; + + /** + * 政治面貌 + */ + @ExcelProperty(index = 24) + private String politicsStatus; + + /** + * 邮政编码 + */ + @ExcelProperty(index = 25) + private String postalCode; + + /** + * 籍贯 + */ + @ExcelProperty(index = 26) + private String nativePlace; + + /** + * 现住址 + */ + @ExcelProperty(index = 27) + private String presentAddress; + + /** + * 学生性别 + */ + @ExcelProperty(index = 28) + private String stuSex; + + /** + * 民族 + */ + @ExcelProperty(index = 29) + private String nation; + + /** + * 身份证号 + */ + @ExcelProperty(index = 30) + private String idNumber; + + /** + * 校园卡号 + */ + @ExcelProperty(index = 31) + private String stuCardNumber; + + /** + * 学籍状态 + */ + @ExcelProperty(index = 32) + private String studentStatus; } \ No newline at end of file diff --git a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/h5/ListUserDeptAttendanceDTO.java b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/h5/ListUserDeptAttendanceDTO.java new file mode 100644 index 0000000..2985a4e --- /dev/null +++ b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/dto/h5/ListUserDeptAttendanceDTO.java @@ -0,0 +1,32 @@ +package com.yida.data.user.dto.h5; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.io.Serializable; +import java.time.LocalDate; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * 查询用户关联班级或者寝室考勤请求类 + */ +@Data +@ApiModel(value = "ListUserDeptAttendanceDTO", description = "查询用户关联班级或者寝室考勤请求类") +public class ListUserDeptAttendanceDTO implements Serializable { + + @ApiModelProperty("职工主键【用户统计数据】") + private Long staffId; + + @ApiModelProperty("查询日期【用户统计数据、详情】") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") + private LocalDate date; + + @ApiModelProperty("部门ID,班级或者宿舍【用于详情】") + private Long deptId; + + @ApiModelProperty("类型:0班级,1宿舍【用于详情】") + private Integer type; + +} diff --git a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/fallback/RemoteFaceGroupDeviceServiceFallback.java b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/fallback/RemoteFaceGroupDeviceServiceFallback.java new file mode 100644 index 0000000..5b3275d --- /dev/null +++ b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/fallback/RemoteFaceGroupDeviceServiceFallback.java @@ -0,0 +1,35 @@ +package com.yida.data.user.fallback; + +import com.yida.data.common.core.annotation.Fallback; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.user.EduFaceGroupDevice; +import com.yida.data.common.core.entity.user.EduUserDevice; +import com.yida.data.user.feign.RemoteFaceGroupDeviceService; +import com.yida.data.user.feign.RemoteUserDeviceService; +import feign.hystrix.FallbackFactory; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +/** + * RemoteFaceGroupDeviceService fallback处理类 + * + * @author ZYJ + * @date 2023/9/26 + */ +@Slf4j +@Fallback +public class RemoteFaceGroupDeviceServiceFallback implements FallbackFactory { + + @Override + public RemoteFaceGroupDeviceService create(Throwable throwable) { + log.error("RemoteFaceGroupDeviceService fallback reason:{}", throwable.getMessage()); + + return new RemoteFaceGroupDeviceService() { + @Override + public ResultBean> listFaceGroupOnlineDevice(Long faceGroupId) { + return null; + } + }; + } +} diff --git a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/fallback/RemoteFaceGroupStrategyServiceFallback.java b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/fallback/RemoteFaceGroupStrategyServiceFallback.java new file mode 100644 index 0000000..a27db60 --- /dev/null +++ b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/fallback/RemoteFaceGroupStrategyServiceFallback.java @@ -0,0 +1,31 @@ +package com.yida.data.user.fallback; + +import com.yida.data.common.core.annotation.Fallback; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.user.EduFaceGroupStrategy; +import com.yida.data.user.feign.RemoteFaceGroupStrategyService; +import feign.hystrix.FallbackFactory; +import lombok.extern.slf4j.Slf4j; + +/** + * RemoteFaceGroupStrategyService fallback处理类 + * + * @author ZYJ + * @date 2022/8/26 + */ +@Slf4j +@Fallback +public class RemoteFaceGroupStrategyServiceFallback implements FallbackFactory { + + @Override + public RemoteFaceGroupStrategyService create(Throwable throwable) { + log.error("RemoteFaceGroupStrategyService fallback reason:{}", throwable.getMessage()); + + return new RemoteFaceGroupStrategyService() { + @Override + public ResultBean getStrategyInfo(Long faceGroupId) { + return null; + } + }; + } +} diff --git a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/fallback/RemoteStaffServiceFallback.java b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/fallback/RemoteStaffServiceFallback.java index 0dcb3f5..d17012b 100644 --- a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/fallback/RemoteStaffServiceFallback.java +++ b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/fallback/RemoteStaffServiceFallback.java @@ -8,6 +8,7 @@ import com.yida.data.common.core.entity.user.EduTeacherDept; import com.yida.data.user.dto.ListStaffDTO; import com.yida.data.user.feign.RemoteStaffService; import com.yida.data.user.vo.TeacherClassVO; +import com.yida.data.user.vo.TeacherDeptVO; import feign.hystrix.FallbackFactory; import lombok.extern.slf4j.Slf4j; @@ -75,6 +76,11 @@ public class RemoteStaffServiceFallback implements FallbackFactory> listStaffByDeptIdNoPermission(Long deptId, String nameOrPhone, Long schoolId) { + return null; + } + /** * 根据条件查询职工列表 * @@ -106,6 +112,11 @@ public class RemoteStaffServiceFallback implements FallbackFactory> getStaffDeptByStaffIdsNoPermission(List staffIds) { + return null; + } + @Override public ResultBean syncQywxStaff() { return null; @@ -174,6 +185,26 @@ public class RemoteStaffServiceFallback implements FallbackFactory> listStaffRolesByStaffId(Long staffId) { + return null; + } + + @Override + public ResultBean> getStaffList(List staffIds) { + return null; + } + + @Override + public ResultBean updateStaffCache() { + return null; + } + + @Override + public ResultBean> listClassIdByStaffId() { + return null; + } }; } } diff --git a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/fallback/RemoteStudentApplyServiceFallback.java b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/fallback/RemoteStudentApplyServiceFallback.java new file mode 100644 index 0000000..d504906 --- /dev/null +++ b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/fallback/RemoteStudentApplyServiceFallback.java @@ -0,0 +1,44 @@ +package com.yida.data.user.fallback; + +import com.yida.data.common.core.annotation.Fallback; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.user.EduStudentApply; +import com.yida.data.user.feign.RemoteStudentApplyService; +import feign.hystrix.FallbackFactory; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; +import java.util.Map; + +/** + * RemoteStudentApplyService fallback处理类 + * + * @author ZYJ + * @date 2022/8/26 + */ +@Slf4j +@Fallback +public class RemoteStudentApplyServiceFallback implements FallbackFactory { + + @Override + public RemoteStudentApplyService create(Throwable throwable) { + log.error("RemoteStudentApplyService fallback reason:{}", throwable.getMessage()); + + return new RemoteStudentApplyService() { + @Override + public ResultBean>> listApplyCode(Long[] studentIds) { + return null; + } + + @Override + public ResultBean hasApply(Long studentId, String applyCode) { + return null; + } + + @Override + public ResultBean getStudentApply(Long studentId, String applyCode) { + return null; + } + }; + } +} diff --git a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/fallback/RemoteStudentServiceFallback.java b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/fallback/RemoteStudentServiceFallback.java index 3d095f5..7791982 100644 --- a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/fallback/RemoteStudentServiceFallback.java +++ b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/fallback/RemoteStudentServiceFallback.java @@ -1,5 +1,6 @@ package com.yida.data.user.fallback; +import cn.hutool.json.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.yida.data.common.core.annotation.Fallback; import com.yida.data.common.core.common.ResultBean; @@ -322,6 +323,27 @@ public class RemoteStudentServiceFallback implements FallbackFactory> listBaseStudentNoJoin(EduStudent eduStudent) { return null; } + + @Override + public ResultBean countUserDashboardNum(Long schoolId) { + return null; + } + + @Override + public ResultBean saveStudent(EduStudent eduStudent) { + return null; + } + + @Override + public ResultBean saveStudentDorm(EduStudent eduStudent) { + return null; + } + + @Override + public ResultBean updateStudentCache() { + return null; + } + }; } } diff --git a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/fallback/RemoteTeacherServiceFallback.java b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/fallback/RemoteTeacherServiceFallback.java index 802001c..736312e 100644 --- a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/fallback/RemoteTeacherServiceFallback.java +++ b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/fallback/RemoteTeacherServiceFallback.java @@ -29,16 +29,9 @@ public class RemoteTeacherServiceFallback implements FallbackFactory teacherList) { + public ResultBean dealWxTeacherChange(Long schoolId, Long campusId, Long sectionId, Long gradeId, Long classId, List teacherList, Long deptWxId) { return null; } diff --git a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/fallback/RemoteUserDeptServiceFallback.java b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/fallback/RemoteUserDeptServiceFallback.java index 5a3a739..ba35eab 100644 --- a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/fallback/RemoteUserDeptServiceFallback.java +++ b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/fallback/RemoteUserDeptServiceFallback.java @@ -115,6 +115,11 @@ public class RemoteUserDeptServiceFallback implements FallbackFactory> getParentListByDeptId(Long deptId) { + return null; + } + /** * 批量保存家校部门 * @@ -193,6 +198,16 @@ public class RemoteUserDeptServiceFallback implements FallbackFactory> findChildIdByParentAndTypeNoPermission(Long parentId, Integer type) { return null; } + + @Override + public ResultBean> findListByParent(Long deptId) { + return null; + } + + @Override + public ResultBean getUserDeptTree(List deptIds) { + return null; + } }; } } diff --git a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/fallback/RemoteUserDeviceServiceFallback.java b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/fallback/RemoteUserDeviceServiceFallback.java index 7800b7a..27466bf 100644 --- a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/fallback/RemoteUserDeviceServiceFallback.java +++ b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/fallback/RemoteUserDeviceServiceFallback.java @@ -28,6 +28,16 @@ public class RemoteUserDeviceServiceFallback implements FallbackFactory list) { return null; } + + @Override + public ResultBean> listUserDevice(Long userId, Integer type, Long deviceId, Long faceGroupId) { + return null; + } + + @Override + public ResultBean deleteRelation(EduUserDevice userDevice) { + return null; + } }; } } diff --git a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/feign/RemoteFaceGroupDeviceService.java b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/feign/RemoteFaceGroupDeviceService.java new file mode 100644 index 0000000..328a212 --- /dev/null +++ b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/feign/RemoteFaceGroupDeviceService.java @@ -0,0 +1,36 @@ +package com.yida.data.user.feign; + +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.constant.FebsServerConstant; +import com.yida.data.common.core.entity.user.EduFaceGroupDevice; +import com.yida.data.common.core.entity.user.EduUserDevice; +import com.yida.data.user.fallback.RemoteUserDeviceServiceFallback; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.List; + +/** + * 人脸组设备 Feign + * + * @author ZYJ + * @date 2023/9/28 + */ +@FeignClient(name = FebsServerConstant.EDU_USER, contextId = "faceGroupDeviceService", + fallbackFactory = RemoteUserDeviceServiceFallback.class) +public interface RemoteFaceGroupDeviceService { + + /** + * 查询人脸组设备id集合 + * + * @param faceGroupId 人脸组id + * @return com.yida.data.common.core.common.ResultBean> + * @author ZYJ + * @date 2023/9/28 16:08 + */ + @GetMapping("/in/groupDevice/listFaceGroupOnlineDevice") + ResultBean> listFaceGroupOnlineDevice(@RequestParam Long faceGroupId); +} diff --git a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/feign/RemoteFaceGroupStrategyService.java b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/feign/RemoteFaceGroupStrategyService.java new file mode 100644 index 0000000..eaf1d25 --- /dev/null +++ b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/feign/RemoteFaceGroupStrategyService.java @@ -0,0 +1,19 @@ +package com.yida.data.user.feign; + +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.constant.FebsServerConstant; +import com.yida.data.common.core.entity.user.EduCourse; +import com.yida.data.common.core.entity.user.EduFaceGroupStrategy; +import com.yida.data.user.fallback.RemoteCourseServiceFallback; +import com.yida.data.user.fallback.RemoteFaceGroupStrategyServiceFallback; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; + +@FeignClient(value = FebsServerConstant.EDU_USER, contextId = "remoteFaceGroupStrategyServiceClient", + fallbackFactory = RemoteFaceGroupStrategyServiceFallback.class) +public interface RemoteFaceGroupStrategyService { + + @GetMapping("/in/eduFaceGroupStrategy/getStrategyInfo") + ResultBean getStrategyInfo(@RequestParam("faceGroupId") Long faceGroupId); +} diff --git a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/feign/RemoteStaffService.java b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/feign/RemoteStaffService.java index 969df2d..1fde5da 100644 --- a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/feign/RemoteStaffService.java +++ b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/feign/RemoteStaffService.java @@ -8,6 +8,7 @@ import com.yida.data.common.core.entity.user.EduTeacherDept; import com.yida.data.user.dto.ListStaffDTO; import com.yida.data.user.fallback.RemoteStaffServiceFallback; import com.yida.data.user.vo.TeacherClassVO; +import com.yida.data.user.vo.TeacherDeptVO; import io.swagger.annotations.ApiParam; import org.apache.ibatis.annotations.Param; import org.springframework.cloud.openfeign.FeignClient; @@ -19,7 +20,7 @@ import org.springframework.web.bind.annotation.RequestParam; import java.util.List; @FeignClient(value = FebsServerConstant.EDU_USER, contextId = "StaffServiceClient", - fallbackFactory = RemoteStaffServiceFallback.class) + fallbackFactory = RemoteStaffServiceFallback.class) public interface RemoteStaffService { @@ -31,7 +32,7 @@ public interface RemoteStaffService { */ @GetMapping("/staff/findTeacherRole") ResultBean> findTeacherRole(@RequestParam("teacherId") Long teacherId, - @RequestParam("type") Integer type); + @RequestParam("type") Integer type); /** * 查询教师可见课程 @@ -42,7 +43,7 @@ public interface RemoteStaffService { */ @GetMapping("/staff/findTeacherCourseId") ResultBean> findTeacherCourseId(@RequestParam("teacherId") Long teacherId, - @RequestParam("schoolId") Long schoolId); + @RequestParam("schoolId") Long schoolId); /** * 根据id查询职工信息 @@ -60,13 +61,19 @@ public interface RemoteStaffService { */ @GetMapping("/staff/listStaffByDeptId") ResultBean> listStaffByDeptId(@RequestParam("deptId") @Param("deptId") Long deptId, - @RequestParam("nameOrPhone") @Param("nameOrPhone") String nameOrPhone, - @RequestParam("schoolId") Long schoolId); + @RequestParam("nameOrPhone") @Param("nameOrPhone") String nameOrPhone, + @RequestParam("schoolId") Long schoolId); + + + @GetMapping("/in/staff/listStaffByDeptId") + ResultBean> listStaffByDeptIdNoPermission(@RequestParam("deptId") @Param("deptId") Long deptId, + @RequestParam("nameOrPhone") @Param("nameOrPhone") String nameOrPhone, + @RequestParam("schoolId") Long schoolId); /** * 根据条件查询职工列表 */ - @PostMapping("/staff/listStaff") + @PostMapping("/in/staff/listStaff") ResultBean> listStaff(@RequestBody ListStaffDTO dto); /** @@ -84,6 +91,9 @@ public interface RemoteStaffService { @PostMapping("/staff/getStaffDeptByStaffIds") ResultBean> getStaffDeptByStaffIds(@ApiParam("职工id") @RequestBody List staffIds); + @PostMapping("/in/staff/getStaffDeptByStaffIds") + ResultBean> getStaffDeptByStaffIdsNoPermission(@ApiParam("职工id") @RequestBody List staffIds); + @GetMapping("/in/staff/syncQywxStaff") ResultBean syncQywxStaff(); @@ -99,16 +109,16 @@ public interface RemoteStaffService { */ @GetMapping("/in/staff/getStaffByWxOrMobileOrOpenId") ResultBean getStaffByWxOrMobileOrOpenId(@RequestParam("wxId") String wxId, - @RequestParam("mobile") String mobile, - @RequestParam("wxOpenId") String wxOpenId, - @RequestParam("schoolId") Long schoolId); + @RequestParam("mobile") String mobile, + @RequestParam("wxOpenId") String wxOpenId, + @RequestParam("schoolId") Long schoolId); /** * 处理企业微信职工删除 */ @GetMapping("/in/staff/dealWxUserDelete") ResultBean dealWxUserDelete(@RequestParam("wxId") String wxId, - @RequestParam("schoolId") Long schoolId); + @RequestParam("schoolId") Long schoolId); @GetMapping("/in/staff/getStaffByDahua") ResultBean getStaffByDahuaNoPermission(@RequestParam("dahuaCode") String dahuaCode); @@ -133,5 +143,36 @@ public interface RemoteStaffService { */ @GetMapping("/in/staff/saveWxPublicOpenId") ResultBean saveWxPublicOpenId(@RequestParam("staffId") Long staffId, - @RequestParam("openId") String openId); + @RequestParam("openId") String openId); + + + @GetMapping("/in/staff/listStaffRolesByStaffId") + ResultBean> listStaffRolesByStaffId(@RequestParam("staffId") Long staffId); + + /** + * 根据职工id集合查询职工信息 + * + * @param staffIds 职工id集合 + * @return com.yida.data.common.core.common.ResultBean> + * @author ZYJ + * @date 2023/6/8 17:24 + */ + @PostMapping("/staff/getStaffList") + ResultBean> getStaffList(@RequestBody List staffIds); + + /** + * 更新职工信息缓存 + * + * @return + */ + @GetMapping("in/staff/updateStaffCache") + ResultBean updateStaffCache(); + + /** + * 查询职工管理班级 + * + * @return + */ + @GetMapping("in/staff/listClassIdByStaffId") + ResultBean> listClassIdByStaffId(); } \ No newline at end of file diff --git a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/feign/RemoteStudentApplyService.java b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/feign/RemoteStudentApplyService.java new file mode 100644 index 0000000..a3f2fc8 --- /dev/null +++ b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/feign/RemoteStudentApplyService.java @@ -0,0 +1,28 @@ +package com.yida.data.user.feign; + +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.constant.FebsServerConstant; +import com.yida.data.common.core.entity.user.EduStudentApply; +import com.yida.data.user.fallback.RemoteStudentApplyServiceFallback; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.List; +import java.util.Map; + +@FeignClient(value = FebsServerConstant.EDU_USER, contextId = "studentApplyServiceClient", + fallbackFactory = RemoteStudentApplyServiceFallback.class) +public interface RemoteStudentApplyService { + + @GetMapping("/in/transaction/studentApply/listApply") + ResultBean>> listApplyCode(@RequestParam("studentIds") Long[] studentIds); + + @GetMapping("/transaction/studentApply/hasApply") + ResultBean hasApply(@RequestParam("studentId") Long studentId, + @RequestParam("applyCode") String applyCode); + + @GetMapping("/transaction/studentApply/getStudentApplyByIdAndCode") + ResultBean getStudentApply(@RequestParam("studentId") Long studentId, + @RequestParam("applyCode") String applyCode); +} diff --git a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/feign/RemoteStudentService.java b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/feign/RemoteStudentService.java index e92b72c..fa01e95 100644 --- a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/feign/RemoteStudentService.java +++ b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/feign/RemoteStudentService.java @@ -1,5 +1,6 @@ package com.yida.data.user.feign; +import cn.hutool.json.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.yida.data.common.core.common.ResultBean; import com.yida.data.common.core.entity.constant.FebsServerConstant; @@ -12,6 +13,7 @@ import com.yida.data.user.fallback.RemoteStudentServiceFallback; import com.yida.data.user.vo.ListParentByStudentIdsVO; import com.yida.data.user.vo.ParentInfoVO; import com.yida.data.user.vo.StudentClassInfoVO; +import io.swagger.annotations.ApiParam; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; @@ -19,6 +21,7 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import java.util.List; +import java.util.Map; @FeignClient(value = FebsServerConstant.EDU_USER, contextId = "studentServiceClient", fallbackFactory = RemoteStudentServiceFallback.class) @@ -249,4 +252,36 @@ public interface RemoteStudentService { */ @PostMapping(value = "/in/student/listBaseStudentNoJoin") ResultBean> listBaseStudentNoJoin(@RequestBody EduStudent eduStudent); + + /** + * 查询校园大数据的人员统计数据 + * + * @param schoolId 学校id + * @return com.yida.data.common.core.common.ResultBean + * @author ZYJ + * @date 2023/4/24 15:09 + */ + @GetMapping(value = "/in/student/countUserDashboardNum") + ResultBean countUserDashboardNum(@RequestParam Long schoolId); + + + /** + * 新增/编辑学生 + * + * @param eduStudent + * @return + */ + @PostMapping("out/student/saveStudent") + ResultBean saveStudent(@RequestBody EduStudent eduStudent); + + @PostMapping("in/student/saveStudentDorm") + ResultBean saveStudentDorm(@RequestBody EduStudent eduStudent); + + /** + * 更新学生信息缓存 + * + * @return + */ + @GetMapping("in/student/updateStudentCache") + ResultBean updateStudentCache(); } diff --git a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/feign/RemoteTeacherService.java b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/feign/RemoteTeacherService.java index 0431fc0..b7c6a3e 100644 --- a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/feign/RemoteTeacherService.java +++ b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/feign/RemoteTeacherService.java @@ -28,7 +28,8 @@ public interface RemoteTeacherService { @RequestParam("sectionId") Long sectionId, @RequestParam("gradeId") Long gradeId, @RequestParam("classId") Long classId, - @RequestBody List teacherList); + @RequestBody List teacherList, + @RequestParam("deptWxId") Long deptWxId); /** * 根据教师微信id查询教师信息 @@ -96,6 +97,7 @@ public interface RemoteTeacherService { * * @param deptId 家校部门id * @param type 教师类型 1表示校区负责人,2表示年级负责人,3表示班主任,4表示任课老师,5表示学段负责人 + * 1表示班级,2表示年级,3表示学段,4表示校区 * @return com.yida.data.common.core.common.ResultBean> * @author ZYJ * @date 2022/7/15 17:48 diff --git a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/feign/RemoteUserDeptService.java b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/feign/RemoteUserDeptService.java index ba2f11e..665d7b1 100644 --- a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/feign/RemoteUserDeptService.java +++ b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/feign/RemoteUserDeptService.java @@ -20,7 +20,7 @@ import java.util.List; * @date 2021-11-22 */ @FeignClient(value = FebsServerConstant.EDU_USER, contextId = "userDeptServiceClient", - fallbackFactory = RemoteUserDeptServiceFallback.class) + fallbackFactory = RemoteUserDeptServiceFallback.class) public interface RemoteUserDeptService { /** @@ -99,6 +99,16 @@ public interface RemoteUserDeptService { @GetMapping("/in/eduUserDept/getParentByDeptId") ResultBean getParentByDeptId(@RequestParam Long deptId); + + /** + * 根据家校部门id查询全部上级家校部门信息 + * + * @param deptId + * @return + */ + @GetMapping("/in/eduUserDept/getParentListByDeptId") + ResultBean> getParentListByDeptId(@RequestParam Long deptId); + /** * 批量保存家校部门 * @@ -146,9 +156,24 @@ public interface RemoteUserDeptService { ResultBean> findChildByParentAndType(@RequestParam Long parentId, @RequestParam Integer type); /** - * 向下查询指定家校部门类型的家校部门id(可查询非直接子家校部门) - * 未毕业家校部门 + * 向下查询指定家校部门类型的家校部门id(可查询非直接子家校部门) 未毕业家校部门 */ @GetMapping("/in/eduUserDept/findChildIdByParentAndType") ResultBean> findChildIdByParentAndTypeNoPermission(@RequestParam Long parentId, @RequestParam Integer type); + + /** + * 向下查询指定家校部门类型的家校部门id(可查询非直接子家校部门) 未毕业家校部门 + */ + @GetMapping("/in/eduUserDept/findListByParent") + ResultBean> findListByParent(@RequestParam Long deptId); + + + /** + * 获取家校部门树 + * + * @param deptIds + * @return + */ + @PostMapping("in/eduUserDept/getUserDeptTree") + ResultBean getUserDeptTree(@RequestBody List deptIds); } diff --git a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/feign/RemoteUserDeviceService.java b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/feign/RemoteUserDeviceService.java index a5997f1..8be694e 100644 --- a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/feign/RemoteUserDeviceService.java +++ b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/feign/RemoteUserDeviceService.java @@ -6,8 +6,10 @@ import com.yida.data.common.core.entity.user.EduUserDevice; import com.yida.data.user.fallback.RemoteUserDeviceServiceFallback; import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; import java.util.List; @@ -17,4 +19,32 @@ public interface RemoteUserDeviceService { @PostMapping("/in/userDevice/batchSave") ResultBean batchSave(@RequestBody List list); + + /** + * 获取设备和人员关联信息 + * + * @param userId 用户id + * @param type 用户类型. 0-学生,1-职工 + * @param deviceId 设备id + * @param faceGroupId 人脸组id + * @return com.yida.data.common.core.common.ResultBean> + * @author ZYJ + * @date 2023/2/3 17:21 + */ + @GetMapping("/in/userDevice/listUserDevice") + ResultBean> listUserDevice(@RequestParam Long userId, + @RequestParam Integer type, + @RequestParam Long deviceId, + @RequestParam Long faceGroupId); + + /** + * 删除设备和人员关联信息 + * + * @param userDevice 删除信息 + * @return com.yida.data.common.core.common.ResultBean + * @author ZYJ + * @date 2023/2/23 17:32 + */ + @PostMapping("/in/userDevice/deleteRelation") + ResultBean deleteRelation(@RequestBody EduUserDevice userDevice); } diff --git a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/feign/RemoteUserFaceService.java b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/feign/RemoteUserFaceService.java index 4034a42..b6cd24e 100644 --- a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/feign/RemoteUserFaceService.java +++ b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/feign/RemoteUserFaceService.java @@ -16,6 +16,15 @@ import org.springframework.web.bind.annotation.RequestParam; fallbackFactory = RemoteUserFaceServiceFallback.class) public interface RemoteUserFaceService { + /** + * 获取用户人脸信息 + * + * @param userId 用户id + * @param type 用户类型,0-学生,1-职工 + * @return com.yida.data.common.core.common.ResultBean + * @author ZYJ + * @date 2023/2/2 16:59 + */ @GetMapping("/in/face/getFaceByUser") ResultBean getFaceByUser(@RequestParam("userId") Long userId, @RequestParam("type") Integer type); diff --git a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/ClassAttendanceDataVO.java b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/ClassAttendanceDataVO.java new file mode 100644 index 0000000..22ad12c --- /dev/null +++ b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/ClassAttendanceDataVO.java @@ -0,0 +1,55 @@ +package com.yida.data.user.vo; + +import com.yida.data.common.core.entity.user.EduStudent; +import io.swagger.annotations.ApiModelProperty; +import java.util.List; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class ClassAttendanceDataVO { + + /** + * 宿舍名称/班级名称 + */ + @ApiModelProperty(value = "班级ID") + private Long classId; + /** + * 宿舍名称/班级名称 + */ + @ApiModelProperty(value = "类型:0班级,1宿舍") + private Integer type; + /** + * 宿舍名称/班级名称 + */ + @ApiModelProperty(value = "名称") + private String name; + /** + * 总人数 + */ + @ApiModelProperty(value = "总人数") + private Integer totalNum; + /** + * 已采集人数 + */ + @ApiModelProperty(value = "异常人数") + private Integer abnormalNum; + /** + * 关联学生数据 + */ + @ApiModelProperty(value = "关联学生数据") + private List studentList; + /** + * 考勤时段ID + */ + @ApiModelProperty(value = "考勤时段ID") + private Long ruleTimeId; + + +} diff --git a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/DeptManagetVO.java b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/DeptManagetVO.java new file mode 100644 index 0000000..b31536a --- /dev/null +++ b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/DeptManagetVO.java @@ -0,0 +1,16 @@ +package com.yida.data.user.vo; + +import io.swagger.annotations.ApiModelProperty; +import java.util.List; +import lombok.Data; + +@Data +public class DeptManagetVO { + + @ApiModelProperty("部门Id") + private Long deptId; + @ApiModelProperty("部门名称") + private String deptName; + @ApiModelProperty("部门管理员") + private List managerVoList; +} diff --git a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/DownLoadPicVO.java b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/DownLoadPicVO.java index af971bd..0f0fb10 100644 --- a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/DownLoadPicVO.java +++ b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/DownLoadPicVO.java @@ -14,7 +14,7 @@ public class DownLoadPicVO { @ApiModelProperty("是否上传完成,0-否,1-是") private Integer finish; - + @ApiModelProperty("下载总数") private Integer totalNum; diff --git a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/DownLoadStaffAttendanceRecordVO.java b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/DownLoadStaffAttendanceRecordVO.java new file mode 100644 index 0000000..3af2ce0 --- /dev/null +++ b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/DownLoadStaffAttendanceRecordVO.java @@ -0,0 +1,35 @@ +package com.yida.data.user.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 下载职工通行记录进度-实体 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class DownLoadStaffAttendanceRecordVO { + + @ApiModelProperty("本次操作标识") + private String key; + + @ApiModelProperty("进度 0-100") + private Integer percent; + + @ApiModelProperty("是否下载完成,0-否,1-是") + private Integer finish; + + @ApiModelProperty("下载总数") + private Integer totalNum; + + @ApiModelProperty("当前下载到第几个") + private Integer currentNum; + + @ApiModelProperty("错误文件路径") + private String filePath; +} diff --git a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/ManagerVo.java b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/ManagerVo.java new file mode 100644 index 0000000..6a44008 --- /dev/null +++ b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/ManagerVo.java @@ -0,0 +1,10 @@ +package com.yida.data.user.vo; + +import lombok.Data; + +@Data +public class ManagerVo { + + private Long userId; + private String userName; +} diff --git a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/OutPageStudentVO.java b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/OutPageStudentVO.java new file mode 100644 index 0000000..d3f557f --- /dev/null +++ b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/OutPageStudentVO.java @@ -0,0 +1,46 @@ +package com.yida.data.user.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * 分页查询学生列表数据返回类 + * + * @author ZYJ + * @date 2023/2/20 + */ +@Data +@ApiModel(value = "OutPageStudentVO", description = "分页查询学生列表数据返回类") +public class OutPageStudentVO implements Serializable { + + private static final long serialVersionUID = 7179610417104867560L; + + @ApiModelProperty("学生id") + private Long studentId; + + @ApiModelProperty("学生姓名") + private String studentName; + + @ApiModelProperty("校园卡号") + private String stuCardNumber; + + @ApiModelProperty("学生头像url") + private String avatar; + + @ApiModelProperty("学校id") + private Long schoolId; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createDate; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateDate; +} diff --git a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/StrategyInfoVO.java b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/StrategyInfoVO.java new file mode 100644 index 0000000..c5a8e7a --- /dev/null +++ b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/StrategyInfoVO.java @@ -0,0 +1,71 @@ +package com.yida.data.user.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; + +/** + * 人脸组-策略信息返回类 + * + * @author ZYJ + * @date 2022/12/12 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "StrategyInfoVO", description = "人脸组-策略信息返回类") +public class StrategyInfoVO implements Serializable { + + private static final long serialVersionUID = 5883547164739281028L; + + @ApiModelProperty(value = "策略id") + private Long strategyId; + + @ApiModelProperty(value = "人脸组id") + private Long faceGroupId; + + @ApiModelProperty(value = "策略生效时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime strategyStartDate; + + @ApiModelProperty(value = "策略失效时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime strategyEndDate; + + @ApiModelProperty(value = "星期一通行计划uuid") + private String mondayUniqueCode; + + @ApiModelProperty(value = "星期二通行计划uuid") + private String tuesdayUniqueCode; + + @ApiModelProperty(value = "星期三通行计划uuid") + private String wednesdayUniqueCode; + + @ApiModelProperty(value = "星期四通行计划uuid") + private String thursdayUniqueCode; + + @ApiModelProperty(value = "星期五通行计划uuid") + private String fridayUniqueCode; + + @ApiModelProperty(value = "星期六通行计划uuid") + private String saturdayUniqueCode; + + @ApiModelProperty(value = "星期天通行计划uuid") + private String sundayUniqueCode; + + @ApiModelProperty(value = "通行计划集合") + private List planList; + + @ApiModelProperty(value = "特殊日期集合") + private List specialList; +} diff --git a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/StrategyPlanTimeVO.java b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/StrategyPlanTimeVO.java new file mode 100644 index 0000000..b9257f9 --- /dev/null +++ b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/StrategyPlanTimeVO.java @@ -0,0 +1,48 @@ +package com.yida.data.user.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalTime; + +/** + * 人脸组-策略-通行计划-时间段信息返回类 + * + * @author ZYJ + * @date 2022/12/12 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "StrategyPlanTimeVO", description = "人脸组-策略-通行计划-时间段信息返回类") +public class StrategyPlanTimeVO implements Serializable { + + private static final long serialVersionUID = -3006837050525867421L; + + @ApiModelProperty(value = "人脸组id") + @TableField("face_group_id") + private Long faceGroupId; + + @ApiModelProperty(value = "人脸组-策略id") + private Long faceGroupStrategyId; + + @ApiModelProperty(value = "人脸组-策略-通行计划id") + private Long faceGroupStrategyPlanId; + + @ApiModelProperty(value = "开始时间") + @DateTimeFormat(pattern = "HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "HH:mm:ss") + private LocalTime planStartTime; + + @ApiModelProperty(value = "结束时间") + @DateTimeFormat(pattern = "HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "HH:mm:ss") + private LocalTime planEndTime; +} diff --git a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/StrategyPlanVO.java b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/StrategyPlanVO.java new file mode 100644 index 0000000..56e455b --- /dev/null +++ b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/StrategyPlanVO.java @@ -0,0 +1,40 @@ +package com.yida.data.user.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.List; + +/** + * 人脸组-策略-通行计划信息返回类 + * + * @author ZYJ + * @date 2022/12/12 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "StrategyPlanVO", description = "人脸组-策略-通行计划信息返回类") +public class StrategyPlanVO implements Serializable { + + private static final long serialVersionUID = -4014484234037617273L; + + @ApiModelProperty(value = "通行计划id") + private Long planId; + + @ApiModelProperty(value = "人脸组id") + private Long faceGroupId; + + @ApiModelProperty(value = "人脸组-策略id") + private Long faceGroupStrategyId; + + @ApiModelProperty("通行计划唯一编码") + private String uniqueCode; + + @ApiModelProperty("通行计划-时间段集合") + private List planTimeList; +} diff --git a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/StrategySpecialDateVO.java b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/StrategySpecialDateVO.java new file mode 100644 index 0000000..7d9d82f --- /dev/null +++ b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/StrategySpecialDateVO.java @@ -0,0 +1,50 @@ +package com.yida.data.user.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalDate; +import java.util.List; + +/** + * 人脸组-策略-特殊日期返回类 + * + * @author ZYJ + * @date 2022/12/12 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "StrategySpecialDateVO", description = "人脸组-策略-特殊日期返回类") +public class StrategySpecialDateVO implements Serializable { + + private static final long serialVersionUID = -3513266099905879137L; + + @ApiModelProperty(value = "特殊日期主键id") + private Long specialId; + + @ApiModelProperty(value = "人脸组id") + private Long faceGroupId; + + @ApiModelProperty(value = "人脸组-策略id") + private Long faceGroupStrategyId; + + @ApiModelProperty(value = "特殊日期开始日期") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") + private LocalDate specialStartDate; + + @ApiModelProperty(value = "特殊日期结束日期") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") + private LocalDate specialEndDate; + + @ApiModelProperty("特殊日期-时间段集合") + private List specialTimeList; +} diff --git a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/StrategySpecialTimeVO.java b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/StrategySpecialTimeVO.java new file mode 100644 index 0000000..7fb0fef --- /dev/null +++ b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/StrategySpecialTimeVO.java @@ -0,0 +1,37 @@ +package com.yida.data.user.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalTime; + +/** + * 人脸组-策略-特殊日期-时间返回类 + * + * @author ZYJ + * @date 2022/12/12 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "StrategySpecialTimeVO", description = "人脸组-策略-特殊日期-时间返回类") +public class StrategySpecialTimeVO implements Serializable { + + private static final long serialVersionUID = 3886115890777830964L; + + @ApiModelProperty(value = "开始时间") + @DateTimeFormat(pattern = "HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "HH:mm:ss") + private LocalTime specialStartTime; + + @ApiModelProperty(value = "结束时间") + @DateTimeFormat(pattern = "HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "HH:mm:ss") + private LocalTime specialEndTime; +} diff --git a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/StudentApplyImportErrorVO.java b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/StudentApplyImportErrorVO.java new file mode 100644 index 0000000..d7dc54c --- /dev/null +++ b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/StudentApplyImportErrorVO.java @@ -0,0 +1,13 @@ +package com.yida.data.user.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class StudentApplyImportErrorVO { + + @ExcelProperty(index = 0, value = "错误信息") + @ApiModelProperty("错误信息") + private String errorMsg; +} diff --git a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/StudentApplyImportProgressVO.java b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/StudentApplyImportProgressVO.java new file mode 100644 index 0000000..04731ab --- /dev/null +++ b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/StudentApplyImportProgressVO.java @@ -0,0 +1,13 @@ +package com.yida.data.user.vo; + +import lombok.Data; + +@Data +public class StudentApplyImportProgressVO { + + private Integer totalNum; + private Integer currentNum; + private String errorPageUrl; + private Integer finish; + private String redisKey; +} diff --git a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/StudentApplyImportVO.java b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/StudentApplyImportVO.java new file mode 100644 index 0000000..a53b0e6 --- /dev/null +++ b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/StudentApplyImportVO.java @@ -0,0 +1,53 @@ +package com.yida.data.user.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class StudentApplyImportVO { + + @ExcelProperty(index = 0, value = "序号") + @ApiModelProperty(value = "序号") + private Long indexNo; + + @ExcelProperty(index = 1, value = "学校名称") + @ApiModelProperty("学校名称") + private String schoolName; + + @ExcelProperty(index = 2, value = "校区名称") + @ApiModelProperty("校区名称") + private String campusName; + + @ExcelProperty(index = 3, value = "学段名称") + @ApiModelProperty("学段名称") + private String sectionName; + + @ExcelProperty(index = 4, value = "年级名称") + @ApiModelProperty("年级名称") + private String gradeName; + + @ExcelProperty(index = 5, value = "班级名称") + @ApiModelProperty("班级名称") + private String className; + + @ExcelProperty(index = 6, value = "学生姓名") + @ApiModelProperty("学生姓名") + private String studentName; + + @ExcelProperty(index = 7, value = "学生学号") + @ApiModelProperty("学生学号") + private String studentNumber; + + @ExcelProperty(index = 8, value = "开通应用") + @ApiModelProperty("开通应用") + private String applyName; + + @ExcelProperty(index = 9, value = "有效开始时间") + @ApiModelProperty("有效开始时间") + private String startTime; + + @ExcelProperty(index = 10, value = "有效结束时间") + @ApiModelProperty("有效结束时间") + private String endTime; +} diff --git a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/StudentApplyStatusVO.java b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/StudentApplyStatusVO.java new file mode 100644 index 0000000..339694b --- /dev/null +++ b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/StudentApplyStatusVO.java @@ -0,0 +1,15 @@ +package com.yida.data.user.vo; + +import io.swagger.annotations.ApiModelProperty; +import java.time.LocalDate; +import lombok.Data; + +@Data +public class StudentApplyStatusVO { + + @ApiModelProperty("应用状态,0-未开通,1-使用中,2-已过期") + private Integer status; + + @ApiModelProperty("过期时间") + private LocalDate deadLine; +} diff --git a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/TeacherDeptVO.java b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/TeacherDeptVO.java index f662bd5..93f6e01 100644 --- a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/TeacherDeptVO.java +++ b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/TeacherDeptVO.java @@ -10,6 +10,11 @@ import lombok.Data; @ApiModel("教师班级学科关系") public class TeacherDeptVO { + @ApiModelProperty("学校id") + private Long schoolId; + @ApiModelProperty("学校名称") + private String schoolName; + @ApiModelProperty("校区id") private Long campusId; @ApiModelProperty("校区名称") @@ -30,6 +35,9 @@ public class TeacherDeptVO { @ApiModelProperty("班级名称") private String className; + @ApiModelProperty("班级人数") + private Long classStudentNum; + @ApiModelProperty("教师类型 1表示校区负责人,2表示年级负责人,3表示班主任,4表示任课老师,5表示学段负责人") private Integer type; diff --git a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/UserInfoVO.java b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/UserInfoVO.java index 4fb5407..3ff1e5e 100644 --- a/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/UserInfoVO.java +++ b/febs-server/edu-user/edu-user-api/src/main/java/com/yida/data/user/vo/UserInfoVO.java @@ -5,8 +5,13 @@ import com.alibaba.excel.annotation.ExcelProperty; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.io.Serializable; + @Data -public class UserInfoVO { +public class UserInfoVO implements Serializable { + + private static final long serialVersionUID = -2183584074714449444L; + @ApiModelProperty("用户名称") @ExcelProperty("用户名称") private String name; @@ -18,4 +23,7 @@ public class UserInfoVO { @ApiModelProperty("学号/手机号") @ExcelProperty("学号/手机号") private String number; + + @ApiModelProperty("设备名称") + private String deviceName; } diff --git a/febs-server/edu-user/edu-user-api/src/main/resources/META-INF/spring.factories b/febs-server/edu-user/edu-user-api/src/main/resources/META-INF/spring.factories index 8b3d2f5..8c9587f 100644 --- a/febs-server/edu-user/edu-user-api/src/main/resources/META-INF/spring.factories +++ b/febs-server/edu-user/edu-user-api/src/main/resources/META-INF/spring.factories @@ -7,4 +7,7 @@ com.yida.data.user.fallback.RemoteTeacherServiceFallback,\ com.yida.data.user.fallback.RemoteUserDeptServiceFallback,\ com.yida.data.user.fallback.RemoteUserDeviceFactoryServiceFallback,\ com.yida.data.user.fallback.RemoteUserDeviceServiceFallback,\ -com.yida.data.user.fallback.RemoteUserFaceServiceFallback \ No newline at end of file +com.yida.data.user.fallback.RemoteUserFaceServiceFallback,\ +com.yida.data.user.fallback.RemoteStudentApplyServiceFallback,\ +com.yida.data.user.fallback.RemoteFaceGroupDeviceServiceFallback,\ +com.yida.data.user.fallback.RemoteFaceGroupStrategyServiceFallback \ No newline at end of file diff --git a/febs-server/edu-user/edu-user-biz/pom.xml b/febs-server/edu-user/edu-user-biz/pom.xml index 60bbc0f..1573d8b 100644 --- a/febs-server/edu-user/edu-user-biz/pom.xml +++ b/febs-server/edu-user/edu-user-biz/pom.xml @@ -50,7 +50,7 @@ com.yida.data.attendance - edu-attendance-api + attendance-api ${febs-cloud.version} compile diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/config/ExcelConfiguration.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/config/ExcelConfiguration.java new file mode 100644 index 0000000..cb4900b --- /dev/null +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/config/ExcelConfiguration.java @@ -0,0 +1,40 @@ +package com.yida.data.user.config; + +import cc.mrbird.febs.common.redis.service.RedisService; +import com.yida.data.common.core.entity.constant.CachePrefixConstant; +import com.yida.data.common.service.CommonService; +import com.yida.data.school.feign.facility.RemoteDormitoryService; +import com.yida.data.user.service.EduStudentService; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * excel功能配置类 + * + * @author ZYJ + * @date 2023/10/20 + */ +@Configuration +public class ExcelConfiguration { + + @Value("${febs.uploadUrl}") + private String uploadUrl; + + @Bean + ExportStudentClient exportStudentClient( + EduStudentService eduStudentService, + RedisService redisService, CommonService commonService) { + return new ExportStudentClient(eduStudentService, redisService, commonService, + CachePrefixConstant.EXPORT_STUDENT_DATA, uploadUrl); + } + + @Bean + ExportStudentDormClient exportStudentDormClient( + EduStudentService eduStudentService, + RedisService redisService, CommonService commonService, RemoteDormitoryService remoteDormitoryService) { + return new ExportStudentDormClient(eduStudentService, redisService, commonService, + CachePrefixConstant.EXPORT_STUDENT_DORM_DATA, uploadUrl, remoteDormitoryService); + } + +} diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/config/ExportStudentClient.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/config/ExportStudentClient.java new file mode 100644 index 0000000..4ba445c --- /dev/null +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/config/ExportStudentClient.java @@ -0,0 +1,91 @@ +package com.yida.data.user.config; + +import cc.mrbird.febs.common.redis.service.RedisService; +import cn.hutool.core.util.StrUtil; +import com.yida.data.common.core.entity.Dict; +import com.yida.data.common.core.entity.user.EduStudent; +import com.yida.data.common.excel.DefaultExportExcelClient; +import com.yida.data.common.service.CommonService; +import com.yida.data.user.dto.PageStudentDTO; +import com.yida.data.user.dto.StudentExportDTO; +import com.yida.data.user.excel.SelectStudentExportData; +import com.yida.data.user.service.EduStudentService; +import org.springframework.beans.BeanUtils; + +import java.util.List; +import java.util.Objects; + +/** + * 学生信息导出处理类 + * + * @author ZYJ + * @date 2023/12/12 15:00 + */ +public class ExportStudentClient + extends DefaultExportExcelClient { + + public ExportStudentClient(EduStudentService eduStudentService, RedisService redisService, CommonService commonService, + String exportCacheKey, String uploadUrl) { + super(eduStudentService, redisService, commonService, exportCacheKey, uploadUrl); + } + + @Override + public List selectExportData(SelectStudentExportData selectStudentExportData) { + // 查询数据 + PageStudentDTO dto = new PageStudentDTO(); + BeanUtils.copyProperties(selectStudentExportData, dto); + return this.baseService.selectStudent(dto); + } + + @Override + public StudentExportDTO handleSingleData(EduStudent o) { + StudentExportDTO exportDTO = new StudentExportDTO(); + BeanUtils.copyProperties(o, exportDTO); + // 采集状态 + String collectStatus = "未采集"; + if (Objects.nonNull(o.getCollectType()) && o.getCollectType() == 1) { + collectStatus = "已采集"; + } + exportDTO.setCollectStatus(collectStatus); + // 班级信息 + if (StrUtil.isNotBlank(o.getCampusName()) && StrUtil.isNotBlank(o.getSectionName()) + && StrUtil.isNotBlank(o.getGradeName()) && StrUtil.isNotBlank(o.getClassName())) { + exportDTO.setDeptName(o.getCampusName() + "-" + o.getSectionName() + "-" + + o.getGradeName() + "-" + o.getClassName()); + } + // 政治面貌 + Dict politicsStatus = this.commonService.getDictByTypeAndValueOrLabel("politics_status", null, o.getPoliticsStatus()); + if (Objects.nonNull(politicsStatus)) { + exportDTO.setPoliticsStatus(politicsStatus.getValue()); + } else { + exportDTO.setPoliticsStatus(""); + } + // 学生性别 + String sex = o.getStuSex(); + if (StrUtil.isEmpty(sex)) { + exportDTO.setStuSex(""); + } else { + exportDTO.setStuSex("0".equals(sex) ? "男" : "女"); + } + // 民族 + Dict nation = this.commonService.getDictByTypeAndValueOrLabel("nation", null, o.getNation()); + if (Objects.nonNull(nation)) { + exportDTO.setNation(nation.getValue()); + } else { + exportDTO.setNation(""); + } + // 学生类型 + Integer type = o.getType(); + if (Objects.nonNull(type)) { + exportDTO.setType(type == 0 ? "走读" : "住宿"); + } + // 学籍状态 + Dict studentStatus = this.commonService.getDictByTypeAndValueOrLabel("student_status", null, o.getStudentStatus()); + if (Objects.nonNull(studentStatus)) { + exportDTO.setStudentStatus(studentStatus.getValue()); + } else { + exportDTO.setStudentStatus(""); + } + return exportDTO; + } +} diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/config/ExportStudentDormClient.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/config/ExportStudentDormClient.java new file mode 100644 index 0000000..9ffa49f --- /dev/null +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/config/ExportStudentDormClient.java @@ -0,0 +1,99 @@ +package com.yida.data.user.config; + +import cc.mrbird.febs.common.redis.service.RedisService; +import cn.hutool.core.collection.CollUtil; +import com.yida.data.common.core.entity.school.EduDormitoryRoom; +import com.yida.data.common.core.entity.user.EduStudent; +import com.yida.data.common.core.entity.user.EduUserDept; +import com.yida.data.common.excel.DefaultExportExcelClient; +import com.yida.data.common.service.CommonService; +import com.yida.data.school.dto.index.ListDormRoomDTO; +import com.yida.data.school.feign.facility.RemoteDormitoryService; +import com.yida.data.user.dto.StudentDormExportDTO; +import com.yida.data.user.excel.SelectStudentDormExportData; +import com.yida.data.user.service.EduStudentService; +import org.springframework.beans.BeanUtils; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 学生住宿信息导出处理类 + * + * @author ZYJ + * @date 2023/12/13 15:00 + */ +public class ExportStudentDormClient + extends DefaultExportExcelClient { + + private final RemoteDormitoryService remoteDormitoryService; + + private Map> dormRoomGroup = new HashMap<>(); + + public ExportStudentDormClient(EduStudentService eduStudentService, RedisService redisService, CommonService commonService, + String exportCacheKey, String uploadUrl, RemoteDormitoryService remoteDormitoryService) { + super(eduStudentService, redisService, commonService, exportCacheKey, uploadUrl); + this.remoteDormitoryService = remoteDormitoryService; + } + + @Override + public List selectExportData(SelectStudentDormExportData data) { + List dormIds = new ArrayList<>(); + // 查询匹配的宿舍 + if (data.getDormRoomId() == null) { + List dormRooms = remoteDormitoryService.listDormRoomNoAuth(ListDormRoomDTO.builder() + .schoolId(data.getSchoolId()) + .floor(data.getFloor()) + .dormIds(data.getDormId() != null ? Collections.singletonList(data.getDormId()) : null).build()).getData(); + if (CollUtil.isNotEmpty(dormRooms)) { + dormRoomGroup = dormRooms.stream().collect(Collectors.groupingBy(EduDormitoryRoom::getDormId)); + dormIds = dormRooms.stream().map(EduDormitoryRoom::getId).collect(Collectors.toList()); + } + } else { + dormIds = Collections.singletonList(data.getDormRoomId()); + } + // 宿舍为空 不查询数据 + if (CollUtil.isEmpty(dormIds)) { + dormIds = new ArrayList<>(); + dormIds.add(-1L); + } + // 查询学生信息 + return this.baseService.listStudentDorm(dormIds, data); + } + + @Override + public StudentDormExportDTO handleSingleData(EduStudent o) { + // 年级班级信息 + EduUserDept grade = this.commonService.getUserDept(o.getGradeId()); + EduUserDept clazz = this.commonService.getUserDept(o.getClassId()); + StringBuilder gradeClass = new StringBuilder(); + if (grade != null) { + gradeClass.append(grade.getDeptName()); + } + if (clazz != null) { + gradeClass.append(clazz.getDeptName()); + } + o.setClassName(gradeClass.toString()); + // 入住寝室信息 + EduDormitoryRoom dormRoom; + if (CollUtil.isNotEmpty(dormRoomGroup) && dormRoomGroup.containsKey(o.getDormRoomId())) { + dormRoom = dormRoomGroup.get(o.getDormRoomId()).get(0); + } else { + dormRoom = remoteDormitoryService.getDormRoomNoPermission(o.getDormRoomId()).getData(); + if (dormRoom != null) { + dormRoomGroup.put(dormRoom.getId(), Collections.singletonList(dormRoom)); + } + } + // 查询到了寝室信息 + if (Objects.nonNull(dormRoom)) { + String dormRoomName = dormRoom.getDormName() + + dormRoom.getFloor() + "层" + + dormRoom.getName(); + o.setDormRoomName(dormRoomName); + } + StudentDormExportDTO exportDTO = new StudentDormExportDTO(); + BeanUtils.copyProperties(o, exportDTO); + exportDTO.setDeptName(o.getClassName()); + return exportDTO; + } +} diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/EduCourseController.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/EduCourseController.java index 9003ca3..b66ec3a 100644 --- a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/EduCourseController.java +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/EduCourseController.java @@ -2,10 +2,13 @@ package com.yida.data.user.controller; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.yida.data.common.core.annotation.ControllerLog; +import com.yida.data.common.core.common.ModuleName; import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.system.enums.OperationLogTypeEnum; import com.yida.data.common.core.entity.user.EduCourse; import com.yida.data.common.core.utils.Asserts; import com.yida.data.common.core.utils.FebsUtil; +import com.yida.data.log.annotation.OperationLog; import com.yida.data.user.service.EduCourseService; import org.springframework.web.bind.annotation.GetMapping; @@ -32,14 +35,13 @@ public class EduCourseController { @ApiOperation("根据学校查询课程") @GetMapping("/listCourse") - @ControllerLog(operation = "按学校查询课程") public ResultBean> listCourse(@ApiParam("学校id") @RequestParam Long schoolId) { return ResultBean.buildSuccess(eduCourseService.list(Wrappers.lambdaQuery(new EduCourse()).eq(EduCourse::getSchoolId, schoolId))); } @ApiOperation("添加课程") @PostMapping("/saveCourse") - @ControllerLog(operation = "添加课程") + @OperationLog(module = ModuleName.COURSE, methods = "添加课程", type = OperationLogTypeEnum.INSERT) public ResultBean saveCourse(@RequestBody EduCourse course) { Asserts.isNotNull(course.getCourseName(), "请输入科目名称"); Asserts.isTrue(eduCourseService.count(Wrappers.lambdaQuery() @@ -51,7 +53,7 @@ public class EduCourseController { @ApiOperation("删除课程") @PostMapping("/delCourse") - @ControllerLog(operation = "删除课程") + @OperationLog(module = ModuleName.COURSE, methods = "删除课程", type = OperationLogTypeEnum.DELETE) public ResultBean delCourse(@RequestBody List ids) { eduCourseService.removeByIds(ids); return ResultBean.buildSuccess(); diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/EduFaceGroupStrategyController.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/EduFaceGroupStrategyController.java new file mode 100644 index 0000000..f7ff80f --- /dev/null +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/EduFaceGroupStrategyController.java @@ -0,0 +1,41 @@ +package com.yida.data.user.controller; + +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.user.dto.StrategySaveDTO; +import com.yida.data.user.service.EduFaceGroupStrategyService; +import com.yida.data.user.vo.StrategyInfoVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + * 人脸组-策略Controller + * + * @author ZYJ + * @date 2022-12-12 11:04:39 + */ +@Slf4j +@RestController +@RequiredArgsConstructor +@RequestMapping("eduFaceGroupStrategy") +@Api(tags = "人脸组-策略api") +public class EduFaceGroupStrategyController { + + private final EduFaceGroupStrategyService eduFaceGroupStrategyService; + + @GetMapping(value = "getStrategyInfo") + @ApiOperation(value = "获取人脸组策略信息") + public ResultBean getStrategyInfo(@ApiParam(value = "人脸组id", required = true) @RequestParam Long faceGroupId) { + return ResultBean.buildSuccess(eduFaceGroupStrategyService.getStrategyInfo(faceGroupId)); + } + + @PostMapping(value = "saveStrategyInfo") + @ApiOperation(value = "保存人脸组策略信息") + public ResultBean saveStrategyInfo(@RequestBody StrategySaveDTO strategySaveDTO) { + eduFaceGroupStrategyService.saveStrategyInfo(strategySaveDTO); + return ResultBean.buildSuccess(); + } +} diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/EduStaffController.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/EduStaffController.java index 858275d..f5271c9 100644 --- a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/EduStaffController.java +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/EduStaffController.java @@ -5,18 +5,25 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.yida.data.common.core.annotation.ControllerLog; +import com.yida.data.common.core.common.ModuleName; import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.common.ResultMsgType; import com.yida.data.common.core.entity.CurrentUser; import com.yida.data.common.core.entity.constant.CachePrefixConstant; import com.yida.data.common.core.entity.system.Dept; +import com.yida.data.common.core.entity.system.enums.OperationLogTypeEnum; import com.yida.data.common.core.entity.user.*; import com.yida.data.common.core.exception.FebsException; import com.yida.data.common.core.utils.FebsUtil; import com.yida.data.common.core.utils.FileUtil; +import com.yida.data.common.core.utils.RedisUtil; +import com.yida.data.log.annotation.OperationLog; import com.yida.data.system.feign.RemoteDeptService; import com.yida.data.user.dto.ListStaffDTO; +import com.yida.data.user.dto.ManagerDTO; import com.yida.data.user.dto.PageTeacherDTO; import com.yida.data.user.mapper.EduTeacherDeptMapper; import com.yida.data.user.service.EduStaffDeptService; @@ -27,8 +34,13 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; +import io.swagger.annotations.ApiResponse; +import io.swagger.annotations.ApiResponses; +import javax.validation.constraints.NotNull; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.ehcache.impl.internal.concurrent.ConcurrentHashMap; +import org.springframework.http.MediaType; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -58,7 +70,6 @@ public class EduStaffController { @ApiOperation("查询教师列表数据") @GetMapping("/listTeacherPage") - @ControllerLog(operation = "分页查询教师列表") @PreAuthorize("hasAuthority('teacher:view')") public ResultBean> listTeacherPage(PageTeacherDTO dto) { dto.setSchoolId(FebsUtil.getTopDeptId()); @@ -68,17 +79,16 @@ public class EduStaffController { @ApiOperation("保存教师信息 新增或编辑") @PostMapping("/saveTeacher") - @ControllerLog(operation = "新增、修改教师") + @OperationLog(module = ModuleName.STAFF, methods = "新增、修改教师", type = OperationLogTypeEnum.SAVE) @PreAuthorize("hasAuthority('teacher:edit')") public ResultBean saveTeacher(@ApiParam("0-添加,1-编辑") @RequestParam("operation") Integer operation, - @RequestBody EduStaff eduStaff) { + @RequestBody EduStaff eduStaff) { eduStaffService.saveTeacher(operation, eduStaff); return ResultBean.buildSuccess(); } @ApiOperation("根据教师id查询教师详细信息") @GetMapping("/getTeacher") - @ControllerLog(operation = "根据教师id查询教师详细信息") @PreAuthorize("hasAuthority('teacher:view')") public ResultBean getTeacher(@ApiParam("教师Id") @RequestParam("teacherId") Long teacherId) { return ResultBean.buildSuccess(eduStaffService.findTeacher(teacherId)); @@ -92,6 +102,7 @@ public class EduStaffController { @ApiOperation("批量删除教师信息") @PostMapping("/delTeacherBatch") + @OperationLog(module = ModuleName.STAFF, methods = "批量删除教师信息", type = OperationLogTypeEnum.DELETE) public ResultBean delTeacherBatch(@RequestBody List teacherIds) { eduStaffService.delTeacherBatch(teacherIds); return ResultBean.buildSuccess(); @@ -99,7 +110,7 @@ public class EduStaffController { @ApiOperation("批量删除职工信息信息") @PostMapping("/delStaff") - @ControllerLog(operation = "批量删除教师") + @OperationLog(module = ModuleName.STAFF, methods = "批量删除职工信息信息", type = OperationLogTypeEnum.DELETE) @PreAuthorize("hasAuthority('staff:delete')") public ResultBean delTeacher(@RequestBody List staffIds) { eduStaffService.delStaffBatch(staffIds); @@ -108,7 +119,6 @@ public class EduStaffController { @ApiOperation("查询教师可见班级") @GetMapping("/listClassByTeacher") - @ControllerLog(operation = "查询教师可见班级") @PreAuthorize("hasAuthority('teacher:view')") public ResultBean> listClassByTeacher(@ApiParam("教师id") @RequestParam Long teacherId) { return ResultBean.buildSuccess(eduStaffService.listClassByTeacher(teacherId)); @@ -116,7 +126,6 @@ public class EduStaffController { @ApiOperation("查询教师可见班级和年级") @GetMapping("/listClassAndGradeByTeacher") - @ControllerLog(operation = "查询教师可见班级和年级") @PreAuthorize("hasAuthority('teacher:view')") public ResultBean> listClassAndGradeByTeacher(@ApiParam("教师id") @RequestParam Long teacherId) { return ResultBean.buildSuccess(eduStaffService.listClassAndGradeByTeacher(teacherId)); @@ -134,14 +143,14 @@ public class EduStaffController { CurrentUser currentUser = FebsUtil.getCurrentUser(); Long key = System.currentTimeMillis(); Map map = redisService - .hmget(CachePrefixConstant.IMPORT_TEACHER_KEY + currentUser.getUsername()); + .hmget(CachePrefixConstant.IMPORT_TEACHER_KEY + currentUser.getUsername()); if (CollUtil.size(map) >= 5) { throw new FebsException("导入文件已达上限,请稍后重试"); } redisService.hset(CachePrefixConstant.IMPORT_TEACHER_KEY + currentUser.getUsername(), key.toString(), 0); redisService.hset(CachePrefixConstant.IMPORT_TEACHER_FILE + currentUser.getUsername(), key.toString(), - file.getOriginalFilename()); - //eduStaffService.importTeacher(FileUtil.uploadMultipartFile(file), schoolId, currentUser, System.currentTimeMillis(), file.getName()); + file.getOriginalFilename()); +// eduStaffService.importTeacher(FileUtil.uploadMultipartFile(file), schoolId, currentUser, System.currentTimeMillis(), file.getName()); return ResultBean.buildSuccess(); } @@ -152,37 +161,73 @@ public class EduStaffController { } @ApiOperation("下载教师导入表格") - @GetMapping("/downloadTemplate") - @ControllerLog(operation = "下载教师导入表格") - public void downloadTemplate(HttpServletResponse response, @ApiParam("模板类型,0-教师,1-职工") Integer type) { + @PostMapping("/downloadTemplate") + public void downloadTemplate(HttpServletResponse response, + @ApiParam("模板类型,0-教师,1-职工") @RequestParam(required = false) Integer type) { eduStaffService.downloadTemplate(response, type); } @ApiOperation("下载错误报告") @GetMapping("/downloadError") public void downloadError(HttpServletResponse response, - @ApiParam("模板类型,0-教师,1-职工") Integer type, - @ApiParam("通知id") Long noticeId) { + @ApiParam("模板类型,0-教师,1-职工") Integer type, + @ApiParam("通知id") Long noticeId) { eduStaffService.downloadError(response, type, noticeId); } - @ApiOperation("导入职工") - @PostMapping("/importStaff") - public ResultBean importStaff(MultipartFile file, @RequestParam("schoolId") Long schoolId) { - CurrentUser currentUser = FebsUtil.getCurrentUser(); - Long key = System.currentTimeMillis(); - Map map = redisService.hmget(CachePrefixConstant.IMPORT_STAFF_FILE + currentUser.getUsername()); - if (CollUtil.size(map) >= 5) { - throw new FebsException("导入文件已达上限,请稍后重试"); - } - redisService.hset(CachePrefixConstant.IMPORT_STAFF_KEY + currentUser.getUsername(), key.toString(), - 0); - redisService.hset(CachePrefixConstant.IMPORT_STAFF_FILE + currentUser.getUsername(), key.toString(), - file.getOriginalFilename()); - eduStaffService.importStaff(FileUtil.uploadMultipartFile(file), schoolId, currentUser - , key, file.getName()); - return ResultBean.buildSuccess(); - } +// @ApiOperation("导入职工信息") +// @PostMapping("/importStaffInformation") +// public ResultBean importStaffInformation(MultipartFile file, @RequestParam("schoolId") Long schoolId) { +// CurrentUser currentUser = FebsUtil.getCurrentUser(); +// Long key = System.currentTimeMillis(); +// Map map = redisService.hmget(CachePrefixConstant.IMPORT_STAFF_FILE + currentUser.getUsername()); +// if (CollUtil.size(map) >= 5) { +// throw new FebsException("导入文件已达上限,请稍后重试"); +// } +// redisService.hset(CachePrefixConstant.IMPORT_STAFF_KEY + currentUser.getUsername(), key.toString(), +// 0); +// redisService.hset(CachePrefixConstant.IMPORT_STAFF_FILE + currentUser.getUsername(), key.toString(), +// file.getOriginalFilename()); +// eduStaffService.importStaff(FileUtil.uploadMultipartFile(file), schoolId, currentUser +// , key, file.getName()); +// return ResultBean.buildSuccess(); +// } +// +// @ApiOperation("导入职工图片") +// @PostMapping("/importStaffPic") +// public ResultBean importStaffPic(MultipartFile file, @RequestParam("schoolId") Long schoolId) { +// CurrentUser currentUser = FebsUtil.getCurrentUser(); +// Long key = System.currentTimeMillis(); +// Map map = redisService.hmget(CachePrefixConstant.IMPORT_STAFF_FILE + currentUser.getUsername()); +// if (CollUtil.size(map) >= 5) { +// throw new FebsException("导入文件已达上限,请稍后重试"); +// } +// redisService.hset(CachePrefixConstant.IMPORT_STAFF_KEY + currentUser.getUsername(), key.toString(), +// 0); +// redisService.hset(CachePrefixConstant.IMPORT_STAFF_FILE + currentUser.getUsername(), key.toString(), +// file.getOriginalFilename()); +// eduStaffService.importStaff(FileUtil.uploadMultipartFile(file), schoolId, currentUser +// , key, file.getName()); +// return ResultBean.buildSuccess(); +// } + +// @ApiOperation("导入职工") +// @PostMapping("/importStaff") +// public ResultBean importStaff(MultipartFile file, @RequestParam("schoolId") Long schoolId) { +// CurrentUser currentUser = FebsUtil.getCurrentUser(); +// Long key = System.currentTimeMillis(); +// Map map = redisService.hmget(CachePrefixConstant.IMPORT_STAFF_FILE + currentUser.getUsername()); +// if (CollUtil.size(map) >= 5) { +// throw new FebsException("导入文件已达上限,请稍后重试"); +// } +// redisService.hset(CachePrefixConstant.IMPORT_STAFF_KEY + currentUser.getUsername(), key.toString(), +// 0); +// redisService.hset(CachePrefixConstant.IMPORT_STAFF_FILE + currentUser.getUsername(), key.toString(), +// file.getOriginalFilename()); +// eduStaffService.importStaff(FileUtil.uploadMultipartFile(file), schoolId, currentUser +// , key, file.getName()); +// return ResultBean.buildSuccess(); +// } @ApiOperation("职工导入信息进度") @@ -200,32 +245,33 @@ public class EduStaffController { @ApiOperation("分页查询职工列表数据") @GetMapping("/listStaffPage") public ResultBean> listStaffPage( - @ApiParam("区域id") Long areaId, @ApiParam("学校id") Long schoolId, - @ApiParam("部门id") Long deptId, @ApiParam("身份,0-普通成员,1-上级") Integer isLeader, - @ApiParam("职务") String position, @ApiParam("姓名") String name, - @ApiParam("电话") String mobile, @ApiParam("性别,0-男,1-女") Integer sex, - @ApiParam("当前页码") @RequestParam(defaultValue = "1") Integer pageNum, - @ApiParam("页面大小") @RequestParam(defaultValue = "10") Integer pageSize, - @ApiParam("人脸采集状态.0-未采集, 1-已采集") Integer collectType) { + @ApiParam("区域id") Long areaId, @ApiParam("学校id") Long schoolId, + @ApiParam("部门id") Long deptId, @ApiParam("身份,0-普通成员,1-上级") Integer isLeader, + @ApiParam("职务") String position, @ApiParam("姓名") String name, + @ApiParam("电话") String mobile, @ApiParam("性别,0-男,1-女") Integer sex, + @ApiParam("当前页码") @RequestParam(defaultValue = "1") Integer pageNum, + @ApiParam("页面大小") @RequestParam(defaultValue = "10") Integer pageSize, + @ApiParam("人脸采集状态.0-未采集, 1-已采集") Integer collectType) { return ResultBean.buildSuccess(eduStaffService - .listStaffPage(Page.of(pageNum, pageSize), FebsUtil.getCurrentUser(), areaId, schoolId, deptId, isLeader, - position, name, mobile, sex, collectType)); + .listStaffPage(Page.of(pageNum, pageSize), FebsUtil.getCurrentUser(), areaId, schoolId, deptId, isLeader, + position, name, mobile, sex, collectType)); } @ApiOperation("导出职工数据") @PostMapping("/exportStaff") public void exportStaff( - @ApiParam("区域id") Long areaId, @ApiParam("学校id") Long schoolId, - @ApiParam("部门id") Long deptId, @ApiParam("身份,0-普通成员,1-上级") Integer isLeader, - @ApiParam("职务") String position, @ApiParam("姓名") String name, - @ApiParam("电话") String mobile, @ApiParam("性别,0-男,1-女") Integer sex, - @ApiParam("人脸采集状态.0-未采集, 1-已采集") Integer collectType, HttpServletResponse response) { + @ApiParam("区域id") Long areaId, @ApiParam("学校id") Long schoolId, + @ApiParam("部门id") Long deptId, @ApiParam("身份,0-普通成员,1-上级") Integer isLeader, + @ApiParam("职务") String position, @ApiParam("姓名") String name, + @ApiParam("电话") String mobile, @ApiParam("性别,0-男,1-女") Integer sex, + @ApiParam("人脸采集状态.0-未采集, 1-已采集") Integer collectType, HttpServletResponse response) { eduStaffService.exportStaff(areaId, schoolId, deptId, isLeader, position, - name, mobile, sex, collectType, response); + name, mobile, sex, collectType, response); } @ApiOperation("添加、修改职工") @PostMapping("/saveStaff") + @OperationLog(module = ModuleName.STAFF, methods = "添加、修改职工", type = OperationLogTypeEnum.SAVE) public ResultBean saveStaff(@RequestBody EduStaff staff) { //判断手机号是否存在 int number = eduStaffService.checkTeacherTelephone(staff); @@ -238,15 +284,14 @@ public class EduStaffController { @ApiOperation("根据教师id查询教师详情") @GetMapping("/findTeacherRole") - public ResultBean> findTeacherRole(@RequestParam Long teacherId, @RequestParam Integer type) { - + public ResultBean> findTeacherRole(@RequestParam Long teacherId, @RequestParam Integer type) { return ResultBean.buildSuccess(eduStaffService.findTeacherRole(teacherId)); } @ApiOperation("查询家长孩子关联的教师(班主任、任课老师)") @GetMapping("/listTeacherByParent") public ResultBean> listTeacherByParent(@RequestParam("parentId") Long parentId, - @RequestParam(value = "teacherName", required = false) String teacherName) { + @RequestParam(value = "teacherName", required = false) String teacherName) { List studentList = eduStudentService.listStudentByParent(parentId, null); List classIds = studentList.stream().map(x -> x.getClassId()).collect(Collectors.toList()); if (CollUtil.isNotEmpty(classIds)) { @@ -264,7 +309,7 @@ public class EduStaffController { @ApiModelProperty("查询教师列表") @GetMapping("/listTeacherBySchool") ResultBean> listTeacherBySchool(@ApiParam("学校id") @RequestParam("schoolId") Long schoolId, - @ApiParam("教师名称") @RequestParam("name") String name) { + @ApiParam("教师名称") @RequestParam("name") String name) { if (schoolId == null) { schoolId = FebsUtil.getCurrentUser().getDeptId(); } @@ -286,8 +331,8 @@ public class EduStaffController { @ApiOperation("查询教师可见课程") @GetMapping("/findTeacherCourseId") ResultBean> findTeacherCourseId(@RequestParam Long teacherId, - @RequestParam Long schoolId, - @RequestParam(required = false) Long classId) { + @RequestParam Long schoolId, + @RequestParam(required = false) Long classId) { if (ObjectUtils.isEmpty(classId)) { return ResultBean.buildSuccess(eduTeacherDeptMapper.selectCoursetList(null, schoolId, null)); } @@ -309,15 +354,25 @@ public class EduStaffController { @ApiOperation("按年级或者班级查询教师任课信息") @GetMapping("/listTeacherCourseByGrade") ResultBean> listTeacherCourseByGrade( - @ApiParam("年级id") @RequestParam(value = "gradeId", required = false) Long gradeId, - @ApiParam("班级id") @RequestParam(value = "classId", required = false) Long classId) { + @ApiParam("年级id") @RequestParam(value = "gradeId", required = false) Long gradeId, + @ApiParam("班级id") @RequestParam(value = "classId", required = false) Long classId) { return ResultBean.buildSuccess(eduStaffService.listTeacherCourseByGrade(gradeId, classId)); } + + @ApiOperation("根据年级ID查询教师管理的班级") + @GetMapping("/listClassByGradeIdAndTeacherId") + ResultBean> listClassByGradeIdAndTeacherId( + @NotNull(message = "不能为空") @ApiParam("年级id") @RequestParam(value = "gradeId", required = true) Long gradeId, + @NotNull(message = "不能为空") @ApiParam("教师id") @RequestParam(value = "staffId", required = true) Long staffId) { + return ResultBean.buildSuccess(eduStaffService.listClassByGradeIdAndTeacherId(gradeId, staffId)); + } + + @ApiOperation("根据班级或名称查询教师") @GetMapping("/listTeacherByClassAndName") ResultBean> listTeacherByClassAndName(@RequestParam("classId") Long classId, - @RequestParam("name") String name) { + @RequestParam("name") String name) { return ResultBean.buildSuccess(eduStaffService.listTeacherByClassAndName(classId, name)); } @@ -325,8 +380,8 @@ public class EduStaffController { @ApiOperation("根据根据部门id查询对应教职工") @GetMapping("/listStaffByDeptId") public ResultBean> listStaffByDeptId(@RequestParam(required = false) Long deptId, - @RequestParam(required = false) String nameOrPhone, - @RequestParam(required = false) Long schoolId) { + @RequestParam(required = false) String nameOrPhone, + @RequestParam(required = false) Long schoolId) { return ResultBean.buildSuccess(eduStaffService.listStaffByDeptId(deptId, nameOrPhone, schoolId)); } @@ -352,7 +407,7 @@ public class EduStaffController { @GetMapping("/staStaffDistribute") public ResultBean staStaffDistribute() { List schoolIds = remoteDeptService.getSchoolByArea(null, null).getData().stream().map(Dept::getDeptId).collect( - Collectors.toList()); + Collectors.toList()); return ResultBean.buildSuccess(eduStaffService.staStaffDistribute(schoolIds)); } @@ -360,7 +415,7 @@ public class EduStaffController { @GetMapping("/staStaffNum") public ResultBean staStaffNum() { List schoolIds = remoteDeptService.getSchoolByArea(null, null).getData().stream().map(Dept::getDeptId).collect( - Collectors.toList()); + Collectors.toList()); return ResultBean.buildSuccess(eduStaffService.staStaffNum(schoolIds)); } @@ -371,9 +426,68 @@ public class EduStaffController { */ @ApiOperation("查询教师可见部门") @GetMapping("/listDeptByTeacher") - @ControllerLog(operation = "查询教师可见部门") public ResultBean> listDeptByTeacher(@ApiParam("教师id") @RequestParam Long teacherId, - @ApiParam("type") @RequestParam Integer type) { - return ResultBean.buildSuccess(eduStaffService.listDeptByTeacher(teacherId,type)); + @ApiParam("type") @RequestParam Integer type) { + return ResultBean.buildSuccess(eduStaffService.listDeptByTeacher(teacherId, type)); + } + + /** + * @param sysUserId 系统用户Id + * @param type 1表示校区负责人,2表示年级负责人,3表示班主任,4表示任课老师,5表示学段负责人 + * @return + */ + @ApiOperation("查询系统用户可见部门") + @GetMapping("/listDeptBySysUserId") + public ResultBean> listDeptBySysUserId(@ApiParam("教师id") @RequestParam Long sysUserId, + @ApiParam("type") @RequestParam Integer type) { + EduStaff staff = eduStaffService.getOne(Wrappers.lambdaQuery(new EduStaff()) + .eq(EduStaff::getSysUserId, sysUserId) + .eq(EduStaff::getSchoolId, FebsUtil.getTopDeptId())); + return ResultBean.buildSuccess(eduStaffService.listDeptByTeacher(staff.getId(), type)); + } + + /** + * @param teacherId 教师ID + * @param type 1表示校区负责人,2表示年级负责人,3表示班主任,4表示任课老师,5表示学段负责人 + * @return + */ + @ApiOperation("查询教师可见部门") + @GetMapping("/listDeptByStaffId") + public ResultBean> listDeptByStaffId(@ApiParam("教师id") @RequestParam Long teacherId, + @ApiParam("type") @RequestParam Integer type) { + return ResultBean.buildSuccess(eduStaffService.listDeptByTeacher(teacherId, type)); + } + + @ApiOperation("根据职工id集合查询职工信息") + @PostMapping("/getStaffList") + public ResultBean> listDeptByStaffId(@RequestBody List staffIds) { + return ResultBean.buildSuccess(eduStaffService.list(Wrappers.lambdaQuery(new EduStaff()).in(EduStaff::getId, staffIds))); + } + + + @ApiOperation("导入职工数据-新版") + @PostMapping(value = "/importStaffDataExcel") + public ResultBean> importStaffDataExcel( + @ApiParam(value = "导入的excel文件", required = true) @RequestParam("file") MultipartFile file, + @ApiParam(value = "学校id", required = true) @RequestParam("schoolId") Long schoolId) { + // 当前时间时间戳 + long timestamp = System.currentTimeMillis(); + try { + // 导入迎新学生数据 + return eduStaffService.importStaff(file, schoolId, timestamp); + } catch (Exception e) { + log.error("导入迎新学生数据失败: {}", e.getMessage(), e); + return ResultBean.buildError(ResultMsgType.IMPORT_EXCEL_FAIL.getValue()); + } finally { + // 清空当前导入的redis学校数据 + redisService.del(RedisUtil.getDeptKey(String.valueOf(timestamp))); + } + } + + + @ApiOperation("查询dept负责人") + @PostMapping("/getDeptManager") + public ResultBean> getDeptManager(@RequestBody ManagerDTO dto) { + return ResultBean.buildSuccess(eduStaffService.getDeptManager(dto.getDeptIdList(), dto.getRuleId())); } } diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/EduStudentApplyController.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/EduStudentApplyController.java new file mode 100644 index 0000000..dca5c15 --- /dev/null +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/EduStudentApplyController.java @@ -0,0 +1,148 @@ +package com.yida.data.user.controller; + +import cc.mrbird.febs.common.redis.service.RedisService; +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yida.data.common.core.annotation.ControllerLog; +import com.yida.data.common.core.common.ModuleName; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.constant.CachePrefixConstant; +import com.yida.data.common.core.entity.system.enums.OperationLogTypeEnum; +import com.yida.data.common.core.entity.user.EduStudentApply; +import com.yida.data.log.annotation.OperationLog; +import com.yida.data.user.dto.ListStudentApplyDTO; +import com.yida.data.user.service.EduStudentApplyService; +import com.yida.data.user.vo.StudentApplyImportProgressVO; +import com.yida.data.user.vo.StudentApplyStatusVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.time.LocalDateTime; +import java.util.List; +import java.util.UUID; + +@Api(tags = "交易-学生应用关系") +@RequiredArgsConstructor +@RequestMapping("/transaction/studentApply") +@RestController +public class EduStudentApplyController { + + private final EduStudentApplyService eduStudentApplyService; + + private final RedisService redisService; + + @ApiOperation("分页查询学生开通应用") + @GetMapping("/listStudentApply") + public ResultBean> listApply(ListStudentApplyDTO dto) { + Page page = new Page<>(); + page.setCurrent(dto.getPageNum()); + page.setSize(dto.getPageSize()); + return ResultBean.buildSuccess(eduStudentApplyService.listStudentApply(dto, page)); + } + + @ApiOperation("获取开通应用详情") + @GetMapping("/getStudentApply") + public ResultBean getStudentApply(@ApiParam("主键ID") Long id) { + return ResultBean.buildSuccess(eduStudentApplyService.getById(id)); + } + + @ApiOperation("获取开通应用详情") + @GetMapping("/getStudentApplyByIdAndCode") + public ResultBean getStudentApplyByIdAndCode( + @RequestParam("studentId") Long studentId, + @RequestParam("applyCode") String applyCode) { + List list = eduStudentApplyService.list(Wrappers.lambdaQuery(new EduStudentApply()) + .eq(EduStudentApply::getStudentId, studentId) + .eq(EduStudentApply::getApplyCode, applyCode) + .ge(EduStudentApply::getEndTime, LocalDateTime.now()) + .le(EduStudentApply::getStartTime, LocalDateTime.now()) + .orderByDesc(EduStudentApply::getEndTime) + ); + EduStudentApply eduStudentApply = null; + if (CollUtil.isNotEmpty(list)) { + eduStudentApply = list.get(0); + } + return ResultBean.buildSuccess(eduStudentApply); + } + + @ApiOperation("删除开通应用") + @GetMapping("/deleteStudentApply") + @OperationLog(module = ModuleName.TRANSATION, methods = "删除学生开通应用", type = OperationLogTypeEnum.DELETE) + public ResultBean deleteStudentApply(@ApiParam("主键ID") Long id) { + eduStudentApplyService.update(Wrappers.lambdaUpdate(new EduStudentApply()) + .eq(EduStudentApply::getId, id) + .set(EduStudentApply::getDelFlag, 1)); + return ResultBean.buildSuccess(); + } + + @ApiOperation("保存学生开通应用") + @PostMapping("/saveStudentApply") + @OperationLog(module = ModuleName.TRANSATION, methods = "保存学生开通应用", type = OperationLogTypeEnum.INSERT) + public ResultBean insertApply(@ApiParam("开通应用") @RequestBody EduStudentApply eduStudentApply) { + eduStudentApplyService.saveStudentApply(eduStudentApply); + return ResultBean.buildSuccess(); + } + + + @ApiOperation("查询学生是否拥有该应用权限") + @GetMapping("/hasApply") + public ResultBean listApplyCode(@ApiParam("学生id") Long studentId, + @ApiParam("应用编码") String applyCode) { + return ResultBean.buildSuccess(eduStudentApplyService.count(Wrappers.lambdaQuery(new EduStudentApply()) + .eq(EduStudentApply::getStudentId, studentId) + .eq(EduStudentApply::getApplyCode, applyCode) + .ge(EduStudentApply::getEndTime, LocalDateTime.now()) + .le(EduStudentApply::getStartTime, LocalDateTime.now())) > 0); + } + + @ApiOperation("查询学生的应用状态") + @GetMapping("/getApplyStatus") + public ResultBean getApplyStatus(@ApiParam("学生id") Long studentId, + @ApiParam("应用编码") String applyCode) { + return ResultBean.buildSuccess(eduStudentApplyService.getStudentApplyStatus(studentId, applyCode)); + } + + + @ApiOperation("下载学生开通应用导入模板") + @PostMapping("/downloadTemplate") + public void downloadTemplate(HttpServletResponse response) throws Exception { + eduStudentApplyService.downloadTemplate(response); + } + + + @ApiOperation("导入学生开通应用信息") + @PostMapping("/importStudentApplyInfo") + public ResultBean importStudentApplyInfo(@RequestParam(value = "file") MultipartFile file) + throws Exception { + String redisKey = UUID.randomUUID().toString(); + StudentApplyImportProgressVO progressVO = new StudentApplyImportProgressVO(); + progressVO.setRedisKey(redisKey); + progressVO.setFinish(0); + progressVO.setTotalNum(0); + progressVO.setCurrentNum(0); + redisService.hset(CachePrefixConstant.IMPORT_STUDENT_APPLY_PROGRESS, redisKey, progressVO); + eduStudentApplyService.importStudentApplyInfo(file, redisKey); + return ResultBean.buildSuccess(progressVO); + } + + @ApiOperation("获取导入学生开通应用信息进度") + @GetMapping("/getImportStudentApplyInfoProgress") + public ResultBean getImportStudentApplyInfoProgress(@RequestParam("redisKey") String redisKey) { + return ResultBean.buildSuccess(eduStudentApplyService.getImportStudentApplyInfoProgress(redisKey)); + } + + @ApiOperation("删除缓存导入进度") + @GetMapping("/deleteRedisStudentApplyImportProgress") + public ResultBean deleteRedisStudentApplyImportProgress(@RequestParam("redisKey") String redisKey) { + redisService.hdel(CachePrefixConstant.IMPORT_STUDENT_APPLY_PROGRESS, redisKey); + return ResultBean.buildSuccess(); + } + +} diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/EduStudentApplyForController.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/EduStudentApplyForController.java new file mode 100644 index 0000000..42ee8ad --- /dev/null +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/EduStudentApplyForController.java @@ -0,0 +1,84 @@ +package com.yida.data.user.controller; + +import cc.mrbird.febs.common.redis.service.RedisService; +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yida.data.common.core.annotation.ControllerLog; +import com.yida.data.common.core.common.ModuleName; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.constant.CachePrefixConstant; +import com.yida.data.common.core.entity.system.enums.OperationLogTypeEnum; +import com.yida.data.common.core.entity.user.EduStudentApply; +import com.yida.data.common.core.entity.user.EduStudentApplyFor; +import com.yida.data.log.annotation.OperationLog; +import com.yida.data.user.dto.ListStudentApplyDTO; +import com.yida.data.user.dto.ListStudentApplyForDTO; +import com.yida.data.user.service.EduStudentApplyForService; +import com.yida.data.user.service.EduStudentApplyService; +import com.yida.data.user.vo.StudentApplyImportProgressVO; +import com.yida.data.user.vo.StudentApplyStatusVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import java.time.LocalDateTime; +import java.util.List; +import java.util.UUID; +import javax.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +@Api(tags = "交易-学生应用关系") +@RequiredArgsConstructor +@RequestMapping("/transaction/studentApplyFor") +@RestController +public class EduStudentApplyForController { + + private final EduStudentApplyForService eduStudentApplyForService; + + private final RedisService redisService; + + @ApiOperation("分页查询申请学生开通应用") + @GetMapping("/listStudentApplyFor") + public ResultBean> listApply(ListStudentApplyForDTO dto) { + Page page = new Page<>(); + page.setCurrent(dto.getPageNum()); + page.setSize(dto.getPageSize()); + return ResultBean.buildSuccess(eduStudentApplyForService.listStudentApplyFor(dto, page)); + } + + + @ApiOperation("查询申请详情") + @GetMapping("/getStudentApplyFor") + public ResultBean getStudentApplyFor(@RequestParam("studentId") Long studentId, + @RequestParam("applyCode") String applyCode) { + return ResultBean.buildSuccess(eduStudentApplyForService.getByStudentId(studentId, applyCode)); + } + + + @ApiOperation("学生申请开通应用") + @GetMapping("/saveStudentApplyFor") + @OperationLog(module = ModuleName.STUDENT, methods = "学生申请开通应用", type = OperationLogTypeEnum.INSERT) + public ResultBean insertApplyFor(@RequestParam("studentId") Long studentId, @RequestParam("applyCode") String applyCode) { + EduStudentApplyFor eduStudentApplyFor = new EduStudentApplyFor(); + eduStudentApplyFor.setStudentId(studentId); + eduStudentApplyFor.setApplyCode(applyCode); + eduStudentApplyForService.saveStudentApplyFor(eduStudentApplyFor); + return ResultBean.buildSuccess(); + } + + @ApiOperation("处理申请") + @GetMapping("/dealApplyFor") + @OperationLog(module = ModuleName.STUDENT, methods = "处理申请", type = OperationLogTypeEnum.UPDATE) + public ResultBean dealApplyFor(@RequestParam("id") Long id, @RequestParam("status") Integer status) { + eduStudentApplyForService.dealApplyFor(id, status); + return ResultBean.buildSuccess(); + } +} diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/EduStudentController.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/EduStudentController.java index e0006af..5e4802c 100644 --- a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/EduStudentController.java +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/EduStudentController.java @@ -3,19 +3,23 @@ package com.yida.data.user.controller; import cc.mrbird.febs.common.redis.service.RedisService; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.IdUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.yida.data.common.core.annotation.ControllerLog; import com.yida.data.common.core.common.ModuleName; import com.yida.data.common.core.common.ResultBean; import com.yida.data.common.core.entity.CurrentUser; import com.yida.data.common.core.entity.constant.CachePrefixConstant; import com.yida.data.common.core.entity.system.Dept; import com.yida.data.common.core.entity.system.enums.DeptTypeEnum; +import com.yida.data.common.core.entity.system.enums.OperationLogTypeEnum; import com.yida.data.common.core.entity.user.EduStudent; import com.yida.data.common.core.entity.user.EduTeacherDept; +import com.yida.data.common.core.enums.FileDealStatusEnum; import com.yida.data.common.core.exception.FebsException; +import com.yida.data.common.core.file.common.export.ExportExcelData; +import com.yida.data.common.core.file.common.export.ExportLargeData; import com.yida.data.common.core.utils.FebsUtil; import com.yida.data.common.core.utils.FileUtil; import com.yida.data.log.annotation.OperationLog; @@ -26,11 +30,7 @@ import com.yida.data.user.dto.PageStudentDTO; import com.yida.data.user.service.EduParentService; import com.yida.data.user.service.EduStaffService; import com.yida.data.user.service.EduStudentService; -import com.yida.data.user.vo.DownLoadPicVO; -import com.yida.data.user.vo.ListParentByStudentIdsVO; -import com.yida.data.user.vo.ParentInfoVO; -import com.yida.data.user.vo.StaStudentVO; -import com.yida.data.user.vo.StudentClassInfoVO; +import com.yida.data.user.vo.*; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; @@ -65,28 +65,24 @@ public class EduStudentController { private final RedisService redisService; @ApiOperation("家长查询拥有的学生") - @OperationLog(module = ModuleName.USER, methods = "家长查询拥有的学生") @GetMapping("/listStudentByParent") - @ControllerLog(operation = "查询家长拥有的学生") public ResultBean> listStudentByParent(@ApiParam("家长id") @RequestParam Long parentId, - @ApiParam("应用编码") @RequestParam(required = false) String applyCode) { + @ApiParam("应用编码") @RequestParam(required = false) String applyCode) { return ResultBean.buildSuccess(parentId != null ? eduStudentService.listStudentByParent(parentId, applyCode) - : new ArrayList<>()); + : new ArrayList<>()); } @ApiOperation("查询学生列表数据") @GetMapping("/listStudentPage") - @ControllerLog(operation = "分页查询学生列表") @PreAuthorize("hasAuthority('student:view')") public ResultBean> listStudentPage(PageStudentDTO dto) { - dto.setSchoolId(FebsUtil.getTopDeptId()); IPage list = eduStudentService.findStudentPage(dto); return ResultBean.buildSuccess(list); } @ApiOperation("保存学生信息 新增或编辑") @PostMapping("/saveStudent") - @ControllerLog(operation = "新增、修改学生") + @OperationLog(module = ModuleName.STUDENT, methods = "新增、修改学生", type = OperationLogTypeEnum.SAVE) @PreAuthorize("hasAuthority('student:edit')") public ResultBean saveStudent(@RequestBody EduStudent eduStudent) { eduStudentService.saveStudent(eduStudent, FebsUtil.getCurrentUser(), false); @@ -95,7 +91,6 @@ public class EduStudentController { @ApiOperation("根据学生id查询学生详情") @GetMapping("/getStudent") - @ControllerLog(operation = "按id查询学生详情") public ResultBean getStudent(@ApiParam("学生id") @RequestParam("id") Long id) { EduStudent eduStudent = eduStudentService.getStudent(id); return ResultBean.buildSuccess(eduStudent); @@ -103,9 +98,9 @@ public class EduStudentController { @ApiOperation("批量删除学生") @PostMapping("/delStudentBatch") - @ControllerLog(operation = "批量删除学生") + @OperationLog(module = ModuleName.STUDENT, methods = "批量删除学生", type = OperationLogTypeEnum.DELETE) @PreAuthorize("hasAuthority('student:delete')") - public ResultBean delTeacherBatchIds(@RequestBody List ids) { + public ResultBean delStudentBatch(@RequestBody List ids) { //批量删除学生信息 eduStudentService.delStudentBatchIds(ids, false); return ResultBean.buildSuccess(); @@ -113,9 +108,8 @@ public class EduStudentController { @ApiOperation("导入学生(压缩包导入)") @PostMapping("/import") - @ControllerLog(operation = "导入学生") public ResultBean importStudent(@RequestParam("file") MultipartFile file, - @RequestParam("schoolId") Long schoolId) { + @RequestParam("schoolId") Long schoolId) { long key = System.currentTimeMillis(); CurrentUser currentUser = FebsUtil.getCurrentUser(); Map map = redisService.hmget(CachePrefixConstant.IMPORT_STUDENT_KEY + currentUser.getUsername()); @@ -124,9 +118,9 @@ public class EduStudentController { } redisService.hset(CachePrefixConstant.IMPORT_STUDENT_KEY + currentUser.getUsername(), Long.toString(key), 0); redisService.hset(CachePrefixConstant.IMPORT_STUDENT_FILE + currentUser.getUsername(), Long.toString(key), - file.getOriginalFilename()); + file.getOriginalFilename()); eduStudentService.importStudent(FileUtil.uploadMultipartFile(file), currentUser, - schoolId, System.currentTimeMillis(), file.getName()); + schoolId, System.currentTimeMillis(), file.getName()); return ResultBean.buildSuccess(); } @@ -148,17 +142,38 @@ public class EduStudentController { eduStudentService.downloadTemplate(response, FebsUtil.getCurrentUser()); } + @ApiOperation("校园卡号导入") + @PostMapping("/importCard") + public ResultBean importCard(@RequestParam("file") MultipartFile file, + @RequestParam("schoolId") Long schoolId) { + long key = System.currentTimeMillis(); + CurrentUser currentUser = FebsUtil.getCurrentUser(); + Map map = redisService.hmget(CachePrefixConstant.IMPORT_STUDENT_CARD_NUMBER_KEY + + currentUser.getUsername()); + if (CollUtil.size(map) >= 5) { + throw new FebsException("上传文件已达最大值,请稍后重试"); + } + redisService.hset(CachePrefixConstant.IMPORT_STUDENT_CARD_NUMBER_KEY + currentUser.getUsername(), Long.toString(key), 0); + eduStudentService.importCard(FileUtil.uploadMultipartFile(file), currentUser, + schoolId, System.currentTimeMillis(), file.getName()); + return ResultBean.buildSuccess(); + } + + @ApiOperation("下载导入模板(校园卡号)") + @GetMapping("/downloadCardTemplate") + public void downloadCardTemplate(HttpServletResponse response) { + eduStudentService.downloadCardTemplate(response, FebsUtil.getCurrentUser()); + } + @ApiOperation("统计班上学生数量") @GetMapping("/countStudentNum") - @ControllerLog(operation = "统计班级学生数量") public ResultBean countStudentNum(@ApiParam("班级id") Long classId) { return ResultBean.buildSuccess( - eduStudentService.count(Wrappers.lambdaQuery(new EduStudent()).eq(EduStudent::getClassId, classId))); + eduStudentService.count(Wrappers.lambdaQuery(new EduStudent()).eq(EduStudent::getClassId, classId))); } @ApiOperation("根据企业微信通讯录初始化学生") @PostMapping("/initStudent") - @ControllerLog(operation = "根据企业微信通讯录初始化学生") @PreAuthorize("hasAuthority('student:edit')") public ResultBean initStudent(@RequestBody List student) { eduStudentService.initStudent(student); @@ -168,18 +183,18 @@ public class EduStudentController { @ApiOperation("查询学生班级信息") @GetMapping("/getClassInfoByStudent") public ResultBean getClassInfoByStudent(@ApiParam("学生id") Long studentId, - @ApiParam("家长手机号") String parentMobile) { + @ApiParam("家长手机号") String parentMobile) { return ResultBean.buildSuccess(eduStudentService.getClassInfoByStudent(studentId, parentMobile)); } @ApiOperation("根据教师查询家长列表") @GetMapping("/listParentByTeacher") public ResultBean listParentByTeacher(@ApiParam("教师id") Long teacherId, - @ApiParam("家长名称") String parentName) { + @ApiParam("家长名称") String parentName) { List teacherRole = eduStaffService.listTeacherDept(teacherId); if (CollUtil.isNotEmpty(teacherRole)) { List classIds = teacherRole.stream().map(EduTeacherDept::getClassId).filter(Objects::nonNull) - .collect(Collectors.toList()); + .collect(Collectors.toList()); if (CollUtil.isNotEmpty(classIds)) { List parentInfoVOList = eduParentService.listParentByClass(classIds, parentName); return ResultBean.buildSuccess(parentInfoVOList); @@ -219,16 +234,35 @@ public class EduStudentController { @ApiOperation("导出学生数据") @PostMapping("/exportStudent") - public void exportStudent(@RequestBody PageStudentDTO dto, HttpServletResponse response) { - eduStudentService.exportStudent(dto, response); + public ResultBean exportStudent(@RequestBody PageStudentDTO dto) { + + String key = IdUtil.simpleUUID(); + ExportExcelData vo = ExportExcelData.builder() + .key(key) + .exportStatus(FileDealStatusEnum.DEALING.getStatus()) + // 初始化数据 + .total(1) + .finish(0) + .build(); + + redisService.hset(CachePrefixConstant.EXPORT_STUDENT_DATA, key, vo); + // 异步导出学生数据 + eduStudentService.exportStudent(dto, key); + return ResultBean.buildSuccess(vo); + } + + @ApiOperation("查询导出学生详情") + @GetMapping("/getStudentExportInfo") + public ResultBean getExportRosterPicInfo(@RequestParam String key) { + return ResultBean.buildSuccess(eduStudentService.getStudentExportInfo(key)); } @ApiOperation("解除学生与宿舍的绑定") @PostMapping("/unbindDormRoom") public ResultBean unbindDormRoom(@RequestBody List dormIds) { eduStudentService.update(Wrappers.lambdaUpdate() - .in(EduStudent::getDormRoomId, dormIds) - .set(EduStudent::getDormRoomId, null)); + .in(EduStudent::getDormRoomId, dormIds) + .set(EduStudent::getDormRoomId, null)); return ResultBean.buildSuccess(); } @@ -236,7 +270,7 @@ public class EduStudentController { @PostMapping("/staStudentDistribu") public ResultBean staStudentDistribu() { List schoolIds = remoteDeptService.getSchoolByArea(null, null).getData().stream().map(Dept::getDeptId).collect( - Collectors.toList()); + Collectors.toList()); return ResultBean.buildSuccess(eduStudentService.staStudentDistribu(schoolIds)); } @@ -255,5 +289,27 @@ public class EduStudentController { return ResultBean.buildSuccess(dto); } + @ApiOperation("批量导入学生类型") + @PostMapping("/importStudentUpdateType") + public ResultBean importStudentUpdateType(@RequestParam("file") MultipartFile file, + @RequestParam("schoolId") Long schoolId) { + eduStudentService.importStudentUpdateType(file, schoolId); + return ResultBean.buildSuccess(); + } + @ApiOperation("批量导入学生类型:导入进度") + @GetMapping("/importStudentDormPercent") + public ResultBean importStudenrTypePercent() { + CurrentUser currentUser = FebsUtil.getCurrentUser(); + return ResultBean.buildSuccess(redisService.hget(CachePrefixConstant.IMPORT_STUDENT_TYPE, + currentUser.getUserId().toString())); + } + + @ApiOperation("根据班级ID查询学生") + @GetMapping("/listStudentByClassId") + public ResultBean> listStudentByClassId( + @ApiParam(required = true, value = "班级ID") @RequestParam Long classId) { + List studentList = eduStudentService.listStudentByClassId(ListStudentDTO.builder().classId(classId).build()); + return ResultBean.buildSuccess(studentList); + } } diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/EduStudentDormController.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/EduStudentDormController.java index 11df8fd..1357985 100644 --- a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/EduStudentDormController.java +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/EduStudentDormController.java @@ -1,12 +1,15 @@ package com.yida.data.user.controller; import cc.mrbird.febs.common.redis.service.RedisService; +import cn.hutool.core.util.IdUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import com.yida.data.common.core.common.ResultBean; import com.yida.data.common.core.entity.CurrentUser; import com.yida.data.common.core.entity.constant.CachePrefixConstant; import com.yida.data.common.core.entity.user.EduStudent; +import com.yida.data.common.core.enums.FileDealStatusEnum; import com.yida.data.common.core.exception.FebsException; +import com.yida.data.common.core.file.common.export.ExportExcelData; import com.yida.data.common.core.utils.Asserts; import com.yida.data.common.core.utils.ExcelUtil; import com.yida.data.common.core.utils.FebsUtil; @@ -14,6 +17,7 @@ import com.yida.data.common.core.utils.FileUtil; import com.yida.data.common.core.vo.ImportPercentVO; import com.yida.data.user.dto.ExchangeDormDTO; import com.yida.data.user.dto.ImportStudentDormDTO; +import com.yida.data.user.dto.PageStudentDTO; import com.yida.data.user.dto.PageStudentDormDTO; import com.yida.data.user.service.EduStudentDormService; import com.yida.data.user.service.EduStudentService; @@ -26,11 +30,7 @@ import java.util.List; import javax.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @Api(tags = "学生住宿管理") @@ -119,4 +119,29 @@ public class EduStudentDormController { throw new FebsException("下载住宿学生导入模板失败"); } } + + @ApiOperation("导出宿舍数据") + @PostMapping("/exportStudentDorm") + public ResultBean exportStudentDorm(@RequestBody PageStudentDormDTO dto) { + + String key = IdUtil.simpleUUID(); + ExportExcelData vo = ExportExcelData.builder() + .key(key) + .exportStatus(FileDealStatusEnum.DEALING.getStatus()) + // 初始化数据 + .total(1) + .finish(0) + .build(); + + redisService.hset(CachePrefixConstant.EXPORT_STUDENT_DORM_DATA, key, vo); + // 异步导出宿舍数据 + eduStudentDormService.exportStudentDorm(dto, key); + return ResultBean.buildSuccess(vo); + } + + @ApiOperation("查询导出学生宿舍详情") + @GetMapping("/getStudentDormExportInfo") + public ResultBean getStudentDormExportInfo(@RequestParam String key) { + return ResultBean.buildSuccess(eduStudentDormService.getStudentDormExportInfo(key)); + } } diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/EduUserDeptController.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/EduUserDeptController.java index 98907ed..e90cb3e 100644 --- a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/EduUserDeptController.java +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/EduUserDeptController.java @@ -7,6 +7,7 @@ import com.yida.data.common.core.entity.QueryRequest; import com.yida.data.common.core.entity.system.Dept; import com.yida.data.common.core.entity.system.enums.OperationLogTypeEnum; import com.yida.data.common.core.entity.user.EduCollectData; +import com.yida.data.common.core.entity.user.EduStudent; import com.yida.data.common.core.entity.user.EduUserDept; import com.yida.data.common.core.entity.user.EduUserDeptStandardGrade; import com.yida.data.common.core.entity.user.enums.SectionTypeEnum; @@ -14,12 +15,17 @@ import com.yida.data.common.core.enums.IncludeTypeEnum; import com.yida.data.log.annotation.OperationLog; import com.yida.data.system.vo.ClassInfoVO; import com.yida.data.user.dto.*; +import com.yida.data.user.dto.h5.ListUserDeptAttendanceDTO; import com.yida.data.user.service.EduUserDeptService; import com.yida.data.user.vo.AllDeptInfoVO; +import com.yida.data.user.vo.ClassAttendanceDataVO; import com.yida.data.user.vo.CollectDataVO; +import com.yida.data.user.vo.TeacherDeptVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.MediaType; @@ -54,7 +60,6 @@ public class EduUserDeptController { */ @ApiOperation("查询父级家校部门") @GetMapping("/getParent") - @OperationLog(module = ModuleName.USER, methods = "查询父级家校部门") public ResultBean getParent(@ApiParam("家校部门id") @RequestParam Long deptId) { return ResultBean.buildSuccess(this.eduUserDeptService.getById(this.eduUserDeptService.getById(deptId).getParentId())); } @@ -69,7 +74,6 @@ public class EduUserDeptController { */ @ApiOperation("查询所有子节点") @GetMapping("/findListByParent") - @OperationLog(module = ModuleName.USER, methods = "查询所有子节点") public ResultBean> findListByParent(@ApiParam("家校部门id") @RequestParam Long deptId) { return ResultBean.buildSuccess(this.eduUserDeptService.findListByParent(Collections.singletonList(deptId))); } @@ -84,7 +88,6 @@ public class EduUserDeptController { */ @ApiOperation("查询直接子节点") @GetMapping("/findChildByParent") - @OperationLog(module = ModuleName.USER, methods = "查询子节点") public ResultBean> findChildByParent(@ApiParam("家校部门父节点id,不能为空") @RequestParam Long deptId) { return ResultBean.buildSuccess(this.eduUserDeptService.findChildByParent(deptId)); } @@ -92,7 +95,7 @@ public class EduUserDeptController { /** * 向下查询指定家校部门类型的家校部门数据(可查询非直接子家校部门) * - * @param parentId 父节点id + * @param parentId 父节点id schoolId 为 负数 * @param type 子节点类型, 1表示班级,2表示年级,3表示学段,4表示校区, 默认所有直接子节点 * @return com.yida.data.common.core.common.ResultBean> * @author ZYJ @@ -100,20 +103,34 @@ public class EduUserDeptController { */ @ApiOperation("向下查询指定家校部门类型的家校部门数据(可查询非直接子家校部门)") @GetMapping("/findChildByParentAndType") - @OperationLog(module = ModuleName.USER, methods = "向下查询到要查询的家校部门类别的子家校部门") public ResultBean> findChildByParentAndType(@ApiParam("父节点id,不能为空") @RequestParam Long parentId, @ApiParam("子节点类型, 1表示班级,2表示年级,3表示学段,4表示校区, 默认所有直接子节点") Integer type) { return ResultBean .buildSuccess(this.eduUserDeptService.findChildByParentAndType(Collections.singletonList(parentId), type)); } + @ApiOperation("根据用户ID查询可见班级采集数据统计") @GetMapping("/findClassChildByParent") - @OperationLog(module = ModuleName.USER, methods = "根据用户ID查询可见班级采集数据统计") public ResultBean> findVisibleClassByUserId(@ApiParam("用户主键ID") @RequestParam Long staffId) { return ResultBean.buildSuccess(this.eduUserDeptService.findVisibleClassByUserId(staffId)); } + @ApiOperation("根据用户ID查询可见班级考勤统计数据") + @PostMapping("/findClassAttendanceByUserId") + public ResultBean> findClassAttendanceByUserId(@RequestBody ListUserDeptAttendanceDTO dto) { + return ResultBean.buildSuccess(this.eduUserDeptService + .findClassAttendanceByUserId(dto.getStaffId(), dto.getDate())); + } + + @ApiOperation("查询班级详细宿舍考勤数据") + @PostMapping("/findClassAttendanceDetailByDeptId") + public ResultBean> findClassAttendanceDetailByDeptId(@RequestBody ListUserDeptAttendanceDTO dto) { + return ResultBean.buildSuccess(this.eduUserDeptService + .findClassAttendanceDetailByDeptId(dto.getDeptId(), dto.getType(), dto.getDate())); + } + + /** * 根据家校部门id查询所属学校 * @@ -124,7 +141,6 @@ public class EduUserDeptController { */ @ApiOperation("根据家校部门id查询所属学校") @GetMapping("findSchoolByDept") - @OperationLog(module = ModuleName.USER, methods = "根据家校部门id查询所属学校") public ResultBean findSchoolByDept(@ApiParam("父节点id,不能为空") @RequestParam Long deptId) { return ResultBean.buildSuccess(this.eduUserDeptService.findSchoolByDept(deptId)); } @@ -141,7 +157,6 @@ public class EduUserDeptController { */ @ApiOperation("查询家校部门") @GetMapping("/userDeptList") - @OperationLog(module = ModuleName.USER, methods = "查询家校部门") public FebsResponse userDeptList(QueryRequest request, EduUserDept dept, @ApiParam("是否包含班级. 0:包含, 1:不包含.不传默认查询全部") String includeType) { Map deptList = this.eduUserDeptService.findDeptList(request, dept, includeType); @@ -158,7 +173,6 @@ public class EduUserDeptController { */ @ApiOperation("根据id查询家校部门") @GetMapping("/getInfoById") - @OperationLog(module = ModuleName.USER, methods = "根据id查询家校部门") public ResultBean getInfoById(@ApiParam("家校部门id") @RequestParam Long deptId) { return ResultBean.buildSuccess(this.eduUserDeptService.getById(deptId)); } @@ -173,7 +187,6 @@ public class EduUserDeptController { */ @ApiOperation("家校部门树(若当前登陆角色是学校负责人则不用传递参数)") @GetMapping("/getUserDeptTree") - @OperationLog(module = ModuleName.USER, methods = "家校部门树") public ResultBean getUserDeptTree(@ApiParam("根节点Id") Long deptId) { return ResultBean.buildSuccess(this.eduUserDeptService.getUserDeptTree(deptId)); } @@ -193,7 +206,6 @@ public class EduUserDeptController { */ @ApiOperation("根据各层名称查询班级信息") @GetMapping("/findClassInfoByName") - @OperationLog(module = ModuleName.USER, methods = "根据各层名称查询班级信息") public ResultBean> findClassInfoByName( Long schoolId, String campusName, String sectionName, String gradeName, String className) { @@ -211,7 +223,6 @@ public class EduUserDeptController { */ @ApiOperation("查询班级信息") @GetMapping("/getClassInfo") - @OperationLog(module = ModuleName.USER, methods = "查询班级信息") public ResultBean getClassInfo(Long classId) { return ResultBean.buildSuccess(this.eduUserDeptService.getClassInfo(classId)); } @@ -226,7 +237,7 @@ public class EduUserDeptController { */ @ApiOperation(value = "新增学区信息(包含学段、年级和班级)", consumes = MediaType.APPLICATION_JSON_VALUE) @PostMapping(value = "addCampus", consumes = MediaType.APPLICATION_JSON_VALUE) - @OperationLog(module = ModuleName.USER, methods = "新增学区信息(包含学段、年级和班级)", type = OperationLogTypeEnum.INSERT) + @OperationLog(module = ModuleName.USER_DEPT, methods = "新增学区信息(包含学段、年级和班级)", type = OperationLogTypeEnum.INSERT) public ResultBean addCampus(@RequestBody SaveCampusDTO saveCampusDTO) { this.eduUserDeptService.addCampus(saveCampusDTO); return ResultBean.buildSuccess(); @@ -242,7 +253,7 @@ public class EduUserDeptController { */ @ApiOperation(value = "新增学段信息(包含年级和班级)", consumes = MediaType.APPLICATION_JSON_VALUE) @PostMapping(value = "addSection", consumes = MediaType.APPLICATION_JSON_VALUE) - @OperationLog(module = ModuleName.USER, methods = "新增学段信息(包含年级和班级)", type = OperationLogTypeEnum.INSERT) + @OperationLog(module = ModuleName.USER_DEPT, methods = "新增学段信息(包含年级和班级)", type = OperationLogTypeEnum.INSERT) public ResultBean addSection(@RequestBody SectionDTO sectionDTO) { this.eduUserDeptService.addSection(sectionDTO, true, false, null, false); return ResultBean.buildSuccess(); @@ -258,7 +269,7 @@ public class EduUserDeptController { */ @ApiOperation(value = "新增年级信息(包含班级)", consumes = MediaType.APPLICATION_JSON_VALUE) @PostMapping(value = "addGrade", consumes = MediaType.APPLICATION_JSON_VALUE) - @OperationLog(module = ModuleName.USER, methods = "新增年级信息(包含班级)", type = OperationLogTypeEnum.INSERT) + @OperationLog(module = ModuleName.USER_DEPT, methods = "新增年级信息(包含班级)", type = OperationLogTypeEnum.INSERT) public ResultBean addGrade(@RequestBody SaveGradeDTO saveGradeDTO) { this.eduUserDeptService.addGrade(saveGradeDTO); return ResultBean.buildSuccess(); @@ -274,7 +285,7 @@ public class EduUserDeptController { */ @ApiOperation(value = "页面添加家校部门", consumes = MediaType.APPLICATION_JSON_VALUE) @PostMapping(value = "addUserDept", consumes = MediaType.APPLICATION_JSON_VALUE) - @OperationLog(module = ModuleName.USER, methods = "添加家校部门", type = OperationLogTypeEnum.INSERT) + @OperationLog(module = ModuleName.USER_DEPT, methods = "添加家校部门", type = OperationLogTypeEnum.INSERT) public ResultBean addUserDept(@RequestBody AddUserDeptDTO addUserDeptDTO) { this.eduUserDeptService.addUserDept(addUserDeptDTO); return ResultBean.buildSuccess(); @@ -290,7 +301,7 @@ public class EduUserDeptController { */ @ApiOperation(value = "编辑家校部门", consumes = MediaType.APPLICATION_JSON_VALUE) @PostMapping(value = "editUserDept", consumes = MediaType.APPLICATION_JSON_VALUE) - @OperationLog(module = ModuleName.USER, methods = "编辑家校部门", type = OperationLogTypeEnum.UPDATE) + @OperationLog(module = ModuleName.USER_DEPT, methods = "编辑家校部门", type = OperationLogTypeEnum.UPDATE) public ResultBean editUserDept(@RequestBody EditUserDeptDTO editUserDeptDTO) { this.eduUserDeptService.editUserDept(editUserDeptDTO); return ResultBean.buildSuccess(); @@ -306,7 +317,7 @@ public class EduUserDeptController { */ @ApiOperation(value = "批量删除家校部门") @GetMapping("/deleteUserDeptBatch") - @OperationLog(module = ModuleName.USER, methods = "批量删除家校部门", type = OperationLogTypeEnum.DELETE) + @OperationLog(module = ModuleName.USER_DEPT, methods = "批量删除家校部门", type = OperationLogTypeEnum.DELETE) public ResultBean deleteUserDeptBatch( @ApiParam(value = "家校部门id字符串", required = true) @RequestParam String deptIds, @ApiParam(value = "学校id", required = true) @RequestParam Long schoolId) { @@ -324,7 +335,6 @@ public class EduUserDeptController { */ @ApiOperation(value = "根据学段类型查询对应的标准年级") @GetMapping("/listStandardGradeBySectionType") - @OperationLog(module = ModuleName.USER, methods = "根据学段类型查询对应的标准年级") public ResultBean> listStandardGradeBySectionType( @ApiParam(value = "学段类型", required = true) @RequestParam String sectionType) { return ResultBean.buildSuccess(this.eduUserDeptService.listStandardGradeBySectionType(sectionType)); @@ -333,9 +343,16 @@ public class EduUserDeptController { @ApiOperation("向上查询父级部门") @GetMapping("/findParentUp") - @OperationLog(module = ModuleName.USER, methods = "向上查询父级部门") public ResultBean findParentUp(@ApiParam("部门id") Long deptId, @ApiParam("最上级部门类型,1表示班级,2表示年级,3表示学段,4表示校区") Integer type) { return ResultBean.buildSuccess(eduUserDeptService.findParentUp(deptId, type)); } + + + @ApiOperation("查询职工管理班级,包含班级学生人数") + @GetMapping("/listClassByStaffId") + public ResultBean> listClassByStaffId(@RequestParam Long staffId) { + return ResultBean.buildSuccess(eduUserDeptService.listClassByStaffId(staffId)); + } + } diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/EduUserDeviceController.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/EduUserDeviceController.java index 68792fd..becf056 100644 --- a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/EduUserDeviceController.java +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/EduUserDeviceController.java @@ -1,8 +1,11 @@ package com.yida.data.user.controller; import com.yida.data.common.core.annotation.ControllerLog; +import com.yida.data.common.core.common.ModuleName; import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.system.enums.OperationLogTypeEnum; import com.yida.data.common.core.entity.user.EduUserDevice; +import com.yida.data.log.annotation.OperationLog; import com.yida.data.user.service.EduUserDeviceService; import org.springframework.web.bind.annotation.PostMapping; @@ -24,7 +27,7 @@ public class EduUserDeviceController { @ApiOperation("保存、更新用户设备联系信息") @PostMapping("/saveUserDevice") - @ControllerLog(operation = "保存、更新用户和厂商的关联信息") + @OperationLog(module = ModuleName.USER, methods = "保存、更新用户和厂商的关联信息", type = OperationLogTypeEnum.SAVE) public ResultBean saveUserDevice(@RequestBody EduUserDevice userDevice) { eduUserDeviceService.saveUserDevice(userDevice); return ResultBean.buildSuccess(); diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/EduUserFaceController.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/EduUserFaceController.java index 69734be..448ae49 100644 --- a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/EduUserFaceController.java +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/EduUserFaceController.java @@ -1,7 +1,6 @@ package com.yida.data.user.controller; import cc.mrbird.febs.common.redis.service.RedisService; -import cn.hutool.core.util.ArrayUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.yida.data.common.core.common.ResultBean; @@ -33,7 +32,6 @@ import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; -import java.util.Arrays; import java.util.List; /** @@ -57,15 +55,17 @@ public class EduUserFaceController { @ApiOperation("分页查询人脸组列表") @GetMapping("/listFaceGroupPage") - public ResultBean> listFaceGroupPage(@ApiParam("组名") @RequestParam(required = false) String groupName, - @ApiParam("当前页码") @RequestParam(defaultValue = "1") Integer pageNum, - @ApiParam("页面大小") @RequestParam(defaultValue = "10") Integer pageSize) { + public ResultBean> listFaceGroupPage( + @ApiParam("组名") @RequestParam(required = false) String groupName, + @ApiParam("组id") @RequestParam(required = false) Long groupId, + @ApiParam("当前页码") @RequestParam(defaultValue = "1") Integer pageNum, + @ApiParam("页面大小") @RequestParam(defaultValue = "10") Integer pageSize) { Long schoolId = null; CurrentUser currentUser = FebsUtil.getCurrentUser(); if (currentUser.getDeptType() == 0) { schoolId = currentUser.getDeptId(); } - return ResultBean.buildSuccess(eduFaceGroupService.listFaceGroupPage(new Page(pageNum, pageSize), groupName, schoolId)); + return ResultBean.buildSuccess(eduFaceGroupService.listFaceGroupPage(new Page(pageNum, pageSize), groupName, schoolId, groupId)); } @ApiOperation("保存、修改人脸组") @@ -109,9 +109,10 @@ public class EduUserFaceController { Long schoolId, Long groupId, @ApiParam("当前页码") @RequestParam(defaultValue = "1") Integer pageNum, @ApiParam("页面大小") @RequestParam(defaultValue = "10") Integer pageSize, - Long dormId, Long dormRoomId) { + Long dormId, Long dormRoomId, + Long campusId, Long sectionId, Long gradeId, Long classId) { return ResultBean.buildSuccess(eduFaceGroupUserService.listStudentNotImport(new Page(pageNum, - pageSize), depId, type, sex, keyword, schoolId, groupId, dormId, dormRoomId)); + pageSize), depId, type, sex, keyword, schoolId, groupId, dormId, dormRoomId, campusId, sectionId, gradeId, classId)); } @@ -130,14 +131,14 @@ public class EduUserFaceController { @ApiOperation("学生全部导入") @GetMapping("/saveAllStudent") public ResultBean saveAllStudent( - @RequestParam(required = false) Long[] classId, @ApiParam("0-走读,1-寄宿") @RequestParam(required = false) Integer type, @ApiParam("0-男,1-女") @RequestParam(required = false) Integer sex, @RequestParam(required = false) String keyword, Long schoolId, Long groupId, - Long dormId, Long dormRoomId) { - eduFaceGroupUserService.saveAllStudent(ArrayUtil.isNotEmpty(classId) ? Arrays.asList(classId) - : null, type, sex, keyword, schoolId, groupId, dormId, dormRoomId); + Long dormId, Long dormRoomId, + Long campusId, Long sectionId, Long gradeId, Long classId) { + eduFaceGroupUserService.saveAllStudent(type, sex, keyword, schoolId, groupId, dormId, dormRoomId, + campusId, sectionId, gradeId, classId); return ResultBean.buildSuccess(); } diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/InEduUserDeptController.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/InEduUserDeptController.java index 5300aa3..331d309 100644 --- a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/InEduUserDeptController.java +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/InEduUserDeptController.java @@ -1,8 +1,10 @@ package com.yida.data.user.controller; +import com.yida.data.common.core.common.ModuleName; import com.yida.data.common.core.common.ResultBean; import com.yida.data.common.core.entity.user.EduUserDept; import com.yida.data.common.core.entity.user.enums.UserDeptTypeEnum; +import com.yida.data.log.annotation.OperationLog; import com.yida.data.user.dto.DeleteUserDeptDTO; import com.yida.data.user.service.DaHuaSyncService; import com.yida.data.user.service.EduUserDeptService; @@ -13,6 +15,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -44,7 +47,15 @@ public class InEduUserDeptController { @GetMapping("/syncUserDept") public ResultBean syncUserDept() { log.info("同步企业微信家校部门数据"); - this.eduUserDeptService.syncUserDept(); + this.eduUserDeptService.syncUserDept(null); + return ResultBean.buildSuccess(); + } + + @ApiOperation("同步指定学校企业微信家校部门") + @GetMapping("/syncSchoolUserDept") + public ResultBean syncSchoolUserDept(@RequestParam Long schoolId) { + log.info("同步企业微信家校部门数据: schoolId: [{}]", schoolId); + eduUserDeptService.syncUserDept(schoolId); return ResultBean.buildSuccess(); } @@ -128,6 +139,13 @@ public class InEduUserDeptController { return ResultBean.buildSuccess(this.eduUserDeptService.getParentByDeptId(deptId)); } + + @ApiOperation("根据家校部门id查询全部上级家校部门信息") + @GetMapping("/getParentListByDeptId") + public ResultBean> getParentListByDeptId(@RequestParam Long deptId) { + return ResultBean.buildSuccess(this.eduUserDeptService.getParentListByDeptId(deptId)); + } + /** * 批量保存家校部门 * @@ -177,8 +195,7 @@ public class InEduUserDeptController { } /** - * 向下查询指定家校部门类型的家校部门id(可查询非直接子家校部门) - * 未毕业家校部门 + * 向下查询指定家校部门类型的家校部门id(可查询非直接子家校部门) 未毕业家校部门 * * @param parentId 父节点id * @param type 家校部门类型 {@link UserDeptTypeEnum} @@ -189,7 +206,32 @@ public class InEduUserDeptController { @ApiOperation("向下查询指定家校部门类型的家校部门数据(可查询非直接子家校部门)") @GetMapping("/findChildIdByParentAndType") public ResultBean> findChildIdByParentAndType(@ApiParam("父节点id,不能为空") @RequestParam Long parentId, - @ApiParam("子节点类型. 默认所有直接子节点") Integer type) { - return ResultBean.buildSuccess(eduUserDeptService.findChildIdByParentAndType(Collections.singletonList(parentId), type)); + @ApiParam("子节点类型. 默认所有直接子节点") Integer type) { + List resultList = new ArrayList<>(); + return ResultBean.buildSuccess( + eduUserDeptService.findChildIdByParentAndType(Collections.singletonList(parentId), type, resultList)); } + + @ApiOperation("查询所有子节点") + @GetMapping("/findListByParent") + public ResultBean> findListByParent(@RequestParam Long deptId) { + return ResultBean.buildSuccess( + eduUserDeptService.findListByParent(Collections.singletonList(deptId))); + } + + + /** + * 家校部门树 + * + * @param deptIds 根节点Id集合 + * @return + */ + @ApiOperation("家校部门树(根节点多个)") + @PostMapping("/getUserDeptTree") + @OperationLog(module = ModuleName.USER, methods = "家校部门树") + public ResultBean getUserDeptTree(@ApiParam("根节点Id") @RequestBody List deptIds) { + return ResultBean.buildSuccess(this.eduUserDeptService.getUserDeptTree(deptIds)); + } + + } diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/InEduUserDeviceController.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/InEduUserDeviceController.java index f292c0c..faa65a0 100644 --- a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/InEduUserDeviceController.java +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/InEduUserDeviceController.java @@ -1,19 +1,15 @@ package com.yida.data.user.controller; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.yida.data.common.core.common.ResultBean; import com.yida.data.common.core.entity.user.EduUserDevice; import com.yida.data.user.service.EduUserDeviceService; - -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.List; - import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +import java.util.List; @Api(tags = "人脸下发记录(不鉴权)") @RestController @@ -24,8 +20,33 @@ public class InEduUserDeviceController { @ApiOperation("批量保存") @PostMapping("/batchSave") - public ResultBean batchSave(@RequestBody List list) { + public ResultBean batchSave(@RequestBody List list) { eduUserDeviceService.batchSaveUserDevice(list); return ResultBean.buildSuccess(); } + + @ApiOperation("获取设备和人员关联信息") + @GetMapping("/listUserDevice") + public ResultBean> listUserDevice(@RequestParam Long userId, @RequestParam Integer type, + @RequestParam Long deviceId, @RequestParam Long faceGroupId) { + List list = eduUserDeviceService.list(Wrappers.lambdaQuery(new EduUserDevice()) + .eq(EduUserDevice::getUserId, userId) + .eq(EduUserDevice::getUserType, type) + .eq(EduUserDevice::getDeviceId, deviceId) + .eq(EduUserDevice::getFaceGroupId, faceGroupId) + ); + return ResultBean.buildSuccess(list); + } + + @ApiOperation("删除设备和人员关联信息") + @PostMapping("/deleteRelation") + public ResultBean deleteRelation(@RequestBody EduUserDevice userDevice) { + eduUserDeviceService.remove(Wrappers.lambdaQuery(new EduUserDevice()) + .eq(EduUserDevice::getUserId, userDevice.getUserId()) + .eq(EduUserDevice::getUserType, userDevice.getUserType()) + .eq(EduUserDevice::getDeviceId, userDevice.getDeviceId()) + .eq(EduUserDevice::getFaceGroupId, userDevice.getFaceGroupId()) + ); + return ResultBean.buildSuccess(); + } } diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/InEduUserFaceController.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/InEduUserFaceController.java index 514cf9c..8701f5c 100644 --- a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/InEduUserFaceController.java +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/InEduUserFaceController.java @@ -1,41 +1,37 @@ package com.yida.data.user.controller; +import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.yida.data.common.core.common.ResultBean; import com.yida.data.common.core.entity.user.EduUserFace; import com.yida.data.user.dto.UpdateFaceGroupUserStatusDTO; import com.yida.data.user.service.EduFaceGroupUserService; import com.yida.data.user.service.EduUserFaceService; - -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -import cn.hutool.core.collection.CollUtil; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; @ApiOperation("人脸管理(不鉴权)") @RestController @RequestMapping("/in/face") @RequiredArgsConstructor public class InEduUserFaceController { + private final EduUserFaceService eduUserFaceService; private final EduFaceGroupUserService eduFaceGroupUserService; @GetMapping("/getFaceByUser") public ResultBean getFaceByUser(@RequestParam("userId") Long userId, - @RequestParam("type") Integer type) { - return ResultBean.buildSuccess(eduUserFaceService.getOne(Wrappers.lambdaQuery(new EduUserFace()).eq(EduUserFace::getUserId, userId).eq(EduUserFace::getUserType, type))); + @RequestParam("type") Integer type) { + return ResultBean.buildSuccess(eduUserFaceService.getOne( + Wrappers.lambdaQuery(new EduUserFace()).eq(EduUserFace::getUserId, userId).eq(EduUserFace::getUserType, type))); } @GetMapping("/delFaceByUser") public ResultBean delFaceByUser(@RequestParam("userId") Long userId, - @RequestParam("type") Integer type) { - eduUserFaceService.remove(Wrappers.lambdaQuery(new EduUserFace()).eq(EduUserFace::getUserId, userId).eq(EduUserFace::getUserType, type)); + @RequestParam("type") Integer type) { + eduUserFaceService.remove( + Wrappers.lambdaQuery(new EduUserFace()).eq(EduUserFace::getUserId, userId).eq(EduUserFace::getUserType, type)); return ResultBean.buildSuccess(); } diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/InStaffController.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/InStaffController.java index e3a5ed8..b1086a5 100644 --- a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/InStaffController.java +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/InStaffController.java @@ -14,6 +14,7 @@ import com.yida.data.user.dto.ListStaffDTO; import com.yida.data.user.service.EduStaffService; import com.yida.data.user.service.EduTeacherDeptService; import com.yida.data.user.service.QywxSyncService; +import com.yida.data.user.vo.TeacherClassVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; @@ -42,8 +43,8 @@ public class InStaffController { @ApiOperation("处理企业微信更改教师信息") @PostMapping("/dealWxTeacherChange") public ResultBean dealWxTeacherChange(Long schoolId, Long campusId, Long sectionId, Long gradeId, - Long classId, @RequestBody List teacherList) { - eduStaffService.dealWxTeacherChange(schoolId, campusId, sectionId, gradeId, classId, teacherList); + Long classId, @RequestBody List teacherList, Long deptWxId) { + eduStaffService.dealWxTeacherChange(schoolId, campusId, sectionId, gradeId, classId, teacherList, deptWxId); return ResultBean.buildSuccess(); } @@ -103,7 +104,15 @@ public class InStaffController { @GetMapping("/syncQywxStaff") public ResultBean syncQywxStaff() { // eduStaffService.syncQywxStaff(); - qywxSyncService.syncQywxStaff(); + qywxSyncService.syncQywxStaff(null); + return ResultBean.buildSuccess(); + } + + @ApiOperation("同步指定学校企业微信职工数据") + @GetMapping("/syncSchoolQywxStaff") + public ResultBean syncSchoolQywxStaff(@RequestParam Long schoolId) { +// eduStudentService.syncQywxStudent(); + qywxSyncService.syncQywxStaff(schoolId); return ResultBean.buildSuccess(); } @@ -115,8 +124,8 @@ public class InStaffController { } @ApiOperation("查询职工列表") - @GetMapping("/listStaff") - ResultBean> listStaff(ListStaffDTO dto) { + @PostMapping("/listStaff") + ResultBean> listStaff(@RequestBody ListStaffDTO dto) { return ResultBean.buildSuccess(eduStaffService.listStaff(dto)); } @@ -140,18 +149,44 @@ public class InStaffController { @ApiOperation("根据家校部门id和类型查询对应教师信息") @GetMapping("/listTeacherByDeptId") public ResultBean> listTeacherByDeptId(@RequestParam("deptId") Long deptId, - @RequestParam("type") String type) { + @RequestParam("type") String type) { return ResultBean.buildSuccess(eduTeacherDeptService.listTeacherDept(deptId, type)); } @ApiOperation("保存职工openId") @GetMapping("/saveWxPublicOpenId") ResultBean saveWxPublicOpenId(@RequestParam("staffId") Long staffId, - @RequestParam("openId") String openId) { + @RequestParam("openId") String openId) { EduStaff staff = new EduStaff(); staff.setId(staffId); staff.setWxPublicOpenId(openId); eduStaffService.updateById(staff); return ResultBean.buildSuccess(); } + + @ApiOperation("根据员工id获取企业微信密文用户id") + @GetMapping("/getWxIdByStaffId") + public ResultBean getWxIdByStaffId(@RequestParam Long staffId) { + eduStaffService.getWxIdByStaffId(staffId); + return ResultBean.buildSuccess(); + } + + @ApiOperation("根据StaffID查询教师家校沟通部门信息") + @GetMapping("/listDeptByTeacher") + public ResultBean> listDeptByTeacher(@RequestParam Long teacherId, Integer type) { + List teacherClassVOS = eduStaffService.listDeptByTeacher(teacherId, type); + return ResultBean.buildSuccess(teacherClassVOS); + } + + @ApiOperation("查询职工角色") + @GetMapping("/listStaffRolesByStaffId") + public ResultBean> listStaffRolesByStaffId(@RequestParam Long staffId) { + return ResultBean.buildSuccess(eduStaffService.listStaffRolesByStaffId(staffId)); + } + + @ApiOperation("查询职工管理班级") + @GetMapping("/listClassIdByStaffId") + public ResultBean> listClassIdByStaffId() { + return ResultBean.buildSuccess(eduStaffService.listClassIdByStaffId()); + } } diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/in/InEduFaceGroupDeviceController.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/in/InEduFaceGroupDeviceController.java new file mode 100644 index 0000000..14f9cdb --- /dev/null +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/in/InEduFaceGroupDeviceController.java @@ -0,0 +1,36 @@ +package com.yida.data.user.controller.in; + +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.user.EduFaceGroupDevice; +import com.yida.data.common.core.utils.FebsUtil; +import com.yida.data.user.dto.BatchIssueDTO; +import com.yida.data.user.service.EduFaceGroupDeviceService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 人脸设备 Controller(不鉴权) + * + * @author ZYJ + * @date 2023/9/28 + */ +@Slf4j +@RestController +@RequiredArgsConstructor +@RequestMapping("in/groupDevice") +public class InEduFaceGroupDeviceController { + + private final EduFaceGroupDeviceService eduFaceGroupDeviceService; + + /** + * 查询人脸组设备id集合 + */ + @GetMapping("/listFaceGroupOnlineDevice") + public ResultBean> listFaceGroupOnlineDevice(@RequestParam Long faceGroupId) { + return ResultBean.buildSuccess(eduFaceGroupDeviceService.listFaceGroupOnlineDevice(faceGroupId)); + } + +} diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/in/InEduFaceGroupStrategyController.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/in/InEduFaceGroupStrategyController.java new file mode 100644 index 0000000..d3e140b --- /dev/null +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/in/InEduFaceGroupStrategyController.java @@ -0,0 +1,37 @@ +package com.yida.data.user.controller.in; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.user.EduFaceGroupStrategy; +import com.yida.data.user.dto.StrategySaveDTO; +import com.yida.data.user.service.EduFaceGroupStrategyService; +import com.yida.data.user.vo.StrategyInfoVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + * 人脸组-策略Controller(不鉴权) + * + * @author ZYJ + * @date 2022-12-12 11:04:39 + */ +@Slf4j +@RestController +@RequiredArgsConstructor +@RequestMapping("in/eduFaceGroupStrategy") +@Api(tags = "人脸组-策略api(不鉴权)") +public class InEduFaceGroupStrategyController { + + private final EduFaceGroupStrategyService eduFaceGroupStrategyService; + + @GetMapping(value = "getStrategyInfo") + @ApiOperation(value = "获取人脸组策略信息") + public ResultBean getStrategyInfo(@RequestParam Long faceGroupId) { + return ResultBean.buildSuccess(eduFaceGroupStrategyService.getOne(Wrappers.lambdaQuery(new EduFaceGroupStrategy()) + .eq(EduFaceGroupStrategy::getFaceGroupId, faceGroupId))); + } +} diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/in/InEduStaffController.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/in/InEduStaffController.java new file mode 100644 index 0000000..d4607ed --- /dev/null +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/in/InEduStaffController.java @@ -0,0 +1,95 @@ +package com.yida.data.user.controller.in; + +import cc.mrbird.febs.common.redis.service.RedisService; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yida.data.common.core.annotation.ControllerLog; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.CurrentUser; +import com.yida.data.common.core.entity.constant.CachePrefixConstant; +import com.yida.data.common.core.entity.system.Dept; +import com.yida.data.common.core.entity.user.EduStaff; +import com.yida.data.common.core.entity.user.EduStaffDept; +import com.yida.data.common.core.entity.user.EduStudent; +import com.yida.data.common.core.entity.user.EduTeacherDept; +import com.yida.data.common.core.entity.user.EduUserDept; +import com.yida.data.common.core.exception.FebsException; +import com.yida.data.common.core.utils.FebsUtil; +import com.yida.data.common.core.utils.FileUtil; +import com.yida.data.system.feign.RemoteDeptService; +import com.yida.data.user.dto.ListStaffDTO; +import com.yida.data.user.dto.PageTeacherDTO; +import com.yida.data.user.mapper.EduTeacherDeptMapper; +import com.yida.data.user.service.EduStaffDeptService; +import com.yida.data.user.service.EduStaffService; +import com.yida.data.user.service.EduStudentService; +import com.yida.data.user.vo.StaStaffDistributeVO; +import com.yida.data.user.vo.StaffPageVO; +import com.yida.data.user.vo.StaffWithDeptVO; +import com.yida.data.user.vo.TeacherClassAndGradeVO; +import com.yida.data.user.vo.TeacherClassVO; +import com.yida.data.user.vo.TeacherCourseInfoVO; +import com.yida.data.user.vo.TeacherDetailVO; +import com.yida.data.user.vo.TeacherListVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiModelProperty; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import javax.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +@Api(tags = "教师管理 仅学校管理员有权限") +@Slf4j +@Validated +@RestController +@RequestMapping("in/staff") +@RequiredArgsConstructor +public class InEduStaffController { + + + private final EduStaffService eduStaffService; + private final RedisService redisService; + private final EduStudentService eduStudentService; + private final EduTeacherDeptMapper eduTeacherDeptMapper; + private final EduStaffDeptService eduStaffDeptService; + + private final RemoteDeptService remoteDeptService; + + @ApiOperation("根据根据部门id查询对应教职工") + @GetMapping("/listStaffByDeptId") + public ResultBean> listStaffByDeptId(@RequestParam(required = false) Long deptId, + @RequestParam(required = false) String nameOrPhone, + @RequestParam(required = false) Long schoolId) { + + return ResultBean.buildSuccess(eduStaffService.listStaffByDeptId(deptId, nameOrPhone, schoolId)); + } + + @ApiOperation("查询职工部门信息") + @PostMapping("/getStaffDeptByStaffIds") + public ResultBean> getStaffDeptByStaffIds(@ApiParam("职工id") @RequestBody List staffIds) { + return ResultBean.buildSuccess(eduStaffDeptService.getStaffDeptByStaffIds(staffIds)); + } + + @ApiOperation("更新教职工信息缓存") + @GetMapping("/updateStaffCache") + public ResultBean updateStaffCache() { + eduStaffService.updateStaffCache(); + return ResultBean.buildSuccess(); + } +} diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/in/InEduStudentApplyController.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/in/InEduStudentApplyController.java new file mode 100644 index 0000000..cec6d66 --- /dev/null +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/in/InEduStudentApplyController.java @@ -0,0 +1,53 @@ +package com.yida.data.user.controller.in; + +import cc.mrbird.febs.common.redis.service.RedisService; +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.constant.CachePrefixConstant; +import com.yida.data.common.core.entity.user.EduStudentApply; +import com.yida.data.user.service.EduStudentApplyService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import java.time.LocalDateTime; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@Api(tags = "交易-学生应用关系(不鉴权)") +@RequiredArgsConstructor +@RequestMapping("/in/transaction/studentApply") +@RestController +public class InEduStudentApplyController { + + private final EduStudentApplyService eduStudentApplyService; + private final RedisService redisService; + + @ApiOperation("查询学生的应用编码列表") + @GetMapping("/listApply") + public ResultBean>> listApplyCode(@RequestParam("studentIds") Long[] studentIds) { + List applyCodeList = eduStudentApplyService.list(Wrappers.lambdaQuery(new EduStudentApply()) + .in(EduStudentApply::getStudentId, studentIds) + .ge(EduStudentApply::getEndTime, LocalDateTime.now()) + .le(EduStudentApply::getStartTime, LocalDateTime.now())); + Map> res = new HashMap<>(); + if (CollUtil.isNotEmpty(applyCodeList)) { + Map> collect = applyCodeList.stream() + .collect(Collectors.groupingBy(EduStudentApply::getStudentId)); + for (Map.Entry> entry : collect.entrySet()) { + List applyCode = entry.getValue().stream().map(x -> x.getApplyCode()).distinct() + .collect(Collectors.toList()); + res.put(entry.getKey(), applyCode); + redisService.hset(CachePrefixConstant.STUDENT_APPLY, entry.getKey().toString(), applyCode); + } + } + return ResultBean.buildSuccess(res); + } + +} diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/in/InStudentController.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/in/InStudentController.java index b88ca79..4f3aeb2 100644 --- a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/in/InStudentController.java +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/in/InStudentController.java @@ -3,18 +3,25 @@ package com.yida.data.user.controller.in; import cc.mrbird.febs.common.redis.service.RedisService; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.yida.data.common.core.common.ResultBean; import com.yida.data.common.core.entity.constant.CachePrefixConstant; import com.yida.data.common.core.entity.user.EduParent; import com.yida.data.common.core.entity.user.EduStudent; +import com.yida.data.common.core.entity.user.EduTeacherDept; import com.yida.data.common.core.entity.user.EduUserDept; +import com.yida.data.common.core.entity.user.enums.DeptVisibleTypeEnum; +import com.yida.data.common.core.entity.user.enums.UserDeptTypeEnum; +import com.yida.data.common.core.utils.Asserts; import com.yida.data.school.dto.transaction.ListBuyStudentDTO; import com.yida.data.user.dto.ListStudentDTO; import com.yida.data.user.mapper.EduParentMapper; import com.yida.data.user.service.*; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; @@ -36,6 +43,8 @@ public class InStudentController { private final QywxSyncService qywxSyncService; private final DaHuaSyncService daHuaSyncService; private final RedisService redisService; + private final EduTeacherDeptService eduTeacherDeptService; + private final EduStudentDormService eduStudentDormService; @ApiOperation("处理企业微信 改变学生事件") @PostMapping("/dealWxStudentChange") @@ -217,11 +226,7 @@ public class InStudentController { student.setStatus(status); student.setDormStatus(dormStatus); eduStudentService.updateById(student); - //更新缓存信息 - if (redisService.hHasKey(CachePrefixConstant.STUDENT_DATA, studentId.toString())) { - redisService.hdel(CachePrefixConstant.STUDENT_DATA, studentId.toString()); - } - redisService.hset(CachePrefixConstant.STUDENT_DATA, studentId.toString(), student); + redisService.hdel(CachePrefixConstant.STUDENT_DATA, studentId.toString()); return ResultBean.buildSuccess(); } @@ -268,4 +273,40 @@ public class InStudentController { public ResultBean> listDormIdsByDeptId(@RequestBody ListStudentDTO dto) { return ResultBean.buildSuccess(eduStudentService.listDormIdsByDeptId(dto)); } + + @ApiOperation("查询校园大数据的人员统计数据") + @GetMapping("/countUserDashboardNum") + public ResultBean countUserDashboardNum(@RequestParam Long schoolId) { + JSONObject jsonObject = JSONUtil.createObj(); + // 学生数量 + long studentNum = eduStudentService.count(Wrappers.lambdaQuery(new EduStudent()) + .eq(EduStudent::getSchoolId, schoolId)); + jsonObject.set("studentNum", studentNum); + // 班级数量 + long classNum = eduUserDeptService.count(Wrappers.lambdaQuery(new EduUserDept()) + .eq(EduUserDept::getSchoolId, schoolId) + .eq(EduUserDept::getDeptType, UserDeptTypeEnum.CLASS_TYPE.getValue()) + .eq(EduUserDept::getVisible, DeptVisibleTypeEnum.VISIBLE_TYPE.getValue()) + ); + jsonObject.set("classNum", classNum); + // 教师数量 + jsonObject.set("teacherNum", eduTeacherDeptService.countTeacherNumber(schoolId)); + return ResultBean.buildSuccess(jsonObject); + } + + + @ApiOperation("新增住宿生") + @PostMapping("/saveStudentDorm") + public ResultBean saveStudentDorm(@RequestBody EduStudent eduStudent) { + Asserts.isNotNull(eduStudent, "学生不存在"); + eduStudentDormService.saveStudentDorm(eduStudent.getId(), eduStudent.getDormRoomId(), eduStudent.getDormId()); + return ResultBean.buildSuccess(); + } + + @ApiOperation("更新学生信息缓存") + @GetMapping("/updateStudentCache") + public ResultBean updateStudentCache() { + eduStudentService.updateStudentCache(); + return ResultBean.buildSuccess(); + } } diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/out/OutEduStudentController.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/out/OutEduStudentController.java index 79f13b4..b9ea9db 100644 --- a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/out/OutEduStudentController.java +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/out/OutEduStudentController.java @@ -1,24 +1,37 @@ package com.yida.data.user.controller.out; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.yida.data.common.core.annotation.ControllerLog; +import com.yida.data.common.core.common.ModuleName; import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.system.enums.OperationLogTypeEnum; +import com.yida.data.common.core.entity.user.EduStudent; +import com.yida.data.common.core.utils.FebsUtil; +import com.yida.data.log.annotation.OperationLog; +import com.yida.data.user.dto.OutPageStudentDTO; import com.yida.data.user.service.EduStudentService; +import com.yida.data.user.vo.OutPageStudentVO; import com.yida.data.user.vo.StaStudentVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import java.util.Arrays; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import javax.servlet.http.HttpServletRequest; +import java.util.Arrays; + @Api(tags = "家长管理") @Slf4j @RequiredArgsConstructor @RestController @RequestMapping(value = "/out/student") public class OutEduStudentController { + private final EduStudentService eduStudentService; @ApiOperation("统计学生分布数据") @@ -26,4 +39,17 @@ public class OutEduStudentController { public ResultBean staStudentDistribu(Long[] schoolIds) { return ResultBean.buildSuccess(eduStudentService.staStudentDistribu(Arrays.asList(schoolIds))); } + + @ApiOperation("分页查询学生列表数据") + @GetMapping("/listStudentPage") + public ResultBean> listStudentOutPage(OutPageStudentDTO dto, HttpServletRequest request) { + return ResultBean.buildSuccess(eduStudentService.listStudentOutPage(dto, request)); + } + + @ApiOperation("保存学生信息 新增或编辑") + @PostMapping("/saveStudent") + @OperationLog(module = ModuleName.STUDENT, methods = "新增、修改学生", type = OperationLogTypeEnum.SAVE) + public ResultBean saveStudent(@RequestBody EduStudent eduStudent) { + return ResultBean.buildSuccess(eduStudentService.saveStudent(eduStudent, null, false)); + } } diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/out/OutEduUserDeptController.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/out/OutEduUserDeptController.java new file mode 100644 index 0000000..2b0ade7 --- /dev/null +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/out/OutEduUserDeptController.java @@ -0,0 +1,46 @@ +package com.yida.data.user.controller.out; + +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; +import com.yida.data.common.core.common.ModuleName; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.user.EduUserDept; +import com.yida.data.log.annotation.OperationLog; +import com.yida.data.user.service.EduParentService; +import com.yida.data.user.service.EduUserDeptService; +import com.yida.data.user.vo.StaParentDistributeVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +/** + * 家校部门外部Controller (不鉴权) + * + * @author ZYJ + * @date 2023/4/25 + */ +@Api(tags = "家校部门API") +@Slf4j +@RestController +@RequiredArgsConstructor +@RequestMapping(value = "/out/userDept") +public class OutEduUserDeptController { + + private final EduUserDeptService eduUserDeptService; + + @ApiOperation("查询学校年级分布") + @GetMapping("/getGradeDistribution") + public ResultBean getGradeDistribution(@ApiParam("学校id") @RequestParam Long schoolId) { + return ResultBean.buildSuccess(eduUserDeptService.getGradeDistribution(schoolId)); + } +} diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/web/WebEduSchoolWelcomeStudentController.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/web/WebEduSchoolWelcomeStudentController.java index ab61c17..9dbbb6a 100644 --- a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/web/WebEduSchoolWelcomeStudentController.java +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/controller/web/WebEduSchoolWelcomeStudentController.java @@ -184,8 +184,7 @@ public class WebEduSchoolWelcomeStudentController { } /** - * 导入一键邀请数据 - * 学生基础信息 + * 导入学生基础信息 * * @param file 导入的excel文件 * @param schoolId 学校id @@ -193,7 +192,7 @@ public class WebEduSchoolWelcomeStudentController { * @author ZYJ * @date 2021/8/24 17:12 */ - @ApiOperation("导入一键邀请数据(学生基础信息)") + @ApiOperation("导入学生基础信息") @PostMapping(value = "/importWelcomeInviteData", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public ResultBean importWelcomeInviteData( @ApiParam(value = "导入的excel文件", required = true) @RequestParam("file") MultipartFile file, diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/excel/CardDataDataExcelListener.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/excel/CardDataDataExcelListener.java new file mode 100644 index 0000000..1c96921 --- /dev/null +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/excel/CardDataDataExcelListener.java @@ -0,0 +1,105 @@ +package com.yida.data.user.excel; + +import cn.hutool.core.collection.CollUtil; +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; +import com.alibaba.fastjson.JSON; +import com.yida.data.common.core.entity.CurrentUser; +import com.yida.data.user.dto.CardErrorExportDTO; +import com.yida.data.user.dto.CardImportDTO; +import com.yida.data.user.service.ImportWelcomeStudentService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.ehcache.impl.internal.concurrent.ConcurrentHashMap; + +import java.util.List; + +/** + * 校园卡号导入监听类 + * + * @author ZYJ + * @date 2021/8/24 + */ +@Slf4j +@RequiredArgsConstructor +public class CardDataDataExcelListener extends AnalysisEventListener { + + private final ImportWelcomeStudentService importWelcomeStudentService; + + /** + * 错误信息集合 + */ + private final List errorList; + + /** + * 学校id + */ + private final Long schoolId; + + /** + * 当前登录用户信息 + */ + private final CurrentUser currentUser; + + /** + * 每次存储条数 + * 每隔5条存储数据库, 实际使用中可以3000条, 然后清理list, 方便内存回收 + */ + private static final int BATCH_COUNT = 3000; + + /** + * 需要保存的数据集合 + */ + ConcurrentHashMap concurrentHashMap = new ConcurrentHashMap<>(); + + /** + * 解析成功一条数据调用一次 + * + * @param dto 导入类 + * @param analysisContext analysisContext类型 + * @author ZYJ + * @date 2021/8/23 16:12 + */ + @Override + public void invoke(CardImportDTO dto, AnalysisContext analysisContext) { + // 获取读取的第几条数据 + Integer i = analysisContext.readRowHolder().getRowIndex(); + log.info("解析到第: {}条数据: {}", i, JSON.toJSONString(dto)); + concurrentHashMap.put(i, dto); + // 达到BATCH_COUNT了, 需要去存储一次数据库, 防止数据几万条数据在内存, 容易OOM + if (concurrentHashMap.size() >= BATCH_COUNT) { + saveData(); + // 存储完成清理集合 + concurrentHashMap.clear(); + } + } + + /** + * 所有数据解析完成调用 + * + * @param analysisContext analysisContext类 + * @author ZYJ + * @date 2021/8/23 16:18 + */ + @Override + public void doAfterAllAnalysed(AnalysisContext analysisContext) { + // 这里也要保存数据, 确保最后遗留的数据也存储到数据库 + saveData(); + log.info("所有数据解析完成!"); + if (CollUtil.isNotEmpty(errorList)) { + log.error("错误数据有: {}条", errorList.size()); + } + } + + /** + * 保存导入数据 + * + * @author ZYJ + * @date 2021/8/23 16:20 + */ + private void saveData() { + log.info("{}条数据,开始存储数据库!", concurrentHashMap.size()); + importWelcomeStudentService.saveCardExcelData(concurrentHashMap, errorList, schoolId, currentUser); + log.info("存储数据库成功!"); + } +} diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/excel/SelectStudentDormExportData.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/excel/SelectStudentDormExportData.java new file mode 100644 index 0000000..8ca65ae --- /dev/null +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/excel/SelectStudentDormExportData.java @@ -0,0 +1,46 @@ +package com.yida.data.user.excel; + +import com.yida.data.common.core.file.common.export.SelectExportData; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +import java.io.Serializable; +import java.util.List; + +/** + * 导出学生宿舍查询类 + * + * @author ZYJ + * @date 2023/12/13 16:41 + */ +@Data +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class SelectStudentDormExportData extends SelectExportData implements Serializable { + + private static final long serialVersionUID = 1138422440767435262L; + + @ApiModelProperty("学校id") + private Long schoolId; + + @ApiModelProperty("宿舍楼") + private Long dormId; + + @ApiModelProperty("楼层") + private Integer floor; + + @ApiModelProperty("寝室id") + private Long dormRoomId; + + @ApiModelProperty("班级id") + private Long classId; + + @ApiModelProperty("关键词") + private String keyword; +} diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/excel/SelectStudentExportData.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/excel/SelectStudentExportData.java new file mode 100644 index 0000000..4fae92c --- /dev/null +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/excel/SelectStudentExportData.java @@ -0,0 +1,67 @@ +package com.yida.data.user.excel; + +import com.yida.data.common.core.file.common.export.SelectExportData; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +import java.io.Serializable; +import java.util.List; + +/** + * 导出学生查询类 + * + * @author ZYJ + * @date 2023/12/12 15:41 + */ +@Data +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class SelectStudentExportData extends SelectExportData implements Serializable { + + private static final long serialVersionUID = -7368186456144813899L; + + @ApiModelProperty("区域id") + private Long areaId; + + @ApiModelProperty("学校id") + private Long schoolId; + + @ApiModelProperty("学生类型id") + private Integer type; + + @ApiModelProperty("校区id") + private Long campusId; + + @ApiModelProperty("校区id") + private List campusIdList; + + @ApiModelProperty("学段id") + private Long sectionId; + private List sectionIdList; + + @ApiModelProperty("年级id") + private Long gradeId; + private List gradeIdList; + + @ApiModelProperty("班级id") + private Long classId; + private List classIdList; + + @ApiModelProperty("学号id") + private String stuNumber; + + @ApiModelProperty("名字") + private String name; + + @ApiModelProperty("家庭类型 字典值") + private String familyType; + + @ApiModelProperty("是否采集人脸:0否,1是") + private String collectType; +} diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/excel/StaffDataExcelListener.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/excel/StaffDataExcelListener.java new file mode 100644 index 0000000..57f780a --- /dev/null +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/excel/StaffDataExcelListener.java @@ -0,0 +1,90 @@ +package com.yida.data.user.excel; + +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; +import com.alibaba.fastjson.JSON; +import com.yida.data.user.dto.StaffImportDTO; +import com.yida.data.user.dto.WelcomeStudentImportDTO; +import com.yida.data.user.service.EduStaffService; +import com.yida.data.user.service.ImportWelcomeStudentService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.ehcache.impl.internal.concurrent.ConcurrentHashMap; + +/** + * Excel 职工信息监听类 + */ +@Slf4j +@RequiredArgsConstructor +public class StaffDataExcelListener extends AnalysisEventListener { + + private final EduStaffService eduStaffService; + + /** + * 错误信息集合 + */ + private final ConcurrentHashMap errorMap; + + /** + * 学校id + */ + private final Long schoolId; + + /** + * 时间戳 + */ + private final long timestamp; + + /** + * 每次存储条数 每隔5条存储数据库, 实际使用中可以3000条, 然后清理list, 方便内存回收 + */ + private static final int BATCH_COUNT = 3000; + + /** + * 需要保存的数据集合 + */ + ConcurrentHashMap concurrentHashMap = new ConcurrentHashMap<>(); + + /** + * 解析成功一条数据调用一次 + */ + @Override + public void invoke(StaffImportDTO staffImportDTO, AnalysisContext analysisContext) { + // 获取读取的第几条数据 + Integer i = analysisContext.readRowHolder().getRowIndex(); + log.info("解析到第: {}条数据: {}", i, JSON.toJSONString(staffImportDTO)); + concurrentHashMap.put(i, staffImportDTO); + // 达到BATCH_COUNT了, 需要去存储一次数据库, 防止数据几万条数据在内存, 容易OOM + if (concurrentHashMap.size() >= BATCH_COUNT) { + saveData(); + // 存储完成清理集合 + concurrentHashMap.clear(); + } + } + + /** + * 所有数据解析完成调用 + * + * @param analysisContext analysisContext类 + * @author ZYJ + * @date 2021/8/23 16:18 + */ + @Override + public void doAfterAllAnalysed(AnalysisContext analysisContext) { + // 这里也要保存数据, 确保最后遗留的数据也存储到数据库 + saveData(); + log.info("所有数据解析完成!"); + if (errorMap.size() > 0) { + log.error("错误数据有: {}条", errorMap.size()); + } + } + + /** + * 保存导入数据 + */ + private void saveData() { + log.info("{}条数据,开始存储数据库!", concurrentHashMap.size()); + eduStaffService.saveExcelData(concurrentHashMap, errorMap, schoolId, timestamp); + log.info("存储数据库成功!"); + } +} diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/listener/ImportStudentTypeListener.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/listener/ImportStudentTypeListener.java new file mode 100644 index 0000000..8a245ec --- /dev/null +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/listener/ImportStudentTypeListener.java @@ -0,0 +1,108 @@ +package com.yida.data.user.listener; + +import cc.mrbird.febs.common.redis.service.RedisService; +import cn.hutool.core.collection.CollUtil; +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.yida.data.common.core.entity.attendance.EduAttendanceRule; +import com.yida.data.common.core.entity.constant.CachePrefixConstant; +import com.yida.data.common.core.entity.school.EduDormitory; +import com.yida.data.common.core.entity.school.EduDormitoryRoom; +import com.yida.data.common.core.entity.user.EduStudent; +import com.yida.data.common.core.vo.ImportPercentVO; +import com.yida.data.school.dto.index.EditPersonNumDTO; +import com.yida.data.school.feign.facility.RemoteDormitoryService; +import com.yida.data.user.dto.ImportStudentTypeDTO; +import com.yida.data.user.dto.ImportStudentTypeDTO; +import com.yida.data.user.mapper.EduStudentMapper; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@RequiredArgsConstructor +public class ImportStudentTypeListener extends AnalysisEventListener { + + private final RedisService redisService; + private final EduStudentMapper eduStudentMapper; + + private final ImportPercentVO res; + private final Long schoolId; + private final String key; + + private final static Integer BATCH_COUNT = 100; + + // 最后一行用作保存数据的进度 + private Integer rowNum = -1; + private List list = new ArrayList<>(BATCH_COUNT); + + /** + * 这个每一条数据解析都会来调用 + * + * @param data one row value. Is is same as {@link AnalysisContext#readRowHolder()} + * @param context + */ + @Override + public void invoke(ImportStudentTypeDTO data, AnalysisContext context) { + // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM + list.add(data); + //if (list.size() >= BATCH_COUNT) { + // saveData(); + // // 存储完成清理 list + // list = new ArrayList<>(BATCH_COUNT); + //} + } + + /** + * 所有数据解析完成了 都会来调用 + * + * @param context + */ + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + // 这里也要保存数据,确保最后遗留的数据也存储到数据库 + saveData(); + res.setFinish(1); + redisService.hset(CachePrefixConstant.IMPORT_STUDENT_TYPE, key, res); + } + + /** + * 加上存储数据库 + */ + private void saveData() { + log.info("{}条数据,开始存储数据库!", list.size()); + res.setTotal((long) list.size()); + if (list.size() > 0) { + // 错误数据 + List errorData = new ArrayList<>(); + for (ImportStudentTypeDTO dto : list) { + // 学生是否存在 + EduStudent student = eduStudentMapper.selectOne(Wrappers.lambdaQuery() + .eq(EduStudent::getStuNumber, dto.getStudentNum()) + .eq(EduStudent::getSchoolId, schoolId)); + + if (student == null) { + dto.setError("学生不存在"); + errorData.add(dto); + continue; + } + eduStudentMapper.update(null, + Wrappers.lambdaUpdate().eq(EduStudent::getStuNumber, dto.getStudentNum()) + .set(EduStudent::getType, Integer.valueOf(dto.getType()))); + + rowNum++; + if (rowNum * 100 / res.getTotal() != res.getPercent()) { + res.setPercent((int) (rowNum * 100 / res.getTotal())); + redisService.hset(CachePrefixConstant.IMPORT_STUDENT_TYPE, key, res); + } + } + // 错误数据 + res.setError(errorData); + } + } +} diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/listener/importStudentApplyListener.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/listener/importStudentApplyListener.java new file mode 100644 index 0000000..6183ed2 --- /dev/null +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/listener/importStudentApplyListener.java @@ -0,0 +1,47 @@ +package com.yida.data.user.listener; + +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; +import com.yida.data.user.service.EduStudentApplyService; +import com.yida.data.user.vo.StudentApplyImportVO; +import java.util.ArrayList; +import java.util.List; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@RequiredArgsConstructor +public class importStudentApplyListener extends AnalysisEventListener { + + + private EduStudentApplyService eduStudentApplyService; + + + private List list = new ArrayList<>(); + + private String key; + + + public importStudentApplyListener(EduStudentApplyService eduStudentApplyService, String key) { + this.eduStudentApplyService = eduStudentApplyService; + this.key = key; + } + + @Override + public void invoke(StudentApplyImportVO data, AnalysisContext context) { + if (null == data) { + log.info("excel导入失败:{}", data.toString()); + } + list.add(data); + } + + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + saveData(); + } + + public void saveData() { + eduStudentApplyService.insertStudentApplyData(list, key); + } + +} diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/mapper/EduFaceGroupMapper.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/mapper/EduFaceGroupMapper.java index 0155567..9ba6d45 100644 --- a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/mapper/EduFaceGroupMapper.java +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/mapper/EduFaceGroupMapper.java @@ -16,5 +16,6 @@ import org.apache.ibatis.annotations.Param; public interface EduFaceGroupMapper extends BaseMapper { IPage listFaceGroupPage(Page page, @Param("groupName") String groupName, - @Param("schoolId") Long schoolId); + @Param("schoolId") Long schoolId, + @Param("groupId") Long groupId); } diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/mapper/EduFaceGroupStrategyMapper.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/mapper/EduFaceGroupStrategyMapper.java new file mode 100644 index 0000000..97585fb --- /dev/null +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/mapper/EduFaceGroupStrategyMapper.java @@ -0,0 +1,22 @@ +package com.yida.data.user.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.user.EduFaceGroupStrategy; + +/** + * 人脸组-策略Mapper + * + * @author ZYJ + * @date 2022-12-12 11:04:39 + */ +public interface EduFaceGroupStrategyMapper extends BaseMapper { + + /** + * 处理一周的通行计划 + * + * @param groupStrategy 人脸组-策略Entity + * @author ZYJ + * @date 2022/12/12 17:59 + */ + void updateWeekPlan(EduFaceGroupStrategy groupStrategy); +} diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/mapper/EduFaceGroupStrategyPlanMapper.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/mapper/EduFaceGroupStrategyPlanMapper.java new file mode 100644 index 0000000..aef0726 --- /dev/null +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/mapper/EduFaceGroupStrategyPlanMapper.java @@ -0,0 +1,27 @@ +package com.yida.data.user.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.user.EduFaceGroupStrategyPlan; +import com.yida.data.user.vo.StrategyPlanVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 人脸组-策略-通行计划Mapper + * + * @author ZYJ + * @date 2022-12-12 11:36:19 + */ +public interface EduFaceGroupStrategyPlanMapper extends BaseMapper { + + /** + * 查询人脸组-策略-通行计划 + * + * @param strategyId 策略id + * @return java.util.List + * @author ZYJ + * @date 2022/12/12 14:43 + */ + List listStrategyPlan(@Param("strategyId") Long strategyId); +} diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/mapper/EduFaceGroupStrategyPlanTimeMapper.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/mapper/EduFaceGroupStrategyPlanTimeMapper.java new file mode 100644 index 0000000..867aeee --- /dev/null +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/mapper/EduFaceGroupStrategyPlanTimeMapper.java @@ -0,0 +1,14 @@ +package com.yida.data.user.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.user.EduFaceGroupStrategyPlanTime; + +/** + * 人脸组-策略-通行计划-时间Mapper + * + * @author ZYJ + * @date 2022-12-12 11:36:19 + */ +public interface EduFaceGroupStrategyPlanTimeMapper extends BaseMapper { + +} diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/mapper/EduFaceGroupStrategySpecialDateMapper.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/mapper/EduFaceGroupStrategySpecialDateMapper.java new file mode 100644 index 0000000..6de8e1c --- /dev/null +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/mapper/EduFaceGroupStrategySpecialDateMapper.java @@ -0,0 +1,27 @@ +package com.yida.data.user.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.user.EduFaceGroupStrategySpecialDate; +import com.yida.data.user.vo.StrategySpecialDateVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 人脸组-策略-特殊日期Mapper + * + * @author ZYJ + * @date 2022-12-26 13:57:32 + */ +public interface EduFaceGroupStrategySpecialDateMapper extends BaseMapper { + + /** + * 查询特殊日期 + * + * @param strategyId 策略id + * @return java.util.List + * @author ZYJ + * @date 2022/12/26 17:14 + */ + List listStrategySpecialDate(@Param("strategyId") Long strategyId); +} diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/mapper/EduFaceGroupStrategySpecialTimeMapper.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/mapper/EduFaceGroupStrategySpecialTimeMapper.java new file mode 100644 index 0000000..a803398 --- /dev/null +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/mapper/EduFaceGroupStrategySpecialTimeMapper.java @@ -0,0 +1,14 @@ +package com.yida.data.user.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.user.EduFaceGroupStrategySpecialTime; + +/** + * 人脸组-策略-特殊日期-时间Mapper + * + * @author ZYJ + * @date 2022-12-26 13:57:32 + */ +public interface EduFaceGroupStrategySpecialTimeMapper extends BaseMapper { + +} diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/mapper/EduFaceGroupUserMapper.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/mapper/EduFaceGroupUserMapper.java index 3fb3fc7..558e2f7 100644 --- a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/mapper/EduFaceGroupUserMapper.java +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/mapper/EduFaceGroupUserMapper.java @@ -28,13 +28,14 @@ public interface EduFaceGroupUserMapper extends BaseMapper { IPage listStudentNotImport( @Param("page") Page page, - @Param("classId") List classId, @Param("type") Integer type, @Param("sex") Integer sex, @Param("keyword") String keyword, @Param("schoolId") Long schoolId, @Param("groupId") Long groupId, - @Param("dormId") Long dormId, @Param("dormRoomId") Long dormRoomId); + @Param("dormId") Long dormId, @Param("dormRoomId") Long dormRoomId, + @Param("campusId") Long campusId, @Param("sectionId") Long sectionId, + @Param("gradeId") Long gradeId, @Param("classId") Long classId); IPage listStaffNotImport( Page page, @@ -44,13 +45,14 @@ public interface EduFaceGroupUserMapper extends BaseMapper { @Param("groupId") Long groupId); List listStudentNotImport( - @Param("classId") List classId, @Param("type") Integer type, @Param("sex") Integer sex, @Param("keyword") String keyword, @Param("schoolId") Long schoolId, @Param("groupId") Long groupId, - @Param("dormId") Long dormId, @Param("dormRoomId") Long dormRoomId); + @Param("dormId") Long dormId, @Param("dormRoomId") Long dormRoomId, + @Param("campusId") Long campusId, @Param("sectionId") Long sectionId, + @Param("gradeId") Long gradeId, @Param("classId") Long classId); List listStaffNotImport( @Param("sex") Integer sex, diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/mapper/EduStaffMapper.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/mapper/EduStaffMapper.java index c2cfbd4..d6d288f 100644 --- a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/mapper/EduStaffMapper.java +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/mapper/EduStaffMapper.java @@ -7,7 +7,6 @@ import com.yida.data.common.core.entity.user.EduStaff; import com.yida.data.user.dto.ListStaffDTO; import com.yida.data.user.dto.PageTeacherDTO; import com.yida.data.user.vo.*; - import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -49,6 +48,8 @@ public interface EduStaffMapper extends BaseMapper { EduStaff getStaffById(Long staffId); + EduStaff getStaff(@Param("id") Long staffId); + List listStaff(@Param("dto") ListStaffDTO dto); List listStaffByDeptId(@Param("deptId") Long deptId, @Param("staffIds") List staffIds); diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/mapper/EduStudentApplyForMapper.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/mapper/EduStudentApplyForMapper.java new file mode 100644 index 0000000..c0789c5 --- /dev/null +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/mapper/EduStudentApplyForMapper.java @@ -0,0 +1,16 @@ +package com.yida.data.user.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yida.data.common.core.entity.user.EduStudentApplyFor; +import com.yida.data.user.dto.ListStudentApplyForDTO; +import org.apache.ibatis.annotations.Param; + +public interface EduStudentApplyForMapper extends BaseMapper { + + + IPage listStudentApplyFor(@Param("dto") ListStudentApplyForDTO dto, Page page); + + +} diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/mapper/EduStudentApplyMapper.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/mapper/EduStudentApplyMapper.java new file mode 100644 index 0000000..f3ea8d5 --- /dev/null +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/mapper/EduStudentApplyMapper.java @@ -0,0 +1,21 @@ +package com.yida.data.user.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yida.data.common.core.entity.user.EduStudentApply; +import com.yida.data.user.dto.ListStudentApplyDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +public interface EduStudentApplyMapper extends BaseMapper { + + List getStudentApplyStatus(@Param("studentId") Long studentId, + @Param("applyCode") String applyCode); + + IPage listStudentApply(@Param("dto") ListStudentApplyDTO dto, Page page); + + EduStudentApply getStudentApply(@Param("studentId") Long studentId, + @Param("applyCode") String applyCode); +} diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/mapper/EduStudentMapper.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/mapper/EduStudentMapper.java index 71a10ed..a5db540 100644 --- a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/mapper/EduStudentMapper.java +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/mapper/EduStudentMapper.java @@ -8,14 +8,14 @@ import com.yida.data.common.core.entity.user.EduStudent; import com.yida.data.common.core.entity.user.EduTeacherDept; import com.yida.data.school.dto.transaction.ListBuyStudentDTO; import com.yida.data.user.dto.ListStudentDTO; +import com.yida.data.user.dto.OutPageStudentDTO; import com.yida.data.user.dto.PageStudentDTO; import com.yida.data.user.dto.PageStudentDormDTO; +import com.yida.data.user.excel.SelectStudentDormExportData; import com.yida.data.user.vo.ListParentByStudentIdsVO; +import com.yida.data.user.vo.OutPageStudentVO; import com.yida.data.user.vo.StudentClassInfoVO; import com.yida.data.user.vo.StudentDormInfoVO; - -import java.util.List; - import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -34,12 +34,17 @@ public interface EduStudentMapper extends BaseMapper { List selectStudent(@Param("dto") PageStudentDTO dto); EduStudent getStudentWithParent(@Param("studentId") Long studentId, @Param("wxId") String wxId, + @Param("schoolId") Long schoolId); + + + List getStudentListWithParent(@Param("studentIdList") List studentIdList, @Param("wxId") String wxId, @Param("schoolId") Long schoolId); + List listStudentByParent(Long parentId); StudentClassInfoVO getStudentInfo(@Param("studentId") Long studentId, - @Param("parentMobile") String parentMobile); + @Param("parentMobile") String parentMobile); List getParentByPhoneAndSchoolId(@Param("phone") List phone, @Param("schoolId") Long schoolId); @@ -94,8 +99,11 @@ public interface EduStudentMapper extends BaseMapper { * @return */ IPage listStudentDormPage(Page page, - @Param("dormRoomIds") List dormRoomIds, - @Param("dto") PageStudentDormDTO dto); + @Param("dormRoomIds") List dormRoomIds, + @Param("dto") PageStudentDormDTO dto); + + List listStudentDorm(@Param("dormRoomIds") List dormRoomIds, + @Param("dto") SelectStudentDormExportData selectStudentDormExportData); /** * 查询学生对应教师 @@ -129,4 +137,17 @@ public interface EduStudentMapper extends BaseMapper { List listDormIdsByDeptId(ListStudentDTO dto); List listBaseStudentNoJoin(EduStudent eduStudent); + + IPage listStudentOutPage(Page page, + @Param("dto") OutPageStudentDTO dto); + + /** + * 查询年级人数 + * + * @param gradeId 年级id + * @return long + * @author ZYJ + * @date 2023/4/25 11:47 + */ + long selectGradeStudentNumber(@Param("gradeId") Long gradeId); } diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/mapper/EduTeacherDeptMapper.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/mapper/EduTeacherDeptMapper.java index 6c9c761..a2a290c 100644 --- a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/mapper/EduTeacherDeptMapper.java +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/mapper/EduTeacherDeptMapper.java @@ -7,7 +7,9 @@ import com.yida.data.common.core.entity.user.EduTeacherDept; import com.yida.data.common.core.entity.user.EduUserDept; import com.yida.data.user.vo.TeacherClassVO; import com.yida.data.user.vo.TeacherCourseInfoVO; + import java.util.List; + import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -18,10 +20,10 @@ public interface EduTeacherDeptMapper extends BaseMapper { List listPermissionDeptByTeacher(Long teacherSysId); List listTeacherByClass(@Param("classIds") List classIds, - @Param("teacherName") String teacherName); + @Param("teacherName") String teacherName); List listTeacherBySchool(@Param("schoolId") Long schoolId, - @Param("name") String name); + @Param("name") String name); List findType(@Param("teacherId") Long teacherId); @@ -39,18 +41,18 @@ public interface EduTeacherDeptMapper extends BaseMapper { List selectCoursetList(@Param("teacherId") Long teacherId, @Param("schoolId") Long schoolId, - @Param("classId") Long classId); + @Param("classId") Long classId); List findClassId(@Param("teacherId") Long teacherId); List listTeacherCourseByGrade(@Param("gradeId") Long gradeId, - @Param("classId") Long classId); + @Param("classId") Long classId); /** * 根据班级和名称查询教师 */ List listTeacherByClassAndName(@Param("classId") Long classId, - @Param("name") String name); + @Param("name") String name); /** * 查询教师管辖班级 @@ -68,4 +70,14 @@ public interface EduTeacherDeptMapper extends BaseMapper { * @return */ List listTeacherDept(List teacherIds); + + /** + * 教师数量 + * + * @param schoolId 学校id + * @return long + * @author ZYJ + * @date 2023/4/24 16:59 + */ + long countTeacherNumber(@Param("schoolId") Long schoolId); } diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/EduFaceGroupDeviceService.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/EduFaceGroupDeviceService.java index 2038677..2651222 100644 --- a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/EduFaceGroupDeviceService.java +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/EduFaceGroupDeviceService.java @@ -22,4 +22,9 @@ public interface EduFaceGroupDeviceService extends IService * 查询人脸组关联的设备(设备组查询出设备) */ List listDeviceByFaceGroup(Long faceGroupId); + + /** + * 查询人脸组关联的在线设备(设备组查询出设备) + */ + List listFaceGroupOnlineDevice(Long faceGroupId); } diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/EduFaceGroupService.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/EduFaceGroupService.java index bd90527..9fe5d82 100644 --- a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/EduFaceGroupService.java +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/EduFaceGroupService.java @@ -13,7 +13,7 @@ import com.yida.data.common.core.entity.user.EduFaceGroup; */ public interface EduFaceGroupService extends IService { - IPage listFaceGroupPage(Page page, String groupName, Long schoolId); + IPage listFaceGroupPage(Page page, String groupName, Long schoolId, Long groupId); void removeFaceGroup(Long groupId); } diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/EduFaceGroupStrategyPlanService.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/EduFaceGroupStrategyPlanService.java new file mode 100644 index 0000000..cc146f9 --- /dev/null +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/EduFaceGroupStrategyPlanService.java @@ -0,0 +1,26 @@ +package com.yida.data.user.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.user.EduFaceGroupStrategyPlan; +import com.yida.data.user.vo.StrategyPlanVO; + +import java.util.List; + +/** + * 人脸组-策略Service接口 + * + * @author ZYJ + * @date 2022-12-12 11:36:19 + */ +public interface EduFaceGroupStrategyPlanService extends IService { + + /** + * 查询人脸组-策略-通行计划 + * + * @param strategyId 策略id + * @return java.util.List + * @author ZYJ + * @date 2022/12/12 14:42 + */ + List listStrategyPlan(Long strategyId); +} diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/EduFaceGroupStrategyPlanTimeService.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/EduFaceGroupStrategyPlanTimeService.java new file mode 100644 index 0000000..782cd2a --- /dev/null +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/EduFaceGroupStrategyPlanTimeService.java @@ -0,0 +1,14 @@ +package com.yida.data.user.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.user.EduFaceGroupStrategyPlanTime; + +/** +* 人脸组-策略-通行计划-时间Service接口 +* +* @author ZYJ +* @date 2022-12-12 11:36:19 +*/ +public interface EduFaceGroupStrategyPlanTimeService extends IService { + +} diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/EduFaceGroupStrategyService.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/EduFaceGroupStrategyService.java new file mode 100644 index 0000000..a4e914b --- /dev/null +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/EduFaceGroupStrategyService.java @@ -0,0 +1,34 @@ +package com.yida.data.user.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.user.EduFaceGroupStrategy; +import com.yida.data.user.dto.StrategySaveDTO; +import com.yida.data.user.vo.StrategyInfoVO; + +/** + * 人脸组-策略Service接口 + * + * @author ZYJ + * @date 2022-12-12 11:04:39 + */ +public interface EduFaceGroupStrategyService extends IService { + + /** + * 获取人脸组策略信息 + * + * @param faceGroupId 人脸组id + * @return com.yida.data.user.vo.StrategyInfoVO + * @author ZYJ + * @date 2022/12/12 14:11 + */ + StrategyInfoVO getStrategyInfo(Long faceGroupId); + + /** + * 保存人脸组策略信息 + * + * @param strategySaveDTO 人脸组-策略信息保存类 + * @author ZYJ + * @date 2022/12/12 15:17 + */ + void saveStrategyInfo(StrategySaveDTO strategySaveDTO); +} diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/EduFaceGroupStrategySpecialDateService.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/EduFaceGroupStrategySpecialDateService.java new file mode 100644 index 0000000..2eaaf65 --- /dev/null +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/EduFaceGroupStrategySpecialDateService.java @@ -0,0 +1,26 @@ +package com.yida.data.user.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.user.EduFaceGroupStrategySpecialDate; +import com.yida.data.user.vo.StrategySpecialDateVO; + +import java.util.List; + +/** + * 人脸组-策略-特殊日期Service接口 + * + * @author ZYJ + * @date 2022-12-26 13:57:32 + */ +public interface EduFaceGroupStrategySpecialDateService extends IService { + + /** + * 查询特殊日期 + * + * @param strategyId 策略id + * @return java.util.List + * @author ZYJ + * @date 2022/12/26 17:11 + */ + List listStrategySpecialDate(Long strategyId); +} diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/EduFaceGroupStrategySpecialTimeService.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/EduFaceGroupStrategySpecialTimeService.java new file mode 100644 index 0000000..592524c --- /dev/null +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/EduFaceGroupStrategySpecialTimeService.java @@ -0,0 +1,13 @@ +package com.yida.data.user.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.user.EduFaceGroupStrategySpecialTime; + +/** +* 人脸组-策略-特殊日期-时间Service接口 +* +* @author ZYJ +* @date 2022-12-26 13:57:32 +*/ +public interface EduFaceGroupStrategySpecialTimeService extends IService { +} diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/EduFaceGroupUserService.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/EduFaceGroupUserService.java index 55210b9..137dc13 100644 --- a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/EduFaceGroupUserService.java +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/EduFaceGroupUserService.java @@ -7,15 +7,9 @@ import com.yida.data.common.core.entity.CurrentUser; import com.yida.data.common.core.entity.user.EduFaceGroupUser; import com.yida.data.common.core.entity.user.EduStaff; import com.yida.data.common.core.entity.user.EduStudent; -import com.yida.data.user.dto.BatchIssueDTO; -import com.yida.data.user.dto.DelFaceGroupUserDTO; -import com.yida.data.user.dto.FaceGroupUserPageDTO; -import com.yida.data.user.dto.SaveFaceGroupUserDTO; -import com.yida.data.user.dto.UpdateFaceGroupUserStatusDTO; +import com.yida.data.user.dto.*; import com.yida.data.user.vo.UserFacePageVO; -import java.util.List; - /** * 人脸、人脸组关联信息 Service接口 * @@ -27,13 +21,15 @@ public interface EduFaceGroupUserService extends IService { IPage listStudentNotImport(Page page, Long deptId, Integer type, Integer sex, String keyword, Long schoolId, Long groupId, - Long dormId, Long dormRoomId); + Long dormId, Long dormRoomId, + Long campusId, Long sectionId, Long gradeId, Long classId); IPage listStaffNotImport(Page page, Integer sex, String keyword, Long schoolId, Long groupId); - void saveAllStudent(List classId, Integer type, Integer sex, - String keyword, Long schoolId, Long groupId, Long dormId, Long dormRoomId); + void saveAllStudent(Integer type, Integer sex, String keyword, Long schoolId, + Long groupId, Long dormId, Long dormRoomId, + Long campusId, Long sectionId, Long gradeId, Long classId); void saveAllStaff(Integer sex, String keyword, Long schoolId, Long groupId); diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/EduSchoolStudentInformationService.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/EduSchoolStudentInformationService.java index 1225fc0..464d920 100644 --- a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/EduSchoolStudentInformationService.java +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/EduSchoolStudentInformationService.java @@ -86,7 +86,7 @@ public interface EduSchoolStudentInformationService extends IService { + /** * 查询教师列表数据 */ @@ -41,7 +46,14 @@ public interface EduStaffService extends IService { TeacherDetailVO findTeacher(Long teacherId); List listClassByTeacher(Long teacherId); - List listDeptByTeacher(Long teacherId,Integer type); + + List listDeptByTeacher(Long teacherId, Integer type); + + List listClassIdByStaffId(); + + List listStaffRolesByStaffId(Long staffId); + + List listDeptByStaffId(Long staffId); /** * 批量删除教师信息 @@ -53,15 +65,18 @@ public interface EduStaffService extends IService { */ void delTeacherBatch(List teacherIds); - void dealWxTeacherChange(Long schoolId, Long campusId, Long sectionId, Long gradeId, Long classId, List teacherList); + void dealWxTeacherChange(Long schoolId, Long campusId, Long sectionId, Long gradeId, + Long classId, List teacherList, Long deptWxId); void initStaff(List teacherList); + ResultBean> importStaff(MultipartFile file, Long schoolId, long timestamp); + //@Async(FebsConstant.ASYNC_POOL) //void importTeacher(String path, Long schoolId, CurrentUser currentUser, Long key, String fileName); @Async(FebsConstant.ASYNC_POOL) - void importStaff(String path, Long schoolId, CurrentUser currentUser, Long key, String fileName); +// void importStaff(String path, Long schoolId, CurrentUser currentUser, Long key, String fileName); Integer importTeacherHeartbeat(String username, Long key); @@ -81,10 +96,10 @@ public interface EduStaffService extends IService { * 分页查询职工列表数据 */ IPage listStaffPage(Page page, CurrentUser currentUser, - Long areaId, Long schoolId, Long deptId, - Integer isLeader, - String position, String name, String mobile, Integer sex, - Integer collectType); + Long areaId, Long schoolId, Long deptId, + Integer isLeader, + String position, String name, String mobile, Integer sex, + Integer collectType); /** * 添加、修改职工 @@ -100,7 +115,7 @@ public interface EduStaffService extends IService { * @param teacherId * @return */ - List findTeacherRole(Long teacherId); + List findTeacherRole(Long teacherId); /*** * 根据班级查询关联的老师 @@ -120,6 +135,8 @@ public interface EduStaffService extends IService { List listTeacherCourseByGrade(Long gradeId, Long classId); + List listClassByGradeIdAndTeacherId(Long gradeId, Long staffId); + /** * 根据班级和名称查询教师 * @@ -135,7 +152,7 @@ public interface EduStaffService extends IService { * @param nameOrPhone * @return */ - List listStaffByDeptId(Long deptId, String nameOrPhone,Long schoolId); + List listStaffByDeptId(Long deptId, String nameOrPhone, Long schoolId); /** @@ -154,6 +171,7 @@ public interface EduStaffService extends IService { /** * 查询教职工分布情况 + * * @return */ StaStaffDistributeVO staStaffDistribute(List schoolIds); @@ -161,8 +179,24 @@ public interface EduStaffService extends IService { StaStaffDistributeVO staStaffNum(List schoolIds); void exportStaff(Long areaId, Long schoolId, Long deptId, Integer isLeader, String position, - String name, String mobile, Integer sex, Integer collectType, - HttpServletResponse response); + String name, String mobile, Integer sex, Integer collectType, + HttpServletResponse response); SystemUser saveSystemUser(EduStaff eduStaff); + + void getWxIdByStaffId(Long staffId); + + void saveExcelData(ConcurrentHashMap concurrentHashMap, + ConcurrentHashMap errorMap, + Long schoolId, + long timestamp); + + List getDeptManager(List deptIdList, Long ruleId); + + + /** + * 更新学生缓存信息 + */ + @Async + void updateStaffCache(); } diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/EduStudentApplyForService.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/EduStudentApplyForService.java new file mode 100644 index 0000000..3ecce0f --- /dev/null +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/EduStudentApplyForService.java @@ -0,0 +1,33 @@ +package com.yida.data.user.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.user.EduStudentApply; +import com.yida.data.common.core.entity.user.EduStudentApplyFor; +import com.yida.data.user.dto.ListStudentApplyDTO; +import com.yida.data.user.dto.ListStudentApplyForDTO; +import com.yida.data.user.vo.StudentApplyImportProgressVO; +import com.yida.data.user.vo.StudentApplyImportVO; +import com.yida.data.user.vo.StudentApplyStatusVO; +import java.io.IOException; +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.springframework.scheduling.annotation.Async; +import org.springframework.web.multipart.MultipartFile; + +public interface EduStudentApplyForService extends IService { + + + /** + * 分页查询 + */ + IPage listStudentApplyFor(ListStudentApplyForDTO dto, Page page); + + + void saveStudentApplyFor(EduStudentApplyFor eduStudentApplyFor); + + void dealApplyFor(Long id, Integer status); + + EduStudentApplyFor getByStudentId(Long studentId, String appCode); +} diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/EduStudentApplyService.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/EduStudentApplyService.java new file mode 100644 index 0000000..1e9f71b --- /dev/null +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/EduStudentApplyService.java @@ -0,0 +1,55 @@ +package com.yida.data.user.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.user.EduStudentApply; +import com.yida.data.user.dto.ListStudentApplyDTO; +import com.yida.data.user.vo.StudentApplyImportProgressVO; +import com.yida.data.user.vo.StudentApplyImportVO; +import com.yida.data.user.vo.StudentApplyStatusVO; +import java.io.IOException; +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.springframework.scheduling.annotation.Async; +import org.springframework.web.multipart.MultipartFile; + +public interface EduStudentApplyService extends IService { + + /** + * 获取详情 + */ + StudentApplyStatusVO getStudentApplyStatus(Long studentId, String applyCode); + + /** + * 分页查询 + */ + IPage listStudentApply(ListStudentApplyDTO dto, Page page); + + void saveStudentApply(EduStudentApply eduStudentApply); + + /** + * 下载学生开通应用模板 + * + * @param response + * @throws Exception + */ + void downloadTemplate(HttpServletResponse response) throws Exception; + + /** + * 导入 + */ + @Async + void importStudentApplyInfo(MultipartFile file, String redisKey) throws IOException; + + /** + * 插入 + */ + void insertStudentApplyData(List studentApplyImportVOList, String redisKey); + + /** + * 获取导入进度 + */ + StudentApplyImportProgressVO getImportStudentApplyInfoProgress(String redisKey); + +} diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/EduStudentDormService.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/EduStudentDormService.java index bc67a55..01c6302 100644 --- a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/EduStudentDormService.java +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/EduStudentDormService.java @@ -1,10 +1,13 @@ package com.yida.data.user.service; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.yida.data.common.core.entity.school.EduDormitory; +import com.yida.data.common.core.entity.school.EduDormitoryRoom; import com.yida.data.user.dto.ExchangeDormDTO; import com.yida.data.user.dto.PageStudentDormDTO; import com.yida.data.user.vo.StudentDormInfoVO; +import org.springframework.scheduling.annotation.Async; import org.springframework.web.multipart.MultipartFile; import java.util.List; @@ -50,4 +53,17 @@ public interface EduStudentDormService { * @param key */ void importDormRoom(MultipartFile file, Long schoolId, String key); + + @Async + void exportStudentDorm(PageStudentDormDTO dto, String key); + + /** + * 查询导出进度 + * + * @param key 导出唯一标识 + * @return java.lang.Object + * @author ZYJ + * @date 2023/12/14 16:25 + */ + Object getStudentDormExportInfo(String key); } diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/EduStudentService.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/EduStudentService.java index bd90453..2ccd8cd 100644 --- a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/EduStudentService.java +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/EduStudentService.java @@ -9,14 +9,15 @@ import com.yida.data.common.core.entity.user.EduStudent; import com.yida.data.common.core.entity.user.EduTeacherDept; import com.yida.data.school.dto.transaction.ListBuyStudentDTO; import com.yida.data.user.dto.ListStudentDTO; +import com.yida.data.user.dto.OutPageStudentDTO; import com.yida.data.user.dto.PageStudentDTO; import com.yida.data.user.dto.h5.BindStudentDTO; -import com.yida.data.user.vo.DownLoadPicVO; -import com.yida.data.user.vo.ListParentByStudentIdsVO; -import com.yida.data.user.vo.StaStudentVO; -import com.yida.data.user.vo.StudentClassInfoVO; +import com.yida.data.user.excel.SelectStudentDormExportData; +import com.yida.data.user.vo.*; import org.springframework.scheduling.annotation.Async; +import org.springframework.web.multipart.MultipartFile; +import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.List; import java.util.Map; @@ -57,8 +58,13 @@ public interface EduStudentService extends IService { @Async(FebsConstant.ASYNC_POOL) void importStudent(String path, CurrentUser currentUser, Long schoolId, Long key, String filename); + @Async(FebsConstant.ASYNC_POOL) + void importCard(String path, CurrentUser currentUser, Long schoolId, Long key, String filename); + Integer importStaffHeartbeat(String username, Long key); + void importStudentUpdateType(MultipartFile file, Long schoolId); + List> listImportKey(String username); List listStudentByParent(Long parentId, String applyCode); @@ -72,6 +78,8 @@ public interface EduStudentService extends IService { void downloadTemplate(HttpServletResponse response, CurrentUser currentUser); + void downloadCardTemplate(HttpServletResponse response, CurrentUser currentUser); + List getParentByPhoneAndSchoolId(List phone, Long schoolId); /** @@ -119,7 +127,18 @@ public interface EduStudentService extends IService { List listStudentByClassId(ListStudentDTO dto); - void exportStudent(PageStudentDTO dto, HttpServletResponse response); + @Async + void exportStudent(PageStudentDTO dto, String key); + + /** + * 查询导出进度 + * + * @param key 导出唯一标识 + * @return java.lang.Object + * @author ZYJ + * @date 2023/12/13 14:42 + */ + Object getStudentExportInfo(String key); DownLoadPicVO exportStudentPic(PageStudentDTO dto); @@ -178,5 +197,34 @@ public interface EduStudentService extends IService { * @return */ List listBaseStudentNoJoin(EduStudent eduStudent); - + + /** + * 分页查询学生列表数据 + * + * @param dto 分页查询学生列表数据请求类 + * @param request request + * @return com.baomidou.mybatisplus.core.metadata.IPage + * @author ZYJ + * @date 2023/2/20 16:41 + */ + IPage listStudentOutPage(OutPageStudentDTO dto, HttpServletRequest request); + + /** + * 更新学生缓存信息 + */ + @Async + void updateStudentCache(); + + List selectStudent(PageStudentDTO dto); + + /** + * 查询学生宿舍信息 + * + * @param dormRoomIds 宿舍id集合 + * @param selectStudentDormExportData 查询条件 + * @return java.util.List + * @author ZYJ + * @date 2023/12/13 18:17 + */ + List listStudentDorm(List dormRoomIds, SelectStudentDormExportData selectStudentDormExportData); } diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/EduTeacherDeptService.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/EduTeacherDeptService.java index f51e54d..d3411eb 100644 --- a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/EduTeacherDeptService.java +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/EduTeacherDeptService.java @@ -34,4 +34,14 @@ public interface EduTeacherDeptService extends IService { * @date 2022/7/15 17:49 */ List listTeacherDept(Long deptId, String type); + + /** + * 教师数量 + * + * @param schoolId 学校id + * @return long + * @author ZYJ + * @date 2023/4/24 16:58 + */ + long countTeacherNumber(Long schoolId); } diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/EduUserDeptService.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/EduUserDeptService.java index d1b2448..f639d5c 100644 --- a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/EduUserDeptService.java +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/EduUserDeptService.java @@ -1,11 +1,12 @@ package com.yida.data.user.service; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; import com.baomidou.mybatisplus.extension.service.IService; import com.yida.data.common.core.entity.QueryRequest; import com.yida.data.common.core.entity.constant.FebsConstant; import com.yida.data.common.core.entity.system.Dept; import com.yida.data.common.core.entity.system.EduApp; -import com.yida.data.common.core.entity.user.EduCollectData; import com.yida.data.common.core.entity.user.EduUserDept; import com.yida.data.common.core.entity.user.EduUserDeptStandardGrade; import com.yida.data.common.core.entity.user.enums.SectionTypeEnum; @@ -14,9 +15,12 @@ import com.yida.data.common.core.enums.IncludeTypeEnum; import com.yida.data.system.vo.ClassInfoVO; import com.yida.data.user.dto.*; import com.yida.data.user.vo.AllDeptInfoVO; +import com.yida.data.user.vo.ClassAttendanceDataVO; import com.yida.data.user.vo.CollectDataVO; +import com.yida.data.user.vo.TeacherDeptVO; import org.springframework.scheduling.annotation.Async; +import java.time.LocalDate; import java.util.List; import java.util.Map; @@ -62,6 +66,11 @@ public interface EduUserDeptService extends IService { List findVisibleClassByUserId(Long staffId); + + List findClassAttendanceByUserId(Long staffId, LocalDate date); + + List findClassAttendanceDetailByDeptId(Long deptId, Integer type, LocalDate date); + /** * 向下查询指定家校部门类型的家校部门id(可查询非直接子家校部门) 未毕业家校部门 * @@ -71,7 +80,7 @@ public interface EduUserDeptService extends IService { * @author ZYJ * @date 2022/7/11 16:08 */ - List findChildIdByParentAndType(List userDeptIdList, Integer type); + List findChildIdByParentAndType(List userDeptIdList, Integer type, List resultList); /** * 根据家校部门id查询所属学校 @@ -105,6 +114,17 @@ public interface EduUserDeptService extends IService { */ List getUserDeptTree(Long deptId); + + /** + * 家校部门树 + * + * @param deptIds 根节点Id + * @return java.util.List + * @author ZYJ + * @date 2021/11/11 13:40 + */ + List getUserDeptTree(List deptIds); + /** * 根据各层名称查询班级信息 * @@ -231,6 +251,8 @@ public interface EduUserDeptService extends IService { */ EduUserDept getParentByDeptId(Long deptId); + List getParentListByDeptId(Long deptId); + /** * 批量保存家校部门 * @@ -256,7 +278,7 @@ public interface EduUserDeptService extends IService { * @date 2021/11/30 13:47 */ @Async(FebsConstant.ASYNC_POOL) - void syncUserDept(); + void syncUserDept(Long schoolId); /** * 处理挂在学校下的家校部门 @@ -301,4 +323,17 @@ public interface EduUserDeptService extends IService { * @return */ AllDeptInfoVO findParentUp(Long deptId, Integer type); + + + List listClassByStaffId(Long staffId); + + /** + * 查询学校年级分布 + * + * @param schoolId 学校id + * @return cn.hutool.json.JSONArray + * @author ZYJ + * @date 2023/4/25 10:26 + */ + JSONArray getGradeDistribution(Long schoolId); } diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/ImportWelcomeStudentService.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/ImportWelcomeStudentService.java index dd618d8..fc8bf40 100644 --- a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/ImportWelcomeStudentService.java +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/ImportWelcomeStudentService.java @@ -1,9 +1,7 @@ package com.yida.data.user.service; import com.yida.data.common.core.entity.CurrentUser; -import com.yida.data.user.dto.StudentErrorExportDTO; -import com.yida.data.user.dto.WelcomeInviteImportDTO; -import com.yida.data.user.dto.WelcomeStudentImportDTO; +import com.yida.data.user.dto.*; import org.ehcache.impl.internal.concurrent.ConcurrentHashMap; import java.util.List; @@ -47,4 +45,19 @@ public interface ImportWelcomeStudentService { Long schoolId, String uuid, CurrentUser currentUser); + + /** + * 保存校园卡号导入数据 + * + * @param concurrentHashMap 需要保存的用户数据 + * @param errorList 导入错误数据集合 + * @param schoolId 学校id + * @param currentUser 当前登录用户信息 + * @author ZYJ + * @date 2023/2/19 14:45 + */ + void saveCardExcelData(ConcurrentHashMap concurrentHashMap, + List errorList, + Long schoolId, + CurrentUser currentUser); } diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/QywxSyncService.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/QywxSyncService.java index 0f95a15..b131065 100644 --- a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/QywxSyncService.java +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/QywxSyncService.java @@ -21,5 +21,5 @@ public interface QywxSyncService { * 同步企业微信职工数据 */ @Async(FebsConstant.ASYNC_POOL) - void syncQywxStaff(); + void syncQywxStaff(Long schoolId); } diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduFaceGroupDeviceServiceImpl.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduFaceGroupDeviceServiceImpl.java index d7c845d..388900a 100644 --- a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduFaceGroupDeviceServiceImpl.java +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduFaceGroupDeviceServiceImpl.java @@ -4,18 +4,27 @@ import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.yida.data.attendance.feign.RemoteAttendanceDeviceService; +import com.yida.data.attendance.feign.RemoteAttendanceStrategyService; import com.yida.data.common.core.entity.attendance.EduAttendanceDevice; import com.yida.data.common.core.entity.user.EduFaceGroupDevice; +import com.yida.data.common.core.entity.user.EduFaceGroupStrategy; +import com.yida.data.common.core.entity.user.EduFaceGroupUser; import com.yida.data.user.dto.BindFaceGroupDeviceDTO; import com.yida.data.user.mapper.EduFaceGroupDeviceMapper; import com.yida.data.user.service.EduFaceGroupDeviceService; +import com.yida.data.user.service.EduFaceGroupStrategyService; +import com.yida.data.user.service.EduFaceGroupUserService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import java.util.stream.Collectors; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Propagation; -import org.springframework.transaction.annotation.Transactional; /** * 人脸组、设备组关系 Service实现 @@ -23,13 +32,23 @@ import org.springframework.transaction.annotation.Transactional; * @author zhanghaijun * @date 2021-06-16 14:15:08 */ +@Slf4j @Service @RequiredArgsConstructor -@Transactional(propagation = Propagation.SUPPORTS, readOnly = true) +@Transactional(rollbackFor = Exception.class) public class EduFaceGroupDeviceServiceImpl extends ServiceImpl - implements EduFaceGroupDeviceService { + implements EduFaceGroupDeviceService { + + @Lazy + @Resource + private EduFaceGroupUserService eduFaceGroupUserService; + + @Lazy + @Resource + private EduFaceGroupStrategyService eduFaceGroupStrategyService; private final RemoteAttendanceDeviceService remoteAttendanceDeviceService; + private final RemoteAttendanceStrategyService remoteAttendanceStrategyService; @Override @Transactional @@ -40,18 +59,44 @@ public class EduFaceGroupDeviceServiceImpl extends ServiceImpl return x; }).collect(Collectors.toList()); saveBatch(saveList); + // 查询是否有策略信息 + EduFaceGroupStrategy groupStrategy = eduFaceGroupStrategyService.getOne(Wrappers.lambdaQuery(new EduFaceGroupStrategy()) + .eq(EduFaceGroupStrategy::getFaceGroupId, dto.getFaceGroupId())); + if (Objects.isNull(groupStrategy)) { + return; + } + // 处理设备策略信息 + groupStrategy.setFaceGroupId(dto.getFaceGroupId()); + // 查询关联的设备信息 + List list = list(Wrappers.lambdaQuery(new EduFaceGroupDevice()) + .eq(EduFaceGroupDevice::getFaceGroupId, dto.getFaceGroupId())); + if (CollUtil.isEmpty(list)) { + log.info("当前人脸组策略没有对应的设备信息: {}", dto.getFaceGroupId()); + return; + } + // 设置设备信息 + groupStrategy.setGroupDeviceList(list); + List groupUserList = eduFaceGroupUserService.list(Wrappers.lambdaQuery(new EduFaceGroupUser()) + .eq(EduFaceGroupUser::getFaceGroupId, groupStrategy.getFaceGroupId()) + // 已下发人脸 + .eq(EduFaceGroupUser::getStatus, 1) + ); + groupStrategy.setGroupUserList(groupUserList); + // 设置人员信息 + remoteAttendanceStrategyService.deleteAndSaveStrategy(groupStrategy); } @Override public List listFaceGroupDevice(Long faceGroupId) { List list = list( - Wrappers.lambdaQuery(new EduFaceGroupDevice()).eq(EduFaceGroupDevice::getFaceGroupId, faceGroupId)); + Wrappers.lambdaQuery(new EduFaceGroupDevice()).eq(EduFaceGroupDevice::getFaceGroupId, faceGroupId)); if (CollUtil.isNotEmpty(list)) { list = list.stream().map(x -> { EduFaceGroupDevice device = new EduFaceGroupDevice(); device.setDeviceId(x.getDeviceId()); device.setDeviceName(x.getDeviceName()); device.setType(x.getType()); + device.setState(x.getState()); return device; }).collect(Collectors.toList()); } @@ -63,15 +108,15 @@ public class EduFaceGroupDeviceServiceImpl extends ServiceImpl List res = new ArrayList<>(); List deviceAndGroup = listFaceGroupDevice(faceGroupId); if (CollUtil.isNotEmpty(deviceAndGroup)) { - List deviceIds = deviceAndGroup.stream().filter(x -> x.getType() == 0).map(x -> x.getDeviceId()) - .collect(Collectors.toList()); - List deviceGroupIds = deviceAndGroup.stream().filter(x -> x.getType() == 1).map(x -> x.getDeviceId()) - .collect(Collectors.toList()); + List deviceIds = deviceAndGroup.stream().filter(x -> x.getType() == 0).map(EduFaceGroupDevice::getDeviceId) + .collect(Collectors.toList()); + List deviceGroupIds = deviceAndGroup.stream().filter(x -> x.getType() == 1).map(EduFaceGroupDevice::getDeviceId) + .collect(Collectors.toList()); if (CollUtil.isNotEmpty(deviceGroupIds)) { // 根据设备组查询设备 List deviceListByGroup = remoteAttendanceDeviceService - .listDeviceByGroup(deviceGroupIds.toArray(new Long[0])).getData(); - res.addAll(deviceListByGroup.stream().map(x -> x.getId()).collect(Collectors.toList())); + .listDeviceByGroup(deviceGroupIds.toArray(new Long[0])).getData(); + res.addAll(deviceListByGroup.stream().map(EduAttendanceDevice::getId).collect(Collectors.toList())); } if (CollUtil.isNotEmpty(deviceIds)) { res.addAll(deviceIds); @@ -79,4 +124,11 @@ public class EduFaceGroupDeviceServiceImpl extends ServiceImpl } return res; } + + @Override + public List listFaceGroupOnlineDevice(Long faceGroupId) { + List res = new ArrayList<>(); + + return res; + } } diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduFaceGroupServiceImpl.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduFaceGroupServiceImpl.java index 1d59710..9f30722 100644 --- a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduFaceGroupServiceImpl.java +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduFaceGroupServiceImpl.java @@ -1,28 +1,28 @@ package com.yida.data.user.service.impl; +import cc.mrbird.febs.common.redis.service.RedisService; import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.yida.data.attendance.feign.RemoteAttendanceDeviceService; +import com.yida.data.attendance.feign.RemoteAttendanceStrategyService; import com.yida.data.common.core.entity.attendance.EduAttendanceDevice; import com.yida.data.common.core.entity.attendance.EduAttendanceDeviceGroup; -import com.yida.data.common.core.entity.user.EduFaceGroup; -import com.yida.data.common.core.entity.user.EduFaceGroupDevice; -import com.yida.data.common.core.entity.user.EduFaceGroupUser; +import com.yida.data.common.core.entity.user.*; import com.yida.data.user.dto.DelFaceGroupUserDTO; -import com.yida.data.user.mapper.EduFaceGroupDeviceMapper; import com.yida.data.user.mapper.EduFaceGroupMapper; -import com.yida.data.user.service.EduFaceGroupService; -import com.yida.data.user.service.EduFaceGroupUserService; +import com.yida.data.user.service.*; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; /** * 人脸组信息 Service实现 @@ -30,19 +30,27 @@ import org.springframework.transaction.annotation.Transactional; * @author zhanghaijun * @date 2021-06-16 14:09:44 */ +@Slf4j @Service @RequiredArgsConstructor @Transactional public class EduFaceGroupServiceImpl extends ServiceImpl - implements EduFaceGroupService { + implements EduFaceGroupService { private final EduFaceGroupUserService eduFaceGroupUserService; - private final EduFaceGroupDeviceMapper eduFaceGroupDeviceMapper; + private final EduFaceGroupDeviceService eduFaceGroupDeviceService; + private final EduFaceGroupStrategyService eduFaceGroupStrategyService; + private final EduFaceGroupStrategyPlanService eduFaceGroupStrategyPlanService; + private final EduFaceGroupStrategyPlanTimeService eduFaceGroupStrategyPlanTimeService; + private final RemoteAttendanceDeviceService remoteAttendanceDeviceService; + private final RemoteAttendanceStrategyService remoteAttendanceStrategyService; + + private final RedisService redisService; @Override - public IPage listFaceGroupPage(Page page, String groupName, Long schoolId) { - IPage res = baseMapper.listFaceGroupPage(page, groupName, schoolId); + public IPage listFaceGroupPage(Page page, String groupName, Long schoolId, Long groupId) { + IPage res = baseMapper.listFaceGroupPage(page, groupName, schoolId, groupId); // 获取所有设备和设备组id List deviceIds = new ArrayList<>(); List groupIds = new ArrayList<>(); @@ -59,25 +67,25 @@ public class EduFaceGroupServiceImpl extends ServiceImpl } // 查出所有的设备和设备组 List devices = remoteAttendanceDeviceService.listDeviceById(deviceIds.toArray(new Long[0])) - .getData(); + .getData(); List groups = remoteAttendanceDeviceService.listDeviceGroupById(groupIds.toArray(new Long[0])) - .getData(); + .getData(); // 按id分组方便拿数据 Map> deviceMap = devices.stream() - .collect(Collectors.groupingBy(EduAttendanceDevice::getId)); + .collect(Collectors.groupingBy(EduAttendanceDevice::getId)); Map> groupMap = groups.stream() - .collect(Collectors.groupingBy(EduAttendanceDeviceGroup::getId)); + .collect(Collectors.groupingBy(EduAttendanceDeviceGroup::getId)); for (EduFaceGroup record : res.getRecords()) { if (CollUtil.isNotEmpty(record.getDeviceList())) { for (EduFaceGroupDevice groupDevice : record.getDeviceList()) { if (groupDevice.getType() == 0 - && CollUtil.isNotEmpty(deviceMap) - && deviceMap.containsKey(groupDevice.getDeviceId())) { + && CollUtil.isNotEmpty(deviceMap) + && deviceMap.containsKey(groupDevice.getDeviceId())) { groupDevice.setDeviceName(deviceMap.get(groupDevice.getDeviceId()).get(0).getName()); groupDevice.setState(deviceMap.get(groupDevice.getDeviceId()).get(0).getState()); } else if (groupDevice.getType() == 1 - && CollUtil.isNotEmpty(groupMap) - && groupMap.containsKey(groupDevice.getDeviceId())) { + && CollUtil.isNotEmpty(groupMap) + && groupMap.containsKey(groupDevice.getDeviceId())) { groupDevice.setDeviceName(groupMap.get(groupDevice.getDeviceId()).get(0).getGroupName()); } } @@ -86,21 +94,50 @@ public class EduFaceGroupServiceImpl extends ServiceImpl return res; } - @Override public void removeFaceGroup(Long groupId) { // 删除人脸关联信息 删除下发记录 删除设备上的人脸 List faceGroupUserList = - eduFaceGroupUserService - .list(Wrappers.lambdaQuery(new EduFaceGroupUser()).eq(EduFaceGroupUser::getFaceGroupId, groupId)); + eduFaceGroupUserService + .list(Wrappers.lambdaQuery(new EduFaceGroupUser()).eq(EduFaceGroupUser::getFaceGroupId, groupId)); if (CollUtil.isNotEmpty(faceGroupUserList)) { // 删除人脸相关信息 DelFaceGroupUserDTO dto = new DelFaceGroupUserDTO(); dto.setFaceGroupId(groupId); - dto.setFaceIds(faceGroupUserList.stream().map(x -> x.getId()).collect(Collectors.toList())); + dto.setFaceIds(faceGroupUserList.stream().map(EduFaceGroupUser::getId).collect(Collectors.toList())); eduFaceGroupUserService.delUserBatch(dto); } - //删除组 + // 删除组 removeById(groupId); + // TODO 2022/12/21 此处需要删除对应通行策略以及人员绑定关系,附带对应的人员对应策略缓存信息 + // 删除策略 + eduFaceGroupStrategyService.remove(Wrappers.lambdaQuery(new EduFaceGroupStrategy()) + .eq(EduFaceGroupStrategy::getFaceGroupId, groupId)); + // 删除策略附表信息 + eduFaceGroupStrategyPlanService.remove(Wrappers.lambdaQuery(new EduFaceGroupStrategyPlan()) + .eq(EduFaceGroupStrategyPlan::getFaceGroupId, groupId)); + eduFaceGroupStrategyPlanTimeService.remove(Wrappers.lambdaQuery(new EduFaceGroupStrategyPlanTime()) + .eq(EduFaceGroupStrategyPlanTime::getFaceGroupId, groupId)); + // 查询关联的设备信息 + List list = eduFaceGroupDeviceService.list( + Wrappers.lambdaQuery(new EduFaceGroupDevice()).eq(EduFaceGroupDevice::getFaceGroupId, groupId)); + if (CollUtil.isEmpty(list)) { + return; + } + EduFaceGroupStrategy eduFaceGroupStrategy = new EduFaceGroupStrategy(); + eduFaceGroupStrategy.setFaceGroupId(groupId); + eduFaceGroupStrategy.setGroupDeviceList(list); + remoteAttendanceStrategyService.deleteStrategy(eduFaceGroupStrategy); +// // 移除对应的缓存 +// if (CollUtil.isNotEmpty(faceGroupUserList)) { +// for (EduFaceGroupDevice device : list) { +// for (EduFaceGroupUser groupUser : faceGroupUserList) { +// log.info("删除的用户数据===device: {}, user: {}", device, groupUser); +// redisService.hdel(CachePrefixConstant.USER_ATTENDANCE_STRATEGY + +// groupUser.getUserId().toString() + groupUser.getUserType().toString(), String.valueOf(groupId)); +// } +// } +// +// } } } diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduFaceGroupStrategyPlanServiceImpl.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduFaceGroupStrategyPlanServiceImpl.java new file mode 100644 index 0000000..69c1898 --- /dev/null +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduFaceGroupStrategyPlanServiceImpl.java @@ -0,0 +1,32 @@ +package com.yida.data.user.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.user.EduFaceGroupStrategyPlan; +import com.yida.data.user.mapper.EduFaceGroupStrategyPlanMapper; +import com.yida.data.user.service.EduFaceGroupStrategyPlanService; +import com.yida.data.user.vo.StrategyPlanVO; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * 人脸组-策略-通行计划Service实现 + * + * @author ZYJ + * @date 2022-12-12 11:36:19 + */ +@Slf4j +@Service +@RequiredArgsConstructor +@Transactional(rollbackFor = Exception.class) +public class EduFaceGroupStrategyPlanServiceImpl extends ServiceImpl + implements EduFaceGroupStrategyPlanService { + + @Override + public List listStrategyPlan(Long strategyId) { + return baseMapper.listStrategyPlan(strategyId); + } +} diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduFaceGroupStrategyPlanTimeServiceImpl.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduFaceGroupStrategyPlanTimeServiceImpl.java new file mode 100644 index 0000000..e83ebad --- /dev/null +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduFaceGroupStrategyPlanTimeServiceImpl.java @@ -0,0 +1,26 @@ +package com.yida.data.user.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.user.EduFaceGroupStrategyPlanTime; +import com.yida.data.user.mapper.EduFaceGroupStrategyPlanTimeMapper; +import com.yida.data.user.service.EduFaceGroupStrategyPlanTimeService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * 人脸组-策略-通行计划-时间Service实现 + * + * @author ZYJ + * @date 2022-12-12 11:36:19 + */ +@Slf4j +@Service +@RequiredArgsConstructor +@Transactional(rollbackFor = Exception.class) +public class EduFaceGroupStrategyPlanTimeServiceImpl extends ServiceImpl + implements EduFaceGroupStrategyPlanTimeService { + + +} diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduFaceGroupStrategyServiceImpl.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduFaceGroupStrategyServiceImpl.java new file mode 100644 index 0000000..a50738f --- /dev/null +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduFaceGroupStrategyServiceImpl.java @@ -0,0 +1,241 @@ +package com.yida.data.user.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.attendance.feign.RemoteAttendanceStrategyService; +import com.yida.data.common.core.entity.user.*; +import com.yida.data.common.core.exception.FebsException; +import com.yida.data.user.dto.*; +import com.yida.data.user.mapper.EduFaceGroupStrategyMapper; +import com.yida.data.user.service.*; +import com.yida.data.user.vo.StrategyInfoVO; +import com.yida.data.user.vo.StrategyPlanVO; +import com.yida.data.user.vo.StrategySpecialDateVO; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * 人脸组-策略Service实现 + * + * @author ZYJ + * @date 2022-12-12 11:04:39 + */ +@Slf4j +@Service +@RequiredArgsConstructor +@Transactional(rollbackFor = Exception.class) +public class EduFaceGroupStrategyServiceImpl extends ServiceImpl + implements EduFaceGroupStrategyService { + + @Lazy + @Resource + private EduFaceGroupUserService eduFaceGroupUserService; + + private final EduFaceGroupDeviceService eduFaceGroupDeviceService; + private final EduFaceGroupStrategyPlanService eduFaceGroupStrategyPlanService; + private final EduFaceGroupStrategyPlanTimeService eduFaceGroupStrategyPlanTimeService; + private final EduFaceGroupStrategySpecialDateService eduFaceGroupStrategySpecialDateService; + private final EduFaceGroupStrategySpecialTimeService eduFaceGroupStrategySpecialTimeService; + + private final RemoteAttendanceStrategyService remoteAttendanceStrategyService; + + @Override + public StrategyInfoVO getStrategyInfo(Long faceGroupId) { + EduFaceGroupStrategy groupStrategy = getOne(Wrappers.lambdaQuery(new EduFaceGroupStrategy()) + .eq(EduFaceGroupStrategy::getFaceGroupId, faceGroupId)); + // 返回数据 + StrategyInfoVO strategyInfoVO = new StrategyInfoVO(); + if (Objects.nonNull(groupStrategy)) { + BeanUtils.copyProperties(groupStrategy, strategyInfoVO); + strategyInfoVO.setStrategyId(groupStrategy.getId()); + // 查询人脸组-策略-通行计划 + List planList = eduFaceGroupStrategyPlanService.listStrategyPlan(groupStrategy.getId()); + strategyInfoVO.setPlanList(planList); + // 查询特殊日期 + List specialDateList = eduFaceGroupStrategySpecialDateService.listStrategySpecialDate(groupStrategy.getId()); + strategyInfoVO.setSpecialList(specialDateList); + // 处理周一到周日的唯一编码 + if (Objects.nonNull(groupStrategy.getMondayPlanId())) { + // 周一 + strategyInfoVO.setMondayUniqueCode( + eduFaceGroupStrategyPlanService.getById(groupStrategy.getMondayPlanId()).getUniqueCode()); + } + if (Objects.nonNull(groupStrategy.getTuesdayPlanId())) { + // 周二 + strategyInfoVO.setTuesdayUniqueCode( + eduFaceGroupStrategyPlanService.getById(groupStrategy.getTuesdayPlanId()).getUniqueCode()); + } + if (Objects.nonNull(groupStrategy.getWednesdayPlanId())) { + // 周三 + strategyInfoVO.setWednesdayUniqueCode( + eduFaceGroupStrategyPlanService.getById(groupStrategy.getWednesdayPlanId()).getUniqueCode()); + } + if (Objects.nonNull(groupStrategy.getThursdayPlanId())) { + // 周四 + strategyInfoVO.setThursdayUniqueCode( + eduFaceGroupStrategyPlanService.getById(groupStrategy.getThursdayPlanId()).getUniqueCode()); + } + if (Objects.nonNull(groupStrategy.getFridayPlanId())) { + // 周五 + strategyInfoVO.setFridayUniqueCode( + eduFaceGroupStrategyPlanService.getById(groupStrategy.getFridayPlanId()).getUniqueCode()); + } + if (Objects.nonNull(groupStrategy.getSaturdayPlanId())) { + // 周六 + strategyInfoVO.setSaturdayUniqueCode( + eduFaceGroupStrategyPlanService.getById(groupStrategy.getSaturdayPlanId()).getUniqueCode()); + } + if (Objects.nonNull(groupStrategy.getSundayPlanId())) { + // 周日 + strategyInfoVO.setSundayUniqueCode( + eduFaceGroupStrategyPlanService.getById(groupStrategy.getSundayPlanId()).getUniqueCode()); + } + } + return strategyInfoVO; + } + + @Override + public void saveStrategyInfo(StrategySaveDTO strategySaveDTO) { + // 查询关联的设备信息 + List list = eduFaceGroupDeviceService.list( + Wrappers.lambdaQuery(new EduFaceGroupDevice()).eq(EduFaceGroupDevice::getFaceGroupId, strategySaveDTO.getFaceGroupId())); + if (CollUtil.isEmpty(list)) { + throw new FebsException("请关联对应的设备信息"); + } + + EduFaceGroupStrategy groupStrategy = new EduFaceGroupStrategy(); + BeanUtils.copyProperties(strategySaveDTO, groupStrategy); + groupStrategy.setId(strategySaveDTO.getStrategyId()); + + if (Objects.isNull(strategySaveDTO.getStrategyId())) { + // 新增 + } else { + // 编辑, 需要删除对应的附表数据 + eduFaceGroupStrategyPlanService.remove(Wrappers.lambdaQuery(new EduFaceGroupStrategyPlan()) + .eq(EduFaceGroupStrategyPlan::getFaceGroupStrategyId, strategySaveDTO.getStrategyId())); + eduFaceGroupStrategyPlanTimeService.remove(Wrappers.lambdaQuery(new EduFaceGroupStrategyPlanTime()) + .eq(EduFaceGroupStrategyPlanTime::getFaceGroupStrategyId, strategySaveDTO.getStrategyId())); + + eduFaceGroupStrategySpecialDateService.remove(Wrappers.lambdaQuery(new EduFaceGroupStrategySpecialDate()) + .eq(EduFaceGroupStrategySpecialDate::getFaceGroupStrategyId, strategySaveDTO.getStrategyId())); + eduFaceGroupStrategySpecialTimeService.remove(Wrappers.lambdaQuery(new EduFaceGroupStrategySpecialTime()) + .eq(EduFaceGroupStrategySpecialTime::getFaceGroupStrategyId, strategySaveDTO.getStrategyId())); + } + saveOrUpdate(groupStrategy); + + if (CollUtil.isNotEmpty(strategySaveDTO.getPlanList())) { + // 处理通行计划 + for (StrategyPlanSaveDTO planDTO : strategySaveDTO.getPlanList()) { + EduFaceGroupStrategyPlan strategyPlan = new EduFaceGroupStrategyPlan(); + strategyPlan.setFaceGroupId(strategySaveDTO.getFaceGroupId()); + strategyPlan.setFaceGroupStrategyId(groupStrategy.getId()); + strategyPlan.setUniqueCode(planDTO.getUniqueCode()); + eduFaceGroupStrategyPlanService.save(strategyPlan); + + List planTimeList = new ArrayList<>(); + // 处理时间 + for (StrategyPlanTimeSaveDTO timeDTO : planDTO.getPlanTimeList()) { + EduFaceGroupStrategyPlanTime strategyPlanTime = new EduFaceGroupStrategyPlanTime(); + strategyPlanTime.setFaceGroupId(strategySaveDTO.getFaceGroupId()); + strategyPlanTime.setFaceGroupStrategyId(groupStrategy.getId()); + strategyPlanTime.setFaceGroupStrategyPlanId(strategyPlan.getId()); + strategyPlanTime.setPlanStartTime(timeDTO.getPlanStartTime()); + strategyPlanTime.setPlanEndTime(timeDTO.getPlanEndTime()); + planTimeList.add(strategyPlanTime); + + eduFaceGroupStrategyPlanTimeService.save(strategyPlanTime); + } + + // 处理一周的通行计划 + if (strategyPlan.getUniqueCode().equals(strategySaveDTO.getMondayUniqueCode())) { + // 周一 + groupStrategy.setMondayPlanId(strategyPlan.getId()); + groupStrategy.setMondayTimeList(planTimeList); + } + if (strategyPlan.getUniqueCode().equals(strategySaveDTO.getTuesdayUniqueCode())) { + // 周二 + groupStrategy.setTuesdayPlanId(strategyPlan.getId()); + groupStrategy.setTuesdayTimeList(planTimeList); + } + if (strategyPlan.getUniqueCode().equals(strategySaveDTO.getWednesdayUniqueCode())) { + // 周三 + groupStrategy.setWednesdayPlanId(strategyPlan.getId()); + groupStrategy.setWednesdayTimeList(planTimeList); + } + if (strategyPlan.getUniqueCode().equals(strategySaveDTO.getThursdayUniqueCode())) { + // 周四 + groupStrategy.setThursdayPlanId(strategyPlan.getId()); + groupStrategy.setThursdayTimeList(planTimeList); + } + if (strategyPlan.getUniqueCode().equals(strategySaveDTO.getFridayUniqueCode())) { + // 周五 + groupStrategy.setFridayPlanId(strategyPlan.getId()); + groupStrategy.setFridayTimeList(planTimeList); + } + if (strategyPlan.getUniqueCode().equals(strategySaveDTO.getSaturdayUniqueCode())) { + // 周六 + groupStrategy.setSaturdayPlanId(strategyPlan.getId()); + groupStrategy.setSaturdayTimeList(planTimeList); + } + if (strategyPlan.getUniqueCode().equals(strategySaveDTO.getSundayUniqueCode())) { + // 周日 + groupStrategy.setSundayPlanId(strategyPlan.getId()); + groupStrategy.setSundayTimeList(planTimeList); + } + } + } + List specialDateList = new ArrayList<>(); + if (CollUtil.isNotEmpty(strategySaveDTO.getSpecialList())) { + // 处理特殊日期 + for (StrategySpecialDateSaveDTO specialDateSaveDTO : strategySaveDTO.getSpecialList()) { + if (Objects.isNull(specialDateSaveDTO.getSpecialStartDate())) { + continue; + } + EduFaceGroupStrategySpecialDate specialDate = new EduFaceGroupStrategySpecialDate(); + specialDate.setFaceGroupId(strategySaveDTO.getFaceGroupId()); + specialDate.setFaceGroupStrategyId(groupStrategy.getId()); + specialDate.setSpecialStartDate(specialDateSaveDTO.getSpecialStartDate()); + specialDate.setSpecialEndDate(specialDateSaveDTO.getSpecialEndDate()); + eduFaceGroupStrategySpecialDateService.save(specialDate); + // 处理特殊日期时间 + List specialTimeList = new ArrayList<>(); + for (StrategySpecialTimeSaveDTO specialTimeSaveDTO : specialDateSaveDTO.getSpecialTimeList()) { + EduFaceGroupStrategySpecialTime specialTime = new EduFaceGroupStrategySpecialTime(); + specialTime.setFaceGroupId(strategySaveDTO.getFaceGroupId()); + specialTime.setFaceGroupStrategyId(groupStrategy.getId()); + specialTime.setFaceGroupStrategySpecialDateId(specialDate.getId()); + specialTime.setSpecialStartTime(specialTimeSaveDTO.getSpecialStartTime()); + specialTime.setSpecialEndTime(specialTimeSaveDTO.getSpecialEndTime()); + eduFaceGroupStrategySpecialTimeService.save(specialTime); + specialTimeList.add(specialTime); + } + specialDate.setSpecialTimeList(specialTimeList); + specialDateList.add(specialDate); + } + } + groupStrategy.setSpecialDateList(specialDateList); + // 处理一周的通行计划 + baseMapper.updateWeekPlan(groupStrategy); + // 设置设备信息 + groupStrategy.setGroupDeviceList(list); + // 设置人员信息 + List groupUserList = eduFaceGroupUserService.list(Wrappers.lambdaQuery(new EduFaceGroupUser()) + .eq(EduFaceGroupUser::getFaceGroupId, groupStrategy.getFaceGroupId()) + // 查询已下发人脸 + .eq(EduFaceGroupUser::getStatus, 1) + ); + groupStrategy.setGroupUserList(groupUserList); + // 保存策略并绑定人员信息 + remoteAttendanceStrategyService.saveStrategyAndUser(groupStrategy); + } +} diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduFaceGroupStrategySpecialDateServiceImpl.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduFaceGroupStrategySpecialDateServiceImpl.java new file mode 100644 index 0000000..5d7eaf7 --- /dev/null +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduFaceGroupStrategySpecialDateServiceImpl.java @@ -0,0 +1,32 @@ +package com.yida.data.user.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.user.EduFaceGroupStrategySpecialDate; +import com.yida.data.user.mapper.EduFaceGroupStrategySpecialDateMapper; +import com.yida.data.user.service.EduFaceGroupStrategySpecialDateService; +import com.yida.data.user.vo.StrategySpecialDateVO; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * 人脸组-策略-特殊日期Service实现 + * + * @author ZYJ + * @date 2022-12-26 13:57:32 + */ +@Slf4j +@Service +@RequiredArgsConstructor +@Transactional(rollbackFor = Exception.class) +public class EduFaceGroupStrategySpecialDateServiceImpl extends ServiceImpl + implements EduFaceGroupStrategySpecialDateService { + + @Override + public List listStrategySpecialDate(Long strategyId) { + return baseMapper.listStrategySpecialDate(strategyId); + } +} diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduFaceGroupStrategySpecialTimeServiceImpl.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduFaceGroupStrategySpecialTimeServiceImpl.java new file mode 100644 index 0000000..6e857c9 --- /dev/null +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduFaceGroupStrategySpecialTimeServiceImpl.java @@ -0,0 +1,27 @@ +package com.yida.data.user.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.user.EduFaceGroupStrategySpecialTime; +import com.yida.data.user.mapper.EduFaceGroupStrategySpecialTimeMapper; +import com.yida.data.user.service.EduFaceGroupStrategySpecialTimeService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * 人脸组-策略-特殊日期-时间Service实现 + * + * @author ZYJ + * @date 2022-12-26 13:57:32 + */ +@Slf4j +@Service +@RequiredArgsConstructor +@Transactional(rollbackFor = Exception.class) +public class EduFaceGroupStrategySpecialTimeServiceImpl extends ServiceImpl + implements EduFaceGroupStrategySpecialTimeService { + + + +} diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduFaceGroupUserServiceImpl.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduFaceGroupUserServiceImpl.java index 78043d6..f0465cf 100644 --- a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduFaceGroupUserServiceImpl.java +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduFaceGroupUserServiceImpl.java @@ -2,6 +2,7 @@ package com.yida.data.user.service.impl; import cc.mrbird.febs.common.redis.service.RedisService; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; @@ -10,28 +11,40 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.yida.data.attendance.dto.IssuedFaceDTO; import com.yida.data.attendance.dto.RemoveFaceDTO; import com.yida.data.attendance.feign.RemoteAttendanceDeviceService; +import com.yida.data.attendance.feign.RemoteAttendanceStrategyService; import com.yida.data.common.core.entity.CurrentUser; +import com.yida.data.common.core.entity.Dict; import com.yida.data.common.core.entity.attendance.EduAttendanceDevice; import com.yida.data.common.core.entity.constant.CachePrefixConstant; import com.yida.data.common.core.entity.constant.LockPrefixConstant; import com.yida.data.common.core.entity.user.*; import com.yida.data.common.core.enums.DeviceType; +import com.yida.data.common.core.enums.IssuedTypeEnum; +import com.yida.data.common.core.exception.FebsException; import com.yida.data.common.core.utils.Asserts; +import com.yida.data.common.service.CommonService; import com.yida.data.user.dto.*; import com.yida.data.user.mapper.EduFaceGroupUserMapper; +import com.yida.data.user.mapper.EduStudentApplyMapper; +import com.yida.data.user.mapper.EduStudentMapper; import com.yida.data.user.mapper.EduUserDeviceMapper; import com.yida.data.user.service.EduFaceGroupDeviceService; +import com.yida.data.user.service.EduFaceGroupStrategyService; import com.yida.data.user.service.EduFaceGroupUserService; +import com.yida.data.user.service.EduStudentService; import com.yida.data.user.service.EduUserDeptService; +import com.yida.data.user.vo.OutPageStudentVO; import com.yida.data.user.vo.UserFacePageVO; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import javax.annotation.Resource; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -40,6 +53,7 @@ import java.util.stream.Collectors; * @author zhanghaijun * @date 2021-06-16 14:13:31 */ +@Slf4j @Service @RequiredArgsConstructor @Transactional @@ -52,20 +66,31 @@ public class EduFaceGroupUserServiceImpl extends ServiceImpl private final RemoteAttendanceDeviceService remoteAttendanceDeviceService; private final EduUserDeptService eduUserDeptService; + private final EduFaceGroupStrategyService eduFaceGroupStrategyService; + private final RemoteAttendanceStrategyService remoteAttendanceStrategyService; + + private final EduStudentMapper eduStudentMapper; + private final EduStudentApplyMapper eduStudentApplyMapper; + private final CommonService commonService; + + @Override public IPage listUserFacePage(FaceGroupUserPageDTO dto) { return baseMapper.listUserFacePage(dto.toPage(), dto); } @Override - public IPage listStudentNotImport(Page page, Long deptId, Integer type, Integer sex, - String keyword, Long schoolId, Long groupId, Long dormId, Long dormRoomId) { - List classId = null; - if (deptId != null) { - Long[] deptIds = new Long[]{deptId}; - classId = this.eduUserDeptService.listClassByDept(Arrays.asList(deptIds)); - } - return baseMapper.listStudentNotImport(page, classId, type, sex, keyword, schoolId, groupId, dormId, dormRoomId); + public IPage listStudentNotImport( + Page page, Long deptId, Integer type, Integer sex, + String keyword, Long schoolId, Long groupId, Long dormId, Long dormRoomId, + Long campusId, Long sectionId, Long gradeId, Long classId) { +// List classIds = null; +// if (deptId != null) { +// Long[] deptIds = new Long[]{deptId}; +// classId = eduUserDeptService.listClassByDept(Arrays.asList(deptIds)); +// } + return baseMapper.listStudentNotImport(page, type, sex, keyword, schoolId, groupId, dormId, dormRoomId, + campusId, sectionId, gradeId, classId); } @Override @@ -75,9 +100,12 @@ public class EduFaceGroupUserServiceImpl extends ServiceImpl } @Override - public void saveAllStudent(List classId, Integer type, Integer sex, String keyword, Long schoolId, Long groupId, - Long dormId, Long dormRoomId) { - List studentList = baseMapper.listStudentNotImport(classId, type, sex, keyword, schoolId, groupId, dormId, dormRoomId); + public void saveAllStudent(Integer type, Integer sex, String keyword, Long schoolId, Long groupId, + Long dormId, Long dormRoomId, + Long campusId, Long sectionId, Long gradeId, Long classId) { + List studentList = baseMapper + .listStudentNotImport(type, sex, keyword, schoolId, groupId, dormId, dormRoomId, + campusId, sectionId, gradeId, classId); if (CollUtil.isNotEmpty(studentList)) { List saveUser = new ArrayList<>(); for (Long userId : studentList.stream().map(EduStudent::getId).collect(Collectors.toList())) { @@ -97,7 +125,7 @@ public class EduFaceGroupUserServiceImpl extends ServiceImpl List staffList = baseMapper.listStaffNotImport(sex, keyword, schoolId, groupId); if (CollUtil.isNotEmpty(staffList)) { List saveUser = new ArrayList<>(); - for (Long userId : staffList.stream().map(x -> x.getId()).collect(Collectors.toList())) { + for (Long userId : staffList.stream().map(EduStaff::getId).collect(Collectors.toList())) { EduFaceGroupUser eduFaceGroupUser = new EduFaceGroupUser(); eduFaceGroupUser.setUserId(userId); eduFaceGroupUser.setUserType(1); @@ -130,6 +158,8 @@ public class EduFaceGroupUserServiceImpl extends ServiceImpl List alreadyIssued = list( Wrappers.lambdaQuery(new EduFaceGroupUser()).in(EduFaceGroupUser::getId, dto.getFaceIds()) .eq(EduFaceGroupUser::getStatus, 1)); + List userList = list( + Wrappers.lambdaQuery(new EduFaceGroupUser()).in(EduFaceGroupUser::getId, dto.getFaceIds())); // 删除和人脸组的关联关系 removeByIds(dto.getFaceIds()); // 已下发的人要删除下发记录 @@ -145,7 +175,7 @@ public class EduFaceGroupUserServiceImpl extends ServiceImpl // 删除用户在此人脸组的下发记录 for (Map.Entry> entry : issuedMap.entrySet()) { Integer userType = entry.getKey(); - List userIds = entry.getValue().stream().map(x -> x.getUserId()).collect(Collectors.toList()); + List userIds = entry.getValue().stream().map(EduFaceGroupUser::getUserId).collect(Collectors.toList()); LambdaQueryWrapper condition = Wrappers.lambdaQuery(new EduUserDevice()) .in(EduUserDevice::getUserId, userIds) .eq(EduUserDevice::getUserType, userType); @@ -162,6 +192,26 @@ public class EduFaceGroupUserServiceImpl extends ServiceImpl remoteAttendanceDeviceService.removeFace(removeFaceDTO); } } + // 查询关联的设备信息 + List list = eduFaceGroupDeviceService.list( + Wrappers.lambdaQuery(new EduFaceGroupDevice()).eq(EduFaceGroupDevice::getFaceGroupId, dto.getFaceGroupId())); + if (CollUtil.isEmpty(list)) { + return; + } + + if (CollUtil.isNotEmpty(alreadyIssued)) { + // 删除对应的人员-策略关系 + EduFaceGroupStrategy eduFaceGroupStrategy = new EduFaceGroupStrategy(); + eduFaceGroupStrategy.setFaceGroupId(dto.getFaceGroupId()); + eduFaceGroupStrategy.setGroupDeviceList(list); + eduFaceGroupStrategy.setGroupUserList(userList); + remoteAttendanceStrategyService.unBindUserStrategy(eduFaceGroupStrategy); +// // 移除对应的缓存 +// for (EduFaceGroupUser groupUser : userList) { +// redisService.hdel(CachePrefixConstant.USER_ATTENDANCE_STRATEGY + +// groupUser.getUserId().toString() + groupUser.getUserType().toString(), String.valueOf(dto.getFaceGroupId())); +// } + } } @Override @@ -203,18 +253,59 @@ public class EduFaceGroupUserServiceImpl extends ServiceImpl ? baseMapper.listUserFace(dto.getIds()) : baseMapper.listUserFaceByGroup(dto.getFaceGroupId()); Asserts.isTrue(CollUtil.isNotEmpty(faceList), "请上传人脸!"); + // 更新下发状态 update(Wrappers.lambdaUpdate(new EduFaceGroupUser()) - .in(EduFaceGroupUser::getId, faceList.stream().map(x -> x.getFaceGroupUserId()).collect(Collectors.toList())) + .in(EduFaceGroupUser::getId, faceList.stream().map(EduUserFace::getFaceGroupUserId).collect(Collectors.toList())) .set(EduFaceGroupUser::getStatus, EduFaceGroupUser.ISSUING)); + Dict dict = commonService.getDictByTypeAndValueOrLabel("apply_type", null, "食堂消费"); + DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); for (EduUserFace face : faceList) { +// log.info("下发人脸信息:{}", face); face.setFaceGroupUserId(dto.getFaceGroupId()); + //添加学生IC卡号,是否是会员 + if (face.getUserType() == 0) { +// EduStudent student = (EduStudent) redisService +// .hget(CachePrefixConstant.STUDENT_DATA, face.getUserId().toString()); +// if (ObjectUtil.isNull(student)) { +// student = eduStudentMapper.selectById(face.getUserId()); +// } + EduStudent student = eduStudentMapper.selectById(face.getUserId()); + log.info("下发学生信息:{}", student); + if (ObjectUtil.isNotNull(student)) { + face.setRfidCard(student.getStuCardNumber()); + } + //查询会员信息 + if (Objects.isNull(dict)) { + throw new FebsException("当前学校暂不支持此功能"); + } + // 查询是否是会员 + EduStudentApply studentApply = eduStudentApplyMapper + .getStudentApply(face.getUserId(), dict.getValue()); + if (ObjectUtil.isNotNull(studentApply)) { + face.setNotes(1); + face.setCardValidBegin(studentApply.getStartTime().format(fmt)); + face.setCardValidEnd(studentApply.getEndTime().format(fmt)); + } else { + face.setNotes(0); + } + } else { + face.setNotes(1); + face.setCardValidBegin("2023-01-01 00:00:00"); + face.setCardValidEnd("2123-01-01 00:00:00"); + } } IssuedFaceDTO issuedFaceDTO = new IssuedFaceDTO(); issuedFaceDTO.setUserFaceList(faceList); issuedFaceDTO.setDeviceList(deviceIds); - issuedFaceDTO.setType(0); +// issuedFaceDTO.setType(0); issuedFaceDTO.setGroupId(dto.getFaceGroupId()); + // 判断是否有策略信息 + EduFaceGroupStrategy groupStrategy = eduFaceGroupStrategyService.getOne(Wrappers.lambdaQuery(new EduFaceGroupStrategy()) + .eq(EduFaceGroupStrategy::getFaceGroupId, dto.getFaceGroupId())); + issuedFaceDTO.setGroupStrategy(groupStrategy); + // 人脸组下发 + issuedFaceDTO.setIssuedTypeEnum(IssuedTypeEnum.FACE_GROUP); // 调用设备进行下发 remoteAttendanceDeviceService.issuedFace(issuedFaceDTO); } diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduSchoolStudentInformationServiceImpl.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduSchoolStudentInformationServiceImpl.java index 57a3515..73f3b4e 100644 --- a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduSchoolStudentInformationServiceImpl.java +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduSchoolStudentInformationServiceImpl.java @@ -221,7 +221,7 @@ public class EduSchoolStudentInformationServiceImpl extends public void downloadTemplate(Integer type, HttpServletResponse response) throws Exception { String fileName = - type.equals(ImportTemplateTypeEnum.WELCOME_STUDENT_TEMPLATE.getType()) ? "智慧迎新数据导入模板.xls" : "一键邀请导入模板.xls"; + type.equals(ImportTemplateTypeEnum.WELCOME_STUDENT_TEMPLATE.getType()) ? "智慧迎新数据导入模板.xls" : "学生基础信息导入模板.xls"; // 获取导入文件模板 ClassPathResource classPathResource = new ClassPathResource("template/" + fileName); InputStream inputStream = classPathResource.getInputStream(); @@ -229,7 +229,7 @@ public class EduSchoolStudentInformationServiceImpl extends } /** - * 导入一键邀请数据(导入学生基本信息) + * 导入学生基础信息 * * @param fileUrl 导入的excel文件地址 * @param schoolId 学校id diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduStaffServiceImpl.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduStaffServiceImpl.java index 2ad200e..0f73a13 100644 --- a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduStaffServiceImpl.java +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduStaffServiceImpl.java @@ -2,7 +2,6 @@ package com.yida.data.user.service.impl; import cc.mrbird.febs.common.redis.service.RedisService; import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.file.FileWriter; import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.ObjectUtil; @@ -11,22 +10,30 @@ import cn.hutool.core.util.ZipUtil; import cn.hutool.json.JSONArray; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; +import com.alibaba.excel.EasyExcel; import com.alibaba.excel.support.ExcelTypeEnum; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.common.ResultMsgType; +import com.yida.data.common.core.common.ResultStatusType; import com.yida.data.common.core.entity.CurrentUser; import com.yida.data.common.core.entity.constant.AppConstant; import com.yida.data.common.core.entity.constant.CachePrefixConstant; +import com.yida.data.common.core.entity.constant.FebsConstant; +import com.yida.data.common.core.entity.school.EduSchoolStudentInformation; import com.yida.data.common.core.entity.school.EduYidaAppAccount; import com.yida.data.common.core.entity.system.Dept; import com.yida.data.common.core.entity.system.EduApp; import com.yida.data.common.core.entity.system.EduYidaApp; import com.yida.data.common.core.entity.system.SystemUser; import com.yida.data.common.core.entity.system.enums.DeptTypeEnum; +import com.yida.data.common.core.entity.system.enums.RoleEnum; import com.yida.data.common.core.entity.user.*; +import com.yida.data.common.core.entity.user.enums.UserDeptTypeEnum; import com.yida.data.common.core.enums.RoleName; import com.yida.data.common.core.exception.FebsException; import com.yida.data.common.core.utils.*; @@ -39,6 +46,10 @@ import com.yida.data.user.dto.DelFaceGroupUserDTO; import com.yida.data.user.dto.ListStaffDTO; import com.yida.data.user.dto.PageTeacherDTO; import com.yida.data.user.dto.StaffExportDTO; +import com.yida.data.user.dto.StaffImportDTO; +import com.yida.data.user.dto.WelcomeStudentImportDTO; +import com.yida.data.user.excel.StaffDataExcelListener; +import com.yida.data.user.excel.WelcomeStudentDataExcelListener; import com.yida.data.user.feign.RemoteUserDeptService; import com.yida.data.user.mapper.EduCourseMapper; import com.yida.data.user.mapper.EduStaffDeptMapper; @@ -47,17 +58,23 @@ import com.yida.data.user.mapper.EduTeacherDeptMapper; import com.yida.data.user.service.*; import com.yida.data.user.vo.*; import io.seata.spring.annotation.GlobalTransactional; +import java.io.InputStream; +import java.time.LocalDateTime; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.ehcache.impl.internal.concurrent.ConcurrentHashMap; import org.springframework.beans.BeanUtils; +import org.springframework.core.io.ClassPathResource; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; import org.springframework.util.StopWatch; import javax.servlet.http.HttpServletResponse; @@ -68,6 +85,7 @@ import java.net.URLEncoder; import java.util.*; import java.util.Map.Entry; import java.util.stream.Collectors; +import org.springframework.web.multipart.MultipartFile; @Slf4j @Service @@ -93,6 +111,7 @@ public class EduStaffServiceImpl extends ServiceImpl i private final PasswordEncoder passwordEncoder; private final RedisService redisService; private final WxUtil wxUtil; + private final WxServiceProviderUtil wxServiceProviderUtil; private final EduTeacherDeptMapper eduTeacherDeptMapper; private final CommonService commonService; @@ -176,7 +195,7 @@ public class EduStaffServiceImpl extends ServiceImpl i @GlobalTransactional public void saveTeacher(Integer operation, EduStaff eduStaff) { List existDeptList = eduTeacherDeptService.list( - Wrappers.lambdaQuery(new EduTeacherDept()).eq(EduTeacherDept::getTeacherId, eduStaff.getId())); + Wrappers.lambdaQuery(new EduTeacherDept()).eq(EduTeacherDept::getTeacherId, eduStaff.getId())); if (operation == 0) { Asserts.isTrue(CollUtil.isEmpty(existDeptList), "该教师已存在"); } @@ -185,6 +204,11 @@ public class EduStaffServiceImpl extends ServiceImpl i Dept school = commonService.getDept(staff.getSchoolId()); // 绑定了微信 String accessToken = null; + // 明文userId + // 当代开发情况下,此处的职工(教师id)需要转换成明文才能调用 + String plainUserId = null; + EduApp appSelect = commonService.getAppContactUsedBySelect(staff.getSchoolId()); + if (school.getSchoolType().contains(Dept.TYPE_QYWX)) { EduApp app = commonService.getAppByCodeAndSchool(AppConstant.CONTACT_SCHOOL, null, staff.getSchoolId()); accessToken = wxUtil.getAccessToken(app.getWxCorpId(), app.getWxSecret()); @@ -209,9 +233,14 @@ public class EduStaffServiceImpl extends ServiceImpl i break; } if (deptId != null) { - eduTeacherDept.setDeptWxId(eduUserDeptService.getById(deptId).getWxId()); - eduTeacherDept.setTeacherWxId(staff.getWxId()); - wxUtil.deleteSchoolDeptUser(accessToken, eduTeacherDept); + EduUserDept userDept = eduUserDeptService.getById(deptId); + if (Objects.nonNull(userDept)) { + // 删除企业微信已有关联部门数据 + eduTeacherDept.setDeptWxId(userDept.getWxId()); + plainUserId = commonService.getPlainUserId(staff.getWxId(), school.getDeptId(), appSelect); + eduTeacherDept.setTeacherWxId(plainUserId); + wxUtil.deleteSchoolDeptUser(accessToken, eduTeacherDept); + } } } } @@ -249,7 +278,10 @@ public class EduStaffServiceImpl extends ServiceImpl i break; } teacherDept.setDeptWxId(eduUserDeptService.getById(deptId).getWxId()); - teacherDept.setTeacherWxId(staff.getWxId()); + if (StringUtils.isEmpty(plainUserId)) { + plainUserId = commonService.getPlainUserId(staff.getWxId(), school.getDeptId(), appSelect); + } + teacherDept.setTeacherWxId(plainUserId); wxUtil.updateUserDeptTeacherInfo(accessToken, teacherDept); } teacherDept.setTeacherId(staff.getId()); @@ -322,18 +354,166 @@ public class EduStaffServiceImpl extends ServiceImpl i return teacherClassVOS; } + @Override + public List listClassIdByStaffId() { + CurrentUser currentUser = FebsUtil.getCurrentUser(); + List resultList = new ArrayList<>(); + List parentIdList = new ArrayList<>(); + //根据sysUserId查询staffId + EduStaff staff = this.getOne(Wrappers.lambdaQuery(new EduStaff()) + .eq(EduStaff::getSchoolId, FebsUtil.getTopDeptId()) + .eq(EduStaff::getSysUserId, currentUser.getUserId())); + + //任课老师 + if (currentUser.getRolePerms().contains(RoleEnum.ROLE_TEACHER.getValue())) { + resultList.addAll( + baseMapper.listDeptByTeacher(staff.getId(), 4).stream().map(TeacherDeptVO::getClassId) + .collect(Collectors.toList())); + } + //班主任 + if (currentUser.getRolePerms().contains(RoleEnum.ROLE_CLASS_PRINCIPAL.getValue())) { + resultList.addAll( + baseMapper.listDeptByTeacher(staff.getId(), 3).stream().map(TeacherDeptVO::getClassId) + .collect(Collectors.toList())); + } + //年级主任 + if (currentUser.getRolePerms().contains(RoleEnum.ROLE_GRADE_PRINCIPAL.getValue())) { + List gradeIdList = baseMapper.listDeptByTeacher(staff.getId(), 2).stream() + .map(TeacherDeptVO::getGradeId) + .collect(Collectors.toList()); + parentIdList.addAll(gradeIdList); + } + //学段主任 + if (currentUser.getRolePerms().contains(RoleEnum.ROLE_SECTION_PRINCIPAL.getValue())) { + List sectionIdList = baseMapper.listDeptByTeacher(staff.getId(), 5).stream() + .map(TeacherDeptVO::getSectionId) + .collect(Collectors.toList()); + parentIdList.addAll(sectionIdList); + + } + //学区主任 + if (currentUser.getRolePerms().contains(RoleEnum.ROLE_CAMPUS_PRINCIPAL.getValue())) { + List campusIdList = baseMapper.listDeptByTeacher(staff.getId(), 1).stream() + .map(TeacherDeptVO::getCampusId) + .collect(Collectors.toList()); + parentIdList.addAll(campusIdList); + } + + List resultDeptList = new ArrayList<>(); + if (CollUtil.isNotEmpty(parentIdList)) { + List childIdByParentAndType = eduUserDeptService + .findChildIdByParentAndType(parentIdList, 1, resultDeptList); + resultList.addAll(childIdByParentAndType.stream().map(EduUserDept::getDeptId).collect(Collectors.toList())); + } + return resultList; + } + + @Override + public List listStaffRolesByStaffId(Long staffId) { + return eduTeacherDeptMapper.findType(staffId); + } + + @Override + public List listDeptByStaffId(Long staffId) { + CurrentUser currentUser = FebsUtil.getCurrentUser(); + List resultList = new ArrayList<>(); + //班主任 + if (currentUser.getRolePerms().contains(RoleEnum.ROLE_CLASS_PRINCIPAL.getValue())) { + List classList = baseMapper.listDeptByTeacher(staffId, 3); + resultList.addAll(classList); + } + //年级主任 + if (currentUser.getRolePerms().contains(RoleEnum.ROLE_GRADE_PRINCIPAL.getValue())) { + List gradeList = baseMapper.listDeptByTeacher(staffId, 2); + resultList.addAll(gradeList); + } + //学段主任 + if (currentUser.getRolePerms().contains(RoleEnum.ROLE_SECTION_PRINCIPAL.getValue())) { + List sectionList = baseMapper.listDeptByTeacher(staffId, 5); + resultList.addAll(sectionList); + } + //学区主任 + if (currentUser.getRolePerms().contains(RoleEnum.ROLE_CAMPUS_PRINCIPAL.getValue())) { + List campusList = baseMapper.listDeptByTeacher(staffId, 1); + resultList.addAll(campusList); + } +// List teacherClassVOS = new ArrayList<>(); +// List teacherDeptVOS = baseMapper.listDeptByTeacher(staffId, type); + + resultList.forEach(teacherDeptVO -> { + Integer type = teacherDeptVO.getType(); + switch (type) { + case 1: + EduUserDept campus = remoteUserDeptService.getByDeptId(teacherDeptVO.getCampusId()).getData(); + teacherDeptVO.setCampusName(campus.getDeptName()); + break; + case 2: + EduUserDept campus_g = remoteUserDeptService.getByDeptId(teacherDeptVO.getCampusId()).getData(); + teacherDeptVO.setCampusName(campus_g.getDeptName()); + EduUserDept grade = remoteUserDeptService.getByDeptId(teacherDeptVO.getGradeId()).getData(); + teacherDeptVO.setGradeName(grade.getDeptName()); + break; + case 3: + EduUserDept campus_c = remoteUserDeptService.getByDeptId(teacherDeptVO.getCampusId()).getData(); + teacherDeptVO.setCampusName(campus_c.getDeptName()); + EduUserDept grade_c = remoteUserDeptService.getByDeptId(teacherDeptVO.getGradeId()).getData(); + teacherDeptVO.setGradeName(grade_c.getDeptName()); + EduUserDept clazz = remoteUserDeptService.getByDeptId(teacherDeptVO.getClassId()).getData(); + teacherDeptVO.setClassName(clazz.getDeptName()); + break; + case 5: + EduUserDept campus_s = remoteUserDeptService.getByDeptId(teacherDeptVO.getCampusId()).getData(); + teacherDeptVO.setCampusName(campus_s.getDeptName()); + +// EduUserDept campus_s = remoteUserDeptService.getByDeptId(teacherDeptVO.getCampusId()).getData(); +// teacherDeptVO.setCampusName(campus_s.getDeptName()); + + } + }); + + for (TeacherDeptVO dept : resultList) { +// TeacherClassVO teacherClassVO = new TeacherClassVO(); +// teacherClassVO.setType(dept.getType()); + Long deptId = null; + if (dept.getType() == 1) { + //校区 + deptId = dept.getCampusId(); + } else if (dept.getType() == 2) { + deptId = dept.getGradeId(); + } else if (dept.getType() == 3) { + deptId = dept.getClassId(); + } else if (dept.getType() == 5) { + deptId = dept.getSectionId(); + } +// EduUserDept eduUserDept = remoteUserDeptService.getByDeptId(deptId).getData(); +// teacherClassVO.setDeptId(eduUserDept.getDeptId()); +// teacherClassVO.setDeptName(eduUserDept.getDeptName()); +// teacherClassVOS.add(teacherClassVO); + } + return null; + } + @Override public void delStaffBatch(List staffIds) { List staffList = list(Wrappers.lambdaQuery(new EduStaff()).in(EduStaff::getId, staffIds)); // 删除人脸相关信息 List faceList = - eduFaceGroupUserService.list(Wrappers.lambdaQuery() - .eq(EduFaceGroupUser::getUserType, 1) - .in(EduFaceGroupUser::getUserId, staffIds)); + eduFaceGroupUserService.list(Wrappers.lambdaQuery() + .eq(EduFaceGroupUser::getUserType, 1) + .in(EduFaceGroupUser::getUserId, staffIds)); if (CollUtil.isNotEmpty(faceList)) { - eduFaceGroupUserService.delUserBatch(DelFaceGroupUserDTO.builder() - .faceIds(faceList.stream().map(EduFaceGroupUser::getId).collect(Collectors.toList())).build()); +// eduFaceGroupUserService.delUserBatch(DelFaceGroupUserDTO.builder() +// .faceIds(faceList.stream().map(EduFaceGroupUser::getId).collect(Collectors.toList())).build()); + // 分组处理数据 + Map> faceGroupMap = faceList.stream().collect( + Collectors.groupingBy(EduFaceGroupUser::getFaceGroupId)); + faceGroupMap.forEach((faceGroupId, userList) -> + eduFaceGroupUserService.delUserBatch(DelFaceGroupUserDTO.builder() + .faceGroupId(faceGroupId) + .faceIds(userList.stream().map(EduFaceGroupUser::getId).collect(Collectors.toList())) + .build()) + ); } removeByIds(staffIds); @@ -347,18 +527,20 @@ public class EduStaffServiceImpl extends ServiceImpl i // boolean containsDahua = school.getSchoolType().contains(Dept.TYPE_DAHUA); // 绑定了微信 if (containsWx) { - EduApp eduApp = commonService.getAppByCodeAndSchool(AppConstant.CONTACT, null, schoolId); - String wxAccessToken = wxUtil.getAccessToken(eduApp.getWxCorpId(), eduApp.getWxSecret()); - wxUtil.deleteUser(wxAccessToken, - staffList.stream().filter(x -> StrUtil.isNotBlank(x.getWxId()) && x.getWxPath() == 0).map(EduStaff::getWxId) - .collect(Collectors.toList())); + List staffWxIdList = staffList.stream().filter(x -> StrUtil.isNotBlank(x.getWxId()) && x.getWxPath() == 0) + .map(EduStaff::getWxId) + .collect(Collectors.toList()); + if (CollUtil.isNotEmpty(staffWxIdList)) { + String wxAccessToken = commonService.getAddressListToken(schoolId); + wxUtil.deleteUser(wxAccessToken, staffWxIdList); + } } // 绑定了易达app if (containsYida) { EduYidaApp yidaApp = commonService.getYidaApp(schoolId); EduYidaAppAccount yidaAppAccount = commonService.getYidaAppAccount(schoolId, 1); staffList.stream().map(EduStaff::getYidaAppUserId).filter(StrUtil::isNotBlank) - .forEach(x -> AppUtil.subscribeUnFollow(yidaAppAccount.getYidaAppAccountId(), x, yidaApp)); + .forEach(x -> AppUtil.subscribeUnFollow(yidaAppAccount.getYidaAppAccountId(), x, yidaApp)); } // // 绑定了大华 // if (containsDahua) { @@ -375,10 +557,12 @@ public class EduStaffServiceImpl extends ServiceImpl i eduTeacherDeptService.remove(Wrappers.lambdaQuery(new EduTeacherDept()).in(EduTeacherDept::getTeacherId, teacherIds)); for (EduStaff teacher : listByIds(teacherIds)) { remoteUserService.updateUserRoleByRoleName(teacher.getSysUserId(), - Collections.singletonList(RoleName.STAFF.getName())); + Collections.singletonList(RoleName.STAFF.getName())); } - log.info("处理微信"); + if (school.getSchoolType().contains(Dept.TYPE_QYWX) && CollUtil.isNotEmpty(teacherDepts)) { + log.info("处理企业微信删除教师信息"); + EduApp appSelect = commonService.getAppContactUsedBySelect(school.getDeptId()); // TODO: 2021/10/28 删除学校部门与教师关联信息 EduApp app = commonService.getAppByCodeAndSchool(AppConstant.CONTACT_SCHOOL, null, schoolId); String accessToken = wxUtil.getAccessToken(app.getWxCorpId(), app.getWxSecret()); @@ -401,6 +585,9 @@ public class EduStaffServiceImpl extends ServiceImpl i default: break; } + String plainUserId = commonService.getPlainUserId(teacherDept.getTeacherWxId(), school.getDeptId(), appSelect); + teacherDept.setTeacherWxId(plainUserId); + EduUserDept userDept = eduUserDeptService.getById(deptId); teacherDept.setDeptWxId(userDept.getWxId()); wxUtil.deleteSchoolDeptUser(accessToken, teacherDept); @@ -412,82 +599,98 @@ public class EduStaffServiceImpl extends ServiceImpl i @Override public void dealWxTeacherChange(Long schoolId, Long campusId, Long sectionId, Long gradeId, Long classId, - List teacherList) { + List teacherList, Long deptWxId) { // 删除部门关联信息 if (CollUtil.isNotEmpty(teacherList)) { LambdaQueryWrapper delTeacherDeptCondition = Wrappers.lambdaQuery(new EduTeacherDept()); + // 删除单个部门负责人 if (classId != null) { delTeacherDeptCondition.eq(EduTeacherDept::getClassId, classId); } else if (gradeId != null) { delTeacherDeptCondition.eq(EduTeacherDept::getGradeId, gradeId); + delTeacherDeptCondition.isNull(EduTeacherDept::getClassId); } else if (sectionId != null) { delTeacherDeptCondition.eq(EduTeacherDept::getSectionId, sectionId); + delTeacherDeptCondition.isNull(EduTeacherDept::getGradeId); + delTeacherDeptCondition.isNull(EduTeacherDept::getClassId); } else if (campusId != null) { delTeacherDeptCondition.eq(EduTeacherDept::getCampusId, campusId); + delTeacherDeptCondition.isNull(EduTeacherDept::getSectionId); + delTeacherDeptCondition.isNull(EduTeacherDept::getGradeId); + delTeacherDeptCondition.isNull(EduTeacherDept::getClassId); } else { - // 为满足条件不删除关联关系 + // 未满足条件不删除关联关系 delTeacherDeptCondition.eq(EduTeacherDept::getSchoolId, -1L); } + eduTeacherDeptService.remove(delTeacherDeptCondition); List eduTeacherDeptList = new ArrayList<>(); for (Map teacher : teacherList) { - EduTeacherDept eduTeacherDept = new EduTeacherDept(); - eduTeacherDept.setSchoolId(schoolId); - eduTeacherDept.setCampusId(campusId); - eduTeacherDept.setSectionId(sectionId); - eduTeacherDept.setGradeId(gradeId); - eduTeacherDept.setClassId(classId); + try { + EduTeacherDept eduTeacherDept = new EduTeacherDept(); + eduTeacherDept.setSchoolId(schoolId); + eduTeacherDept.setCampusId(campusId); + eduTeacherDept.setSectionId(sectionId); + eduTeacherDept.setGradeId(gradeId); + eduTeacherDept.setClassId(classId); - String teacherWxId = (String) teacher.get("userid"); - int teacherType = Integer.parseInt(teacher.get("type").toString()); - String subject = ObjectUtil.toString(teacher.get("subject")); + String teacherWxId = (String) teacher.get("userid"); + // 根据通讯录应用情况获取对应用户密文id + teacherWxId = commonService.getSecretUserId(teacherWxId, schoolId); + int teacherType = Integer.parseInt(teacher.get("type").toString()); + String subject = ObjectUtil.toString(teacher.get("subject")); - EduStaff teacherInfo = getOne( - Wrappers.lambdaQuery(new EduStaff()).eq(EduStaff::getWxId, teacherWxId).eq(EduStaff::getSchoolId, schoolId)); - if (teacherInfo == null) { - continue; - } - eduTeacherDept.setTeacherId(teacherInfo.getId()); - // 教师类型 - switch (teacherType) { - case 1: - eduTeacherDept.setType(1); - remoteUserService.bindRoleByUser(teacherInfo.getSysUserId(), "校区负责人"); - break; - case 2: - eduTeacherDept.setType(2); - remoteUserService.bindRoleByUser(teacherInfo.getSysUserId(), "年级负责人"); - break; - case 3: - remoteUserService.bindRoleByUser(teacherInfo.getSysUserId(), "班主任"); - eduTeacherDept.setType(3); - break; - case 4: - remoteUserService.bindRoleByUser(teacherInfo.getSysUserId(), "任课老师"); - eduTeacherDept.setType(4); - break; - case 5: - remoteUserService.bindRoleByUser(teacherInfo.getSysUserId(), "学段负责人"); - eduTeacherDept.setType(5); - break; - default: - break; - } - // 填充部门信息 - if (StrUtil.isNotBlank(subject) && !"null".equals(subject)) { - // 科目信息 - EduCourse course = eduCourseMapper.selectOne( - Wrappers.lambdaQuery(new EduCourse()).eq(EduCourse::getSchoolId, schoolId) - .eq(EduCourse::getCourseName, subject)); - if (course == null) { - course = new EduCourse(); - course.setCourseName(subject); - course.setSchoolId(schoolId); - eduCourseMapper.insert(course); + EduStaff teacherInfo = getOne( + Wrappers.lambdaQuery(new EduStaff()).eq(EduStaff::getWxId, teacherWxId) + .eq(EduStaff::getSchoolId, schoolId)); + if (teacherInfo == null) { + continue; } - eduTeacherDept.setCourseId(course.getId()); + eduTeacherDept.setTeacherId(teacherInfo.getId()); + // 教师类型 + switch (teacherType) { + case 1: + eduTeacherDept.setType(1); + remoteUserService.bindRoleByUser(teacherInfo.getSysUserId(), "校区负责人"); + break; + case 2: + eduTeacherDept.setType(2); + remoteUserService.bindRoleByUser(teacherInfo.getSysUserId(), "年级负责人"); + break; + case 3: + remoteUserService.bindRoleByUser(teacherInfo.getSysUserId(), "班主任"); + eduTeacherDept.setType(3); + break; + case 4: + remoteUserService.bindRoleByUser(teacherInfo.getSysUserId(), "任课老师"); + eduTeacherDept.setType(4); + break; + case 5: + remoteUserService.bindRoleByUser(teacherInfo.getSysUserId(), "学段负责人"); + eduTeacherDept.setType(5); + break; + default: + break; + } + // 填充部门信息 + if (StrUtil.isNotBlank(subject) && !"null".equals(subject)) { + // 科目信息 + EduCourse course = eduCourseMapper.selectOne( + Wrappers.lambdaQuery(new EduCourse()).eq(EduCourse::getSchoolId, schoolId) + .eq(EduCourse::getCourseName, subject)); + if (course == null) { + course = new EduCourse(); + course.setCourseName(subject); + course.setSchoolId(schoolId); + eduCourseMapper.insert(course); + } + eduTeacherDept.setCourseId(course.getId()); + } + eduTeacherDeptList.add(eduTeacherDept); + } catch (Exception e) { + log.error("处理家校沟通教师数据失败: schoolId:{}, campusId: {}, sectionId:{}, gradeId:{}, classId:{}, teacher:{}", + schoolId, campusId, sectionId, gradeId, classId, teacher, e); } - eduTeacherDeptList.add(eduTeacherDept); } eduTeacherDeptService.saveBatch(eduTeacherDeptList); } @@ -504,7 +707,7 @@ public class EduStaffServiceImpl extends ServiceImpl i String cardNum = DaHuaUtil.generateCardNum(); staff.setDahuaCode(staff.getMobile()); staff.setDahuaId( - DaHuaUtil.addUser(staff.getName(), staff.getDahuaCode(), 1, 1, cardNum, null, null, null, null, null, "")); + DaHuaUtil.addUser(staff.getName(), staff.getDahuaCode(), 1, 1, cardNum, null, null, null, null, null, "")); } List eduStaffDeptList = staff.getStaffDept(); if (CollUtil.isNotEmpty(eduStaffDeptList)) { @@ -521,166 +724,212 @@ public class EduStaffServiceImpl extends ServiceImpl i } @Override - public void importStaff(String path, Long schoolId, CurrentUser currentUser, Long key, String fileName) { - try { - Dept school = commonService.getDept(schoolId); - // 解压文件到本地 - File zipFile = new File(path); - String zipPath = ZipUtil.unzip(zipFile, CharsetUtil.CHARSET_GBK).getAbsolutePath(); - Map cacheDept = new HashMap<>(); - // 循环拿到数据 - List face = FileUtil.loopFiles(zipPath, x -> { - String suffix = FileUtil.getSuffix(x); - return (!"txt".equals(suffix)) && (!"xlsx".equals(suffix)); - }); - List excel = FileUtil.loopFiles(zipPath, x -> { - String suffix = FileUtil.getSuffix(x); - return "xlsx".equals(suffix); - }); - int count = 0; - int complete = 0; - int percent = 0; - EduApp app = commonService.getAppByCodeAndSchool(AppConstant.CONTACT, null, schoolId); - ; - String token = wxUtil.getAccessToken(app.getWxCorpId(), app.getWxSecret()); - for (File file : excel) { - Workbook workbook; - try { - workbook = com.yida.data.common.core.utils.ExcelUtil.readExcel(file, "xlsx"); - } catch (IOException e) { - e.printStackTrace(); - throw new FebsException("读取职工名单失败,请重新上传"); - } - Sheet campusSheet = workbook.getSheetAt(0); - List> staffList = ExcelUtil.readData(campusSheet, 9); -// Role staffRole = remoteRoleService.getRoleByNameNoPermission("职工").getData(); - count = face.size() + staffList.size(); - List> errorData = new ArrayList<>(); - for (int i = 0; i < staffList.size(); i++) { - Map staff = staffList.get(i); - String name = ExcelUtil.getCellValue(staff.get(1)); - if (StrUtil.isBlankIfStr(name)) { - continue; - } - String alias = ExcelUtil.getCellValue(staff.get(2)); - String sex = ExcelUtil.getCellValue(staff.get(3)); - String phone = ExcelUtil.getCellValue(staff.get(4)); - String landLine = ExcelUtil.getCellValue(staff.get(5)); - String email = ExcelUtil.getCellValue(staff.get(6)); - String addr = ExcelUtil.getCellValue(staff.get(7)); - String deptName = ExcelUtil.getCellValue(staff.get(8)); - String identity = ExcelUtil.getCellValue(staff.get(9)); - String position = ExcelUtil.getCellValue(staff.get(10)); - String companyAbbre = ExcelUtil.getCellValue(staff.get(11)); - String foreignPosition = ExcelUtil.getCellValue(staff.get(12)); - - try { - EduStaff eduStaff = new EduStaff(); - //职工已存在跳过 - EduStaff existStaff = getOne(Wrappers.lambdaQuery(new EduStaff()).eq(EduStaff::getMobile, phone) - .eq(EduStaff::getSchoolId, schoolId)); - if (existStaff != null) { - eduStaff = existStaff; - } else { - Dept dept = cacheDept.containsKey(deptName) ? cacheDept.get(deptName) - : remoteDeptService.getDeptBySchoolAndName(schoolId, deptName).getData(); - cacheDept.put(deptName, dept); - eduStaff.setName(name); - eduStaff.setSex("男".equals(sex) ? "0" : "女".equals(sex) ? "1" : "2"); - eduStaff.setMobile(phone); - eduStaff.setSchoolId(school.getDeptId()); - eduStaff.setSchoolName(school.getDeptName()); - - eduStaff.setAlias(alias); - eduStaff.setLandLine(landLine); - eduStaff.setEmail(email); - eduStaff.setAddress(addr); - eduStaff.setPosition(position); - eduStaff.setIsLeader("上级".equals(identity) ? 1 : 0); - eduStaff.setCompanyAbbre(companyAbbre); - eduStaff.setForeignPosition(foreignPosition); - - eduStaff.setWxId(StrUtil.isNotBlank(phone) ? phone : StrUtil.uuid().replace("-", "")); - save(eduStaff); - - EduStaffDept staffDept = new EduStaffDept(); - staffDept.setStaffId(eduStaff.getId()); - staffDept.setStaffName(eduStaff.getName()); - staffDept.setDeptId(dept.getDeptId()); - staffDept.setDeptName(dept.getDeptName()); - staffDept.setDeptWxId(dept.getWxId()); - staffDept.setIsLeader("下级".equals(identity) ? 1 : 0); - staffDept.setIsMain(1); - eduStaffDeptService.save(staffDept); - - eduStaff.setStaffDept(Collections.singletonList(staffDept)); - // 微信教师信息新增 - wxUtil.createUser(token, eduStaff); - //添加系统账号 - saveSystemUser(eduStaff); - updateById(eduStaff); - } - } catch (Exception e) { - errorData.add(new HashMap() {{ - put("name", name); - put("alias", alias); - put("wxId", phone); - put("sex", sex); - put("phone", phone); - put("landLine", landLine); - put("email", email); - put("addr", addr); - put("deptName", deptName); - put("identity", identity); - put("position", position); - put("companyAbbre", companyAbbre); - put("foreignPosition", foreignPosition); - }}); - } - - complete++; - if (complete / count != percent) { - percent = complete / count; - redisService.hset(CachePrefixConstant.IMPORT_STAFF_KEY + currentUser.getUsername(), key.toString(), - percent); - } - } - // 新增通知 - Long noticeId = null; - - //EduNoticeSystem eduNoticeSystem = new EduNoticeSystem(); - //eduNoticeSystem.setContent("文档" + file.getName() + "已经上传完成,共上传" + staffList.size() + "条数据,其中错误" + errorData.size() + "条。"); - //noticeId = eduNoticeSystemService.insertNotice(eduNoticeSystem); - // - //EduNoticeSystemUser eduNoticeSystemUser = new EduNoticeSystemUser(); - //eduNoticeSystemUser.setNoticeId(noticeId); - //eduNoticeSystemUser.setUserId(currentUser.getUserId()); - //if (CollUtil.isNotEmpty(errorData)) { - // redisService.set(CachePrefixConstant.IMPORT_ERROR + noticeId.toString(), JSONUtil.toJsonStr(errorData), 3600L); - //} - } - - // 保存人脸 - for (File pic : face) { - String name = FileUtil.getName(pic); - String mobile = name.split("\\.")[0]; - EduStaff staff = getOne(Wrappers.lambdaQuery(new EduStaff()).eq(EduStaff::getSchoolId, school.getDeptId()) - .eq(EduStaff::getMobile, mobile)); - if (staff != null) { - eduUserFaceService.uploadImage(pic, staff.getId(), staff.getName(), 1); - } - complete++; - if (complete / count != percent) { - percent = complete / count; - redisService.hset(CachePrefixConstant.IMPORT_STAFF_KEY + currentUser.getUsername(), key.toString(), percent); - } - } - } finally { - redisService.hdel(CachePrefixConstant.IMPORT_STAFF_KEY + currentUser.getUsername(), key.toString()); - redisService.hdel(CachePrefixConstant.IMPORT_STAFF_FILE + currentUser.getUsername(), key.toString()); + public ResultBean> importStaff(MultipartFile file, Long schoolId, long timestamp) { + // 验证文件类型 + if (!FileUtil.checkMultipartFile(file, FebsConstant.EXCEL_FILE_TYPE)) { + return ResultBean.buildError(ResultMsgType.FILE_TYPE_ERROR.getValue()); } + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); + // 调用导入方法 + ConcurrentHashMap errorMap = new ConcurrentHashMap<>(16); + try { + EasyExcel.read(file.getInputStream(), StaffImportDTO.class, + new StaffDataExcelListener(this, errorMap, schoolId, timestamp)) + .sheet().headRowNumber(8).doRead(); + } catch (IOException exception) { + exception.printStackTrace(); + } + stopWatch.stop(); + log.info("导入职工数据总共耗时: {}", stopWatch.getTotalTimeSeconds() + "秒"); + // 判断是否有错误数据 + if (errorMap.size() > 0) { + return ResultBean + .buildError(ResultStatusType.IMPORT_FAIL.getValue(), ResultMsgType.IMPORT_EXCEL_FAIL.getValue(), errorMap); + } + return ResultBean.buildSuccess(ResultMsgType.IMPORT_EXCEL_SUCCESS.getValue(), null); } +// @Override +// public void importStaff(String path, Long schoolId, CurrentUser currentUser, Long key, String fileName) { +// +// +// +//// try { +//// Dept school = commonService.getDept(schoolId); +//// // 解压文件到本地 +//// File zipFile = new File(path); +//// String zipPath = ZipUtil.unzip(zipFile, CharsetUtil.CHARSET_GBK).getAbsolutePath(); +//// Map cacheDept = new HashMap<>(); +//// // 循环拿到数据 +//// List face = FileUtil.loopFiles(zipPath, x -> { +//// String suffix = FileUtil.getSuffix(x); +//// return (!"txt".equals(suffix)) && (!"xlsx".equals(suffix)); +//// }); +//// List excel = FileUtil.loopFiles(zipPath, x -> { +//// String suffix = FileUtil.getSuffix(x); +//// return "xlsx".equals(suffix); +//// }); +//// int count = 0; +//// int complete = 0; +//// int percent = 0; +//// +//// String token = commonService.getAddressListToken(schoolId); +//// +//// for (File file : excel) { +//// Workbook workbook; +//// try { +//// workbook = com.yida.data.common.core.utils.ExcelUtil.readExcel(file, "xlsx"); +//// } catch (IOException e) { +//// e.printStackTrace(); +//// throw new FebsException("读取职工名单失败,请重新上传"); +//// } +//// Sheet campusSheet = workbook.getSheetAt(0); +//// List> staffList = ExcelUtil.readData(campusSheet, 9); +////// Role staffRole = remoteRoleService.getRoleByNameNoPermission("职工").getData(); +//// count = face.size() + staffList.size(); +//// List> errorData = new ArrayList<>(); +//// for (int i = 0; i < staffList.size(); i++) { +//// Map staff = staffList.get(i); +//// String name = ExcelUtil.getCellValue(staff.get(1)); +//// if (StrUtil.isBlankIfStr(name)) { +//// continue; +//// } +//// //别名 +//// String alias = ExcelUtil.getCellValue(staff.get(2)); +//// //性别 +//// String sex = ExcelUtil.getCellValue(staff.get(3)); +//// //联系电话 +//// String phone = ExcelUtil.getCellValue(staff.get(4)); +//// //座机 +//// String landLine = ExcelUtil.getCellValue(staff.get(5)); +//// //邮箱 +//// String email = ExcelUtil.getCellValue(staff.get(6)); +//// //地址 +//// String addr = ExcelUtil.getCellValue(staff.get(7)); +//// //部门名称 +//// String deptName = ExcelUtil.getCellValue(staff.get(8)); +//// //是否是上级 +//// String identity = ExcelUtil.getCellValue(staff.get(9)); +//// //职务 +//// String position = ExcelUtil.getCellValue(staff.get(10)); +//// //?? +//// String companyAbbre = ExcelUtil.getCellValue(staff.get(11)); +//// //?? +//// String foreignPosition = ExcelUtil.getCellValue(staff.get(12)); +//// //是否同步到企业微信 +//// String wxPath = ExcelUtil.getCellValue(staff.get(13)); +//// +//// try { +//// EduStaff eduStaff = new EduStaff(); +//// //职工已存在跳过 +//// EduStaff existStaff = getOne(Wrappers.lambdaQuery(new EduStaff()).eq(EduStaff::getMobile, phone) +//// .eq(EduStaff::getSchoolId, schoolId)); +//// if (existStaff != null) { +//// eduStaff = existStaff; +//// } else { +//// Dept dept = cacheDept.containsKey(deptName) ? cacheDept.get(deptName) +//// : remoteDeptService.getDeptBySchoolAndName(schoolId, deptName).getData(); +//// cacheDept.put(deptName, dept); +//// eduStaff.setName(name); +//// eduStaff.setSex("男".equals(sex) ? "0" : "女".equals(sex) ? "1" : "2"); +//// eduStaff.setMobile(phone); +//// eduStaff.setSchoolId(school.getDeptId()); +//// eduStaff.setSchoolName(school.getDeptName()); +//// +//// eduStaff.setAlias(alias); +//// eduStaff.setLandLine(landLine); +//// eduStaff.setEmail(email); +//// eduStaff.setAddress(addr); +//// eduStaff.setPosition(position); +//// eduStaff.setIsLeader("上级".equals(identity) ? 1 : 0); +//// eduStaff.setCompanyAbbre(companyAbbre); +//// eduStaff.setForeignPosition(foreignPosition); +//// eduStaff.setWxPath(Integer.parseInt(wxPath)); +//// +//// eduStaff.setWxId(StrUtil.isNotBlank(phone) ? phone : StrUtil.uuid().replace("-", "")); +//// save(eduStaff); +//// +//// EduStaffDept staffDept = new EduStaffDept(); +//// staffDept.setStaffId(eduStaff.getId()); +//// staffDept.setStaffName(eduStaff.getName()); +//// staffDept.setDeptId(dept.getDeptId()); +//// staffDept.setDeptName(dept.getDeptName()); +//// staffDept.setDeptWxId(dept.getWxId()); +//// staffDept.setIsLeader("下级".equals(identity) ? 1 : 0); +//// staffDept.setIsMain(1); +//// eduStaffDeptService.save(staffDept); +//// +//// eduStaff.setStaffDept(Collections.singletonList(staffDept)); +//// // 微信教师信息新增 +//// if ("0".equals(wxPath)) { +//// wxUtil.createUser(token, eduStaff); +//// } +//// //添加系统账号 +//// saveSystemUser(eduStaff); +//// updateById(eduStaff); +//// } +//// } catch (Exception e) { +//// errorData.add(new HashMap() {{ +//// put("name", name); +//// put("alias", alias); +//// put("wxId", phone); +//// put("sex", sex); +//// put("phone", phone); +//// put("landLine", landLine); +//// put("email", email); +//// put("addr", addr); +//// put("deptName", deptName); +//// put("identity", identity); +//// put("position", position); +//// put("companyAbbre", companyAbbre); +//// put("foreignPosition", foreignPosition); +//// }}); +//// } +//// +//// complete++; +//// if (complete / count != percent) { +//// percent = complete / count; +//// redisService.hset(CachePrefixConstant.IMPORT_STAFF_KEY + currentUser.getUsername(), key.toString(), +//// percent); +//// } +//// } +//// // 新增通知 +//// Long noticeId = null; +//// +//// //EduNoticeSystem eduNoticeSystem = new EduNoticeSystem(); +//// //eduNoticeSystem.setContent("文档" + file.getName() + "已经上传完成,共上传" + staffList.size() + "条数据,其中错误" + errorData.size() + "条。"); +//// //noticeId = eduNoticeSystemService.insertNotice(eduNoticeSystem); +//// // +//// //EduNoticeSystemUser eduNoticeSystemUser = new EduNoticeSystemUser(); +//// //eduNoticeSystemUser.setNoticeId(noticeId); +//// //eduNoticeSystemUser.setUserId(currentUser.getUserId()); +//// //if (CollUtil.isNotEmpty(errorData)) { +//// // redisService.set(CachePrefixConstant.IMPORT_ERROR + noticeId.toString(), JSONUtil.toJsonStr(errorData), 3600L); +//// //} +//// } +//// +//// // 保存人脸 +//// for (File pic : face) { +//// String name = FileUtil.getName(pic); +//// String mobile = name.split("\\.")[0]; +//// EduStaff staff = getOne(Wrappers.lambdaQuery(new EduStaff()).eq(EduStaff::getSchoolId, school.getDeptId()) +//// .eq(EduStaff::getMobile, mobile)); +//// if (staff != null) { +//// eduUserFaceService.uploadImage(pic, staff.getId(), staff.getName(), 1); +//// } +//// complete++; +//// if (complete / count != percent) { +//// percent = complete / count; +//// redisService.hset(CachePrefixConstant.IMPORT_STAFF_KEY + currentUser.getUsername(), key.toString(), percent); +//// } +//// } +//// } finally { +//// redisService.hdel(CachePrefixConstant.IMPORT_STAFF_KEY + currentUser.getUsername(), key.toString()); +//// redisService.hdel(CachePrefixConstant.IMPORT_STAFF_FILE + currentUser.getUsername(), key.toString()); +//// } +// } + @Override public Integer importTeacherHeartbeat(String username, Long key) { Object value = redisService.hget(CachePrefixConstant.IMPORT_TEACHER_KEY + username, key.toString()); @@ -703,15 +952,15 @@ public class EduStaffServiceImpl extends ServiceImpl i public List> listImportKey(String username, Integer type) { List> list = new ArrayList<>(); Map keyList = redisService.hmget( - (type == 0 ? CachePrefixConstant.IMPORT_TEACHER_KEY : CachePrefixConstant.IMPORT_STAFF_KEY) + username); + (type == 0 ? CachePrefixConstant.IMPORT_TEACHER_KEY : CachePrefixConstant.IMPORT_STAFF_KEY) + username); if (CollUtil.isNotEmpty(keyList)) { for (Map.Entry objectEntry : keyList.entrySet()) { Map res = new HashMap<>(); Object key = objectEntry.getKey(); Object value = objectEntry.getValue(); Object filename = redisService.hget( - (type == 0 ? CachePrefixConstant.IMPORT_TEACHER_FILE : CachePrefixConstant.IMPORT_STAFF_FILE) + username, - key.toString()); + (type == 0 ? CachePrefixConstant.IMPORT_TEACHER_FILE : CachePrefixConstant.IMPORT_STAFF_FILE) + username, + key.toString()); if (filename != null && StrUtil.isNotBlank(filename.toString())) { res.put("percent", value.toString()); res.put("filename", filename.toString()); @@ -750,7 +999,7 @@ public class EduStaffServiceImpl extends ServiceImpl i @Override public void saveStaffBySchoolAndWx(EduStaff staff) { EduStaff exist = getOne(Wrappers.lambdaQuery(new EduStaff()).eq(EduStaff::getSchoolId, staff.getSchoolId()) - .eq(EduStaff::getWxId, staff.getWxId())); + .eq(EduStaff::getWxId, staff.getWxId())); if (exist != null) { staff.setId(exist.getId()); eduStaffDeptService.remove(Wrappers.lambdaQuery(new EduStaffDept()).eq(EduStaffDept::getStaffId, staff.getId())); @@ -767,10 +1016,10 @@ public class EduStaffServiceImpl extends ServiceImpl i @Override public void dealWxUserDelete(String wxId, Long schoolId) { EduStaff staff = getOne( - Wrappers.lambdaQuery(new EduStaff()).eq(EduStaff::getWxId, wxId).eq(EduStaff::getSchoolId, schoolId)); + Wrappers.lambdaQuery(new EduStaff()).eq(EduStaff::getWxId, wxId).eq(EduStaff::getSchoolId, schoolId)); if (staff != null) { eduTeacherDeptService.remove( - Wrappers.lambdaQuery(new EduTeacherDept()).eq(EduTeacherDept::getTeacherId, staff.getId())); + Wrappers.lambdaQuery(new EduTeacherDept()).eq(EduTeacherDept::getTeacherId, staff.getId())); eduStaffDeptService.remove(Wrappers.lambdaQuery(new EduStaffDept()).eq(EduStaffDept::getStaffId, staff.getId())); removeById(staff.getId()); } @@ -778,24 +1027,35 @@ public class EduStaffServiceImpl extends ServiceImpl i @Override public void downloadTemplate(HttpServletResponse response, Integer type) { - // 根据树形结构建造文件夹 - String tempDir = StrUtil.uuid().replace("-", ""); - File dir = FileUtil.mkdir(tempDir); - FileWriter.create(FileUtil.newFile(dir.getAbsolutePath() + "\\" + "请阅读我!!!.txt")) - .writeFromStream(this.getClass().getClassLoader().getResourceAsStream("template/staff.txt"), true); - - FileWriter.create(FileUtil.newFile(dir.getAbsolutePath() + "\\" + "人员信息.xlsx")).writeFromStream( - this.getClass().getClassLoader().getResourceAsStream(type == 0 ? "template/teacher.xlsx" : "template/staff.xlsx"), - true); - File file = ZipUtil.zip(tempDir); - - System.out.println(file.getAbsolutePath()); try { - com.yida.data.common.core.utils.FileUtil.download(file, "导入模板.zip", true, response); + String fileName = "staff.xlsx"; + // 获取导入文件模板 + ClassPathResource classPathResource = new ClassPathResource("template/" + fileName); + InputStream inputStream = classPathResource.getInputStream(); + com.yida.data.common.core.utils.FileUtil + .download(com.yida.data.common.core.utils.FileUtil.inputStreamToFile(inputStream), fileName, false, response); } catch (Exception e) { - e.printStackTrace(); - log.error("student import template download fail,msg:[{}]", e.getMessage()); + throw new FebsException("教职工信息导入模板失败"); } +// +// // 根据树形结构建造文件夹 +// String tempDir = StrUtil.uuid().replace("-", ""); +// File dir = FileUtil.mkdir(tempDir); +// FileWriter.create(FileUtil.newFile(dir.getAbsolutePath() + "\\" + "请阅读我!!!.txt")) +// .writeFromStream(this.getClass().getClassLoader().getResourceAsStream("template/staff.txt"), true); +// +// FileWriter.create(FileUtil.newFile(dir.getAbsolutePath() + "\\" + "人员信息.xlsx")).writeFromStream( +// this.getClass().getClassLoader().getResourceAsStream(type == 0 ? "template/teacher.xlsx" : "template/staff.xlsx"), +// true); +// File file = ZipUtil.zip(tempDir); +// +// System.out.println(file.getAbsolutePath()); +// try { +// com.yida.data.common.core.utils.FileUtil.download(file, "导入模板.zip", true, response); +// } catch (Exception e) { +// e.printStackTrace(); +// log.error("student import template download fail,msg:[{}]", e.getMessage()); +// } } @Override @@ -803,7 +1063,7 @@ public class EduStaffServiceImpl extends ServiceImpl i Workbook workbook = null; try { workbook = new XSSFWorkbook(this.getClass().getClassLoader() - .getResourceAsStream("template" + (type == 0 ? "/老师信息上传表" + ".xlsx" : "/staff.xlsx"))); + .getResourceAsStream("template" + (type == 0 ? "/老师信息上传表" + ".xlsx" : "/staff.xlsx"))); } catch (Exception e) { e.printStackTrace(); log.error("eerror:{}", e.getMessage()); @@ -973,8 +1233,8 @@ public class EduStaffServiceImpl extends ServiceImpl i @Override public IPage listStaffPage(Page page, CurrentUser currentUser, Long areaId, Long schoolId, Long deptId, - Integer isLeader, String position, String name, String mobile, Integer sex, - Integer collectType) { + Integer isLeader, String position, String name, String mobile, Integer sex, + Integer collectType) { List schoolIds = new ArrayList<>(); if (DeptTypeEnum.COMPANY_TYPE.getValue().equals(currentUser.getDeptType())) { if (schoolId != null) { @@ -989,16 +1249,18 @@ public class EduStaffServiceImpl extends ServiceImpl i schoolIds.add(currentUser.getDeptId()); } IPage staffPage = baseMapper.listStaffPage(page, schoolIds, deptId, isLeader, - position, name, mobile, sex, collectType); + position, name, mobile, sex, collectType); if (CollUtil.isNotEmpty(staffPage.getRecords())) { // 查询系统用户 List sysUserIds = staffPage.getRecords().stream().map(StaffPageVO::getSysUserId).filter(Objects::nonNull) - .collect(Collectors.toList()); - List systemUsers = null; + .collect(Collectors.toList()); + List systemUsers = new ArrayList<>(); sysUserIds.addAll( - staffPage.getRecords().stream().map(StaffPageVO::getCreateId).filter(Objects::nonNull).collect(Collectors.toList())); + staffPage.getRecords().stream().map(StaffPageVO::getCreateId).filter(Objects::nonNull) + .collect(Collectors.toList())); if (CollUtil.isNotEmpty(sysUserIds)) { - systemUsers = remoteUserService.listInfoById(sysUserIds.toArray(new Long[sysUserIds.size()])).getData(); + // TODO: 2023/9/18 注释职工列表调用查询用户信息接口 +// systemUsers = remoteUserService.listInfoById(sysUserIds.toArray(new Long[sysUserIds.size()])).getData(); } for (StaffPageVO record : staffPage.getRecords()) { if (CollUtil.isNotEmpty(systemUsers)) { @@ -1023,7 +1285,7 @@ public class EduStaffServiceImpl extends ServiceImpl i Dept dept = commonService.getDept(staffDept.getDeptId()); if (dept != null) { sb.append(dept.getDeptName()).append("-").append(staffDept.getIsLeader() == 1 ? "上级" : "普通成员") - .append(","); + .append(","); } } if (sb.length() > 0) { @@ -1038,8 +1300,15 @@ public class EduStaffServiceImpl extends ServiceImpl i @Override public void saveStaff(EduStaff eduStaff, CurrentUser currentUser) { Dept school = commonService.getDept(eduStaff.getSchoolId()); + + EduStaff existStaff = null; + if (eduStaff.getId() != null) { + existStaff = getById(eduStaff.getId()); + } + log.info("保存前的职工数据==================before: {}", existStaff); + SystemUser systemUser = saveSystemUser(eduStaff); - //判断是新增还是修改 + // 判断是新增还是修改 if (eduStaff.getId() == null) { //新增 eduStaff.setWxId(StrUtil.uuid().replace("-", "")); @@ -1049,11 +1318,7 @@ public class EduStaffServiceImpl extends ServiceImpl i //修改 eduStaff.setUpdateId(currentUser.getUserId()); } - EduStaff existStaff = null; - if (eduStaff.getId() != null) { - existStaff = getById(eduStaff.getId()); - } - //保存职工信息 + // 保存职工信息 saveOrUpdate(eduStaff); // 保存教师人脸 @@ -1082,18 +1347,27 @@ public class EduStaffServiceImpl extends ServiceImpl i EduApp app = commonService.getAppByCodeAndSchool(AppConstant.CONTACT, null, eduStaff.getSchoolId()); // 当前为要同步到企业微信 if (eduStaff.getWxPath() == 0) { + log.info("保存后的职工数据-------------------------after: {}", existStaff); // 之前已经创建进行修改 否则新增 if (existStaff != null && existStaff.getWxPath() == 0) { eduStaff.setWxId(existStaff.getWxId()); - wxUtil.updateUser(wxUtil.getAccessToken(app.getWxCorpId(), app.getWxSecret()), eduStaff); + wxUtil.updateUser(commonService.getAddressListToken(school.getDeptId()), eduStaff); } else { - wxUtil.createUser(wxUtil.getAccessToken(app.getWxCorpId(), app.getWxSecret()), eduStaff); + wxUtil.createUser(commonService.getAddressListToken(school.getDeptId()), eduStaff); + // 判断是否需要转换成加密用户id + if (Objects.nonNull(app.getTemplateId())) { + // 转换用户id保存到数据库 + String convertUserId = commonService.getSecretUserId(eduStaff.getWxId(), school.getDeptId()); + eduStaff.setWxId(convertUserId); + } } } else { // 之前同步现在不同步 删除在企业微信中的数据 if (existStaff != null && existStaff.getWxPath() == 0) { - wxUtil.deleteUser(wxUtil.getAccessToken(app.getWxCorpId(), app.getWxSecret()), - Collections.singletonList(existStaff.getWxId())); + wxUtil.deleteUser(commonService.getAddressListToken(school.getDeptId()), + Collections.singletonList(existStaff.getWxId())); + // 重新生成wxId + eduStaff.setWxId(StrUtil.uuid().replace("-", "")); } } } @@ -1110,13 +1384,13 @@ public class EduStaffServiceImpl extends ServiceImpl i sex = sex > 2 ? 1 : sex; if (existStaff != null) { DaHuaUtil.updateUser(eduStaff.getDahuaId(), eduStaff.getName(), eduStaff.getDahuaCode(), 1, sex, null, null, null, - null, null, eduStaff.getAvatar()); + null, null, eduStaff.getAvatar()); } else { String cardNum = DaHuaUtil.generateCardNum(); eduStaff.setDahuaCode(eduStaff.getMobile()); eduStaff.setDahuaId( - DaHuaUtil.addUser(eduStaff.getName(), eduStaff.getMobile(), 1, sex, cardNum, null, null, - null, null, null, eduStaff.getAvatar())); + DaHuaUtil.addUser(eduStaff.getName(), eduStaff.getMobile(), 1, sex, cardNum, null, null, + null, null, null, eduStaff.getAvatar())); } } updateById(eduStaff); @@ -1127,7 +1401,9 @@ public class EduStaffServiceImpl extends ServiceImpl i EduStaff staff = baseMapper.getStaffById(staffId); if (staff != null) { Dept dept = commonService.getDept(staff.getSchoolId()); - staff.setSchoolName(dept.getDeptName()); + if (ObjectUtil.isNotNull(dept)) { + staff.setSchoolName(dept.getDeptName()); + } if (CollUtil.isNotEmpty(staff.getStaffDept())) { for (EduStaffDept staffDept : staff.getStaffDept()) { Dept staffD = commonService.getDept(staffDept.getDeptId()); @@ -1142,54 +1418,93 @@ public class EduStaffServiceImpl extends ServiceImpl i } @Override - public List findTeacherRole(Long teacherId) { - + public List findTeacherRole(Long teacherId) { + List teacherDeptVOList = new ArrayList<>(); + //查询教师管理的部门, 班主任到班,其他角色到年级 List type = eduTeacherDeptMapper.findType(teacherId); - if (type.contains(1)) { + if (type.contains(1)) { //校区负责人 //查询教师对应年级 List deptType = new ArrayList<>(); List teacherDepts = eduTeacherDeptMapper.selectList( - Wrappers.lambdaQuery(new EduTeacherDept()).eq(EduTeacherDept::getTeacherId, teacherId) - .eq(EduTeacherDept::getType, 1)); + Wrappers.lambdaQuery(new EduTeacherDept()).eq(EduTeacherDept::getTeacherId, teacherId) + .eq(EduTeacherDept::getType, 1)); for (EduTeacherDept teacherDept : teacherDepts) { + EduUserDept campusDept = eduUserDeptService.getById(teacherDept.getCampusId()); List data = eduUserDeptService.findListByParent( - Collections.singletonList(teacherDept.getCampusId())); + Collections.singletonList(teacherDept.getCampusId())); for (EduUserDept datum : data) { + EduUserDept sectionDept = eduUserDeptService.getById(datum.getDeptId()); List data1 = eduUserDeptService.findListByParent(Collections.singletonList(datum.getDeptId())); for (EduUserDept dept : data1) { - List data2 = eduUserDeptService.findListByParent( - Collections.singletonList(dept.getDeptId())); - deptType.addAll(data2); + TeacherDeptVO teacherDeptVO = new TeacherDeptVO(); + teacherDeptVO.setCampusId(teacherDept.getCampusId()); + teacherDeptVO.setCampusName(campusDept.getDeptName()); + teacherDeptVO.setSectionId(datum.getDeptId()); + teacherDeptVO.setSectionName(sectionDept.getDeptName()); + teacherDeptVO.setGradeId(dept.getDeptId()); + teacherDeptVO.setGradeName(dept.getDeptName()); + teacherDeptVO.setType(1); + teacherDeptVOList.add(teacherDeptVO); } } } - return deptType; - } else if (type.contains(5)) { + } else if (type.contains(5)) { //学段负责人 List deptType = new ArrayList<>(); List teacherDepts = eduTeacherDeptMapper.selectList( - Wrappers.lambdaQuery(new EduTeacherDept()).eq(EduTeacherDept::getTeacherId, teacherId) - .eq(EduTeacherDept::getType, 5)); + Wrappers.lambdaQuery(new EduTeacherDept()).eq(EduTeacherDept::getTeacherId, teacherId) + .eq(EduTeacherDept::getType, 5)); for (EduTeacherDept teacherDept : teacherDepts) { + EduUserDept sectionDept = eduUserDeptService.getById(teacherDept.getSectionId()); + AllDeptInfoVO parentUp = eduUserDeptService.findParentUp(teacherDept.getSectionId(), 4); List data = eduUserDeptService.findListByParent( - Collections.singletonList(teacherDept.getCampusId())); + Collections.singletonList(teacherDept.getSectionId())); for (EduUserDept datum : data) { - List data1 = eduUserDeptService.findListByParent(Collections.singletonList(datum.getDeptId())); - deptType.addAll(data1); + TeacherDeptVO teacherDeptVO = new TeacherDeptVO(); + teacherDeptVO.setCampusId(parentUp.getCampusId()); + teacherDeptVO.setCampusName(parentUp.getCampusName()); + teacherDeptVO.setSectionId(teacherDept.getSectionId()); + teacherDeptVO.setSectionName(sectionDept.getDeptName()); + teacherDeptVO.setGradeId(datum.getDeptId()); + teacherDeptVO.setGradeName(datum.getDeptName()); + teacherDeptVO.setType(5); + teacherDeptVOList.add(teacherDeptVO); } } - return deptType; - } else if (type.contains(2)) { + } else if (type.contains(2)) { //年级负责人 List deptType = new ArrayList<>(); List teacherDepts = eduTeacherDeptMapper.selectList( - Wrappers.lambdaQuery(new EduTeacherDept()).eq(EduTeacherDept::getTeacherId, teacherId) - .eq(EduTeacherDept::getType, 2)); + Wrappers.lambdaQuery(new EduTeacherDept()).eq(EduTeacherDept::getTeacherId, teacherId) + .eq(EduTeacherDept::getType, 2)); for (EduTeacherDept teacherDept : teacherDepts) { + AllDeptInfoVO parentUp = eduUserDeptService.findParentUp(teacherDept.getSectionId(), 4); + log.info("上级部门信息:{}", parentUp); + TeacherDeptVO teacherDeptVO = new TeacherDeptVO(); + teacherDeptVO.setCampusId(parentUp.getCampusId()); + teacherDeptVO.setCampusName(parentUp.getCampusName()); + teacherDeptVO.setSectionId(parentUp.getSectionId()); + teacherDeptVO.setSectionName(parentUp.getSectionName()); + teacherDeptVO.setGradeId(teacherDept.getGradeId()); EduUserDept data = eduUserDeptService.getById(teacherDept.getGradeId()); - deptType.add(data); + teacherDeptVO.setGradeName(data.getDeptName()); + teacherDeptVO.setType(2); + teacherDeptVOList.add(teacherDeptVO); } - return deptType; + } else { + List deptList = eduTeacherDeptMapper.selectDeptList(teacherId); //班主任或者任课老师 + deptList.forEach(eduUserDept -> { + AllDeptInfoVO parentUp = eduUserDeptService.findParentUp(eduUserDept.getDeptId(), 4); + TeacherDeptVO teacherDeptVO = new TeacherDeptVO(); + teacherDeptVO.setCampusId(parentUp.getCampusId()); + teacherDeptVO.setCampusName(parentUp.getCampusName()); + teacherDeptVO.setSectionId(parentUp.getSectionId()); + teacherDeptVO.setSectionName(parentUp.getSectionName()); + teacherDeptVO.setGradeId(parentUp.getGradeId()); + teacherDeptVO.setGradeName(parentUp.getGradeName()); + teacherDeptVO.setType(3); + teacherDeptVOList.add(teacherDeptVO); + }); } - return eduTeacherDeptMapper.selectDeptList(teacherId); + return teacherDeptVOList; } @Override @@ -1205,7 +1520,7 @@ public class EduStaffServiceImpl extends ServiceImpl i @Override public List listTeacherDept(Long teacherId) { List teacherDeptList = eduTeacherDeptMapper.selectList( - Wrappers.lambdaQuery(new EduTeacherDept()).eq(EduTeacherDept::getTeacherId, teacherId)); + Wrappers.lambdaQuery(new EduTeacherDept()).eq(EduTeacherDept::getTeacherId, teacherId)); if (CollUtil.isNotEmpty(teacherDeptList)) { for (EduTeacherDept teacherDept : teacherDeptList) { Long deptId = null; @@ -1225,7 +1540,11 @@ public class EduStaffServiceImpl extends ServiceImpl i break; } if (deptId != null) { - teacherDept.setDeptWxId(eduUserDeptService.getById(deptId).getWxId()); + EduUserDept userDept = eduUserDeptService.getById(deptId); + if (Objects.nonNull(userDept)) { + teacherDept.setDeptWxId(userDept.getWxId()); + } + } } } @@ -1247,6 +1566,30 @@ public class EduStaffServiceImpl extends ServiceImpl i return eduTeacherDeptMapper.listTeacherCourseByGrade(gradeId, classId); } + @Override + public List listClassByGradeIdAndTeacherId(Long gradeId, Long staffId) { + List type = eduTeacherDeptMapper.findType(staffId); + if (CollUtil.isEmpty(type)) { + return new ArrayList<>(); + } + if (type.contains(1) || type.contains(2) || type.contains(5)) { + return eduUserDeptService.findChildByParent(gradeId); + } else { + List typeList = new ArrayList(); + typeList.add(3); + typeList.add(4); + List teacherDepts = eduTeacherDeptMapper.selectList( + Wrappers.lambdaQuery(new EduTeacherDept()) + .eq(EduTeacherDept::getTeacherId, staffId) + .eq(EduTeacherDept::getGradeId, gradeId) + .in(EduTeacherDept::getType, typeList)); + List list = eduUserDeptService.list(Wrappers.lambdaQuery(new EduUserDept()) + .in(EduUserDept::getDeptId, teacherDepts.stream().map(EduTeacherDept::getClassId).collect( + Collectors.toList()))); + return list; + } + } + @Override public List listTeacherByClassAndName(Long classId, String name) { return eduTeacherDeptMapper.listTeacherByClassAndName(classId, name); @@ -1294,7 +1637,7 @@ public class EduStaffServiceImpl extends ServiceImpl i String staffWxId = staffJson.getStr("userid"); // 职工是否存在 EduStaff existStaff = getOne(Wrappers.lambdaQuery().eq(EduStaff::getWxId, staffWxId) - .eq(EduStaff::getSchoolId, school.getDeptId())); + .eq(EduStaff::getSchoolId, school.getDeptId())); EduStaff eduStaff = existStaff != null ? existStaff : new EduStaff(); eduStaff.setWxId(staffWxId); @@ -1320,14 +1663,16 @@ public class EduStaffServiceImpl extends ServiceImpl i int sex = Integer.parseInt(eduStaff.getSex()) + 1; sex = sex > 2 ? 1 : sex; if (Objects.nonNull(eduStaff.getDahuaId())) { - DaHuaUtil.updateUser(eduStaff.getDahuaId(), eduStaff.getName(), eduStaff.getDahuaCode(), 1, sex, null, null, null, + DaHuaUtil + .updateUser(eduStaff.getDahuaId(), eduStaff.getName(), eduStaff.getDahuaCode(), 1, sex, null, null, + null, null, null, ""); } else { String cardNum = DaHuaUtil.generateCardNum(); eduStaff.setDahuaCode(eduStaff.getMobile()); eduStaff.setDahuaId( - DaHuaUtil.addUser(eduStaff.getName(), eduStaff.getMobile(), 1, sex, cardNum, - null, null, null, null, null, "")); + DaHuaUtil.addUser(eduStaff.getName(), eduStaff.getMobile(), 1, sex, cardNum, + null, null, null, null, null, "")); } } saveOrUpdate(eduStaff); @@ -1337,7 +1682,7 @@ public class EduStaffServiceImpl extends ServiceImpl i JSONArray isLeader = staffJson.getJSONArray("is_leader_in_dept"); if (CollUtil.isNotEmpty(department)) { eduStaffDeptService.remove( - Wrappers.lambdaQuery().eq(EduStaffDept::getStaffId, eduStaff.getId())); + Wrappers.lambdaQuery().eq(EduStaffDept::getStaffId, eduStaff.getId())); List staffDeptList = new ArrayList<>(); for (int i = 0; i < department.size(); i++) { // 成员的每个部门信息 @@ -1346,7 +1691,7 @@ public class EduStaffServiceImpl extends ServiceImpl i staffDept.setStaffName(eduStaff.getName()); staffDept.setDeptWxId(Long.valueOf(department.get(i).toString())); Dept dept = deptCache.containsKey(staffDept.getDeptWxId()) ? deptCache.get(staffDept.getDeptWxId()) - : (department.getLong(i) == 1L ? school : remoteDeptService.getDeptBySchoolAndWxId(school.getDeptId(), + : (department.getLong(i) == 1L ? school : remoteDeptService.getDeptBySchoolAndWxId(school.getDeptId(), Long.valueOf(department.get(i).toString())).getData()); staffDept.setDeptId(dept.getDeptId()); staffDept.setDeptName(dept.getDeptName()); @@ -1390,15 +1735,15 @@ public class EduStaffServiceImpl extends ServiceImpl i NameValueVO male = new NameValueVO<>(); male.setName("男"); male.setValue( - (int) count(Wrappers.lambdaQuery().eq(EduStaff::getSex, 0).in(EduStaff::getSchoolId, schoolIds))); + (int) count(Wrappers.lambdaQuery().eq(EduStaff::getSex, 0).in(EduStaff::getSchoolId, schoolIds))); NameValueVO female = new NameValueVO<>(); female.setName("女"); female.setValue( - (int) count(Wrappers.lambdaQuery().eq(EduStaff::getSex, 1).in(EduStaff::getSchoolId, schoolIds))); + (int) count(Wrappers.lambdaQuery().eq(EduStaff::getSex, 1).in(EduStaff::getSchoolId, schoolIds))); NameValueVO secret = new NameValueVO<>(); secret.setName("未知"); secret.setValue( - (int) count(Wrappers.lambdaQuery().notIn(EduStaff::getSex, 0, 1).in(EduStaff::getSchoolId, schoolIds))); + (int) count(Wrappers.lambdaQuery().notIn(EduStaff::getSex, 0, 1).in(EduStaff::getSchoolId, schoolIds))); genderList.add(male); genderList.add(female); genderList.add(secret); @@ -1413,21 +1758,21 @@ public class EduStaffServiceImpl extends ServiceImpl i List deptList = teacher.getDeptVOList(); // 学段 Map> sectionName = deptList.stream() - .filter(x -> StrUtil.isNotBlank(x.getSectionName())) - .collect(Collectors.groupingBy(TeacherDeptVO::getSectionName)); + .filter(x -> StrUtil.isNotBlank(x.getSectionName())) + .collect(Collectors.groupingBy(TeacherDeptVO::getSectionName)); for (Entry> section : sectionName.entrySet()) { sectionCount.put(section.getKey(), sectionCount.getOrDefault(section.getKey(), 0) + 1); } // 科目 Map> courseName = deptList.stream() - .filter(x -> StrUtil.isNotBlank(x.getCourseName())) - .collect(Collectors.groupingBy(TeacherDeptVO::getCourseName)); + .filter(x -> StrUtil.isNotBlank(x.getCourseName())) + .collect(Collectors.groupingBy(TeacherDeptVO::getCourseName)); for (Entry> course : courseName.entrySet()) { courseCount.put(course.getKey(), courseCount.getOrDefault(course.getKey(), 0) + 1); } // 类型 List typeList = deptList.stream() - .map(TeacherDeptVO::getType).collect(Collectors.toList()); + .map(TeacherDeptVO::getType).collect(Collectors.toList()); for (Integer type : typeList) { String s = null; switch (type) { @@ -1457,8 +1802,8 @@ public class EduStaffServiceImpl extends ServiceImpl i List> sectionList = new ArrayList<>(); for (Entry section : sectionCount.entrySet()) { sectionList - .add(new NameValueVO(Optional.ofNullable(section.getKey()).orElse("未知"), - section.getValue())); + .add(new NameValueVO(Optional.ofNullable(section.getKey()).orElse("未知"), + section.getValue())); } vo.setSection(sectionList); } @@ -1467,8 +1812,8 @@ public class EduStaffServiceImpl extends ServiceImpl i List> courseList = new ArrayList<>(); for (Entry course : courseCount.entrySet()) { courseList.add( - new NameValueVO(course.getKey() == null ? "未知" : course.getKey(), - course.getValue())); + new NameValueVO(course.getKey() == null ? "未知" : course.getKey(), + course.getValue())); } vo.setCourse(courseList); } @@ -1477,7 +1822,7 @@ public class EduStaffServiceImpl extends ServiceImpl i List> typeList = new ArrayList<>(); for (Entry type : typeCount.entrySet()) { typeList - .add(new NameValueVO(type.getKey() == null ? "未知" : type.getKey(), type.getValue())); + .add(new NameValueVO(type.getKey() == null ? "未知" : type.getKey(), type.getValue())); } vo.setType(typeList); } @@ -1499,8 +1844,8 @@ public class EduStaffServiceImpl extends ServiceImpl i @Override public void exportStaff(Long areaId, Long schoolId, Long deptId, Integer isLeader, String position, - String name, String mobile, Integer sex, Integer collectType, - HttpServletResponse response) { + String name, String mobile, Integer sex, Integer collectType, + HttpServletResponse response) { StopWatch stopWatch = new StopWatch(); stopWatch.start(); @@ -1520,7 +1865,7 @@ public class EduStaffServiceImpl extends ServiceImpl i } // 查询职工导出数据 List staffList = baseMapper.listExportStaff(schoolIds, deptId, isLeader, - position, name, mobile, sex, collectType); + position, name, mobile, sex, collectType); List list = new ArrayList<>(); if (CollUtil.isNotEmpty(staffList)) { for (StaffPageVO vo : staffList) { @@ -1536,7 +1881,7 @@ public class EduStaffServiceImpl extends ServiceImpl i Dept dept = commonService.getDept(staffDept.getDeptId()); if (dept != null) { sb.append(dept.getDeptName()).append("-").append(staffDept.getIsLeader() == 1 ? "上级" : "普通成员") - .append(","); + .append(","); } } if (sb.length() > 0) { @@ -1557,8 +1902,179 @@ public class EduStaffServiceImpl extends ServiceImpl i // 导出Excel EasyExcelUtil.exportExcelData(list, StaffExportDTO.class, "职工导出数据", - ExcelTypeEnum.XLS, response); + ExcelTypeEnum.XLS, response); stopWatch.stop(); log.info("导出职工数据总共耗时: {}", stopWatch.getTotalTimeSeconds() + "秒"); } + + @Override + public void getWxIdByStaffId(Long staffId) { + EduStaff eduStaff = getById(staffId); + EduApp app = commonService.getAppByCodeAndSchool(AppConstant.CONTACT_SELECT, null, eduStaff.getSchoolId()); + if (Objects.nonNull(app.getTemplateId())) { + // 转换用户id保存到数据库 + String convertUserId = wxServiceProviderUtil + .convertUserIdToSecret(wxUtil.getAccessToken(app.getWxCorpId(), app.getWxSecret()), eduStaff.getWxId()); + EduStaff changeStaff = new EduStaff(); + changeStaff.setId(eduStaff.getId()); + changeStaff.setWxId(convertUserId); + updateById(changeStaff); + } + } + + @Override + public void saveExcelData(ConcurrentHashMap concurrentHashMap, + ConcurrentHashMap errorMap, Long schoolId, long timestamp) { + + // 当前登录用户信息 + CurrentUser currentUser = FebsUtil.getCurrentUser(); + // 当前时间 + LocalDateTime now = LocalDateTime.now(); + + if (!CollectionUtils.isEmpty(concurrentHashMap)) { + // 保存前判断是否已存在 + for (Map.Entry entry : concurrentHashMap.entrySet()) { + // 获取对应key-value值 + Integer i = entry.getKey(); + StaffImportDTO staffImportDTO = entry.getValue(); + // 验证导入信息是否为空 +// if (!checkStudentImportInfo(errorMap, welcomeStudentDTO, i)) { +// continue; +// } + // 验证身份证号码在当前学校的迎新表中是否重复 +// List studentList = +// this.eduSchoolStudentInformationMapper.selectList(Wrappers.lambdaQuery(new EduSchoolStudentInformation()) +// .eq(EduSchoolStudentInformation::getStudentIdCard, welcomeStudentDTO.getStudentIdCard()) +// .eq(EduSchoolStudentInformation::getSchoolId, schoolId) +// ); +// if (!studentList.isEmpty()) { +// log.error("身份证号码已存在: {}", welcomeStudentDTO.toString()); +// errorMap.put(i, "第" + i + "行:" + ResultMsgType.ID_CARD_EXIST.getValue()); +// continue; +// } +// // 验证学区是否存在 +// EduUserDept campus = commonService.getUserDeptBySchoolIdAndNameAndType( +// welcomeStudentDTO.getCampusName(), UserDeptTypeEnum.CAMPUS_TYPE.getValue(), +// schoolId, String.valueOf(timestamp), schoolId); +// if (!Optional.ofNullable(campus).isPresent()) { +// log.error("学区名称错误: {}", welcomeStudentDTO.toString()); +// errorMap.put(i, "第" + i + "行:" + ResultMsgType.CAMPUS_NAME_ERROR.getValue()); +// continue; +// } +// // 验证学段是否存在 +// EduUserDept section = commonService.getUserDeptBySchoolIdAndNameAndType( +// welcomeStudentDTO.getSectionName(), UserDeptTypeEnum.SECTION_TYPE.getValue(), +// schoolId, String.valueOf(timestamp), campus.getDeptId()); +// if (!Optional.ofNullable(section).isPresent()) { +// log.error("学段名称错误: {}", welcomeStudentDTO.toString()); +// errorMap.put(i, "第" + i + "行:" + ResultMsgType.SECTION_NAME_ERROR.getValue()); +// continue; +// } +// // 验证年级是否存在 +// EduUserDept grade = commonService.getUserDeptBySchoolIdAndNameAndType( +// welcomeStudentDTO.getGradeName(), UserDeptTypeEnum.GRADE_TYPE.getValue(), +// schoolId, String.valueOf(timestamp), section.getDeptId()); +// if (!Optional.ofNullable(grade).isPresent()) { +// log.error("年级名称错误: {}", welcomeStudentDTO.toString()); +// errorMap.put(i, "第" + i + "行:" + ResultMsgType.GRADE_NAME_ERROR.getValue()); +// continue; +// } +// // 验证班级是否存在 +// EduUserDept classDept = commonService.getUserDeptBySchoolIdAndNameAndType( +// welcomeStudentDTO.getClassName(), UserDeptTypeEnum.CLASS_TYPE.getValue(), +// schoolId, String.valueOf(timestamp), grade.getDeptId()); +// if (!Optional.ofNullable(classDept).isPresent()) { +// log.error("班级名称错误: {}", welcomeStudentDTO.toString()); +// errorMap.put(i, "第" + i + "行:" + ResultMsgType.CLASS_NAME_ERROR.getValue()); +// continue; +// } + // 保存数据 + EduStaff saveInfo = new EduStaff(); + BeanUtils.copyProperties(staffImportDTO, saveInfo); + saveInfo.setWxPath(1); + saveInfo.setSchoolId(FebsUtil.getDeptId()); + if (StringUtils.isNotEmpty(saveInfo.getMobile())) { + saveStaff(saveInfo, FebsUtil.getCurrentUser()); + } + } + } + } + + @Override + public List getDeptManager(List deptIdList, Long ruleId) { + List teacherDeptList = eduTeacherDeptService.list(Wrappers.lambdaQuery(new EduTeacherDept()) + .eq(EduTeacherDept::getSchoolId, FebsUtil.getTopDeptId())); + List deptManagetVOList = new ArrayList<>(); + for (Long deptId : deptIdList) { + DeptManagetVO vo = new DeptManagetVO(); + vo.setDeptId(deptId); + //班级 + List classDept = teacherDeptList.stream().filter(t -> deptId.equals(t.getClassId())) + .collect(Collectors.toList()); + List managerVoList = new ArrayList<>(); + List staffIdList = new ArrayList<>(); + if (CollUtil.isEmpty(classDept)) { + List gradeDept = teacherDeptList.stream() + .filter(t -> deptId.equals(t.getGradeId()) && ObjectUtil.isNull(t.getClassId())) + .collect(Collectors.toList()); + if (CollUtil.isEmpty(gradeDept)) { + List sectionDept = teacherDeptList.stream().filter( + t -> deptId.equals(t.getSectionId()) && ObjectUtil.isNull(t.getGradeId()) && ObjectUtil + .isNull(t.getClassId())) + .collect(Collectors.toList()); + if (CollUtil.isEmpty(sectionDept)) { + List campusDept = teacherDeptList.stream().filter( + t -> deptId.equals(t.getCampusId()) && ObjectUtil.isNull(t.getSectionId()) && ObjectUtil + .isNull(t.getGradeId()) && ObjectUtil.isNull(t.getClassId())) + .collect(Collectors.toList()); + if (CollUtil.isEmpty(campusDept)) { + List schoolDept = teacherDeptList.stream() + .filter(t -> deptId.equals(-t.getSchoolId()) && ObjectUtil.isNull(t.getCampusId()) && ObjectUtil + .isNull(t.getSectionId()) && ObjectUtil + .isNull(t.getGradeId()) && ObjectUtil.isNull(t.getClassId())) + .collect(Collectors.toList()); + if (CollUtil.isNotEmpty(schoolDept)) { + staffIdList = schoolDept.stream().map(EduTeacherDept::getTeacherId).collect(Collectors.toList()); + } + } else { + staffIdList = campusDept.stream().map(EduTeacherDept::getTeacherId).collect(Collectors.toList()); + } + } else { + staffIdList = sectionDept.stream().map(EduTeacherDept::getTeacherId).collect(Collectors.toList()); + } + } else { + staffIdList = gradeDept.stream().map(EduTeacherDept::getTeacherId).collect(Collectors.toList()); + } + + } else { + staffIdList = classDept.stream().map(EduTeacherDept::getTeacherId).collect(Collectors.toList()); + } + for (Long staffId : staffIdList) { + ManagerVo managerVo = new ManagerVo(); + managerVo.setUserId(staffId); + managerVo.setUserName(commonService.getStaffById(staffId).getName()); + managerVoList.add(managerVo); + } + vo.setManagerVoList(managerVoList); + deptManagetVOList.add(vo); + } + return deptManagetVOList; + } + + @Override + public void updateStaffCache() { + log.info("开始更新教职工信息缓存"); + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); + redisService.del(CachePrefixConstant.STAFF_DATA); + List staffList = list(); + for (EduStaff staff : staffList) { + EduStaff staffById = getStaffById(staff.getId()); + if (ObjectUtil.isNotNull(staffById)) { + redisService.hset(CachePrefixConstant.STAFF_DATA, staffById.getId().toString(), staffById); + } + } + stopWatch.stop(); + log.info("更新教职工信息缓存结束,总共耗时:[{}]", stopWatch.getTotalTimeSeconds() + "秒"); + } } \ No newline at end of file diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduStudentApplyServiceForImpl.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduStudentApplyServiceForImpl.java new file mode 100644 index 0000000..9d6c69d --- /dev/null +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduStudentApplyServiceForImpl.java @@ -0,0 +1,137 @@ +package com.yida.data.user.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.CurrentUser; +import com.yida.data.common.core.entity.system.Dept; +import com.yida.data.common.core.entity.system.enums.RoleEnum; +import com.yida.data.common.core.entity.user.EduParent; +import com.yida.data.common.core.entity.user.EduStudent; +import com.yida.data.common.core.entity.user.EduStudentApplyFor; +import com.yida.data.common.core.exception.FebsException; +import com.yida.data.common.core.utils.FebsUtil; +import com.yida.data.common.service.CommonService; +import com.yida.data.system.feign.RemoteDeptService; +import com.yida.data.user.dto.ListStudentApplyForDTO; +import com.yida.data.user.mapper.EduStudentApplyForMapper; +import com.yida.data.user.service.EduStudentApplyForService; +import com.yida.data.user.service.EduStudentService; +import com.yida.data.user.service.EduUserDeptService; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang.StringUtils; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +@RequiredArgsConstructor +public class EduStudentApplyServiceForImpl extends ServiceImpl implements + EduStudentApplyForService { + + private final CommonService commonService; + + private final RemoteDeptService remoteDeptService; + + private final EduUserDeptService eduUserDeptService; + + + private final EduStudentService eduStudentService; + + + /** + * 分页查询学生会员申请记录 + * + * @param dto + * @param page + * @return + */ + @Override + public IPage listStudentApplyFor(ListStudentApplyForDTO dto, Page page) { + List schoolIds = new ArrayList<>(); + CurrentUser currentUser = FebsUtil.getCurrentUser(); + if (currentUser.getRolePerms().contains(RoleEnum.ROLE_SCHOOL_PRINCIPAL.getValue())) { + schoolIds = Collections.singletonList(currentUser.getDeptId()); + } else { + schoolIds = remoteDeptService.getSchoolByArea(null, null).getData().stream().map(Dept::getDeptId) + .collect(Collectors.toList()); + } + dto.setSchoolIdList(schoolIds); + return this.baseMapper.listStudentApplyFor(dto, page); + } + + /** + * 保存会员申请 + * + * @param eduStudentApplyFor + */ + @Override + public void saveStudentApplyFor(EduStudentApplyFor eduStudentApplyFor) { + //判断是否已申请 + EduStudentApplyFor applyFor = getOne( + Wrappers.lambdaQuery(new EduStudentApplyFor()).eq(EduStudentApplyFor::getApplyCode, eduStudentApplyFor.getApplyCode()) + .eq(EduStudentApplyFor::getStudentId, eduStudentApplyFor.getStudentId()) + .eq(EduStudentApplyFor::getStatus, 0)); + if (ObjectUtil.isNotNull(applyFor)) { + throw new FebsException("用户已申请,请等待管理联系处理!"); + } + eduStudentApplyFor.setApplyName( + commonService.getDictByTypeAndValueOrLabel("apply_type", eduStudentApplyFor.getApplyCode(), null).getLabel()); + EduStudent student = eduStudentService.getStudent(eduStudentApplyFor.getStudentId()); + log.info("学生信息:【{}】", student); + eduStudentApplyFor.setStudentName(student.getStuName()); + eduStudentApplyFor.setStudentNumber(student.getStuNumber()); + eduStudentApplyFor.setStudentMobile( + StringUtils.join(student.getParents().stream().map(EduParent::getMobile).collect(Collectors.toList()), ",")); + eduStudentApplyFor.setSchoolName(remoteDeptService.getInfoById(student.getSchoolId()).getData().getDeptName()); + eduStudentApplyFor.setSchoolId(student.getSchoolId()); + eduStudentApplyFor.setCampusId(student.getCampusId()); + eduStudentApplyFor.setCampusName(student.getCampusName()); + eduStudentApplyFor.setSectionId(student.getSectionId()); + eduStudentApplyFor.setSectionName(student.getSectionName()); + eduStudentApplyFor.setGradeId(student.getGradeId()); + eduStudentApplyFor.setGradeName(student.getGradeName()); + eduStudentApplyFor.setClassId(student.getClassId()); + eduStudentApplyFor.setClassName(student.getClassName()); + this.save(eduStudentApplyFor); + } + + /** + * 处理会员申请 + * + * @param id + * @param status + */ + @Override + public void dealApplyFor(Long id, Integer status) { + CurrentUser currentUser = FebsUtil.getCurrentUser(); + + update(Wrappers.lambdaUpdate(new EduStudentApplyFor()).eq(EduStudentApplyFor::getId, id) + .set(EduStudentApplyFor::getStatus, status) + .set(EduStudentApplyFor::getDealStaffId, currentUser.getUserId()) + .set(EduStudentApplyFor::getDealStaffName, currentUser.getUsername())); + } + + /** + * 根据应用编码,用户ID,查询申请详情 + * + * @param studentId + * @param appCode + * @return + */ + @Override + public EduStudentApplyFor getByStudentId(Long studentId, String appCode) { + return getOne( + Wrappers.lambdaQuery(new EduStudentApplyFor()).eq(EduStudentApplyFor::getApplyCode, appCode) + .eq(EduStudentApplyFor::getStudentId, studentId) + .eq(EduStudentApplyFor::getStatus, 0)); + } + + +} diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduStudentApplyServiceImpl.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduStudentApplyServiceImpl.java new file mode 100644 index 0000000..224c935 --- /dev/null +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduStudentApplyServiceImpl.java @@ -0,0 +1,426 @@ +package com.yida.data.user.service.impl; + +import cc.mrbird.febs.common.redis.service.RedisService; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.LocalDateTimeUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.excel.EasyExcel; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.attendance.dto.IssuedFaceDTO; +import com.yida.data.attendance.feign.RemoteAttendanceDeviceService; +import com.yida.data.common.core.entity.CurrentUser; +import com.yida.data.common.core.entity.Dict; +import com.yida.data.common.core.entity.constant.CachePrefixConstant; +import com.yida.data.common.core.entity.system.Dept; +import com.yida.data.common.core.entity.system.enums.RoleEnum; +import com.yida.data.common.core.entity.user.EduStudent; +import com.yida.data.common.core.entity.user.EduStudentApply; +import com.yida.data.common.core.entity.user.EduUserDept; +import com.yida.data.common.core.entity.user.EduUserDevice; +import com.yida.data.common.core.entity.user.EduUserFace; +import com.yida.data.common.core.exception.FebsException; +import com.yida.data.common.core.utils.FebsUtil; +import com.yida.data.common.core.utils.FileUtil; +import com.yida.data.common.service.CommonService; +import com.yida.data.school.dto.transaction.ListApplyFunctionDTO; +import com.yida.data.system.feign.RemoteDeptService; +import com.yida.data.user.dto.ListStudentApplyDTO; +import com.yida.data.user.dto.ListStudentDTO; +import com.yida.data.user.feign.RemoteStudentService; +import com.yida.data.user.listener.importStudentApplyListener; +import com.yida.data.user.mapper.EduStudentApplyMapper; +import com.yida.data.user.mapper.EduUserDeviceMapper; +import com.yida.data.user.service.EduStudentApplyService; +import com.yida.data.user.service.EduStudentService; +import com.yida.data.user.service.EduUserDeptService; +import com.yida.data.user.service.EduUserFaceService; +import com.yida.data.user.vo.StudentApplyImportErrorVO; +import com.yida.data.user.vo.StudentApplyImportProgressVO; +import com.yida.data.user.vo.StudentApplyImportVO; +import com.yida.data.user.vo.StudentApplyStatusVO; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.stream.Collectors; +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Lazy; +import org.springframework.core.io.ClassPathResource; +import org.springframework.stereotype.Service; +import org.springframework.util.StopWatch; +import org.springframework.web.multipart.MultipartFile; + +@Slf4j +@Service +@RequiredArgsConstructor +public class EduStudentApplyServiceImpl extends ServiceImpl implements + EduStudentApplyService { + + private final CommonService commonService; + + private final RedisService redisService; + + private final RemoteStudentService remoteStudentService; + + private final RemoteDeptService remoteDeptService; + + private final EduUserDeptService eduUserDeptService; + + private final EduStudentService eduStudentService; + + private final EduUserFaceService eduUserFaceService; + + private final EduUserDeviceMapper eduUserDeviceMapper; + + private final RemoteAttendanceDeviceService remoteAttendanceDeviceService; + + @Value("${febs.uploadUrl}") + private String uploadUrl; + + @Override + public StudentApplyStatusVO getStudentApplyStatus(Long studentId, String applyCode) { + StudentApplyStatusVO applyStatus = new StudentApplyStatusVO(); + List list = list(Wrappers.lambdaQuery(new EduStudentApply()).eq(EduStudentApply::getStudentId, + studentId) + .eq(EduStudentApply::getApplyCode, applyCode) + .ge(EduStudentApply::getEndTime, LocalDateTime.now()) + .le(EduStudentApply::getStartTime, LocalDateTime.now())); + if (CollUtil.isEmpty(list)) { + List applyList = baseMapper.getStudentApplyStatus(studentId, applyCode); + if (CollUtil.isNotEmpty(applyList)) { + applyStatus.setStatus(2); + applyStatus.setDeadLine(applyList.get(0).getEndTime().toLocalDate().plusDays(1L)); + } else { + applyStatus.setStatus(0); + } + } else { + applyStatus.setStatus(1); + } + return applyStatus; + } + + @Override + public IPage listStudentApply(ListStudentApplyDTO dto, Page page) { + List schoolIds = new ArrayList<>(); + CurrentUser currentUser = FebsUtil.getCurrentUser(); + if (currentUser.getRolePerms().contains(RoleEnum.ROLE_SCHOOL_PRINCIPAL.getValue())) { + schoolIds = Collections.singletonList(currentUser.getDeptId()); + } else { + schoolIds = remoteDeptService.getSchoolByArea(null, null).getData().stream().map(Dept::getDeptId) + .collect(Collectors.toList()); + } + dto.setSchoolIdList(schoolIds); + IPage eduStudentApplyIPage = this.baseMapper.listStudentApply(dto, page); + return eduStudentApplyIPage; + } + + @Override + public void saveStudentApply(EduStudentApply eduStudentApply) { + eduStudentApply.setApplyName( + commonService.getDictByTypeAndValueOrLabel("apply_type", eduStudentApply.getApplyCode(), null).getLabel()); + eduStudentApply.setStudentName(eduStudentService.getById(eduStudentApply.getStudentId()).getStuName()); + eduStudentApply.setStudentNumber(eduStudentService.getById(eduStudentApply.getStudentId()).getStuNumber()); + eduStudentApply.setSchoolName(commonService.getDept(eduStudentApply.getSchoolId()).getDeptName()); + eduStudentApply.setCampusName(eduUserDeptService.getById(eduStudentApply.getCampusId()).getDeptName()); + eduStudentApply.setSectionName(eduUserDeptService.getById(eduStudentApply.getSectionId()).getDeptName()); + eduStudentApply.setGradeName(eduUserDeptService.getById(eduStudentApply.getGradeId()).getDeptName()); + eduStudentApply.setClassName(eduUserDeptService.getById(eduStudentApply.getClassId()).getDeptName()); + this.save(eduStudentApply); + + //编辑再次下发人脸 + UpdateUserToHaiQing(eduStudentApply); + + } + + + /** + * 更新面板机会员 + * + * @param eduStudentApply + */ + public void UpdateUserToHaiQing(EduStudentApply eduStudentApply) { + EduUserFace userFace = eduUserFaceService.getOne( + Wrappers.lambdaQuery(new EduUserFace()).eq(EduUserFace::getUserId, eduStudentApply.getStudentId()) + .eq(EduUserFace::getUserType, 0)); + if (userFace == null) { + userFace = new EduUserFace(); + userFace.setUserId(eduStudentApply.getStudentId()); + userFace.setName(eduStudentApply.getStudentName()); + userFace.setUserType(0); + + EduStudent student = (EduStudent) redisService.hget(CachePrefixConstant.STUDENT_DATA, + eduStudentApply.getStudentId().toString()); + if (student == null) { + student = eduStudentService.getStudent(eduStudentApply.getStudentId()); + } + if (ObjectUtil.isNull(student) || ObjectUtil.isNull(student.getAvatar())) { + log.info("无匹配学生信息或者导入学生信息无头像,无法下发 === {}", student.getId()); + return; + } + } + userFace.setNotes(1); + userFace.setCardValidBegin(eduStudentApply.getStartTime().toString()); + userFace.setCardValidEnd(eduStudentApply.getEndTime().toString()); + eduUserFaceService.saveOrUpdate(userFace); + //用户原来存在的设备 + List userDeviceList = eduUserDeviceMapper.selectList( + Wrappers.lambdaQuery(new EduUserDevice()).eq(EduUserDevice::getUserId, eduStudentApply.getStudentId()) + .eq(EduUserDevice::getUserType, 0)); + if (CollUtil.isNotEmpty(userDeviceList)) { + // 用户已经被下发到设备,更新设备上的图像 + Map> userDeviceMap = userDeviceList.stream().collect( + Collectors.groupingBy(EduUserDevice::getFaceGroupId)); + for (Map.Entry> entry : userDeviceMap.entrySet()) { + Long faceGroupId = entry.getKey(); + List eduUserDevices = entry.getValue(); + // 设备id + List deviceIds = eduUserDevices.stream().map(EduUserDevice::getDeviceId).distinct() + .collect(Collectors.toList()); + IssuedFaceDTO dto = new IssuedFaceDTO(); + dto.setDeviceList(deviceIds); + dto.setGroupId(faceGroupId); + dto.setUserFaceList(Collections.singletonList(userFace)); + remoteAttendanceDeviceService.issuedFace(dto); + } + } + } + + @Override + public void downloadTemplate(HttpServletResponse response) throws Exception { + + String fileName = "学生开通应用导入模板.xls"; + // 获取导入文件模板 + ClassPathResource classPathResource = new ClassPathResource("template/" + fileName); + InputStream inputStream = classPathResource.getInputStream(); + FileUtil.download(FileUtil.inputStreamToFile(inputStream), fileName, false, response); + } + + @Override + public void importStudentApplyInfo(MultipartFile file, String redisKey) throws IOException { + log.info("开始导入学生开通应用数据"); + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); + EasyExcel.read(file.getInputStream(), StudentApplyImportVO.class, + new importStudentApplyListener(this, redisKey)) + .sheet(0).headRowNumber(1).doRead(); + stopWatch.stop(); + log.info("导入学生开通应用数据总共耗时: {}", stopWatch.getTotalTimeSeconds() + "秒"); + } + + @Override + public void insertStudentApplyData(List studentApplyImportVOList, String redisKey) { + StudentApplyImportProgressVO progressVO = new StudentApplyImportProgressVO(); + progressVO.setFinish(0); + progressVO.setTotalNum(studentApplyImportVOList.size()); + progressVO.setCurrentNum(0); + progressVO.setRedisKey(redisKey); + redisService.hset(CachePrefixConstant.IMPORT_STUDENT_APPLY_PROGRESS, redisKey, progressVO); + + List errorVOList = new ArrayList<>(); + List saveData = new ArrayList<>(); + Integer index = 1; + + for (StudentApplyImportVO studentApplyImportVO : studentApplyImportVOList) { + index++; + String baseMag = "第" + index + "行,"; + StudentApplyImportErrorVO studentApplyImportErrorVO = checkImportDataIsNull(index, studentApplyImportVO); + if (studentApplyImportErrorVO != null) { + progressVO.setCurrentNum(index - 1); + errorVOList.add(studentApplyImportErrorVO); + continue; + } + Dept dept = commonService.getSchoolByName(studentApplyImportVO.getSchoolName()); + if (ObjectUtil.isNull(dept)) { + StudentApplyImportErrorVO errorVO = new StudentApplyImportErrorVO(); + errorVO.setErrorMsg(baseMag + "学校名称不匹配"); + errorVOList.add(errorVO); + progressVO.setCurrentNum(index - 1); + continue; + } + // 根据学校ID、学号查询学生信息 检测学号与学生姓名是否匹配 + EduStudent student = new EduStudent(); + student.setSchoolId(dept.getDeptId()); + student.setStuNumber(studentApplyImportVO.getStudentNumber()); + List currentStudentList = remoteStudentService.listBaseStudentNoJoin(student).getData(); + EduStudentApply eduStudentApply = new EduStudentApply(); + eduStudentApply.setCampusName(studentApplyImportVO.getCampusName()); + eduStudentApply.setSectionName(studentApplyImportVO.getSectionName()); + eduStudentApply.setGradeName(studentApplyImportVO.getGradeName()); + eduStudentApply.setClassName(studentApplyImportVO.getClassName()); + + eduStudentApply.setSchoolName(dept.getDeptName()); + eduStudentApply.setSchoolId(dept.getDeptId()); + + if (CollUtil.isEmpty(currentStudentList)) { + StudentApplyImportErrorVO errorVO = new StudentApplyImportErrorVO(); + errorVO.setErrorMsg(baseMag + "学生学号有误"); + errorVOList.add(errorVO); + progressVO.setCurrentNum(index - 1); + continue; + } + eduStudentApply.setStudentNumber(currentStudentList.get(0).getStuNumber()); + if (!ObjectUtil.equal(studentApplyImportVO.getStudentName(), currentStudentList.get(0).getStuName())) { + StudentApplyImportErrorVO errorVO = new StudentApplyImportErrorVO(); + errorVO.setErrorMsg(baseMag + "学生姓名与学号不匹配"); + errorVOList.add(errorVO); + progressVO.setCurrentNum(index - 1); + continue; + } + eduStudentApply.setStudentName(currentStudentList.get(0).getStuName()); + + EduUserDept campus = eduUserDeptService.getById(currentStudentList.get(0).getCampusId()); + if (campus.getDeptName().equals(studentApplyImportVO.getCampusName())) { + eduStudentApply.setCampusId(currentStudentList.get(0).getCampusId()); + } else { + StudentApplyImportErrorVO errorVO = new StudentApplyImportErrorVO(); + errorVO.setErrorMsg(baseMag + "学区名称与学区名称不匹配"); + errorVOList.add(errorVO); + progressVO.setCurrentNum(index - 1); + continue; + } + + EduUserDept section = eduUserDeptService.getById(currentStudentList.get(0).getSectionId()); + if (section.getDeptName().equals(studentApplyImportVO.getSectionName())) { + eduStudentApply.setSectionId(currentStudentList.get(0).getSectionId()); + } else { + StudentApplyImportErrorVO errorVO = new StudentApplyImportErrorVO(); + errorVO.setErrorMsg(baseMag + "学段名称与学段名称不匹配"); + errorVOList.add(errorVO); + progressVO.setCurrentNum(index - 1); + continue; + } + + EduUserDept grade = eduUserDeptService.getById(currentStudentList.get(0).getGradeId()); + if (grade.getDeptName().equals(studentApplyImportVO.getGradeName())) { + eduStudentApply.setGradeId(currentStudentList.get(0).getGradeId()); + } else { + StudentApplyImportErrorVO errorVO = new StudentApplyImportErrorVO(); + errorVO.setErrorMsg(baseMag + "学生年级名称与年级名称不匹配"); + errorVOList.add(errorVO); + progressVO.setCurrentNum(index - 1); + continue; + } + + EduUserDept clazz = eduUserDeptService.getById(currentStudentList.get(0).getClassId()); + if (clazz.getDeptName().equals(studentApplyImportVO.getClassName())) { + eduStudentApply.setClassId(currentStudentList.get(0).getClassId()); + } else { + StudentApplyImportErrorVO errorVO = new StudentApplyImportErrorVO(); + errorVO.setErrorMsg(baseMag + "学生班级名称与班级名称不匹配"); + errorVOList.add(errorVO); + progressVO.setCurrentNum(index - 1); + continue; + } + + log.info("行数据:{}", studentApplyImportVO); + Dict dict = commonService.getDictByTypeAndValueOrLabel("apply_type", null, studentApplyImportVO.getApplyName()); + log.info("获取字典信息:{}", dict); + if (ObjectUtil.isNull(dict)) { + StudentApplyImportErrorVO errorVO = new StudentApplyImportErrorVO(); + errorVO.setErrorMsg(baseMag + "无此应用"); + errorVOList.add(errorVO); + progressVO.setCurrentNum(index - 1); + continue; + } else { + eduStudentApply.setApplyCode(dict.getValue()); + eduStudentApply.setApplyName(studentApplyImportVO.getApplyName()); + } + eduStudentApply.setStudentId(currentStudentList.get(0).getId()); + String startTime = studentApplyImportVO.getStartTime(); + if (startTime.contains("/")) { + startTime = startTime.replaceAll("/", "-"); + } + + String endTime = studentApplyImportVO.getEndTime(); + if (endTime.contains("/")) { + endTime = endTime.replaceAll("/", "-"); + } + + eduStudentApply + .setStartTime(LocalDateTimeUtil + .parse(startTime + " 00:00:00", "yyyy-MM-dd HH:mm:ss")); + eduStudentApply + .setEndTime(LocalDateTimeUtil + .parse(endTime + " 00:00:00", "yyyy-MM-dd HH:mm:ss")); + + saveData.add(eduStudentApply); + + progressVO.setCurrentNum(index - 1); + redisService.hset(CachePrefixConstant.IMPORT_STUDENT_APPLY_PROGRESS, redisKey, progressVO); + } + if (CollUtil.isNotEmpty(saveData)) { + super.saveBatch(saveData); + } + + productErrorExcel(errorVOList, progressVO); + } + + @Override + public StudentApplyImportProgressVO getImportStudentApplyInfoProgress(String redisKey) { + return (StudentApplyImportProgressVO) redisService + .hget(CachePrefixConstant.IMPORT_STUDENT_APPLY_PROGRESS, redisKey); + } + + + public void productErrorExcel(List errorVOList, StudentApplyImportProgressVO progressVO) { + // 错误信息文件名称 + if (CollUtil.isNotEmpty(errorVOList)) { + String fileName = FileUtil.getLocalUploadAddress() + UUID.randomUUID().toString() + ".xlsx"; + EasyExcel.write(fileName, StudentApplyImportErrorVO.class) + .sheet("错误信息") + .doWrite(errorVOList); + // 上传到媒资 + String url = FileUtil.uploadFileToMediaServer(uploadUrl, new File(fileName)); + progressVO.setErrorPageUrl(url); + } + progressVO.setFinish(1); + redisService.hset(CachePrefixConstant.IMPORT_STUDENT_APPLY_PROGRESS, progressVO.getRedisKey(), progressVO); + } + + /** + * 检测插入数据是否为空 + * + * @return + */ + public StudentApplyImportErrorVO checkImportDataIsNull(Integer index, StudentApplyImportVO studentApplyImportVO) { + StudentApplyImportErrorVO studentApplyImportErrorVO = null; + String baseMag = "第" + index + "行,"; + if (ObjectUtil.isNull(studentApplyImportVO.getSchoolName())) { + studentApplyImportErrorVO = new StudentApplyImportErrorVO(); + studentApplyImportErrorVO.setErrorMsg(baseMag + "学校名称为空"); + } + if (ObjectUtil.isNull(studentApplyImportVO.getStudentName())) { + studentApplyImportErrorVO = new StudentApplyImportErrorVO(); + studentApplyImportErrorVO.setErrorMsg(baseMag + "学生姓名为空"); + } + if (ObjectUtil.isNull(studentApplyImportVO.getStudentNumber())) { + studentApplyImportErrorVO = new StudentApplyImportErrorVO(); + studentApplyImportErrorVO.setErrorMsg(baseMag + "学生学号为空"); + } + if (ObjectUtil.isNull(studentApplyImportVO.getApplyName())) { + studentApplyImportErrorVO = new StudentApplyImportErrorVO(); + studentApplyImportErrorVO.setErrorMsg(baseMag + "开通应用为空"); + } + if (ObjectUtil.isNull(studentApplyImportVO.getStartTime())) { + studentApplyImportErrorVO = new StudentApplyImportErrorVO(); + studentApplyImportErrorVO.setErrorMsg(baseMag + "有效开始时间为空"); + } + if (ObjectUtil.isNull(studentApplyImportVO.getStartTime())) { + studentApplyImportErrorVO = new StudentApplyImportErrorVO(); + studentApplyImportErrorVO.setErrorMsg(baseMag + "有效结束时间为空"); + } + return studentApplyImportErrorVO; + } +} diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduStudentDormServiceImpl.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduStudentDormServiceImpl.java index 3e25b32..ec8a082 100644 --- a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduStudentDormServiceImpl.java +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduStudentDormServiceImpl.java @@ -17,9 +17,12 @@ import com.yida.data.common.service.CommonService; import com.yida.data.school.dto.index.EditPersonNumDTO; import com.yida.data.school.dto.index.ListDormRoomDTO; import com.yida.data.school.feign.facility.RemoteDormitoryService; +import com.yida.data.user.config.ExportStudentDormClient; import com.yida.data.user.dto.ExchangeDormDTO; import com.yida.data.user.dto.ImportStudentDormDTO; import com.yida.data.user.dto.PageStudentDormDTO; +import com.yida.data.user.excel.SelectStudentDormExportData; +import com.yida.data.user.excel.SelectStudentExportData; import com.yida.data.user.listener.ImportStudentDormListener; import com.yida.data.user.mapper.EduStudentMapper; import com.yida.data.user.service.EduStudentDormService; @@ -27,29 +30,35 @@ import com.yida.data.user.service.EduUserDeptService; import com.yida.data.user.vo.StudentDormInfoVO; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; +import javax.annotation.Resource; import java.io.IOException; import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; -@Transactional @Slf4j @Service @RequiredArgsConstructor +@Transactional(rollbackFor = Exception.class) public class EduStudentDormServiceImpl implements EduStudentDormService { private final EduStudentMapper eduStudentMapper; private final RemoteDormitoryService remoteDormitoryService; - private final CommonService commonService; private final RedisService redisService; private final EduUserDeptService eduUserDeptService; + @Lazy + @Resource + private ExportStudentDormClient exportStudentDormClient; + @Override public IPage listStudentDormPage(PageStudentDormDTO dto) { List dormIds = new ArrayList<>(); @@ -57,18 +66,19 @@ public class EduStudentDormServiceImpl implements EduStudentDormService { // 查询匹配的宿舍 if (dto.getDormRoomId() == null) { List dormRooms = remoteDormitoryService.listDormRoom(ListDormRoomDTO.builder() - .schoolId(dto.getSchoolId()) - .floor(dto.getFloor()) - .dormIds(dto.getDormId() != null ? Arrays.asList(dto.getDormId()) : null).build()).getData(); + .schoolId(dto.getSchoolId()) + .floor(dto.getFloor()) + .dormIds(dto.getDormId() != null ? Collections.singletonList(dto.getDormId()) : null).build()).getData(); if (CollUtil.isNotEmpty(dormRooms)) { dormRoomGroup = dormRooms.stream().collect(Collectors.groupingBy(EduDormitoryRoom::getDormId)); dormIds = dormRooms.stream().map(EduDormitoryRoom::getId).collect(Collectors.toList()); } } else { - dormIds = Arrays.asList(dto.getDormRoomId()); + dormIds = Collections.singletonList(dto.getDormRoomId()); } // 宿舍为空 不查询数据 if (CollUtil.isEmpty(dormIds)) { + dormIds = new ArrayList<>(); dormIds.add(-1L); } IPage page = eduStudentMapper.listStudentDormPage(dto.toPage(), dormIds, dto); @@ -93,16 +103,15 @@ public class EduStudentDormServiceImpl implements EduStudentDormService { } else { dormRoom = remoteDormitoryService.getDormRoom(record.getDormRoomId()).getData(); if (dormRoom != null) { - dormRoomGroup.put(dormRoom.getId(), Arrays.asList(dormRoom)); + dormRoomGroup.put(dormRoom.getId(), Collections.singletonList(dormRoom)); } } // 查询到了寝室信息 if (dormRoom != null) { - StringBuilder dormRoomName = new StringBuilder(); - dormRoomName.append(dormRoom.getDormName()) - .append(dormRoom.getFloor()).append("层") - .append(dormRoom.getName()); - record.setDormRoomName(dormRoomName.toString()); + String dormRoomName = dormRoom.getDormName() + + dormRoom.getFloor() + "层" + + dormRoom.getName(); + record.setDormRoomName(dormRoomName); } } } @@ -111,7 +120,7 @@ public class EduStudentDormServiceImpl implements EduStudentDormService { @Override public void saveStudentDorm(Long studentId, Long dormRoomId, Long dormId) { - EduDormitoryRoom dormRoom = remoteDormitoryService.getDormRoom(dormRoomId).getData(); + EduDormitoryRoom dormRoom = remoteDormitoryService.getDormRoomNoPermission(dormRoomId).getData(); // 满员 Asserts.isTrue(dormRoom.getCheckInNum() < dormRoom.getBedNum(), "该宿舍已满员"); EduStudent student = new EduStudent(); @@ -147,9 +156,9 @@ public class EduStudentDormServiceImpl implements EduStudentDormService { } //List roomIds = students.stream().map(x -> x.getDormRoomId()).collect(Collectors.toList()); eduStudentMapper.update(null, Wrappers.lambdaUpdate() - .in(EduStudent::getId, studentIds) - .set(EduStudent::getDormRoomId, null) - .set(EduStudent::getDormId, null)); + .in(EduStudent::getId, studentIds) + .set(EduStudent::getDormRoomId, null) + .set(EduStudent::getDormId, null)); // 添加 remoteDormitoryService.editPersonNum(dtoMap.values().stream().collect(Collectors.toList())); } @@ -162,21 +171,21 @@ public class EduStudentDormServiceImpl implements EduStudentDormService { EduStudent targetStudent = eduStudentMapper.selectById(dto.getTargetStudentId()); // 相互交换寝室 eduStudentMapper.update(null, Wrappers.lambdaUpdate() - .eq(EduStudent::getId, dto.getStudentId()) - .set(EduStudent::getDormRoomId, targetStudent.getDormRoomId()) - .set(EduStudent::getDormId, targetStudent.getDormId()) - .set(EduStudent::getCheckInTime, LocalDateTime.now())); + .eq(EduStudent::getId, dto.getStudentId()) + .set(EduStudent::getDormRoomId, targetStudent.getDormRoomId()) + .set(EduStudent::getDormId, targetStudent.getDormId()) + .set(EduStudent::getCheckInTime, LocalDateTime.now())); eduStudentMapper.update(null, Wrappers.lambdaUpdate() - .eq(EduStudent::getId, dto.getTargetStudentId()) - .set(EduStudent::getDormRoomId, student.getDormRoomId()) - .set(EduStudent::getDormId, student.getDormId()) - .set(EduStudent::getCheckInTime, LocalDateTime.now())); + .eq(EduStudent::getId, dto.getTargetStudentId()) + .set(EduStudent::getDormRoomId, student.getDormRoomId()) + .set(EduStudent::getDormId, student.getDormId()) + .set(EduStudent::getCheckInTime, LocalDateTime.now())); } else if (dto.getTargetDormId() != null) { eduStudentMapper.update(null, Wrappers.lambdaUpdate() - .eq(EduStudent::getId, dto.getStudentId()) - .set(EduStudent::getDormRoomId, dto.getTargetDormRoomId()) - .set(EduStudent::getDormId, dto.getTargetDormId()) - .set(EduStudent::getCheckInTime, LocalDateTime.now())); + .eq(EduStudent::getId, dto.getStudentId()) + .set(EduStudent::getDormRoomId, dto.getTargetDormRoomId()) + .set(EduStudent::getDormId, dto.getTargetDormId()) + .set(EduStudent::getCheckInTime, LocalDateTime.now())); // 添加新寝室 删除原寝室 EditPersonNumDTO editNew = new EditPersonNumDTO(); EditPersonNumDTO editOld = new EditPersonNumDTO(); @@ -191,19 +200,33 @@ public class EduStudentDormServiceImpl implements EduStudentDormService { @Override public void importDormRoom(MultipartFile file, Long schoolId, String key) { ImportPercentVO percent = - (ImportPercentVO) redisService.hget(CachePrefixConstant.IMPORT_STUDENT_DORM, key); + (ImportPercentVO) redisService.hget(CachePrefixConstant.IMPORT_STUDENT_DORM, key); Asserts.isTrue(percent == null || percent.getFinish() == 1, "有文件正在导入,请稍后重试"); try { int rowNum = ExcelUtil.readExcel(file.getInputStream(), "xlsx").getSheetAt(0).getLastRowNum(); ImportPercentVO percentVO = new ImportPercentVO(); percentVO.setTotal(Long.valueOf(rowNum)); EasyExcel.read(file.getInputStream(), ImportStudentDormDTO.class, - new ImportStudentDormListener(redisService, eduStudentMapper, remoteDormitoryService, percentVO, schoolId, - key)).sheet().doRead(); + new ImportStudentDormListener(redisService, eduStudentMapper, remoteDormitoryService, percentVO, schoolId, + key)).sheet().doRead(); } catch (IOException e) { log.error("导入失败", e); throw new FebsException("导入失败"); } } + + @Override + public void exportStudentDorm(PageStudentDormDTO dto, String key) { + SelectStudentDormExportData data = new SelectStudentDormExportData(); + BeanUtils.copyProperties(dto, data); + data.setKey(key); + data.setFunctionName("学生宿舍导出"); + exportStudentDormClient.exportExcelData(data); + } + + @Override + public Object getStudentDormExportInfo(String key) { + return exportStudentDormClient.selectExportInfo(key); + } } \ No newline at end of file diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduStudentServiceImpl.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduStudentServiceImpl.java index 9fb63ff..3cc44b6 100644 --- a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduStudentServiceImpl.java +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduStudentServiceImpl.java @@ -6,15 +6,14 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.file.FileWriter; +import cn.hutool.core.lang.UUID; import cn.hutool.core.map.MapUtil; -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import cn.hutool.core.util.ZipUtil; +import cn.hutool.core.util.*; +import cn.hutool.extra.servlet.ServletUtil; import cn.hutool.json.JSONArray; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; +import com.alibaba.excel.EasyExcel; import com.alibaba.excel.support.ExcelTypeEnum; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -30,38 +29,37 @@ import com.yida.data.common.core.entity.message.EduMessageStrategy; import com.yida.data.common.core.entity.notice.app.AppNotice; import com.yida.data.common.core.entity.notice.app.inside.PushMessage; import com.yida.data.common.core.entity.school.EduYidaAppAccount; -import com.yida.data.common.core.entity.system.Dept; -import com.yida.data.common.core.entity.system.EduApp; -import com.yida.data.common.core.entity.system.EduYidaApp; +import com.yida.data.common.core.entity.system.*; +import com.yida.data.common.core.entity.system.enums.RoleEnum; +import com.yida.data.common.core.entity.system.enums.SysFunctionEnum; import com.yida.data.common.core.entity.user.*; import com.yida.data.common.core.enums.DictType; +import com.yida.data.common.core.enums.UserTypeEnum; import com.yida.data.common.core.exception.FebsException; import com.yida.data.common.core.utils.*; +import com.yida.data.common.core.vo.ImportPercentVO; import com.yida.data.common.core.vo.NameValueVO; import com.yida.data.common.service.CommonService; +import com.yida.data.school.dto.news.SysNoticeSaveDTO; import com.yida.data.school.dto.transaction.ListBuyStudentDTO; +import com.yida.data.school.feign.news.RemoteNoticeSystemService; import com.yida.data.system.feign.RemoteCommonService; import com.yida.data.system.feign.RemoteDeptService; import com.yida.data.system.vo.ClassInfoVO; -import com.yida.data.user.dto.DelFaceGroupUserDTO; -import com.yida.data.user.dto.ListStudentDTO; -import com.yida.data.user.dto.PageStudentDTO; -import com.yida.data.user.dto.StudentExportDTO; +import com.yida.data.user.config.ExportStudentClient; +import com.yida.data.user.dto.*; import com.yida.data.user.dto.h5.BindStudentDTO; +import com.yida.data.user.excel.CardDataDataExcelListener; +import com.yida.data.user.excel.SelectStudentDormExportData; +import com.yida.data.user.excel.SelectStudentExportData; +import com.yida.data.user.listener.ImportStudentTypeListener; import com.yida.data.user.mapper.EduParentMapper; import com.yida.data.user.mapper.EduParentStudentMapper; +import com.yida.data.user.mapper.EduStaffMapper; +import com.yida.data.user.mapper.EduStudentApplyMapper; import com.yida.data.user.mapper.EduStudentMapper; import com.yida.data.user.service.*; -import com.yida.data.user.vo.DownLoadPicVO; -import com.yida.data.user.vo.ListParentByStudentIdsVO; -import com.yida.data.user.vo.StaStudentVO; -import com.yida.data.user.vo.StudentClassInfoVO; -import java.io.FileOutputStream; -import java.net.HttpURLConnection; -import java.net.URL; -import java.net.URLEncoder; -import java.util.zip.ZipEntry; -import java.util.zip.ZipOutputStream; +import com.yida.data.user.vo.*; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -69,16 +67,21 @@ import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Workbook; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Lazy; +import org.springframework.core.io.ClassPathResource; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StopWatch; +import org.springframework.web.multipart.MultipartFile; +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import java.io.BufferedInputStream; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; +import java.io.*; +import java.net.HttpURLConnection; +import java.net.URL; +import java.time.LocalDateTime; import java.util.*; import java.util.Map.Entry; import java.util.concurrent.ExecutorService; @@ -86,6 +89,8 @@ import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; @Slf4j @Service @@ -94,17 +99,26 @@ import java.util.stream.Collectors; public class EduStudentServiceImpl extends ServiceImpl implements EduStudentService { private final EduParentMapper eduParentMapper; - private final EduParentStudentMapper eduParentStudentMapper; private final EduUserFaceService eduUserFaceService; private final EduUserDeptService eduUserDeptService; private final EduParentTypeService eduParentTypeService; private final EduStudentDormService eduStudentDormService; private final EduFaceGroupUserService eduFaceGroupUserService; + private final EduParentStudentService eduParentStudentService; private final EduMessageStrategyService eduMessageStrategyService; + private final EduParentStudentMapper eduParentStudentMapper; + private final EduStudentApplyMapper eduStudentApplyMapper; + private final EduStaffService eduStaffService; + + @Lazy + @Resource + private ImportWelcomeStudentService importWelcomeStudentService; + private final RemoteDeptService remoteDeptService; private final RemoteCommonService remoteCommonService; + private final RemoteNoticeSystemService remoteNoticeSystemService; private final WxUtil wxUtil; private final CommonService commonService; @@ -113,11 +127,28 @@ public class EduStudentServiceImpl extends ServiceImpl()); @Override public IPage findStudentPage(PageStudentDTO dto) { + //查询后台用户身份 + CurrentUser currentUser = FebsUtil.getCurrentUser(); + String rolePerms = FebsUtil.getCurrentUser().getRolePerms(); + //学校管理员 + if (rolePerms.contains(RoleEnum.ROLE_SCHOOL_PRINCIPAL.getValue())) { + dto.setSchoolId(FebsUtil.getTopDeptId()); + } else { + if (ObjectUtil.isNull(dto.getClassId())) { + dto.setClassIdList(eduStaffService.listClassIdByStaffId()); + } else { + dto.setClassIdList(Collections.singletonList(dto.getClassId())); + } + } IPage studentPage = baseMapper.selectStudentPage(dto.toPage().setOptimizeCountSql(false), dto); if (CollUtil.isNotEmpty(studentPage.getRecords())) { studentPage.setRecords(fillStudentDept(studentPage.getRecords())); @@ -127,19 +158,29 @@ public class EduStudentServiceImpl extends ServiceImpl 0, "学号已存在"); + Dept school = commonService.getDept(student.getSchoolId()); EduStudent existStudent = null; if (student.getId() != null) { existStudent = getById(student.getId()); + //清除小程序url缓存链接 + if (!ObjectUtil.equals(student.getAvatar(), existStudent.getAvatar())) { + commonService.delUserGenerateUrlLinkCache(student.getSchoolId(), student.getId(), UserTypeEnum.PARENT_USER_TYPE + .getType()); + } } - //判断学生是否已经存在 - Asserts.isFalse(student.getId() == null && - count(Wrappers.lambdaQuery(new EduStudent()) - .eq(EduStudent::getSchoolId, student.getSchoolId()) - .eq(EduStudent::getStuNumber, student.getStuNumber())) > 0, "学生已存在"); + //只有当前孩子作为家长的家长 List lateParent = null; // 微信app与token @@ -208,6 +249,7 @@ public class EduStudentServiceImpl extends ServiceImpl> faceGroupMap = faceList.stream().collect( + Collectors.groupingBy(EduFaceGroupUser::getFaceGroupId)); + faceGroupMap.forEach((faceGroupId, userList) -> + eduFaceGroupUserService.delUserBatch(DelFaceGroupUserDTO.builder() + .faceGroupId(faceGroupId) + .faceIds(userList.stream().map(EduFaceGroupUser::getId).collect(Collectors.toList())) + .build()) + ); } // 所有学生的家长 List parentList = eduParentMapper.listParentByStudent(studentIds); @@ -436,6 +484,15 @@ public class EduStudentServiceImpl extends ServiceImpl { + log.info("删除class学生数据:{}", s); + redisService + .del(CachePrefixConstant.CLASS_STUDENT_DATA + s.getClassId()); + + //删除学生缓存小程序链接 + commonService.delUserGenerateUrlLinkCache(s.getSchoolId(), s.getId(), UserTypeEnum.PARENT_USER_TYPE.getType()); + }); } @Override @@ -639,6 +696,57 @@ public class EduStudentServiceImpl extends ServiceImpl errorList = new ArrayList<>(); + EasyExcel.read(new File(path), CardImportDTO.class, + new CardDataDataExcelListener(importWelcomeStudentService, errorList, schoolId, currentUser)) + .sheet().headRowNumber(1).doRead(); + stopWatch.stop(); + log.info("导入校园卡号数据总共耗时: {}", stopWatch.getTotalTimeSeconds() + "秒"); + // 判断是否有错误数据 + if (CollUtil.isNotEmpty(errorList)) { + // 错误信息文件名称 + String fileName = com.yida.data.common.core.utils.FileUtil.getLocalUploadAddress() + UUID.randomUUID() + ".xlsx"; + EasyExcel.write(fileName, CardErrorExportDTO.class) + .sheet("错误信息") + .doWrite(errorList); + // 上传到媒资 + String url = com.yida.data.common.core.utils.FileUtil.uploadFileToMediaServer(uploadUrl, new File(fileName)); + // 保存导入不成功的数据和原因 + remoteNoticeSystemService.sendNotice( + SysNoticeSaveDTO.builder() + .userId(Collections.singletonList(currentUser.getUserId())) + .content("校园卡号部分数据导入失败. 详情信息请点击下载 错误信息.xlsx") + .createDate(LocalDateTime.now()) + .build()); + } else { + remoteNoticeSystemService.sendNotice( + SysNoticeSaveDTO.builder() + .userId(Collections.singletonList(currentUser.getUserId())) + .content("校园卡号导入成功") + .createDate(LocalDateTime.now()) + .build()); + } + } catch (Exception e) { + log.error("导入校园卡号数据失败: {}", e.getMessage(), e); + remoteNoticeSystemService.sendNotice( + SysNoticeSaveDTO.builder() + .userId(Collections.singletonList(currentUser.getUserId())) + .content("校园卡号导入失败") + .createDate(LocalDateTime.now()) + .build()); + } finally { + // 清空当前导入的redis学校数据 + redisService.hdel(CachePrefixConstant.IMPORT_STUDENT_KEY + currentUser.getUsername(), key.toString()); + FileUtil.del(path); + } + } + @Override public Integer importStaffHeartbeat(String username, Long key) { Object value = redisService.hget(CachePrefixConstant.IMPORT_STUDENT_KEY + username, key.toString()); @@ -648,6 +756,25 @@ public class EduStudentServiceImpl extends ServiceImpl> listImportKey(String username) { List> list = new ArrayList<>(); @@ -776,6 +903,20 @@ public class EduStudentServiceImpl extends ServiceImpl getParentByPhoneAndSchoolId(List phone, Long schoolId) { return baseMapper.getParentByPhoneAndSchoolId(phone, schoolId); @@ -1076,28 +1217,17 @@ public class EduStudentServiceImpl extends ServiceImpl studentList = baseMapper.selectStudent(dto); - List list = new ArrayList<>(); - for (EduStudent eduStudent : studentList) { - StudentExportDTO exportDTO = new StudentExportDTO(); - BeanUtils.copyProperties(eduStudent, exportDTO); + public void exportStudent(PageStudentDTO dto, String key) { + SelectStudentExportData data = new SelectStudentExportData(); + BeanUtils.copyProperties(dto, data); + data.setKey(key); + data.setFunctionName("学生导出"); + exportStudentClient.exportExcelData(data); + } - String collectStatus = "未采集"; - if (Objects.nonNull(eduStudent.getCollectType()) && eduStudent.getCollectType() == 1) { - collectStatus = "已采集"; - } - exportDTO.setCollectStatus(collectStatus); - list.add(exportDTO); - } - // 导出Excel - EasyExcelUtil.exportExcelData(list, StudentExportDTO.class, "学生导出数据", - ExcelTypeEnum.XLS, response); - stopWatch.stop(); - log.info("导出学生数据总共耗时: {}", stopWatch.getTotalTimeSeconds() + "秒"); + @Override + public Object getStudentExportInfo(String key) { + return exportStudentClient.selectExportInfo(key); } @Override @@ -1368,5 +1498,64 @@ public class EduStudentServiceImpl extends ServiceImpl listStudentOutPage(OutPageStudentDTO dto, HttpServletRequest request) { + // 判断是否在白名单 + WhiteList whiteList = commonService.getWhiteList(SysFunctionEnum.HAI_PU_TIAN.getValue()); + // 当前请求ip地址 +// String ipAddress = FebsUtil.getHttpServletRequestIpAddress(); + String ipAddress = ServletUtil.getClientIP(request, ""); + log.info("当前ip地址: {}", ipAddress); + if (Objects.isNull(whiteList) || StrUtil.isEmpty(whiteList.getRequestIp()) + || !whiteList.getRequestIp().contains(ipAddress)) { + throw new FebsException("非法ip地址"); + } + // 判断当前学校是否开通了此功能 + EduDeptFunction function = commonService.getDeptFunction(SysFunctionEnum.HAI_PU_TIAN.getValue(), dto.getSchoolId()); + if (Objects.isNull(function)) { + throw new FebsException("当前学校暂不支持此功能"); + } + // TODO 2023/3/8 需要处理请求次数 + + Dict dict = commonService.getDictByTypeAndValueOrLabel("apply_type", null, "食堂消费"); + if (Objects.isNull(dict)) { + throw new FebsException("当前学校暂不支持此功能"); + } + IPage page = baseMapper.listStudentOutPage(new Page<>(dto.getPageNum(), dto.getPageSize()), dto); + page.getRecords().forEach(outPageStudentVO -> { + // 查询是否是会员 + EduStudentApply studentApply = eduStudentApplyMapper + .getStudentApply(outPageStudentVO.getStudentId(), dict.getValue()); + if (Objects.isNull(studentApply)) { + // 非会员需要设备头像为空 + outPageStudentVO.setAvatar(""); + } + }); + return page; + } + + @Override + public void updateStudentCache() { + log.info("开始更新学生信息缓存"); + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); + redisService.del(CachePrefixConstant.STUDENT_DATA); + List studentList = baseMapper.getStudentListWithParent(null, null, null); + for (EduStudent student : studentList) { + redisService.hset(CachePrefixConstant.STUDENT_DATA, student.getId().toString(), student); + } + stopWatch.stop(); + log.info("更新学生信息缓存结束,总共耗时:[{}]", stopWatch.getTotalTimeSeconds() + "秒"); + } + + @Override + public List selectStudent(PageStudentDTO dto) { + return baseMapper.selectStudent(dto); + } + + @Override + public List listStudentDorm(List dormRoomIds, SelectStudentDormExportData selectStudentDormExportData) { + return baseMapper.listStudentDorm(dormRoomIds, selectStudentDormExportData); + } } \ No newline at end of file diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduTeachDeptServiceImpl.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduTeachDeptServiceImpl.java index e0dbc11..5d554d4 100644 --- a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduTeachDeptServiceImpl.java +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduTeachDeptServiceImpl.java @@ -59,10 +59,13 @@ public class EduTeachDeptServiceImpl extends ServiceImpl listTeacherDept(Long deptId, String type) { List teacherDeptList = list(Wrappers.lambdaQuery(new EduTeacherDept()) - // 教师类型 1表示校区负责人,2表示年级负责人,3表示班主任,4表示任课老师,5表示学段负责人 - .eq(EduTeacherDept::getType, type) - .eq("3".equals(type), EduTeacherDept::getClassId, deptId) - .eq("2".equals(type), EduTeacherDept::getGradeId, deptId) + // 教师类型 1表示校区负责人,2表示年级负责人,3表示班主任,4表示任课老师,5表示学段负责人,6表示学校负责人 + .eq(EduTeacherDept::getType, type) + .eq("3".equals(type), EduTeacherDept::getClassId, deptId) + .eq("2".equals(type), EduTeacherDept::getGradeId, deptId) + .eq("1".equals(type), EduTeacherDept::getCampusId, deptId) + .eq("5".equals(type), EduTeacherDept::getSectionId, deptId) + .eq("6".equals(type), EduTeacherDept::getSchoolId, deptId) ); if (CollUtil.isEmpty(teacherDeptList)) { return new ArrayList<>(); @@ -71,4 +74,9 @@ public class EduTeachDeptServiceImpl extends ServiceImpl staffIds = teacherDeptList.stream().map(EduTeacherDept::getTeacherId).distinct().collect(Collectors.toList()); return eduStaffMapper.selectList(Wrappers.lambdaQuery(new EduStaff()).in(EduStaff::getId, staffIds)); } + + @Override + public long countTeacherNumber(Long schoolId) { + return baseMapper.countTeacherNumber(schoolId); + } } diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduUserDeptServiceImpl.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduUserDeptServiceImpl.java index 15d7c2c..480320b 100644 --- a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduUserDeptServiceImpl.java +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduUserDeptServiceImpl.java @@ -1,28 +1,39 @@ package com.yida.data.user.service.impl; +import static com.yida.data.common.core.entity.constant.CachePrefixConstant.STAFF_DATA; + import cc.mrbird.febs.common.redis.service.RedisService; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONUtil; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +//import com.yida.data.attendance.feign.RemoteAttendanceResultService; +//import com.yida.data.attendance.vo.AttendanceRuleCacheVO; +//import com.yida.data.attendance.vo.RuleListVO; import com.yida.data.common.core.common.ResultMsgType; import com.yida.data.common.core.entity.CurrentUser; import com.yida.data.common.core.entity.QueryRequest; import com.yida.data.common.core.entity.Tree; import com.yida.data.common.core.entity.UserDeptTree; +import com.yida.data.common.core.entity.attendance.EduAttendanceRuleTime; import com.yida.data.common.core.entity.constant.AppConstant; import com.yida.data.common.core.entity.constant.CachePrefixConstant; import com.yida.data.common.core.entity.constant.FebsConstant; import com.yida.data.common.core.entity.constant.PageConstant; +import com.yida.data.common.core.entity.school.EduDormitory; import com.yida.data.common.core.entity.system.Dept; import com.yida.data.common.core.entity.system.EduApp; import com.yida.data.common.core.entity.system.enums.DeptTypeEnum; import com.yida.data.common.core.entity.system.enums.RoleEnum; -import com.yida.data.common.core.entity.user.EduCollectData; -import com.yida.data.common.core.entity.user.EduCollectData.EduCollectDataBuilder; +import com.yida.data.common.core.entity.user.EduStaff; import com.yida.data.common.core.entity.user.EduStaffWork; import com.yida.data.common.core.entity.user.EduStudent; import com.yida.data.common.core.entity.user.EduUserDept; @@ -34,31 +45,31 @@ import com.yida.data.common.core.entity.user.enums.UserDeptTypeEnum; import com.yida.data.common.core.enums.IncludeTypeEnum; import com.yida.data.common.core.exception.FebsException; import com.yida.data.common.core.utils.*; +import com.yida.data.school.feign.facility.RemoteDormitoryService; import com.yida.data.system.feign.RemoteDeptService; import com.yida.data.system.vo.ClassInfoVO; import com.yida.data.system.vo.SchoolClassInfoVO; import com.yida.data.user.dto.*; -import com.yida.data.user.mapper.EduStaffMapper; -import com.yida.data.user.mapper.EduStudentMapper; -import com.yida.data.user.mapper.EduUserDeptMapper; -import com.yida.data.user.mapper.EduUserDeptStandardGradeMapper; -import com.yida.data.user.mapper.QywxAppMapper; +import com.yida.data.user.mapper.*; import com.yida.data.user.service.EduStaffService; import com.yida.data.user.service.EduStaffWorkService; import com.yida.data.user.service.EduUserDeptService; import com.yida.data.user.vo.AllDeptInfoVO; +import com.yida.data.user.vo.ClassAttendanceDataVO; import com.yida.data.user.vo.CollectDataVO; -import com.yida.data.user.vo.TeacherClassVO; import com.yida.data.user.vo.TeacherDeptVO; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StopWatch; +import javax.annotation.Resource; +import java.time.LocalDate; import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -76,21 +87,22 @@ import java.util.stream.Collectors; public class EduUserDeptServiceImpl extends ServiceImpl implements EduUserDeptService { - private final RemoteDeptService remoteDeptService; + @Lazy + @Resource + private EduStaffService eduStaffService; + private final EduStaffWorkService eduStaffWorkService; private final QywxAppMapper appMapper; + private final EduStaffMapper eduStaffMapper; + private final EduStudentMapper eduStudentMapper; private final EduUserDeptStandardGradeMapper eduUserDeptStandardGradeMapper; + private final RemoteDeptService remoteDeptService; + private final RemoteDormitoryService remoteDormitoryService; + private final WxUtil wxUtil; private final RedisService redisService; - private final EduStaffWorkService eduStaffWorkService; - - private final EduStaffMapper eduStaffMapper; - - private final EduStudentMapper eduStudentMapper; - - /** * 查询所有子节点 * @@ -180,15 +192,6 @@ public class EduUserDeptServiceImpl extends ServiceImpl EduUserDept eduUserDeptGrade = this .getOne(Wrappers.lambdaQuery(new EduUserDept()).eq(EduUserDept::getDeptId, teacherDeptVO.getGradeId())); - //查询当前班级学生采集人数 -// Long totalNum = eduStudentMapper.selectCount(Wrappers.lambdaQuery(new EduStudent()) -// .eq(EduStudent::getSchoolId, currentUser.getDeptId()) -// .eq(EduStudent::getClassId, teacherDeptVO.getClassId())); -// -// Long collectNum = eduStudentMapper.selectCount(Wrappers.lambdaQuery(new EduStudent()) -// .eq(EduStudent::getSchoolId, currentUser.getDeptId()) -// .eq(EduStudent::getClassId, teacherDeptVO.getClassId()) -// .eq(EduStudent::getCollectType, 1)); //根据班级查询学生信息 List studentList = eduStudentMapper.selectList( Wrappers.lambdaQuery(new EduStudent()).eq(EduStudent::getClassId, teacherDeptVO.getClassId()) @@ -196,37 +199,31 @@ public class EduUserDeptServiceImpl extends ServiceImpl collectDataVO.add(CollectDataVO.builder().classId(eduUserDeptClass.getDeptId()) .className(eduUserDeptClass.getDeptName()).gradeName(eduUserDeptGrade.getDeptName()) - .totalNum(new Long(studentList.size())) + .totalNum((long) studentList.size()) .collectNum(studentList.stream().filter(student -> - student.getCollectType() == 1 + ObjectUtil.isNotNull(student.getAvatar()) && student.getAvatar().contains("zbz.yd-data.com") ).count()).studentList(studentList).build()); }); } } else { //包含年级 List gradeList = findChildByParentAndType(Collections.singletonList(one.getPDeptId()), 2); - log.info("user:[{}]", gradeList); gradeList.forEach(eduUserDept -> { List childByParent = findChildByParent(eduUserDept.getDeptId()); childByParent.forEach(eduUserDeptClass -> { - //查询当前班级学生采集人数 -// Long totalNum = eduStudentMapper.selectCount(Wrappers.lambdaQuery(new EduStudent()) -// .eq(EduStudent::getSchoolId, currentUser.getDeptId()) -// .eq(EduStudent::getClassId, eduUserDeptClass.getDeptId())); -// -// Long collectNum = eduStudentMapper.selectCount(Wrappers.lambdaQuery(new EduStudent()) -// .eq(EduStudent::getSchoolId, currentUser.getDeptId()) -// .eq(EduStudent::getClassId, eduUserDeptClass.getDeptId()) -// .eq(EduStudent::getCollectType, 1)); //根据班级查询学生信息 List studentList = eduStudentMapper.selectList( Wrappers.lambdaQuery(new EduStudent()).eq(EduStudent::getClassId, eduUserDeptClass.getDeptId()) .orderByAsc(EduStudent::getCollectType)); - collectDataVO.add(CollectDataVO.builder().classId(eduUserDeptClass.getDeptId()) .className(eduUserDeptClass.getDeptName()) - .gradeName(eduUserDept.getDeptName()).totalNum(new Long(studentList.size())) - .collectNum(studentList.stream().filter(student -> student.getCollectType() == 1).count()) + .gradeName(eduUserDept.getDeptName()) + .totalNum((long) studentList.size()) + .collectNum( + studentList.stream().filter( + student -> ObjectUtil.isNotNull(student.getAvatar()) && student.getAvatar() + .contains("zbz.yd-data.com")) + .count()) .studentList(studentList) .build()); }); @@ -235,11 +232,312 @@ public class EduUserDeptServiceImpl extends ServiceImpl return collectDataVO; } + @Override + public List findClassAttendanceByUserId(Long staffId, LocalDate date) { + + List returnList = new ArrayList<>(); + //判断当前用户角色 + CurrentUser currentUser = FebsUtil.getCurrentUser(); + //取缓存 + List classAttendanceDataVOList = redisService + .lGet(CachePrefixConstant.STAFF_MANGE_DEPT + staffId, 0L, -1L); + +// log.info("缓存数据【{}】", classAttendanceDataVOList); + + if (CollUtil.isEmpty(classAttendanceDataVOList)) { + classAttendanceDataVOList = new ArrayList<>(); + //宿管 + List eduDormitoryList = remoteDormitoryService.listDormByMaster(staffId) + .getData(); + if (CollUtil.isNotEmpty(eduDormitoryList)) { + for (EduDormitory dormitory : eduDormitoryList) { + classAttendanceDataVOList.add( + ClassAttendanceDataVO.builder().classId(dormitory.getId()).name(dormitory.getName()).type(1).build()); + } + } + //班主任、年级主任、学段主任、学区主任 + //班主任 + List totalClassDeptList = new ArrayList<>(); + log.info("用户【{}】角色【{}】", staffId, currentUser.getRolePerms()); + + if (currentUser.getRolePerms().contains(RoleEnum.ROLE_CLASS_PRINCIPAL.getValue())) { + List teacherDeptVOS = eduStaffMapper.listDeptByTeacher(staffId, 3); + for (TeacherDeptVO teacherDeptVO : teacherDeptVOS) { + teacherDeptVO.setClassName(this.getById(teacherDeptVO.getClassId()).getDeptName()); + teacherDeptVO.setGradeName(this.getById(teacherDeptVO.getGradeId()).getDeptName()); + teacherDeptVO + .setCampusName(this.getById(teacherDeptVO.getCampusId()).getDeptName()); + totalClassDeptList.add(teacherDeptVO); + } + } + //年级主任 + if (currentUser.getRolePerms().contains(RoleEnum.ROLE_GRADE_PRINCIPAL.getValue())) { + List teacherDeptVOS = eduStaffMapper.listDeptByTeacher(staffId, 2); + teacherDeptVOS.forEach(teacherDeptVO -> { + String gradeName = this.getById(teacherDeptVO.getGradeId()).getDeptName(); + String campusName = this.getById(teacherDeptVO.getCampusId()).getDeptName(); + List childByParent = findChildByParent(teacherDeptVO.getGradeId()); + childByParent.forEach(eduUserDept -> { + TeacherDeptVO teacherDeptVO1 = new TeacherDeptVO(); + teacherDeptVO1.setGradeId(teacherDeptVO.getGradeId()); + teacherDeptVO1.setClassId(eduUserDept.getDeptId()); + teacherDeptVO1 + .setClassName(this.getById(eduUserDept.getDeptId()).getDeptName()); + teacherDeptVO1.setGradeName(gradeName); + teacherDeptVO1.setCampusName(campusName); + totalClassDeptList.add(teacherDeptVO1); + }); + }); + } + + //学段主任 + if (currentUser.getRolePerms().contains(RoleEnum.ROLE_SECTION_PRINCIPAL.getValue())) { + List sectionList = eduStaffMapper.listDeptByTeacher(staffId, 5); + sectionList.forEach(section -> { + String campusName = this.getById(section.getCampusId()).getDeptName(); + List gradeList = findChildByParentAndType(Collections.singletonList(section.getSectionId()), 2); + gradeList.forEach(grade -> { + String gradeName = this.getById(grade.getDeptId()).getDeptName(); + List classList = findChildByParent(grade.getDeptId()); + classList.forEach(clazz -> { + TeacherDeptVO teacherDeptVO = new TeacherDeptVO(); + teacherDeptVO.setGradeId(grade.getDeptId()); + teacherDeptVO.setClassId(clazz.getDeptId()); + teacherDeptVO + .setClassName(this.getById(clazz.getDeptId()).getDeptName()); + teacherDeptVO.setGradeName(gradeName); + teacherDeptVO.setCampusName(campusName); + totalClassDeptList.add(teacherDeptVO); + }); + }); + }); + } + + //学区主任 + if (currentUser.getRolePerms().contains(RoleEnum.ROLE_CAMPUS_PRINCIPAL.getValue())) { + List campusList = eduStaffMapper.listDeptByTeacher(staffId, 1); + campusList.forEach(campus -> { + String campusName = this.getById(campus.getCampusId()).getDeptName(); + List gradeList = findChildByParentAndType(Collections.singletonList(campus.getCampusId()), 2); + gradeList.forEach(grade -> { + String gradeName = this.getById(grade.getDeptId()).getDeptName(); + List classList = findChildByParent(grade.getDeptId()); + classList.forEach(clazz -> { + TeacherDeptVO teacherDeptVO = new TeacherDeptVO(); + teacherDeptVO.setGradeId(grade.getDeptId()); + teacherDeptVO.setClassId(clazz.getDeptId()); + teacherDeptVO + .setClassName(this.getById(clazz.getDeptId()).getDeptName()); + teacherDeptVO.setGradeName(gradeName); + teacherDeptVO.setCampusName(campusName); + totalClassDeptList.add(teacherDeptVO); + }); + }); + }); + } + //查询学校负责人,即校领导 + List schoolList = eduStaffMapper.listDeptByTeacher(staffId, 6); + if (CollUtil.isNotEmpty(schoolList)) { + schoolList.forEach(school -> { + List campusList = findChildByParentAndType( + Collections.singletonList(-school.getSchoolId()), 4); + campusList.forEach(campus -> { + String campusName = this.getById(campus.getDeptId()).getDeptName(); + List gradeList = findChildByParentAndType(Collections.singletonList(campus.getDeptId()), + 2); + gradeList.forEach(grade -> { + String gradeName = this.getById(grade.getDeptId()).getDeptName(); + List classList = findChildByParent(grade.getDeptId()); + classList.forEach(clazz -> { + TeacherDeptVO teacherDeptVO = new TeacherDeptVO(); + teacherDeptVO.setGradeId(grade.getDeptId()); + teacherDeptVO.setClassId(clazz.getDeptId()); + teacherDeptVO + .setClassName(this.getById(clazz.getDeptId()).getDeptName()); + teacherDeptVO.setGradeName(gradeName); + teacherDeptVO.setCampusName(campusName); + totalClassDeptList.add(teacherDeptVO); + }); + }); + }); + }); + } + +// log.info("去重前用户所有班级:【{}】", classAttendanceDataVOList); + if (CollUtil.isNotEmpty(totalClassDeptList)) { + for (TeacherDeptVO teacherDeptVO : totalClassDeptList) { + classAttendanceDataVOList + .add(ClassAttendanceDataVO.builder().classId(teacherDeptVO.getClassId()).name( + teacherDeptVO.getCampusName() + "/" + teacherDeptVO.getGradeName() + "/" + teacherDeptVO + .getClassName()).type(0).build()); + } + } + //去重 + classAttendanceDataVOList = classAttendanceDataVOList.stream().distinct().collect(Collectors.toList()); + +// log.info("去重后用户所有班级:【{}】", classAttendanceDataVOList); + + if (CollUtil.isNotEmpty(classAttendanceDataVOList)) { + redisService.llSet(CachePrefixConstant.STAFF_MANGE_DEPT + staffId, classAttendanceDataVOList); + } + } + EduStaff staff = (EduStaff) redisService.hget(STAFF_DATA, staffId.toString()); + if (ObjectUtil.isEmpty(staff)) { + staff = eduStaffMapper.getStaff(staffId); + } + +// AttendanceRuleCacheVO attendanceRuleCacheVO = (AttendanceRuleCacheVO) redisService +// .hget(CachePrefixConstant.SCHOOL_RULE_DATA, staff.getSchoolId().toString()); +// if (ObjectUtil.isNull(attendanceRuleCacheVO) || CollUtil.isEmpty(attendanceRuleCacheVO.getRuleListVOList())) { +// return new ArrayList<>(); +// } +// RuleListVO ruleListVO = attendanceRuleCacheVO.getRuleListVOList().get(0); +// +// List todayRuleTimeList = ruleListVO.getTimeList().stream() +// .filter(r -> r.getDayOfWeek() == LocalDate.now().getDayOfWeek().getValue()).collect( +// Collectors.toList()); + +// Long ruleTimeId = todayRuleTimeList.get(0).getId(); + + String ruleTimeId = ""; + +// log.info("今日考勤时段ruleTimeID:【{}】", ruleTimeId); + for (Object o : classAttendanceDataVOList) { + //统计数据 + //默认一个规则,一个考勤时段 + ClassAttendanceDataVO classAttendanceDataVO = (ClassAttendanceDataVO) o; + ClassAttendanceDataVO redisData = new ClassAttendanceDataVO(); + if (classAttendanceDataVO.getType() == 0) { + redisData = (ClassAttendanceDataVO) redisService + .hget(CachePrefixConstant.ATTENDANCE_DORMITORY_CLASS + date, + classAttendanceDataVO.getClassId().toString() + ruleTimeId); + } else { + redisData = (ClassAttendanceDataVO) redisService + .hget(CachePrefixConstant.ATTENDANCE_DORMITORY_DORM + date, + classAttendanceDataVO.getClassId().toString() + ruleTimeId); + } +// +// Integer type = classAttendanceDataVO.getType(); +// List studentList = new ArrayList<>(); +// if (type == 0) { +// //班级 +// //根据班级查询学生信息 +// studentList = eduStudentMapper.selectList( +// Wrappers.lambdaQuery(new EduStudent()).eq(EduStudent::getClassId, classAttendanceDataVO.getClassId()) +// .eq(EduStudent::getType, 1)); +// } else { +// //宿舍 +// //查询宿舍总人数、异常人数 +// ListStudentDTO dto = new ListStudentDTO(); +// dto.setDormIds(Collections.singletonList(classAttendanceDataVO.getClassId())); +// dto.setType(1); +// studentList = eduStudentMapper.listStudent(dto); +// } +// +// ListResultDTO paramDto = new ListResultDTO(); +// paramDto.setDate(date); +// paramDto.setStudentIdList(studentList.stream().map(EduStudent::getId).collect(Collectors.toList())); +// paramDto.setType(1); //类型:0异常,1正常 +// Integer abnormalNum = 0; +// if (CollUtil.isNotEmpty(studentList)) { +// abnormalNum = remoteAttendanceResultService +// .getAbnormalStudentList(paramDto) +// .getData().size(); +// } +// classAttendanceDataVO.setTotalNum(studentList.size()); +// classAttendanceDataVO.setAbnormalNum(studentList.size() - abnormalNum); + if (ObjectUtil.isNotNull(redisData)) { + returnList.add(redisData); + } + } + return returnList; + } @Override - public List findChildIdByParentAndType(List userDeptIdList, Integer type) { + public List findClassAttendanceDetailByDeptId(Long deptId, Integer type, LocalDate date) { + if (type == 0) { + ClassAttendanceDataVO redisData = (ClassAttendanceDataVO) redisService + .hget(CachePrefixConstant.ATTENDANCE_DORMITORY_DORM + date, + deptId.toString()); + if (ObjectUtil.isNull(redisData)) { + return new ArrayList<>(); + } else { + return redisData.getStudentList(); + } + } else { + ClassAttendanceDataVO redisData = (ClassAttendanceDataVO) redisService + .hget(CachePrefixConstant.ATTENDANCE_DORMITORY_CLASS + date, + deptId.toString()); + if (ObjectUtil.isNull(redisData)) { + return new ArrayList<>(); + } else { + return redisData.getStudentList(); + } + } + +// +// List studentList = new ArrayList<>(); +// if (type == 0) { +// //班级 +// //根据班级查询学生信息 +// ListStudentDTO dto = new ListStudentDTO(); +// dto.setClassId(deptId); +// dto.setType(1); +// studentList = eduStudentMapper.listStudentByCondition(dto); +//// studentList = eduStudentMapper.selectList( +//// Wrappers.lambdaQuery(new EduStudent()).eq(EduStudent::getClassId, deptId).eq(EduStudent::getType, 1) +//// .orderByAsc(EduStudent::getCollectType)); +// } else { +// //宿舍 +// //查询宿舍总人数、异常人数 +// ListStudentDTO dto = new ListStudentDTO(); +// dto.setDormIds(Collections.singletonList(deptId)); +// dto.setIsQueryUserDept(true); +// dto.setType(1); +// studentList = eduStudentMapper.listStudent(dto); +// } +// +// ListResultDTO paramDto = new ListResultDTO(); +// paramDto.setDate(date); +// paramDto.setStudentIdList(studentList.stream().map(EduStudent::getId).collect(Collectors.toList())); +// paramDto.setType(0); //类型:0异常,1正常 +// +// List abnormalStudentList = remoteAttendanceResultService +// .getAbnormalStudentList(paramDto) +// .getData(); +// +// log.info("异常数据【{}】", abnormalStudentList); +// +// Map> listMap = abnormalStudentList.stream() +// .collect(Collectors.groupingBy(EduAttendanceResult::getStudentId)); +// +// for (EduStudent student : studentList) { +// List eduAttendanceResultList = listMap.get(student.getId()); +// log.info("eduAttendanceResultList========【{}】", eduAttendanceResultList); +// +// if (CollUtil.isEmpty(eduAttendanceResultList)) { +// student.setDormAttStatus(0); +// } else { +// EduAttendanceResult eduAttendanceResult = listMap.get(student.getId()).get(0); +// if (ObjectUtil.isNotNull(eduAttendanceResult)) { +// if (ObjectUtil.isNull(eduAttendanceResult.getBeginStatus())) { +// student.setDormAttStatus(4); +// } else { +// student.setDormAttStatus(eduAttendanceResult.getBeginStatus()); +// } +// } else { +// student.setDormAttStatus(0); +// } +// } +// } +// return studentList; + } + + + @Override + public List findChildIdByParentAndType(List userDeptIdList, Integer type, List resultList) { List result = list(Wrappers.lambdaQuery().in(EduUserDept::getParentId, userDeptIdList) - .eq(EduUserDept::getDeptType, type) + .eq(ObjectUtil.isNotNull(type), EduUserDept::getDeptType, type) .eq(EduUserDept::getVisible, DeptVisibleTypeEnum.VISIBLE_TYPE.getValue()) .eq(EduUserDept::getGraduatedStatus, GraduatedStatusEnum.UNDERGRADUATE_STATUS.getValue()) .orderByDesc(EduUserDept::getOrderNum)); @@ -250,10 +548,12 @@ public class EduUserDeptServiceImpl extends ServiceImpl .orderByDesc(EduUserDept::getOrderNum)) .stream().map(EduUserDept::getDeptId).collect(Collectors.toList()); if (CollUtil.isNotEmpty(child)) { - result = findChildIdByParentAndType(child, type); + findChildIdByParentAndType(child, type, resultList); } + } else { + resultList.addAll(result); } - return result; + return resultList; } /** @@ -463,6 +763,34 @@ public class EduUserDeptServiceImpl extends ServiceImpl return TreeUtil.build(trees); } + @Override + public List getUserDeptTree(List deptIds) { + // 返回的树结构 + List allDeptList = new ArrayList<>(); + // 根节点集合 + List rootIdList = new ArrayList<>(); + + if (CollUtil.isNotEmpty(deptIds)) { + for (Long deptId : deptIds) { + // 添加根节点 + EduUserDept root = this.getById(deptId); + if (ObjectUtil.isNotNull(root)) { + if (root.getParentId() != null) { + root.setParentId(null); + root.setParentWxId(null); + } + allDeptList.add(root); + rootIdList.add(deptId); + } + } + } + // 循环查询子节点 + allDeptList.addAll(findListByParent(rootIdList)); + List trees = new ArrayList<>(); + buildTrees(trees, allDeptList, false); + return TreeUtil.build(trees); + } + /** * 根据各层名称查询班级信息 * @@ -550,7 +878,7 @@ public class EduUserDeptServiceImpl extends ServiceImpl if (school.getSchoolType().contains(Dept.TYPE_QYWX)) { bindFlag = true; eduApp = appMapper.selectOne(Wrappers.lambdaQuery(new EduApp()).eq(EduApp::getDeptId, - school.getDeptId()).eq(EduApp::getName, AppConstant.CONTACT_SCHOOL)); + school.getDeptId()).eq(EduApp::getCode, AppConstant.CONTACT_SCHOOL)); if (eduApp != null) { Long wxId = wxUtil.createUserDept(wxUtil.getAccessToken(eduApp.getWxCorpId(), eduApp.getWxSecret()), campus); @@ -628,7 +956,7 @@ public class EduUserDeptServiceImpl extends ServiceImpl if (school.getSchoolType().contains(Dept.TYPE_QYWX)) { bindFlag = true; eduApp = appMapper.selectOne(Wrappers.lambdaQuery(new EduApp()).eq(EduApp::getDeptId, - school.getDeptId()).eq(EduApp::getName, AppConstant.CONTACT_SCHOOL)); + school.getDeptId()).eq(EduApp::getCode, AppConstant.CONTACT_SCHOOL)); } // 学校绑定了大华 if (school.getSchoolType().contains(Dept.TYPE_DAHUA)) { @@ -709,6 +1037,8 @@ public class EduUserDeptServiceImpl extends ServiceImpl this.save(classDept); } }); + + updateSchoolClassData(sectionDTO.getSchoolId()); } /** @@ -753,7 +1083,7 @@ public class EduUserDeptServiceImpl extends ServiceImpl if (school.getSchoolType().contains(Dept.TYPE_QYWX)) { bindFlag = true; eduApp = appMapper.selectOne(Wrappers.lambdaQuery(new EduApp()).eq(EduApp::getDeptId, - school.getDeptId()).eq(EduApp::getName, AppConstant.CONTACT_SCHOOL)); + school.getDeptId()).eq(EduApp::getCode, AppConstant.CONTACT_SCHOOL)); if (eduApp != null) { Long wxId = wxUtil.createUserDept(wxUtil.getAccessToken(eduApp.getWxCorpId(), eduApp.getWxSecret()), grade); @@ -796,6 +1126,8 @@ public class EduUserDeptServiceImpl extends ServiceImpl } // 批量保存班级数据 this.saveBatch(classList); + + updateSchoolClassData(saveGradeDTO.getSchoolId()); } /** @@ -849,7 +1181,7 @@ public class EduUserDeptServiceImpl extends ServiceImpl // 学校绑定了企业微信 if (school.getSchoolType().contains(Dept.TYPE_QYWX)) { EduApp eduApp = appMapper.selectOne(Wrappers.lambdaQuery(new EduApp()).eq(EduApp::getDeptId, - school.getDeptId()).eq(EduApp::getName, AppConstant.CONTACT_SCHOOL)); + school.getDeptId()).eq(EduApp::getCode, AppConstant.CONTACT_SCHOOL)); if (eduApp != null) { Long wxId = wxUtil.createUserDept(wxUtil.getAccessToken(eduApp.getWxCorpId(), eduApp.getWxSecret()), eduUserDept); @@ -868,6 +1200,8 @@ public class EduUserDeptServiceImpl extends ServiceImpl } } this.save(eduUserDept); + + updateSchoolClassData(addUserDeptDTO.getSchoolId()); } /** @@ -900,7 +1234,7 @@ public class EduUserDeptServiceImpl extends ServiceImpl // 学校绑定了企业微信 if (school.getSchoolType().contains(Dept.TYPE_QYWX)) { EduApp eduApp = appMapper.selectOne(Wrappers.lambdaQuery(new EduApp()).eq(EduApp::getDeptId, - school.getDeptId()).eq(EduApp::getName, AppConstant.CONTACT_SCHOOL)); + school.getDeptId()).eq(EduApp::getCode, AppConstant.CONTACT_SCHOOL)); if (eduApp != null) { wxUtil.updateUserDept(wxUtil.getAccessToken(eduApp.getWxCorpId(), eduApp.getWxSecret()), eduUserDept); } @@ -920,6 +1254,8 @@ public class EduUserDeptServiceImpl extends ServiceImpl } } this.saveOrUpdate(eduUserDept); + + updateSchoolClassData(editUserDeptDTO.getSchoolId()); } /** @@ -945,7 +1281,7 @@ public class EduUserDeptServiceImpl extends ServiceImpl if (school.getSchoolType().contains(Dept.TYPE_QYWX)) { bindFlag = true; eduApp = appMapper.selectOne(Wrappers.lambdaQuery(new EduApp()).eq(EduApp::getDeptId, - school.getDeptId()).eq(EduApp::getName, AppConstant.CONTACT_SCHOOL)); + school.getDeptId()).eq(EduApp::getCode, AppConstant.CONTACT_SCHOOL)); } // 学校绑定了大华 if (school.getSchoolType().contains(Dept.TYPE_DAHUA)) { @@ -975,6 +1311,8 @@ public class EduUserDeptServiceImpl extends ServiceImpl } // 删除部门缓存 redisService.hdel(CachePrefixConstant.USER_DEPT_DATA, ids); + + updateSchoolClassData(schoolId); } /** @@ -1068,7 +1406,26 @@ public class EduUserDeptServiceImpl extends ServiceImpl @Override public EduUserDept getParentByDeptId(Long deptId) { EduUserDept eduUserDept = this.getById(deptId); - return this.getById(eduUserDept.getParentId()); + if (ObjectUtil.isNotNull(eduUserDept.getParentId())) { + return this.getById(eduUserDept.getParentId()); + } else { + return null; + } + } + + @Override + public List getParentListByDeptId(Long deptId) { + List result = new ArrayList<>(); + if (ObjectUtil.isNotNull(deptId)) { + EduUserDept currentDept = getById(deptId); + result.add(currentDept); + if (ObjectUtil.isNotNull(currentDept) && ObjectUtil.isNotNull(currentDept.getParentId())) { + result.addAll(getParentListByDeptId(currentDept.getParentId())); + } + return result; + } else { + return null; + } } /** @@ -1112,7 +1469,7 @@ public class EduUserDeptServiceImpl extends ServiceImpl } this.removeByIds(deptIdList); // 删除家校部门缓存 - redisService.hdel(CachePrefixConstant.USER_DEPT_DATA, deptIdList.stream().map(x -> x.toString()).toArray(String[]::new)); + redisService.hdel(CachePrefixConstant.USER_DEPT_DATA, deptIdList.stream().map(Object::toString).toArray(String[]::new)); } /** @@ -1123,20 +1480,28 @@ public class EduUserDeptServiceImpl extends ServiceImpl */ @Override @Transactional - public void syncUserDept() { + public void syncUserDept(Long schoolId) { // 查询所有和企业微信关联的学校信息 - List schoolList = this.remoteDeptService.listSchoolBySchoolType(Dept.TYPE_QYWX).getData(); + List schoolList = new ArrayList<>(); + if (Objects.isNull(schoolId)) { + // 查询所有绑定了企业微信的学校信息 + schoolList = remoteDeptService.listSchoolBySchoolType(Dept.TYPE_QYWX).getData(); + } else { + Dept school = remoteDeptService.getInfoByIdNoPermission(schoolId).getData(); + schoolList.add(school); + } + if (CollectionUtils.isNotEmpty(schoolList)) { for (Dept school : schoolList) { log.info("[{}], schoolId:[{}]开始同步家校部门", school.getDeptName(), school.getDeptId()); log.info("当前学校信息: {}", school); EduApp contactSchoolApp = appMapper.selectOne(Wrappers.lambdaQuery(new EduApp()).eq(EduApp::getDeptId, - school.getDeptId()).eq(EduApp::getName, AppConstant.CONTACT_SCHOOL)); + school.getDeptId()).eq(EduApp::getCode, AppConstant.CONTACT_SCHOOL)); // 判断学校是否绑定了大华 boolean bindDaHuaFlag = false; - if (school.getSchoolType().contains(Dept.TYPE_DAHUA)) { - bindDaHuaFlag = true; - } +// if (school.getSchoolType().contains(Dept.TYPE_DAHUA)) { +// bindDaHuaFlag = true; +// } // 查询家校部门列表 List schoolDeptList = wxUtil.listSchoolDept(wxUtil.getAccessToken(contactSchoolApp.getWxCorpId(), contactSchoolApp.getWxSecret()), null); @@ -1160,11 +1525,22 @@ public class EduUserDeptServiceImpl extends ServiceImpl if (wxId == 1) { continue; } - Long parentId = wxIdAndDeptIdCache.get(parentWxId); + // 判断错误数据. 放在根节点下的非校区数据不同步 + if (parentWxId == 1 && !UserDeptTypeEnum.CAMPUS_TYPE.getValue().equals(type)) { + continue; + } + EduUserDept existParent = this.getOne(Wrappers.lambdaQuery() + .eq(EduUserDept::getWxId, parentWxId) + .eq(EduUserDept::getSchoolId, school.getDeptId())); + if (Objects.isNull(existParent) && parentWxId != 1) { + log.error("没有父级部门数据: {}", parentWxId); + continue; + } // 查询已存在的数据 log.info("家校部门查询已存在的数据, wxId: {}, parentWxId: {}, schoolId: {}", wxId, parentWxId, school.getDeptId()); + Long parentId = wxIdAndDeptIdCache.get(parentWxId); EduUserDept exist = this.getOne(Wrappers.lambdaQuery() .eq(EduUserDept::getWxId, wxId) .eq(EduUserDept::getParentWxId, parentWxId) @@ -1190,6 +1566,7 @@ public class EduUserDeptServiceImpl extends ServiceImpl exist.setVisible(DeptVisibleTypeEnum.VISIBLE_TYPE.getValue()); exist.setUpdateDate(LocalDateTime.now()); } + // 设置排序 Integer oldOrder = wxIdAndOrderCache.get(parentWxId); if (Objects.isNull(order) && Objects.isNull(exist.getOrderNum())) { order = SortUtil.getOrderNumber(oldOrder, -1000); @@ -1218,6 +1595,47 @@ public class EduUserDeptServiceImpl extends ServiceImpl wxIdAndOrderCache.put(wxId, 0); wxIdAndOrderCache.put(parentWxId, oldOrder + 1); + Long campusId = null; + Long sectionId = null; + Long gradeId = null; + Long classId = null; + switch (exist.getDeptType()) { + case 1: + /// 班级 + classId = exist.getDeptId(); + gradeId = exist.getParentId(); + // 查询学段信息 + EduUserDept section = getParentByDeptId(gradeId); + sectionId = section.getDeptId(); + campusId = section.getParentId(); + break; + case 2: + // 年级 + gradeId = exist.getDeptId(); + sectionId = exist.getParentId(); + campusId = getById(sectionId).getParentId(); + break; + case 3: + // 学段 + sectionId = exist.getDeptId(); + campusId = exist.getParentId(); + break; + case 4: + // 学区 + campusId = exist.getDeptId(); + break; + default: + log.error("家校部门类型错误, 部门信息:{}", dept); + break; + } + // 获取老师列表 + List teacherList = (List) dept.get("department_admins"); + log.info("teachers:{},dept:{}", teacherList, dept); + if (CollUtil.isNotEmpty(teacherList)) { + eduStaffService.dealWxTeacherChange(school.getDeptId(), campusId, sectionId, gradeId, classId, + teacherList, wxId); + } + // 判断是否调用大华接口 if (bindDaHuaFlag) { // 查询当前部门 @@ -1392,4 +1810,230 @@ public class EduUserDeptServiceImpl extends ServiceImpl } return vo; } + + @Override + public List listClassByStaffId(Long staffId) { + CurrentUser currentUser = FebsUtil.getCurrentUser(); + //取缓存 + String staffMangeClassData = (String) redisService + .get(CachePrefixConstant.STAFF_MANGE_CLASS + staffId); + + if (ObjectUtil.isNull(staffMangeClassData)) { + //任课老师、班主任、年级主任、学段主任、学区主任 + List totalClassDeptList = new ArrayList<>(); + //任课老师 + List teacherDeptVOS = eduStaffMapper.listDeptByTeacher(currentUser.getIdentityId(), 4); + //班主任 + if (currentUser.getRolePerms().contains(RoleEnum.ROLE_CLASS_PRINCIPAL.getValue())) { + List teacherDeptVOList = eduStaffMapper.listDeptByTeacher(staffId, 3); + teacherDeptVOS.addAll(teacherDeptVOList); + } + for (TeacherDeptVO teacherDeptVO : teacherDeptVOS) { + teacherDeptVO.setClassName(this.getById(teacherDeptVO.getClassId()).getDeptName()); + teacherDeptVO.setGradeName(this.getById(teacherDeptVO.getGradeId()).getDeptName()); + teacherDeptVO.setSectionName(this.getById(teacherDeptVO.getSectionId()).getDeptName()); + teacherDeptVO.setCampusName(this.getById(teacherDeptVO.getCampusId()).getDeptName()); + Long studentNum = eduStudentMapper.selectCount(Wrappers.lambdaQuery(new EduStudent()) + .eq(EduStudent::getClassId, teacherDeptVO.getClassId())); + //班级人数 + teacherDeptVO.setClassStudentNum(studentNum); + totalClassDeptList.add(teacherDeptVO); + } + + //年级主任 + if (currentUser.getRolePerms().contains(RoleEnum.ROLE_GRADE_PRINCIPAL.getValue())) { + List teacherDeptVOList_grade = eduStaffMapper.listDeptByTeacher(staffId, 2); + for (TeacherDeptVO teacherDeptVO : teacherDeptVOList_grade) { + String gradeName = this.getById(teacherDeptVO.getGradeId()).getDeptName(); + String sectionName = this.getById(teacherDeptVO.getSectionId()).getDeptName(); + String campusName = this.getById(teacherDeptVO.getCampusId()).getDeptName(); + List childByParent = findChildByParent(teacherDeptVO.getGradeId()); + for (EduUserDept eduUserDept : childByParent) { + TeacherDeptVO teacherDeptVO1 = new TeacherDeptVO(); + teacherDeptVO1.setGradeId(teacherDeptVO.getGradeId()); + teacherDeptVO1.setClassId(eduUserDept.getDeptId()); + teacherDeptVO1 + .setClassName(this.getById(eduUserDept.getDeptId()).getDeptName()); + teacherDeptVO1.setGradeName(gradeName); + teacherDeptVO1.setSectionName(sectionName); + teacherDeptVO1.setCampusName(campusName); + + Long studentNum = eduStudentMapper.selectCount(Wrappers.lambdaQuery(new EduStudent()) + .eq(EduStudent::getClassId, eduUserDept.getDeptId())); + //班级人数 + teacherDeptVO1.setClassStudentNum(studentNum); + totalClassDeptList.add(teacherDeptVO1); + } + } + } + + //学段主任 + if (currentUser.getRolePerms().contains(RoleEnum.ROLE_SECTION_PRINCIPAL.getValue())) { + List sectionList = eduStaffMapper.listDeptByTeacher(staffId, 5); + for (TeacherDeptVO section : sectionList) { + String campusName = this.getById(section.getCampusId()).getDeptName(); + String sectionName = this.getById(section.getSectionId()).getDeptName(); + List gradeList = findChildByParentAndType(Collections.singletonList(section.getSectionId()), 2); + for (EduUserDept grade : gradeList) { + String gradeName = this.getById(grade.getDeptId()).getDeptName(); + List classList = findChildByParent(grade.getDeptId()); + for (EduUserDept clazz : classList) { + TeacherDeptVO teacherDeptVO = new TeacherDeptVO(); + teacherDeptVO.setGradeId(grade.getDeptId()); + teacherDeptVO.setClassId(clazz.getDeptId()); + teacherDeptVO + .setClassName(this.getById(clazz.getDeptId()).getDeptName()); + teacherDeptVO.setGradeName(gradeName); + teacherDeptVO.setCampusName(campusName); + Long studentNum = eduStudentMapper.selectCount(Wrappers.lambdaQuery(new EduStudent()) + .eq(EduStudent::getClassId, clazz.getDeptId())); + //班级人数 + teacherDeptVO.setClassStudentNum(studentNum); + totalClassDeptList.add(teacherDeptVO); + } + } + } + } + //学区主任 + if (currentUser.getRolePerms().contains(RoleEnum.ROLE_CAMPUS_PRINCIPAL.getValue())) { + List campusList = eduStaffMapper.listDeptByTeacher(staffId, 1); + for (TeacherDeptVO campus : campusList) { + String campusName = this.getById(campus.getCampusId()).getDeptName(); + List gradeList = findChildByParentAndType(Collections.singletonList(campus.getCampusId()), 2); + for (EduUserDept grade : gradeList) { + String gradeName = this.getById(grade.getDeptId()).getDeptName(); + List classList = findChildByParent(grade.getDeptId()); + for (EduUserDept clazz : classList) { + TeacherDeptVO teacherDeptVO = new TeacherDeptVO(); + teacherDeptVO.setGradeId(grade.getDeptId()); + teacherDeptVO.setClassId(clazz.getDeptId()); + teacherDeptVO + .setClassName(this.getById(clazz.getDeptId()).getDeptName()); + teacherDeptVO.setGradeName(gradeName); + teacherDeptVO.setCampusName(campusName); + + Long studentNum = eduStudentMapper.selectCount(Wrappers.lambdaQuery(new EduStudent()) + .eq(EduStudent::getClassId, clazz.getDeptId())); + //班级人数 + teacherDeptVO.setClassStudentNum(studentNum); + + totalClassDeptList.add(teacherDeptVO); + } + } + } + } + //查询学校负责人,即校领导 + List schoolList = eduStaffMapper.listDeptByTeacher(staffId, 6); + if (CollUtil.isNotEmpty(schoolList)) { + for (TeacherDeptVO school : schoolList) { + List campusList = findChildByParentAndType( + Collections.singletonList(-school.getSchoolId()), 4); + for (EduUserDept campus : campusList) { + String campusName = this.getById(campus.getDeptId()).getDeptName(); + List gradeList = findChildByParentAndType(Collections.singletonList(campus.getDeptId()), + 2); + for (EduUserDept grade : gradeList) { + String gradeName = this.getById(grade.getDeptId()).getDeptName(); + List classList = findChildByParent(grade.getDeptId()); + for (EduUserDept clazz : classList) { + TeacherDeptVO teacherDeptVO = new TeacherDeptVO(); + teacherDeptVO.setGradeId(grade.getDeptId()); + teacherDeptVO.setClassId(clazz.getDeptId()); + teacherDeptVO + .setClassName(this.getById(clazz.getDeptId()).getDeptName()); + teacherDeptVO.setGradeName(gradeName); + teacherDeptVO.setCampusName(campusName); + Long studentNum = eduStudentMapper.selectCount(Wrappers.lambdaQuery(new EduStudent()) + .eq(EduStudent::getClassId, clazz.getDeptId())); + //班级人数 + teacherDeptVO.setClassStudentNum(studentNum); + totalClassDeptList.add(teacherDeptVO); + } + } + } + } + } + //去重 + totalClassDeptList = totalClassDeptList.stream().distinct().collect(Collectors.toList()); + + if (CollUtil.isNotEmpty(totalClassDeptList)) { + redisService + .set(CachePrefixConstant.STAFF_MANGE_CLASS + staffId, JSONUtil.toJsonStr(totalClassDeptList)); + } + return totalClassDeptList; + } else { + List teacherDeptVOList = JSONUtil.toList(staffMangeClassData, TeacherDeptVO.class); + return teacherDeptVOList; + } + } + + + /** + * 更新学校缓存班级数据信息 + * + * @param schoolId + */ + public void updateSchoolClassData(Long schoolId) { + if (ObjectUtil.isNull(schoolId)) { + return; + } + //查询学校下的所有班级 +// List classList = new ArrayList<>(); +// List campusList = this.findChildByParentAndType(Collections.singletonList(-schoolId), 4); +// for (EduUserDept campus : campusList) { +// List gradeList = this.findChildByParentAndType(Collections.singletonList(campus.getDeptId()), 2); +// for (EduUserDept grade : gradeList) { +// List nowList = this.findChildByParentAndType(Collections.singletonList(grade.getDeptId()), 1); +// for (EduUserDept classDept : nowList) { +// classList.add(ClassAttendanceDataVO.builder().type(0).classId(classDept.getDeptId()) +// .name(campus.getDeptName() + "/" + grade.getDeptName() + "/" + classDept +// .getDeptName()).build()); +// } +// } +// } + redisService + .del(CachePrefixConstant.SCHOOL_CLASS_DATA + schoolId); + } + + @Override + public JSONArray getGradeDistribution(Long schoolId) { + JSONArray jsonArray = JSONUtil.createArray(); + // 查询学校总人数 + long studentNum = eduStudentMapper.selectCount(Wrappers.lambdaQuery(new EduStudent()) + .eq(EduStudent::getSchoolId, schoolId)); + // 查询年级信息 + List gradeList = list(Wrappers.lambdaQuery(new EduUserDept()) + .eq(EduUserDept::getDeptType, UserDeptTypeEnum.GRADE_TYPE.getValue()) + .eq(EduUserDept::getVisible, DeptVisibleTypeEnum.VISIBLE_TYPE.getValue()) + .eq(EduUserDept::getGraduatedStatus, GraduatedStatusEnum.UNDERGRADUATE_STATUS.getValue()) + .eq(EduUserDept::getSchoolId, schoolId) + ); + for (EduUserDept grade : gradeList) { + JSONObject jsonObject = JSONUtil.createObj() + .set("gardeName", grade.getDeptName()); + // 查询学段名称 + EduUserDept section = getById(grade.getParentId()); + jsonObject.set("sectionName", section.getDeptName()); + // 查询学区名称 + EduUserDept campus = getById(section.getParentId()); + jsonObject.set("campusName", campus.getDeptName()); + if (studentNum == 0) { + jsonObject.set("gradeStudentNumber", 0); + jsonObject.set("percentage", "0%"); + } else { + // 查询年级人数 + long gradeStudentNumber = eduStudentMapper.selectGradeStudentNumber(grade.getDeptId()); + if (gradeStudentNumber == 0) { + jsonObject.set("gradeStudentNumber", 0); + jsonObject.set("percentage", "0%"); + } else { + jsonObject.set("gradeStudentNumber", gradeStudentNumber); + jsonObject.set("percentage", NumberUtil.div(gradeStudentNumber * 100, studentNum, 2) + "%"); + } + } + + jsonArray.add(jsonObject); + } + return jsonArray; + } } diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduUserDeviceFactoryServiceImpl.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduUserDeviceFactoryServiceImpl.java index 5a10c8e..1fe2bbb 100644 --- a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduUserDeviceFactoryServiceImpl.java +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduUserDeviceFactoryServiceImpl.java @@ -8,15 +8,13 @@ import com.yida.data.user.mapper.EduStudentMapper; import com.yida.data.user.mapper.EduUserDeviceFactoryMapper; import com.yida.data.user.service.EduUserDeviceFactoryService; import com.yida.data.user.vo.UserDeviceInfoVO; - +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.util.List; import java.util.stream.Collectors; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - @RequiredArgsConstructor @Slf4j @Service @@ -28,7 +26,7 @@ public class EduUserDeviceFactoryServiceImpl extends ServiceImpl userDeviceFactoryList) { List exist = baseMapper.existUserDeviceFactory(userDeviceFactoryList); List res = - userDeviceFactoryList.stream().filter(x -> !exist.contains(x.getUserId().toString() + x.getUserType().toString())).collect(Collectors.toList()); + userDeviceFactoryList.stream().filter(x -> !exist.contains(x.getTypeFlag())).collect(Collectors.toList()); saveBatch(res); } diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduUserFaceServiceImpl.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduUserFaceServiceImpl.java index d0f996d..c1242a1 100644 --- a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduUserFaceServiceImpl.java +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/EduUserFaceServiceImpl.java @@ -11,10 +11,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.yida.data.attendance.dto.IssuedFaceDTO; import com.yida.data.attendance.feign.RemoteAttendanceDeviceService; import com.yida.data.common.core.entity.constant.CachePrefixConstant; -import com.yida.data.common.core.entity.user.EduStaff; -import com.yida.data.common.core.entity.user.EduStudent; -import com.yida.data.common.core.entity.user.EduUserDevice; -import com.yida.data.common.core.entity.user.EduUserFace; +import com.yida.data.common.core.entity.user.*; import com.yida.data.common.core.exception.FebsException; import com.yida.data.common.core.utils.Asserts; import com.yida.data.common.core.utils.FileUtil; @@ -39,10 +36,7 @@ import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.File; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -56,7 +50,7 @@ import java.util.stream.Collectors; @RequiredArgsConstructor @Transactional(propagation = Propagation.SUPPORTS, readOnly = true) public class EduUserFaceServiceImpl extends ServiceImpl - implements EduUserFaceService { + implements EduUserFaceService { private final EduStudentMapper eduStudentMapper; private final EduStaffMapper eduStaffMapper; @@ -70,7 +64,7 @@ public class EduUserFaceServiceImpl extends ServiceImpl @Override public String uploadUserFace(MultipartFile file, Long id, String name, - Long schoolId, Integer type) { + Long schoolId, Integer type) { //处理图片到100k String path; try { @@ -104,7 +98,7 @@ public class EduUserFaceServiceImpl extends ServiceImpl public void updateUserUpLoadFace(String picPath, Long id, String name, Integer type) { // 新增更新人脸 EduUserFace userFace = getOne( - Wrappers.lambdaQuery(new EduUserFace()).eq(EduUserFace::getUserId, id).eq(EduUserFace::getUserType, type)); + Wrappers.lambdaQuery(new EduUserFace()).eq(EduUserFace::getUserId, id).eq(EduUserFace::getUserType, type)); if (userFace == null) { userFace = new EduUserFace(); userFace.setUserId(id); @@ -128,19 +122,26 @@ public class EduUserFaceServiceImpl extends ServiceImpl eduStaffMapper.updateById(staff); } List userDeviceList = eduUserDeviceMapper.selectList( - Wrappers.lambdaQuery(new EduUserDevice()).eq(EduUserDevice::getUserId, id).eq(EduUserDevice::getUserType, type)); + Wrappers.lambdaQuery(new EduUserDevice()).eq(EduUserDevice::getUserId, id).eq(EduUserDevice::getUserType, type)); if (CollUtil.isNotEmpty(userDeviceList)) { // 用户已经被下发到设备,更新设备上的图像 - List deviceIds = userDeviceList.stream().map(x -> x.getDeviceId()).distinct().collect(Collectors.toList()); - IssuedFaceDTO dto = new IssuedFaceDTO(); - dto.setType(1); - dto.setDeviceList(deviceIds); - dto.setUserFaceList(Arrays.asList(userFace)); - remoteAttendanceDeviceService.issuedFace(dto); + Map> userDeviceMap = userDeviceList.stream().collect( + Collectors.groupingBy(EduUserDevice::getFaceGroupId)); + for (Map.Entry> entry : userDeviceMap.entrySet()) { + Long faceGroupId = entry.getKey(); + List eduUserDevices = entry.getValue(); + // 设备id + List deviceIds = eduUserDevices.stream().map(EduUserDevice::getDeviceId).distinct() + .collect(Collectors.toList()); + IssuedFaceDTO dto = new IssuedFaceDTO(); +// dto.setType(1); + dto.setDeviceList(deviceIds); + dto.setGroupId(faceGroupId); + dto.setUserFaceList(Collections.singletonList(userFace)); + remoteAttendanceDeviceService.issuedFace(dto); + } } - //异步同步大华 - - + // TODO 2023/3/1 异步同步大华 } @Override @@ -173,28 +174,28 @@ public class EduUserFaceServiceImpl extends ServiceImpl if (importType == 0) { if (type == 0) { EduStudent student = eduStudentMapper.selectOne( - Wrappers.lambdaQuery(new EduStudent()).eq(EduStudent::getStuNumber, userFlag) - .eq(EduStudent::getSchoolId, schoolId)); + Wrappers.lambdaQuery(new EduStudent()).eq(EduStudent::getStuNumber, userFlag) + .eq(EduStudent::getSchoolId, schoolId)); userId = student != null ? student.getId() : null; userName = student != null ? student.getStuName() : null; } else { EduStaff staff = - eduStaffMapper.selectOne(Wrappers.lambdaQuery(new EduStaff()).eq(EduStaff::getMobile, userFlag) - .eq(EduStaff::getSchoolId, schoolId)); + eduStaffMapper.selectOne(Wrappers.lambdaQuery(new EduStaff()).eq(EduStaff::getMobile, userFlag) + .eq(EduStaff::getSchoolId, schoolId)); userId = staff != null ? staff.getId() : null; userName = staff != null ? staff.getName() : null; } } else { // 按名称导入 if (type == 0) { List studentList = eduStudentMapper.selectList(Wrappers.lambdaQuery(new EduStudent()) - .eq(EduStudent::getStuName, userFlag) - .eq(EduStudent::getSchoolId, schoolId)); + .eq(EduStudent::getStuName, userFlag) + .eq(EduStudent::getSchoolId, schoolId)); userId = CollUtil.isNotEmpty(studentList) && studentList.size() == 1 ? studentList.get(0).getId() : null; userName = userId != null ? studentList.get(0).getStuName() : null; } else { List staffList = eduStaffMapper.selectList(Wrappers.lambdaQuery(new EduStaff()) - .eq(EduStaff::getMobile, userFlag) - .eq(EduStaff::getSchoolId, schoolId)); + .eq(EduStaff::getMobile, userFlag) + .eq(EduStaff::getSchoolId, schoolId)); userId = CollUtil.isNotEmpty(staffList) && staffList.size() == 1 ? staffList.get(0).getId() : null; userName = userId != null ? staffList.get(0).getName() : null; } @@ -207,12 +208,20 @@ public class EduUserFaceServiceImpl extends ServiceImpl // 压缩图片至1000KB File compressImg = null; try { - compressImg = FileUtil.compressImg(img, 1000L); + compressImg = FileUtil.compressImg(img, 100L); } catch (Exception e) { log.error("压缩图片失败", e); + errorFiles.add(img); + continue; } imgPath = FileUtil.uploadFileToMediaServer(uploadUrl, compressImg); - updateUserFace(imgPath, userId, userName, type); + try { + updateUserFace(imgPath, userId, userName, type); + } catch (Exception e) { + log.error("人脸识别失败, 图片名称: {}", img.getName(), e); + errorFiles.add(img); + continue; + } // 进度增加更新进度 if (finish * 100 / total > percent) { faceVO.setPercent(finish * 100 / total); @@ -244,46 +253,79 @@ public class EduUserFaceServiceImpl extends ServiceImpl Integer total = (Integer) redisService.get(CachePrefixConstant.ISSUE_FACE_TOTAL + faceGroupId); Integer error = (Integer) redisService.get(CachePrefixConstant.ISSUE_FACE_ERROR + faceGroupId); Integer finish = (Integer) redisService.get(CachePrefixConstant.ISSUE_FACE_FINISH + faceGroupId); - List objects = redisService.lGet(CachePrefixConstant.ISSUE_FACE_ERROR_MSG + faceGroupId, 0L, -1L); + // 错误信息 + List objects = new ArrayList<>(); + // 错误信息键值集合 + Set keys = redisService.keys(CachePrefixConstant.ISSUE_FACE_ERROR_MSG + faceGroupId); + if (CollUtil.isNotEmpty(keys)) { + keys.forEach(key -> objects.addAll(redisService.lGet(key, 0L, -1L))); + } + IssueFacePercentVO vo = null; if (total != null) { vo = new IssueFacePercentVO(); vo.setErrorNum(error); - vo.setPercent(total != null && finish != null ? finish * 100 / total : 100); + // TODO: 2023/9/18 后续优化百分比信息,此处修改为最大100 + int percent = 0; + if (Objects.nonNull(finish)) { + if (total <= finish) { + percent = 100; + } else { + percent = finish * 100 / total; + } + } +// vo.setPercent(total != null && finish != null ? finish * 100 / total : 100); + vo.setPercent(percent); vo.setFinish(vo.getPercent() < 100 ? 0 : 1); if (CollUtil.isNotEmpty(objects)) { List msgList = new ArrayList<>(); Map> userGroup = objects.stream().map(x -> (EduUserFace) x) - .collect(Collectors.groupingBy(EduUserFace::getUserType)); + .collect(Collectors.groupingBy(EduUserFace::getUserType)); // 查询学生信息 if (userGroup.containsKey(0)) { - List studentIds = userGroup.get(0).stream().map(x -> x.getUserId()).collect(Collectors.toList()); + // 学生人脸信息 + List studentFaces = userGroup.get(0); + // 学生信息 List studentList = eduStudentMapper - .listStudent(ListStudentDTO.builder().studentIds(studentIds).build()); + .listStudent(ListStudentDTO.builder().studentIds( + studentFaces.stream().map(EduUserFace::getUserId).collect(Collectors.toList())) + .build()); msgList.addAll(studentList.stream().map(x -> { UserInfoVO infoVO = new UserInfoVO(); infoVO.setName(x.getStuName()); infoVO.setDept(x.getGradeName() + x.getClassName()); infoVO.setNumber(x.getStuNumber()); + infoVO.setDeviceName(studentFaces.stream() + .filter(userFace -> userFace.getUserId().equals(x.getId())) + .collect(Collectors.toList()) + .get(0).getDeviceName()); return infoVO; }).collect(Collectors.toList())); } // 查询职工信息 if (userGroup.containsKey(1)) { - List staffIds = userGroup.get(1).stream().map(x -> x.getUserId()).collect(Collectors.toList()); - List staffList = eduStaffMapper.listStaff(ListStaffDTO.builder().ids(staffIds).build()); + // 职工人脸信息 + List staffFaces = userGroup.get(1); + // 职工信息 + List staffList = eduStaffMapper.listStaff(ListStaffDTO.builder().ids( + staffFaces.stream().map(EduUserFace::getUserId).collect(Collectors.toList())) + .build()); msgList.addAll(staffList.stream().map(x -> { UserInfoVO infoVO = new UserInfoVO(); infoVO.setName(x.getName()); infoVO.setDept(CollUtil.isNotEmpty(x.getStaffDept()) - ? x.getStaffDept().stream().map(y -> y.getDeptName()).collect(Collectors.joining(",")) - : null); + ? x.getStaffDept().stream().map(EduStaffDept::getDeptName).collect(Collectors.joining(",")) + : null); infoVO.setNumber(x.getMobile()); + infoVO.setDeviceName(staffFaces.stream() + .filter(userFace -> userFace.getUserId().equals(x.getId())) + .collect(Collectors.toList()) + .get(0).getDeviceName()); return infoVO; }).collect(Collectors.toList())); } - vo.setMsgList(msgList); + vo.setMsgList(msgList.stream().distinct().collect(Collectors.toList())); } } return vo; @@ -300,7 +342,7 @@ public class EduUserFaceServiceImpl extends ServiceImpl Asserts.isTrue(containsFace, "未检测到人脸,请重新上传图片"); // 新增更新人脸 EduUserFace userFace = getOne( - Wrappers.lambdaQuery(new EduUserFace()).eq(EduUserFace::getUserId, id).eq(EduUserFace::getUserType, type)); + Wrappers.lambdaQuery(new EduUserFace()).eq(EduUserFace::getUserId, id).eq(EduUserFace::getUserType, type)); if (userFace == null) { userFace = new EduUserFace(); userFace.setUserId(id); @@ -324,15 +366,24 @@ public class EduUserFaceServiceImpl extends ServiceImpl eduStaffMapper.updateById(staff); } List userDeviceList = eduUserDeviceMapper.selectList( - Wrappers.lambdaQuery(new EduUserDevice()).eq(EduUserDevice::getUserId, id).eq(EduUserDevice::getUserType, type)); + Wrappers.lambdaQuery(new EduUserDevice()).eq(EduUserDevice::getUserId, id).eq(EduUserDevice::getUserType, type)); if (CollUtil.isNotEmpty(userDeviceList)) { // 用户已经被下发到设备,更新设备上的图像 - List deviceIds = userDeviceList.stream().map(x -> x.getDeviceId()).distinct().collect(Collectors.toList()); - IssuedFaceDTO dto = new IssuedFaceDTO(); - dto.setType(1); - dto.setDeviceList(deviceIds); - dto.setUserFaceList(Arrays.asList(userFace)); - remoteAttendanceDeviceService.issuedFace(dto); + Map> userDeviceMap = userDeviceList.stream().collect( + Collectors.groupingBy(EduUserDevice::getFaceGroupId)); + for (Map.Entry> entry : userDeviceMap.entrySet()) { + Long faceGroupId = entry.getKey(); + List eduUserDevices = entry.getValue(); + // 设备id + List deviceIds = eduUserDevices.stream().map(EduUserDevice::getDeviceId).distinct() + .collect(Collectors.toList()); + IssuedFaceDTO dto = new IssuedFaceDTO(); +// dto.setType(1); + dto.setDeviceList(deviceIds); + dto.setGroupId(faceGroupId); + dto.setUserFaceList(Collections.singletonList(userFace)); + remoteAttendanceDeviceService.issuedFace(dto); + } } } diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/ImportWelcomeStudentServiceImpl.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/ImportWelcomeStudentServiceImpl.java index d8dad64..eb0f947 100644 --- a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/ImportWelcomeStudentServiceImpl.java +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/ImportWelcomeStudentServiceImpl.java @@ -1,28 +1,32 @@ package com.yida.data.user.service.impl; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.LocalDateTimeUtil; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.yida.data.common.core.common.ResultMsgType; import com.yida.data.common.core.entity.CurrentUser; import com.yida.data.common.core.entity.Dict; import com.yida.data.common.core.entity.constant.StringConstant; +import com.yida.data.common.core.entity.consume.EduStudentConsumeCard; import com.yida.data.common.core.entity.school.EduSchoolStudentInformation; import com.yida.data.common.core.entity.user.EduParent; -import com.yida.data.common.core.entity.user.EduParentStudent; import com.yida.data.common.core.entity.user.EduStudent; import com.yida.data.common.core.entity.user.EduUserDept; +import com.yida.data.common.core.entity.user.enums.StudentTypeEnum; import com.yida.data.common.core.entity.user.enums.UserDeptTypeEnum; import com.yida.data.common.core.enums.DictType; +import com.yida.data.common.core.utils.EasyExcelUtil; import com.yida.data.common.core.utils.FebsUtil; -import com.yida.data.common.core.utils.WxUtil; import com.yida.data.common.service.CommonService; +import com.yida.data.device.feign.consume.RemoteConsumeCardService; import com.yida.data.system.feign.RemoteCommonService; -import com.yida.data.user.dto.StudentErrorExportDTO; -import com.yida.data.user.dto.WelcomeInviteImportDTO; -import com.yida.data.user.dto.WelcomeStudentImportDTO; -import com.yida.data.user.feign.RemoteStudentService; +import com.yida.data.user.dto.*; import com.yida.data.user.mapper.EduSchoolStudentInformationMapper; -import com.yida.data.user.service.*; +import com.yida.data.user.service.EduStudentService; +import com.yida.data.user.service.ImportWelcomeStudentService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -31,6 +35,7 @@ import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; +import javax.annotation.Resource; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.*; @@ -47,16 +52,14 @@ import java.util.stream.Collectors; @RequiredArgsConstructor public class ImportWelcomeStudentServiceImpl implements ImportWelcomeStudentService { - private final EduSchoolStudentInformationMapper eduSchoolStudentInformationMapper; private final EduStudentService eduStudentService; - private final EduParentService eduParentService; - private final EduParentStudentService eduParentStudentService; - private final EduUserDeptService eduUserDeptService; - private final RemoteStudentService remoteStudentService; + private final EduSchoolStudentInformationMapper eduSchoolStudentInformationMapper; + + private final CommonService commonService; private final RemoteCommonService remoteCommonService; - private final WxUtil wxUtil; - private final CommonService commonService; + @Resource + private RemoteConsumeCardService remoteConsumeCardService; /** @@ -71,9 +74,9 @@ public class ImportWelcomeStudentServiceImpl implements ImportWelcomeStudentServ */ @Override public void saveExcelData(ConcurrentHashMap concurrentHashMap, - ConcurrentHashMap errorMap, - Long schoolId, - long timestamp) { + ConcurrentHashMap errorMap, + Long schoolId, + long timestamp) { // 当前登录用户信息 CurrentUser currentUser = FebsUtil.getCurrentUser(); // 当前时间 @@ -91,10 +94,10 @@ public class ImportWelcomeStudentServiceImpl implements ImportWelcomeStudentServ } // 验证身份证号码在当前学校的迎新表中是否重复 List studentList = - this.eduSchoolStudentInformationMapper.selectList(Wrappers.lambdaQuery(new EduSchoolStudentInformation()) - .eq(EduSchoolStudentInformation::getStudentIdCard, welcomeStudentDTO.getStudentIdCard()) - .eq(EduSchoolStudentInformation::getSchoolId, schoolId) - ); + this.eduSchoolStudentInformationMapper.selectList(Wrappers.lambdaQuery(new EduSchoolStudentInformation()) + .eq(EduSchoolStudentInformation::getStudentIdCard, welcomeStudentDTO.getStudentIdCard()) + .eq(EduSchoolStudentInformation::getSchoolId, schoolId) + ); if (!studentList.isEmpty()) { log.error("身份证号码已存在: {}", welcomeStudentDTO.toString()); errorMap.put(i, "第" + i + "行:" + ResultMsgType.ID_CARD_EXIST.getValue()); @@ -102,8 +105,8 @@ public class ImportWelcomeStudentServiceImpl implements ImportWelcomeStudentServ } // 验证学区是否存在 EduUserDept campus = commonService.getUserDeptBySchoolIdAndNameAndType( - welcomeStudentDTO.getCampusName(), UserDeptTypeEnum.CAMPUS_TYPE.getValue(), - schoolId, String.valueOf(timestamp), schoolId); + welcomeStudentDTO.getCampusName(), UserDeptTypeEnum.CAMPUS_TYPE.getValue(), + schoolId, String.valueOf(timestamp), schoolId); if (!Optional.ofNullable(campus).isPresent()) { log.error("学区名称错误: {}", welcomeStudentDTO.toString()); errorMap.put(i, "第" + i + "行:" + ResultMsgType.CAMPUS_NAME_ERROR.getValue()); @@ -111,8 +114,8 @@ public class ImportWelcomeStudentServiceImpl implements ImportWelcomeStudentServ } // 验证学段是否存在 EduUserDept section = commonService.getUserDeptBySchoolIdAndNameAndType( - welcomeStudentDTO.getSectionName(), UserDeptTypeEnum.SECTION_TYPE.getValue(), - schoolId, String.valueOf(timestamp), campus.getDeptId()); + welcomeStudentDTO.getSectionName(), UserDeptTypeEnum.SECTION_TYPE.getValue(), + schoolId, String.valueOf(timestamp), campus.getDeptId()); if (!Optional.ofNullable(section).isPresent()) { log.error("学段名称错误: {}", welcomeStudentDTO.toString()); errorMap.put(i, "第" + i + "行:" + ResultMsgType.SECTION_NAME_ERROR.getValue()); @@ -120,8 +123,8 @@ public class ImportWelcomeStudentServiceImpl implements ImportWelcomeStudentServ } // 验证年级是否存在 EduUserDept grade = commonService.getUserDeptBySchoolIdAndNameAndType( - welcomeStudentDTO.getGradeName(), UserDeptTypeEnum.GRADE_TYPE.getValue(), - schoolId, String.valueOf(timestamp), section.getDeptId()); + welcomeStudentDTO.getGradeName(), UserDeptTypeEnum.GRADE_TYPE.getValue(), + schoolId, String.valueOf(timestamp), section.getDeptId()); if (!Optional.ofNullable(grade).isPresent()) { log.error("年级名称错误: {}", welcomeStudentDTO.toString()); errorMap.put(i, "第" + i + "行:" + ResultMsgType.GRADE_NAME_ERROR.getValue()); @@ -129,8 +132,8 @@ public class ImportWelcomeStudentServiceImpl implements ImportWelcomeStudentServ } // 验证班级是否存在 EduUserDept classDept = commonService.getUserDeptBySchoolIdAndNameAndType( - welcomeStudentDTO.getClassName(), UserDeptTypeEnum.CLASS_TYPE.getValue(), - schoolId, String.valueOf(timestamp), grade.getDeptId()); + welcomeStudentDTO.getClassName(), UserDeptTypeEnum.CLASS_TYPE.getValue(), + schoolId, String.valueOf(timestamp), grade.getDeptId()); if (!Optional.ofNullable(classDept).isPresent()) { log.error("班级名称错误: {}", welcomeStudentDTO.toString()); errorMap.put(i, "第" + i + "行:" + ResultMsgType.CLASS_NAME_ERROR.getValue()); @@ -169,7 +172,7 @@ public class ImportWelcomeStudentServiceImpl implements ImportWelcomeStudentServ * @date 2021/8/23 17:30 */ private boolean checkStudentImportInfo(ConcurrentHashMap errorMap, - WelcomeStudentImportDTO welcomeStudentDTO, Integer i) { + WelcomeStudentImportDTO welcomeStudentDTO, Integer i) { // 判断学生名称是否为空 if (!StringUtils.isNotBlank(welcomeStudentDTO.getStudentName())) { errorMap.put(i, "第" + i + "行:学生姓名为空"); @@ -216,8 +219,8 @@ public class ImportWelcomeStudentServiceImpl implements ImportWelcomeStudentServ */ @Override public void saveInviteExcelData(ConcurrentHashMap concurrentHashMap, - List errorList, - Long schoolId, String uuid, CurrentUser currentUser) { + List errorList, + Long schoolId, String uuid, CurrentUser currentUser) { if (!CollectionUtils.isEmpty(concurrentHashMap)) { // 保存前判断是否已存在 for (Map.Entry entry : concurrentHashMap.entrySet()) { @@ -234,12 +237,12 @@ public class ImportWelcomeStudentServiceImpl implements ImportWelcomeStudentServ } // 验证学号在当前学校的学生表中是否重复 EduStudent studentNumberEntity = eduStudentService.getOne( - Wrappers.lambdaQuery(new EduStudent()) - .eq(EduStudent::getStuNumber, welcomeInviteImportDTO.getStudentNumber()) - .eq(EduStudent::getSchoolId, schoolId)); + Wrappers.lambdaQuery(new EduStudent()) + .eq(EduStudent::getStuNumber, welcomeInviteImportDTO.getStudentNumber()) + .eq(EduStudent::getSchoolId, schoolId)); if (Objects.nonNull(studentNumberEntity)) { - log.error("学号已存在: {}", welcomeInviteImportDTO.toString()); + log.error("学号已存在: {}", JSONUtil.toJsonStr(welcomeInviteImportDTO)); dto.setErrorMessage(ResultMsgType.STUDENT_NUMBER_EXIST.getValue()); errorList.add(dto); continue; @@ -254,10 +257,11 @@ public class ImportWelcomeStudentServiceImpl implements ImportWelcomeStudentServ // 整理家长数据 List parentList = setParentInfo(welcomeInviteImportDTO, schoolId); eduStudent.setParents(parentList); + // 保存学生信息 eduStudentService.saveStudent(eduStudent, currentUser, false); } catch (Exception e) { - log.error("导入学生信息失败: {}", welcomeInviteImportDTO.toString(), e); + log.error("导入学生信息失败: {}", JSONUtil.toJsonStr(welcomeInviteImportDTO), e); dto.setErrorMessage("数据异常!"); errorList.add(dto); } @@ -331,40 +335,52 @@ public class ImportWelcomeStudentServiceImpl implements ImportWelcomeStudentServ * @date 2021/8/25 15:39 */ private EduStudent checkDeptInfo(StudentErrorExportDTO dto, WelcomeInviteImportDTO welcomeInviteImportDTO, - Long schoolId, String uuid) { + Long schoolId, String uuid) { // 验证学区是否存在 EduUserDept campus = this.commonService.getUserDeptBySchoolIdAndNameAndType( - welcomeInviteImportDTO.getCampusName(), UserDeptTypeEnum.CAMPUS_TYPE.getValue(), schoolId, uuid, schoolId); + welcomeInviteImportDTO.getCampusName(), UserDeptTypeEnum.CAMPUS_TYPE.getValue(), schoolId, uuid, schoolId); if (!Optional.ofNullable(campus).isPresent()) { - log.error("学区名称错误: {}", welcomeInviteImportDTO.toString()); + log.error("学区名称错误: {}", JSONUtil.toJsonStr(welcomeInviteImportDTO)); dto.setErrorMessage(ResultMsgType.CAMPUS_NAME_ERROR.getValue()); return null; } // 验证学段是否存在 EduUserDept section = this.commonService.getUserDeptBySchoolIdAndNameAndType( - welcomeInviteImportDTO.getSectionName(), UserDeptTypeEnum.SECTION_TYPE.getValue(), schoolId, uuid, - campus.getDeptId()); + welcomeInviteImportDTO.getSectionName(), UserDeptTypeEnum.SECTION_TYPE.getValue(), schoolId, uuid, + campus.getDeptId()); if (!Optional.ofNullable(section).isPresent()) { - log.error("学段名称错误: {}", welcomeInviteImportDTO.toString()); + log.error("学段名称错误: {}", JSONUtil.toJsonStr(welcomeInviteImportDTO)); dto.setErrorMessage(ResultMsgType.SECTION_NAME_ERROR.getValue()); return null; } // 验证年级是否存在 EduUserDept grade = this.commonService.getUserDeptBySchoolIdAndNameAndType( - welcomeInviteImportDTO.getGradeName(), UserDeptTypeEnum.GRADE_TYPE.getValue(), schoolId, uuid, section.getDeptId()); + welcomeInviteImportDTO.getGradeName(), UserDeptTypeEnum.GRADE_TYPE.getValue(), schoolId, uuid, section.getDeptId()); if (!Optional.ofNullable(grade).isPresent()) { - log.error("年级名称错误: {}", welcomeInviteImportDTO.toString()); + log.error("年级名称错误: {}", JSONUtil.toJsonStr(welcomeInviteImportDTO)); dto.setErrorMessage(ResultMsgType.GRADE_NAME_ERROR.getValue()); return null; } // 验证班级是否存在 EduUserDept classDept = this.commonService.getUserDeptBySchoolIdAndNameAndType( - welcomeInviteImportDTO.getClassName(), UserDeptTypeEnum.CLASS_TYPE.getValue(), schoolId, uuid, grade.getDeptId()); + welcomeInviteImportDTO.getClassName(), UserDeptTypeEnum.CLASS_TYPE.getValue(), schoolId, uuid, grade.getDeptId()); if (!Optional.ofNullable(classDept).isPresent()) { - log.error("班级名称错误: {}", welcomeInviteImportDTO.toString()); + log.error("班级名称错误: {}", JSONUtil.toJsonStr(welcomeInviteImportDTO)); dto.setErrorMessage(ResultMsgType.CLASS_NAME_ERROR.getValue()); return null; } + LocalDate startDate = null; + // 处理入学时间 + if (StrUtil.isNotBlank(welcomeInviteImportDTO.getStartDate())) { + try { + startDate = LocalDateTimeUtil.parseDate(welcomeInviteImportDTO.getStartDate(), DatePattern.NORM_DATE_PATTERN); + } catch (Exception e) { + log.error("时间格式错误: {}", JSONUtil.toJsonStr(welcomeInviteImportDTO)); + dto.setErrorMessage(ResultMsgType.START_DATE_ERROR.getValue()); + return null; + } + } + String familyType; // 判断家庭类型 if (StringUtils.isNotBlank(welcomeInviteImportDTO.getFamilyName())) { @@ -372,11 +388,51 @@ public class ImportWelcomeStudentServiceImpl implements ImportWelcomeStudentServ } else { familyType = "0"; } + // 判断政治面貌 + if (StrUtil.isNotBlank(welcomeInviteImportDTO.getPoliticsStatus())) { + Dict dict = commonService.getDictByTypeAndValueOrLabel("politics_status", null, welcomeInviteImportDTO.getPoliticsStatus()); + if (Objects.nonNull(dict)) { + welcomeInviteImportDTO.setPoliticsStatus(dict.getValue()); + } else { + welcomeInviteImportDTO.setPoliticsStatus(""); + } + } + // 判断性别 + if (StrUtil.isNotBlank(welcomeInviteImportDTO.getStuSex())) { + Dict dict = commonService.getDictByTypeAndValueOrLabel("gender", null, welcomeInviteImportDTO.getStuSex()); + if (Objects.nonNull(dict)) { + welcomeInviteImportDTO.setStuSex(dict.getValue()); + } else { + welcomeInviteImportDTO.setStuSex(""); + } + } + // 判断民族 + if (StrUtil.isNotBlank(welcomeInviteImportDTO.getNation())) { + Dict dict = commonService.getDictByTypeAndValueOrLabel("nation", null, welcomeInviteImportDTO.getNation()); + if (Objects.nonNull(dict)) { + welcomeInviteImportDTO.setNation(dict.getValue()); + } else { + welcomeInviteImportDTO.setNation(""); + } + } + // 判断学籍 + if (StrUtil.isNotBlank(welcomeInviteImportDTO.getStudentStatus())) { + Dict dict = commonService.getDictByTypeAndValueOrLabel("student_status", null, welcomeInviteImportDTO.getStudentStatus()); + if (Objects.nonNull(dict)) { + welcomeInviteImportDTO.setStudentStatus(dict.getValue()); + } else { + welcomeInviteImportDTO.setStudentStatus("zaidu"); + } + } + // 保存数据 EduStudent eduStudent = new EduStudent(); BeanUtils.copyProperties(welcomeInviteImportDTO, eduStudent); // 设置无法拷贝属性 eduStudent.setFamilyType(familyType); + if (Objects.nonNull(startDate)) { + eduStudent.setStartDate(startDate); + } eduStudent.setStuName(welcomeInviteImportDTO.getStudentName()); eduStudent.setSchoolId(schoolId); eduStudent.setSchoolName(commonService.getDept(schoolId).getDeptName()); @@ -387,7 +443,15 @@ public class ImportWelcomeStudentServiceImpl implements ImportWelcomeStudentServ // 设置学号和企业微信id eduStudent.setStuNumber(welcomeInviteImportDTO.getStudentNumber()); // 设置创建信息 - eduStudent.setStartDate(LocalDate.now()); +// eduStudent.setStartDate(LocalDate.now()); + + // 设置住宿类型 + if (ObjectUtil.isNotNull(welcomeInviteImportDTO.getType()) && ObjectUtil.equal(StudentTypeEnum.DORM_TYPE.getName(), welcomeInviteImportDTO.getType())) { + eduStudent.setType(StudentTypeEnum.DORM_TYPE.getValue()); + } else { + eduStudent.setType(StudentTypeEnum.SCHOOL_TYPE.getValue()); + } + return eduStudent; } @@ -423,61 +487,129 @@ public class ImportWelcomeStudentServiceImpl implements ImportWelcomeStudentServ List list = new ArrayList<>(); // 设置家长一数据 list.add(EduParent.builder() - .mobile(welcomeInviteImportDTO.getParentTelephone()) - .parentType(welcomeInviteImportDTO.getParentTypeName()) - .schoolId(schoolId) - .build()); - // 判断家长二数据是否存在 - if (StringUtils.isNotBlank(welcomeInviteImportDTO.getParentTypeNameSecond()) - && StringUtils.isNotBlank(welcomeInviteImportDTO.getParentTelephoneSecond())) { - list.add(EduParent.builder() - .mobile(welcomeInviteImportDTO.getParentTelephoneSecond()) - .parentType(welcomeInviteImportDTO.getParentTypeNameSecond()) + .mobile(welcomeInviteImportDTO.getParentTelephone()) + .parentType(welcomeInviteImportDTO.getParentTypeName()) .schoolId(schoolId) .build()); + // 判断家长二数据是否存在 + if (StringUtils.isNotBlank(welcomeInviteImportDTO.getParentTypeNameSecond()) + && StringUtils.isNotBlank(welcomeInviteImportDTO.getParentTelephoneSecond())) { + list.add(EduParent.builder() + .mobile(welcomeInviteImportDTO.getParentTelephoneSecond()) + .parentType(welcomeInviteImportDTO.getParentTypeNameSecond()) + .schoolId(schoolId) + .build()); } // 判断家长三数据是否存在 if (StringUtils.isNotBlank(welcomeInviteImportDTO.getParentTypeNameThird()) - && StringUtils.isNotBlank(welcomeInviteImportDTO.getParentTelephoneThird())) { + && StringUtils.isNotBlank(welcomeInviteImportDTO.getParentTelephoneThird())) { list.add(EduParent.builder() - .mobile(welcomeInviteImportDTO.getParentTelephoneThird()) - .parentType(welcomeInviteImportDTO.getParentTypeNameThird()) - .schoolId(schoolId) - .build()); + .mobile(welcomeInviteImportDTO.getParentTelephoneThird()) + .parentType(welcomeInviteImportDTO.getParentTypeNameThird()) + .schoolId(schoolId) + .build()); } // 判断家长四数据是否存在 if (StringUtils.isNotBlank(welcomeInviteImportDTO.getParentTypeNameFourth()) - && StringUtils.isNotBlank(welcomeInviteImportDTO.getParentTelephoneFourth())) { + && StringUtils.isNotBlank(welcomeInviteImportDTO.getParentTelephoneFourth())) { list.add(EduParent.builder() - .mobile(welcomeInviteImportDTO.getParentTelephoneFourth()) - .parentType(welcomeInviteImportDTO.getParentTypeNameFourth()) - .schoolId(schoolId) - .build()); + .mobile(welcomeInviteImportDTO.getParentTelephoneFourth()) + .parentType(welcomeInviteImportDTO.getParentTypeNameFourth()) + .schoolId(schoolId) + .build()); } return list; } /** - * 保存家长和学生关系数据 + * 保存校园卡号导入数据 * - * @param eduParent 家长信息 - * @param eduStudent 学生信息 + * @param concurrentHashMap 需要保存的用户数据 + * @param errorList 导入错误数据集合 + * @param schoolId 学校id + * @param currentUser 当前登录用户信息 * @author ZYJ - * @date 2021/8/25 16:55 + * @date 2023/2/19 14:45 */ - private void saveParentStudent(EduParent eduParent, EduStudent eduStudent) { - // 查询学生和家长是否存在关系数据 - EduParentStudent eduParentStudent = eduParentStudentService.getOne(Wrappers.lambdaQuery(new EduParentStudent()) - .eq(EduParentStudent::getParentId, eduParent.getId()) - .eq(EduParentStudent::getStudentId, eduStudent.getId())); - if (!Optional.ofNullable(eduParentStudent).isPresent()) { - eduParentStudent = new EduParentStudent(); - eduParentStudent.setParentId(eduParent.getId()); - eduParentStudent.setStudentId(eduStudent.getId()); - eduParentStudent.setParentTypeId(eduParent.getParentTypeId()); - // 保存本地家长和学生类型关系数据 - this.eduParentStudentService.save(eduParentStudent); + @Override + public void saveCardExcelData(ConcurrentHashMap concurrentHashMap, + List errorList, Long schoolId, CurrentUser currentUser) { + if (!CollectionUtils.isEmpty(concurrentHashMap)) { + // 保存前判断是否已存在 + for (Map.Entry entry : concurrentHashMap.entrySet()) { + CardErrorExportDTO dto = new CardErrorExportDTO(); + CardImportDTO cardImportDTO = new CardImportDTO(); + try { + cardImportDTO = entry.getValue(); + BeanUtils.copyProperties(cardImportDTO, dto); + // 验证导入信息是否为空 + if (!checkCardImportInfo(dto, cardImportDTO)) { + errorList.add(dto); + continue; + } + // 验证学号在当前学校的学生表中是否存在 + EduStudent studentNumberEntity = eduStudentService.getOne( + Wrappers.lambdaQuery(new EduStudent()) + .eq(EduStudent::getStuNumber, cardImportDTO.getStuNumber().trim()) + .eq(EduStudent::getSchoolId, schoolId)); + + if (Objects.isNull(studentNumberEntity)) { + log.error("学号不存在: {}", cardImportDTO.toString()); + dto.setErrorMessage(ResultMsgType.STUDENT_NUMBER_NOT_EXIST.getValue()); + errorList.add(dto); + continue; + } + // 验证部门信息是否重复 + EduStudent eduStudent = eduStudentService.getOne( + Wrappers.lambdaQuery(new EduStudent()) + .eq(EduStudent::getStuCardNumber, cardImportDTO.getStuCardNumber().trim()) + .eq(EduStudent::getSchoolId, schoolId)); + if (Objects.nonNull(eduStudent)) { + log.error("校园卡号已存在: {}", cardImportDTO.toString()); + dto.setErrorMessage(ResultMsgType.STUDENT_CARD_NUMBER_EXIST.getValue()); + errorList.add(dto); + continue; + } + // 保存校园卡号 + studentNumberEntity.setStuCardNumber(cardImportDTO.getStuCardNumber().trim()); + eduStudentService.saveOrUpdate(studentNumberEntity); + // 保存学生消费机信息管理 + remoteConsumeCardService.saveConsumeCard( + EduStudentConsumeCard.builder() + .deptId(schoolId) + .studentId(studentNumberEntity.getId()) + .build()); + + } catch (Exception e) { + log.error("导入校园卡号信息失败: {}", cardImportDTO.toString(), e); + dto.setErrorMessage("数据异常!"); + errorList.add(dto); + } + } } } + /** + * 验证校园卡好导入信息是否为空 + * + * @param dto 返回的错误信息实体类 + * @param cardImportDTO 当前行导入数据 + * @return boolean + * @author ZYJ + * @date 2023/2/19 14:53 + */ + private boolean checkCardImportInfo(CardErrorExportDTO dto, CardImportDTO cardImportDTO) { + BeanUtils.copyProperties(cardImportDTO, dto); + // 判断学生学号是否为空 + if (!StringUtils.isNotBlank(cardImportDTO.getStuNumber())) { + dto.setErrorMessage("学生学号为空"); + return false; + } + // 判断校园卡号是否为空 + if (!StringUtils.isNotBlank(cardImportDTO.getStuCardNumber())) { + dto.setErrorMessage("校园卡号为空"); + return false; + } + return true; + } } diff --git a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/QywxSyncServiceImpl.java b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/QywxSyncServiceImpl.java index 9449cc5..bdf6bdf 100644 --- a/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/QywxSyncServiceImpl.java +++ b/febs-server/edu-user/edu-user-biz/src/main/java/com/yida/data/user/service/impl/QywxSyncServiceImpl.java @@ -4,13 +4,17 @@ import cc.mrbird.febs.common.redis.service.RedisService; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.core.lang.UUID; +import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.json.JSONArray; import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; import com.alibaba.excel.EasyExcel; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.yida.data.common.core.entity.constant.AppConstant; import com.yida.data.common.core.entity.constant.CachePrefixConstant; +import com.yida.data.common.core.entity.notice.qywx.BaseStaffNotice; +import com.yida.data.common.core.entity.notice.qywx.inside.Text; import com.yida.data.common.core.entity.school.EduYidaAppAccount; import com.yida.data.common.core.entity.system.Dept; import com.yida.data.common.core.entity.system.EduApp; @@ -56,8 +60,8 @@ public class QywxSyncServiceImpl implements QywxSyncService { private final EduParentStudentMapper eduParentStudentMapper; private final EduStaffService eduStaffService; - private final EduStaffDeptService eduStaffDeptService; private final EduUserDeptService eduUserDeptService; + private final EduStaffDeptService eduStaffDeptService; private final EduParentTypeService eduParentTypeService; private final EduParentStudentService eduParentStudentService; @@ -71,6 +75,9 @@ public class QywxSyncServiceImpl implements QywxSyncService { @Value("${febs.uploadUrl}") private String uploadUrl; + @Value("${febs.authRedirectUrl}") + private String authRedirectUrl; + /** * 同步企业微信学生数据 */ @@ -97,9 +104,9 @@ public class QywxSyncServiceImpl implements QywxSyncService { String accessToken = wxUtil.getAccessToken(qywxApp.getWxCorpId(), qywxApp.getWxSecret()); // 判断学校是否绑定了大华 boolean bindDaHuaFlag = false; - if (school.getSchoolType().contains(Dept.TYPE_DAHUA)) { - bindDaHuaFlag = true; - } +// if (school.getSchoolType().contains(Dept.TYPE_DAHUA)) { +// bindDaHuaFlag = true; +// } // 所有的学生 JSONArray studentList = wxUtil.getStudentList(accessToken, school.getWxId()); Set studentWxIds = new HashSet<>(); @@ -356,19 +363,19 @@ public class QywxSyncServiceImpl implements QywxSyncService { } @Override - public void syncQywxStaff() { + public void syncQywxStaff(Long schoolId) { log.info("开始同步职工数据"); - // 查询所有绑定了企业微信的学校 - List schoolList = remoteDeptService.listSchoolBySchoolType(Dept.TYPE_QYWX).getData(); + List schoolList = new ArrayList<>(); + if (Objects.isNull(schoolId)) { + // 查询所有绑定了企业微信的学校信息 + schoolList = remoteDeptService.listSchoolBySchoolType(Dept.TYPE_QYWX).getData(); + } else { + Dept school = remoteDeptService.getInfoByIdNoPermission(schoolId).getData(); + schoolList.add(school); + } + for (Dept school : schoolList) { log.info("[{}], schoolId:[{}]开始同步职工数据", school.getDeptName(), school.getDeptId()); - EduApp app = commonService.getAppByCodeAndSchool(AppConstant.CONTACT, null, school.getDeptId()); - String accessToken = wxUtil.getAccessToken(school.getCorpId(), app.getWxSecret()); - // 判断学校是否绑定了大华 - boolean bindDaHuaFlag = false; - if (school.getSchoolType().contains(Dept.TYPE_DAHUA)) { - bindDaHuaFlag = true; - } // 判断学校是否绑定了app boolean bindAppFlag = false; EduYidaAppAccount yidaAppAccount = commonService.getYidaAppAccount(school.getDeptId(), 1); @@ -377,78 +384,68 @@ public class QywxSyncServiceImpl implements QywxSyncService { bindAppFlag = true; } - JSONArray userList = wxUtil.getUserList(accessToken, 1L); - for (Object staff : userList) { - Map deptCache = new HashMap<>(); - // 遍历企业微信成员 - JSONObject staffJson = (JSONObject) staff; - String staffWxId = staffJson.getStr("userid"); - // 职工是否存在 - EduStaff existStaff = eduStaffService.getOne(Wrappers.lambdaQuery().eq(EduStaff::getWxId, staffWxId) - .eq(EduStaff::getSchoolId, school.getDeptId())); - EduStaff eduStaff = existStaff != null ? existStaff : new EduStaff(); + String accessToken = commonService.getAddressListToken(school.getDeptId()); + // 获取学校通讯录应用 + EduApp app = commonService.getAppByCodeAndSchool(AppConstant.CONTACT, null, school.getDeptId()); + if (Objects.isNull(app.getTemplateId())) { + // 自建应用, 查询企业通讯录的成员列表 + JSONArray userList = wxUtil.getUserList(accessToken, 1L); + for (Object staff : userList) { + Map deptCache = new HashMap<>(); + // 遍历企业微信成员 + JSONObject staffJson = (JSONObject) staff; + String staffWxId = staffJson.getStr("userid"); + // 职工是否存在 + EduStaff existStaff = eduStaffService.getOne(Wrappers.lambdaQuery().eq(EduStaff::getWxId, staffWxId) + .eq(EduStaff::getSchoolId, school.getDeptId())); + EduStaff eduStaff = existStaff != null ? existStaff : new EduStaff(); - eduStaff.setWxId(staffWxId); - eduStaff.setName(staffJson.get("name").toString()); - eduStaff.setMobile(staffJson.get("mobile").toString()); - // 教师性别 0:男, 1:女, 2:保密 - String sexStr = staffJson.getStr("gender"); - eduStaff.setSex("1".equals(sexStr) ? "0" : "2".equals(sexStr) ? "1" : "2"); - eduStaff.setSchoolId(school.getDeptId()); - eduStaff.setSchoolName(school.getDeptName()); - eduStaff.setAvatar(eduStaff.getAvatar() == null ? staffJson.getStr("avatar") : null); - eduStaff.setPosition(staffJson.getStr("position")); - eduStaff.setEmail(staffJson.getStr("email")); - eduStaff.setAddress(staffJson.getStr("address")); + eduStaff.setWxId(staffWxId); + eduStaff.setName(staffJson.get("name").toString()); + eduStaff.setMobile(staffJson.get("mobile").toString()); + // 教师性别 0:男, 1:女, 2:保密 + String sexStr = staffJson.getStr("gender"); + eduStaff.setSex("1".equals(sexStr) ? "0" : "2".equals(sexStr) ? "1" : "2"); + eduStaff.setSchoolId(school.getDeptId()); + eduStaff.setSchoolName(school.getDeptName()); +// eduStaff.setAvatar(eduStaff.getAvatar() == null ? staffJson.getStr("avatar") : null); + eduStaff.setPosition(staffJson.getStr("position")); + eduStaff.setEmail(staffJson.getStr("email")); + eduStaff.setAddress(staffJson.getStr("address")); - // 学校绑定了易达app - if (bindAppFlag) { - eduStaff.setYidaAppUserId(AppUtil.userSave(eduStaff.getMobile(), eduStaff.getName(), yidaApp)); - AppUtil.subscribeFollow(yidaAppAccount.getYidaAppAccountId(), eduStaff.getYidaAppUserId(), yidaApp); - } - // 绑定了大华 - if (bindDaHuaFlag) { - int sex = Integer.parseInt(eduStaff.getSex()) + 1; - sex = sex > 2 ? 1 : sex; - if (Objects.nonNull(eduStaff.getDahuaId())) { - DaHuaUtil.updateUser(eduStaff.getDahuaId(), eduStaff.getName(), eduStaff.getDahuaCode(), 1, sex, null, null, null, - null, null, ""); - } else { - String cardNum = DaHuaUtil.generateCardNum(); - eduStaff.setDahuaCode(eduStaff.getMobile()); - eduStaff.setDahuaId( - DaHuaUtil.addUser(eduStaff.getName(), eduStaff.getMobile(), 1, sex, cardNum, null, - null, null, null, null, "")); + // 学校绑定了易达app + if (bindAppFlag) { + eduStaff.setYidaAppUserId(AppUtil.userSave(eduStaff.getMobile(), eduStaff.getName(), yidaApp)); + AppUtil.subscribeFollow(yidaAppAccount.getYidaAppAccountId(), eduStaff.getYidaAppUserId(), yidaApp); } - } - eduStaffService.saveOrUpdate(eduStaff); + eduStaffService.saveOrUpdate(eduStaff); - // 成员部门信息 - JSONArray department = staffJson.getJSONArray("department"); - JSONArray isLeader = staffJson.getJSONArray("is_leader_in_dept"); - if (CollUtil.isNotEmpty(department)) { - eduStaffDeptService.remove( - Wrappers.lambdaQuery().eq(EduStaffDept::getStaffId, eduStaff.getId())); - List staffDeptList = new ArrayList<>(); - for (int i = 0; i < department.size(); i++) { - // 成员的每个部门信息 - EduStaffDept staffDept = new EduStaffDept(); - staffDept.setStaffId(eduStaff.getId()); - staffDept.setStaffName(eduStaff.getName()); - staffDept.setDeptWxId(Long.valueOf(department.get(i).toString())); - Dept dept = deptCache.containsKey(staffDept.getDeptWxId()) ? deptCache.get(staffDept.getDeptWxId()) - : (department.getLong(i) == 1L ? school : remoteDeptService.getDeptBySchoolAndWxId(school.getDeptId(), - Long.valueOf(department.get(i).toString())).getData()); - staffDept.setDeptId(dept.getDeptId()); - staffDept.setDeptName(dept.getDeptName()); - staffDept.setIsLeader(isLeader.getInt(i)); - staffDept.setIsMain(ObjectUtil.equal(staffJson.get("main_department"), department.get(i)) ? 0 : 1); - staffDeptList.add(staffDept); + // 成员部门信息 + JSONArray department = staffJson.getJSONArray("department"); + JSONArray isLeader = staffJson.getJSONArray("is_leader_in_dept"); + if (CollUtil.isNotEmpty(department)) { + eduStaffDeptService.remove( + Wrappers.lambdaQuery().eq(EduStaffDept::getStaffId, eduStaff.getId())); + List staffDeptList = new ArrayList<>(); + for (int i = 0; i < department.size(); i++) { + // 成员的每个部门信息 + EduStaffDept staffDept = new EduStaffDept(); + staffDept.setStaffId(eduStaff.getId()); + staffDept.setStaffName(eduStaff.getName()); + staffDept.setDeptWxId(Long.valueOf(department.get(i).toString())); + Dept dept = deptCache.containsKey(staffDept.getDeptWxId()) ? deptCache.get(staffDept.getDeptWxId()) + : (department.getLong(i) == 1L ? school : remoteDeptService.getDeptBySchoolAndWxId(school.getDeptId(), + Long.valueOf(department.get(i).toString())).getData()); + staffDept.setDeptId(dept.getDeptId()); + staffDept.setDeptName(dept.getDeptName()); + staffDept.setIsLeader(isLeader.getInt(i)); + staffDept.setIsMain(ObjectUtil.equal(staffJson.get("main_department"), department.get(i)) ? 0 : 1); + staffDeptList.add(staffDept); + } + eduStaffDeptService.saveBatch(staffDeptList); } - eduStaffDeptService.saveBatch(staffDeptList); - } - // 保存系统用户信息 - eduStaffService.saveSystemUser(eduStaff); + // 保存系统用户信息 + eduStaffService.saveSystemUser(eduStaff); // SystemUser systemUser = remoteUserService.getInfoByUsernameNoPermission(eduStaff.getMobile()).getData(); // if (ObjectUtil.isNull(systemUser)) { // systemUser = saveSystemUser(eduStaff); @@ -456,7 +453,79 @@ public class QywxSyncServiceImpl implements QywxSyncService { // } // eduStaff.setSysUserId(systemUser.getUserId()); // saveOrUpdate(eduStaff); + } + } else { + // 代开发应用调用获取成员ID列表接口 + JSONArray jsonArray = JSONUtil.createArray(); + JSONArray userIdList = wxUtil.getUserIdList(accessToken, "", "100", jsonArray); + log.info("成员id列表数据====================: {}", userIdList); + + if (CollUtil.isNotEmpty(userIdList)) { + // 此处获取对应学校通讯录(人力资源)应用 + EduApp contactSelectApp = commonService.getAppByCodeAndSchool(AppConstant.CONTACT_SELECT, null, school.getDeptId()); + + for (int x = 0; x < userIdList.size(); x++) { + JSONObject wxUser = JSONUtil.parseObj(userIdList.get(x)); + String userId = wxUser.getStr("open_userid"); + // 查询是否有职工数据 + EduStaff eduStaff = eduStaffService.getOne(Wrappers.lambdaQuery(new EduStaff()) + .eq(EduStaff::getWxId, userId)); + if (Objects.isNull(eduStaff)) { + // 新增职工 + String authUrl = commonService.setAuthUrl(school.getCorpId(), authRedirectUrl + "?schoolId=" + school.getDeptId(), contactSelectApp.getWxAgentId()); + // 发送授权消息给创建人员 + BaseStaffNotice textSchoolNotice = new BaseStaffNotice(); + Text text = new Text(); + textSchoolNotice.setText(text); + textSchoolNotice.setAgentid(contactSelectApp.getWxAgentId()); + text.setContent("智慧校园系统信息授权:请点击授权(请务必授权手机号!)"); + textSchoolNotice.setTouser(userId); + // 此处获取对应学校通讯录(人力资源)应用 + wxUtil.pushStaffNotice(wxUtil.getAccessToken(contactSelectApp.getWxCorpId(), contactSelectApp.getWxSecret()), textSchoolNotice); + } else { + // 编辑职工 + // 查询用户详细信息 + JSONObject userDetail = wxUtil.getUserDetail( + wxUtil.getAccessToken(contactSelectApp.getWxCorpId(), contactSelectApp.getWxSecret()), userId); + // 姓名 + String name = userDetail.getStr("name"); + eduStaff.setName(name); + // 职位 + eduStaff.setPosition(userDetail.getStr("position")); + + // 成员部门信息 + JSONArray departmentList = userDetail.getJSONArray("department"); + JSONArray leaderInDept = userDetail.getJSONArray("is_leader_in_dept"); + // 主部门信息 + String mainDepartment = userDetail.getStr("main_department"); + if (ArrayUtil.isNotEmpty(departmentList)) { + List staffDeptList = new ArrayList<>(); + for (int i = 0; i < departmentList.size(); i++) { + // 部门id + String deptId = String.valueOf(departmentList.get(i)); + // 成员的每个部门信息 + EduStaffDept staffDept = new EduStaffDept(); + staffDept.setStaffName(eduStaff.getName()); + staffDept.setDeptWxId(Long.valueOf(deptId)); + Dept sysDept = ("1".equals(deptId) + ? school + : remoteDeptService.getDeptBySchoolAndWxId(school.getDeptId(), staffDept.getDeptWxId()).getData()); + staffDept.setDeptId(sysDept.getDeptId()); + staffDept.setDeptName(sysDept.getDeptName()); + staffDept.setIsLeader(Integer.valueOf(String.valueOf(leaderInDept.get(i)))); + staffDept.setIsMain(ObjectUtil.equal(mainDepartment, deptId) ? 0 : 1); + staffDeptList.add(staffDept); + } + eduStaff.setStaffDept(staffDeptList); + } + eduStaffService.saveStaffBySchoolAndWx(eduStaff); + // 保存系统用户信息 + eduStaffService.saveSystemUser(eduStaff); + } + } + } } } + log.info("结束同步职工数据"); } } diff --git a/febs-server/edu-user/edu-user-biz/src/main/resources/bootstrap.yml b/febs-server/edu-user/edu-user-biz/src/main/resources/bootstrap.yml index 40de55a..63280df 100644 --- a/febs-server/edu-user/edu-user-biz/src/main/resources/bootstrap.yml +++ b/febs-server/edu-user/edu-user-biz/src/main/resources/bootstrap.yml @@ -6,6 +6,7 @@ spring: connection-timeout: 100 profiles: active: "@env-name@" + # active: "dev" cloud: nacos: config: diff --git a/febs-server/edu-user/edu-user-biz/src/main/resources/mapper/EduFaceGroupMapper.xml b/febs-server/edu-user/edu-user-biz/src/main/resources/mapper/EduFaceGroupMapper.xml index 95f52d5..28c2f80 100644 --- a/febs-server/edu-user/edu-user-biz/src/main/resources/mapper/EduFaceGroupMapper.xml +++ b/febs-server/edu-user/edu-user-biz/src/main/resources/mapper/EduFaceGroupMapper.xml @@ -8,6 +8,16 @@ + + + + + + @@ -18,18 +28,93 @@ where face_group_id=#{id} + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/febs-server/edu-user/edu-user-biz/src/main/resources/mapper/EduFaceGroupStrategyMapper.xml b/febs-server/edu-user/edu-user-biz/src/main/resources/mapper/EduFaceGroupStrategyMapper.xml new file mode 100644 index 0000000..f3d51d6 --- /dev/null +++ b/febs-server/edu-user/edu-user-biz/src/main/resources/mapper/EduFaceGroupStrategyMapper.xml @@ -0,0 +1,18 @@ + + + + + + + update edu_face_group_strategy + set monday_plan_id = #{mondayPlanId}, + tuesday_plan_id = #{tuesdayPlanId}, + wednesday_plan_id = #{wednesdayPlanId}, + thursday_plan_id = #{thursdayPlanId}, + friday_plan_id = #{fridayPlanId}, + saturday_plan_id = #{saturdayPlanId}, + sunday_plan_id = #{sundayPlanId} + where id = #{id} + + + diff --git a/febs-server/edu-user/edu-user-biz/src/main/resources/mapper/EduFaceGroupStrategyPlanMapper.xml b/febs-server/edu-user/edu-user-biz/src/main/resources/mapper/EduFaceGroupStrategyPlanMapper.xml new file mode 100644 index 0000000..d419d19 --- /dev/null +++ b/febs-server/edu-user/edu-user-biz/src/main/resources/mapper/EduFaceGroupStrategyPlanMapper.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/febs-server/edu-user/edu-user-biz/src/main/resources/mapper/EduFaceGroupStrategyPlanTimeMapper.xml b/febs-server/edu-user/edu-user-biz/src/main/resources/mapper/EduFaceGroupStrategyPlanTimeMapper.xml new file mode 100644 index 0000000..e4f26b8 --- /dev/null +++ b/febs-server/edu-user/edu-user-biz/src/main/resources/mapper/EduFaceGroupStrategyPlanTimeMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/febs-server/edu-user/edu-user-biz/src/main/resources/mapper/EduFaceGroupStrategySpecialDateMapper.xml b/febs-server/edu-user/edu-user-biz/src/main/resources/mapper/EduFaceGroupStrategySpecialDateMapper.xml new file mode 100644 index 0000000..e5912dc --- /dev/null +++ b/febs-server/edu-user/edu-user-biz/src/main/resources/mapper/EduFaceGroupStrategySpecialDateMapper.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/febs-server/edu-user/edu-user-biz/src/main/resources/mapper/EduFaceGroupStrategySpecialTimeMapper.xml b/febs-server/edu-user/edu-user-biz/src/main/resources/mapper/EduFaceGroupStrategySpecialTimeMapper.xml new file mode 100644 index 0000000..666a0fd --- /dev/null +++ b/febs-server/edu-user/edu-user-biz/src/main/resources/mapper/EduFaceGroupStrategySpecialTimeMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/febs-server/edu-user/edu-user-biz/src/main/resources/mapper/EduFaceGroupUserMapper.xml b/febs-server/edu-user/edu-user-biz/src/main/resources/mapper/EduFaceGroupUserMapper.xml index 554fa9c..f99b468 100644 --- a/febs-server/edu-user/edu-user-biz/src/main/resources/mapper/EduFaceGroupUserMapper.xml +++ b/febs-server/edu-user/edu-user-biz/src/main/resources/mapper/EduFaceGroupUserMapper.xml @@ -1,58 +1,58 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -63,126 +63,141 @@ - + + javaType="java.lang.String" jdbcType="VARCHAR" + column="{userId=user_id,userType=user_type}"/> - + - + select a.* from edu_staff a - where a.del_flag = 0 - and a.school_id = #{schoolId} - and a.id not in (select IFNULL(b.user_id, 0) - from edu_face_group_user b - inner join edu_face_group c on b.face_group_id = c.id - where c.id = #{groupId}) + where a.del_flag = 0 + and a.school_id = #{schoolId} + and a.id not in (select IFNULL(b.user_id, 0) + from edu_face_group_user b + inner join edu_face_group c on b.face_group_id = c.id + where c.id = #{groupId}) and ( - (a.name like concat('%', #{keyword}, '%')) - or (a.mobile like concat('%', #{keyword}, '%')) - ) + (a.name like concat('%', #{keyword}, '%')) + or (a.mobile like concat('%', #{keyword}, '%')) + ) and a.sex = #{sex} @@ -222,12 +237,12 @@ @@ -247,13 +262,13 @@ update edu_face_group_user set status=#{status} - where + where ( - user_id = #{item.userId} - and user_type = #{item.userType} - and face_group_id = #{item.faceGroupId} - ) + user_id = #{item.userId} + and user_type = #{item.userType} + and face_group_id = #{item.faceGroupId} + ) diff --git a/febs-server/edu-user/edu-user-biz/src/main/resources/mapper/EduStaffDeptMapper.xml b/febs-server/edu-user/edu-user-biz/src/main/resources/mapper/EduStaffDeptMapper.xml index 8080d53..d1b4d95 100644 --- a/febs-server/edu-user/edu-user-biz/src/main/resources/mapper/EduStaffDeptMapper.xml +++ b/febs-server/edu-user/edu-user-biz/src/main/resources/mapper/EduStaffDeptMapper.xml @@ -33,6 +33,7 @@ GROUP_CONCAT(a.dept_name) as dept_name, a.staff_id, a.staff_name, + b.avatar, b.mobile FROM edu_staff_dept a diff --git a/febs-server/edu-user/edu-user-biz/src/main/resources/mapper/EduStaffMapper.xml b/febs-server/edu-user/edu-user-biz/src/main/resources/mapper/EduStaffMapper.xml index 8a4c330..ea44754 100644 --- a/febs-server/edu-user/edu-user-biz/src/main/resources/mapper/EduStaffMapper.xml +++ b/febs-server/edu-user/edu-user-biz/src/main/resources/mapper/EduStaffMapper.xml @@ -1,386 +1,401 @@ - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - + + + + + + + + + + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - - - - - - - - - - - - + + + + + + + + + + + + - + - + - + - + - + SELECT et.id AS id, + et.avatar, + et.name, + et.sex, + et.mobile, + et.school_name, + etd.course_name, + etd.type, + concat(etd.grade_name, etd.class_name) grade_class + FROM edu_staff et + LEFT JOIN edu_teacher_dept etd ON et.id = etd.teacher_id - where et.del_flag = 0 - and (etd.del_flag = 0 or etd.del_flag is null) - and et.id = #{teacherId} - + where et.del_flag = 0 + and (etd.del_flag = 0 or etd.del_flag is null) + and et.id = #{teacherId} + - - + + - - SELECT DISTINCT etd.class_id classId, - concat(td.DEPT_NAME, td2.DEPT_NAME) className - FROM edu_teacher_dept etd - LEFT JOIN edu_user_dept td ON etd.grade_id = td.DEPT_ID - LEFT JOIN edu_user_dept td2 ON etd.class_id = td2.DEPT_ID - WHERE etd.teacher_id = #{teacherId} - AND etd.type = 3 - AND etd.del_flag = 0 - + SELECT DISTINCT etd.class_id classId, + concat(td.DEPT_NAME, td2.DEPT_NAME) className + FROM edu_teacher_dept etd + LEFT JOIN edu_user_dept td ON etd.grade_id = td.DEPT_ID + LEFT JOIN edu_user_dept td2 ON etd.class_id = td2.DEPT_ID + WHERE etd.teacher_id = #{teacherId} + AND etd.type = 3 + AND etd.del_flag = 0 + - + - - select distinct es.id, - es.school_id, - es.school_name, - es.name, - es.sex, - es.position, - es.create_date, - es.create_id, - es.sys_user_id, - es.mobile, - es.avatar, - es.collect_type - from edu_staff es - left join edu_staff_dept esd on es.id = esd.staff_id - where es.del_flag = 0 - - and es.school_id in - - #{item} - - - - and esd.dept_id = #{deptId} - - - and esd.is_leader = #{isLeader} - - - and es.mobile = #{mobile} - - - and es.name like concat('%', #{name}, '%') - - - and es.position like concat('%', #{position}, '%') - - - and es.sex = #{sex} - - - and es.collect_type = #{collectType} - - group by es.id, es.school_name, es.name, es.sex, es.position, es.create_date, es.sys_user_id, es.avatar - order by es.create_date desc - + + select distinct es.id, + es.school_id, + es.school_name, + es.name, + es.sex, + es.position, + es.create_date, + es.create_id, + es.sys_user_id, + es.mobile, + es.avatar, + es.collect_type + from edu_staff es + left join edu_staff_dept esd on es.id = esd.staff_id + where es.del_flag = 0 + + and es.school_id in + + #{item} + + + + and esd.dept_id = #{deptId} + + + and esd.is_leader = #{isLeader} + + + and es.mobile = #{mobile} + + + and es.name like concat('%', #{name}, '%') + + + and es.position like concat('%', #{position}, '%') + + + and es.sex = #{sex} + + + and es.collect_type = #{collectType} + + group by es.id, es.school_name, es.name, es.sex, es.position, es.create_date, es.sys_user_id, es.avatar + order by es.create_date desc + - + - + - + - - - - + select a.*, now() + from edu_staff a + where a.id = #{id} + and a.del_flag = 0 + - WHERE teacher_id = #{teacherId} - AND type IN (3, 4) - AND del_flag = 0 - + + + + \ No newline at end of file diff --git a/febs-server/edu-user/edu-user-biz/src/main/resources/mapper/EduStudentApplyForMapper.xml b/febs-server/edu-user/edu-user-biz/src/main/resources/mapper/EduStudentApplyForMapper.xml new file mode 100644 index 0000000..5c1f3d2 --- /dev/null +++ b/febs-server/edu-user/edu-user-biz/src/main/resources/mapper/EduStudentApplyForMapper.xml @@ -0,0 +1,35 @@ + + + + + + + \ No newline at end of file diff --git a/febs-server/edu-user/edu-user-biz/src/main/resources/mapper/EduStudentApplyMapper.xml b/febs-server/edu-user/edu-user-biz/src/main/resources/mapper/EduStudentApplyMapper.xml new file mode 100644 index 0000000..61cc2f7 --- /dev/null +++ b/febs-server/edu-user/edu-user-biz/src/main/resources/mapper/EduStudentApplyMapper.xml @@ -0,0 +1,59 @@ + + + + + + + + + \ No newline at end of file diff --git a/febs-server/edu-user/edu-user-biz/src/main/resources/mapper/EduStudentMapper.xml b/febs-server/edu-user/edu-user-biz/src/main/resources/mapper/EduStudentMapper.xml index 5967b1a..eb9e0fd 100644 --- a/febs-server/edu-user/edu-user-biz/src/main/resources/mapper/EduStudentMapper.xml +++ b/febs-server/edu-user/edu-user-biz/src/main/resources/mapper/EduStudentMapper.xml @@ -4,11 +4,24 @@ + + + + + + + + + + + + + @@ -18,7 +31,9 @@ + + @@ -26,6 +41,7 @@ + @@ -64,6 +80,12 @@ and es.class_id=#{dto.classId} + + AND es.class_id IN + + #{item} + + and es.stu_number like concat('%',#{dto.stuNumber},'%') @@ -76,10 +98,10 @@ and es.type =#{dto.type} - + and es.avatar is not null and es.avatar != '' - + and (es.avatar is null or es.avatar = '') @@ -110,7 +132,9 @@ campus.DEPT_NAME campus_name, section.DEPT_NAME section_name, grade.DEPT_NAME grade_name, - class.DEPT_NAME class_name + class.DEPT_NAME class_name, + dorm.name dorm_name, + dormRoom.name dorm_room_name from edu_student es left join edu_parent_student eps on es.id = eps.student_id left join edu_parent ep on eps.parent_id = ep.id @@ -119,6 +143,8 @@ left join edu_user_dept section on es.section_id = section.DEPT_ID left join edu_user_dept grade on es.grade_id = grade.DEPT_ID left join edu_user_dept class on es.class_id = class.DEPT_ID + left join edu_dormitory dorm on es.dorm_id = dorm.id + left join edu_dormitory_room dormRoom on es.dorm_room_id = dormRoom.id where es.del_flag = 0 and es.id = #{studentId} @@ -131,6 +157,49 @@ + + + + + SELECT es.id, - es.type, - es.stu_name stuName, - ed.`name` dormName, - edr.`name` dormRoomName + es.type, + es.avatar, + es.stu_name stuName, + ed.`name` dormName, + edr.`name` dormRoomName FROM edu_student es - LEFT JOIN edu_dormitory ed ON es.dorm_id = ed.id - LEFT JOIN edu_dormitory_room edr ON es.dorm_room_id = edr.id + LEFT JOIN edu_dormitory ed ON es.dorm_id = ed.id + LEFT JOIN edu_dormitory_room edr ON es.dorm_room_id = edr.id WHERE es.del_flag = 0 - AND es.class_id = #{classId} - + + and es.type=#{type} + + AND es.class_id = #{classId} @@ -589,4 +695,28 @@ + + + + + + + \ No newline at end of file diff --git a/febs-server/edu-user/edu-user-biz/src/main/resources/mapper/EduTeacherDeptMapper.xml b/febs-server/edu-user/edu-user-biz/src/main/resources/mapper/EduTeacherDeptMapper.xml index 2c44676..e3a9ffc 100644 --- a/febs-server/edu-user/edu-user-biz/src/main/resources/mapper/EduTeacherDeptMapper.xml +++ b/febs-server/edu-user/edu-user-biz/src/main/resources/mapper/EduTeacherDeptMapper.xml @@ -146,4 +146,16 @@ #{item} + + + + \ No newline at end of file diff --git a/febs-server/edu-user/edu-user-biz/src/main/resources/mapper/EduUserDeviceFactoryMapper.xml b/febs-server/edu-user/edu-user-biz/src/main/resources/mapper/EduUserDeviceFactoryMapper.xml index a23f6fe..655fb5f 100644 --- a/febs-server/edu-user/edu-user-biz/src/main/resources/mapper/EduUserDeviceFactoryMapper.xml +++ b/febs-server/edu-user/edu-user-biz/src/main/resources/mapper/EduUserDeviceFactoryMapper.xml @@ -3,12 +3,12 @@ \ No newline at end of file diff --git a/febs-server/edu-user/edu-user-biz/src/main/resources/template/学生基础信息导入模板.xls b/febs-server/edu-user/edu-user-biz/src/main/resources/template/学生基础信息导入模板.xls new file mode 100644 index 0000000000000000000000000000000000000000..f84a2f56f94e9d665d40532155d11aa1ae49926d GIT binary patch literal 36352 zcmeHw2UHYU)9CFX%^(OUf`G_~C@5(N0xK#gh^R0_lCUT!Fn|k!f}pMLXh?lM^0nxs!EwSN z`dmWl;kr?GKb#4<18FcBNel?d7pLZlN9XhZuN-}79fnb;!#;4lo^VHzYQUNiD_XNw z^tm;C-aymsrq4Y|DTdDlzuq<K@Tmip>yz+VTsZ1kw784G{Jn`^-L(17p7il;~bi=L>DH!Ge1 zzHxgYJx>F@AuBzHShC_N@Y}|Ig7xLG(6hB~d)>A~kF+Mlezko^myR6;{%|wcmA-AS zYYTHhTcy0jC~?{lWrFrFNLVQd+yu(y0cx+?5maoiN}}rt33?_CiC0tx{)sM2St_3b>%A;>dIFs5kOo>cU57ago3@as0t1k1OzCA z`VeR0p(IpBE0?Q4sFk#awrm3ftOHZYF8+g^r1yinwAZx*ds{2#(#BFD;e*9(onkh(STpC0l!oOeuD=5ZyNC5Yrt1% zz-!V+6aUQ`_$F^0K;O-~CMAGv*grS*a7PO7Jw8KWnozoinMsTb2Pz)%dmoKG#yr!jtp2K){U zc*YMK^I`n3F@7t}M?OARo0(a(umJlnq49d4Cq2%tf4v)&H4??iweL<{bdEv!M{iXcI_`JfPMIj3ScK|vOsUO{(!Ta zj^_TLOLr7;I=UPz=3%+c=NEC+nc!5|3?}G?nwj9d*$gJ=nwpv5B-;!o=&qWX;0)Ug zCg{SNnc(!@3?}H-nwj7n_peOq!kTU!ocNl-r0LedS+yBVnrDJ*lk4e+5)1i4x zR9i=Vrnd(sO%8?X1v;t}z*$*&X+Sj|_8e5yR4>5cN*5VTw|}SRFp&f_&7^a4n5cWA zdi@=NiNauws?)gsPI9TZ=BXz75@myNaPGhi$i_!nYq=4z zI!IhxTr82Pj@41e@sw~tP9KIWxFW8)Qf@%YD1~l-2W!i&UcI`JQUL)0jg(Tx$&^AI z!x>jR{hIpWK1Y~UsnT;hSl)T!Fr9u$& z%Us6m-wLQNx4c!`F=M7Rzh)Ki?VD&Fw2Ux5mzZ8BLGSe$8Xj^fdof^O!U}&3A7elcuM6|K>4i zdYbRiJSM8syt>Qu1SX21s?i87^J9smu93^s)YLQ@s+4guKSmr#p%2+mrHm`$I;jon zfj~>i2X*Cn!YB#KF=LnG$s)&|RSu4mQaO6! z^w-y~vCC=2F2{>SPG?p*IJ`>b=!?^zyt>IQr!~7AZx%USS>-UJGHo{lar(VmPub;| zv&-qmBFBwY4i4PX`f$bRSD(LOm(zw_jt`3*PgXfN7E9&u#Oa^^y238U0_AwKcu`}2 zvjaJ7lyW(`bz$4a)%!hXN`h+U2iyBs!u^J0~w>~D2p zpDt`+m(vdA_%zGk_#lUkQsHl&UJEu~VwYpfE{DzE99ZQj`J zta6n7&C~19rKRk0?AYb7`I`%?9A$s=^xCxID7zd!yBs!u6R^rr_BT(jxhJo)%jv)_ zht1!-S>-7Eo2S>uy|dZm=o0%9J;_{dI~X=$Jd_@ko}NU9Of1xoI-iB8c^n?;2$MKv zkXcnVm+P!btYaeK5X`}Oo}No#xoFqFh@MNSc^qTn0EP(WT2{F8Z!I z4~_xs05E{{r)bh1s04ECq~M4itIp9(&XMs_4ICu_Yxd%Fi5xpCIHGT=b8IE&$oQiM zj!cK+&>S5V9MKEi)oR^Z&JjJYvE^VDVnCc=p+Y?$GM9_~g-yX66lEi!$nznxp00;W zFbG4SR(OxG3h7D)%vM66h1D7jHg<7{U(%uJa?z>_AOmw-}V+JaCO+~ldE3qH5%(-uTs7)YiI1Ict@Ak@Vjb-6qJk2#J*r-@xM=5ldy zOIi-F(8KFqSgU8EuaI)a+P_2o-z+Ife`_8`Dgy> zRGD1@)O2YJx+wBx!w2djZx{3*L||Nl@gL6;9q^3ys;u;MK%t=MaFKr0{DoLk^dYYj zeV}wuqture$SGC*$Q%8LQ|T(4%k@<)M70Ay!W`wEBY_x(%#Se8A@4cekk7o?A0r$4 zV;kUuIm$ku?2p)xjeJ1ikC=_y@)(;ikg^X@P;VZrD`@#*7WwA1e6fmrj9AF(5fD(Q zD*wy-gE8?%-%&i;`K#Je*A|*emMgQTVupanIcPq4U%=trPr(l-40V1Tij(9{FIj+gfuJ+VdKXmJ<-1&W&bf}E;kAI(E|&8 zqBw@&UzkI%>r2O53~$JWR}4)k+?j!7?#w_kcV?hj+;}oeNkS#aF@wJtn5t4pHW8C( zGMbE|@4^8}Bg07n83Cb#2)HXGxsa=%2m@RO$poASbdsU;PVFhMyIZF(s;@_-C)yR% zi*ko%mM`J9B}!>wlgi5Mr?_N40N;6Y z$S1Ooi$N~5G*~DresSdZs{3QCC60vhfQiId__@R>&Lu-k#*$R1Pd3RccNKm}lxa3I zW?N$M0@QK*1m`HOBtJT{+&h6MSr)${iW2an(iT#J=c2E~96=ODTHFX0JeOb`LkR*? zoZ_D4ubD^*5NDdy5KRe?S$^c-6BxDwQ@Up~ME8s9EjWl;mtit2VA!?UVddKrJ7g};wyrdiSVfUVlcwtrmeHX4pDVNC z4TT(mC!xGRO__4mlEca4tNs+O9Irn*KBl%Jr?@Dgtgu67_h?tB%GNAbGCFC^L|1|p zshh*A{40ecU}#@NJH;76g*s$fS8k{nlx!?;6`~s9b8?C~0(*=DxDi=>QA}36k;Gk0 zrT!@_tE#PV6(TbuNwV-o^nKyH+2Y8@la?g*7ov5HB$E>Y7CuVg2wVx(P0EHbmW&ZH zW-zF~`yc{Us}N02u$B;ES0Ng)tk5sdFK=c{c|v)DF)d_Nq*DRrGUYgeU_$uc>F&(J!KHAXi3-;`O4PV^%~pKt2A5{v5k4Q4rTX zni^{)>5*xY+h%ZiLQdka?tnsgRMxqrd}Jz+TXnU4?OpC$lKQNO4>uCD<|2 z2};A0fZ$YQL$njnbRiZgErhM2_D*yn$p9UiXbRm2eW|Pvjb$5kBB8coNn*DHC5#QD3IvFZd;J|fZH#HRS9 z6JtFH9pleC+=$C~A`B~U$4BAV9=80lLUdF2bl=Phk&&dK0tdmj=^Mo@W4?0$OXq$E4KE6WqWZ9CF}U^t>PT%F+B zMf!lEY-a<;fd8aB6&S~8va*y&r^K!RTbaEnq?Ud^KdgLMv}Q7WM&SC&P2)9jl8TEY zkwh~eDbf1mdXZ)#sZQd^^hE5-ngmM80>rzrQx?sf`7dPaD+9z9#nf0$WYQXjPjLTE z6Nyy$jrk%`phn-8@^KvM9Hohml*BCilvoo9kFoc!vpx&=SHOI%QEjPC9WtNA4*R!8 zPEQP+cE9ud&_=Yi%yoBpnxQ4*u*$Dy|yJ3;K4Bq-ZfF;i{Sc<1|Eg;E;5<)EG zw+p$8jTS29U`E719bI#x5Aq1oUEvKO8ONjs3&8m@^!xjCc7Iir(f#*Gx`4{;ki zBKx;FCxizDrhOYiKb78h9Z+2p$nEskRY~|E9+vXPqJ>?W7ukws<%69cRTq` zE9pOdN!04`4@PE$)%2WInP*qI>g-29&WUb?ol8EKv^-f5dA;qE>2v(<9uK;7UuWA! z+xVW(?|-OrxKp`hXMm6Jw*f)i(#`wko`1UbL&$N9K5l>PaD3;s%6awMl%6Sy zJbSQhr$YDDl|k-57Lj_V;!Jy+Yc@}=iH_XwQ27jJO6-&Z%s zcYfILdnqf|y5Ei7Q@K|B%lY=Fw{HJ%@iSDVaYeJnEwm_w3eJFpJKsiUibsgumCoVA za)xDy^Uy<#>cR~V@=XKli&l=QyyBa>%c*Zl&58B9-jkqe>)uCKoLzqH(*3)ozJJ~_ zzp!+mae_;=f$ZXuHEM+4V=;JosyD+v8ilYkjN#vHZxQju$GY ztlN5ne{rkxg$^%VZY1q+_@-w?zqm)|8oJ!+`^34kA;*thd4WlJmKpSno3PyudxMhN zOcgv(?WYN%T${e;dpo|e4H=)C>R4#qui%%5-o0nKQzB1n0 z&%q(M_u$IyqXGk0$KHwR6~2Ny7Wf2fMRr*NvXP-?hkxcajtQ#d>b2^uV zoxI!qd*QBV*SA)rWzfs>SEDW_Jjsbk-0^3tWB*iNy0QMeb2rQ6vwM9q@_)SW%>|pq zuCYH;SC()6>Qjh#&$c~}ZyO)G^CbU2UuW&Qku>I|e%dPlo-a7^?a9M75r;DK1k)~3 z&kDVs>7^aIV(dOa=eErPqh3M1eax?{Ueoqfu zcgOObF1EfMK6zm7(+H=BQ{N5_ojUoaU#xa7Pgz^OxHj(8-lBJ(x_tZY)A8d6GaOBd z{l>k0bg#Z4c2UQ%I*xa1ZlBl?@Zs|blQX%Zz2AQLk5@p_!dC&s4QE6F6CWG&(L3q# z?W+&-l9%-y_v-M`y%XPD*12UdHezbS@Gys+;j>Qnn!VpQXlB+|R^@N{zwH=i%WF3& zXZGV+GuqvL)+N2y;EL_{ZnQq#W5T{C^9*LK+Y=gQ{;qC<*9_a+ZV!JuJY`YI(r?$d zI{3N2=X;S`XYuu3N2b;8xaK#i&$Y#?PIr5=YV`Kpeuq5rXV(YUd-N~w^U*edf9URw zq5-x^V}?6zzt?ff^XT&j&JXOryk&Lp65fp!9*4w_-&pl|HgfZLldXPl#_b7eImE$S zH@*GczstVzPCD9pO6u}Idd*5${4z1VZ?BHyqs%RkI`c;x5wJ=_NO>@)sj=RP%CJL5yA$0MdqytcAbGGSU$%n8d| zi!#==-MQsv<>fuwu8cd{!uMv!KjKB>}E{v#&l-yT>}SQ|jWM+Yg+d$9ve<>*>7nVhuN-1` zO~{;f>Fvmg*PYI{{q@L$u%)6cKeci3zjAd!SeO62?>ukN*2saUV!Qpc_@_s8vD<&^ z;`1D`Yn8hWt0vL&~@2xa8t6#_@Qmxv4}T0sq?2D4zAz8i+r%Pz~MkpO3*!{ zMVEhDa`}E2?}y6^PdzyH;j&A-&e=bG4y-zS=TpMmdxQ7SOf&5dDiawpPFD^@{_$f4_z3-=lK~qjt=;_^^KdS4h ztNT4`JiIs5L~IH^mG&%o-KEhrLuTqMORuSJlVwwBFR5x{`i<|FG;jNrT@7}5|FC28 z>;%Vqt@{SMTen|HEiErHsy7gB4G8L5f8c=mmWd_Tx}DrM?*99Wznz=^VvEtAvr-p^ z_&r(pv9R+7zZSlqS8d$iV?mwHt=-#f9{%}a#`^zM`=YRxy>-o`I*iB9wUC2f7!x+^+)q4CKL`wDK9>X`TbWogdbtyHQ1 z_r=fiV|$lwy7}Y$Cnx_(JA8I{*6kNJw_i@tUn6|hY4kr2K3R6Q`1SAXcbi{_^hoY_ zV%8(e%|oJGHyCET%JQ!H`R3^|vBmAPUuXGWtUmhdyX$`CcXl5Y#6Qi5+HTP2qg}jY zEqC$fq?MNEd)=CLbH?pArT0yG$0na0V(b~}8~S$^`MbS;=DhyD)|^lGw>$ZDZG7^} zkgZh>=2x!Pi0>2$YbwI$`+px@VcEa%$i{3!!Ea~ zNe+GOTGKnrj=NZ+hvyEON=Z{xQ>F z?6tIYmv(N?`zii)hEw8!u>sb{Gab$ieBiUckiTQ`w8{tZD%F* zJXbvI%%;UTQH4)TV2W(K0x&*PxqKVs*ueV0QEd`smOb>est^f|;1K!rneloTuG_R>wTp-ETJ-(#)~TL1Ju-i>=63&U z!KfwsM{IvOD=^AJIQ@!$+Qy-iXXW}nYm+f&pi_8fhbSjEkE*!uU(8MxKos;@1NWtkM8z*{Aq|QU#2^2hRAP%FfO%pB=F;EXTDMENwj|_p@ z!>=6SSPDVkrAiMckU?ewZl)3r=|B!)K7nGY@(Gj{9COU34}5GImTGyQL_ji)$M>-WJ`8~8$uy>fek=kIj!y8ti;$MoB*@th zk4ywV13*e?>N5J=8K~3g<3WI<(!GgZo55#~DX5Eh5O$A-DwG`O0;CseTJ@f?Vok$TbgiH*zt zw-{_2Jn)Lv!YjT|>eoLS-@wR^;Qqov_T(6G&~Y&f7&5*|4RG@-e)vMhTh2s#^S{Od zU()u+z$(${9+D-IVk2Kx={KSYRcwhxi~yH}Q`HvCVjn z7k!)ykX_-E)7;LGH1q3$yUyuj5b)qaya(gO@U<-~j1LnUHi7u*a}xz@3L%vA)(RN6 zNY|Mv;8w87x!g3_R zEUV1l3cuT{B+nW?r8q`OKO6YQYT3j86u`6{PM&H$O z7&BJK;j0C89R5H-9fuC0j>C@)bRhmJI^+8WbsWC1=m75m-~x6qA)o2D5`=`(h+6Pc zG*4&~e=X@U$RHFb3BfYx)Bj!u?G-}%36{YKe@GL5j2yIQC>;^RGWb5=-{qjaLt)cB zqZ@44ZAKYvk5G84!<4}vDEzw|Y_AZ)mzIHD$xYNI1bQjj8r!oMyqqI6ge}jnrv{>MNZfUv(XkPblDix>!gwu7NsDWnGw1c#-NK0vMH zkO4rrL60fNg%6wK8z~0j0fg_S7|2j1uZ2pUkxHJiN?uEdpm&gSF#)Kf95RJ?c_%q! z22f`?)CwScKg>vP4Um%@G6$%O9BKm)MynZ03(_Cr?=r{|BJ|F3s4YM)a>$B~-peSh z0dkY)*#HFlCZ#;v0VI$^wgACiN@-qufbi!`jC4DIa9Us>K0x>)3n6S@6MEYi1L2!B z{HPuSaR9=v<1vs9Krk*#Azgs*dv#2n9zgivIR?@P2&4QAWB?HCO_M@gfbg4cOdby) zJ2})6AbWr=LFp9eXxBkc<-eBTTa(G3R4+~|vJE;&Yw#07NA=OmD&T!;1$GztVF+?f zh>js$CH#K?aA&y~hZo*``27$3o|Ep*%m9y*Bo0z|gp-X$b=b4izn-Yhkx+ z3Ec=gk{*4R7<6jQV@w!l@q$3r5U}k zpAh`X2O++BzIlWcCKSTGMM8EYoQT6v9e!aA`{+>&1;r#1Tq4v`>sX6T!(x3XSK+A0uOs7Q2*JCuDuV#gaUrRZ>osM3>>K4UTa0gh)@*342HenO8xa?juUT?i0=5#E^scc{*Vt$Ok^PkJ`Tpsa; zhSKQrc?F2Oykrzz;&{s7aR__UdbSe|6C$*EV)1mm=B7`p!t09+^T7in2h+0b;t*3i zd!?As{)sS~<~y?(@j6MC8F-zWc02{I*RpCC;`-R>G>1z8WYcp zVKi?w6yY%8;6&#r26IRhSG+-tSk9a-ISj7Lkj2Xpb3-(p*6Kp}N7}Z((fY^4$HX(* zJmB_Az#I|Q#c^O@_%xQ`VGGfgb>4O|b_Qaf0EV;=fODCHD~ zec(ctHFySrpILzO!jISBzZ68^*%*EUL`d%u9^gIaCL&E)37)fOrzdhH+3<^89&9Wh zpS2QjH$({qxH~@hyB?W90WSM7@-x1tOio(}`>2II%Z!CB(-}J4Y|oV(h+ayU@0zhX z1%7xZRX(qP@lQVClMJpUB;X-EU}1zqh)yuGV?>7j|KR!$*wK(4eN`)i!`1C6%U^#G zWt#pvhfACtH($ZYZv`Y=FkyZmBpjzhA)&EgjGz}4&Ik$ zoaKFTmBK}-_Rv~DYXPkVv=-1>Kx+Z51+*5>T0m<7tp&6e&{{xi0d@;$dj7}fbk2p7 z7pmQCOy@0v=YN+E>mm9<^we-~0k;tnKFecFAQTb?v?Cy4up46n_#8hJ62<^9Hedm1 zBqWRtjD>_ROlL!q#RiyXc~iPPpfz6G17nnla?Y$d{_*tTQ$K8aMvMTBtT4oYp^6== zE;Rrexgs?LG9h8y0uLuhh>eDXg&^!iQ)0}OwgFs`wtrA8jmJ6+j21=Y<)#&+j_y-1 zJUcB`oF`WuWja9W(>o|Q*w@F;!>ey^Z*R}uex6<-eFXyFuRJ`xeS3R{012(1Ib1yj z-8@}AJls6o1a2MzUx5HKwTIRMS_^0`ptXS30$K}bEugi4)&g1!Xf2?%fYt*4lNP{d zUwqERr(=B1)q{jPrSQQSpXqVm6>dSqXKZ{<$7lAIkZ_9+JZIBe3UQ|uJ{RM|EN&IV z=X;C+w1s2^3Ae4;K*B9*xG@bMl5rCnA5sTM_K-S4!UyM0kUB$hgoMxLxWNy%^*KYr zO?$48+#tC_!UtvCg69dz3(`NZMFThe`9Q+YpZY=i3KD+7*&h<-_k?RNNCA)nA@zpT z2T~9u%>N7tum4+)DEOg1esvo+DdHzW@CWx_a#+B3xMj9NKjL%oOvpa^47+bx4z#Zf z9Y=pCAPaT}q8?c?bhEFm2uCg-^=NLvZW#=v9z=fd3*;l`QFG5I}aRsjXtIDW%~I27xnLff~E5R59`^7=Kufz literal 0 HcmV?d00001 diff --git a/febs-server/edu-user/edu-user-biz/src/main/resources/template/学生开通应用导入模板.xls b/febs-server/edu-user/edu-user-biz/src/main/resources/template/学生开通应用导入模板.xls new file mode 100644 index 0000000000000000000000000000000000000000..9c3bb5b906c5753c1868efac8d85539cbf7be1d4 GIT binary patch literal 19968 zcmeG^2Ut|c*0ak33yO3^5ZDC-L_n%wWkIZIIXDOIF;c;R5Fy-P{i24x01&AR;BZ$TjO(2>=G=tb2qB+DC5G^2DLTm}q3ZgYc z8;Amk=sOtg;J%ey{%@qhzcs7qb z?sP(5N5rhryV&nG#}=|8bTkNqp!EbYo{XaS7*7Mg;A%v;9HxCt8-t1*>U5%Ob|VoW zc``^IL`K4OWMc@()iHtgaSX)%)7bVAeJHIa&|WzChD?OtNJ{s;zzVUHP7pGgjD`D2 zh@c`k)yt24x3TSGe|}g`Plpe^SWA->=v~x4k40R>KywV@qMtxFYJ_nm35Fh9A|Ks%8+bssSuhMLGpc)Iqfzw76`%Hf&6F zJ-T6ka9tS{My@fW4e?-;OOc$ibZj-$HPsgSpef-DBlZof)EcZbj5tA*hYtg7Tl3n3 zXIikM$b3WQo8MK(6T@sx;hTz2?@zAcvj`4z#|R*&}ul*Vj2U# zjzmQ6QxC0#yp`a?EE9?Z21T97jvG`l{eam975&XE=viG@yhSXgw1cPAEOR zqoE8OpAaedK0-tSk$~`YD7)bDgn}Bj11^0jxYU1W`cOdu-bMvKHY)gWS5eB((t?yon+3*afgw{!Pg1&4N)MSrn7@CL6jslaqGagzjAW%Djg(B02zC;h2*pY9&(c;I zPV$JB6sCd`>^Tf4o?dL6Km}>2C*rE0W88`2!u}O4KdzP;3>65tWhFyMC+Ug^sR}K$ z1OzRq75D7fBSm1WC=X+-C=X+-C=ZibQBo?Ur$SG-xhB&S_HQOIzR2V;RUtO+&e3Ay zo(4uHs6eoRa+#ihM@2RjEg_I1G_nPu6hX0js8ED0AZWl+2RkLbuL%hi7)7wirRchL zfbc&iVowpFhX+qD=?DW*h7*dd`ily2T2Vx3aU}k1L>eKE14V@4L|d*|HJm68RE~fq z8>syK{iU{MTwET;xVSuwadCMVzoda^O~K2^!d z6`5+?fGK%t{|Zgz=jSVFN`CuKg(EowQ_KJ%j>QL5CNMsLiykJZAkqfP86xz70fWF0 zVe*)&AmRc=bmyYxg>;URI4n9IpfKRN0udhgqjEP_*Yz7Aq8r5>$XD%{77(A2}kWA%BucJ2@isxfuYcz*vXLW2!>2zEH#{mOgl6 zkiLM3pBxc!EZgYb2%WT-BT^djCy8{BBSN1c{t0n9$`L6I`IBznNsfr87aI|VGfY)j zr?VUp`Z$z9`U2~8kt0$X@+Ze#e>ozaUTj1d&M>9K$>Bm5ODB@Wd<(KzP62RaCE*gk z;iuFqkGrEH*h9xu!A)KzOUXgzzi+~J^)4x$IA256X5wpcEW0X+1O#p={rBQUi-#}KRqa>?_KFEqCbX9#K zgrzj6V($4xjw5LLf`%+{eI%MhR?aYGE0e>6MGgb095`vxqT9((P)EYv@O)D8U*c%nOF_LnFb1e!WBo6AiL3=84cfUD*tRIHa?F76u3??x7V{Nt+Z=2w zE2q(fu#XH{S3MN9W0BJnl9XLFpgs(7SGCrXXyVD@l z=Oy{0RS9JdLdnXJBx=|d)z)J|#}P_u(`W%|!xFlxHgUtTEOm(TSY`oZS?UmmVq2uh z&35gpM3K`HC}Ig+RS4spT8;X!Xw*%uM)9!=}NkPQBH0jc%pb8*SBc&A6D5_^9WajkKLwt{Kv%FoP+X z3x^*?bG1@37c&f*5?^H!IP@rzXstwo8E%BcPrdHgMlxr$x|5M^uU>a-q}!;~9Yfj_ z4w;p7hdoD8a91V4ncgCV!%DUO$kq|ts^v~bx)YLC{eZ$o+8s!%!(jS&XJx^05LOi2 zLrHL4SkZG=7xjX(jp<%$1(%WbS1&jlX>YZH)1*i9&B$oES;35w1ux6^7n?4VD?wOj zum%rL{s@`f_kjpgCg48z$HL3eP zBPWdiWvhbqhPdQu>&+8ibenUqW~$3Z%T2%ZYkHu%}GMKMq9JZ-fPba~*AWE9kUUdzo<6+qKcL z-TX4&iF5FvgR#+wv?=8W`kk2KoMFLtvT@#+Y-QPZysq%ky5Pf8vf_$ow+Kw~JgJ}m zGR)q-Q}w$6pQ;8W?TonGcVtkdR^+KkYbCk`Ck1(v9=A{Nc5~c*)AH@3;g6#=HVrF& z8~G`=aLD^>#Dur&YF_5!y}R$-ed(jSjdR|=!_?ZL$DZeA_3^*)# zZ!yiiI?%-Rs8;2>vlhpP$4~s`soC(E2~!jG?rnMT_K7Rh@@VyVvR>3g?}G)IWy`X4 z)@%1oE(o*PcR;r)*d(Iskf?F243=O`laaNmzissq(>fHWP4No()Fe<2Ih4IVm zpxqJI)>>s{Rn>(GZhU_|Yc=1mB&N7vzVgkh zifcXmtB$*z(pb`cL;2R1h3`Jx>36Jfb!zRCl0lP>y1y!vyty4;IPJ04$u2`ZzpZ=J^B1ec0P{U(TUnNuwuRIoc=8Ic!$AOXs&)eLRx3z33twIBa3h zqLm|zAOGffw~Ou1*;(gqIscS@h0{yWHnDj?&;6#W)_-@m%laJyYHN1SpQSf_)69?j z@HSaDFNdrSIm93d#rEwUXM;T>t(U(*1|I;y-iXMuAF>g;fiBjuTMFr(c5>! z2kR39k6bdFQLr}8AzwUwlcU#*bCo`&+umFK{Fpa#yQkpUvf+;Qox_j*tHs?5NyYan zP9IKbHt_Vf#xMMxu5|Vejvsx?^r`EUV}XT(;v{K1FR%LjHH-`SCNq0)JvCz5gBw*Z zV=7*K7wBYlzWtfmfoqC1z1Mz4W}fdG-QnvLs|%yvZA$VC8BuP#VBh@Wl^jKoGJ@OvtBHXovz_~;Y-xVGtYqq{m3K`-wsN=B^k2UzUA*DWyr*X? zH!1#q|ZDj*&rj$#teZSI580bP7J3@l0q~ z#ksjIXKO&9{UhsEy^052XnRc*zFn9bIk5?^{D)RIwT7hJJQr~FxqU?mPy1>}fyX-A zAJQ~4F6}>A7qKe3y8c7(m zLk}kObt>TTj%KY{|8(_wq51V?IYX|SRD9E7U~W{_FULmjF7n#+!^U3bTkZ`z6g4;U zwq4$}6ZbPZ_}|(-(6wnFv#Q=!V?UkBsB5BO=}%r&pD6gX#Zueme7#>jX{(;^a88U) z5Kl;?=0w?)k$+=j)e$Ib2fLj3z6@Q*4QpmByfp5Vd(+u3Gmg!?k{WjPlzFS9w)xpz z+pbR~Ooik3vuO1oeR@u zlw|z0u@yfu`K#~Oe|Kkp^wH2O>pNZau*~myz;A-z~cf3d0 zr)^yHb@WY}6{}m^Zx?dyty%w@z9V)l+*Bgjd&<3Zb-xp7J6$Tf@h15$2^srv)Q_9m zR)inR-Xz{~-TLzWLv=UkS&{wGz(`?MWK)UWmFzV;p`InE1dr|HXHmMo;v+!4y87sz zbT^q*J7WqzKK|MfgGCO%&AGh&y2h-BK6>r^?Zciu*W2O3cbh%(_{y;b%YP^_9_@M8 zBW{ZYzr*9DU+12fc<9*zQGc_(b8mNy*)?Luf_UHOrehWbJN0p}@9*U1u_B?FWAB{2 z%kv`Y(s%f+UpVlg?fMM?=L#x5nk(7+$f7=@1w+ZSEvd&=FQTW!yeGb>$t=j{>kTRompyr6j9)S`1M?afMV?b$fsLv6^_ zh`>z(vk5M@D-KsB58F{&u{Oy(=U)+z2MmwPh)J#3wDrx0N39FWoIOG{W;$+r!^s(b zb9wX1M+WY#A8&|wyt@6bEpjF-wEO8-ZTrppx-2N#Gyeyj5&mntCPta~p8a-|{m;qg zFMm^)?m9tx;KJ|PcgYQExp-i0ai;Oss|F|UyX;z#Yvps#>2~0`{KVrq-!{LxG%hZ2 znfrigS}v(OJ#(uqBH|6|G`nAMcUgFP=Tm1%=cifQ;v>iGewEbmyx?{F*AL%2KJv=W z^7^cwqSH}lMP2;Uexbn}t_hr!G0%pIs)7R8JrKavAGVfR6h{+a_ea?)8TfLT37i}- z9@(%_#cm3f>l^ix;!s}L_{NX~?b_;a@Hv?d$e=w$`RHi zh)?S_m=&M3BhpOC45s*0EF-E3JzSnC>YjQ=R-~c0Adu0(9Umnca?69zU`@)%I`Dpr zKlH9R$`P{Q>ya#l1>mI9KpfU;tX)(PTt777AG9a#PGv%gulXrum*5X3Z9C` zQVrlBZYC02;(}?x&7lIH+lHR zX^=cmq>^hx^dhL5wc)U%PNFTcmkf9M20n<<8PiitqAv{jUHoQgefHY4=rNepCY;JC zdVMRWtd7je#WtjXA>uvh^{wd-i;dI(ihb+b^B~U?p`JVJvv|T@R%T*Y|7Nk!vPSyD z{u1~O(1;|%b`Hvg=BK|MGHCGaP!kwrn1DKI1^wC^PB`^&&k-=W@Zz;Tb#F-N%m9|E zA2+|c+GkX#e>4Smrr>R;>kJB#4t1E&3Qx3%A7?t0oS@c>rjVaW)t*IN9i+9Z{T=1* zouv0Q{;lQieb8*1Jdp~qaa7}%JFwDrqK2f%$zvv`{&T+s-SdY$eDT^^V4ani^Msyhua%d4c zrwKVcN~d#Lki)(}=d>XQ&QPD@Lk`tRm+24@$j0P!p$z?N8dsO%0$)U~@yD8IA${rr zkIo@y=#6v^Im4Hn=^S!~I-zsO8PcJ1$Qf!!1GL5guCRpXs99zdNS7mbh5$PT9?t>J zL}cy#N|A`%cdQcWlAFN!P*9Hv$tBOoPf(XzlLxiImupZa^dU`93h1e37Tkk|YMdYi zN;R}iAR`yJM3=%tMWXhweh8$Co6>Nkg$nV4F$KquG{WQXIEBCkpA>>A&{76e35U`t zR!42pFEtp}z%6`B)E&M7F#?|95JHF$CNu>Y6R;OxKrb<_hl9?+i0IQjsj@CyBXWS6 z3q+8Qp5G1~Q9{ALn!? zGdb9K=sc6+Th+~Vsga0~>ZQ|D2)Va{J9y5-_Vb~HsxEh9ENdl$C(-jQJhEc|1;pG3eL1RzhWL|OdK?Emc%&;SKBy`VA((6 z@1p^HhKKoGKbKpECZ}xvLBAO{YEs170Q`>v;2=fyFRuQlQ{;!4Q0~Jmw7x=d0V47{6(WvTb0FdvwFDv)aLn5UNH}is0LcbY z9Q&Amasjs#4C&I#U_wL)3|hM;CFClu=SljEo_zd&CWwpU;~?0<2qyy45B`HkEbLp1 zhJA@Y3aaEs{H+ygoj5^+kdC@So^U$^$7vBn zMVYZ&lLWzz%V=r`Moj$&m@oT(Bz{0uezXIUe;9C8HV2vgi^7+-{}(kYCG&T0AN>Hs zM~K)5FrfdSi6&zP{0aLK`p+zg_^hz2K94Z$L&4zr{lNbdz?)*gn??g>Af#iVH^#s| znixtjFwYsiNLPR=`y}=y?5p@ro)27IVPDS!UTnkYPNiP(9+5k&h3Wn&gcR#_hlrb2 ofuuc@xkKI?e!kF30KmJ!wJZEQD2Ojyec-+ulmx-9;(v4aH${q=H2?qr literal 0 HcmV?d00001 diff --git a/febs-server/edu-user/edu-user-biz/src/main/resources/template/校园卡号导入模板.xls b/febs-server/edu-user/edu-user-biz/src/main/resources/template/校园卡号导入模板.xls new file mode 100644 index 0000000000000000000000000000000000000000..aaf10a9db4ca2a9d07398d8029bca19d28d1cfa7 GIT binary patch literal 19456 zcmeHP30xG%((hdsSVR;QkwaiX1Vlh?Py>sACnze28bm-`1TPFCVj=;r7!(mT@g&|v z)OcU<3V0$B<9!h0fd+5!cpAi@`&G^C?9R^467s&h_j~!iH`ue&)z$y1uCDH`?w$4g zIg>kUcUo2x&J{#-$OpLr(PPmC@QjJNj0q9K1Li--<#L)x2t5Ax`Wso`J?PqA(T5`V zbby3?t`A8J$pBI_NQRJ_Lo$NY0#Zvz-~z-1QY%QUA(=vI1IY|hTS(@REFf7zvVznO zk~Jh7NVbq9knAAYLqZ>7(%;B@e|uF2ku>}3J{9vh^ACU z{-NDy&K@KhTAl?h4>qqB9qB@_)Da0-v@dj znX(B|GDs>sPiO?m8RVl}9J@`GkK_5W0uyydRZxG#K-+M~KaNZG_{Y4q@sDLV{_*p_ z*MGhR48+DnphsG+5MIG4pPKW3Z)qmX&)9q+1U(8Iq)g$}|L#xJhY2{=z$3_CwUPc* z(mCZs!KW-&=DGFgJcS33s(K6`|EDpI5zvGAWa@GAjGo+2hM)Ol>Y3x1L;J4zkNRxL zxkKp_26xo2t|i6*2IOdWLT0%Wf_VWaFJ$F$rfK~80BvqY%|PmWI4|9qz4}#sWQy^Y zg<{glX?K+e&^ACqN5%4BNZ22}Az`eN010D}iI7mwS&%SZDTIXaNf9KR>q=me%JbK*bBNGnh3`y&{1c!3EBc!iJmU`IP$E11z1N9fU4nhhv+C}tGmE69Js;e3X@3wEmsJo zL!tofPzDVPgh@&OG#%(gAw-=Ply*6D#}Cp%H`PKn z;H8Ve{}Ern(O(3u;G?7e@aZEUe&jHkn1h33R+B#kA|ZZ$A^4;wzpEC0krw(d&>ktT zJ_6#Sg>Jx0C%~_%58{ip@SE`R6Y>!cU7P>x(ds{%a&1KB5R1WxwJ)}B@7lh-M>lvF z?nXV@h^&bo?yi(&v4doz;@Au}FkoTp#W1*guq4gM&h``4bo7MM%5^ z7+oZk_;^V-MOLAYieT?%Pi2DRB{m{=(h>fkD!ZPGgk8x+qEZ!hkHobN~huK+ql}V6}(-K90%@j0F$KlJzuZ@nV zeEk2H=>lqv#1`U3+fx^wC_CV=#Y<#G*22%>0yC7m-K^%;Jp|F}_l;)xocJ{Yx8bR|FC?-;Eq zfXR}gbJ}YGGd3R`qd$uNm5Iqx!=;8qMBCp~Nl#8LwJo(JB7aIx+~HIF zoOWT<$VbPMKZ<^tBm_%>VX~y{V*xWVMc2@?BQG5qNYj;ep#1?OdkP2ir}d=u$DI>H zr`tvQ8}2>=~w?Z~Yf)py~!J)mP+o>LtSIQYzV0vuVu3gHu zGChVgrWctWW7C)(LmDcNm!_TY%wOG3&`Om8v@d#j=~Iy5FV5X}k@ z1+oka>dF70LVIO}CQ9&7R$x4yBZ2F64p2d52#q$N)scv28Y)9@K|1^uAox{`N)yPa zTa)RM#x-$N1JTkPxwLT*TQv|=M9qkdCi*~E*@Qb$`9UdrqLQljHG*Ily?XUZ>Eevr zOQlk!i!*M|rZH}hG=QKk#_icO&Dj&q$5=|e%jP&>V@myXvnSV5oz;}W^JxupqosdPG0 zu(%8OLy*dd#zFAAO%(`a_zkNbm~b`usA(YT6EhbCHytWXw2th?LGT@dKLn|aXdEO^ z4Fod$Hfh{rVN=r-O&SN0sDVI+PZKZi#zBIb0z$vOp?v`27NZGu zj=XZbp}C6o=*g0wJ$uG4r!~JEA09a_ymEY0a`a`%@>iAoa!mQ<`0~hc=aoY*OqAWk zvgE4jSNw9?@XPVzk>kZH2ZKe0-3(;Occ1^vFUJh!`0#jfx7_P5Fi z`TgbmaxD4f@cCP3UO8-ktBlxl>H)tTD}FhA{^rdqhwX2b5vT6#;g{16<@hzp-y|T1 zk5lDuUfwH@-KXV%w_}*EoZqbZ@cEk$uN=0& zd3kR-U%=NM5wXwJl`j&vgJ}~qP+S6CUAYeVJX3Gb<*`UwEHohPVPO{Nrz~5xNZd)C zS*N93NU#LgZfY%sZB1D87{=F(;B8V7U6)>`13C4L;k7lakEQ6l8W{R;Y^4uTckIe5 zAZoGD2o`@OB6=(r(L{+zdubC89aV_vn_R?JN<`WpwIIr+-&HI6i>XssD8%C(T5Dvbb7DN9Rpt!Ta*Ks6NoO#Epe&_k^x&w_ zfghzT5>Mu6(H7*X%GtW$VGg5+r26OVfzR@%aXP^iTVW2RjYz)wo!DtC_ zKInpe%GgE9(Zw8eQI#{(3^rETFX%r=z+)ZSf4p;bz%y*rp>%aXq0p#)k$Qu^T0;AU zi1_5{0jC3pQ%|n1@HTn1*5z`L* zB1ujDpC1n*5|C>EcIV8FLIbe-tGLp6wO`N5)SSL@;mZ=G^L0VzQ|%$Usdt9R8v2?k zWjchJaj+qH+MpavxH5HB;o-`}#j{i5vEwH~o@IMdhS9+5rozK@iHp}kiN}tU=#yJs z{XSCR;i|;N>!`$I$3xJ@GQzK4pb8Irfs5y+#AC-j5FezU;KvJ6;bE-9#q(6+vEv(f zk#TD;K0E_>Qw#>k!*M?@TqGU=c3VdH@_GbiHLS*r0s=a}(8=a}(8 z=L*C_NdZejAqX>pzi3$NMv`$v1~2(%zz-|%sUM_K@LE5<^zQ|)X{M4)c*Q@1#SsCt z(eR>X2F#CsB!PN4aW;&<0BksXlNXgDlVx}!#TCB`WGG%pIo5?m@m?V|Co5Qb(JLtZ z1=D(X@pC<^4D01X7sSBdQGpl|A@hBNqyc`zfoI{EU?IliR=bpEF^N%iQD{0#mL8a`t~(J4*tC^;$n12iNtK2Yn6B1s&4nvkJ#$(J-)1HW8dwsLOMA- zvFa69eA_>=YHLj1bW8J(5{p|ddwuYS!_NM5a{J`17*zb({fVO^b_Es`rrQ>7xcDwW zc*Zx=G539Li?fpl{$lU?k-z& z`Dsag&kC~;_a6^9y>Z{rDR1rBVaKBDEp|K{A@jZ9TXIYC$}qpx@g2?c;?IqiSh(FU z?Y1iK>5Z$y#vQ&{u&ZF2--ycoN9CpoZ=?@fU#iTB%>j$ZA#_u>SMk-256Zw!e$c1* zx|9(J+If98sdmmuvA4Qm_2fom zxn8qF;#nJ>*KG>?ux(y_^;ZuhW-B)99lskYJ(E(M8CaS#qhj`kjUB|XSrfll|JjYb z@rMUoSpU&kPpjhI`#ipG)$+@#$isuSg^apTVSKS~j~hNC9db4<{3QOG?Xp!Ccl;tQ zy)hef%|Bt=f|3gP?&BVnt0Ir)Y?1rm4DJ9 z=N=<>o!NHiHxgQ8*}Z(t#nm^i)!duu|I=;LD=Wi|hPf8$8_kuSb^mhzi)pSKtxA6G z-R`98xa#sY_a9}MSL~VJ`gWhwlLltDzfw4R>)xA^t9v_Lv3u@%bHo9MF@f`X4S9H} zuH)SvPdYg^69(`r|Jd=|>Su7U?`J`e2A0}%6FgDvr^EWCS@|0uY5Oo|=+h$$M?Gop zWv{<4=&oaCtFXRv+ii*)v(#kD0ZGSh2isKa44%F&^+NdcTc0}rtk*kt#Krh~emzzS z>kX~bhjbdWZcO=UJGYVX4z(+*?^V7qI&d)kO=8HAq)Oey)bj0do8Q^=*D+h<^Z4zQ zUNaZC|Guiw*~moJvG(mG*M=>JY(Jl<`|Py2({-KSqo1xRunk}SEZW6BH_^d;XY-9O z#vRL=;V`XcV258HiW(gE>>9k)uaklOrsu`Zg8lm)TenKcnNqzk^5_(o*_L8wTbGSl z)>i$;HnY3GF8sih{FL%J79p8l$66LYAL!ul(Zjcc-#-|Vxjp)P|HQBwz1ZUu*2tS3 zIwmQa@TkjFA9ts%*R0;$AMq$&r(}5fo7nfsrNiD`BBr7p7mMaS+P(Akt>?bYz7zZ? z?K-XQ<0H>j%=T|c+y2R|u_ZZ%+q)l-zq9<@<6(%Y+hM($x2G(B7?C!9@)NTWGt;L{ zGP=FF_RV8A;PUM7D8ndjywCna^R6r@G+3|SKkLvy+dcc5JqS0A4jmRZX0Aba&9@(i zpVv91PX+|fb?6h=<=hLA?ts#`u!?1^pBIMhjJ~wSIzRtG{Q$|;FD~b=5(iX_Dlc7S zcikj>`}X*Tx9?7RKYufC#UAhDC@x+<;o^GABefA zMIP?vI(_e>vg?&Emz6F*>D=?gu3*o%ncvr*xh}j_)c*0YXGz_%>H>OyX_z(sx3ark z^Xns8l~?-TJt4I5>{(|qMeoiRE6#lRB4tU>+KT$h6F0j*yzV=tZE?()-*-3Pv-tbr znMva=9PT&JW#FtR*T6UV{X8?js|~V?8NQ%*+46+ek8V2M3bOyHF#q&*mkq@i1brl( zC$;U~dvBYS>p!~{w0_&*x)(d=&oY``GP6M()hYkl`G|EVYSL%58l%@>TyecedccF} zc~1-tmKS))Mo3SDd_Qi&CquU{d~GGMt=(gLVd}{C2OOf7o(ny(Ebr;gRR5lR?jLK> z$8zQM1t(4WnoixnJmctsWk*6UPdTmA*ZfsR+s7eteHq={@6dh z>nBsK&y0LqlIazZP;FnZXMXwehFPbx%-1*X|J*meOI}!Y*H$A=iGHzsv*XhKW0!`d zpE%ZVb=a0oR>|%*!it)#y#ou5&+mT!Ve;6ii(PJx-M8?Em+oTc8~%2Q5y^|MXBMWo z=?yM?{oZoMeaYG(zr_sQW9{nRscv5M)}3UGEauLvUymNxe9!-Jg0Sbr@gb&jTq37# zZd-MwV%o~(w@f3p2sghNw7w))_U(8e|Sr8HHke|N0&%@IXZ5&6M-d)%A z%EPHChf}xRIP=xVucMvk4mJ1rc&U8;$sUu8GPnF392M0upq z%sR-?;&QfK^_S%etU%dJxY`1wE>yxJc zXt%BS@P_rJUweA|&}Qrxxt4YvEvo|t8C`9@`AWYt+ZIl`etq&ezd;MV!zNXEyA2)~ zcWLX$tIg;6?Pzsop6}F|SL{!mcR$-=b$H$8U-z~Bcz=3-=R+dV;r!L>pR8JMXMTCf z;$fFf?@hLdSrM22^O2;TW!@#GiEKZq56dJ?Lwl z`u_OrdP5y6DS7$u=%HUMz7E;g>T~HGaf`6fY{!nW(3Q0x;2=$Nbu+q9xOyL~YF4oJ zIdN7udP%324AvT_SmOINJLX|Jt8T^=aa!7?gT@OTZ+>}x>t&r;zxo>aNgW10eP*=H zRqQ?|@rUK9hn9X*(K^ZNmS@UlOL5mnUw^XV==krS76cD6>z`NEZPbp083k$n&)SS$ z81CH9(P5CYyXUg>7EXN^7oDFQU7x!xVEuxaU+vd_+x_&R^S$dPXRmp=QZVhL!;z83 zpIspqO9rfv?|vU(nK!z#ty$cMf!!xn&DM2ZcdGJE`<0s`L_fwJJb2mS#K;n42?GIaneUOZBCk8>k5H>z7sb>>vJ7Emre8Z-f7yFGIAdRQ!E)*RP z1qqo!QF5t}pT_I}M|SW&iC{XE9EI%w{l5*&q_}5McSj}nL#Y$%*;)DgLfVn_yq4I* z(Z(py4*yUp1jzdm;NKl7^C=)jVn;|+A@6NR0z)1Q7-Eu5ZE)ashgR5Hcq0<>h`+{+ z&J!WNlTN>tOK+^iLflv3b2l^`6tyJpDLWGq3^j=&Cx9GY*I-z9P)|X^R%9R5m%)%9 zMbQYE2fa3rrST|0wg%h7w1Qv?8G_}gp22efqqlLR#cj!GRyF80JmSy^Ypl;{%@u-4 z5NtsIzx6lMpNtI%p?ZbN2E)Axy@I@SuMqMt=#|Uxa@>D=<=@#W*r9)iOP7Sf@lz6Y z93`Xv2arGa|4{_M6oPXEb2X*SIQx|-yj?&-LH>C7g>fVtm5pgibu}LR1u!EUKh+Ag zWZD2dRZH1FL;kb!{}~yL)%oAZ&jMgPj#~=}*DCyNJp6;pm^v!LCpHkp8h?7Mf)Xy|LH^r0wU}K?*Dy* zzk4w6mztEGHYqJRL((HFNj6U6<>BEiQ5XQ%?U2;urwr*HKwfv*^@(<| Ie_6@@073EO(EtDd literal 0 HcmV?d00001 diff --git a/febs-server/febs-server-generator/Dockerfile b/febs-server/febs-server-generator/Dockerfile new file mode 100644 index 0000000..6e81a71 --- /dev/null +++ b/febs-server/febs-server-generator/Dockerfile @@ -0,0 +1,7 @@ +FROM openjdk:8u212-jre +MAINTAINER MrBird 852252810@qq.com + +COPY ./target/febs-server-generator-2.2-RELEASE.jar /febs/febs-server-generator-2.2-RELEASE.jar +ADD agent/ /agent + +ENTRYPOINT ["java", "-javaagent:/agent/skywalking-agent.jar", "-Dskywalking.agent.service_name=febs-generator", "-Dskywalking.collector.backend_service=skywalkingIp:11800", "-jar", "/febs/febs-server-generator-2.2-RELEASE.jar"] \ No newline at end of file diff --git a/febs-server/febs-server-generator/pom.xml b/febs-server/febs-server-generator/pom.xml new file mode 100644 index 0000000..084bc35 --- /dev/null +++ b/febs-server/febs-server-generator/pom.xml @@ -0,0 +1,35 @@ + + + 4.0.0 + + com.yida.data + febs-server + 2.2-RELEASE + + + febs-server-generator + FEBS-Server-Generator + FEBS-Server-Generator代码生成器 + + + + + org.freemarker + freemarker + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + ../../febs-jar + + + + + + diff --git a/febs-server/febs-server-generator/run.sh b/febs-server/febs-server-generator/run.sh new file mode 100644 index 0000000..50090e7 --- /dev/null +++ b/febs-server/febs-server-generator/run.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +mvn package + +docker build -t febs-server-generator . \ No newline at end of file diff --git a/febs-server/febs-server-generator/src/main/java/cc/mrbird/febs/server/generator/FebsServerGeneratorApplication.java b/febs-server/febs-server-generator/src/main/java/cc/mrbird/febs/server/generator/FebsServerGeneratorApplication.java new file mode 100644 index 0000000..9eed671 --- /dev/null +++ b/febs-server/febs-server-generator/src/main/java/cc/mrbird/febs/server/generator/FebsServerGeneratorApplication.java @@ -0,0 +1,24 @@ +package cc.mrbird.febs.server.generator; + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.WebApplicationType; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; + +import cc.mrbird.febs.common.security.starter.annotation.EnableFebsCloudResourceServer; + +/** + * @author MrBird + */ +@SpringBootApplication +@EnableFebsCloudResourceServer +@MapperScan("cc.mrbird.febs.server.generator.mapper") +public class FebsServerGeneratorApplication { + + public static void main(String[] args) { + new SpringApplicationBuilder(FebsServerGeneratorApplication.class) + .web(WebApplicationType.SERVLET) + .run(args); + } + +} diff --git a/febs-server/febs-server-generator/src/main/java/cc/mrbird/febs/server/generator/controller/GeneratorConfigController.java b/febs-server/febs-server-generator/src/main/java/cc/mrbird/febs/server/generator/controller/GeneratorConfigController.java new file mode 100644 index 0000000..df38901 --- /dev/null +++ b/febs-server/febs-server-generator/src/main/java/cc/mrbird/febs/server/generator/controller/GeneratorConfigController.java @@ -0,0 +1,45 @@ +package cc.mrbird.febs.server.generator.controller; + +import com.yida.data.common.core.entity.FebsResponse; +import com.yida.data.common.core.entity.system.GeneratorConfig; +import com.yida.data.common.core.exception.FebsException; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.security.access.prepost.PreAuthorize; +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 javax.validation.Valid; + +import cc.mrbird.febs.server.generator.service.GeneratorConfigService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +/** + * @author MrBird + */ +@Slf4j +@RestController +@RequiredArgsConstructor +@RequestMapping("config") +public class GeneratorConfigController { + + private final GeneratorConfigService generatorConfigService; + + @GetMapping + @PreAuthorize("hasAuthority('gen:config')") + public FebsResponse getGeneratorConfig() { + return new FebsResponse().data(generatorConfigService.findGeneratorConfig()); + } + + @PostMapping + @PreAuthorize("hasAuthority('gen:config:update')") + public void updateGeneratorConfig(@Valid GeneratorConfig generatorConfig) throws FebsException { + if (StringUtils.isBlank(generatorConfig.getId())) { + throw new FebsException("配置id不能为空"); + } + this.generatorConfigService.updateGeneratorConfig(generatorConfig); + } +} diff --git a/febs-server/febs-server-generator/src/main/java/cc/mrbird/febs/server/generator/controller/GeneratorController.java b/febs-server/febs-server-generator/src/main/java/cc/mrbird/febs/server/generator/controller/GeneratorController.java new file mode 100644 index 0000000..44d14ff --- /dev/null +++ b/febs-server/febs-server-generator/src/main/java/cc/mrbird/febs/server/generator/controller/GeneratorController.java @@ -0,0 +1,111 @@ +package cc.mrbird.febs.server.generator.controller; + +import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty; +import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties; +import com.yida.data.common.core.entity.FebsResponse; +import com.yida.data.common.core.entity.QueryRequest; +import com.yida.data.common.core.entity.constant.GeneratorConstant; +import com.yida.data.common.core.entity.system.Column; +import com.yida.data.common.core.entity.system.GeneratorConfig; +import com.yida.data.common.core.entity.system.Table; +import com.yida.data.common.core.exception.FebsException; +import com.yida.data.common.core.utils.FebsUtil; +import com.yida.data.common.core.utils.FileUtil; + +import org.apache.commons.lang3.RegExUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.util.FileSystemUtils; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.constraints.NotBlank; + +import cc.mrbird.febs.server.generator.helper.GeneratorHelper; +import cc.mrbird.febs.server.generator.service.GeneratorConfigService; +import cc.mrbird.febs.server.generator.service.GeneratorService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +/** + * @author MrBird + */ +@Slf4j +@Validated +@RestController +@RequiredArgsConstructor +public class GeneratorController { + + private static final String SUFFIX = "_code.zip"; + + private final GeneratorService generatorService; + private final GeneratorConfigService generatorConfigService; + private final GeneratorHelper generatorHelper; + private final DynamicDataSourceProperties properties; + + @GetMapping("datasources") + @PreAuthorize("hasAuthority('gen:generate')") + public FebsResponse datasources() { + Map datasources = properties.getDatasource(); + List datasourcesName = new ArrayList<>(); + datasources.forEach((k, v) -> { + String datasourceName = StringUtils.substringBefore(StringUtils.substringAfterLast(v.getUrl(), "/"), "?"); + datasourcesName.add(datasourceName); + }); + return new FebsResponse().data(datasourcesName); + } + + @GetMapping("tables") + @PreAuthorize("hasAuthority('gen:generate')") + public FebsResponse tablesInfo(String tableName, String datasource, QueryRequest request) { + Map dataTable = FebsUtil.getDataTable(generatorService.getTables(tableName, request, GeneratorConstant.DATABASE_TYPE, datasource)); + return new FebsResponse().data(dataTable); + } + + @PostMapping + //@PreAuthorize("hasAuthority('gen:generate:gen')") + public void generate(String[] name, + @NotBlank(message = "{required}") String datasource, + String remark, HttpServletResponse response) throws Exception { + GeneratorConfig generatorConfig = generatorConfigService.findGeneratorConfig(); + if (generatorConfig == null) { + throw new FebsException("代码生成配置为空"); + } + + for (String name1 : name) { + String className = name1; + if (GeneratorConfig.TRIM_YES.equals(generatorConfig.getIsTrim())) { + className = RegExUtils.replaceFirst(name1, generatorConfig.getTrimValue(), StringUtils.EMPTY); + } + + generatorConfig.setTableName(name1); + generatorConfig.setClassName(FebsUtil.underscoreToCamel(className)); + Table table = generatorService.getTable(GeneratorConstant.DATABASE_TYPE, datasource, name1); + generatorConfig.setTableComment(Objects.nonNull(table) ? table.getRemark() : remark); + // 生成代码到临时目录 + List columns = generatorService.getColumns(GeneratorConstant.DATABASE_TYPE, datasource, name1); + generatorHelper.generateEntityFile(columns, generatorConfig); + generatorHelper.generateMapperFile(columns, generatorConfig); + generatorHelper.generateMapperXmlFile(columns, generatorConfig); + generatorHelper.generateServiceFile(columns, generatorConfig); + generatorHelper.generateServiceImplFile(columns, generatorConfig); + generatorHelper.generateControllerFile(columns, generatorConfig); + } + // 打包 + String zipFile = System.currentTimeMillis() + SUFFIX; + FileUtil.compress(GeneratorConstant.TEMP_PATH + "src", zipFile); + // 下载 + FileUtil.download(zipFile, "generate" + SUFFIX, true, response); + // 删除临时目录 + FileSystemUtils.deleteRecursively(new File(GeneratorConstant.TEMP_PATH)); + } +} diff --git a/febs-server/febs-server-generator/src/main/java/cc/mrbird/febs/server/generator/entity/FieldType.java b/febs-server/febs-server-generator/src/main/java/cc/mrbird/febs/server/generator/entity/FieldType.java new file mode 100644 index 0000000..6196e90 --- /dev/null +++ b/febs-server/febs-server-generator/src/main/java/cc/mrbird/febs/server/generator/entity/FieldType.java @@ -0,0 +1,13 @@ +package cc.mrbird.febs.server.generator.entity; + +/** + * @author MrBird + */ +public class FieldType { + + public static final String DATE = "date"; + public static final String DATETIME = "datetime"; + public static final String TIMESTAMP = "timestamp"; + public static final String DECIMAL = "decimal"; + public static final String NUMERIC = "numeric"; +} diff --git a/febs-server/febs-server-generator/src/main/java/cc/mrbird/febs/server/generator/helper/GeneratorHelper.java b/febs-server/febs-server-generator/src/main/java/cc/mrbird/febs/server/generator/helper/GeneratorHelper.java new file mode 100644 index 0000000..3d131dc --- /dev/null +++ b/febs-server/febs-server-generator/src/main/java/cc/mrbird/febs/server/generator/helper/GeneratorHelper.java @@ -0,0 +1,149 @@ +package cc.mrbird.febs.server.generator.helper; + +import com.google.common.io.Files; + +import com.alibaba.fastjson.JSONObject; +import com.yida.data.common.core.annotation.Helper; +import com.yida.data.common.core.entity.constant.FebsConstant; +import com.yida.data.common.core.entity.constant.GeneratorConstant; +import com.yida.data.common.core.entity.system.Column; +import com.yida.data.common.core.entity.system.GeneratorConfig; +import com.yida.data.common.core.utils.FebsUtil; + +import freemarker.template.Configuration; +import freemarker.template.Template; +import freemarker.template.TemplateExceptionHandler; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileOutputStream; +import java.io.OutputStreamWriter; +import java.io.Writer; +import java.nio.charset.StandardCharsets; +import java.util.List; +import java.util.Objects; + +import cc.mrbird.febs.server.generator.entity.FieldType; +import lombok.extern.slf4j.Slf4j; + +/** + * 代码生成器工具类 + * + * @author MrBird + */ +@Slf4j +@Helper +public class GeneratorHelper { + + private static String getFilePath(GeneratorConfig configure, String packagePath, String suffix, boolean serviceInterface) { + String filePath = GeneratorConstant.TEMP_PATH + configure.getJavaPath() + + packageConvertPath(configure.getBasePackage() + "." + packagePath); + filePath += configure.getClassName() + suffix; + return filePath; + } + + private static String packageConvertPath(String packageName) { + return String.format("/%s/", packageName.contains(".") ? packageName.replaceAll("\\.", "/") : packageName); + } + + public void generateEntityFile(List columns, GeneratorConfig configure) throws Exception { + String suffix = GeneratorConstant.JAVA_FILE_SUFFIX; + String path = getFilePath(configure, configure.getEntityPackage(), suffix, false); + String templateName = GeneratorConstant.ENTITY_TEMPLATE; + File entityFile = new File(path); + JSONObject data = toJsonObject(configure); + data.put("hasDate", false); + data.put("hasBigDecimal", false); + columns.forEach(c -> { + c.setField(FebsUtil.underscoreToCamel(StringUtils.lowerCase(c.getName()))); + if (StringUtils.containsAny(c.getType(), FieldType.DATE, FieldType.DATETIME, FieldType.TIMESTAMP)) { + data.put("hasDate", true); + } + if (StringUtils.containsAny(c.getType(), FieldType.DECIMAL, FieldType.NUMERIC)) { + data.put("hasBigDecimal", true); + } + }); + data.put("columns", columns); + this.generateFileByTemplate(templateName, entityFile, data); + } + + public void generateMapperFile(List columns, GeneratorConfig configure) throws Exception { + String suffix = GeneratorConstant.MAPPER_FILE_SUFFIX; + String path = getFilePath(configure, configure.getMapperPackage(), suffix, false); + String templateName = GeneratorConstant.MAPPER_TEMPLATE; + File mapperFile = new File(path); + generateFileByTemplate(templateName, mapperFile, toJsonObject(configure)); + } + + public void generateServiceFile(List columns, GeneratorConfig configure) throws Exception { + String suffix = GeneratorConstant.SERVICE_FILE_SUFFIX; + String path = getFilePath(configure, configure.getServicePackage(), suffix, true); + String templateName = GeneratorConstant.SERVICE_TEMPLATE; + File serviceFile = new File(path); + generateFileByTemplate(templateName, serviceFile, toJsonObject(configure)); + } + + public void generateServiceImplFile(List columns, GeneratorConfig configure) throws Exception { + String suffix = GeneratorConstant.SERVICEIMPL_FILE_SUFFIX; + String path = getFilePath(configure, configure.getServiceImplPackage(), suffix, false); + String templateName = GeneratorConstant.SERVICEIMPL_TEMPLATE; + File serviceImplFile = new File(path); + generateFileByTemplate(templateName, serviceImplFile, toJsonObject(configure)); + } + + public void generateControllerFile(List columns, GeneratorConfig configure) throws Exception { + String suffix = GeneratorConstant.CONTROLLER_FILE_SUFFIX; + String path = getFilePath(configure, configure.getControllerPackage(), suffix, false); + String templateName = GeneratorConstant.CONTROLLER_TEMPLATE; + File controllerFile = new File(path); + generateFileByTemplate(templateName, controllerFile, toJsonObject(configure)); + } + + public void generateMapperXmlFile(List columns, GeneratorConfig configure) throws Exception { + String suffix = GeneratorConstant.MAPPERXML_FILE_SUFFIX; + String path = getFilePath(configure, configure.getMapperXmlPackage(), suffix, false); + String templateName = GeneratorConstant.MAPPERXML_TEMPLATE; + File mapperXmlFile = new File(path); + JSONObject data = toJsonObject(configure); + columns.forEach(c -> c.setField(FebsUtil.underscoreToCamel(StringUtils.lowerCase(c.getName())))); + data.put("columns", columns); + generateFileByTemplate(templateName, mapperXmlFile, data); + } + + @SuppressWarnings("all") + private void generateFileByTemplate(String templateName, File file, Object data) throws Exception { + Template template = getTemplate(templateName); + Files.createParentDirs(file); + FileOutputStream fileOutputStream = new FileOutputStream(file); + try (Writer out = new BufferedWriter(new OutputStreamWriter(fileOutputStream, StandardCharsets.UTF_8), 10240)) { + template.process(data, out); + } catch (Exception e) { + String message = "代码生成异常"; + log.error(message, e); + throw new Exception(message); + } + } + + private JSONObject toJsonObject(Object o) { + return JSONObject.parseObject(JSONObject.toJSON(o).toString()); + } + + private Template getTemplate(String templateName) throws Exception { + Configuration configuration = new Configuration(Configuration.VERSION_2_3_23); + String templatePath = GeneratorHelper.class.getResource("/generator/templates/").getPath(); + File file = new File(templatePath); + if (!file.exists()) { + templatePath = System.getProperties().getProperty(FebsConstant.JAVA_TEMP_DIR); + file = new File(templatePath + File.separator + templateName); + FileUtils.copyInputStreamToFile(Objects.requireNonNull(GeneratorHelper.class.getClassLoader().getResourceAsStream("classpath:generator/templates/" + templateName)), file); + } + configuration.setDirectoryForTemplateLoading(new File(templatePath)); + configuration.setDefaultEncoding(FebsConstant.UTF8); + configuration.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER); + return configuration.getTemplate(templateName); + + } +} diff --git a/febs-server/febs-server-generator/src/main/java/cc/mrbird/febs/server/generator/mapper/GeneratorConfigMapper.java b/febs-server/febs-server-generator/src/main/java/cc/mrbird/febs/server/generator/mapper/GeneratorConfigMapper.java new file mode 100644 index 0000000..bab4528 --- /dev/null +++ b/febs-server/febs-server-generator/src/main/java/cc/mrbird/febs/server/generator/mapper/GeneratorConfigMapper.java @@ -0,0 +1,11 @@ +package cc.mrbird.febs.server.generator.mapper; + +import com.yida.data.common.core.entity.system.GeneratorConfig; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * @author MrBird + */ +public interface GeneratorConfigMapper extends BaseMapper { + +} diff --git a/febs-server/febs-server-generator/src/main/java/cc/mrbird/febs/server/generator/mapper/GeneratorMapper.java b/febs-server/febs-server-generator/src/main/java/cc/mrbird/febs/server/generator/mapper/GeneratorMapper.java new file mode 100644 index 0000000..deb2c6d --- /dev/null +++ b/febs-server/febs-server-generator/src/main/java/cc/mrbird/febs/server/generator/mapper/GeneratorMapper.java @@ -0,0 +1,60 @@ +package cc.mrbird.febs.server.generator.mapper; + + +import com.yida.data.common.core.entity.system.Column; +import com.yida.data.common.core.entity.system.Table; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author MrBird + */ +public interface GeneratorMapper { + + /** + * 获取数据列表 + * + * @param databaseType databaseType + * @return 数据库列表 + */ + List getDatabases(@Param("databaseType") String databaseType); + + /** + * 获取数据表 + * + * @param page page + * @param tableName tableName + * @param databaseType databaseType + * @param schemaName schemaName + * @param Type + * @return 数据表分页数据 + */ + IPage getTables(Page page, @Param("tableName") String tableName, @Param("databaseType") String databaseType, @Param("schemaName") String schemaName); + + /** + * 获取数据表列信息 + * + * @param databaseType databaseType + * @param schemaName schemaName + * @param tableName tableName + * @return 数据表列信息 + */ + List getColumns(@Param("databaseType") String databaseType, @Param("schemaName") String schemaName, @Param("tableName") String tableName); + + /** + * 获取单个数据表 + * + * @param databaseType databaseType + * @param schemaName schemaName + * @param tableName tableName + * @return com.yida.data.common.core.entity.system.Table + * @author ZYJ + * @date 2023/5/19 11:12 + */ + Table getTable(@Param("databaseType") String databaseType, + @Param("schemaName") String schemaName, + @Param("tableName") String tableName); +} diff --git a/febs-server/febs-server-generator/src/main/java/cc/mrbird/febs/server/generator/service/GeneratorConfigService.java b/febs-server/febs-server-generator/src/main/java/cc/mrbird/febs/server/generator/service/GeneratorConfigService.java new file mode 100644 index 0000000..fa02c25 --- /dev/null +++ b/febs-server/febs-server-generator/src/main/java/cc/mrbird/febs/server/generator/service/GeneratorConfigService.java @@ -0,0 +1,25 @@ +package cc.mrbird.febs.server.generator.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.system.GeneratorConfig; + +/** + * @author MrBird + */ +public interface GeneratorConfigService extends IService { + + /** + * 查询 + * + * @return GeneratorConfig + */ + GeneratorConfig findGeneratorConfig(); + + /** + * 修改 + * + * @param generatorConfig generatorConfig + */ + void updateGeneratorConfig(GeneratorConfig generatorConfig); + +} diff --git a/febs-server/febs-server-generator/src/main/java/cc/mrbird/febs/server/generator/service/GeneratorService.java b/febs-server/febs-server-generator/src/main/java/cc/mrbird/febs/server/generator/service/GeneratorService.java new file mode 100644 index 0000000..056ba8f --- /dev/null +++ b/febs-server/febs-server-generator/src/main/java/cc/mrbird/febs/server/generator/service/GeneratorService.java @@ -0,0 +1,55 @@ +package cc.mrbird.febs.server.generator.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.yida.data.common.core.entity.QueryRequest; +import com.yida.data.common.core.entity.system.Column; +import com.yida.data.common.core.entity.system.Table; + +import java.util.List; + +/** + * @author MrBird + */ +public interface GeneratorService { + + /** + * 获取数据库列表 + * + * @param databaseType databaseType + * @return 数据库列表 + */ + List getDatabases(String databaseType); + + /** + * 获取数据表 + * + * @param tableName tableName + * @param request request + * @param databaseType databaseType + * @param schemaName schemaName + * @return 数据表分页数据 + */ + IPage
getTables(String tableName, QueryRequest request, String databaseType, String schemaName); + + /** + * 获取数据表列信息 + * + * @param databaseType databaseType + * @param schemaName schemaName + * @param tableName tableName + * @return 数据表列信息 + */ + List getColumns(String databaseType, String schemaName, String tableName); + + /** + * 获取单个数据表 + * + * @param databaseType databaseType + * @param schemaName schemaName + * @param tableName tableName + * @return com.yida.data.common.core.entity.system.Table + * @author ZYJ + * @date 2023/5/19 11:18 + */ + Table getTable(String databaseType, String schemaName, String tableName); +} diff --git a/febs-server/febs-server-generator/src/main/java/cc/mrbird/febs/server/generator/service/impl/GeneratorConfigServiceImpl.java b/febs-server/febs-server-generator/src/main/java/cc/mrbird/febs/server/generator/service/impl/GeneratorConfigServiceImpl.java new file mode 100644 index 0000000..3dc06ce --- /dev/null +++ b/febs-server/febs-server-generator/src/main/java/cc/mrbird/febs/server/generator/service/impl/GeneratorConfigServiceImpl.java @@ -0,0 +1,34 @@ +package cc.mrbird.febs.server.generator.service.impl; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.system.GeneratorConfig; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +import cc.mrbird.febs.server.generator.mapper.GeneratorConfigMapper; +import cc.mrbird.febs.server.generator.service.GeneratorConfigService; + +/** + * @author MrBird + */ +@Service +@Transactional(propagation = Propagation.SUPPORTS, readOnly = true) +public class GeneratorConfigServiceImpl extends ServiceImpl implements GeneratorConfigService { + + @Override + public GeneratorConfig findGeneratorConfig() { + List generatorConfigs = this.baseMapper.selectList(null); + return CollectionUtils.isNotEmpty(generatorConfigs) ? generatorConfigs.get(0) : null; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateGeneratorConfig(GeneratorConfig generatorConfig) { + this.saveOrUpdate(generatorConfig); + } +} diff --git a/febs-server/febs-server-generator/src/main/java/cc/mrbird/febs/server/generator/service/impl/GeneratorServiceImpl.java b/febs-server/febs-server-generator/src/main/java/cc/mrbird/febs/server/generator/service/impl/GeneratorServiceImpl.java new file mode 100644 index 0000000..795724a --- /dev/null +++ b/febs-server/febs-server-generator/src/main/java/cc/mrbird/febs/server/generator/service/impl/GeneratorServiceImpl.java @@ -0,0 +1,49 @@ +package cc.mrbird.febs.server.generator.service.impl; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yida.data.common.core.entity.QueryRequest; +import com.yida.data.common.core.entity.constant.FebsConstant; +import com.yida.data.common.core.entity.system.Column; +import com.yida.data.common.core.entity.system.Table; +import com.yida.data.common.core.utils.SortUtil; + +import org.springframework.stereotype.Service; + +import java.util.List; + +import cc.mrbird.febs.server.generator.mapper.GeneratorMapper; +import cc.mrbird.febs.server.generator.service.GeneratorService; +import lombok.RequiredArgsConstructor; + +/** + * @author MrBird + */ +@Service +@RequiredArgsConstructor +public class GeneratorServiceImpl implements GeneratorService { + + private final GeneratorMapper generatorMapper; + + @Override + public List getDatabases(String databaseType) { + return generatorMapper.getDatabases(databaseType); + } + + @Override + public IPage
getTables(String tableName, QueryRequest request, String databaseType, String schemaName) { + Page
page = new Page<>(request.getPageNum(), request.getPageSize()); + SortUtil.handlePageSort(request, page, "createTime", FebsConstant.ORDER_ASC, false); + return generatorMapper.getTables(page, tableName, databaseType, schemaName); + } + + @Override + public List getColumns(String databaseType, String schemaName, String tableName) { + return generatorMapper.getColumns(databaseType, schemaName, tableName); + } + + @Override + public Table getTable(String databaseType, String schemaName, String tableName) { + return generatorMapper.getTable(databaseType, schemaName, tableName); + } +} diff --git a/febs-server/febs-server-generator/src/main/resources/ValidationMessages.properties b/febs-server/febs-server-generator/src/main/resources/ValidationMessages.properties new file mode 100644 index 0000000..24dfc21 --- /dev/null +++ b/febs-server/febs-server-generator/src/main/resources/ValidationMessages.properties @@ -0,0 +1,6 @@ +required=\u4E0D\u80FD\u4E3A\u7A7A +range=\u6709\u6548\u957f\u5ea6{min}\u5230{max}\u4e2a\u5b57\u7b26 +email=\u90ae\u7bb1\u683c\u5f0f\u4e0d\u5408\u6cd5 +mobile=\u624b\u673a\u53f7\u4e0d\u5408\u6cd5 +noMoreThan=\u957f\u5ea6\u4e0d\u80fd\u8d85\u8fc7{max}\u4e2a\u5b57\u7b26 +invalid=\u503c\u4e0d\u5408\u6cd5 \ No newline at end of file diff --git a/febs-server/febs-server-generator/src/main/resources/banner.txt b/febs-server/febs-server-generator/src/main/resources/banner.txt new file mode 100644 index 0000000..af17941 --- /dev/null +++ b/febs-server/febs-server-generator/src/main/resources/banner.txt @@ -0,0 +1,9 @@ + ████████ ██████ ████████ ████████ ███████ ██ ██ +░░░░░░██ ░█░░░░██ ░░░░░░██ ░██░░░░░ ░██░░░░██ ░██ ░██ + ██ ░█ ░██ ██ ░██ ░██ ░██░██ ░██ + ██ ░██████ ██ █████░███████ ░██ ░██░██ ░██ + ██ ░█░░░░ ██ ██ ░░░░░ ░██░░░░ ░██ ░██░██ ░██ + ██ ░█ ░██ ██ ░██ ░██ ██ ░██ ░██ + ████████░███████ ████████ ░████████░███████ ░░███████ +░░░░░░░░ ░░░░░░░ ░░░░░░░░ ░░░░░░░░ ░░░░░░░ ░░░░░░░ + ${spring.application.name} \ No newline at end of file diff --git a/febs-server/febs-server-generator/src/main/resources/bootstrap.yml b/febs-server/febs-server-generator/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..acb2e7f --- /dev/null +++ b/febs-server/febs-server-generator/src/main/resources/bootstrap.yml @@ -0,0 +1,27 @@ +spring: + application: + name: FEBS-Server-Generator + cloud: + nacos: + config: + server-addr: ${nacos.url} + group: DEFAULT_GROUP + prefix: febs-server-generator + file-extension: yaml + discovery: + server-addr: ${nacos.url} + +logging: + level: + org: + springframework: + boot: + actuate: + endpoint: + EndpointId: error + com: + alibaba: + cloud: + nacos: + client: + NacosPropertySourceBuilder: error \ No newline at end of file diff --git a/febs-server/febs-server-generator/src/main/resources/generator/templates/controller.ftl b/febs-server/febs-server-generator/src/main/resources/generator/templates/controller.ftl new file mode 100644 index 0000000..25d8279 --- /dev/null +++ b/febs-server/febs-server-generator/src/main/resources/generator/templates/controller.ftl @@ -0,0 +1,33 @@ +package ${basePackage}.${controllerPackage}; + +import ${basePackage}.${entityPackage}.${className}; +import ${basePackage}.${servicePackage}.I${className}Service; +import com.yida.data.common.core.entity.FebsResponse; +import com.yida.data.common.core.entity.QueryRequest; +import com.yida.data.common.core.exception.FebsException; +import com.yida.data.common.core.utils.FebsUtil; +import lombok.extern.slf4j.Slf4j; +import lombok.RequiredArgsConstructor; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.Map; + +/** +* ${tableComment} Controller +* +* @author ${author} +* @date ${date} +*/ +@Slf4j +@Validated +@RestController +@RequestMapping("${className?uncap_first}") +@RequiredArgsConstructor +public class ${className}Controller { + +private final ${className}Service ${className?uncap_first}Service; + +} diff --git a/febs-server/febs-server-generator/src/main/resources/generator/templates/entity.ftl b/febs-server/febs-server-generator/src/main/resources/generator/templates/entity.ftl new file mode 100644 index 0000000..c505d6e --- /dev/null +++ b/febs-server/febs-server-generator/src/main/resources/generator/templates/entity.ftl @@ -0,0 +1,100 @@ +package ${basePackage}.${entityPackage}; + +<#if hasDate = true> + import java.util.Date; + +<#if hasBigDecimal = true> + import java.math.BigDecimal; + +import lombok.Data; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; + +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; +import java.time.LocalDate; +import java.time.LocalTime; + +/** +* ${tableComment} Entity +* +* @author ${author} +* @date ${date} +*/ +@Data +@TableName("${tableName}") +public class ${className} { + +<#if columns??> + <#list columns as column> + /** + * ${column.remark} + */ + @ApiModelProperty(value = "${column.remark}") + <#if column.isKey = true> + @TableId(value = "${column.name}", type = IdType.AUTO) + <#else> + <#if (column.name='create_date' || column.name='create_id') || column.name='create_name'> + @TableField(value ="${column.name}", fill = FieldFill.INSERT) + <#elseif (column.name='update_date' || column.name='update_id') || column.name='update_name'> + @TableField(value ="${column.name}", fill = FieldFill.UPDATE) + <#else> + @TableField("${column.name}") + + + <#if column.name='del_flag'> + @TableLogic(value = "0", delval = "1") + + <#if (column.type = 'varchar' || column.type = 'text' || column.type = 'uniqueidentifier' + || column.type = 'varchar2' || column.type = 'nvarchar' || column.type = 'VARCHAR2' + || column.type = 'VARCHAR'|| column.type = 'CLOB' || column.type = 'char')> + private String ${column.field?uncap_first}; + + + <#if column.type = 'timestamp' || column.type = 'datetime'||column.type = 'TIMESTAMP' || column.type = 'DATETIME'> + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime ${column.field?uncap_first}; + + + <#if column.type = 'date' || column.type = 'DATE'> + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") + private LocalDate ${column.field?uncap_first}; + + + <#if column.type = 'TIME' || column.type = 'time'> + @DateTimeFormat(pattern = "HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "HH:mm:ss") + private LocalTime ${column.field?uncap_first}; + + + <#if column.type = 'int' || column.type = 'smallint'> + private Integer ${column.field?uncap_first}; + + + <#if column.type = 'double'> + private Double ${column.field?uncap_first}; + + + <#if column.type = 'bigint'> + private Long ${column.field?uncap_first}; + + + <#if column.type = 'tinyint'> + private Integer ${column.field?uncap_first}; + + + <#if column.type = 'decimal' || column.type = 'numeric'> + private BigDecimal ${column.field?uncap_first}; + + + +} \ No newline at end of file diff --git a/febs-server/febs-server-generator/src/main/resources/generator/templates/mapper.ftl b/febs-server/febs-server-generator/src/main/resources/generator/templates/mapper.ftl new file mode 100644 index 0000000..578193a --- /dev/null +++ b/febs-server/febs-server-generator/src/main/resources/generator/templates/mapper.ftl @@ -0,0 +1,14 @@ +package ${basePackage}.${mapperPackage}; + +import ${basePackage}.${entityPackage}.${className}; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * ${tableComment} Mapper + * + * @author ${author} + * @date ${date} + */ +public interface ${className}Mapper extends BaseMapper<${className}> { + +} diff --git a/febs-server/febs-server-generator/src/main/resources/generator/templates/mapperXml.ftl b/febs-server/febs-server-generator/src/main/resources/generator/templates/mapperXml.ftl new file mode 100644 index 0000000..6d80987 --- /dev/null +++ b/febs-server/febs-server-generator/src/main/resources/generator/templates/mapperXml.ftl @@ -0,0 +1,5 @@ + + + + + diff --git a/febs-server/febs-server-generator/src/main/resources/generator/templates/service.ftl b/febs-server/febs-server-generator/src/main/resources/generator/templates/service.ftl new file mode 100644 index 0000000..b6ea406 --- /dev/null +++ b/febs-server/febs-server-generator/src/main/resources/generator/templates/service.ftl @@ -0,0 +1,18 @@ +package ${basePackage}.${servicePackage}; + +import ${basePackage}.${entityPackage}.${className}; + +import com.yida.data.common.core.entity.QueryRequest; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** +* ${tableComment} Service接口 +* +* @author ${author} +* @date ${date} +*/ +public interface ${className}Service extends IService<${className}> { +} diff --git a/febs-server/febs-server-generator/src/main/resources/generator/templates/serviceImpl.ftl b/febs-server/febs-server-generator/src/main/resources/generator/templates/serviceImpl.ftl new file mode 100644 index 0000000..2e1009e --- /dev/null +++ b/febs-server/febs-server-generator/src/main/resources/generator/templates/serviceImpl.ftl @@ -0,0 +1,32 @@ +package ${basePackage}.${serviceImplPackage}; + +import ${basePackage}.${entityPackage}.${className}; +import ${basePackage}.${mapperPackage}.${className}Mapper; +import ${basePackage}.${servicePackage}.${className}Service; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.annotation.Propagation; +import lombok.RequiredArgsConstructor; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.QueryRequest; + +import java.util.List; + +/** +* ${tableComment} Service实现 +* +* @author ${author} +* @date ${date} +*/ +@Service +@RequiredArgsConstructor +@Transactional(propagation = Propagation.SUPPORTS, readOnly = true) +public class ${className}ServiceImpl extends ServiceImpl +<${className}Mapper, ${className}> implements ${className}Service { + + + +} diff --git a/febs-server/febs-server-generator/src/main/resources/mapper/GeneratorMapper.xml b/febs-server/febs-server-generator/src/main/resources/mapper/GeneratorMapper.xml new file mode 100644 index 0000000..8facccd --- /dev/null +++ b/febs-server/febs-server-generator/src/main/resources/mapper/GeneratorMapper.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/febs-server/febs-server-job/febs-server-job-biz/pom.xml b/febs-server/febs-server-job/febs-server-job-biz/pom.xml index 51b2f1c..32724d6 100644 --- a/febs-server/febs-server-job/febs-server-job-biz/pom.xml +++ b/febs-server/febs-server-job/febs-server-job-biz/pom.xml @@ -41,7 +41,7 @@ com.yida.data.attendance - edu-attendance-api + attendance-api ${febs-cloud.version} compile diff --git a/febs-server/febs-server-job/febs-server-job-biz/src/main/java/com/yida/data/job/task/AttendanceTask.java b/febs-server/febs-server-job/febs-server-job-biz/src/main/java/com/yida/data/job/task/AttendanceTask.java index 264dd01..3412d60 100644 --- a/febs-server/febs-server-job/febs-server-job-biz/src/main/java/com/yida/data/job/task/AttendanceTask.java +++ b/febs-server/febs-server-job/febs-server-job-biz/src/main/java/com/yida/data/job/task/AttendanceTask.java @@ -3,7 +3,7 @@ package com.yida.data.job.task; import com.yida.data.attendance.feign.RemoteAttendanceDeviceService; import com.yida.data.attendance.feign.RemoteAttendanceResultService; -import com.yida.data.attendance.feign.RemoteAttendanceRuleService; +import com.yida.data.attendance.feign.RemoteUserStrategyService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -16,23 +16,9 @@ import org.springframework.stereotype.Component; @RequiredArgsConstructor public class AttendanceTask { + private final RemoteUserStrategyService remoteUserStrategyService; private final RemoteAttendanceResultService remoteAttendanceResultService; private final RemoteAttendanceDeviceService remoteAttendanceDeviceService; - private final RemoteAttendanceRuleService remoteAttendanceRuleService; - - /** - * 定时推送未到消息 - */ - public void pushNotArriveMsg() { - remoteAttendanceResultService.pushNotArriveMsg(); - } - - /** - * 定时保存未到记录 - */ - public void dealResult() { - remoteAttendanceResultService.dealAttendanceResult(); - } /** * 更新设备在线状态 @@ -41,26 +27,6 @@ public class AttendanceTask { remoteAttendanceDeviceService.updateDeviceStatus(); } - /** - * 更新规则状态 - */ - public void updateRuleStatus() { - remoteAttendanceRuleService.updateRuleStatus(); - } - - /** - * 提醒打卡 - */ - public void remindStaff() { - remoteAttendanceRuleService.remindStaff(); - } - - /** - * 处理记录到结果表 - */ - public void staffRecord() { - remoteAttendanceRuleService.staffRecord(); - } /** * 校时所有设备 @@ -68,4 +34,27 @@ public class AttendanceTask { public void timingAllDevice() { remoteAttendanceDeviceService.timingAllDevice(); } + + + /** + * 初始化考勤结果 + */ + public void initAttendanceData() { + remoteAttendanceResultService.initAttendanceResult(); + } + + + /** + * 考勤报告推送 + */ + public void attendanceNotice() { + remoteAttendanceResultService.attendanceNotice(); + } + + /** + * 处理超时用户策略 + */ + public void checkOverTimeUserStrategy() { + remoteUserStrategyService.checkOverTimeUserStrategy(); + } } diff --git a/febs-server/febs-server-job/febs-server-job-biz/src/main/java/com/yida/data/job/task/BillTask.java b/febs-server/febs-server-job/febs-server-job-biz/src/main/java/com/yida/data/job/task/BillTask.java index b0cd880..db3843c 100644 --- a/febs-server/febs-server-job/febs-server-job-biz/src/main/java/com/yida/data/job/task/BillTask.java +++ b/febs-server/febs-server-job/febs-server-job-biz/src/main/java/com/yida/data/job/task/BillTask.java @@ -9,7 +9,7 @@ import org.springframework.stereotype.Component; * 账单模块相关定时任务 * * @author ZYJ - * @date 2023/4/14 + * @date 2022/4/14 */ @Component @AllArgsConstructor diff --git a/febs-server/febs-server-job/febs-server-job-biz/src/main/java/com/yida/data/job/task/ConsumeTask.java b/febs-server/febs-server-job/febs-server-job-biz/src/main/java/com/yida/data/job/task/ConsumeTask.java new file mode 100644 index 0000000..cd24096 --- /dev/null +++ b/febs-server/febs-server-job/febs-server-job-biz/src/main/java/com/yida/data/job/task/ConsumeTask.java @@ -0,0 +1,32 @@ +package com.yida.data.job.task; + +import com.yida.data.device.feign.consume.RemoteConsumeOrderService; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Component; + +/** + * 消费订单模块相关定时任务 + * + * @author ZYJ + * @date 2023/4/13 + */ +@Component +@AllArgsConstructor +public class ConsumeTask { + + private final RemoteConsumeOrderService remoteConsumeOrderService; + + /** + * 更新超时订单状态 + */ + public void updateOrderStatus() { + remoteConsumeOrderService.updateOrderStatus(); + } + + /** + * 更新退款订单状态 + */ + public void updateRefundStatus() { + remoteConsumeOrderService.updateRefundStatus(); + } +} diff --git a/febs-server/febs-server-job/febs-server-job-biz/src/main/java/com/yida/data/job/task/GuideTask.java b/febs-server/febs-server-job/febs-server-job-biz/src/main/java/com/yida/data/job/task/GuideTask.java new file mode 100644 index 0000000..bb05107 --- /dev/null +++ b/febs-server/febs-server-job/febs-server-job-biz/src/main/java/com/yida/data/job/task/GuideTask.java @@ -0,0 +1,27 @@ +package com.yida.data.job.task; + +import com.yida.data.mall.feign.RemoteBillOrderService; +import com.yida.data.mall.feign.RemoteBillStatisticsService; +import com.yida.data.school.feign.smart.RemoteSmartWelcomeService; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Component; + +/** + * 迎新指南模块相关定时任务 + * + * @author ZYJ + * @date 2023/6/21 + */ +@Component +@AllArgsConstructor +public class GuideTask { + + private final RemoteSmartWelcomeService remoteSmartWelcomeService; + + /** + * 更新超时迎新订单状态 + */ + public void updateGuideRosterOrderStatus() { + remoteSmartWelcomeService.updateGuideRosterOrderStatus(); + } +} diff --git a/febs-server/febs-server-job/febs-server-job-biz/src/main/java/com/yida/data/job/task/ProductUpdateTask.java b/febs-server/febs-server-job/febs-server-job-biz/src/main/java/com/yida/data/job/task/ProductUpdateTask.java index 20f64e2..6540f62 100644 --- a/febs-server/febs-server-job/febs-server-job-biz/src/main/java/com/yida/data/job/task/ProductUpdateTask.java +++ b/febs-server/febs-server-job/febs-server-job-biz/src/main/java/com/yida/data/job/task/ProductUpdateTask.java @@ -13,6 +13,7 @@ import org.springframework.stereotype.Component; @Slf4j @RequiredArgsConstructor public class ProductUpdateTask { + private final RemoteProductService remoteProductService; public void productUpdate(String id) { @@ -28,6 +29,7 @@ public class ProductUpdateTask { /** * 监测商品是否失效任务 + * * @param */ public void productMonitor() { diff --git a/febs-server/febs-server-job/febs-server-job-biz/src/main/java/com/yida/data/job/task/UserTask.java b/febs-server/febs-server-job/febs-server-job-biz/src/main/java/com/yida/data/job/task/UserTask.java index 11236cd..a4fc352 100644 --- a/febs-server/febs-server-job/febs-server-job-biz/src/main/java/com/yida/data/job/task/UserTask.java +++ b/febs-server/febs-server-job/febs-server-job-biz/src/main/java/com/yida/data/job/task/UserTask.java @@ -15,6 +15,7 @@ import org.springframework.stereotype.Component; @Component @AllArgsConstructor public class UserTask { + private final RemoteStudentService remoteStudentService; private final RemoteStaffService remoteStaffService; private final RemoteUserDeptService remoteUserDeptService; @@ -46,4 +47,21 @@ public class UserTask { public void dealNoParentUserDept() { remoteUserDeptService.dealNoParentUserDept(); } + + + /** + * 定时更新学生数据缓存 + */ + public void updateStudentCache() { + remoteStudentService.updateStudentCache(); + } + + + /** + * 定时更新教职工数据缓存 + */ + public void updateStaffCache() { + remoteStaffService.updateStaffCache(); + } + } diff --git a/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/dto/ListLogDTO.java b/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/dto/ListLogDTO.java index e44605a..0747a81 100644 --- a/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/dto/ListLogDTO.java +++ b/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/dto/ListLogDTO.java @@ -18,6 +18,11 @@ public class ListLogDTO extends BaseDTO { private String method; + /** + * 操作时请求参数 + */ + private String operateParams; + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime startTime; diff --git a/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/dto/QywxCallbackHandleDTO.java b/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/dto/QywxCallbackHandleDTO.java new file mode 100644 index 0000000..80feb64 --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/dto/QywxCallbackHandleDTO.java @@ -0,0 +1,58 @@ +package com.yida.data.system.dto; + +import com.yida.data.common.core.entity.system.Dept; +import com.yida.data.common.core.entity.system.EduQywxServiceProvider; +import com.yida.data.common.core.entity.system.EduQywxServiceProviderSchool; +import com.yida.data.common.core.enums.QywxCallbackTypeEnum; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.w3c.dom.Element; + +import java.io.Serializable; + +/** + * 企业微信回调处理类 + * + * @author ZYJ + * @date 2023/10/27 16:25 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class QywxCallbackHandleDTO implements Serializable { + + private static final long serialVersionUID = 820667804126969451L; + + /** + * 回调返回的节点信息 + */ + private Element root; + + /** + * 对应的企业微信corpId + */ + private String corpId; + + /** + * 学校信息 + */ + private Dept school; + + /** + * 企业微信服务商信息 + */ + private EduQywxServiceProvider eduQywxServiceProvider; + + /** + * 企业微信服务商-学校密文corpId对照信息 + */ + private EduQywxServiceProviderSchool providerSchool; + + /** + * 回调类型枚举 + */ + private QywxCallbackTypeEnum qywxCallbackTypeEnum; +} diff --git a/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/dto/SchoolInformationDTO.java b/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/dto/SchoolInformationDTO.java index 69057ae..3d7b7bb 100644 --- a/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/dto/SchoolInformationDTO.java +++ b/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/dto/SchoolInformationDTO.java @@ -12,7 +12,7 @@ import java.util.List; @Data public class SchoolInformationDTO { - @ApiModelProperty("主键id") + @ApiModelProperty("") private Long id; @ApiModelProperty("学校id") diff --git a/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/fallback/RemoteAppServiceFallback.java b/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/fallback/RemoteAppServiceFallback.java index 8462dcc..af39386 100644 --- a/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/fallback/RemoteAppServiceFallback.java +++ b/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/fallback/RemoteAppServiceFallback.java @@ -3,6 +3,8 @@ package com.yida.data.system.fallback; import com.yida.data.common.core.annotation.Fallback; import com.yida.data.common.core.common.ResultBean; import com.yida.data.common.core.entity.system.EduApp; +import com.yida.data.common.core.entity.system.EduAppTemplate; +import com.yida.data.common.core.entity.system.EduQywxServiceProvider; import com.yida.data.system.feign.RemoteAppService; import feign.hystrix.FallbackFactory; import lombok.extern.slf4j.Slf4j; @@ -26,6 +28,16 @@ public class RemoteAppServiceFallback implements FallbackFactory getAppBySchoolOrCorpIdAndCode(Long schoolId, String corpId, String code) { return null; } + + @Override + public ResultBean getAppTemplateByTemplateId(String templateId, String serviceCorpId) { + return null; + } + + @Override + public ResultBean getServiceProviderByServiceCorpId(String serviceCorpId) { + return null; + } }; } } diff --git a/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/fallback/RemoteBaiDuApiConfigServiceFallback.java b/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/fallback/RemoteBaiDuApiConfigServiceFallback.java new file mode 100644 index 0000000..ee46a17 --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/fallback/RemoteBaiDuApiConfigServiceFallback.java @@ -0,0 +1,33 @@ +package com.yida.data.system.fallback; + +import com.yida.data.common.core.annotation.Fallback; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.system.BaiduApiConfig; +import com.yida.data.common.core.entity.system.ConstructionPayConfig; +import com.yida.data.system.feign.RemoteBaiDuApiConfigService; +import com.yida.data.system.feign.RemoteConstructionPayConfigService; +import feign.hystrix.FallbackFactory; +import lombok.extern.slf4j.Slf4j; + +/** + * RemoteBaiDuApiConfigService fallback处理类 + * + * @author ZYJ + * @date 2023/6/20 + */ +@Slf4j +@Fallback +public class RemoteBaiDuApiConfigServiceFallback implements FallbackFactory { + + @Override + public RemoteBaiDuApiConfigService create(Throwable throwable) { + log.error("RemoteBaiDuApiConfigService fallback reason:{}", throwable.getMessage()); + + return new RemoteBaiDuApiConfigService() { + @Override + public ResultBean getBaiDuApiConfigByDept(Long deptId, String moduleName) { + return null; + } + }; + } +} diff --git a/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/fallback/RemoteBaseAppServiceFallback.java b/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/fallback/RemoteBaseAppServiceFallback.java new file mode 100644 index 0000000..c112f5c --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/fallback/RemoteBaseAppServiceFallback.java @@ -0,0 +1,24 @@ +package com.yida.data.system.fallback; + +import com.yida.data.common.core.annotation.Fallback; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.system.EduBaseApp; +import com.yida.data.system.feign.RemoteBaseAppService; +import feign.hystrix.FallbackFactory; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Fallback +public class RemoteBaseAppServiceFallback implements FallbackFactory { + + @Override + public RemoteBaseAppService create(Throwable throwable) { + log.error("RemoteBaseAppService fallback reason:{}", throwable.getMessage()); + return new RemoteBaseAppService() { + @Override + public ResultBean getById(Long id) { + return null; + } + }; + } +} diff --git a/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/fallback/RemoteConstructionPayConfigServiceFallback.java b/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/fallback/RemoteConstructionPayConfigServiceFallback.java new file mode 100644 index 0000000..1234ec1 --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/fallback/RemoteConstructionPayConfigServiceFallback.java @@ -0,0 +1,33 @@ +package com.yida.data.system.fallback; + +import com.yida.data.common.core.annotation.Fallback; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.system.ConstructionPayConfig; +import com.yida.data.common.core.entity.system.UnionPayConfig; +import com.yida.data.system.feign.RemoteConstructionPayConfigService; +import com.yida.data.system.feign.RemoteUnionPayConfigService; +import feign.hystrix.FallbackFactory; +import lombok.extern.slf4j.Slf4j; + +/** + * RemoteConstructionPayConfigService fallback处理类 + * + * @author ZYJ + * @date 2023/6/19 + */ +@Slf4j +@Fallback +public class RemoteConstructionPayConfigServiceFallback implements FallbackFactory { + + @Override + public RemoteConstructionPayConfigService create(Throwable throwable) { + log.error("RemoteConstructionPayConfigService fallback reason:{}", throwable.getMessage()); + + return new RemoteConstructionPayConfigService() { + @Override + public ResultBean getConstructionPayConfigByDept(Long deptId) { + return null; + } + }; + } +} diff --git a/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/fallback/RemoteConsumeConfigServiceFallback.java b/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/fallback/RemoteConsumeConfigServiceFallback.java new file mode 100644 index 0000000..d38fb70 --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/fallback/RemoteConsumeConfigServiceFallback.java @@ -0,0 +1,31 @@ +package com.yida.data.system.fallback; + +import com.yida.data.common.core.annotation.Fallback; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.consume.EduConsumeConfig; +import com.yida.data.system.feign.RemoteConsumeConfigService; +import feign.hystrix.FallbackFactory; +import lombok.extern.slf4j.Slf4j; + +/** + * RemoteConsumeConfigService fallback处理类 + * + * @author ZYJ + * @date 2023/4/6 + */ +@Slf4j +@Fallback +public class RemoteConsumeConfigServiceFallback implements FallbackFactory { + + @Override + public RemoteConsumeConfigService create(Throwable throwable) { + log.error("RemoteConsumeConfigService fallback reason:{}", throwable.getMessage()); + + return new RemoteConsumeConfigService() { + @Override + public ResultBean getConsumeConfigByDept(Long deptId) { + return null; + } + }; + } +} diff --git a/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/fallback/RemoteDeptFunctionServiceFallback.java b/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/fallback/RemoteDeptFunctionServiceFallback.java new file mode 100644 index 0000000..1b781ad --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/fallback/RemoteDeptFunctionServiceFallback.java @@ -0,0 +1,31 @@ +package com.yida.data.system.fallback; + +import com.yida.data.common.core.annotation.Fallback; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.system.EduDeptFunction; +import com.yida.data.system.feign.RemoteDeptFunctionService; +import feign.hystrix.FallbackFactory; +import lombok.extern.slf4j.Slf4j; + +/** + * RemoteDeptFunctionService fallback处理类 + * + * @author ZYJ + * @date 2023/2/21 + */ +@Slf4j +@Fallback +public class RemoteDeptFunctionServiceFallback implements FallbackFactory { + + @Override + public RemoteDeptFunctionService create(Throwable throwable) { + log.error("RemoteDeptFunctionService fallback reason:{}", throwable.getMessage()); + + return new RemoteDeptFunctionService() { + @Override + public ResultBean getDeptFunction(String functionName, Long deptId) { + return null; + } + }; + } +} diff --git a/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/fallback/RemoteDeptUserviceFallback.java b/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/fallback/RemoteDeptUserviceFallback.java index 088d3a5..715b680 100644 --- a/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/fallback/RemoteDeptUserviceFallback.java +++ b/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/fallback/RemoteDeptUserviceFallback.java @@ -122,6 +122,16 @@ public class RemoteDeptUserviceFallback implements FallbackFactory> listDept(List ids) { return null; } + + @Override + public ResultBean> listParentDeptByChild(List ids) { + return null; + } + + @Override + public ResultBean getDeptTree(List deptIds) { + return null; + } }; } } diff --git a/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/fallback/RemoteQywxServiceFallback.java b/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/fallback/RemoteQywxServiceFallback.java new file mode 100644 index 0000000..b1b66ea --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/fallback/RemoteQywxServiceFallback.java @@ -0,0 +1,38 @@ +package com.yida.data.system.fallback; + +import com.yida.data.common.core.annotation.Fallback; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.system.EduDeptPayType; +import com.yida.data.common.core.entity.system.EduQywxServiceProviderSchool; +import com.yida.data.system.feign.RemotePayTypeService; +import com.yida.data.system.feign.RemoteQywxService; +import feign.hystrix.FallbackFactory; +import lombok.extern.slf4j.Slf4j; + +/** + * RemoteQywxService fallback处理类 + * + * @author ZYJ + * @date 2023/8/26 + */ +@Slf4j +@Fallback +public class RemoteQywxServiceFallback implements FallbackFactory { + + @Override + public RemoteQywxService create(Throwable throwable) { + log.error("RemoteQywxService fallback reason:{}", throwable.getMessage()); + + return new RemoteQywxService() { + @Override + public ResultBean getCorpByOriginalData(String providerCorpId, String deptOriginalCorpId) { + return null; + } + + @Override + public ResultBean getCorpByEncryptionData(String providerCorpId, String deptEncryptionCorpId) { + return null; + } + }; + } +} diff --git a/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/fallback/RemoteUPayConfigServiceFallback.java b/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/fallback/RemoteUPayConfigServiceFallback.java new file mode 100644 index 0000000..0652e29 --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/fallback/RemoteUPayConfigServiceFallback.java @@ -0,0 +1,31 @@ +package com.yida.data.system.fallback; + +import com.yida.data.common.core.annotation.Fallback; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.system.UPayConfig; +import com.yida.data.system.feign.RemoteUPayConfigService; +import feign.hystrix.FallbackFactory; +import lombok.extern.slf4j.Slf4j; + +/** + * RemoteUPayConfigService fallback处理类 + * + * @author ZYJ + * @date 2023/3/21 + */ +@Slf4j +@Fallback +public class RemoteUPayConfigServiceFallback implements FallbackFactory { + + @Override + public RemoteUPayConfigService create(Throwable throwable) { + log.error("RemoteUPayConfigService fallback reason:{}", throwable.getMessage()); + + return new RemoteUPayConfigService() { + @Override + public ResultBean getUPayConfigByDept(Long deptId) { + return null; + } + }; + } +} diff --git a/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/fallback/RemoteWhiteListServiceFallback.java b/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/fallback/RemoteWhiteListServiceFallback.java new file mode 100644 index 0000000..8d1db6d --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/fallback/RemoteWhiteListServiceFallback.java @@ -0,0 +1,31 @@ +package com.yida.data.system.fallback; + +import com.yida.data.common.core.annotation.Fallback; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.system.WhiteList; +import com.yida.data.system.feign.RemoteWhiteListService; +import feign.hystrix.FallbackFactory; +import lombok.extern.slf4j.Slf4j; + +/** + * RemoteWhiteListService fallback处理类 + * + * @author ZYJ + * @date 2022/8/26 + */ +@Slf4j +@Fallback +public class RemoteWhiteListServiceFallback implements FallbackFactory { + + @Override + public RemoteWhiteListService create(Throwable throwable) { + log.error("RemoteWhiteListService fallback reason:{}", throwable.getMessage()); + + return new RemoteWhiteListService() { + @Override + public ResultBean getWhiteList(String functionName) { + return null; + } + }; + } +} diff --git a/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/feign/RemoteAppService.java b/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/feign/RemoteAppService.java index 4e5d20c..1b11842 100644 --- a/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/feign/RemoteAppService.java +++ b/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/feign/RemoteAppService.java @@ -3,6 +3,8 @@ package com.yida.data.system.feign; import com.yida.data.common.core.common.ResultBean; import com.yida.data.common.core.entity.constant.FebsServerConstant; import com.yida.data.common.core.entity.system.EduApp; +import com.yida.data.common.core.entity.system.EduAppTemplate; +import com.yida.data.common.core.entity.system.EduQywxServiceProvider; import com.yida.data.system.fallback.RemoteAppServiceFallback; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; @@ -16,4 +18,11 @@ public interface RemoteAppService { ResultBean getAppBySchoolOrCorpIdAndCode(@RequestParam("schoolId") Long schoolId, @RequestParam("corpId") String corpId, @RequestParam("code") String code); + + @GetMapping("/in/app/getAppTemplateByTemplateId") + ResultBean getAppTemplateByTemplateId(@RequestParam("templateId") String templateId, + @RequestParam("serviceCorpId") String serviceCorpId); + + @GetMapping("/in/app/getServiceProviderByServiceCorpId") + ResultBean getServiceProviderByServiceCorpId(@RequestParam("serviceCorpId") String serviceCorpId); } diff --git a/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/feign/RemoteBaiDuApiConfigService.java b/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/feign/RemoteBaiDuApiConfigService.java new file mode 100644 index 0000000..388a822 --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/feign/RemoteBaiDuApiConfigService.java @@ -0,0 +1,23 @@ +package com.yida.data.system.feign; + +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.constant.FebsServerConstant; +import com.yida.data.common.core.entity.system.BaiduApiConfig; +import com.yida.data.common.core.entity.system.ConstructionPayConfig; +import com.yida.data.system.fallback.RemoteBaiDuApiConfigServiceFallback; +import com.yida.data.system.fallback.RemoteConstructionPayConfigServiceFallback; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; + +@FeignClient(value = FebsServerConstant.FEBS_SERVER_SYSTEM, contextId = "baiDuApiConfigServiceClient", + fallbackFactory = RemoteBaiDuApiConfigServiceFallback.class) +public interface RemoteBaiDuApiConfigService { + + /** + * 根据学校id查询百度api配置 + */ + @GetMapping("/in/baiDuApiConfig/getBaiDuApiConfigByDept") + ResultBean getBaiDuApiConfigByDept(@RequestParam("deptId") Long deptId, + @RequestParam("moduleName") String moduleName); +} diff --git a/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/feign/RemoteBaseAppService.java b/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/feign/RemoteBaseAppService.java new file mode 100644 index 0000000..b062789 --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/feign/RemoteBaseAppService.java @@ -0,0 +1,17 @@ +package com.yida.data.system.feign; + +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.constant.FebsServerConstant; +import com.yida.data.common.core.entity.system.EduBaseApp; +import com.yida.data.system.fallback.RemoteBaseAppServiceFallback; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; + +@FeignClient(value = FebsServerConstant.FEBS_SERVER_SYSTEM, contextId = "baseAppServiceClient", + fallbackFactory = RemoteBaseAppServiceFallback.class) +public interface RemoteBaseAppService { + + @GetMapping("/in/deptHomeApp/getById") + ResultBean getById(@RequestParam("id") Long id); +} diff --git a/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/feign/RemoteConstructionPayConfigService.java b/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/feign/RemoteConstructionPayConfigService.java new file mode 100644 index 0000000..c804082 --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/feign/RemoteConstructionPayConfigService.java @@ -0,0 +1,19 @@ +package com.yida.data.system.feign; + +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.constant.FebsServerConstant; +import com.yida.data.common.core.entity.system.ConstructionPayConfig; +import com.yida.data.common.core.entity.system.UnionPayConfig; +import com.yida.data.system.fallback.RemoteConstructionPayConfigServiceFallback; +import com.yida.data.system.fallback.RemoteUnionPayConfigServiceFallback; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; + +@FeignClient(value = FebsServerConstant.FEBS_SERVER_SYSTEM, contextId = "constructionPayConfigServiceClient", + fallbackFactory = RemoteConstructionPayConfigServiceFallback.class) +public interface RemoteConstructionPayConfigService { + + @GetMapping("/in/constructionPayConfig/getConstructionPayConfigByDept") + ResultBean getConstructionPayConfigByDept(@RequestParam("deptId") Long deptId); +} diff --git a/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/feign/RemoteConsumeConfigService.java b/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/feign/RemoteConsumeConfigService.java new file mode 100644 index 0000000..b0f7425 --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/feign/RemoteConsumeConfigService.java @@ -0,0 +1,17 @@ +package com.yida.data.system.feign; + +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.constant.FebsServerConstant; +import com.yida.data.common.core.entity.consume.EduConsumeConfig; +import com.yida.data.system.fallback.RemoteConsumeConfigServiceFallback; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; + +@FeignClient(value = FebsServerConstant.FEBS_SERVER_SYSTEM, contextId = "consumeConfigServiceClient", + fallbackFactory = RemoteConsumeConfigServiceFallback.class) +public interface RemoteConsumeConfigService { + + @GetMapping("/in/consumeConfig/getConsumeConfigByDept") + ResultBean getConsumeConfigByDept(@RequestParam("deptId") Long deptId); +} diff --git a/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/feign/RemoteDeptFunctionService.java b/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/feign/RemoteDeptFunctionService.java new file mode 100644 index 0000000..66cb56d --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/feign/RemoteDeptFunctionService.java @@ -0,0 +1,27 @@ +package com.yida.data.system.feign; + +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.constant.FebsServerConstant; +import com.yida.data.common.core.entity.system.EduDeptFunction; +import com.yida.data.system.fallback.RemoteDeptFunctionServiceFallback; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; + +@FeignClient(value = FebsServerConstant.FEBS_SERVER_SYSTEM, contextId = "deptFunctionServiceClient", fallbackFactory = + RemoteDeptFunctionServiceFallback.class) +public interface RemoteDeptFunctionService { + + /** + * 获取部门是否开通当前功能 + * + * @param functionName 功能名称 + * @param deptId 部门id + * @return com.yida.data.common.core.common.ResultBean + * @author ZYJ + * @date 2023/2/21 15:06 + */ + @GetMapping("/in/function/getDeptFunction") + ResultBean getDeptFunction(@RequestParam("functionName") String functionName, + @RequestParam("deptId") Long deptId); +} diff --git a/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/feign/RemoteDeptService.java b/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/feign/RemoteDeptService.java index 03850f4..8c45bca 100644 --- a/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/feign/RemoteDeptService.java +++ b/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/feign/RemoteDeptService.java @@ -18,7 +18,7 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; @FeignClient(value = FebsServerConstant.FEBS_SERVER_SYSTEM, contextId = "deptServiceClient", fallbackFactory = - RemoteDeptUserviceFallback.class) + RemoteDeptUserviceFallback.class) public interface RemoteDeptService { /** @@ -50,7 +50,7 @@ public interface RemoteDeptService { */ @GetMapping("/dept/getSchoolByArea") ResultBean> getSchoolByArea(@RequestParam("areaId") Long areaId, - @RequestParam("schoolName") String schoolName); + @RequestParam("schoolName") String schoolName); /** * 根据corpid获取学校 @@ -78,7 +78,7 @@ public interface RemoteDeptService { */ @GetMapping("/in/dept/getDeptBySchoolAndName") ResultBean getDeptBySchoolAndName(@RequestParam("schoolId") Long schoolId, - @RequestParam("deptName") String deptName); + @RequestParam("deptName") String deptName); /** * 获取学校和区域信息 @@ -91,9 +91,9 @@ public interface RemoteDeptService { */ @GetMapping("/dept/getPageSchoolByArea") ResultBean> getPageSchoolByArea(@ApiParam("类型") @RequestParam(required = false) Long areaId, - @ApiParam("搜索关键词 学校名") @RequestParam(required = false) String schoolName, - @ApiParam("当前页码") @RequestParam(defaultValue = "1") Integer pageNum, - @ApiParam("页面大小") @RequestParam(defaultValue = "10") Integer pageSize); + @ApiParam("搜索关键词 学校名") @RequestParam(required = false) String schoolName, + @ApiParam("当前页码") @RequestParam(defaultValue = "1") Integer pageNum, + @ApiParam("页面大小") @RequestParam(defaultValue = "10") Integer pageSize); /** * 获取学校地区 @@ -106,7 +106,7 @@ public interface RemoteDeptService { @GetMapping("/dept/findChildByParent") ResultBean> findChildByParent(@RequestParam("deptId") Long deptId, - @RequestParam("type") Integer type); + @RequestParam("type") Integer type); /** * 根据学校类型查询学校 @@ -135,7 +135,7 @@ public interface RemoteDeptService { */ @GetMapping("/in/dept/getDeptBySchoolAndWxId") ResultBean getDeptBySchoolAndWxId(@RequestParam("schoolId") Long schoolId, - @RequestParam("wxId") Long wxId); + @RequestParam("wxId") Long wxId); /** * 查询部门列表 @@ -145,4 +145,17 @@ public interface RemoteDeptService { */ @PostMapping("/in/dept/listDept") ResultBean> listDept(@RequestBody List ids); + + /** + * 向上查询父级部门集合,包含子部门 + * + * @param ids + * @return + */ + @PostMapping("/in/dept/findParentDeptByChilds") + ResultBean> listParentDeptByChild(@RequestBody List ids); + + + @PostMapping("/in/dept/getDeptTree") + ResultBean getDeptTree(@RequestBody List deptIds); } diff --git a/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/feign/RemoteDictService.java b/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/feign/RemoteDictService.java new file mode 100644 index 0000000..5f70d8e --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/feign/RemoteDictService.java @@ -0,0 +1,24 @@ +package com.yida.data.system.feign; + +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.Dict; +import com.yida.data.common.core.entity.constant.FebsServerConstant; +import com.yida.data.system.fallback.RemoteAreaServiceFallback; +import java.util.List; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; + +@FeignClient(value = FebsServerConstant.FEBS_SERVER_SYSTEM, contextId = "dictServiceClient", + fallbackFactory = RemoteAreaServiceFallback.class) +public interface RemoteDictService { + + @GetMapping("/in/dict/selectDict") + ResultBean> selectDict(@RequestParam String type); + + + @GetMapping("/in/dict/getDictByTypeAndValueOrLabel") + ResultBean getDictByTypeAndValueOrLabel(@RequestParam String type, @RequestParam String value, + @RequestParam String label); + +} \ No newline at end of file diff --git a/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/feign/RemoteQywxService.java b/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/feign/RemoteQywxService.java new file mode 100644 index 0000000..916d292 --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/feign/RemoteQywxService.java @@ -0,0 +1,40 @@ +package com.yida.data.system.feign; + +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.constant.FebsServerConstant; +import com.yida.data.common.core.entity.system.EduQywxServiceProviderSchool; +import com.yida.data.system.fallback.RemoteQywxServiceFallback; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; + +@FeignClient(value = FebsServerConstant.FEBS_SERVER_SYSTEM, contextId = "qywxServiceClient", + fallbackFactory = RemoteQywxServiceFallback.class) +public interface RemoteQywxService { + + /** + * 服务商对应学校加密corpId数据(原始值为key) + * + * @param providerCorpId 服务商corpId + * @param deptOriginalCorpId 部门原始corpId + * @return com.yida.data.common.core.common.ResultBean + * @author ZYJ + * @date 2023/9/25 17:48 + */ + @GetMapping("/in/qywx/getCorpByOriginalData") + ResultBean getCorpByOriginalData(@RequestParam("providerCorpId") String providerCorpId, + @RequestParam("deptOriginalCorpId") String deptOriginalCorpId); + + /** + * 服务商对应学校加密corpId数据(加密值为key) + * + * @param providerCorpId 服务商corpId + * @param deptEncryptionCorpId 部门加密corpId + * @return com.yida.data.common.core.common.ResultBean + * @author ZYJ + * @date 2023/9/25 17:48 + */ + @GetMapping("/in/qywx/getCorpByEncryptionData") + ResultBean getCorpByEncryptionData(@RequestParam("providerCorpId") String providerCorpId, + @RequestParam("deptEncryptionCorpId") String deptEncryptionCorpId); +} diff --git a/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/feign/RemoteUPayConfigService.java b/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/feign/RemoteUPayConfigService.java new file mode 100644 index 0000000..f8a8c81 --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/feign/RemoteUPayConfigService.java @@ -0,0 +1,17 @@ +package com.yida.data.system.feign; + +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.constant.FebsServerConstant; +import com.yida.data.common.core.entity.system.UPayConfig; +import com.yida.data.system.fallback.RemoteUnionPayConfigServiceFallback; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; + +@FeignClient(value = FebsServerConstant.FEBS_SERVER_SYSTEM, contextId = "uPayConfigServiceClient", + fallbackFactory = RemoteUnionPayConfigServiceFallback.class) +public interface RemoteUPayConfigService { + + @GetMapping("/in/uPayConfig/getUPayConfigByDept") + ResultBean getUPayConfigByDept(@RequestParam("deptId") Long deptId); +} diff --git a/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/feign/RemoteWhiteListService.java b/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/feign/RemoteWhiteListService.java new file mode 100644 index 0000000..58764ff --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-api/src/main/java/com/yida/data/system/feign/RemoteWhiteListService.java @@ -0,0 +1,25 @@ +package com.yida.data.system.feign; + +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.constant.FebsServerConstant; +import com.yida.data.common.core.entity.system.WhiteList; +import com.yida.data.system.fallback.RemoteWhiteListServiceFallback; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; + +@FeignClient(value = FebsServerConstant.FEBS_SERVER_SYSTEM, contextId = "whiteListServiceClient", fallbackFactory = + RemoteWhiteListServiceFallback.class) +public interface RemoteWhiteListService { + + /** + * 根据功能名称获取对应的白名单信息 + * + * @param functionName 功能名称 + * @return com.yida.data.common.core.common.ResultBean + * @author ZYJ + * @date 2023/2/21 15:05 + */ + @GetMapping("/in/whiteList/getWhiteList") + ResultBean getWhiteList(@RequestParam("functionName") String functionName); +} diff --git a/febs-server/febs-server-system/febs-server-system-api/src/main/resources/META-INF/spring.factories b/febs-server/febs-server-system/febs-server-system-api/src/main/resources/META-INF/spring.factories index 792b375..dfa3e8b 100644 --- a/febs-server/febs-server-system/febs-server-system-api/src/main/resources/META-INF/spring.factories +++ b/febs-server/febs-server-system/febs-server-system-api/src/main/resources/META-INF/spring.factories @@ -11,5 +11,12 @@ com.yida.data.system.fallback.RemotePayWxConfigServiceFallback,\ com.yida.data.system.fallback.RemoteRoleServiceFallback,\ com.yida.data.system.fallback.RemoteUnionPayConfigServiceFallback,\ com.yida.data.system.fallback.RemoteUserUserviceFallback,\ +com.yida.data.system.fallback.RemoteWhiteListServiceFallback,\ com.yida.data.system.fallback.RemoteYidaAppAccountServiceFallback,\ -com.yida.data.system.fallback.RemoteYidaAppServiceFallback \ No newline at end of file +com.yida.data.system.fallback.RemoteYidaAppServiceFallback,\ +com.yida.data.system.fallback.RemoteDeptFunctionServiceFallback,\ +com.yida.data.system.fallback.RemoteUPayConfigServiceFallback,\ +com.yida.data.system.fallback.RemoteConsumeConfigServiceFallback,\ +com.yida.data.system.fallback.RemoteConstructionPayConfigServiceFallback,\ +com.yida.data.system.fallback.RemoteBaiDuApiConfigServiceFallback,\ +com.yida.data.system.fallback.RemoteQywxServiceFallback \ No newline at end of file diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/aes/WXBizMsgCrypt.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/aes/WXBizMsgCrypt.java index 3a2436e..564e5dd 100644 --- a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/aes/WXBizMsgCrypt.java +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/aes/WXBizMsgCrypt.java @@ -86,6 +86,10 @@ * 针对org.apache.commons.codec.binary.Base64, * 需要导入架包commons-codec-1.9(或commons-codec-1.8等其他版本) * 官方下载地址:http://commons.apache.org/proper/commons-codec/download_codec.cgi + *

+ * 针对org.apache.commons.codec.binary.Base64, + * 需要导入架包commons-codec-1.9(或commons-codec-1.8等其他版本) + * 官方下载地址:http://commons.apache.org/proper/commons-codec/download_codec.cgi */ // ------------------------------------------------------------------------ @@ -149,11 +153,11 @@ public class WXBizMsgCrypt { } public static void main(String[] args) { - WXBizMsgCrypt wxcpt = new WXBizMsgCrypt("yta6ad", "n0KuvcacrFw761RqgNTsN3UwHFw3KYptFij2XWrWW4s", "wxfc7961cd4039bc6d"); - wxcpt.DecryptMsg("dd57e9c2b26b073d5777497e8dd43f940d90d8e2", "1635322300", "203081013", "\n" + - " \n" + - " \n" + - ""); +// WXBizMsgCrypt wxcpt = new WXBizMsgCrypt("yta6ad", "n0KuvcacrFw761RqgNTsN3UwHFw3KYptFij2XWrWW4s", "wxfc7961cd4039bc6d"); +// wxcpt.DecryptMsg("dd57e9c2b26b073d5777497e8dd43f940d90d8e2", "1635322300", "203081013", "\n" + +// " \n" + +// " \n" + +// ""); } // 生成4个字节的网络字节序 @@ -235,6 +239,10 @@ public class WXBizMsgCrypt { } } + String decrypt(String text) throws AesException { + return decrypt(text, true); + } + /** * 对密文进行解密. * 应用消息回调时receiveid应该为corpid,应对比receiveid与corpid是否一致 @@ -248,7 +256,7 @@ public class WXBizMsgCrypt { * @return 解密得到的明文 * @throws AesException aes解密失败 */ - String decrypt(String text) throws AesException { + String decrypt(String text, boolean flag) throws AesException { byte[] original; try { // 设置解密模式为AES的CBC模式 @@ -284,12 +292,14 @@ public class WXBizMsgCrypt { e.printStackTrace(); throw new AesException(AesException.IllegalBuffer); } - log.info("解密后的密文, encrypt: {}", xmlContent); log.info("解密后的from_receiveid: {}", from_receiveid); - // receiveid不相同的情况 - if (!from_receiveid.equals(receiveid) && !xmlContent.contains("SuiteId")) { - throw new AesException(AesException.ValidateCorpidError); + // 判断是否对比receiveid + if (flag) { + // receiveid不相同的情况 + if (!from_receiveid.equals(receiveid)) { + throw new AesException(AesException.ValidateCorpidError); + } } return xmlContent; @@ -327,7 +337,12 @@ public class WXBizMsgCrypt { return result; } + public String DecryptMsg(String msgSignature, String timeStamp, String nonce, String postData) { + return DecryptMsg(msgSignature, timeStamp, nonce, postData, true); + } + /** + * 服务商待开发应用回调验证 * 检验消息的真实性,并且获取解密后的明文. *

    *
  1. 利用收到的密文生成安全签名,进行签名验证
  2. @@ -343,7 +358,7 @@ public class WXBizMsgCrypt { * @return 解密后的原文 * @throws AesException 执行失败,请查看该异常的错误码和具体的错误信息 */ - public String DecryptMsg(String msgSignature, String timeStamp, String nonce, String postData) + public String DecryptMsg(String msgSignature, String timeStamp, String nonce, String postData, boolean flag) throws AesException { // 密钥,公众账号的app secret @@ -361,11 +376,16 @@ public class WXBizMsgCrypt { } // 解密 - String result = decrypt(encrypt[1].toString()); - return result; + return decrypt(encrypt[1].toString(), flag); + } + + public String VerifyURL(String msgSignature, String timeStamp, String nonce, String echoStr) + throws AesException { + return VerifyURL(msgSignature, timeStamp, nonce, echoStr, true); } /** + * 服务商待开发应用回调验证 * 验证URL * @param msgSignature 签名串,对应URL参数的msg_signature * @param timeStamp 时间戳,对应URL参数的timestamp @@ -375,7 +395,7 @@ public class WXBizMsgCrypt { * @return 解密之后的echostr * @throws AesException 执行失败,请查看该异常的错误码和具体的错误信息 */ - public String VerifyURL(String msgSignature, String timeStamp, String nonce, String echoStr) + public String VerifyURL(String msgSignature, String timeStamp, String nonce, String echoStr, boolean flag) throws AesException { String signature = SHA1.getSHA1(token, timeStamp, nonce, echoStr); @@ -383,8 +403,7 @@ public class WXBizMsgCrypt { throw new AesException(AesException.ValidateSignatureError); } - String result = decrypt(echoStr); - return result; + return decrypt(echoStr, flag); } } \ No newline at end of file diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/configure/InitializeRunner.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/configure/InitializeRunner.java index 12e3728..3469cc5 100644 --- a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/configure/InitializeRunner.java +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/configure/InitializeRunner.java @@ -1,9 +1,21 @@ package com.yida.data.system.configure; +import cc.mrbird.febs.common.redis.service.RedisService; +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.yida.data.common.core.entity.constant.CachePrefixConstant; +import com.yida.data.common.core.entity.constant.QywxServiceProviderConstant; import com.yida.data.common.core.entity.system.Dept; +import com.yida.data.common.core.entity.system.EduQywxServiceProvider; +import com.yida.data.common.core.entity.system.EduQywxServiceProviderSchool; +import com.yida.data.common.core.utils.WxServiceProviderUtil; +import com.yida.data.common.service.CommonService; +import com.yida.data.system.service.EduQywxServiceProviderSchoolService; +import com.yida.data.system.service.EduQywxServiceProviderService; import com.yida.data.system.service.IDeptService; - +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.core.annotation.Order; @@ -12,10 +24,7 @@ import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; - -import cc.mrbird.febs.common.redis.service.RedisService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; +import java.util.Objects; @RequiredArgsConstructor @Component @@ -24,10 +33,14 @@ import lombok.extern.slf4j.Slf4j; public class InitializeRunner implements ApplicationRunner { private final RedisService redisService; + private final WxServiceProviderUtil wxServiceProviderUtil; + private final IDeptService deptService; + private final EduQywxServiceProviderService eduQywxServiceProviderService; + private final EduQywxServiceProviderSchoolService eduQywxServiceProviderSchoolService; @Override - public void run(ApplicationArguments args) throws Exception { + public void run(ApplicationArguments args) { log.info("初始化部门缓存"); List allDept = deptService.list(); Map items = new HashMap<>(); @@ -36,5 +49,54 @@ public class InitializeRunner implements ApplicationRunner { items.put(dept.getDeptId().toString(), dept); } redisService.hmset(CachePrefixConstant.SYS_DEPT_DATA, items); +// initProviderSchool(); } + + /** + * 初始化服务商对应学校加密corpId + * + * @author ZYJ + * @date 2022/11/10 9:13 + */ +// public void initProviderSchool() { +// // 查询所有服务商 +// List providerList = eduQywxServiceProviderService.list(); +// // 查询所有企业微信学校 +// List deptList = deptService.list(Wrappers.lambdaQuery(new Dept()).eq(Dept::getSchoolType, Dept.TYPE_QYWX)); +// // 加密key缓存map +// Map items = new HashMap<>(16); +// // 原始key缓存map +// Map originalItems = new HashMap<>(16); +// +// // 处理关联数据 +// for (EduQywxServiceProvider provider : providerList) { +// for (Dept dept : deptList) { +// // 查询是否有关联数据 +// EduQywxServiceProviderSchool providerSchool = eduQywxServiceProviderSchoolService +// .getOne(Wrappers.lambdaQuery(new EduQywxServiceProviderSchool()) +// .eq(EduQywxServiceProviderSchool::getProviderCorpId, provider.getCorpId()) +// .eq(EduQywxServiceProviderSchool::getDeptOriginalCorpId, dept.getCorpId())); +// if (Objects.isNull(providerSchool)) { +// continue; +// } +// if (StringUtils.isNotBlank(providerSchool.getDeptEncryptionCorpId())) { +// providerSchool = new EduQywxServiceProviderSchool(); +// providerSchool.setProviderCorpId(provider.getCorpId()); +// providerSchool.setDeptOriginalCorpId(dept.getCorpId()); +// // 转换corpId +// String providerToken = wxServiceProviderUtil +// .getProviderToken(provider.getCorpId(), provider.getServiceProviderSecret()); +// String convertCorpId = wxServiceProviderUtil.convertCorpId(providerToken, dept.getCorpId()); +// providerSchool.setDeptEncryptionCorpId(convertCorpId); +// eduQywxServiceProviderSchoolService.save(providerSchool); +// } +// items.put(provider.getCorpId() + "." + providerSchool.getDeptEncryptionCorpId(), providerSchool); +// originalItems.put(provider.getCorpId() + "." + providerSchool.getDeptOriginalCorpId(), providerSchool); +// } +// } +// if (CollUtil.isNotEmpty(items)) { +// redisService.hmset(QywxServiceProviderConstant.PROVIDER_SCHOOL_CORP_DATA, items); +// redisService.hmset(QywxServiceProviderConstant.PROVIDER_SCHOOL_CORP_ORIGINAL_DATA, originalItems); +// } +// } } diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/configure/QywxHandleRabbitReceiver.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/configure/QywxHandleRabbitReceiver.java new file mode 100644 index 0000000..dda57e9 --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/configure/QywxHandleRabbitReceiver.java @@ -0,0 +1,70 @@ +package com.yida.data.system.configure; + +import com.rabbitmq.client.Channel; +import com.yida.data.common.core.entity.WxPublicQr; +import com.yida.data.common.core.exception.FebsException; +import com.yida.data.rabbit.constant.RabbitConstant; +import com.yida.data.system.dto.QywxCallbackHandleDTO; +import com.yida.data.system.service.EduAgentWxPublicReceiverService; +import com.yida.data.system.service.QywxHandleService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.amqp.core.Message; +import org.springframework.amqp.rabbit.annotation.Exchange; +import org.springframework.amqp.rabbit.annotation.Queue; +import org.springframework.amqp.rabbit.annotation.QueueBinding; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.stereotype.Component; + +import java.io.IOException; + +/** + * 企业微信回调mq处理类 + * + * @author ZYJ + * @date 2023/10/26 + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class QywxHandleRabbitReceiver { + + private final QywxHandleService qywxHandleService; + + /** + * 企业微信处理接收者 + */ + @RabbitListener(bindings = @QueueBinding( + value = @Queue(RabbitConstant.QYWX_HANDLE_QUEUE), + exchange = @Exchange(RabbitConstant.QYWX_HANDLE_EXCHANGE) + )) + public void qywxHandleRabbitReceiver(QywxCallbackHandleDTO dto, Channel channel, Message message) throws IOException { + long deliveryTag = message.getMessageProperties().getDeliveryTag(); + try { + // 处理企业微信回调信息 + switch (dto.getQywxCallbackTypeEnum()) { + // 自开发回调 + case POST: + qywxHandleService.handlePostCallback(dto); + break; + // 代开发应用模板回调 + case POST_NORMAL: + qywxHandleService.handlePostNormalCallback(dto); + break; + // 处理企业微信代开发应用回调信息 + case POST_EVENT: + qywxHandleService.handlePostEventCallback(dto); + break; + default: + throw new FebsException("回调类型错误"); + } + } catch (Exception e) { + log.error("rabbitmq处理企业微信回调消息失败, msg: {}", dto, e); + // 重新回到队列 +// channel.basicNack(deliveryTag, false, true); + } finally { + // 确认收到消息,只确认当前消费者的一个消息收到 + channel.basicAck(deliveryTag, false); + } + } +} diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/configure/RabbitConfig.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/configure/RabbitConfig.java index c5f9815..336a219 100644 --- a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/configure/RabbitConfig.java +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/configure/RabbitConfig.java @@ -9,6 +9,9 @@ import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import java.util.HashMap; +import java.util.Map; + @Configuration public class RabbitConfig { @@ -37,7 +40,7 @@ public class RabbitConfig { */ @Bean public Binding agentReceiveMsgBinding(@Qualifier("agentReceiveMsgQueue") Queue queue, - @Qualifier("wxPublicQrExchange") DirectExchange exchange) { + @Qualifier("wxPublicQrExchange") DirectExchange exchange) { return BindingBuilder.bind(queue).to(exchange).with(RabbitConstant.AGENT_RECEIVE_MSG_KEY); } @@ -56,7 +59,26 @@ public class RabbitConfig { */ @Bean public Binding visitorInviteCodeBinding(@Qualifier("visitorInviteCodeQueue") Queue queue, - @Qualifier("wxPublicQrExchange") DirectExchange exchange) { + @Qualifier("wxPublicQrExchange") DirectExchange exchange) { return BindingBuilder.bind(queue).to(exchange).with(RabbitConstant.VISITOR_INVITE_CODE_KEY); } + + @Bean + public DirectExchange qywxHandleExchange() { + return new DirectExchange(RabbitConstant.QYWX_HANDLE_EXCHANGE); + } + + @Bean + public Queue qywxHandleQueue() { + Map args = new HashMap<>(); + // 设置同时只能一个消费者进行消费 + args.put("x-single-active-consumer", true); + return new Queue(RabbitConstant.QYWX_HANDLE_QUEUE, true, false, false, args); + } + + @Bean + public Binding qywxHandleBinding(@Qualifier("qywxHandleQueue") Queue queue, + @Qualifier("qywxHandleExchange") DirectExchange exchange) { + return BindingBuilder.bind(queue).to(exchange).with(RabbitConstant.QYWX_HANDLE_KEY); + } } diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/configure/SysRabbitReceiver.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/configure/SysRabbitReceiver.java index 8a835a9..dd1f867 100644 --- a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/configure/SysRabbitReceiver.java +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/configure/SysRabbitReceiver.java @@ -23,10 +23,6 @@ public class SysRabbitReceiver { /** * 区域后台消息接收者 - * - * @param wxPublicQr - * @param channel - * @param message */ @RabbitListener(bindings = @QueueBinding( value = @Queue(RabbitConstant.AGENT_RECEIVE_MSG_QUEUE), diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/CommonController.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/CommonController.java index 2d90953..5e3dac0 100644 --- a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/CommonController.java +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/CommonController.java @@ -6,15 +6,14 @@ import com.yida.data.common.core.common.ResultBean; import com.yida.data.common.core.entity.system.EduSysFile; import com.yida.data.common.core.exception.FebsException; import com.yida.data.log.annotation.OperationLog; +import com.yida.data.school.vo.smart.WxConfigVO; import com.yida.data.system.service.CommonService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import javax.annotation.Resource; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; + +import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @Api(tags = "通用接口") @@ -43,4 +42,20 @@ public class CommonController { } return ResultBean.buildSuccess(stringBuilder.toString()); } + + @GetMapping("/getWxJsConfig") + @ApiOperation("获取企业微信JS-SDK配置") + ResultBean getWxJsConfig( + @RequestParam @ApiParam(value = "部门id", required = true) Long deptId, + @RequestParam @ApiParam(value = "当前网页的URL,不包含#及其后面部分", required = true) String url) { + return ResultBean.buildSuccess(commonService.getWxJsConfig(deptId, url)); + } + + @GetMapping("/getWxPublicJsConfig") + @ApiOperation("获取微信JS-SDK配置") + ResultBean getWxPublicJsConfig( + @RequestParam @ApiParam(value = "部门id", required = true) Long deptId, + @RequestParam @ApiParam(value = "当前网页的URL,不包含#及其后面部分", required = true) String url) { + return ResultBean.buildSuccess(commonService.getWxPublicJsConfig(deptId, url)); + } } diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/DeptController.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/DeptController.java index 41fc665..45b0606 100644 --- a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/DeptController.java +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/DeptController.java @@ -57,52 +57,45 @@ public class DeptController { */ @ApiOperation("查询父级部门") @GetMapping("/getParent") - @OperationLog(module = ModuleName.SYSTEM, methods = "查询父级部门") public ResultBean getParent(@ApiParam("部门id") Long deptId) { return ResultBean.buildSuccess(deptService.getById(deptService.getById(deptId).getParentId())); } @ApiOperation("向上查询父级部门") @GetMapping("/findParentUp") - @OperationLog(module = ModuleName.SYSTEM, methods = "向上查询父级部门") public ResultBean findParentUp(@ApiParam("部门id") Long deptId, - @ApiParam("最上级部门类型,0表示学校,1表示班级,2表示年级,3表示学段,4表示校区,5公司,6" + - "学校部门") Integer type) { + @ApiParam("最上级部门类型,0表示学校,1表示班级,2表示年级,3表示学段,4表示校区,5公司,6" + + "学校部门") Integer type) { return ResultBean.buildSuccess(deptService.findParentUp(deptId, type)); } @GetMapping("/findListByParent") @ApiOperation("查询所有子节点") - @OperationLog(module = ModuleName.SYSTEM, methods = "查询所有子节点") public ResultBean> findListByParent(Long deptId) { return ResultBean.buildSuccess(deptService.findListByParent(Arrays.asList(deptId), 0)); } @ApiOperation("查询直接子节点") @GetMapping("/findChildByParent") - @OperationLog(module = ModuleName.SYSTEM, methods = "查询子节点") public ResultBean findChildByParent(@ApiParam("父节点id,不能为空") @RequestParam Long deptId, - @ApiParam("子节点类型,0表示学校,5公司,6部门,7教育局,默认所有直接子节点") Integer type) { + @ApiParam("子节点类型,0表示学校,5公司,6部门,7教育局,默认所有直接子节点") Integer type) { return ResultBean.buildSuccess(deptService.findChildByParent(deptId, type)); } @ApiOperation("向下查询到要查询的部门类别的子部门(可查询非直接子部门)") @GetMapping("/findChildByParentAndType") - @OperationLog(module = ModuleName.SYSTEM, methods = "向下查询到要查询的部门类别的子部门") public ResultBean> findChildByParentAndType(@ApiParam("父节点id,不能为空") Long parentId, - @ApiParam("子节点类型,0表示学校,5公司,6部门,7教育局,默认所有直接子节点") Integer type) { + @ApiParam("子节点类型,0表示学校,5公司,6部门,7教育局,默认所有直接子节点") Integer type) { return ResultBean.buildSuccess(deptService.findChildByParentAndType(Arrays.asList(parentId), type)); } @ApiOperation("根据部门id查询所属学校") @GetMapping("findSchoolByDept") - @OperationLog(module = ModuleName.SYSTEM, methods = "根据部门id查询所属学校") public ResultBean findSchoolByDept(Long deptId) { return ResultBean.buildSuccess(deptService.findSchooleByDept(deptId)); } @GetMapping - @OperationLog(module = ModuleName.SYSTEM, methods = "查询部门") public FebsResponse deptList(QueryRequest request, Dept dept) { Map depts = this.deptService.findDepts(request, dept); return new FebsResponse().data(depts); @@ -110,14 +103,14 @@ public class DeptController { @PostMapping @PreAuthorize("hasAuthority('dept:add')") - @OperationLog(module = ModuleName.SYSTEM, methods = "新增部门", type = OperationLogTypeEnum.INSERT) + @OperationLog(module = ModuleName.DEPT, methods = "新增部门", type = OperationLogTypeEnum.INSERT) public void addDept(@Valid Dept dept) { this.deptService.createDept(dept); } @DeleteMapping("/{deptIds}") @PreAuthorize("hasAuthority('dept:delete')") - @OperationLog(module = ModuleName.SYSTEM, methods = "删除部门", type = OperationLogTypeEnum.DELETE) + @OperationLog(module = ModuleName.DEPT, methods = "删除部门", type = OperationLogTypeEnum.DELETE) public void deleteDepts(@NotBlank(message = "{required}") @PathVariable String deptIds) { String[] ids = deptIds.split(StringConstant.COMMA); this.deptService.deleteDepts(ids); @@ -125,14 +118,13 @@ public class DeptController { @PutMapping @PreAuthorize("hasAuthority('dept:update')") - @OperationLog(module = ModuleName.SYSTEM, methods = "修改部门", type = OperationLogTypeEnum.UPDATE) + @OperationLog(module = ModuleName.DEPT, methods = "修改部门", type = OperationLogTypeEnum.UPDATE) public void updateDept(@Valid Dept dept) { this.deptService.updateDept(dept); } @PostMapping("excel") @PreAuthorize("hasAuthority('dept:export')") - @ControllerLog(operation = "导出部门数据", exceptionMessage = "导出Excel失败") public void export(Dept dept, QueryRequest request, HttpServletResponse response) { List depts = this.deptService.findDepts(dept, request); //ExcelKit.$Export(Dept.class, response).downXlsx(depts, false); @@ -146,19 +138,17 @@ public class DeptController { @ApiOperation("根据区域查询学校列表") @GetMapping("/getSchoolByArea") - @OperationLog(module = ModuleName.SYSTEM, methods = "根据区域查询学校列表") public ResultBean> getSchoolByArea(@ApiParam("区域id") @RequestParam(required = false) Long areaId, - @ApiParam("搜索关键词 学校名") @RequestParam(required = false) String schoolName) throws NoSuchMethodException { + @ApiParam("搜索关键词 学校名") @RequestParam(required = false) String schoolName) throws NoSuchMethodException { return ResultBean.buildSuccess(deptService.getSchoolByArea(areaId, schoolName)); } @ApiOperation("分页查询学校列表") @GetMapping("/getPageSchoolByArea") - @OperationLog(module = ModuleName.SYSTEM, methods = "分页查询学校列表") public ResultBean> getPageSchoolByArea(@ApiParam("类型") @RequestParam(required = false) Long areaId, - @ApiParam("搜索关键词 学校名") @RequestParam(required = false) String schoolName, - @ApiParam("当前页码") @RequestParam(defaultValue = "1") Integer pageNum, - @ApiParam("页面大小") @RequestParam(defaultValue = "10") Integer pageSize) { + @ApiParam("搜索关键词 学校名") @RequestParam(required = false) String schoolName, + @ApiParam("当前页码") @RequestParam(defaultValue = "1") Integer pageNum, + @ApiParam("页面大小") @RequestParam(defaultValue = "10") Integer pageSize) { Page page = new Page<>(); page.setSize(pageSize); page.setCurrent(pageNum); @@ -167,10 +157,9 @@ public class DeptController { @ApiOperation("部门树") @GetMapping("/getDeptTree") - @OperationLog(module = ModuleName.SYSTEM, methods = "部门树") public ResultBean getDeptTree(@ApiParam("根节点Id") Long deptId, - @ApiParam("0-包含学校的企业部门(后勤部等)与学校部门(校区学段等),1-仅学校部门,2-仅企业部门,默认0") @RequestParam(defaultValue = - "0") Integer type) { + @ApiParam("0-包含学校的企业部门(后勤部等)与学校部门(校区学段等),1-仅学校部门,2-仅企业部门,默认0") @RequestParam(defaultValue = + "0") Integer type) { if (deptId == null) { deptId = FebsUtil.getCurrentUser().getDeptId(); } @@ -185,7 +174,6 @@ public class DeptController { @ApiOperation("查询部门区域") @GetMapping("/findAreaById") - @OperationLog(module = ModuleName.SYSTEM, methods = "查询部门区域") public ResultBean findAreaById(@RequestParam Long id) { Long byId = deptService.getById(id).getAreaId(); return ResultBean.buildSuccess(eduAreaMapper.findAreaById(byId)); @@ -195,14 +183,15 @@ public class DeptController { * 查询代理商管理的学校列表数据 * * @param agentSchoolSelectPageDTO 查询代理商管理的学校列表数据请求类 - * @return com.yida.data.common.core.common.ResultBean> + * @return com.yida.data.common.core.common.ResultBean> * @author ZYJ * @date 2021/9/27 17:03 */ @GetMapping(value = "/listAgentSchoolPage") @ApiOperation(value = "查询代理商管理的学校列表数据", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE) public ResultBean> listAgentSchoolPage( - @Valid AgentSchoolSelectPageDTO agentSchoolSelectPageDTO) { + @Valid AgentSchoolSelectPageDTO agentSchoolSelectPageDTO) { return this.deptService.listAgentSchoolPage(agentSchoolSelectPageDTO); } @@ -218,7 +207,7 @@ public class DeptController { @PostMapping(value = "/saveAgentSchool", consumes = MediaType.APPLICATION_JSON_VALUE) @ApiOperation(value = "代理商保存学校数据", consumes = MediaType.APPLICATION_JSON_VALUE) public ResultBean saveAgentSchool( - @Valid @RequestBody AgentSchoolSaveDTO agentSchoolSaveDTO) { + @Valid @RequestBody AgentSchoolSaveDTO agentSchoolSaveDTO) { return this.deptService.saveAgentSchool(agentSchoolSaveDTO); } @@ -234,7 +223,7 @@ public class DeptController { @PostMapping(value = "/getAgentSchoolInfo") @ApiOperation(value = "查询学校信息", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE) public ResultBean getAgentSchoolInfo( - @ApiParam(value = "学校id", required = true) @RequestParam Long schoolId) { + @ApiParam(value = "学校id", required = true) @RequestParam Long schoolId) { return this.deptService.getAgentSchoolInfo(schoolId); } @@ -250,9 +239,10 @@ public class DeptController { // @PreAuthorize("hasRole('role:agent:admin')") @PostMapping(value = "/updateEnableStatus") @ApiOperation(value = "启用或停用学校", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE) + @OperationLog(module = ModuleName.DEPT, methods = "启用或停用学校", type = OperationLogTypeEnum.UPDATE) public ResultBean updateEnableStatus( - @ApiParam(value = "学校id", required = true) @RequestParam Long schoolId, - @ApiParam(value = "需要设置的启用或停用状态. 启用: 1, 停用: 0", required = true) @RequestParam Integer enableStatus) { + @ApiParam(value = "学校id", required = true) @RequestParam Long schoolId, + @ApiParam(value = "需要设置的启用或停用状态. 启用: 1, 停用: 0", required = true) @RequestParam Integer enableStatus) { return this.deptService.updateEnableStatus(schoolId, enableStatus); } @@ -262,14 +252,15 @@ public class DeptController { * 代理商查询学校管理员账号列表数据 * * @param schoolAdminAccountSelectPageDTO 代理商查询学校管理员账号列表数据请求类 - * @return com.yida.data.common.core.common.ResultBean> + * @return com.yida.data.common.core.common.ResultBean> * @author ZYJ * @date 2021/9/29 17:34 */ @PostMapping(value = "/listSchoolAdminAccountPage") @ApiOperation(value = "查询学校管理员账号列表数据", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE) public ResultBean> listSchoolAdminAccountPage( - @Valid SchoolAdminAccountSelectPageDTO schoolAdminAccountSelectPageDTO) { + @Valid SchoolAdminAccountSelectPageDTO schoolAdminAccountSelectPageDTO) { return ResultBean.buildSuccess(this.userService.listSchoolAdminAccountPage(schoolAdminAccountSelectPageDTO)); } @@ -284,8 +275,9 @@ public class DeptController { // @PreAuthorize("hasRole('role:agent:admin')") @PostMapping(value = "/saveSchoolAdminAccount", consumes = MediaType.APPLICATION_JSON_VALUE) @ApiOperation(value = "保存学校负责人账号", consumes = MediaType.APPLICATION_JSON_VALUE) + @OperationLog(module = ModuleName.DEPT, methods = "保存学校负责人账号", type = OperationLogTypeEnum.UPDATE) public ResultBean saveSchoolAdminAccount( - @Valid @RequestBody SchoolAdminAccountSaveDTO schoolAdminAccountSaveDTO) { + @Valid @RequestBody SchoolAdminAccountSaveDTO schoolAdminAccountSaveDTO) { return this.userService.saveSchoolAdminAccount(schoolAdminAccountSaveDTO); } } diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/DictController.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/DictController.java index 2bf929d..08da446 100644 --- a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/DictController.java +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/DictController.java @@ -1,5 +1,6 @@ package com.yida.data.system.controller; +import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.yida.data.common.core.common.ModuleName; @@ -45,8 +46,8 @@ public class DictController { @ApiOperation("分页查询字典类型") @GetMapping("/listDictTypePage") public ResultBean> listDictGroup(@RequestParam(required = false) String typeName, - @RequestParam(defaultValue = "1") Integer pageNum, - @RequestParam(defaultValue = "10") Integer pageSize) { + @RequestParam(defaultValue = "1") Integer pageNum, + @RequestParam(defaultValue = "10") Integer pageSize) { return ResultBean.buildSuccess(dictService.listDictTypePage(typeName, pageNum, pageSize)); } @@ -55,7 +56,7 @@ public class DictController { @OperationLog(module = ModuleName.SYSTEM, methods = "查询字典") public ResultBean> selectDict(@ApiParam("类型") @RequestParam String type) { return ResultBean.buildSuccess(dictService.list(Wrappers.lambdaQuery(new Dict()) - .eq(Dict::getType, type).orderByAsc(Dict::getSort))); + .eq(Dict::getType, type).orderByAsc(Dict::getSort))); } @PostMapping("/insertDict") @@ -76,7 +77,22 @@ public class DictController { @GetMapping("/delDictByType") public ResultBean delDictByType(String type) { dictService.remove(Wrappers.lambdaQuery() - .eq(Dict::getType, type)); + .eq(Dict::getType, type)); + return ResultBean.buildSuccess(); + } + + @GetMapping("/getDictByTypeAndValueOrLabel") + public ResultBean getDictCode(String type, String value, String Label) { + if (ObjectUtil.isNotNull(value)) { + return ResultBean + .buildSuccess( + dictService.getOne(Wrappers.lambdaQuery(new Dict()).eq(Dict::getType, type).eq(Dict::getValue, value))); + } + if (ObjectUtil.isNotNull(Label)) { + return ResultBean + .buildSuccess( + dictService.getOne(Wrappers.lambdaQuery(new Dict()).eq(Dict::getType, type).eq(Dict::getLabel, Label))); + } return ResultBean.buildSuccess(); } diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/EduBaseAppController.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/EduBaseAppController.java new file mode 100644 index 0000000..0aff0d5 --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/EduBaseAppController.java @@ -0,0 +1,34 @@ +package com.yida.data.system.controller; + +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.system.EduBaseApp; +import com.yida.data.system.service.EduBaseAppService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * 基础应用信息(本地配置) Controller + * + * @author ZYJ + * @date 2023-06-28 14:57:58 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("eduBaseApp") +@Api(tags = "基础应用信息配置信息") +public class EduBaseAppController { + + private final EduBaseAppService eduBaseAppService; + + @PostMapping(value = "listBaseApp") + @ApiOperation(value = "查询基础应用列表数据") + public ResultBean> listBaseApp() { + return ResultBean.buildSuccess(eduBaseAppService.list()); + } +} diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/EduInstructionsContentController.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/EduInstructionsContentController.java index 9da3b4a..5d7574a 100644 --- a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/EduInstructionsContentController.java +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/EduInstructionsContentController.java @@ -3,10 +3,13 @@ package com.yida.data.system.controller; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.yida.data.common.core.annotation.ControllerLog; +import com.yida.data.common.core.common.ModuleName; import com.yida.data.common.core.common.ResultBean; import com.yida.data.common.core.common.ResultMsgType; import com.yida.data.common.core.entity.instructions.EduInstructionsContent; +import com.yida.data.common.core.entity.system.enums.OperationLogTypeEnum; import com.yida.data.common.core.utils.FebsUtil; +import com.yida.data.log.annotation.OperationLog; import com.yida.data.system.service.EduInstructionsContentService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -37,15 +40,15 @@ public class EduInstructionsContentController { @ApiOperation("分页获取系统指南内容LIST") @GetMapping("/findPageList") - @ControllerLog(operation = "分页获取系统指南内容LIST") public ResultBean> findPageList( - @ApiParam("指南类型") @RequestParam(required = false) String typeCode, - @ApiParam("指南标题") @RequestParam(required = false) String title, - @ApiParam("当前页码,默认1") @RequestParam(defaultValue = "1") Integer pageNum, - @ApiParam("分页大小,默认10") @RequestParam(defaultValue = "10") Integer pageSize + @ApiParam("指南类型") @RequestParam(required = false) String typeCode, + @ApiParam("指南标题") @RequestParam(required = false) String title, + @ApiParam("当前页码,默认1") @RequestParam(defaultValue = "1") Integer pageNum, + @ApiParam("分页大小,默认10") @RequestParam(defaultValue = "10") Integer pageSize ) { try { - return ResultBean.buildSuccess(eduInstructionsContentService.listPageEduInstructionsContent(new Page(pageNum, pageSize), typeCode, title)); + return ResultBean.buildSuccess( + eduInstructionsContentService.listPageEduInstructionsContent(new Page(pageNum, pageSize), typeCode, title)); } catch (Exception e) { log.error("分页获取系统指南内容LIST失败: {}", e.getMessage(), e); return ResultBean.buildError(ResultMsgType.QUERY_FAIL.getValue()); @@ -54,9 +57,8 @@ public class EduInstructionsContentController { @ApiOperation("根据typeCode或者Id获取单条指南内容") @PostMapping("/getOneEduInstructionsContent") - @ControllerLog(operation = "根据typeCode或者Id获取单条指南内容") public ResultBean getOneEduInstructionsContent(@RequestParam(required = false) String typeCode, - @RequestParam(required = false) Integer id + @RequestParam(required = false) Integer id ) { try { return ResultBean.buildSuccess(eduInstructionsContentService.getOneEduInstructionsContent(typeCode, id)); @@ -69,7 +71,7 @@ public class EduInstructionsContentController { @ApiOperation("新增或修改系统指南内容") @PostMapping("/saveOrUpdateInstructions") - @ControllerLog(operation = "新增或修改系统指南内容") + @OperationLog(module = ModuleName.INSTRUCTION, methods = "新增或修改系统指南内容", type = OperationLogTypeEnum.SAVE) public ResultBean saveOrUpdateInstructions(@RequestBody EduInstructionsContent eduInstructionsContent) { try { boolean b = eduInstructionsContentService.saveInstructionsContent(eduInstructionsContent, FebsUtil.getCurrentUser()); @@ -87,7 +89,7 @@ public class EduInstructionsContentController { @ApiOperation("删除系统指南内容") @PostMapping("/removeBatch") - @ControllerLog(operation = "删除系统指南内容") + @OperationLog(module = ModuleName.INSTRUCTION, methods = "删除系统指南内容", type = OperationLogTypeEnum.DELETE) public ResultBean selectProduct(@ApiParam("系统指南内容id") @RequestBody List ids) { try { eduInstructionsContentService.deleteByIds(ids); diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/EduInstructionsTypeController.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/EduInstructionsTypeController.java index 5c891c8..07c37bb 100644 --- a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/EduInstructionsTypeController.java +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/EduInstructionsTypeController.java @@ -1,10 +1,13 @@ package com.yida.data.system.controller; import com.yida.data.common.core.annotation.ControllerLog; +import com.yida.data.common.core.common.ModuleName; import com.yida.data.common.core.common.ResultBean; import com.yida.data.common.core.common.ResultMsgType; import com.yida.data.common.core.entity.instructions.EduInstructionsType; +import com.yida.data.common.core.entity.system.enums.OperationLogTypeEnum; import com.yida.data.common.core.utils.FebsUtil; +import com.yida.data.log.annotation.OperationLog; import com.yida.data.system.service.EduInstructionsTypeService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -35,7 +38,6 @@ public class EduInstructionsTypeController { @ApiOperation("系统指南类型列表") @GetMapping("/findList") - @ControllerLog(operation = "系统指南类型列表") public ResultBean> selectInstructionsList() { try { return ResultBean.buildSuccess(eduInstructionsTypeService.selectInstructionsTypeList()); @@ -48,7 +50,7 @@ public class EduInstructionsTypeController { @ApiOperation("新增或修改系统指南类型") @PostMapping("/save") - @ControllerLog(operation = "新增或修改系统指南类型") + @OperationLog(module = ModuleName.INSTRUCTION, methods = "新增或修改系统指南类型", type = OperationLogTypeEnum.SAVE) public ResultBean insertInstructionsList(@RequestBody EduInstructionsType eduInstructionsType) { try { eduInstructionsTypeService.saveData(eduInstructionsType, FebsUtil.getCurrentUser()); @@ -62,7 +64,7 @@ public class EduInstructionsTypeController { @ApiOperation("删除系统指南类型") @PostMapping("/removeBatch") - @ControllerLog(operation = "删除系统指南类型") + @OperationLog(module = ModuleName.INSTRUCTION, methods = "删除系统指南类型", type = OperationLogTypeEnum.DELETE) public ResultBean removeBatch(@ApiParam("系统指南类型id") @RequestBody List ids) { try { eduInstructionsTypeService.removeByIds(ids); diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/InBaiDuApiConfigController.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/InBaiDuApiConfigController.java new file mode 100644 index 0000000..2196c75 --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/InBaiDuApiConfigController.java @@ -0,0 +1,42 @@ +package com.yida.data.system.controller; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.system.BaiduApiConfig; +import com.yida.data.common.core.entity.system.UnionPayConfig; +import com.yida.data.common.core.utils.Asserts; +import com.yida.data.system.service.BaiduApiConfigService; +import com.yida.data.system.service.UnionPayConfigService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +/** + * 百度api配置信息 Controller + * + * @author ZYJ + * @date 2023/6/20 + */ +@RestController +@RequiredArgsConstructor +@Api(tags = "百度api配置信息(无鉴权)") +@RequestMapping("/in/baiDuApiConfig") +public class InBaiDuApiConfigController { + + private final BaiduApiConfigService baiduApiConfigService; + + @ApiOperation("根据学校id查询百度api配置") + @GetMapping("/getBaiDuApiConfigByDept") + public ResultBean getBaiDuApiConfigByDept(@RequestParam Long deptId, @RequestParam String moduleName) { + Asserts.isNotNull(deptId, "部门不能为空"); + return ResultBean.buildSuccess(baiduApiConfigService.getOne(Wrappers.lambdaQuery(new BaiduApiConfig()) + .eq(BaiduApiConfig::getSchoolId, deptId) + .eq(BaiduApiConfig::getModuleName, moduleName) + )); + } + +} diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/InBaseDeptHomeAppController.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/InBaseDeptHomeAppController.java new file mode 100644 index 0000000..5508871 --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/InBaseDeptHomeAppController.java @@ -0,0 +1,37 @@ +package com.yida.data.system.controller; + +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.system.EduBaseApp; +import com.yida.data.system.service.EduBaseAppService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +/** + * 基础app管理(无鉴权) + * + * @author ZYJ + * @date 2023-06-28 15:24:25 + */ +@Slf4j +@Api(tags = "基础app管理(无鉴权)") +@RestController +@RequestMapping("/in/deptHomeApp") +@RequiredArgsConstructor +public class InBaseDeptHomeAppController { + + private final EduBaseAppService eduBaseAppService; + + @ApiOperation("根据id查询基础应用") + @GetMapping("/getById") + public ResultBean getById(@RequestParam Long id) { + return ResultBean.buildSuccess(eduBaseAppService.getById(id)); + } + +} diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/InConstructionPayConfigController.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/InConstructionPayConfigController.java new file mode 100644 index 0000000..826a478 --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/InConstructionPayConfigController.java @@ -0,0 +1,39 @@ +package com.yida.data.system.controller; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.system.ConstructionPayConfig; +import com.yida.data.common.core.entity.system.UnionPayConfig; +import com.yida.data.common.core.utils.Asserts; +import com.yida.data.system.service.ConstructionPayConfigService; +import com.yida.data.system.service.UnionPayConfigService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 建行学习支付配置信息 Controller + * + * @author ZYJ + * @date 2023/6/19 + */ +@RestController +@RequiredArgsConstructor +@Api(tags = "建行学习支付配置信息(无鉴权)") +@RequestMapping("/in/constructionPayConfig") +public class InConstructionPayConfigController { + + private final ConstructionPayConfigService constructionPayConfigService; + + @ApiOperation("根据部门查询建行支付配置") + @GetMapping("/getConstructionPayConfigByDept") + public ResultBean getConstructionPayConfigByDept(Long deptId) { + Asserts.isNotNull(deptId, "部门不能为空"); + return ResultBean.buildSuccess(constructionPayConfigService.getOne(Wrappers.lambdaQuery(new ConstructionPayConfig()) + .eq(ConstructionPayConfig::getDeptId, deptId))); + } + +} diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/InConsumeConfigController.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/InConsumeConfigController.java new file mode 100644 index 0000000..c4ce20b --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/InConsumeConfigController.java @@ -0,0 +1,38 @@ +package com.yida.data.system.controller; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.consume.EduConsumeConfig; +import com.yida.data.common.core.utils.Asserts; +import com.yida.data.system.service.EduConsumeConfigService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 学校消费机服务器信息 Controller + * + * @author ZYJ + * @date 2023/4/6 + */ +@RestController +@RequiredArgsConstructor +@Api(tags = "学校消费机服务器信息(无鉴权)") +@RequestMapping("/in/consumeConfig") +public class InConsumeConfigController { + + private final EduConsumeConfigService eduConsumeConfigService; + + @ApiOperation("根据部门查询收钱吧支付配置信息") + @GetMapping("/getConsumeConfigByDept") + public ResultBean getConsumeConfigByDept(Long deptId) { + Asserts.isNotNull(deptId, "部门不能为空"); + return ResultBean.buildSuccess(eduConsumeConfigService.getOne(Wrappers.lambdaQuery(new EduConsumeConfig()) + .eq(EduConsumeConfig::getDeptId, deptId)) + ); + } + +} diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/InDeptController.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/InDeptController.java index 06edd06..e5652f5 100644 --- a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/InDeptController.java +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/InDeptController.java @@ -5,7 +5,6 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.yida.data.common.core.common.ResultBean; -import com.yida.data.common.core.entity.constant.CachePrefixConstant; import com.yida.data.common.core.entity.system.Dept; import com.yida.data.common.core.entity.system.EduDeptWxPublic; import com.yida.data.common.core.entity.system.EduHotWord; @@ -21,7 +20,6 @@ import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.cache.annotation.Cacheable; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -69,7 +67,7 @@ public class InDeptController { @GetMapping("/getSchoolByName") public ResultBean getSchoolByName(String schoolName) { return ResultBean.buildSuccess(deptService - .getOne(Wrappers.lambdaQuery(new Dept()).eq(Dept::getDeptName, schoolName).eq(Dept::getDeptType, 0))); + .getOne(Wrappers.lambdaQuery(new Dept()).eq(Dept::getDeptName, schoolName))); } /** @@ -99,7 +97,15 @@ public class InDeptController { @GetMapping("/syncQywxDept") public ResultBean syncQywxDept() { log.info("进入同步企业微信"); - deptService.syncQywxDept(); + deptService.syncQywxDept(null); + return ResultBean.buildSuccess(); + } + + @ApiOperation("同步指定学校企业微信部门") + @GetMapping("/syncSchoolDept") + public ResultBean syncSchoolDept(@RequestParam Long schoolId) { + log.info("同步企业微信部门数据: schoolId: [{}]", schoolId); + deptService.syncQywxDept(schoolId); return ResultBean.buildSuccess(); } @@ -177,29 +183,12 @@ public class InDeptController { @ApiOperation("根据名称和类型查询教育局学校列表") @PostMapping("/listSchoolPage") +// @Cacheable(value = CachePrefixConstant.SCHOOL_LIST_SEARCH, key = "#dto.deptId + '-' + #dto.schoolName") public ResultBean> listSchoolPage(@RequestBody SchoolPageDTO dto) { IPage page = deptService.listSchoolPage(dto); return ResultBean.buildSuccess(page); } - @ApiOperation("根据名称查询教育局缴费学校列表") - @GetMapping("/listPaySchool") - public ResultBean> listPaySchool( - @ApiParam(value = "教育局或代理商id", required = true) @RequestParam Long deptId, - @ApiParam(value = "学校名称") String schoolName) { - List list = deptService.listPaySchool(deptId, schoolName); - return ResultBean.buildSuccess(list); - } - - @ApiOperation("查询:1幼儿园,2小学,3初中,4高中,5大学") - @PostMapping("/listSchoolPageByNature") - @Cacheable(value = CachePrefixConstant.SCHOOL_LIST_SEARCH, key = "#dto.deptId + '-' + #dto.natureType + '-' + #dto.schoolName") - public ResultBean> listSchoolPageByNature(@RequestBody SchoolPageDTO dto) { - IPage page = deptService.listSchoolPage(dto); - return ResultBean.buildSuccess(page); - } - - @ApiOperation("根据住所查询对应可读学校") @GetMapping("/findSchoolByAddress") public ResultBean> findSchoolByAddress( @@ -257,4 +246,20 @@ public class InDeptController { return ResultBean.buildSuccess(deptService.findHotWord(num, type, deptId)); } + + + @ApiOperation("查询父级部门集合") + @PostMapping("/findParentDeptByChilds") + public ResultBean> findParentDeptByChilds(@RequestBody List deptIds) { + return ResultBean.buildSuccess(deptService.findParentDeptByChild(deptIds)); + } + + + @ApiOperation("获取部门树") + @PostMapping("/getDeptTree") + public ResultBean getDeptTree(@RequestBody List deptIds) { + return ResultBean.buildSuccess(deptService.getDeptTree(deptIds)); + } + + } diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/InDeptFunctionController.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/InDeptFunctionController.java new file mode 100644 index 0000000..a0c5eb2 --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/InDeptFunctionController.java @@ -0,0 +1,37 @@ +package com.yida.data.system.controller; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.system.EduDeptFunction; +import com.yida.data.system.service.EduDeptFunctionService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 系统功能 Controller + * + * @author ZYJ + * @date 2023/2/21 + */ +@RestController +@RequiredArgsConstructor +@Api(tags = "系统功能(无鉴权)") +@RequestMapping("/in/function") +public class InDeptFunctionController { + + private final EduDeptFunctionService eduDeptFunctionService; + + @ApiOperation("获取部门是否开通当前功能") + @GetMapping("/getDeptFunction") + public ResultBean getDeptFunction(String functionName, Long deptId) { + return ResultBean.buildSuccess(eduDeptFunctionService.getOne(Wrappers.lambdaQuery(new EduDeptFunction()) + .eq(EduDeptFunction::getFunctionName, functionName) + .eq(EduDeptFunction::getDeptId, deptId) + )); + } + +} diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/InDictController.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/InDictController.java new file mode 100644 index 0000000..0994e8d --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/InDictController.java @@ -0,0 +1,65 @@ +package com.yida.data.system.controller; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.yida.data.common.core.common.ModuleName; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.Dict; +import com.yida.data.common.core.entity.system.enums.OperationLogTypeEnum; +import com.yida.data.log.annotation.OperationLog; +import com.yida.data.system.service.DictService; +import com.yida.data.system.vo.DictTypePageVO; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import java.util.List; +import javax.annotation.Resource; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +/** + * 字典crud + * + * @return + */ +@Slf4j +@Validated +@RestController +@RequiredArgsConstructor +@RequestMapping("/in/dict") +public class InDictController { + + @Resource + private DictService dictService; + + @GetMapping("/selectDict") + @OperationLog(module = ModuleName.SYSTEM, methods = "查询字典") + public ResultBean> selectDict(@ApiParam("类型") @RequestParam String type) { + return ResultBean.buildSuccess(dictService.list(Wrappers.lambdaQuery(new Dict()) + .eq(Dict::getType, type).orderByAsc(Dict::getSort))); + } + + @GetMapping("/getDictByTypeAndValueOrLabel") + public ResultBean getDictCode(String type, String value, String label) { + log.info("参数信息: {},{},{}", type, value, label); + if (ObjectUtil.isNotNull(value)) { + return ResultBean + .buildSuccess( + dictService.getOne(Wrappers.lambdaQuery(new Dict()).eq(Dict::getType, type).eq(Dict::getValue, value))); + } + if (ObjectUtil.isNotNull(label)) { + return ResultBean + .buildSuccess( + dictService.getOne(Wrappers.lambdaQuery(new Dict()).eq(Dict::getType, type).eq(Dict::getLabel, label))); + } + return ResultBean.buildSuccess(); + } + +} diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/InEduAppController.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/InEduAppController.java index 5ef69b6..97e5811 100644 --- a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/InEduAppController.java +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/InEduAppController.java @@ -1,9 +1,14 @@ package com.yida.data.system.controller; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.yida.data.common.core.common.ResultBean; import com.yida.data.common.core.entity.system.EduApp; +import com.yida.data.common.core.entity.system.EduAppTemplate; +import com.yida.data.common.core.entity.system.EduQywxServiceProvider; import com.yida.data.system.service.EduAppService; +import com.yida.data.system.service.EduAppTemplateService; +import com.yida.data.system.service.EduQywxServiceProviderService; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -17,9 +22,26 @@ import lombok.RequiredArgsConstructor; @RequiredArgsConstructor public class InEduAppController { private final EduAppService eduAppService; + private final EduAppTemplateService eduAppTemplateService; + private final EduQywxServiceProviderService eduQywxServiceProviderService; @GetMapping("/getAppBySchoolOrCorpIdAndCode") public ResultBean getAppBySchoolOrCorpIdAndCode(Long schoolId, String corpId, String code) { return ResultBean.buildSuccess(eduAppService.getAppBySchoolOrCorpIdAndCode(schoolId, corpId, code)); } + + @GetMapping("/getAppTemplateByTemplateId") + public ResultBean getAppTemplateByTemplateId(String templateId, String serviceCorpId) { + return ResultBean.buildSuccess(eduAppTemplateService.getOne(Wrappers.lambdaQuery(new EduAppTemplate()) + .eq(EduAppTemplate::getTemplateId, templateId) + .eq(EduAppTemplate::getServiceCorpId, serviceCorpId) + )); + } + + @GetMapping("/getServiceProviderByServiceCorpId") + public ResultBean getServiceProviderByServiceCorpId(String serviceCorpId) { + return ResultBean.buildSuccess(eduQywxServiceProviderService.getOne(Wrappers.lambdaQuery(new EduQywxServiceProvider()) + .eq(EduQywxServiceProvider::getCorpId, serviceCorpId) + )); + } } diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/InQywxController.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/InQywxController.java index c962dd8..066b19c 100644 --- a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/InQywxController.java +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/InQywxController.java @@ -1,19 +1,17 @@ package com.yida.data.system.controller; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.system.EduQywxServiceProviderSchool; +import com.yida.data.system.service.EduQywxServiceProviderSchoolService; import com.yida.data.system.service.QywxCallbackService; - -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - +import com.yida.data.system.service.QywxServiceProviderService; import io.swagger.annotations.Api; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; +@Slf4j @Api(tags = "企业微信同步") @RestController @RequiredArgsConstructor @@ -21,6 +19,8 @@ import lombok.RequiredArgsConstructor; public class InQywxController { private final QywxCallbackService qywxCallbackService; + private final QywxServiceProviderService qywxServiceProviderService; + private final EduQywxServiceProviderSchoolService eduQywxServiceProviderSchoolService; @GetMapping("/callback/{corpId}") public String get(@PathVariable String corpId, @@ -33,13 +33,124 @@ public class InQywxController { } @PostMapping("/callback/{corpId}") - public Object post(@PathVariable String corpId, + public String post(@PathVariable String corpId, @RequestParam("msg_signature") String msgSignature, @RequestParam("timestamp") String timestamp, @RequestParam("nonce") String nonce, @RequestBody String body) { - qywxCallbackService.post(corpId, msgSignature, timestamp, nonce, body); + return qywxCallbackService.post(corpId, msgSignature, timestamp, nonce, body); + } + + /** + * 服务商代开发应用模板验证URL回调 + */ + @GetMapping("/normal/callback/{corpId}") + public String getNormal(@PathVariable String corpId, + @RequestParam("msg_signature") String msgSignature, + @RequestParam("timestamp") String timestamp, + @RequestParam("nonce") String nonce, + @RequestParam("echostr") String echostr) { + return qywxCallbackService.getNormal(corpId, msgSignature, timestamp, nonce, echostr); + } + + /** + * 服务商代开发应用模板接口回调 + */ + @PostMapping("/normal/callback/{corpId}") + public String postNormal(@PathVariable String corpId, + @RequestParam("msg_signature") String msgSignature, + @RequestParam("timestamp") String timestamp, + @RequestParam("nonce") String nonce, + @RequestBody String body) { + return qywxCallbackService.postNormal(corpId, msgSignature, timestamp, nonce, body); + } + + /** + * 服务商代开发应用客户验证URL回调 + */ + @GetMapping("/normal/customer/callback/{providerCorpId}/{corpId}") + public String getNormalCustomer(@PathVariable String providerCorpId, + @PathVariable String corpId, + @RequestParam("msg_signature") String msgSignature, + @RequestParam("timestamp") String timestamp, + @RequestParam("nonce") String nonce, + @RequestParam("echostr") String echostr) { + return qywxCallbackService.getNormalCustomer(providerCorpId, corpId, msgSignature, timestamp, nonce, echostr); + } + + /** + * 服务商代开发应用客户接口回调 + * 此回调暂不做任何处理 + */ + @PostMapping("/normal/customer/callback/{providerCorpId}/{corpId}") + public String postNormalCustomer( + @PathVariable String providerCorpId, + @PathVariable String corpId, + @RequestParam("msg_signature") String msgSignature, + @RequestParam("timestamp") String timestamp, + @RequestParam("nonce") String nonce, + @RequestBody String body) { + return qywxCallbackService.postNormalCustomer(providerCorpId, corpId, msgSignature, timestamp, nonce, body); + } + + /** + * 服务商代开发应用验证URL回调 + */ + @GetMapping("/event/callback/{providerCorpId}/{corpId}") + public String getEvent(@PathVariable String providerCorpId, + @PathVariable String corpId, + @RequestParam("msg_signature") String msgSignature, + @RequestParam("timestamp") String timestamp, + @RequestParam("nonce") String nonce, + @RequestParam("echostr") String echostr) { + return qywxCallbackService.getEvent(providerCorpId, corpId, msgSignature, timestamp, nonce, echostr); + } + + /** + * 服务商代开发应用回调 + */ + @PostMapping("/event/callback/{providerCorpId}/{corpId}") + public String postEvent( + @PathVariable String providerCorpId, + @PathVariable String corpId, + @RequestParam("msg_signature") String msgSignature, + @RequestParam("timestamp") String timestamp, + @RequestParam("nonce") String nonce, + @RequestBody String body) { + return qywxCallbackService.postEvent(providerCorpId, corpId, msgSignature, timestamp, nonce, body); + } + + /** + * 加密对应服务商的学校corpId + */ + @GetMapping("/changeCorpId/{providerCorpId}/{corpId}") + public ResultBean changeCorpId(@PathVariable String providerCorpId, @PathVariable String corpId) { + qywxServiceProviderService.changeCorpId(providerCorpId, corpId); return ResultBean.buildSuccess(); } + /** + * 服务商对应学校加密corpId数据(原始值为key) + */ + @GetMapping("/getCorpByOriginalData") + public ResultBean getCorpByOriginalData(@RequestParam String providerCorpId, + @RequestParam String deptOriginalCorpId) { + EduQywxServiceProviderSchool providerSchool = eduQywxServiceProviderSchoolService.getOne(Wrappers.lambdaQuery(new EduQywxServiceProviderSchool()) + .eq(EduQywxServiceProviderSchool::getProviderCorpId, providerCorpId) + .eq(EduQywxServiceProviderSchool::getDeptOriginalCorpId, deptOriginalCorpId)); + return ResultBean.buildSuccess(providerSchool); + } + + /** + * 服务商对应学校加密corpId数据(加密值为key) + */ + @GetMapping("/getCorpByEncryptionData") + public ResultBean getCorpByEncryptionData(@RequestParam String providerCorpId, + @RequestParam String deptEncryptionCorpId) { + EduQywxServiceProviderSchool providerSchool = eduQywxServiceProviderSchoolService.getOne(Wrappers.lambdaQuery(new EduQywxServiceProviderSchool()) + .eq(EduQywxServiceProviderSchool::getProviderCorpId, providerCorpId) + .eq(EduQywxServiceProviderSchool::getDeptEncryptionCorpId, deptEncryptionCorpId)); + return ResultBean.buildSuccess(providerSchool); + } + } diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/InUPayConfigController.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/InUPayConfigController.java new file mode 100644 index 0000000..451db85 --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/InUPayConfigController.java @@ -0,0 +1,38 @@ +package com.yida.data.system.controller; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.system.UPayConfig; +import com.yida.data.common.core.utils.Asserts; +import com.yida.data.system.service.UPayConfigService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 收钱吧支付配置信息 Controller + * + * @author ZYJ + * @date 2023/3/21 + */ +@RestController +@RequiredArgsConstructor +@Api(tags = "收钱吧支付配置信息(无鉴权)") +@RequestMapping("/in/uPayConfig") +public class InUPayConfigController { + + private final UPayConfigService uPayConfigService; + + @ApiOperation("根据部门查询收钱吧支付配置信息") + @GetMapping("/getUPayConfigByDept") + public ResultBean getUPayConfigByDept(Long deptId) { + Asserts.isNotNull(deptId, "部门不能为空"); + return ResultBean.buildSuccess(uPayConfigService.getOne(Wrappers.lambdaQuery(new UPayConfig()) + .eq(UPayConfig::getDeptId, deptId)) + ); + } + +} diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/InUserController.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/InUserController.java index 88e8f3d..2eb14f5 100644 --- a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/InUserController.java +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/InUserController.java @@ -6,16 +6,12 @@ import com.yida.data.system.service.IUserRoleService; import com.yida.data.system.service.IUserService; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; -import java.util.List; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; + +import java.util.List; @Slf4j @Validated @@ -68,4 +64,12 @@ public class InUserController { userService.updateUserRoleByRoleName(userId, roleNames); return ResultBean.buildSuccess(); } + + @ApiOperation("获取企业微信用户授权后创建职工用户信息") + @GetMapping("createStaff") + public ResultBean createStaff(@ApiParam("学校Id") Long schoolId, + @ApiParam("通过成员授权获取到的code") String code) { + userService.createStaff(schoolId, code); + return ResultBean.buildSuccess(); + } } diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/InWhiteListController.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/InWhiteListController.java new file mode 100644 index 0000000..df23666 --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/InWhiteListController.java @@ -0,0 +1,35 @@ +package com.yida.data.system.controller; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.yida.data.common.core.common.ResultBean; +import com.yida.data.common.core.entity.system.WhiteList; +import com.yida.data.system.service.WhiteListService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 白名单 Controller + * + * @author ZYJ + * @date 2023/2/21 + */ +@RestController +@RequiredArgsConstructor +@Api(tags = "白名单(无鉴权)") +@RequestMapping("/in/whiteList") +public class InWhiteListController { + + private final WhiteListService whiteListService; + + @ApiOperation("根据功能名称获取对应的白名单信息") + @GetMapping("/getWhiteList") + public ResultBean getWhiteList(String functionName) { + return ResultBean.buildSuccess(whiteListService.getOne(Wrappers.lambdaQuery(new WhiteList()) + .eq(WhiteList::getFunctionName, functionName))); + } + +} diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/LoginLogController.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/LoginLogController.java index c80b0d7..8019807 100644 --- a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/LoginLogController.java +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/LoginLogController.java @@ -1,11 +1,14 @@ package com.yida.data.system.controller; import com.yida.data.common.core.annotation.ControllerLog; +import com.yida.data.common.core.common.ModuleName; import com.yida.data.common.core.entity.FebsResponse; import com.yida.data.common.core.entity.QueryRequest; import com.yida.data.common.core.entity.constant.StringConstant; import com.yida.data.common.core.entity.system.LoginLog; +import com.yida.data.common.core.entity.system.enums.OperationLogTypeEnum; import com.yida.data.common.core.utils.FebsUtil; +import com.yida.data.log.annotation.OperationLog; import com.yida.data.system.service.ILoginLogService; import org.springframework.security.access.prepost.PreAuthorize; @@ -51,7 +54,7 @@ public class LoginLogController { @DeleteMapping("{ids}") @PreAuthorize("hasAuthority('loginlog:delete')") - @ControllerLog(operation = "删除登录日志", exceptionMessage = "删除登录日志失败") + @OperationLog(module = ModuleName.SYSTEM, methods = "删除登录日志", type = OperationLogTypeEnum.DELETE) public void deleteLogs(@NotBlank(message = "{required}") @PathVariable String ids) { String[] loginLogIds = ids.split(StringConstant.COMMA); this.loginLogService.deleteLoginLogs(loginLogIds); @@ -59,7 +62,6 @@ public class LoginLogController { @PostMapping("excel") @PreAuthorize("hasAuthority('loginlog:export')") - @ControllerLog(operation = "导出登录日志数据", exceptionMessage = "导出Excel失败") public void export(QueryRequest request, LoginLog loginLog, HttpServletResponse response) { List loginLogs = this.loginLogService.findLoginLogs(loginLog, request).getRecords(); //ExcelKit.$Export(LoginLog.class, response).downXlsx(loginLogs, false); diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/MenuController.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/MenuController.java index bd0e581..229abc7 100644 --- a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/MenuController.java +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/MenuController.java @@ -1,11 +1,14 @@ package com.yida.data.system.controller; import com.yida.data.common.core.annotation.ControllerLog; +import com.yida.data.common.core.common.ModuleName; import com.yida.data.common.core.entity.FebsResponse; import com.yida.data.common.core.entity.constant.StringConstant; import com.yida.data.common.core.entity.router.VueRouter; import com.yida.data.common.core.entity.system.Menu; import com.yida.data.common.core.entity.system.Role; +import com.yida.data.common.core.entity.system.enums.OperationLogTypeEnum; +import com.yida.data.log.annotation.OperationLog; import com.yida.data.system.service.IMenuService; import com.yida.data.system.service.IRoleService; import io.swagger.annotations.ApiOperation; @@ -39,6 +42,7 @@ public class MenuController { private final IMenuService menuService; private final IRoleService roleService; + @GetMapping("/{username}") public FebsResponse getUserRouters(@NotBlank(message = "{required}") @PathVariable String username) { Map result = new HashMap<>(4); @@ -56,9 +60,9 @@ public class MenuController { String[] roleArray = new String[0]; if (!CollectionUtils.isEmpty(userRoleList)) { String userRoles = userRoleList.stream() - .filter(role -> Objects.nonNull(role) && StringUtils.isNotBlank(role.getRolePerms())) - .map(Role::getRolePerms) - .collect(Collectors.joining(StringConstant.COMMA)); + .filter(role -> Objects.nonNull(role) && StringUtils.isNotBlank(role.getRolePerms())) + .map(Role::getRolePerms) + .collect(Collectors.joining(StringConstant.COMMA)); if (StringUtils.isNoneBlank(userPermissions)) { roleArray = StringUtils.splitByWholeSeparatorPreserveAllTokens(userRoles, StringConstant.COMMA); } @@ -67,9 +71,9 @@ public class MenuController { String[] mainRoleArray = new String[0]; if (!CollectionUtils.isEmpty(mainRoleList)) { String mainRoles = mainRoleList.stream() - .filter(role -> Objects.nonNull(role) && StringUtils.isNotBlank(role.getRolePerms())) - .map(Role::getRolePerms) - .collect(Collectors.joining(StringConstant.COMMA)); + .filter(role -> Objects.nonNull(role) && StringUtils.isNotBlank(role.getRolePerms())) + .map(Role::getRolePerms) + .collect(Collectors.joining(StringConstant.COMMA)); if (StringUtils.isNoneBlank(mainRoles)) { mainRoleArray = StringUtils.splitByWholeSeparatorPreserveAllTokens(mainRoles, StringConstant.COMMA); } @@ -95,14 +99,14 @@ public class MenuController { @PostMapping @PreAuthorize("hasAuthority('menu:add')") - @ControllerLog(operation = "新增菜单/按钮", exceptionMessage = "新增菜单/按钮失败") + @OperationLog(module = ModuleName.SYSTEM, methods = "新增菜单/按钮", type = OperationLogTypeEnum.INSERT) public void addMenu(@Valid Menu menu) { this.menuService.createMenu(menu); } @DeleteMapping("/{menuIds}") @PreAuthorize("hasAuthority('menu:delete')") - @ControllerLog(operation = "删除菜单/按钮", exceptionMessage = "删除菜单/按钮失败") + @OperationLog(module = ModuleName.SYSTEM, methods = "删除菜单/按钮", type = OperationLogTypeEnum.DELETE) public void deleteMenus(@NotBlank(message = "{required}") @PathVariable String menuIds) { String[] ids = menuIds.split(StringConstant.COMMA); this.menuService.deleteMeuns(ids); @@ -110,14 +114,13 @@ public class MenuController { @PutMapping @PreAuthorize("hasAuthority('menu:update')") - @ControllerLog(operation = "修改菜单/按钮", exceptionMessage = "修改菜单/按钮失败") + @OperationLog(module = ModuleName.SYSTEM, methods = "修改菜单/按钮", type = OperationLogTypeEnum.UPDATE) public void updateMenu(@Valid Menu menu) { this.menuService.updateMenu(menu); } @PostMapping("excel") @PreAuthorize("hasAuthority('menu:export')") - @ControllerLog(operation = "导出菜单数据", exceptionMessage = "导出Excel失败") public void export(Menu menu, HttpServletResponse response) { List menus = this.menuService.findMenuList(menu); //ExcelKit.$Export(Menu.class, response).downXlsx(menus, false); diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/OutDeptController.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/OutDeptController.java index 3b38379..9a1193c 100644 --- a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/OutDeptController.java +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/OutDeptController.java @@ -4,22 +4,17 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.yida.data.common.core.common.ResultBean; import com.yida.data.common.core.entity.system.Dept; import com.yida.data.common.core.entity.system.EduDeptWxPublic; -import com.yida.data.system.dto.SchoolInformationDTO; import com.yida.data.system.mapper.EduDeptWxPublicMapper; import com.yida.data.system.service.IDeptService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import java.util.List; - @Slf4j @Validated @Api(tags = "部门管理(无鉴权 外部使用)") @@ -42,13 +37,4 @@ public class OutDeptController { } return ResultBean.buildSuccess(school); } - - @ApiOperation("根据名称查询教育局缴费学校列表") - @GetMapping("/listPaySchool") - public ResultBean> listPaySchool( - @ApiParam(value = "教育局或代理商id", required = true) @RequestParam Long deptId, - @ApiParam(value = "学校名称") String schoolName) { - List list = deptService.listPaySchool(deptId, schoolName); - return ResultBean.buildSuccess(list); - } } diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/RoleController.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/RoleController.java index 2dd62f1..285cf77 100644 --- a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/RoleController.java +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/RoleController.java @@ -1,12 +1,15 @@ package com.yida.data.system.controller; import com.yida.data.common.core.annotation.ControllerLog; +import com.yida.data.common.core.common.ModuleName; import com.yida.data.common.core.common.ResultBean; import com.yida.data.common.core.entity.FebsResponse; import com.yida.data.common.core.entity.QueryRequest; import com.yida.data.common.core.entity.constant.StringConstant; import com.yida.data.common.core.entity.system.Role; +import com.yida.data.common.core.entity.system.enums.OperationLogTypeEnum; import com.yida.data.common.core.utils.FebsUtil; +import com.yida.data.log.annotation.OperationLog; import com.yida.data.system.service.IRoleService; import org.springframework.security.access.prepost.PreAuthorize; @@ -64,14 +67,14 @@ public class RoleController { @PostMapping @PreAuthorize("hasAuthority('role:add')") - @ControllerLog(operation = "新增角色", exceptionMessage = "新增角色失败") + @OperationLog(module = ModuleName.SYSTEM, methods = "新增角色", type = OperationLogTypeEnum.INSERT) public void addRole(@Valid Role role) { this.roleService.createRole(role); } @DeleteMapping("/{roleIds}") @PreAuthorize("hasAuthority('role:delete')") - @ControllerLog(operation = "删除角色", exceptionMessage = "删除角色失败") + @OperationLog(module = ModuleName.SYSTEM, methods = "删除角色失败", type = OperationLogTypeEnum.DELETE) public void deleteRoles(@NotBlank(message = "{required}") @PathVariable String roleIds) { String[] ids = roleIds.split(StringConstant.COMMA); this.roleService.deleteRoles(ids); @@ -79,14 +82,13 @@ public class RoleController { @PutMapping @PreAuthorize("hasAuthority('role:update')") - @ControllerLog(operation = "修改角色", exceptionMessage = "修改角色失败") + @OperationLog(module = ModuleName.SYSTEM, methods = "修改角色", type = OperationLogTypeEnum.UPDATE) public void updateRole(@Valid Role role) { this.roleService.updateRole(role); } @PostMapping("excel") @PreAuthorize("hasAuthority('role:export')") - @ControllerLog(operation = "导出角色数据", exceptionMessage = "导出Excel失败") public void export(QueryRequest queryRequest, Role role, HttpServletResponse response) { List roles = this.roleService.findRoles(role, queryRequest).getRecords(); //ExcelKit.$Export(Role.class, response).downXlsx(roles, false); diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/UserController.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/UserController.java index 5aeb28e..f751823 100644 --- a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/UserController.java +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/controller/UserController.java @@ -1,7 +1,6 @@ package com.yida.data.system.controller; import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.yida.data.common.core.annotation.ControllerLog; import com.yida.data.common.core.common.ModuleName; import com.yida.data.common.core.common.ResultBean; import com.yida.data.common.core.entity.FebsResponse; @@ -12,6 +11,7 @@ import com.yida.data.common.core.entity.system.LoginLog; import com.yida.data.common.core.entity.system.SystemUser; import com.yida.data.common.core.entity.system.SystemUserMenu; import com.yida.data.common.core.entity.system.UserRole; +import com.yida.data.common.core.entity.system.enums.OperationLogTypeEnum; import com.yida.data.common.core.exception.FebsException; import com.yida.data.common.core.utils.ExcelUtil; import com.yida.data.common.core.utils.FebsUtil; @@ -116,14 +116,14 @@ public class UserController { @PostMapping @PreAuthorize("hasAuthority('user:add')") - @ControllerLog(operation = "新增用户", exceptionMessage = "新增用户失败") + @OperationLog(module = ModuleName.USER, methods = "新增用户", type = OperationLogTypeEnum.INSERT) public void addUser(@Valid SystemUser user) { userService.createUser(user); } @PutMapping @PreAuthorize("hasAuthority('user:update')") - @ControllerLog(operation = "修改用户", exceptionMessage = "修改用户失败") + @OperationLog(module = ModuleName.USER, methods = "修改用户", type = OperationLogTypeEnum.UPDATE) public void updateUser(@Valid SystemUser user) { userService.updateUser(user); } @@ -137,33 +137,32 @@ public class UserController { @DeleteMapping("/{userIds}") @PreAuthorize("hasAuthority('user:delete')") - @ControllerLog(operation = "删除用户", exceptionMessage = "删除用户失败") + @OperationLog(module = ModuleName.USER, methods = "删除用户", type = OperationLogTypeEnum.DELETE) public void deleteUsers(@NotBlank(message = "{required}") @PathVariable String userIds) { String[] ids = userIds.split(StringConstant.COMMA); userService.deleteUsers(ids); } @GetMapping("/updatePassword") - @ControllerLog(operation = "修改密码", exceptionMessage = "修改密码失败") + @OperationLog(module = ModuleName.USER, methods = "修改密码", type = OperationLogTypeEnum.UPDATE) public void updatePassword(String password, String newPassword, String repeatPassword) { userService.updatePassword(password, newPassword, repeatPassword, FebsUtil.getCurrentUsername()); } @GetMapping("/validatePassword") - @ControllerLog(operation = "校验密码", exceptionMessage = "密码校验失败") public ResultBean validatePassword(String password) { userService.validatePassword(password, FebsUtil.getCurrentUsername()); return ResultBean.buildSuccess(); } @PutMapping("profile") - @ControllerLog(exceptionMessage = "修改个人信息失败") + @OperationLog(module = ModuleName.USER, methods = "修改个人信息", type = OperationLogTypeEnum.UPDATE) public void updateProfile(@Valid SystemUser user) throws FebsException { userService.updateProfile(user); } @PutMapping("avatar") - @ControllerLog(exceptionMessage = "修改头像失败") + @OperationLog(module = ModuleName.USER, methods = "修改头像", type = OperationLogTypeEnum.UPDATE) public void updateAvatar(@NotBlank(message = "{required}") String avatar) { userService.updateAvatar(avatar); } @@ -176,14 +175,14 @@ public class UserController { } @PutMapping("password") - @ControllerLog(exceptionMessage = "修改密码失败") + @OperationLog(module = ModuleName.USER, methods = "修改密码", type = OperationLogTypeEnum.UPDATE) public void updatePassword(@NotBlank(message = "{required}") String password) { userService.updatePassword(password); } @PutMapping("password/reset") @PreAuthorize("hasAuthority('user:reset')") - @ControllerLog(exceptionMessage = "重置用户密码失败") + @OperationLog(module = ModuleName.USER, methods = "重置用户密码", type = OperationLogTypeEnum.UPDATE) public void resetPassword(@NotBlank(message = "{required}") String usernames) { String[] usernameArr = usernames.split(StringConstant.COMMA); userService.resetPassword(usernameArr); @@ -191,8 +190,6 @@ public class UserController { @PostMapping("excel") @PreAuthorize("hasAuthority('user:export')") - @ControllerLog(operation = "导出用户数据", exceptionMessage = "导出Excel失败") - @OperationLog(module = ModuleName.SYSTEM, methods = "导出用户数据") public void export(QueryRequest queryRequest, SystemUser user, HttpServletResponse response) { List users = userService.findUserDetailList(user, queryRequest).getRecords(); List userInfoVOS = users.stream().map(x -> { @@ -222,6 +219,7 @@ public class UserController { @ApiOperation("锁定或解锁用户") @GetMapping("/lockUser") + @OperationLog(module = ModuleName.USER, methods = "锁定或解锁用户", type = OperationLogTypeEnum.UPDATE) public ResultBean lockUser(Long id) { userService.lockUser(id); return ResultBean.buildSuccess(); @@ -229,6 +227,7 @@ public class UserController { @ApiOperation("重置密码") @GetMapping("/resetPwd") + @OperationLog(module = ModuleName.USER, methods = "重置密码", type = OperationLogTypeEnum.UPDATE) public ResultBean resetPwd(Long id) { userService.resetPwd(id); return ResultBean.buildSuccess(); @@ -236,12 +235,13 @@ public class UserController { @ApiOperation("添加用户") @PostMapping("/add") + @OperationLog(module = ModuleName.USER, methods = "添加用户", type = OperationLogTypeEnum.INSERT) public ResultBean add(@RequestBody SystemUser systemUser) { return ResultBean.buildSuccess(userService.createUser(systemUser)); } @PostMapping("/update") - @ControllerLog(operation = "修改用户", exceptionMessage = "修改用户失败") + @OperationLog(module = ModuleName.USER, methods = "修改用户", type = OperationLogTypeEnum.UPDATE) public ResultBean updateUserWithName(@RequestBody SystemUser user) { userService.updateUserWithName(user); return ResultBean.buildSuccess(); @@ -249,6 +249,7 @@ public class UserController { @ApiOperation("批量删除用户") @PostMapping("/delUser") + @OperationLog(module = ModuleName.USER, methods = "批量删除用户", type = OperationLogTypeEnum.DELETE) public ResultBean delUser(@RequestBody String[] ids) { userService.deleteUsers(ids); return ResultBean.buildSuccess(); @@ -256,6 +257,7 @@ public class UserController { @ApiOperation("添加用户角色") @PostMapping("/addUserRole") + @OperationLog(module = ModuleName.USER, methods = "添加用户角色", type = OperationLogTypeEnum.UPDATE) public ResultBean addUserRole(@RequestBody UserRole[] userRole) { userRoleService.bindRoleByRoleName(userRole); return ResultBean.buildSuccess(); @@ -274,6 +276,7 @@ public class UserController { @ApiOperation("新增用户对应菜单") @PostMapping("/saveUserMenu") + @OperationLog(module = ModuleName.USER, methods = "新增用户对应菜单", type = OperationLogTypeEnum.UPDATE) public ResultBean saveUserMenu(@RequestBody MenuForUserDTO menuForUserDTO) { systemUserMenuService.saveUserMenu(menuForUserDTO); return ResultBean.buildSuccess(); @@ -281,6 +284,7 @@ public class UserController { @ApiOperation("修改用户对应菜单") @PostMapping("/updateUserMenu") + @OperationLog(module = ModuleName.USER, methods = "修改用户对应菜单", type = OperationLogTypeEnum.UPDATE) public ResultBean updateUserMenu(@RequestBody MenuForUserDTO menuForUserDTO) { systemUserMenuService.updateUserMenu(menuForUserDTO); return ResultBean.buildSuccess(); @@ -288,6 +292,7 @@ public class UserController { @ApiOperation("删除用户对应菜单") @GetMapping("/removeUserMenu") + @OperationLog(module = ModuleName.USER, methods = "删除用户对应菜单", type = OperationLogTypeEnum.UPDATE) public ResultBean removeUserMenu(@ApiParam("用户id") @RequestParam Long userId) { systemUserMenuService.remove(Wrappers.lambdaQuery(new SystemUserMenu()) .eq(SystemUserMenu::getUserId, userId)); @@ -308,6 +313,7 @@ public class UserController { @ApiOperation("保存logo") @PostMapping("/saveLogo") + @OperationLog(module = ModuleName.USER, methods = "保存logo", type = OperationLogTypeEnum.INSERT) public ResultBean saveLogo(@RequestBody EduUserLogo logo) { eduUserLogoService.saveOrUpdate(logo); return ResultBean.buildSuccess(); diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/mapper/BaiduApiConfigMapper.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/mapper/BaiduApiConfigMapper.java new file mode 100644 index 0000000..209405a --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/mapper/BaiduApiConfigMapper.java @@ -0,0 +1,14 @@ +package com.yida.data.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.system.BaiduApiConfig; + +/** + * 百度api配置信息 Mapper + * + * @author ZYJ + * @date 2023-06-20 20:42:47 + */ +public interface BaiduApiConfigMapper extends BaseMapper { + +} diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/mapper/ConstructionPayConfigMapper.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/mapper/ConstructionPayConfigMapper.java new file mode 100644 index 0000000..87de1ff --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/mapper/ConstructionPayConfigMapper.java @@ -0,0 +1,14 @@ +package com.yida.data.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.system.ConstructionPayConfig; + +/** + * 建行学校信息配置 Mapper + * + * @author ZYJ + * @date 2023-06-19 16:30:18 + */ +public interface ConstructionPayConfigMapper extends BaseMapper { + +} diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/mapper/DeptSchoolInformationMapper.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/mapper/DeptSchoolInformationMapper.java index 824a944..2b31fa0 100644 --- a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/mapper/DeptSchoolInformationMapper.java +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/mapper/DeptSchoolInformationMapper.java @@ -18,13 +18,12 @@ public interface DeptSchoolInformationMapper extends BaseMapper findSchoolListByDeptId(@Param("deptId") Long deptId, @Param("schoolName") String schoolName, @@ -42,16 +41,4 @@ public interface DeptSchoolInformationMapper extends BaseMapper findDeptSchoolId(@Param("tags") String[] tags); IPage listSchoolPage(Page page, @Param("dto") SchoolPageDTO dto); - - /** - * 根据名称查询教育局缴费学校列表 - * - * @param deptId 教育局或代理商id - * @param schoolName 学校名称 - * @return java.util.List - * @author ZYJ - * @date 2023/8/30 14:23 - */ - List listPaySchool(@Param("deptId") Long deptId, - @Param("schoolName") String schoolName); } diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/mapper/EduAppTemplateMapper.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/mapper/EduAppTemplateMapper.java new file mode 100644 index 0000000..768c171 --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/mapper/EduAppTemplateMapper.java @@ -0,0 +1,14 @@ +package com.yida.data.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.system.EduAppTemplate; + +/** + * 企业微信服务商代开发应用模板dao + * + * @author ZYJ + * @date 2022/11/3 + */ +public interface EduAppTemplateMapper extends BaseMapper { + +} diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/mapper/EduBaseAppMapper.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/mapper/EduBaseAppMapper.java new file mode 100644 index 0000000..83ac26f --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/mapper/EduBaseAppMapper.java @@ -0,0 +1,14 @@ +package com.yida.data.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.system.EduBaseApp; + +/** + * 基础应用信息(本地配置) Mapper + * + * @author ZYJ + * @date 2023-06-28 14:57:58 + */ +public interface EduBaseAppMapper extends BaseMapper { + +} diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/mapper/EduConsumeConfigMapper.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/mapper/EduConsumeConfigMapper.java new file mode 100644 index 0000000..6b25028 --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/mapper/EduConsumeConfigMapper.java @@ -0,0 +1,14 @@ +package com.yida.data.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.consume.EduConsumeConfig; + +/** + * 学校消费机服务器信息Mapper + * + * @author ZYJ + * @date 2023-04-06 17:31:11 + */ +public interface EduConsumeConfigMapper extends BaseMapper { + +} diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/mapper/EduDeptFunctionMapper.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/mapper/EduDeptFunctionMapper.java new file mode 100644 index 0000000..dd7320b --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/mapper/EduDeptFunctionMapper.java @@ -0,0 +1,14 @@ +package com.yida.data.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.system.EduDeptFunction; + +/** + * 部门对应的第三方系统功能Mapper + * + * @author ZYJ + * @date 2023-02-20 15:29:05 + */ +public interface EduDeptFunctionMapper extends BaseMapper { + +} diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/mapper/EduQywxServiceProviderMapper.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/mapper/EduQywxServiceProviderMapper.java new file mode 100644 index 0000000..5f51344 --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/mapper/EduQywxServiceProviderMapper.java @@ -0,0 +1,14 @@ +package com.yida.data.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.system.EduQywxServiceProvider; + +/** + * 企业微信服务商dao + * + * @author ZYJ + * @date 2022/11/3 + */ +public interface EduQywxServiceProviderMapper extends BaseMapper { + +} diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/mapper/EduQywxServiceProviderSchoolMapper.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/mapper/EduQywxServiceProviderSchoolMapper.java new file mode 100644 index 0000000..b0a5b26 --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/mapper/EduQywxServiceProviderSchoolMapper.java @@ -0,0 +1,14 @@ +package com.yida.data.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.system.EduQywxServiceProviderSchool; + +/** + * 企业微信服务商-学校密文corpId对照表dao + * + * @author ZYJ + * @date 2022/11/9 + */ +public interface EduQywxServiceProviderSchoolMapper extends BaseMapper { + +} diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/mapper/MenuMapper.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/mapper/MenuMapper.java index 749133d..9838b37 100644 --- a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/mapper/MenuMapper.java +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/mapper/MenuMapper.java @@ -28,4 +28,15 @@ public interface MenuMapper extends BaseMapper { */ List findUserRealMenus(@Param("username") String username, @Param("selectType") Integer selectType); + + + /** + * 查询用户绑定权限数据 + * + * @param username 用户名 + * @param selectType 查询类型 0菜单,1按钮,空查询所有 + * @return 用户菜单 + */ + List findUserMenus(@Param("username") String username, + @Param("selectType") Integer selectType); } \ No newline at end of file diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/mapper/UPayConfigMapper.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/mapper/UPayConfigMapper.java new file mode 100644 index 0000000..2dd840a --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/mapper/UPayConfigMapper.java @@ -0,0 +1,14 @@ +package com.yida.data.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.system.UPayConfig; + +/** + * 收钱吧学校信息配置Mapper + * + * @author ZYJ + * @date 2023-03-20 17:53:13 + */ +public interface UPayConfigMapper extends BaseMapper { + +} diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/mapper/UserMapper.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/mapper/UserMapper.java index 3e865b6..9ba7e0e 100644 --- a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/mapper/UserMapper.java +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/mapper/UserMapper.java @@ -38,6 +38,8 @@ public interface UserMapper extends BaseMapper { SystemUser findUserByUsername(String username); + SystemUser findUserByMobile(String mobile); + /** * 获取代理商管理员账号详情 * diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/mapper/WhiteListMapper.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/mapper/WhiteListMapper.java new file mode 100644 index 0000000..7682790 --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/mapper/WhiteListMapper.java @@ -0,0 +1,14 @@ +package com.yida.data.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yida.data.common.core.entity.system.WhiteList; + +/** + * 白名单Mapper + * + * @author ZYJ + * @date 2023-02-20 14:15:49 + */ +public interface WhiteListMapper extends BaseMapper { + +} diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/BaiduApiConfigService.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/BaiduApiConfigService.java new file mode 100644 index 0000000..b56cbea --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/BaiduApiConfigService.java @@ -0,0 +1,13 @@ +package com.yida.data.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.system.BaiduApiConfig; + +/** + * 百度api配置信息 Service接口 + * + * @author ZYJ + * @date 2023-06-20 20:42:47 + */ +public interface BaiduApiConfigService extends IService { +} diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/CommonService.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/CommonService.java index a986fa1..dfc804d 100644 --- a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/CommonService.java +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/CommonService.java @@ -1,6 +1,7 @@ package com.yida.data.system.service; import com.yida.data.common.core.entity.system.EduSysFile; +import com.yida.data.school.vo.smart.WxConfigVO; import org.springframework.web.multipart.MultipartFile; public interface CommonService { @@ -10,4 +11,24 @@ public interface CommonService { String uploadImg(String code); void saveReceiveMsg(); + + /** + * 获取企业微信配置唤起扫码功能 + * + * @param deptId 部门id + * @param url 当前网页的URL,不包含#及其后面部分 + * @return com.yida.data.school.vo.smart.WxConfigVO + * @author ZYJ + * @date 2023/6/5 14:24 + */ + WxConfigVO getWxJsConfig(Long deptId, String url); + + /** + * 获取微信配置唤起扫码功能 + * + * @param deptId + * @param url + * @return + */ + WxConfigVO getWxPublicJsConfig(Long deptId, String url); } diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/ConstructionPayConfigService.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/ConstructionPayConfigService.java new file mode 100644 index 0000000..d33ecd4 --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/ConstructionPayConfigService.java @@ -0,0 +1,15 @@ +package com.yida.data.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.system.ConstructionPayConfig; + +/** + * 建行学校信息配置 Service接口 + * + * @author ZYJ + * @date 2023-06-19 16:30:18 + */ +public interface ConstructionPayConfigService extends IService { + + +} diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/EduAppTemplateService.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/EduAppTemplateService.java new file mode 100644 index 0000000..7c50544 --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/EduAppTemplateService.java @@ -0,0 +1,14 @@ +package com.yida.data.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.system.EduAppTemplate; + +/** + * 企业微信服务商代开发应用模板service + * + * @author ZYJ + * @date 2022/11/3 + */ +public interface EduAppTemplateService extends IService { + +} diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/EduBaseAppService.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/EduBaseAppService.java new file mode 100644 index 0000000..8ec6570 --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/EduBaseAppService.java @@ -0,0 +1,13 @@ +package com.yida.data.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.system.EduBaseApp; + +/** + * 基础应用信息(本地配置) Service接口 + * + * @author ZYJ + * @date 2023-06-28 14:57:58 + */ +public interface EduBaseAppService extends IService { +} diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/EduConsumeConfigService.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/EduConsumeConfigService.java new file mode 100644 index 0000000..840b213 --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/EduConsumeConfigService.java @@ -0,0 +1,14 @@ +package com.yida.data.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.consume.EduConsumeConfig; + +/** +* 学校消费机服务器信息Service接口 +* +* @author ZYJ +* @date 2023-04-06 17:31:11 +*/ +public interface EduConsumeConfigService extends IService { + +} diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/EduDeptFunctionService.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/EduDeptFunctionService.java new file mode 100644 index 0000000..85e5052 --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/EduDeptFunctionService.java @@ -0,0 +1,13 @@ +package com.yida.data.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.system.EduDeptFunction; + +/** +* 部门对应的第三方系统功能Service接口 +* +* @author ZYJ +* @date 2023-02-20 15:29:05 +*/ +public interface EduDeptFunctionService extends IService { +} diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/EduQywxServiceProviderSchoolService.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/EduQywxServiceProviderSchoolService.java new file mode 100644 index 0000000..235d50c --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/EduQywxServiceProviderSchoolService.java @@ -0,0 +1,14 @@ +package com.yida.data.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.system.EduQywxServiceProviderSchool; + +/** + * 企业微信服务商-学校密文corpId对照表service + * + * @author ZYJ + * @date 2022/11/9 + */ +public interface EduQywxServiceProviderSchoolService extends IService { + +} diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/EduQywxServiceProviderService.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/EduQywxServiceProviderService.java new file mode 100644 index 0000000..78c14b0 --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/EduQywxServiceProviderService.java @@ -0,0 +1,14 @@ +package com.yida.data.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.system.EduQywxServiceProvider; + +/** + * 企业微信服务商service + * + * @author ZYJ + * @date 2022/11/3 + */ +public interface EduQywxServiceProviderService extends IService { + +} diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/IDeptService.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/IDeptService.java index 0139fdb..7313944 100644 --- a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/IDeptService.java +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/IDeptService.java @@ -108,6 +108,8 @@ public interface IDeptService extends IService { List getDeptTree(Long deptId, Integer type); + List getDeptTree(List deptIds); + Dept getParentById(Long deptId); List listClassByDept(List ids); @@ -141,7 +143,7 @@ public interface IDeptService extends IService { * 同步企业微信部门 */ @Async(FebsConstant.ASYNC_POOL) - void syncQywxDept(); + void syncQywxDept(Long schoolId); /** * 处理挂在学校下的部门 @@ -153,7 +155,7 @@ public interface IDeptService extends IService { * * @param agentSchoolSelectPageDTO 查询代理商管理的学校列表数据请求类 * @return com.yida.data.common.core.common.ResultBean> + * com.yida.data.system.vo.AgentSchoolVO>> * @author ZYJ * @date 2021/9/27 17:05 */ @@ -193,9 +195,10 @@ public interface IDeptService extends IService { void saveOrUpdateDeptSchool(SchoolInformationDTO information); Page findSchoolListByDeptId(Long deptId, String schoolName, Integer schoolType, - Integer natureType, String address, String tag, Page page, Integer schoolOwnership); + Integer natureType, String address, String tag, Page page, Integer schoolOwnership); - Page findSchoolPageList(String schoolName, List schoolType, List natureType, Page page, String tag, Long deptId, List schoolOwnership); + Page findSchoolPageList(String schoolName, List schoolType, List natureType, + Page page, String tag, Long deptId, List schoolOwnership); Page findSchoolByAddress(Page page, String address, Long deptId); @@ -217,14 +220,12 @@ public interface IDeptService extends IService { */ IPage listSchoolPage(SchoolPageDTO dto); + /** - * 根据名称查询教育局缴费学校列表 + * 根据子部门查询父级IDList * - * @param deptId 教育局或代理商id - * @param schoolName 学校名称 - * @return java.util.List - * @author ZYJ - * @date 2023/8/30 14:21 + * @param deptIds + * @return */ - List listPaySchool(Long deptId, String schoolName); + List findParentDeptByChild(List deptIds); } diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/IMenuService.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/IMenuService.java index a4fcdec..2119fc4 100644 --- a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/IMenuService.java +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/IMenuService.java @@ -75,8 +75,7 @@ public interface IMenuService extends IService { void deleteMeuns(String[] menuIds); /** - * 根据登录账号查询菜单数 - * 角色相关菜单数据 + * 根据登录账号查询菜单数 角色相关菜单数据 * * @param username 登录账号 * @return java.util.Map diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/IUserService.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/IUserService.java index ca2a494..9c3e29a 100644 --- a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/IUserService.java +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/IUserService.java @@ -25,6 +25,14 @@ public interface IUserService extends IService { */ SystemUser findByName(String username); + /** + * 通过手机号查找用户 + * + * @param mobile 手机号 + * @return 用户 + */ + SystemUser findByMobile(String mobile); + /** * 查找用户详细信息 * @@ -139,4 +147,9 @@ public interface IUserService extends IService { * 更新用户的角色 */ void updateUserRoleByRoleName(Long userId, List roleNames); + + /** + * 获取企业微信用户授权后创建职工用户信息 + */ + void createStaff(Long schoolId, String code); } \ No newline at end of file diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/LogService.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/LogService.java index 95c8924..5ef4ded 100644 --- a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/LogService.java +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/LogService.java @@ -5,6 +5,7 @@ import com.yida.data.system.dto.ListLogDTO; import com.yida.data.system.repository.LogEsRepository; import org.apache.commons.lang3.StringUtils; +import org.elasticsearch.index.query.BoolQueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.sort.SortBuilders; import org.elasticsearch.search.sort.SortOrder; @@ -64,8 +65,9 @@ public class LogService { Pageable pageable = PageRequest.of(dto.getPageNum() - 1, dto.getPageSize()); //封装查询条件 NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder() - .withPageable(pageable) - .withSort(SortBuilders.fieldSort("createDate").order(SortOrder.DESC)); + .withPageable(pageable) + .withSort(SortBuilders.fieldSort("createDate").order(SortOrder.DESC)); + //日志类型 String logType = dto.getLogType(); if (StringUtils.isNotBlank(logType)) { @@ -81,19 +83,24 @@ public class LogService { if (StringUtils.isNotBlank(method)) { queryBuilder.withQuery(QueryBuilders.matchQuery("method", method)); } + + //操作参数 + String operateParams = dto.getOperateParams(); + if (StringUtils.isNotBlank(operateParams)) { + queryBuilder.withQuery(QueryBuilders.matchQuery("operateParams", operateParams)); + } //操作开始时间 LocalDateTime startTime = dto.getStartTime(); //操作结束时间 LocalDateTime endTime = dto.getEndTime(); if (Optional.ofNullable(startTime).isPresent()) { queryBuilder.withQuery(QueryBuilders.rangeQuery("createDate").gte(startTime.toInstant( - ZoneOffset.of("+8") + ZoneOffset.of("+8") ).toEpochMilli()).lte(endTime.toInstant( - ZoneOffset.of("+8") + ZoneOffset.of("+8") ).toEpochMilli())); } //查询列表数据 - Page page = logEsRepository.search(queryBuilder.build().getQuery(), pageable); - return page; + return logEsRepository.search(queryBuilder.build()); } } diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/QywxCallbackService.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/QywxCallbackService.java index 1ed8da4..778312f 100644 --- a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/QywxCallbackService.java +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/QywxCallbackService.java @@ -8,6 +8,17 @@ public interface QywxCallbackService { String get(String corpId, String msgSignature, String timestamp, String nonce, String echostr); - @Async(PoolConstant.QYWX_CALL_POOL) - void post(String corpId, String msgSignature, String timestamp, String nonce, String body); + String post(String corpId, String msgSignature, String timestamp, String nonce, String body); + + String getNormal(String corpId, String msgSignature, String timestamp, String nonce, String echostr); + + String postNormal(String corpId, String msgSignature, String timestamp, String nonce, String body); + + String getNormalCustomer(String providerCorpId, String corpId, String msgSignature, String timestamp, String nonce, String echostr); + + String postNormalCustomer(String providerCorpId, String corpId, String msgSignature, String timestamp, String nonce, String body); + + String getEvent(String providerCorpId, String corpId, String msgSignature, String timestamp, String nonce, String echostr); + + String postEvent(String providerCorpId, String corpId, String msgSignature, String timestamp, String nonce, String body); } diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/QywxHandleService.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/QywxHandleService.java new file mode 100644 index 0000000..b1cc5fb --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/QywxHandleService.java @@ -0,0 +1,39 @@ +package com.yida.data.system.service; + +import com.yida.data.system.dto.QywxCallbackHandleDTO; + +/** + * 企业微信回调mq处理类 + * + * @author ZYJ + * @date 2023/10/27 16:42 + */ +public interface QywxHandleService { + + /** + * 处理企业微信自开发回调信息 + * + * @param dto 企业微信回调处理类 + * @author ZYJ + * @date 2023/10/27 16:49 + */ + void handlePostCallback(QywxCallbackHandleDTO dto); + + /** + * 处理企业微信代开发应用模板回调信息 + * + * @param dto 企业微信回调处理类 + * @author ZYJ + * @date 2023/10/27 16:54 + */ + void handlePostNormalCallback(QywxCallbackHandleDTO dto); + + /** + * 处理企业微信代开发应用回调信息 + * + * @param dto 企业微信回调处理类 + * @author ZYJ + * @date 2023/10/27 16:54 + */ + void handlePostEventCallback(QywxCallbackHandleDTO dto); +} diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/QywxService.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/QywxService.java index be169c3..326d90b 100644 --- a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/QywxService.java +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/QywxService.java @@ -4,6 +4,7 @@ import com.yida.data.common.core.entity.CurrentUser; import com.yida.data.common.core.entity.constant.FebsConstant; import com.yida.data.common.core.entity.system.Dept; +import com.yida.data.common.core.entity.system.EduApp; import org.springframework.scheduling.annotation.Async; public interface QywxService { @@ -41,6 +42,7 @@ public interface QywxService { * @param deptId * @param school */ +// @Async(FebsConstant.ASYNC_POOL) void createSchoolDept(String corpId, String accessToken, Long deptId, Dept school); /** @@ -50,6 +52,7 @@ public interface QywxService { * @param deptId * @param school */ +// @Async(FebsConstant.ASYNC_POOL) void updateSchoolDept(String accessToken, Long deptId, Dept school); /** @@ -69,6 +72,7 @@ public interface QywxService { * @param order * @param school */ +// @Async(FebsConstant.ASYNC_POOL) void createDept(String deptId, String deptName, String parentId, String order, Dept school); /** @@ -79,6 +83,7 @@ public interface QywxService { * @param parentId * @param schoolId */ +// @Async(FebsConstant.ASYNC_POOL) void updateDept(String deptId, String deptName, String parentId, Long schoolId); /** @@ -171,4 +176,9 @@ public interface QywxService { * 家长关注事件 */ void sendParentSubscribeMessage(String parentId, Long schoolId); + + /** + * 修改职工部门信息 + */ + void updateUserInfo(String userId, Dept school, EduApp app); } diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/QywxServiceProviderService.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/QywxServiceProviderService.java new file mode 100644 index 0000000..352d8a8 --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/QywxServiceProviderService.java @@ -0,0 +1,104 @@ +package com.yida.data.system.service; + +import com.yida.data.common.core.entity.system.Dept; +import com.yida.data.common.core.entity.system.EduQywxServiceProvider; +import com.yida.data.common.core.entity.system.EduQywxServiceProviderSchool; +import org.springframework.scheduling.annotation.Async; +import org.w3c.dom.Element; + +/** + * 企业微信服务商处理方法service + * + * @author ZYJ + * @date 2022/11/3 + */ +public interface QywxServiceProviderService { + + /** + * 授权安装模板应用 + * + * @param suiteId 模板id + * @param authCode 临时授权码 + * @param serviceProvider 企业微信服务商信息 + * @author ZYJ + * @date 2022/11/3 16:22 + */ + void installTemplateApp(String suiteId, String authCode, EduQywxServiceProvider serviceProvider); + + /** + * 处理服务商代开发应用模板ticket值 + * + * @param suiteId 模板id + * @param suiteTicket ticket值 + * @author ZYJ + * @date 2022/11/3 11:13 + */ + void handleTemplateSuiteTicket(String suiteId, String suiteTicket); + + /** + * 客户删除应用 + * + * @param suiteId 模板id + * @param authCorpId 授权企业微信id + * @param serviceProvider 企业微信服务商信息 + * @author ZYJ + * @date 2022/11/11 14:26 + */ + void deleteTemplateApp(String suiteId, String authCorpId, EduQywxServiceProvider serviceProvider); + + /** + * 代开发应用重置secret + * + * @param suiteId 模板id + * @param resetAuthCode 临时授权码 + * @param serviceProvider 企业微信服务商信息 + * @author ZYJ + * @date 2022/11/11 16:01 + */ + void resetTemplateAppAuthCode(String suiteId, String resetAuthCode, EduQywxServiceProvider serviceProvider); + + /** + * 处理通讯录事件 + * 通讯录授权编辑回调 + * + * @param root xml明文 + * @param serviceProvider 企业微信服务商信息 + * @param suiteId 模板id + * @author ZYJ + * @date 2022/11/21 16:10 + */ +// @Async + void handleConcat(Element root, EduQywxServiceProvider serviceProvider, String suiteId); + + /** + * 处理通讯录事件 + * 家校沟通应用回调 + * + * @param root xml明文 + * @param providerSchool 企业微信服务商-学校密文 + * @author ZYJ + * @date 2023/2/24 15:59 + */ + void handleConcat(Element root, EduQywxServiceProviderSchool providerSchool); + + /** + * 处理家校沟通通讯录事件 + * + * @param root xml明文 + * @param providerSchool 企业微信服务商-学校密文corpId + * @param school 学校信息 + * @author ZYJ + * @date 2022/12/6 10:57 + */ + void handleSchoolConcat(Element root, EduQywxServiceProviderSchool providerSchool, Dept school); + + /** + * 加密对应服务商的学校corpId + * + * @param providerCorpId 服务商企业微信id + * @param corpId 学校企业微信id + * @author ZYJ + * @date 2023/1/14 15:02 + */ + void changeCorpId(String providerCorpId, String corpId); +} \ No newline at end of file diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/UPayConfigService.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/UPayConfigService.java new file mode 100644 index 0000000..a5e6ff8 --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/UPayConfigService.java @@ -0,0 +1,14 @@ +package com.yida.data.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.system.UPayConfig; + +/** + * 收钱吧学校信息配置Service接口 + * + * @author ZYJ + * @date 2023-03-20 17:53:13 + */ +public interface UPayConfigService extends IService { + +} diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/WhiteListService.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/WhiteListService.java new file mode 100644 index 0000000..27d2451 --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/WhiteListService.java @@ -0,0 +1,14 @@ +package com.yida.data.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yida.data.common.core.entity.system.WhiteList; + +/** +* 白名单Service接口 +* +* @author ZYJ +* @date 2023-02-20 14:15:49 +*/ +public interface WhiteListService extends IService { + +} diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/BaiduApiConfigServiceImpl.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/BaiduApiConfigServiceImpl.java new file mode 100644 index 0000000..87c690a --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/BaiduApiConfigServiceImpl.java @@ -0,0 +1,25 @@ +package com.yida.data.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.system.BaiduApiConfig; +import com.yida.data.system.mapper.BaiduApiConfigMapper; +import com.yida.data.system.service.BaiduApiConfigService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +/** + * 百度api配置信息 Service实现 + * + * @author ZYJ + * @date 2023-06-20 20:42:47 + */ +@Service +@RequiredArgsConstructor +@Transactional(propagation = Propagation.SUPPORTS, readOnly = true) +public class BaiduApiConfigServiceImpl extends ServiceImpl + implements BaiduApiConfigService { + + +} diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/CommonServiceImpl.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/CommonServiceImpl.java index 6a5df4a..7fd1a55 100644 --- a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/CommonServiceImpl.java +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/CommonServiceImpl.java @@ -1,27 +1,45 @@ package com.yida.data.system.service.impl; import cc.mrbird.febs.common.redis.service.RedisService; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.CharsetUtil; +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.crypto.SecureUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.google.common.base.Joiner; import com.yida.data.common.core.entity.ReceiveMsg; +import com.yida.data.common.core.entity.constant.AppConstant; import com.yida.data.common.core.entity.constant.CachePrefixConstant; -import com.yida.data.common.core.entity.system.EduSysFile; +import com.yida.data.common.core.entity.system.*; +import com.yida.data.common.core.exception.FebsException; import com.yida.data.common.core.utils.FileUtil; +import com.yida.data.common.core.utils.WxPublicUtil; +import com.yida.data.common.core.utils.WxUtil; +import com.yida.data.school.vo.smart.WxConfigVO; import com.yida.data.system.mapper.EduSysFileMapper; import com.yida.data.system.repository.ReceiveMsgRepository; import com.yida.data.system.service.CommonService; +import com.yida.data.system.service.IDeptService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import net.coobird.thumbnailator.Thumbnails; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import java.io.File; +import java.math.BigDecimal; +import java.net.URLEncoder; import java.util.ArrayList; import java.util.List; +import java.util.Objects; +import java.util.TreeMap; @Service @RefreshScope @@ -29,8 +47,14 @@ import java.util.List; @RequiredArgsConstructor public class CommonServiceImpl implements CommonService { + private final IDeptService deptService; + private final EduSysFileMapper eduSysFileMapper; private final ReceiveMsgRepository receiveMsgRepository; + private final com.yida.data.common.service.CommonService commonService; + + private final WxUtil wxUtil; + private final WxPublicUtil wxPublicUtil; private final RedisService redisService; @Value("${febs.uploadUrl}") @@ -123,4 +147,69 @@ public class CommonServiceImpl implements CommonService { log.info("保存{}条接收数据", saveSize); } } + + @Override + public WxConfigVO getWxJsConfig(Long deptId, String url) { + Dept dept = deptService.getById(deptId); + if (Objects.isNull(dept)) { + throw new FebsException("当前学校配置信息错误!"); + } + // 获取应用信息 + EduApp app = commonService.getAppByCodeAndSchool(AppConstant.CONTACT_SELECT, null, deptId); + String jsApiTicket = wxUtil.getJsApiTicket(wxUtil.getAccessToken(app.getWxCorpId(), app.getWxSecret()), deptId); + // 时间戳 + String timestamp = String.valueOf(System.currentTimeMillis() / 1000); + // 随机字符串 + String nonceStr = RandomUtil.randomString(32); + + // 请求参数 + JSONObject jsonObject = JSONUtil.createObj() + .set("jsapi_ticket", jsApiTicket) + .set("timestamp", timestamp) + .set("noncestr", nonceStr) + .set("url", url); + TreeMap paramMap = MapUtil.sort(jsonObject); + // 处理请求参数 + String paramsStr = Joiner.on("&").withKeyValueSeparator("=").join(paramMap); + // 签名 + String signature = SecureUtil.sha1(paramsStr); + return WxConfigVO.builder() + .appId(dept.getCorpId()) + .timestamp(timestamp) + .nonceStr(nonceStr) + .signature(signature) + .build(); + } + + @Override + public WxConfigVO getWxPublicJsConfig(Long deptId, String url) { + + Dept dept = deptService.getById(deptId); + if (Objects.isNull(dept)) { + throw new FebsException("当前学校配置信息错误!"); + } + String jsApiTicket = wxPublicUtil.getJsApiTicket(dept.getWxPublicAppId(), dept.getWxPublicSecret()); + // 时间戳 + String timestamp = String.valueOf(System.currentTimeMillis() / 1000); + // 随机字符串 + String nonceStr = RandomUtil.randomString(32); + + // 请求参数 + JSONObject jsonObject = JSONUtil.createObj() + .set("jsapi_ticket", jsApiTicket) + .set("timestamp", timestamp) + .set("noncestr", nonceStr) + .set("url", url); + TreeMap paramMap = MapUtil.sort(jsonObject); + // 处理请求参数 + String paramsStr = Joiner.on("&").withKeyValueSeparator("=").join(paramMap); + // 签名 + String signature = SecureUtil.sha1(paramsStr); + return WxConfigVO.builder() + .appId(dept.getWxPublicAppId()) + .timestamp(timestamp) + .nonceStr(nonceStr) + .signature(signature) + .build(); + } } diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/ConstructionPayConfigServiceImpl.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/ConstructionPayConfigServiceImpl.java new file mode 100644 index 0000000..48f0cc9 --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/ConstructionPayConfigServiceImpl.java @@ -0,0 +1,27 @@ +package com.yida.data.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.system.ConstructionPayConfig; +import com.yida.data.system.mapper.ConstructionPayConfigMapper; +import com.yida.data.system.service.ConstructionPayConfigService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +/** + * 建行学校信息配置 Service实现 + * + * @author ZYJ + * @date 2023-06-19 16:30:18 + */ +@Slf4j +@Service +@RequiredArgsConstructor +@Transactional(rollbackFor = Exception.class) +public class ConstructionPayConfigServiceImpl extends ServiceImpl + implements ConstructionPayConfigService { + + +} diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/DeptSchoolInformationServiceImpl.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/DeptSchoolInformationServiceImpl.java index 6b4c68a..9852efb 100644 --- a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/DeptSchoolInformationServiceImpl.java +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/DeptSchoolInformationServiceImpl.java @@ -29,20 +29,18 @@ import java.util.List; @RequiredArgsConstructor @Transactional(rollbackFor = Exception.class) public class DeptSchoolInformationServiceImpl extends ServiceImpl - implements DeptSchoolInformationService { + implements DeptSchoolInformationService { private final DeptSchoolLabelService labelService; private final CommonService commonService; @Override public Page findSchoolListByDeptId(Long deptId, String schoolName, Integer schoolType, - Integer natureType, String address, String tag, Page page, - Integer schoolOwnership) { - Page schoolListByDeptId = baseMapper - .findSchoolListByDeptId(deptId, schoolName, schoolType, natureType, address, tag, page, schoolOwnership); + Integer natureType, String address, String tag, Page page, + Integer schoolOwnership) { + Page schoolListByDeptId = baseMapper.findSchoolListByDeptId(deptId, schoolName, schoolType, natureType, address, tag, page, schoolOwnership); for (SchoolInformationDTO record : schoolListByDeptId.getRecords()) { - List list = labelService - .list(Wrappers.query(new DeptSchoolLabel()).lambda().eq(DeptSchoolLabel::getDeptSchoolId, record.getId())); + List list = labelService.list(Wrappers.query(new DeptSchoolLabel()).lambda().eq(DeptSchoolLabel::getDeptSchoolId, record.getId())); List tagList = new ArrayList<>(); for (DeptSchoolLabel deptSchoolLabel : list) { tagList.add(deptSchoolLabel.getLabel()); @@ -53,9 +51,8 @@ public class DeptSchoolInformationServiceImpl extends ServiceImpl findSchoolPageList(String schoolName, List schoolType, List natureType, - Page page, - String[] tags, Long deptId, List schoolOwnership) { + public Page findSchoolPageList(String schoolName, List schoolType, List natureType, Page page, + String[] tags, Long deptId, List schoolOwnership) { List deptSchoolId = new ArrayList<>(); if (tags != null && tags.length > 0) { deptSchoolId = baseMapper.findDeptSchoolId(tags); @@ -68,6 +65,7 @@ public class DeptSchoolInformationServiceImpl extends ServiceImpl findSchoolByAddress(Page page, String address, Long deptId) { + return baseMapper.findSchoolByAddress(page, address, deptId); } diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/DeptServiceImpl.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/DeptServiceImpl.java index e0f644e..9d4762c 100644 --- a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/DeptServiceImpl.java +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/DeptServiceImpl.java @@ -24,6 +24,7 @@ import com.yida.data.common.core.entity.system.*; import com.yida.data.common.core.entity.system.enums.DeptTypeEnum; import com.yida.data.common.core.entity.system.enums.RoleEnum; import com.yida.data.common.core.entity.system.enums.UserStatusEnum; +import com.yida.data.common.core.entity.user.enums.DeptVisibleTypeEnum; import com.yida.data.common.core.enums.EnableStatusEnum; import com.yida.data.common.core.exception.FebsException; import com.yida.data.common.core.utils.*; @@ -33,7 +34,6 @@ import com.yida.data.system.dto.AgentSchoolSelectPageDTO; import com.yida.data.system.dto.SchoolInformationDTO; import com.yida.data.system.dto.SchoolPageDTO; import com.yida.data.system.mapper.DeptMapper; -import com.yida.data.system.mapper.DeptSchoolInformationMapper; import com.yida.data.system.mapper.DeptSchoolRelateMapper; import com.yida.data.system.mapper.EduAppMapper; import com.yida.data.system.service.*; @@ -70,6 +70,7 @@ public class DeptServiceImpl extends ServiceImpl implements ID private final EduAppAccountService eduAppAccountService; private final CommonService commonService; private final EduPayWxConfigService eduPayWxConfigService; + private final EduAgentSchoolRelateService eduAgentSchoolRelateService; private final IUserService userService; private final RedisService redisService; private final DeptSchoolRelateMapper deptSchoolRelateMapper; @@ -81,15 +82,13 @@ public class DeptServiceImpl extends ServiceImpl implements ID private final DeptSchoolInformationService schoolInformationService; private final DeptSchoolInformationNatureService natureService; - private final DeptSchoolInformationMapper deptSchoolInformationMapper; - @Override public Dept getSchoolDeptByDeptAndWx(List deptId, Long wxId) { Dept exist = getOne(Wrappers.lambdaQuery(new Dept()).in(Dept::getParentId, deptId).eq(Dept::getWxId, - wxId).ne(Dept::getDeptType, 6)); + wxId).ne(Dept::getDeptType, 6)); if (exist == null) { List deptList = - list(Wrappers.lambdaQuery(new Dept()).in(Dept::getParentId, deptId).ne(Dept::getDeptType, 6)); + list(Wrappers.lambdaQuery(new Dept()).in(Dept::getParentId, deptId).ne(Dept::getDeptType, 6)); if (CollUtil.isNotEmpty(deptList)) { List deptIds = deptList.stream().map(x -> x.getDeptId()).collect(Collectors.toList()); exist = getSchoolDeptByDeptAndWx(deptIds, wxId); @@ -101,12 +100,13 @@ public class DeptServiceImpl extends ServiceImpl implements ID @Override public Dept getSysDeptByDeptAndWx(List deptId, Long wxId) { Dept exist = getOne(Wrappers.lambdaQuery(new Dept()).in(Dept::getParentId, deptId).eq(Dept::getWxId, - wxId).eq(Dept::getDeptType, 6)); + wxId).eq(Dept::getDeptType, DeptTypeEnum.DEPARTMENT_TYPE.getValue())); if (exist == null) { List deptList = - list(Wrappers.lambdaQuery(new Dept()).in(Dept::getParentId, deptId).eq(Dept::getDeptType, 6)); + list(Wrappers.lambdaQuery(new Dept()).in(Dept::getParentId, deptId) + .eq(Dept::getDeptType, DeptTypeEnum.DEPARTMENT_TYPE.getValue())); if (CollUtil.isNotEmpty(deptList)) { - List deptIds = deptList.stream().map(x -> x.getDeptId()).collect(Collectors.toList()); + List deptIds = deptList.stream().map(Dept::getDeptId).collect(Collectors.toList()); exist = getSysDeptByDeptAndWx(deptIds, wxId); } } @@ -135,9 +135,9 @@ public class DeptServiceImpl extends ServiceImpl implements ID } else { // 查询下级部门信息 List childIdList = findListByParent(Collections.singletonList(currentUser.getDeptId()), 0) - .stream().map(Dept::getDeptId).collect(Collectors.toList()); + .stream().map(Dept::getDeptId).collect(Collectors.toList()); if (RoleEnum.ROLE_EDUCATION_PRINCIPAL.equals(roleEnum) || - RoleEnum.ROLE_AGENT_ADMIN.equals(roleEnum)) { + RoleEnum.ROLE_AGENT_ADMIN.equals(roleEnum)) { childIdList.add(currentUser.getDeptId()); } // 具有创建账号的数据 自己创建的账号+当前登陆账号部门以下的账号 @@ -155,7 +155,7 @@ public class DeptServiceImpl extends ServiceImpl implements ID List res = new ArrayList<>(); // 查询直接子部门 LambdaQueryWrapper condition = Wrappers.lambdaQuery(new Dept()).in(Dept::getParentId, deptId) - .orderByDesc(Dept::getOrderNum); + .orderByDesc(Dept::getOrderNum); // if (type != null) { // if (type == 1) { // condition.ne(Dept::getDeptType, 6); @@ -187,12 +187,12 @@ public class DeptServiceImpl extends ServiceImpl implements ID @Override public List findChildByParentAndType(List deptId, Integer type) { List res = list(Wrappers.lambdaQuery().in(Dept::getParentId, deptId).eq(Dept::getDeptType, type) - .orderByDesc(Dept::getOrderNum)); + .orderByDesc(Dept::getOrderNum)); if (CollUtil.isEmpty(res)) { List child = list(Wrappers.lambdaQuery().in(Dept::getParentId, deptId)); if (CollUtil.isNotEmpty(child)) { res = findChildByParentAndType(child.stream().map(x -> x.getDeptId()).collect(Collectors.toList()), - type); + type); } } return res; @@ -220,8 +220,8 @@ public class DeptServiceImpl extends ServiceImpl implements ID private Dept findSchoolOrEducationByDept(Long deptId) { Dept now = this.baseMapper.selectById(deptId); if (now != null && - (DeptTypeEnum.SCHOOL_TYPE.getValue().equals(now.getDeptType()) - || DeptTypeEnum.EDUCATION_DEPT_TYPE.getValue().equals(now.getDeptType()))) { + (DeptTypeEnum.SCHOOL_TYPE.getValue().equals(now.getDeptType()) + || DeptTypeEnum.EDUCATION_DEPT_TYPE.getValue().equals(now.getDeptType()))) { return now; } else if (now != null) { return findSchoolOrEducationByDept(now.getParentId()); @@ -275,10 +275,10 @@ public class DeptServiceImpl extends ServiceImpl implements ID deptList.forEach(x -> { // 教育局、代理商查询对应的关联学校信息 if (DeptTypeEnum.EDUCATION_DEPT_TYPE.getValue().equals(x.getDeptType()) || - DeptTypeEnum.AGENT_TYPE.getValue().equals(x.getDeptType())) { + DeptTypeEnum.AGENT_TYPE.getValue().equals(x.getDeptType())) { x.setRelationSchoolList(this.deptSchoolRelateMapper.selectList(Wrappers.lambdaQuery(new DeptSchoolRelate()) - .eq(DeptSchoolRelate::getDeptId, x.getDeptId())).stream().map(DeptSchoolRelate::getSchoolId) - .collect(Collectors.toList())); + .eq(DeptSchoolRelate::getDeptId, x.getDeptId())).stream().map(DeptSchoolRelate::getSchoolId) + .collect(Collectors.toList())); } }); return deptList; @@ -322,13 +322,11 @@ public class DeptServiceImpl extends ServiceImpl implements ID Dept parent = findSchoolOrEducationByDept(dept.getParentId()); // 挂在学校的部门需要同步企业微信 if (parent != null && DeptTypeEnum.SCHOOL_TYPE.getValue().equals(parent.getDeptType()) - && parent.getSchoolType().contains(Dept.TYPE_QYWX) - && dept.getWxId() == null) { - EduApp app = eduAppMapper.selectOne(Wrappers.lambdaQuery(new EduApp()).eq(EduApp::getDeptId, - parent.getDeptId()).eq(EduApp::getName, AppConstant.CONTACT)); + && parent.getSchoolType().contains(Dept.TYPE_QYWX) + && dept.getWxId() == null) { + EduApp app = commonService.getAppByCodeAndSchool(AppConstant.CONTACT, null, parent.getDeptId()); if (app != null) { - Long wxId = wxUtil.createDept(wxUtil.getAccessToken(app.getWxCorpId(), app.getWxSecret()), - dept); + Long wxId = wxUtil.createDept(commonService.getAddressListToken(app.getDeptId()), dept); dept.setWxId(wxId); } } @@ -341,19 +339,19 @@ public class DeptServiceImpl extends ServiceImpl implements ID dept.setYidaAppColId(colId); } } else if (DeptTypeEnum.EDUCATION_DEPT_TYPE.getValue().equals(dept.getDeptType()) && - StrUtil.isNotBlank(dept.getSchoolType()) && dept.getSchoolType().contains(Dept.TYPE_YIDA_APP)) { + StrUtil.isNotBlank(dept.getSchoolType()) && dept.getSchoolType().contains(Dept.TYPE_YIDA_APP)) { dept.setYidaAppColId(yidaApp.getAppColId()); } this.save(dept); // 创建绑定易达的学校 if (DeptTypeEnum.SCHOOL_TYPE.getValue().equals(dept.getDeptType()) - && StrUtil.isNotBlank(dept.getSchoolType()) - && dept.getSchoolType().contains(Dept.TYPE_YIDA_APP)) { + && StrUtil.isNotBlank(dept.getSchoolType()) + && dept.getSchoolType().contains(Dept.TYPE_YIDA_APP)) { // 保存学校栏目到区域位下 List list = list(Wrappers.lambdaQuery(new Dept()) - .eq(Dept::getDeptType, 0) - .eq(Dept::getYidaAppId, yidaApp.getId()) - .like(Dept::getSchoolType, Dept.TYPE_YIDA_APP)); + .eq(Dept::getDeptType, 0) + .eq(Dept::getYidaAppId, yidaApp.getId()) + .like(Dept::getSchoolType, Dept.TYPE_YIDA_APP)); if (CollUtil.isNotEmpty(list)) { JSONArray content = new JSONArray(); for (Dept col : list) { @@ -365,8 +363,8 @@ public class DeptServiceImpl extends ServiceImpl implements ID }}); } String regionId = AppUtil.regionUpdate(yidaApp.getAppSchoolRegionId(), "热门学校", 0, - yidaApp.getAppColId(), - AppUtil.REGION_TYPE_HOT, content, yidaApp); + yidaApp.getAppColId(), + AppUtil.REGION_TYPE_HOT, content, yidaApp); if (StrUtil.isBlank(yidaApp.getAppSchoolRegionId())) { yidaApp.setAppSchoolRegionId(regionId); eduYidaAppService.updateById(yidaApp); @@ -384,20 +382,22 @@ public class DeptServiceImpl extends ServiceImpl implements ID eduAppAccountService.save(appAccount); } } else if (DeptTypeEnum.EDUCATION_DEPT_TYPE.getValue().equals(dept.getDeptType()) || - DeptTypeEnum.AGENT_TYPE.getValue().equals(dept.getDeptType())) { + DeptTypeEnum.AGENT_TYPE.getValue().equals(dept.getDeptType())) { CurrentUser currentUser = FebsUtil.getCurrentUser(); if (CollUtil.isNotEmpty(dept.getRelationSchoolList())) { // 处理关联学校数据 dept.getRelationSchoolList().forEach(schoolId -> { DeptSchoolRelate deptSchoolRelate = DeptSchoolRelate.builder() - .deptId(dept.getDeptId()) - .createDeptId(currentUser.getDeptId()) - .createId(currentUser.getUserId()) - .createDate(LocalDateTime.now()) - .schoolId(schoolId) - .build(); + .deptId(dept.getDeptId()) + .createDeptId(currentUser.getDeptId()) + .createId(currentUser.getUserId()) + .createDate(LocalDateTime.now()) + .schoolId(schoolId) + .build(); this.deptSchoolRelateMapper.insert(deptSchoolRelate); - List list = schoolInformationService.list(Wrappers.query(new DeptSchoolInformation()).lambda().eq(DeptSchoolInformation::getSchoolId, deptSchoolRelate.getSchoolId())); + List list = schoolInformationService.list( + Wrappers.query(new DeptSchoolInformation()).lambda() + .eq(DeptSchoolInformation::getSchoolId, deptSchoolRelate.getSchoolId())); if (CollectionUtil.isEmpty(list)) { DeptSchoolInformation deptSchoolInformation = new DeptSchoolInformation(); @@ -457,9 +457,9 @@ public class DeptServiceImpl extends ServiceImpl implements ID dept.setYidaAppColId(colId); // 保存栏目到订阅号下 List list = list(Wrappers.lambdaQuery(new Dept()) - .eq(Dept::getDeptType, 0) - .like(Dept::getSchoolType, Dept.TYPE_YIDA_APP) - .eq(Dept::getYidaAppId, original.getYidaAppId())); + .eq(Dept::getDeptType, 0) + .like(Dept::getSchoolType, Dept.TYPE_YIDA_APP) + .eq(Dept::getYidaAppId, original.getYidaAppId())); if (CollUtil.isNotEmpty(list)) { JSONArray content = new JSONArray(); for (Dept col : list) { @@ -471,8 +471,8 @@ public class DeptServiceImpl extends ServiceImpl implements ID }}); } String regionId = AppUtil.regionUpdate(yidaApp.getAppSchoolRegionId(), "热门学校", 0, - yidaApp.getAppColId(), - AppUtil.REGION_TYPE_HOT, content, yidaApp); + yidaApp.getAppColId(), + AppUtil.REGION_TYPE_HOT, content, yidaApp); if (StrUtil.isBlank(yidaApp.getAppSchoolRegionId())) { yidaApp.setAppSchoolRegionId(regionId); @@ -492,9 +492,9 @@ public class DeptServiceImpl extends ServiceImpl implements ID // } for (int i = 0; i < 2; i++) { EduYidaAppAccount appAccount = eduAppAccountService - .getOne(Wrappers.lambdaQuery(new EduYidaAppAccount()) - .eq(EduYidaAppAccount::getSchoolId, dept.getDeptId()) - .eq(EduYidaAppAccount::getType, i)); + .getOne(Wrappers.lambdaQuery(new EduYidaAppAccount()) + .eq(EduYidaAppAccount::getSchoolId, dept.getDeptId()) + .eq(EduYidaAppAccount::getType, i)); if (appAccount == null) { appAccount = new EduYidaAppAccount(); } @@ -512,24 +512,23 @@ public class DeptServiceImpl extends ServiceImpl implements ID Dept parent = findSchoolOrEducationByDept(dept.getParentId()); // 挂在学校的部门需要同步企业微信 if (Objects.nonNull(parent) && DeptTypeEnum.SCHOOL_TYPE.getValue().equals(parent.getDeptType()) - && parent.getSchoolType().contains(Dept.TYPE_QYWX)) { - EduApp app = eduAppMapper.selectOne(Wrappers.lambdaQuery(new EduApp()).eq(EduApp::getDeptId, - parent.getDeptId()).eq(EduApp::getName, AppConstant.CONTACT)); + && parent.getSchoolType().contains(Dept.TYPE_QYWX)) { + EduApp app = commonService.getAppByCodeAndSchool(AppConstant.CONTACT, null, parent.getDeptId()); if (app != null) { dept.setWxId(original.getWxId()); - wxUtil.updateDept(wxUtil.getAccessToken(app.getWxCorpId(), app.getWxSecret()), dept); + wxUtil.updateDept(commonService.getAddressListToken(app.getDeptId()), dept); } } } else if (DeptTypeEnum.EDUCATION_DEPT_TYPE.getValue().equals(dept.getDeptType()) || - DeptTypeEnum.AGENT_TYPE.getValue().equals(dept.getDeptType())) { + DeptTypeEnum.AGENT_TYPE.getValue().equals(dept.getDeptType())) { // 教育局、代理商 if (DeptTypeEnum.AGENT_TYPE.getValue().equals(dept.getDeptType()) && - CollectionUtils.isEmpty(dept.getRelationSchoolList())) { + CollectionUtils.isEmpty(dept.getRelationSchoolList())) { throw new FebsException("请选择关联的学校"); } // 删除关联学校数据 this.deptSchoolRelateMapper.delete(Wrappers.lambdaQuery(new DeptSchoolRelate()) - .eq(DeptSchoolRelate::getDeptId, dept.getDeptId())); + .eq(DeptSchoolRelate::getDeptId, dept.getDeptId())); // 绑定了易达app if (StrUtil.isNotBlank(dept.getSchoolType()) && dept.getSchoolType().contains(Dept.TYPE_YIDA_APP)) { // 设置教育局栏目id @@ -540,15 +539,17 @@ public class DeptServiceImpl extends ServiceImpl implements ID // 处理关联学校数据 dept.getRelationSchoolList().forEach(schoolId -> { DeptSchoolRelate deptSchoolRelate = DeptSchoolRelate.builder() - .deptId(original.getDeptId()) - .createDeptId(currentUser.getDeptId()) - .createId(currentUser.getUserId()) - .createDate(LocalDateTime.now()) - .schoolId(schoolId) - .build(); + .deptId(original.getDeptId()) + .createDeptId(currentUser.getDeptId()) + .createId(currentUser.getUserId()) + .createDate(LocalDateTime.now()) + .schoolId(schoolId) + .build(); this.deptSchoolRelateMapper.insert(deptSchoolRelate); //关联关系表学校放入学校信息表 - List list = schoolInformationService.list(Wrappers.query(new DeptSchoolInformation()).lambda().eq(DeptSchoolInformation::getSchoolId, deptSchoolRelate.getSchoolId())); + List list = schoolInformationService.list( + Wrappers.query(new DeptSchoolInformation()).lambda() + .eq(DeptSchoolInformation::getSchoolId, deptSchoolRelate.getSchoolId())); if (CollectionUtil.isEmpty(list)) { DeptSchoolInformation deptSchoolInformation = new DeptSchoolInformation(); deptSchoolInformation.setSchoolName(getById(schoolId).getDeptName()); @@ -568,60 +569,60 @@ public class DeptServiceImpl extends ServiceImpl implements ID public void deleteDepts(String[] deptIds) { // 删除企业微信部门信息 List deptList = - list(Wrappers.lambdaQuery(new Dept()).in(Dept::getDeptId, deptIds).notIn(Dept::getDeptType - , 0, 5)); + list(Wrappers.lambdaQuery(new Dept()).in(Dept::getDeptId, deptIds).notIn(Dept::getDeptType + , 0, 5)); for (Dept dept : deptList) { Dept school = findSchooleByDept(dept.getDeptId()); // 绑定了微信 if (Objects.nonNull(school) && school.getSchoolType().contains(Dept.TYPE_QYWX)) { - EduApp app = commonService.getAppByCodeAndSchool(dept.getDeptType() == 6 ? "通讯录" : "家校沟通", null, - school.getDeptId()); + EduApp app = commonService.getAppByCodeAndSchool(AppConstant.CONTACT, null, + school.getDeptId()); // 同步删除企业微信部门 if (dept.getDeptType() == 6) { - wxUtil.deleteDept(wxUtil.getAccessToken(app.getWxCorpId(), app.getWxSecret()), dept.getWxId()); + wxUtil.deleteDept(commonService.getAddressListToken(school.getDeptId()), dept.getWxId()); } } // 绑定了大华 if (Objects.nonNull(school) && school.getSchoolType().contains(Dept.TYPE_DAHUA)) { - DaHuaUtil.delDept(Arrays.asList(dept.getDahuaId())); + DaHuaUtil.delDept(Collections.singletonList(dept.getDahuaId())); } // 教育局、代理商 if (DeptTypeEnum.EDUCATION_DEPT_TYPE.getValue().equals(dept.getDeptType()) || - DeptTypeEnum.AGENT_TYPE.getValue().equals(dept.getDeptType())) { + DeptTypeEnum.AGENT_TYPE.getValue().equals(dept.getDeptType())) { // 删除关联学校数据 this.deptSchoolRelateMapper.delete(Wrappers.lambdaQuery(new DeptSchoolRelate()) - .eq(DeptSchoolRelate::getDeptId, dept.getDeptId())); + .eq(DeptSchoolRelate::getDeptId, dept.getDeptId())); } } List delYidaSchool = - list(Wrappers.lambdaQuery().in(Dept::getDeptId, deptIds).eq(Dept::getDeptType, 0) - .like(Dept::getSchoolType, "1")); + list(Wrappers.lambdaQuery().in(Dept::getDeptId, deptIds).eq(Dept::getDeptType, 0) + .like(Dept::getSchoolType, "1")); this.delete(Arrays.asList(deptIds)); // 更新学校列表 if (CollUtil.isNotEmpty(delYidaSchool)) { List yidaAppIds = - delYidaSchool.stream().map(x -> x.getYidaAppId()).distinct().collect(Collectors.toList()); + delYidaSchool.stream().map(Dept::getYidaAppId).distinct().collect(Collectors.toList()); for (Long yidaAppId : yidaAppIds) { EduYidaApp yidaApp = eduYidaAppService.getById(yidaAppId); List schoolList = list(Wrappers.lambdaQuery() - .eq(Dept::getYidaAppId, yidaAppId) - .eq(Dept::getDeptType, 0) - .like(Dept::getSchoolType, "1")); + .eq(Dept::getYidaAppId, yidaAppId) + .eq(Dept::getDeptType, 0) + .like(Dept::getSchoolType, "1")); AppUtil.regionUpdate(yidaApp.getAppSchoolRegionId(), "热门学校", 0, yidaApp.getAppColId(), - AppUtil.REGION_TYPE_HOT, - new JSONArray() {{ - for (Dept dept : schoolList) { - add( - new JSONObject() {{ - set("id", dept.getYidaAppColId()); - if (StrUtil.isNotBlank(dept.getIcon())) { - set("img", dept.getIcon()); - } - }}); - } - }} - , yidaApp); + AppUtil.REGION_TYPE_HOT, + new JSONArray() {{ + for (Dept dept : schoolList) { + add( + new JSONObject() {{ + set("id", dept.getYidaAppColId()); + if (StrUtil.isNotBlank(dept.getIcon())) { + set("img", dept.getIcon()); + } + }}); + } + }} + , yidaApp); } } @@ -644,7 +645,7 @@ public class DeptServiceImpl extends ServiceImpl implements ID removeByIds(deptId); // 删除部门缓存 redisService - .hdel(CachePrefixConstant.SYS_DEPT_DATA, deptId.stream().map(x -> x.toString()).toArray(String[]::new)); + .hdel(CachePrefixConstant.SYS_DEPT_DATA, deptId.stream().map(x -> x.toString()).toArray(String[]::new)); } private void buildTrees(List trees, List depts) { @@ -673,7 +674,7 @@ public class DeptServiceImpl extends ServiceImpl implements ID removeByIds(deptIds); userDataPermissionService.deleteByDeptIds(deptIds); this.deptSchoolRelateMapper.delete(Wrappers.lambdaQuery(new DeptSchoolRelate()) - .in(DeptSchoolRelate::getSchoolId, deptIds)); + .in(DeptSchoolRelate::getSchoolId, deptIds)); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.in(Dept::getParentId, deptIds); List depts = baseMapper.selectList(queryWrapper); @@ -709,15 +710,41 @@ public class DeptServiceImpl extends ServiceImpl implements ID return deptTree; } + @Override + public List getDeptTree(List deptIds) { + List allDepts = new ArrayList<>(); + List rootIdList = new ArrayList<>(); + if (CollUtil.isNotEmpty(deptIds)) { + for (Long deptId : deptIds) { + // 添加根节点 + Dept root = getById(deptId); + if (ObjectUtil.isNotNull(root)) { + if (root.getParentId() != null) { + root.setParentId(null); + root.setParentWxId(null); + } + allDepts.add(root); + rootIdList.add(deptId); + } + } + } + // 循环查询子节点 + allDepts.addAll(findListByParent(rootIdList, 2)); + List trees = new ArrayList<>(); + buildTrees(trees, allDepts); + List> deptTree = TreeUtil.build(trees); + return deptTree; + } + @Override public List listClassByDept(List ids) { List res = new ArrayList<>(); if (CollUtil.isNotEmpty(ids)) { List child = list(Wrappers.lambdaQuery(new Dept()).in(Dept::getParentId, ids)); res.addAll( - child.stream().filter(x -> x.getDeptType() == 1).map(x -> x.getDeptId()).collect(Collectors.toList())); + child.stream().filter(x -> x.getDeptType() == 1).map(x -> x.getDeptId()).collect(Collectors.toList())); res.addAll(listClassByDept( - child.stream().filter(x -> x.getDeptType() != 1).map(x -> x.getDeptId()).collect(Collectors.toList()))); + child.stream().filter(x -> x.getDeptType() != 1).map(x -> x.getDeptId()).collect(Collectors.toList()))); } return res; } @@ -725,12 +752,12 @@ public class DeptServiceImpl extends ServiceImpl implements ID @Override public Dept getDeptBySchoolAndName(List deptId, String deptName) { List deptList = list(Wrappers.lambdaQuery(new Dept()).eq(Dept::getDeptName, deptName).in(Dept - ::getParentId, deptId).eq(Dept::getDeptType, 6)); + ::getParentId, deptId).eq(Dept::getDeptType, 6)); if (CollUtil.isEmpty(deptList)) { List child = list(Wrappers.lambdaQuery(new Dept()).in(Dept::getParentId, deptId)); if (CollUtil.isNotEmpty(child)) { return getDeptBySchoolAndName(child.stream().map(x -> x.getDeptId()).collect(Collectors.toList()), - deptName); + deptName); } return null; } else { @@ -824,56 +851,67 @@ public class DeptServiceImpl extends ServiceImpl implements ID public Dept getClassBySchoolAndWx(Long schoolId, Long classWxId) { // 查询到学校年级层 List campusList = list( - Wrappers.lambdaQuery().eq(Dept::getParentId, schoolId).eq(Dept::getDeptType, 4)); + Wrappers.lambdaQuery().eq(Dept::getParentId, schoolId).eq(Dept::getDeptType, 4)); List sectionList = - list(Wrappers.lambdaQuery() - .in(Dept::getParentId, campusList.stream().map(x -> x.getDeptId()).collect(Collectors.toList())) - .eq(Dept::getDeptType, 3)); + list(Wrappers.lambdaQuery() + .in(Dept::getParentId, campusList.stream().map(x -> x.getDeptId()).collect(Collectors.toList())) + .eq(Dept::getDeptType, 3)); List gradeList = - list(Wrappers.lambdaQuery() - .in(Dept::getParentId, sectionList.stream().map(x -> x.getDeptId()).collect(Collectors.toList())) - .eq(Dept::getDeptType, 2)); + list(Wrappers.lambdaQuery() + .in(Dept::getParentId, sectionList.stream().map(x -> x.getDeptId()).collect(Collectors.toList())) + .eq(Dept::getDeptType, 2)); return getOne(Wrappers.lambdaQuery() - .in(Dept::getParentId, gradeList.stream().map(x -> x.getDeptId()).collect(Collectors.toList())) - .eq(Dept::getWxId, - classWxId)); + .in(Dept::getParentId, gradeList.stream().map(x -> x.getDeptId()).collect(Collectors.toList())) + .eq(Dept::getWxId, + classWxId)); } @Override - public void syncQywxDept() { - // 绑定了企业微信的学校 - log.info("开始同步企业微信部门"); - List schoolList = list(Wrappers.lambdaQuery() - .eq(Dept::getDeptType, 0) + public void syncQywxDept(Long schoolId) { + // 查询所有和企业微信关联的学校信息 + List schoolList = new ArrayList<>(); + if (Objects.isNull(schoolId)) { + // 查询所有绑定了企业微信的学校信息 + schoolList = list(Wrappers.lambdaQuery() + .eq(Dept::getDeptType, DeptTypeEnum.SCHOOL_TYPE.getValue()) .like(Dept::getSchoolType, Dept.TYPE_QYWX)); + } else { + Dept school = getById(schoolId); + schoolList.add(school); + } + if (CollUtil.isNotEmpty(schoolList)) { for (Dept school : schoolList) { - EduApp contactApp = commonService.getAppByCodeAndSchool(AppConstant.CONTACT, null, school.getDeptId()); + EduApp contactApp = commonService.getAppContactUsedBySelect(school.getDeptId()); // 获取办公部门 log.info("[{}]开始同步办公部门", school.getDeptName()); List deptList = wxUtil - .listDept(wxUtil.getAccessToken(contactApp.getWxCorpId(), contactApp.getWxSecret()), - school.getWxId()); + .listSimpleDept(wxUtil.getAccessToken(contactApp.getWxCorpId(), contactApp.getWxSecret()), + school.getWxId()); // 保存办公部门 Map idCache = new HashMap<>(); idCache.put(1L, school.getDeptId()); for (Map map : deptList) { Long wxId = Long.valueOf(map.get("id").toString()); Long parentWxId = Long.valueOf(map.get("parentid").toString()); - String deptName = map.get("name").toString(); +// String deptName = map.get("name").toString(); Integer order = Integer.valueOf(map.get("order").toString()); Long parentId = idCache.get(parentWxId); if (wxId == 1) { continue; } + // 获取单个部门详情 + JSONObject deptInfo = wxUtil.getDeptInfo( + wxUtil.getAccessToken(contactApp.getWxCorpId(), contactApp.getWxSecret()), String.valueOf(wxId)); + String deptName = deptInfo.get("name").toString(); Dept exist = getOne(Wrappers.lambdaQuery().eq(Dept::getParentId, parentId) - .eq(Dept::getWxId, wxId).eq(Dept::getDeptType, 6)); + .eq(Dept::getWxId, wxId).eq(Dept::getDeptType, 6)); if (exist == null) { exist = new Dept(); } exist.setParentId(parentId); exist.setDeptName(deptName); - exist.setDeptType(6); + exist.setDeptType(DeptTypeEnum.DEPARTMENT_TYPE.getValue()); exist.setAreaId(school.getAreaId()); exist.setWxId(wxId); exist.setParentWxId(parentWxId); @@ -889,23 +927,22 @@ public class DeptServiceImpl extends ServiceImpl implements ID @Override public void dealNoParentDept() { List schools = list(Wrappers.lambdaQuery(new Dept()) - .eq(Dept::getDeptType, 0)); + .eq(Dept::getDeptType, DeptTypeEnum.SCHOOL_TYPE.getValue())); if (CollUtil.isNotEmpty(schools)) { List schoolIds = schools.stream().map(Dept::getDeptId).collect(Collectors.toList()); schoolIds.forEach(schoolId -> { List depts = list(Wrappers.lambdaQuery(new Dept()) - .eq(Dept::getVisible, 1) - .eq(Dept::getParentId, schoolId) - .ne(Dept::getDeptType, 4) - .ne(Dept::getDeptType, 5)); + .eq(Dept::getVisible, DeptVisibleTypeEnum.INVISIBLE_TYPE.getValue()) + .eq(Dept::getParentId, schoolId) + .ne(Dept::getDeptType, DeptTypeEnum.COMPANY_TYPE.getValue())); for (Dept dept : depts) { if (StrUtil.isNotBlank(dept.getCorpId())) { Dept parent = getOne(Wrappers.lambdaQuery(new Dept()) - .eq(Dept::getCorpId, dept.getCorpId()) - .eq(Dept::getWxId, dept.getParentWxId())); + .eq(Dept::getCorpId, dept.getCorpId()) + .eq(Dept::getWxId, dept.getParentWxId())); if (parent != null) { dept.setParentId(parent.getDeptId()); - dept.setVisible(0); + dept.setVisible(DeptVisibleTypeEnum.VISIBLE_TYPE.getValue()); updateById(dept); } } @@ -935,25 +972,25 @@ public class DeptServiceImpl extends ServiceImpl implements ID * * @param agentSchoolSelectPageDTO 查询代理商管理的学校列表数据请求类 * @return com.yida.data.common.core.common.ResultBean> + * com.yida.data.system.vo.AgentSchoolVO>> * @author ZYJ * @date 2021/9/27 17:05 */ @Override public ResultBean> listAgentSchoolPage( - AgentSchoolSelectPageDTO agentSchoolSelectPageDTO) { + AgentSchoolSelectPageDTO agentSchoolSelectPageDTO) { CurrentUser currentUser = FebsUtil.getCurrentUser(); // 查询下级部门信息 List childIdList = findListByParent(Collections.singletonList(currentUser.getDeptId()), 0) - .stream().map(Dept::getDeptId).collect(Collectors.toList()); + .stream().map(Dept::getDeptId).collect(Collectors.toList()); // 代理商管理员查询当前代理商所有数据 if (RoleEnum.ROLE_AGENT_ADMIN.equals(RoleUtil.getMaxRole(currentUser))) { childIdList.add(currentUser.getDeptId()); } // 具有创建学校列表的数据 自己创建的学校+当前登陆账号部门以下的学校 IPage iPage = this.baseMapper - .listAgentSchoolPage(agentSchoolSelectPageDTO.toPage(), agentSchoolSelectPageDTO, - childIdList, currentUser); + .listAgentSchoolPage(agentSchoolSelectPageDTO.toPage(), agentSchoolSelectPageDTO, + childIdList, currentUser); return ResultBean.buildSuccess(iPage); } @@ -990,7 +1027,7 @@ public class DeptServiceImpl extends ServiceImpl implements ID } // 查询学校已有微信支付配置信息 EduPayWxConfig payWxConfig = this.eduPayWxConfigService.getOne(Wrappers.lambdaQuery(new EduPayWxConfig()) - .eq(EduPayWxConfig::getSchoolId, dept.getDeptId())); + .eq(EduPayWxConfig::getSchoolId, dept.getDeptId())); if (Objects.isNull(payWxConfig)) { payWxConfig = new EduPayWxConfig(); } @@ -1018,7 +1055,7 @@ public class DeptServiceImpl extends ServiceImpl implements ID BeanUtils.copyProperties(dept, agentSchoolDetailVO); // 查询支付配置信息 EduPayWxConfig payWxConfig = this.eduPayWxConfigService.getOne(Wrappers.lambdaQuery(new EduPayWxConfig()) - .eq(EduPayWxConfig::getSchoolId, dept.getDeptId())); + .eq(EduPayWxConfig::getSchoolId, dept.getDeptId())); if (Objects.nonNull(payWxConfig)) { // 配置支付数据 agentSchoolDetailVO.setWxPublicId(payWxConfig.getWxPublicId()); @@ -1050,7 +1087,7 @@ public class DeptServiceImpl extends ServiceImpl implements ID // 修改学校状态 this.deptSchoolRelateMapper.update(deptSchoolRelate, - Wrappers.lambdaUpdate(new DeptSchoolRelate()).eq(DeptSchoolRelate::getSchoolId, schoolId)); + Wrappers.lambdaUpdate(new DeptSchoolRelate()).eq(DeptSchoolRelate::getSchoolId, schoolId)); // 修改相关登陆账号信息 SystemUser systemUser = new SystemUser(); systemUser.setUpdateDate(LocalDateTime.now()); @@ -1063,7 +1100,7 @@ public class DeptServiceImpl extends ServiceImpl implements ID } // 修改学校相关账号状态 this.userService.update(systemUser, - Wrappers.lambdaUpdate(new SystemUser()).eq(SystemUser::getDeptId, schoolId)); + Wrappers.lambdaUpdate(new SystemUser()).eq(SystemUser::getDeptId, schoolId)); return ResultBean.buildSuccess(); } @@ -1134,7 +1171,8 @@ public class DeptServiceImpl extends ServiceImpl implements ID deptSchoolInformationNature.setNature(integer); list.add(deptSchoolInformationNature); } - natureService.remove(Wrappers.query(new DeptSchoolInformationNature()).lambda().eq(DeptSchoolInformationNature::getInformationId, deptSchoolInformation.getId())); + natureService.remove(Wrappers.query(new DeptSchoolInformationNature()).lambda() + .eq(DeptSchoolInformationNature::getInformationId, deptSchoolInformation.getId())); natureService.saveBatch(list); } @@ -1146,11 +1184,11 @@ public class DeptServiceImpl extends ServiceImpl implements ID schoolLabel.setDeptSchoolId(deptSchoolInformation.getId()); schoolLabelList.add(schoolLabel); } - schoolLabelService.remove(Wrappers.query(new DeptSchoolLabel()).lambda().eq(DeptSchoolLabel::getDeptSchoolId, deptSchoolInformation.getId())); + schoolLabelService.remove(Wrappers.query(new DeptSchoolLabel()).lambda() + .eq(DeptSchoolLabel::getDeptSchoolId, deptSchoolInformation.getId())); schoolLabelService.saveBatch(schoolLabelList); } - String studentRange = information.getStudentRange(); List list = new ArrayList<>(); //分割招生范围 @@ -1167,7 +1205,8 @@ public class DeptServiceImpl extends ServiceImpl implements ID range.setDeptSchoolId(deptSchoolInformation.getId()); list.add(range); } - rangeService.remove(Wrappers.query(new DeptSchoolStudentRange()).lambda().eq(DeptSchoolStudentRange::getDeptSchoolId, deptSchoolInformation.getId())); + rangeService.remove(Wrappers.query(new DeptSchoolStudentRange()).lambda() + .eq(DeptSchoolStudentRange::getDeptSchoolId, deptSchoolInformation.getId())); rangeService.saveBatch(list); } @@ -1175,15 +1214,16 @@ public class DeptServiceImpl extends ServiceImpl implements ID @Override public Page findSchoolListByDeptId(Long deptId, String schoolName, Integer schoolType, - Integer natureType, String address, String tag, Page page, - Integer schoolOwnership) { + Integer natureType, String address, String tag, Page page, + Integer schoolOwnership) { - return informationService.findSchoolListByDeptId(deptId, schoolName, schoolType, natureType, address, tag, page, schoolOwnership); + return informationService + .findSchoolListByDeptId(deptId, schoolName, schoolType, natureType, address, tag, page, schoolOwnership); } @Override - public Page findSchoolPageList(String schoolName, List schoolType, List natureType, Page page, String tag, Long deptId, List schoolOwnership) { - + public Page findSchoolPageList(String schoolName, List schoolType, List natureType, + Page page, String tag, Long deptId, List schoolOwnership) { String[] tags = null; if (ObjectUtil.isNotEmpty(tag)) { @@ -1245,17 +1285,23 @@ public class DeptServiceImpl extends ServiceImpl implements ID } @Override - public List listPaySchool(Long deptId, String schoolName) { - List list = deptSchoolInformationMapper.listPaySchool(deptId, schoolName); -// // 返回数据 -// List returnList = new ArrayList<>(); -// // 判断是否包含缴费信息 -// list.forEach(schoolInformationDTO -> { -// EduDeptPayType deptPayType = commonService.getDeptPayWay(schoolInformationDTO.getSchoolId()); -// if (Objects.nonNull(deptPayType)) { -// returnList.add(schoolInformationDTO); -// } -// }); - return list; + public List findParentDeptByChild(List deptIds) { + List childList = list(Wrappers.lambdaQuery(new Dept()).in(Dept::getDeptId, deptIds)); + List allDeptList = list(); + List parentDeptList = new ArrayList<>(); + return getParentDeptList(allDeptList, childList, parentDeptList); + } + + + private List getParentDeptList(List depts, List childrenDeptList, List parentDeptList) { + if (CollectionUtils.isEmpty(childrenDeptList)) { + return parentDeptList; + } + parentDeptList.addAll(childrenDeptList); + List parentIds = childrenDeptList.stream().map(Dept::getParentId).filter(Objects::nonNull) + .collect(Collectors.toList()); + //查询父级部门 + List parentDepts = depts.stream().filter(x -> parentIds.contains(x.getDeptId())).collect(Collectors.toList()); + return getParentDeptList(depts, parentDepts, parentDeptList); } } diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/EduAppTemplateServiceImpl.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/EduAppTemplateServiceImpl.java new file mode 100644 index 0000000..143bc67 --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/EduAppTemplateServiceImpl.java @@ -0,0 +1,24 @@ +package com.yida.data.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.system.EduAppTemplate; +import com.yida.data.system.mapper.EduAppTemplateMapper; +import com.yida.data.system.service.EduAppTemplateService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * 企业微信服务商代开发应用模板service + * + * @author ZYJ + * @date 2022/11/3 + */ +@Slf4j +@Service +@RequiredArgsConstructor +@Transactional(rollbackFor = Exception.class) +public class EduAppTemplateServiceImpl extends ServiceImpl implements EduAppTemplateService { +} diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/EduBaseAppServiceImpl.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/EduBaseAppServiceImpl.java new file mode 100644 index 0000000..3a911d5 --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/EduBaseAppServiceImpl.java @@ -0,0 +1,26 @@ +package com.yida.data.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.system.EduBaseApp; +import com.yida.data.system.mapper.EduBaseAppMapper; +import com.yida.data.system.service.EduBaseAppService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * 基础应用信息(本地配置) Service实现 + * + * @author ZYJ + * @date 2023-06-28 14:57:58 + */ +@Slf4j +@Service +@RequiredArgsConstructor +@Transactional(rollbackFor = Exception.class) +public class EduBaseAppServiceImpl extends ServiceImpl + implements EduBaseAppService { + + +} diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/EduConsumeConfigServiceImpl.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/EduConsumeConfigServiceImpl.java new file mode 100644 index 0000000..fcbcd93 --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/EduConsumeConfigServiceImpl.java @@ -0,0 +1,25 @@ +package com.yida.data.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.consume.EduConsumeConfig; +import com.yida.data.system.mapper.EduConsumeConfigMapper; +import com.yida.data.system.service.EduConsumeConfigService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * 学校消费机服务器信息Service实现 + * + * @author ZYJ + * @date 2023-04-06 17:31:11 + */ +@Slf4j +@Service +@RequiredArgsConstructor +@Transactional(rollbackFor = Exception.class) +public class EduConsumeConfigServiceImpl extends ServiceImpl + implements EduConsumeConfigService { + +} diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/EduDeptFunctionServiceImpl.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/EduDeptFunctionServiceImpl.java new file mode 100644 index 0000000..30f3f2c --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/EduDeptFunctionServiceImpl.java @@ -0,0 +1,25 @@ +package com.yida.data.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.system.EduDeptFunction; +import com.yida.data.system.mapper.EduDeptFunctionMapper; +import com.yida.data.system.service.EduDeptFunctionService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +/** + * 部门对应的第三方系统功能Service实现 + * + * @author ZYJ + * @date 2023-02-20 15:29:05 + */ +@Service +@RequiredArgsConstructor +@Transactional(propagation = Propagation.SUPPORTS, readOnly = true) +public class EduDeptFunctionServiceImpl extends ServiceImpl + implements EduDeptFunctionService { + + +} diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/EduQywxServiceProviderSchoolServiceImpl.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/EduQywxServiceProviderSchoolServiceImpl.java new file mode 100644 index 0000000..4106d19 --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/EduQywxServiceProviderSchoolServiceImpl.java @@ -0,0 +1,26 @@ +package com.yida.data.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.system.EduQywxServiceProviderSchool; +import com.yida.data.system.mapper.EduQywxServiceProviderSchoolMapper; +import com.yida.data.system.service.EduQywxServiceProviderSchoolService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * 企业微信服务商-学校密文corpId对照表service + * + * @author ZYJ + * @date 2022/11/9 + */ +@Slf4j +@Service +@RequiredArgsConstructor +@Transactional(rollbackFor = Exception.class) +public class EduQywxServiceProviderSchoolServiceImpl extends ServiceImpl implements EduQywxServiceProviderSchoolService { + + +} diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/EduQywxServiceProviderServiceImpl.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/EduQywxServiceProviderServiceImpl.java new file mode 100644 index 0000000..8dd6370 --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/EduQywxServiceProviderServiceImpl.java @@ -0,0 +1,24 @@ +package com.yida.data.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.system.EduQywxServiceProvider; +import com.yida.data.system.mapper.EduQywxServiceProviderMapper; +import com.yida.data.system.service.EduQywxServiceProviderService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * 企业微信服务商service + * + * @author ZYJ + * @date 2022/11/3 + */ +@Slf4j +@Service +@RequiredArgsConstructor +@Transactional(rollbackFor = Exception.class) +public class EduQywxServiceProviderServiceImpl extends ServiceImpl implements EduQywxServiceProviderService { +} diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/MenuServiceImpl.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/MenuServiceImpl.java index fad8e00..3d26174 100644 --- a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/MenuServiceImpl.java +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/MenuServiceImpl.java @@ -54,7 +54,25 @@ public class MenuServiceImpl extends ServiceImpl implements IM @Override public List findUserRealMenus(String username, Integer selectType) { checkUser(username); - return this.baseMapper.findUserRealMenus(username, selectType); + List permissions = baseMapper.findUserPermissions(username); + List userRealMenus = baseMapper.findUserMenus(username, selectType); + permissions.addAll(userRealMenus.stream().filter(x -> x.getUserMenuType() == 0).collect(Collectors.toList())); + Iterator iterator = permissions.iterator(); + while (iterator.hasNext()) { + Menu next = iterator.next(); + for (Menu realMenu : userRealMenus) { + if (realMenu.getUserMenuType() == 1 && realMenu.getMenuId().equals(next.getMenuId())) { + iterator.remove(); + } + } + } + if (Objects.nonNull(selectType)) { + permissions = permissions.stream().filter(x -> x.getType().equals(selectType.toString())) + .peek(x->x.setUserMenuType(null)) + .distinct() + .collect(Collectors.toList()); + } + return permissions; } @Override diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/QywxCallbackServiceImpl.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/QywxCallbackServiceImpl.java index f589f85..d9e669e 100644 --- a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/QywxCallbackServiceImpl.java +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/QywxCallbackServiceImpl.java @@ -1,67 +1,68 @@ package com.yida.data.system.service.impl; import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.yida.data.common.core.entity.constant.AppConstant; -import com.yida.data.common.core.entity.constant.QywxConstant; import com.yida.data.common.core.entity.system.Dept; -import com.yida.data.common.core.entity.system.EduApp; -import com.yida.data.common.core.utils.WxUtil; -import com.yida.data.common.service.CommonService; +import com.yida.data.common.core.entity.system.EduQywxServiceProvider; +import com.yida.data.common.core.entity.system.EduQywxServiceProviderSchool; +import com.yida.data.common.core.entity.system.enums.DeptTypeEnum; +import com.yida.data.common.core.enums.QywxCallbackTypeEnum; +import com.yida.data.rabbit.constant.RabbitConstant; +import com.yida.data.rabbit.util.RabbitUtil; import com.yida.data.system.aes.WXBizMsgCrypt; -import com.yida.data.system.service.IDeptService; -import com.yida.data.system.service.IUserService; -import com.yida.data.system.service.QywxCallbackService; -import com.yida.data.system.service.QywxService; -import com.yida.data.user.feign.RemoteStudentService; -import com.yida.data.user.feign.RemoteTeacherService; +import com.yida.data.system.dto.QywxCallbackHandleDTO; +import com.yida.data.system.service.*; import io.seata.spring.annotation.GlobalTransactional; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.w3c.dom.Document; import org.w3c.dom.Element; -import org.w3c.dom.NodeList; import org.xml.sax.InputSource; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import java.io.StringReader; +/** + * 企业微信回调类 + * + * @author ZYJ + * @date 2023/10/27 17:15 + */ @Slf4j @Service @RequiredArgsConstructor public class QywxCallbackServiceImpl implements QywxCallbackService { private final IDeptService deptService; - private final IUserService userService; - private final QywxService qywxService; + private final EduQywxServiceProviderService eduQywxServiceProviderService; + private final EduQywxServiceProviderSchoolService eduQywxServiceProviderSchoolService; - private final WxUtil wxUtil; - private final CommonService commonService; - private final RemoteTeacherService remoteTeacherService; - private final RemoteStudentService remoteStudentService; + private final RabbitUtil rabbitUtil; @Override public String get(String corpId, String msgSignature, String timestamp, String nonce, String echostr) { Dept school = - deptService.getOne(Wrappers.lambdaQuery(new Dept()).eq(Dept::getCorpId, corpId).eq(Dept::getDeptType, 0)); - log.info("params:{},{},{},{},{}", corpId, msgSignature, timestamp, nonce, echostr); - WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(school.getWxCallToken(), school.getWxAesKey(), + deptService.getOne(Wrappers.lambdaQuery(new Dept()).eq(Dept::getCorpId, corpId).eq(Dept::getDeptType, DeptTypeEnum.SCHOOL_TYPE.getValue())); + log.info("部门验证url回调params:{},{},{},{},{}", corpId, msgSignature, timestamp, nonce, echostr); + WXBizMsgCrypt wxCpt = new WXBizMsgCrypt(school.getWxCallToken(), school.getWxAesKey(), school.getCorpId()); - String result = wxcpt.VerifyURL(msgSignature, timestamp, nonce, echostr); - log.info("call valid result:{}", result); + String result = wxCpt.VerifyURL(msgSignature, timestamp, nonce, echostr); + log.info("部门验证url回调call valid result:{}", result); return result; } @Override @GlobalTransactional - public void post(String corpId, String msgSignature, String timestamp, String nonce, String body) { - Dept school = - deptService.getOne(Wrappers.lambdaQuery(new Dept()).eq(Dept::getCorpId, corpId).eq(Dept::getDeptType, 0)); - log.info("params:{},{},{},{},{}", corpId, msgSignature, timestamp, nonce, body); - WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(school.getWxCallToken(), school.getWxAesKey(), + public String post(String corpId, String msgSignature, String timestamp, String nonce, String body) { + Dept school = deptService.getOne(Wrappers.lambdaQuery(new Dept()) + .eq(Dept::getCorpId, corpId) + .eq(Dept::getDeptType, DeptTypeEnum.SCHOOL_TYPE.getValue()) + ); + log.info("部门回调params:{},{},{},{},{}", corpId, msgSignature, timestamp, nonce, body); + WXBizMsgCrypt wxCpt = new WXBizMsgCrypt(school.getWxCallToken(), school.getWxAesKey(), school.getCorpId()); - String msg = wxcpt.DecryptMsg(msgSignature, timestamp, nonce, body); + String msg = wxCpt.DecryptMsg(msgSignature, timestamp, nonce, body); log.info("msg:{}", msg); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); StringReader sr = new StringReader(msg); @@ -73,135 +74,155 @@ public class QywxCallbackServiceImpl implements QywxCallbackService { document = db.parse(is); } catch (Exception e) { log.error("解析微信回调信息失败,msg:{}", e.getMessage()); + return "fail"; + } + // 发送消息给rabbitmq + rabbitUtil.convertAndSendMsg(RabbitConstant.QYWX_HANDLE_EXCHANGE, RabbitConstant.QYWX_HANDLE_KEY, + QywxCallbackHandleDTO.builder() + .root(document.getDocumentElement()) + .corpId(corpId) + .school(school) + .qywxCallbackTypeEnum(QywxCallbackTypeEnum.POST) + .build() + ); + return "success"; + } + + @Override + public String getNormal(String corpId, String msgSignature, String timestamp, String nonce, String echostr) { + EduQywxServiceProvider serviceProvider = + eduQywxServiceProviderService.getOne(Wrappers.lambdaQuery(new EduQywxServiceProvider()) + .eq(EduQywxServiceProvider::getCorpId, corpId)); + log.info("服务商验证url回调params:{},{},{},{},{}", corpId, msgSignature, timestamp, nonce, echostr); + WXBizMsgCrypt wxCpt = new WXBizMsgCrypt(serviceProvider.getWxCallToken(), serviceProvider.getWxAesKey(), + serviceProvider.getCorpId()); + String result = wxCpt.VerifyURL(msgSignature, timestamp, nonce, echostr, false); + log.info("服务商验证url回调call valid result:{}", result); + return result; + } + + @Override + public String postNormal(String corpId, String msgSignature, String timestamp, String nonce, String body) { + EduQywxServiceProvider serviceProvider = + eduQywxServiceProviderService.getOne(Wrappers.lambdaQuery(new EduQywxServiceProvider()) + .eq(EduQywxServiceProvider::getCorpId, corpId)); + log.info("服务商代开发应用模板接口回调params:{},{},{},{},{}", corpId, msgSignature, timestamp, nonce, body); + WXBizMsgCrypt wxCpt = new WXBizMsgCrypt(serviceProvider.getWxCallToken(), serviceProvider.getWxAesKey(), + serviceProvider.getCorpId()); + String msg = wxCpt.DecryptMsg(msgSignature, timestamp, nonce, body, false); + log.info("msg:{}", msg); + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + StringReader sr = new StringReader(msg); + InputSource is = new InputSource(sr); + DocumentBuilder db = null; + Document document = null; + try { + db = dbf.newDocumentBuilder(); + document = db.parse(is); + } catch (Exception e) { + log.error("服务商代开发应用模板接口回调信息失败,msg:{}", e.getMessage()); + return "fail"; + } + + // 发送消息给rabbitmq + rabbitUtil.convertAndSendMsg(RabbitConstant.QYWX_HANDLE_EXCHANGE, RabbitConstant.QYWX_HANDLE_KEY, + QywxCallbackHandleDTO.builder() + .root(document.getDocumentElement()) + .eduQywxServiceProvider(serviceProvider) + .qywxCallbackTypeEnum(QywxCallbackTypeEnum.POST_NORMAL) + .build() + ); + return "success"; + } + + @Override + public String getNormalCustomer(String providerCorpId, String corpId, String msgSignature, String timestamp, + String nonce, String echostr) { + Dept school = deptService.getOne(Wrappers.lambdaQuery(new Dept()).eq(Dept::getCorpId, corpId).eq(Dept::getDeptType, 0)); + log.info("服务商代开发应用客户验证url回调params:{},{},{},{},{},{}", providerCorpId, corpId, msgSignature, timestamp, nonce, echostr); + + EduQywxServiceProviderSchool providerSchool = eduQywxServiceProviderSchoolService.getOne(Wrappers.lambdaQuery(new EduQywxServiceProviderSchool()) + .eq(EduQywxServiceProviderSchool::getProviderCorpId, providerCorpId) + .eq(EduQywxServiceProviderSchool::getDeptOriginalCorpId, corpId)); + + WXBizMsgCrypt wxCpt = new WXBizMsgCrypt(school.getWxCallToken(), school.getWxAesKey(), + providerSchool.getDeptEncryptionCorpId()); + String result = wxCpt.VerifyURL(msgSignature, timestamp, nonce, echostr); + log.info("服务商代开发应用客户验证url回调call valid result:{}", result); + return result; + } + + @Override + public String postNormalCustomer(String providerCorpId, String corpId, String msgSignature, String timestamp, String nonce, String body) { + Dept school = + deptService.getOne(Wrappers.lambdaQuery(new Dept()).eq(Dept::getCorpId, corpId).eq(Dept::getDeptType, DeptTypeEnum.SCHOOL_TYPE.getValue())); + log.info("服务商代开发应用客户接口回调params: {},{},{},{},{},{}", providerCorpId, corpId, msgSignature, timestamp, nonce, body); + EduQywxServiceProviderSchool providerSchool = eduQywxServiceProviderSchoolService.getOne(Wrappers.lambdaQuery(new EduQywxServiceProviderSchool()) + .eq(EduQywxServiceProviderSchool::getProviderCorpId, providerCorpId) + .eq(EduQywxServiceProviderSchool::getDeptOriginalCorpId, corpId)); + + WXBizMsgCrypt wxCpt = new WXBizMsgCrypt(school.getWxCallToken(), school.getWxAesKey(), + providerSchool.getDeptEncryptionCorpId()); + String msg = wxCpt.DecryptMsg(msgSignature, timestamp, nonce, body); + log.info("msg:{}", msg); + return "success"; + } + + @Override + public String getEvent(String providerCorpId, String corpId, String msgSignature, String timestamp, String nonce, String echostr) { + Dept school = deptService.getOne(Wrappers.lambdaQuery(new Dept()).eq(Dept::getCorpId, corpId).eq(Dept::getDeptType, DeptTypeEnum.SCHOOL_TYPE.getValue())); + log.info("服务商代开发家校沟通验证url回调params:{},{},{},{},{},{}", providerCorpId, corpId, msgSignature, timestamp, nonce, echostr); + + EduQywxServiceProviderSchool providerSchool = eduQywxServiceProviderSchoolService.getOne(Wrappers.lambdaQuery(new EduQywxServiceProviderSchool()) + .eq(EduQywxServiceProviderSchool::getProviderCorpId, providerCorpId) + .eq(EduQywxServiceProviderSchool::getDeptOriginalCorpId, corpId)); + + WXBizMsgCrypt wxCpt = new WXBizMsgCrypt(school.getWxCallToken(), school.getWxAesKey(), + providerSchool.getDeptEncryptionCorpId()); + String result = wxCpt.VerifyURL(msgSignature, timestamp, nonce, echostr); + log.info("服务商代开发应用家校沟通验证url回调call valid result:{}", result); + return result; + } + + @Override + public String postEvent(String providerCorpId, String corpId, String msgSignature, String timestamp, String nonce, String body) { + Dept school = deptService.getOne(Wrappers.lambdaQuery(new Dept()).eq(Dept::getCorpId, corpId).eq(Dept::getDeptType, DeptTypeEnum.SCHOOL_TYPE.getValue())); + log.info("服务商代开发家校沟通回调params: {},{},{},{},{},{}", providerCorpId, corpId, msgSignature, timestamp, nonce, body); + EduQywxServiceProviderSchool providerSchool = eduQywxServiceProviderSchoolService.getOne(Wrappers.lambdaQuery(new EduQywxServiceProviderSchool()) + .eq(EduQywxServiceProviderSchool::getProviderCorpId, providerCorpId) + .eq(EduQywxServiceProviderSchool::getDeptOriginalCorpId, corpId)); + + WXBizMsgCrypt wxCpt = new WXBizMsgCrypt(school.getWxCallToken(), school.getWxAesKey(), + providerSchool.getDeptEncryptionCorpId()); + String msg = wxCpt.DecryptMsg(msgSignature, timestamp, nonce, body); + log.info("msg:{}", msg); + + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + StringReader sr = new StringReader(msg); + InputSource is = new InputSource(sr); + DocumentBuilder db = null; + Document document = null; + try { + db = dbf.newDocumentBuilder(); + document = db.parse(is); + } catch (Exception e) { + log.error("解析服务商代开发家校沟通回调信息失败,msg:{}", e.getMessage()); + return "false"; } Element root = document.getDocumentElement(); - - NodeList nodelist1 = root.getElementsByTagName("ChangeType"); - String changeType = nodelist1.item(0).getTextContent(); - - NodeList nodelist2 = root.getElementsByTagName("Event"); - String event = nodelist2.item(0).getTextContent(); - - if (QywxConstant.SCHOOL_CONTACT_EVENT.equals(event)) { - - EduApp app = commonService.getAppByCodeAndSchool(AppConstant.CONTACT_SCHOOL, null, school.getDeptId()); - String id = root.getElementsByTagName("Id").item(0).getTextContent(); - - switch (changeType) { - case QywxConstant.SCHOOL_DEPT_CREATE_TYPE: - qywxService.createSchoolDept(corpId, wxUtil.getAccessToken(app.getWxCorpId(), - app.getWxSecret()), Long.valueOf(id), school); - break; - case QywxConstant.SCHOOL_DEPT_UPDATE_TYPE: - qywxService.updateSchoolDept(wxUtil.getAccessToken(app.getWxCorpId(), - app.getWxSecret()), Long.valueOf(id), school); - break; - case QywxConstant.SCHOOL_DEPT_DELETE_TYPE: - qywxService.deleteSchoolDept(Long.valueOf(id), school); - break; - case QywxConstant.STUDENT_CREATE_TYPE: - case QywxConstant.STUDENT_UPDATE_TYPE: - qywxService.changeStudent(wxUtil.getAccessToken(app.getWxCorpId(), - app.getWxSecret()), id, school); - break; - case QywxConstant.STUDENT_DELETE_TYPE: - qywxService.deleteStudent(id, school.getDeptId()); - break; - case QywxConstant.PARENT_CREATE_TYPE: - // 新增家长可能是创建学生时创建,等待2s确保学生创建完成 - try { - Thread.sleep(2000); - } catch (Exception e) { - - } - case QywxConstant.PARENT_UPDATE_TYPE: - qywxService.updateParent(wxUtil.getAccessToken(app.getWxCorpId(), - app.getWxSecret()), id, school.getDeptId()); - break; - case QywxConstant.PARENT_DELETE_TYPE: - qywxService.deleteParent(id, school.getDeptId()); - break; - case QywxConstant.PARENT_SUBSCRIBE_TYPE: - log.info("进入家长关注事件回调"); - // 调用家长关注发送通知方法 - qywxService.sendParentSubscribeMessage(id, school.getDeptId()); - break; - case QywxConstant.PARENT_UNSUBSCRIBE_TYPE: - log.info("进入家长取消关注事件回调"); - break; - default: - break; - } - } - - if (QywxConstant.CONTACT_EVENT.equals(event)) { - String userid = null, phone = null, name = null, gender = null, avatar = null, department = null, - isLeader = null, mainDepartment = null, email = null; - if (root.getElementsByTagName("UserID").getLength() != 0) { - userid = root.getElementsByTagName("UserID").item(0).getTextContent(); - } - if (root.getElementsByTagName("Mobile").getLength() != 0) { - phone = root.getElementsByTagName("Mobile").item(0).getTextContent(); - } - if (root.getElementsByTagName("Name").getLength() != 0) { - name = root.getElementsByTagName("Name").item(0).getTextContent(); - } - if (root.getElementsByTagName("Gender").getLength() != 0) { - gender = root.getElementsByTagName("Gender").item(0).getTextContent(); - } - if (root.getElementsByTagName("Avatar").getLength() != 0) { - avatar = root.getElementsByTagName("Avatar").item(0).getTextContent(); - } - if (root.getElementsByTagName("Department").getLength() != 0) { - department = root.getElementsByTagName("Department").item(0).getTextContent(); - } - if (root.getElementsByTagName("IsLeaderInDept").getLength() != 0) { - isLeader = root.getElementsByTagName("IsLeaderInDept").item(0).getTextContent(); - } - if (root.getElementsByTagName("MainDepartment").getLength() != 0) { - mainDepartment = root.getElementsByTagName("MainDepartment").item(0).getTextContent(); - } - if (root.getElementsByTagName("Email").getLength() != 0) { - email = root.getElementsByTagName("Email").item(0).getTextContent(); - } - - - String deptId = null, deptName = null, deptParentId = null, order = null; - if (root.getElementsByTagName("Id").getLength() != 0) { - deptId = root.getElementsByTagName("Id").item(0).getTextContent(); - } - if (root.getElementsByTagName("Name").getLength() != 0) { - deptName = root.getElementsByTagName("Name").item(0).getTextContent(); - } - if (root.getElementsByTagName("ParentId").getLength() != 0) { - deptParentId = root.getElementsByTagName("ParentId").item(0).getTextContent(); - } - if (root.getElementsByTagName("Order").getLength() != 0) { - order = root.getElementsByTagName("Order").item(0).getTextContent(); - } - - switch (changeType) { - case QywxConstant.USER_CREATE_TYPE: - qywxService.createUser(name, userid, phone, email, gender, avatar, department, isLeader, - mainDepartment, school); - break; - case QywxConstant.USER_UPDATE_TYPE: - qywxService.updateUser(name, userid, phone, email, gender, avatar, department, isLeader, - mainDepartment, school); - break; - case QywxConstant.USER_DELETE_TYPE: - qywxService.deleteUser(userid, school.getDeptId()); - break; - case QywxConstant.DEPT_CREATE_TYPE: - qywxService.createDept(deptId, deptName, deptParentId, order, school); - break; - case QywxConstant.DEPT_UPDATE_TYPE: - qywxService.updateDept(deptId, deptName, deptParentId, school.getDeptId()); - break; - case QywxConstant.DEPT_DELETE_TYPE: - qywxService.deleteDept(deptId, school.getDeptId()); - break; - } + if (root.getElementsByTagName("Event").getLength() == 0) { + log.info("暂不处理当前回调数据"); + return "success"; } + // 发送消息给rabbitmq + rabbitUtil.convertAndSendMsg(RabbitConstant.QYWX_HANDLE_EXCHANGE, RabbitConstant.QYWX_HANDLE_KEY, + QywxCallbackHandleDTO.builder() + .root(root) + .school(school) + .providerSchool(providerSchool) + .qywxCallbackTypeEnum(QywxCallbackTypeEnum.POST_EVENT) + .build() + ); + return "success"; } } diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/QywxHandleServiceImpl.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/QywxHandleServiceImpl.java new file mode 100644 index 0000000..2a0607c --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/QywxHandleServiceImpl.java @@ -0,0 +1,246 @@ +package com.yida.data.system.service.impl; + +import cn.hutool.core.thread.ThreadUtil; +import com.yida.data.common.core.entity.constant.AppConstant; +import com.yida.data.common.core.entity.constant.QywxConstant; +import com.yida.data.common.core.entity.constant.QywxServiceProviderConstant; +import com.yida.data.common.core.entity.system.Dept; +import com.yida.data.common.core.entity.system.EduApp; +import com.yida.data.common.core.entity.system.EduQywxServiceProvider; +import com.yida.data.common.core.entity.system.EduQywxServiceProviderSchool; +import com.yida.data.common.core.utils.WxUtil; +import com.yida.data.common.service.CommonService; +import com.yida.data.system.dto.QywxCallbackHandleDTO; +import com.yida.data.system.service.QywxHandleService; +import com.yida.data.system.service.QywxService; +import com.yida.data.system.service.QywxServiceProviderService; +import io.seata.spring.annotation.GlobalTransactional; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; + +/** + * 企业微信回调mq处理类 + * + * @author ZYJ + * @date 2023/10/27 16:43 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class QywxHandleServiceImpl implements QywxHandleService { + + private final QywxService qywxService; + private final QywxServiceProviderService qywxServiceProviderService; + + private final WxUtil wxUtil; + private final CommonService commonService; + + @Override + @GlobalTransactional + public void handlePostCallback(QywxCallbackHandleDTO dto) { + Element root = dto.getRoot(); + String corpId = dto.getCorpId(); + Dept school = dto.getSchool(); + + NodeList nodeList1 = root.getElementsByTagName("ChangeType"); + String changeType = nodeList1.item(0).getTextContent(); + + NodeList nodeList2 = root.getElementsByTagName("Event"); + String event = nodeList2.item(0).getTextContent(); + + if (QywxConstant.SCHOOL_CONTACT_EVENT.equals(event)) { + + EduApp app = commonService.getAppByCodeAndSchool(AppConstant.CONTACT_SCHOOL, null, school.getDeptId()); + String id = root.getElementsByTagName("Id").item(0).getTextContent(); + + switch (changeType) { + case QywxConstant.SCHOOL_DEPT_CREATE_TYPE: + qywxService.createSchoolDept(corpId, wxUtil.getAccessToken(app.getWxCorpId(), + app.getWxSecret()), Long.valueOf(id), school); + break; + case QywxConstant.SCHOOL_DEPT_UPDATE_TYPE: + qywxService.updateSchoolDept(wxUtil.getAccessToken(app.getWxCorpId(), + app.getWxSecret()), Long.valueOf(id), school); + break; + case QywxConstant.SCHOOL_DEPT_DELETE_TYPE: + qywxService.deleteSchoolDept(Long.valueOf(id), school); + break; + case QywxConstant.STUDENT_CREATE_TYPE: + case QywxConstant.STUDENT_UPDATE_TYPE: + qywxService.changeStudent(wxUtil.getAccessToken(app.getWxCorpId(), + app.getWxSecret()), id, school); + break; + case QywxConstant.STUDENT_DELETE_TYPE: + qywxService.deleteStudent(id, school.getDeptId()); + break; + case QywxConstant.PARENT_CREATE_TYPE: + // 新增家长可能是创建学生时创建,等待2s确保学生创建完成 + ThreadUtil.sleep(2000); + case QywxConstant.PARENT_UPDATE_TYPE: + qywxService.updateParent(wxUtil.getAccessToken(app.getWxCorpId(), + app.getWxSecret()), id, school.getDeptId()); + break; + case QywxConstant.PARENT_DELETE_TYPE: + qywxService.deleteParent(id, school.getDeptId()); + break; + case QywxConstant.PARENT_SUBSCRIBE_TYPE: + log.info("进入家长关注事件回调"); + // 调用家长关注发送通知方法 + qywxService.sendParentSubscribeMessage(id, school.getDeptId()); + break; + case QywxConstant.PARENT_UNSUBSCRIBE_TYPE: + log.info("进入家长取消关注事件回调"); + break; + default: + break; + } + } + + if (QywxConstant.CONTACT_EVENT.equals(event)) { + String userid = null, phone = null, name = null, gender = null, avatar = null, department = null, + isLeader = null, mainDepartment = null, email = null; + if (root.getElementsByTagName("UserID").getLength() != 0) { + userid = root.getElementsByTagName("UserID").item(0).getTextContent(); + } + if (root.getElementsByTagName("Mobile").getLength() != 0) { + phone = root.getElementsByTagName("Mobile").item(0).getTextContent(); + } + if (root.getElementsByTagName("Name").getLength() != 0) { + name = root.getElementsByTagName("Name").item(0).getTextContent(); + } + if (root.getElementsByTagName("Gender").getLength() != 0) { + gender = root.getElementsByTagName("Gender").item(0).getTextContent(); + } + if (root.getElementsByTagName("Avatar").getLength() != 0) { + avatar = root.getElementsByTagName("Avatar").item(0).getTextContent(); + } + if (root.getElementsByTagName("Department").getLength() != 0) { + department = root.getElementsByTagName("Department").item(0).getTextContent(); + } + if (root.getElementsByTagName("IsLeaderInDept").getLength() != 0) { + isLeader = root.getElementsByTagName("IsLeaderInDept").item(0).getTextContent(); + } + if (root.getElementsByTagName("MainDepartment").getLength() != 0) { + mainDepartment = root.getElementsByTagName("MainDepartment").item(0).getTextContent(); + } + if (root.getElementsByTagName("Email").getLength() != 0) { + email = root.getElementsByTagName("Email").item(0).getTextContent(); + } + + + String deptId = null, deptName = null, deptParentId = null, order = null; + if (root.getElementsByTagName("Id").getLength() != 0) { + deptId = root.getElementsByTagName("Id").item(0).getTextContent(); + } + if (root.getElementsByTagName("Name").getLength() != 0) { + deptName = root.getElementsByTagName("Name").item(0).getTextContent(); + } + if (root.getElementsByTagName("ParentId").getLength() != 0) { + deptParentId = root.getElementsByTagName("ParentId").item(0).getTextContent(); + } + if (root.getElementsByTagName("Order").getLength() != 0) { + order = root.getElementsByTagName("Order").item(0).getTextContent(); + } + + switch (changeType) { + case QywxConstant.USER_CREATE_TYPE: + qywxService.createUser(name, userid, phone, email, gender, avatar, department, isLeader, + mainDepartment, school); + break; + case QywxConstant.USER_UPDATE_TYPE: + qywxService.updateUser(name, userid, phone, email, gender, avatar, department, isLeader, + mainDepartment, school); + break; + case QywxConstant.USER_DELETE_TYPE: + qywxService.deleteUser(userid, school.getDeptId()); + break; + case QywxConstant.DEPT_CREATE_TYPE: + qywxService.createDept(deptId, deptName, deptParentId, order, school); + break; + case QywxConstant.DEPT_UPDATE_TYPE: + qywxService.updateDept(deptId, deptName, deptParentId, school.getDeptId()); + break; + case QywxConstant.DEPT_DELETE_TYPE: + qywxService.deleteDept(deptId, school.getDeptId()); + break; + default: + break; + } + } + } + + @Override + @GlobalTransactional + public void handlePostNormalCallback(QywxCallbackHandleDTO dto) { + Element root = dto.getRoot(); + EduQywxServiceProvider serviceProvider = dto.getEduQywxServiceProvider(); + + // 通知消息类型 + NodeList nodeList = root.getElementsByTagName("InfoType"); + String infoType = nodeList.item(0).getTextContent(); + // 模板id + NodeList nodeListSuiteId = root.getElementsByTagName("SuiteId"); + String suiteId = nodeListSuiteId.item(0).getTextContent(); + // 通讯录变更 + if (QywxConstant.CONTACT_EVENT.equals(infoType)) { + log.info("模板回调进入通讯录变更事件"); + qywxServiceProviderService.handleConcat(root, serviceProvider, suiteId); + } + switch (infoType) { + // 安装应用授权 + case QywxServiceProviderConstant.SERVICE_CREATE_AUTH: + // 临时授权码 + NodeList nodeListAuthCode = root.getElementsByTagName("AuthCode"); + String authCode = nodeListAuthCode.item(0).getTextContent(); + qywxServiceProviderService.installTemplateApp(suiteId, authCode, serviceProvider); + break; + // 客户删除应用 + case QywxServiceProviderConstant.SERVICE_CANCEL_AUTH: + // 授权企业加密corpId + NodeList nodeListAuthCorpId = root.getElementsByTagName("AuthCorpId"); + String authCorpId = nodeListAuthCorpId.item(0).getTextContent(); + qywxServiceProviderService.deleteTemplateApp(suiteId, authCorpId, serviceProvider); + break; + // 待开发应用模板suite_ticket + case QywxServiceProviderConstant.TEMPLATE_SUITE_TICKET: + // 模板id + NodeList nodeListTicket = root.getElementsByTagName("SuiteTicket"); + String suiteTicket = nodeListTicket.item(0).getTextContent(); + qywxServiceProviderService.handleTemplateSuiteTicket(suiteId, suiteTicket); + break; + // 代开发应用重置secret + case QywxServiceProviderConstant.RESET_PERMANENT_CODE: + // 临时授权码 + NodeList nodeListResetAuthCode = root.getElementsByTagName("AuthCode"); + String resetAuthCode = nodeListResetAuthCode.item(0).getTextContent(); + qywxServiceProviderService.resetTemplateAppAuthCode(suiteId, resetAuthCode, serviceProvider); + break; + default: + break; + } + } + + @Override + @GlobalTransactional + public void handlePostEventCallback(QywxCallbackHandleDTO dto) { + Element root = dto.getRoot(); + Dept school = dto.getSchool(); + EduQywxServiceProviderSchool providerSchool = dto.getProviderSchool(); + + NodeList nodeListEvent = root.getElementsByTagName("Event"); + String event = nodeListEvent.item(0).getTextContent(); + + if (QywxConstant.SCHOOL_CONTACT_EVENT.equals(event)) { + log.info("进入家校沟通通讯录处理事件"); + qywxServiceProviderService.handleSchoolConcat(root, providerSchool, school); + } + // 通讯录变更 + if (QywxConstant.CONTACT_EVENT.equals(event)) { + log.info("进入通讯录变更事件"); + qywxServiceProviderService.handleConcat(root, providerSchool); + } + } +} diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/QywxServiceImpl.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/QywxServiceImpl.java index 700d239..9a0cb35 100644 --- a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/QywxServiceImpl.java +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/QywxServiceImpl.java @@ -95,7 +95,7 @@ public class QywxServiceImpl implements QywxService { } EduApp app = eduAppMapper.selectOne(Wrappers.lambdaQuery(new EduApp()).eq(EduApp::getDeptId, - schoolId).eq(EduApp::getName, AppConstant.CONTACT_SCHOOL)); + schoolId).eq(EduApp::getCode, AppConstant.CONTACT_SCHOOL)); List deptList = wxUtil.listSchoolDept(wxUtil.getAccessToken(app.getWxCorpId(), app.getWxSecret()), null); List camps = new ArrayList<>(); List section = new ArrayList<>(); @@ -113,7 +113,7 @@ public class QywxServiceImpl implements QywxService { dept.setDeptType(Integer.valueOf(map.get("type").toString())); dept.setDeptName(map.get("name").toString()); dept.setSchoolId(schoolId); - dept.setParentId(schoolId); + dept.setParentId(-schoolId); switch (dept.getDeptType()) { case 1: // 班级 @@ -164,7 +164,8 @@ public class QywxServiceImpl implements QywxService { wxIdAndDaHuaId.put(dept.getWxId(), dept.getDaHuaId()); } if (CollUtil.isNotEmpty(teacherList.get(dept.getWxId()))) { - remoteTeacherService.dealWxTeacherChange(schoolId, dept.getDeptId(), null, null, null, teacherList.get(dept.getWxId())); + remoteTeacherService.dealWxTeacherChange(schoolId, dept.getDeptId(), null, null, null, + teacherList.get(dept.getWxId()), dept.getWxId()); } } for (EduUserDept dept : section) { @@ -181,7 +182,8 @@ public class QywxServiceImpl implements QywxService { for (EduUserDept dept : section) { wxIdAndId.put(dept.getWxId(), dept.getDeptId()); if (CollUtil.isNotEmpty(teacherList.get(dept.getWxId()))) { - remoteTeacherService.dealWxTeacherChange(schoolId, dept.getParentId(), dept.getDeptId(), null, null, teacherList.get(dept.getWxId())); + remoteTeacherService.dealWxTeacherChange(schoolId, dept.getParentId(), dept.getDeptId(), null, null, + teacherList.get(dept.getWxId()), dept.getWxId()); } } for (EduUserDept dept : grade) { @@ -204,7 +206,7 @@ public class QywxServiceImpl implements QywxService { dept.getParentId(), dept.getDeptId(), null, - teacherList.get(dept.getWxId())); + teacherList.get(dept.getWxId()), dept.getWxId()); } } for (EduUserDept dept : clazz) { @@ -224,7 +226,7 @@ public class QywxServiceImpl implements QywxService { deptParent.get(dept.getParentId()), dept.getParentId(), dept.getDeptId(), - teacherList.get(dept.getWxId())); + teacherList.get(dept.getWxId()), dept.getWxId()); } } } @@ -354,7 +356,7 @@ public class QywxServiceImpl implements QywxService { public void initUser(Long schoolId, CurrentUser currentUser) { Dept school = deptService.getById(schoolId); EduApp app = eduAppMapper.selectOne(Wrappers.lambdaQuery(new EduApp()).eq(EduApp::getDeptId, - schoolId).eq(EduApp::getName, AppConstant.CONTACT_SCHOOL)); + schoolId).eq(EduApp::getCode, AppConstant.CONTACT_SCHOOL)); JSONArray student = wxUtil.getStudentList(wxUtil.getAccessToken(app.getWxCorpId(), app.getWxSecret()), 1L); int size = 2; @@ -489,8 +491,10 @@ public class QywxServiceImpl implements QywxService { List saveDeptList = new ArrayList<>(); List deptList = wxUtil.listSchoolDept(accessToken, deptWxId); for (Map map : deptList) { - EduUserDept dept = remoteUserDeptService.getUserDeptByDeptAndWx(Collections.singletonList(-school.getDeptId()), - Long.valueOf(map.get("id").toString())).getData(); + // 查询的家校部门数据的部门id + Long wxDeptId = Long.valueOf(map.get("id").toString()); + EduUserDept dept = remoteUserDeptService.getUserDeptByDeptAndWx( + Collections.singletonList(-school.getDeptId()), wxDeptId).getData(); dept.setDeptName((String) map.get("name")); if (ObjectUtil.isNotNull(map.get("order"))) { dept.setOrderNum((Integer) map.get("order")); @@ -505,7 +509,7 @@ public class QywxServiceImpl implements QywxService { classId = dept.getDeptId(); gradeId = dept.getParentId(); // 查询学段信息 - EduUserDept section = this.remoteUserDeptService.getParentByDeptId(gradeId).getData(); + EduUserDept section = remoteUserDeptService.getParentByDeptId(gradeId).getData(); sectionId = section.getDeptId(); campusId = section.getParentId(); break; @@ -513,7 +517,7 @@ public class QywxServiceImpl implements QywxService { // 年级 gradeId = dept.getDeptId(); sectionId = dept.getParentId(); - campusId = this.remoteUserDeptService.getByDeptId(sectionId).getData().getParentId(); + campusId = remoteUserDeptService.getByDeptId(sectionId).getData().getParentId(); break; case 3: // 学段 @@ -525,13 +529,18 @@ public class QywxServiceImpl implements QywxService { campusId = dept.getDeptId(); break; default: - log.error("家校部门类型错误: {}", dept.getDeptType()); + log.error("家校部门类型错误, 部门信息:{}", dept); break; } - // 获取老师列表 - List teacherList = (List) map.get("department_admins"); - log.info("teachers:{},dept:{}", teacherList, dept); - remoteTeacherService.dealWxTeacherChange(school.getDeptId(), campusId, sectionId, gradeId, classId, teacherList); + // 仅处理当前部门负责人 + if (deptWxId.equals(wxDeptId)) { + // 获取老师列表 + List teacherList = (List) map.get("department_admins"); + log.info("teachers:{},dept:{}", teacherList, dept); + if (CollUtil.isNotEmpty(teacherList)) { + remoteTeacherService.dealWxTeacherChange(school.getDeptId(), campusId, sectionId, gradeId, classId, teacherList, deptWxId); + } + } saveDeptList.add(dept); // 更新大华部门 if (school.getSchoolType().contains(Dept.TYPE_DAHUA)) { @@ -539,14 +548,15 @@ public class QywxServiceImpl implements QywxService { if (UserDeptTypeEnum.CAMPUS_TYPE.getValue().equals(dept.getDeptType())) { // 学区的上级大华id是学校大华id parentDaHuaId = school.getDahuaId(); - } else { - EduUserDept parent = this.remoteUserDeptService.getByDeptId(dept.getParentId()).getData(); + } else { + EduUserDept parent = remoteUserDeptService.getByDeptId(dept.getParentId()).getData(); parentDaHuaId = parent.getDaHuaId(); } DaHuaUtil.updateDept(dept.getDaHuaId(), parentDaHuaId, dept.getDeptName()); } } - this.remoteUserDeptService.updateBatchUserDept(saveDeptList); + remoteUserDeptService.updateBatchUserDept(saveDeptList); + log.info("修改家校部门完成"); } /** @@ -559,7 +569,7 @@ public class QywxServiceImpl implements QywxService { log.info("params:{},{},{}", deptWxId, -school.getDeptId(), userDept); if (userDept != null) { // 未在其他删除回调事件中被删除 - this.remoteUserDeptService.deleteUserDeptRecur( + remoteUserDeptService.deleteUserDeptRecur( DeleteUserDeptDTO.builder() .deptIdList(Collections.singletonList(userDept.getDeptId())) .school(school) @@ -592,14 +602,20 @@ public class QywxServiceImpl implements QywxService { */ @Override public void updateDept(String deptId, String deptName, String parentId, Long schoolId) { - Dept dept = deptService.getSysDeptByDeptAndWx(Arrays.asList(schoolId), Long.valueOf(deptId)); + Dept dept = deptService.getSysDeptByDeptAndWx(Collections.singletonList(schoolId), Long.valueOf(deptId)); dept.setDeptName(deptName); // 部门类型 dept.setDeptType(DeptTypeEnum.DEPARTMENT_TYPE.getValue()); dept.setWxId(Long.valueOf(deptId)); - if (parentId != null) { - Dept parent = deptService.getSysDeptByDeptAndWx(Arrays.asList(schoolId), Long.valueOf(parentId)); - dept.setParentWxId(Long.valueOf(parentId)); + if (StrUtil.isNotBlank(parentId)) { + Dept parent; + Long parentWxId = Long.valueOf(parentId); + if (parentWxId == 1L) { + parent = deptService.getById(schoolId); + } else { + parent = deptService.getSysDeptByDeptAndWx(Collections.singletonList(schoolId), parentWxId); + } + dept.setParentWxId(parentWxId); dept.setParentId(parent.getDeptId()); dept.setAreaId(parent.getAreaId()); } @@ -669,7 +685,7 @@ public class QywxServiceImpl implements QywxService { log.info("学生所属部门,student:{},deptId:{},wxId:{}", student, Objects.requireNonNull(dept).getDeptId(), deptWxId); EduStudent eduStudent = new EduStudent(); - eduStudent.setType(0); +// eduStudent.setType(0); eduStudent.setStuName(student.get("name").toString()); // 班级信息 eduStudent.setClassId(dept.getDeptId()); @@ -809,6 +825,88 @@ public class QywxServiceImpl implements QywxService { remoteTeacherService.saveStaffBySchoolAndWx(eduStaff); } +// /** +// * 响应更新企业用户事件 +// */ +// @Override +// public void updateUser(String name, String wxId, String phone, String email, +// String gender, String avatar, String department, String isLeader, +// String mainDepartment, Dept school) { +// EduStaff eduStaff = new EduStaff(); +// if (StrUtil.isNotBlank(phone)) { +// SystemUser user = userService.findByName(phone); +// if (user == null) { +// user = new SystemUser(); +// user.setAvatar(avatar); +// user.setMobile(phone); +// user.setEmail(email); +// user.setUsername(StrUtil.isNotBlank(phone) ? phone : email); +// user.setNickname(name); +// user.setDeptId(school.getDeptId()); +// user.setStatus("1"); +// user.setSex("1".equals(gender) ? "0" : "2".equals(gender) ? "1" : "2"); +// user.setUserOrigin(0); +// user.setTeacherWxId(wxId); +// user.setUserType(1); +// userService.createUser(user); +// eduStaff.setYidaAppUserId(user.getYidaAppUserId()); +// } +// eduStaff.setSysUserId(user.getUserId()); +// } else { +// SystemUser user = +// userService.getOne(Wrappers.lambdaQuery(new SystemUser()).eq(SystemUser::getTeacherWxId +// , wxId).eq(SystemUser::getDeptId, school.getDeptId())); +// if (user == null) { +// user = new SystemUser(); +// user.setAvatar(avatar); +// user.setMobile(phone); +// user.setEmail(email); +// user.setUsername(StrUtil.isNotBlank(phone) ? phone : email); +// user.setNickname(name); +// user.setDeptId(school.getDeptId()); +// user.setStatus("1"); +// user.setSex("1".equals(gender) ? "0" : "2".equals(gender) ? "1" : "2"); +// user.setUserOrigin(0); +// user.setTeacherWxId(wxId); +// user.setUserType(1); +// userService.createUser(user); +// eduStaff.setYidaAppUserId(user.getYidaAppUserId()); +// } +// eduStaff.setSysUserId(user.getUserId()); +// } +// eduStaff.setWxId(wxId); +// eduStaff.setMobile(phone); +// eduStaff.setName(name); +// eduStaff.setAvatar(avatar); +// eduStaff.setSchoolId(school.getDeptId()); +// eduStaff.setSchoolName(school.getDeptName()); +// eduStaff.setSex("1".equals(gender) ? "0" : "2".equals(gender) ? "1" : "2"); +// +// // 成员部门信息 +// String[] departmentList = StrUtil.split(department, ","); +// String[] isLeaderList = StrUtil.split(isLeader, ","); +// if (ArrayUtil.isNotEmpty(departmentList)) { +// List staffDeptList = new ArrayList<>(); +// for (int i = 0; i < departmentList.length; i++) { +// // 成员的每个部门信息 +// EduStaffDept staffDept = new EduStaffDept(); +// staffDept.setStaffName(eduStaff.getName()); +// staffDept.setDeptWxId(Long.valueOf(departmentList[i])); +// Dept sysDept = ("1".equals(departmentList[i]) +// ? school +// : deptService.getSysDeptByDeptAndWx(Arrays.asList(school.getDeptId()), staffDept.getDeptWxId())); +// staffDept.setDeptId(sysDept.getDeptId()); +// staffDept.setDeptName(sysDept.getDeptName()); +// staffDept.setIsLeader(Integer.valueOf(isLeaderList[i])); +// staffDept.setIsMain(ObjectUtil.equal(mainDepartment, +// departmentList[i]) ? 0 : 1); +// staffDeptList.add(staffDept); +// } +// eduStaff.setStaffDept(staffDeptList); +// } +// remoteTeacherService.saveStaffBySchoolAndWx(eduStaff); +// } + /** * 响应更新企业用户事件 */ @@ -816,9 +914,12 @@ public class QywxServiceImpl implements QywxService { public void updateUser(String name, String wxId, String phone, String email, String gender, String avatar, String department, String isLeader, String mainDepartment, Dept school) { - EduStaff eduStaff = new EduStaff(); + EduStaff eduStaff = remoteStaffService.getStaffByWxOrMobileOrOpenId(wxId, null, null, school.getDeptId()).getData(); + if (Objects.isNull(eduStaff)) { + eduStaff = new EduStaff(); + } if (StrUtil.isNotBlank(phone)) { - SystemUser user = userService.findByName(phone); + SystemUser user = userService.findByMobile(phone); if (user == null) { user = new SystemUser(); user.setAvatar(avatar); @@ -834,12 +935,14 @@ public class QywxServiceImpl implements QywxService { user.setUserType(1); userService.createUser(user); eduStaff.setYidaAppUserId(user.getYidaAppUserId()); + eduStaff.setSysUserId(user.getUserId()); } - eduStaff.setSysUserId(user.getUserId()); + eduStaff.setMobile(phone); } else { - SystemUser user = - userService.getOne(Wrappers.lambdaQuery(new SystemUser()).eq(SystemUser::getTeacherWxId - , wxId).eq(SystemUser::getDeptId, school.getDeptId())); + SystemUser user = null; + if (Objects.nonNull(eduStaff.getId())) { + user = userService.getById(eduStaff.getSysUserId()); + } if (user == null) { user = new SystemUser(); user.setAvatar(avatar); @@ -855,16 +958,21 @@ public class QywxServiceImpl implements QywxService { user.setUserType(1); userService.createUser(user); eduStaff.setYidaAppUserId(user.getYidaAppUserId()); + eduStaff.setSysUserId(user.getUserId()); } - eduStaff.setSysUserId(user.getUserId()); } eduStaff.setWxId(wxId); - eduStaff.setMobile(phone); - eduStaff.setName(name); - eduStaff.setAvatar(avatar); + if (StrUtil.isNotBlank(name)) { + eduStaff.setName(name); + } + if (StrUtil.isNotBlank(avatar)) { + eduStaff.setAvatar(avatar); + } eduStaff.setSchoolId(school.getDeptId()); eduStaff.setSchoolName(school.getDeptName()); - eduStaff.setSex("1".equals(gender) ? "0" : "2".equals(gender) ? "1" : "2"); + if (StrUtil.isNotBlank(gender)) { + eduStaff.setSex("1".equals(gender) ? "0" : "2".equals(gender) ? "1" : "2"); + } // 成员部门信息 String[] departmentList = StrUtil.split(department, ","); @@ -909,7 +1017,7 @@ public class QywxServiceImpl implements QywxService { */ @Override public void sendParentSubscribeMessage(String parentId, Long schoolId) { - EduApp app = commonService.getAppByCodeAndSchool(AppConstant.SCORE_PARENT, null, schoolId); + EduApp app = commonService.getAppByCodeAndSchool(AppConstant.INDEX_PARENT, null, schoolId); // 创建发送通知实体类 TextSchoolNotice textSchoolNotice = new TextSchoolNotice(); // 传入被通知的家长id @@ -933,4 +1041,47 @@ public class QywxServiceImpl implements QywxService { log.error("家长关注发送通知方法失败, 当前学校-->{} 没有默认消息数据: ", schoolId); } } + + @Override + public void updateUserInfo(String userId, Dept school, EduApp app) { + // 查询用户详细信息 + JSONObject userDetail = wxUtil.getUserDetail(wxUtil.getAccessToken(app.getWxCorpId(), app.getWxSecret()), userId); + // 查询职工数据 + EduStaff eduStaff = remoteStaffService.getStaffByWxOrMobileOrOpenId(userId, null, null, school.getDeptId()).getData(); + if (Objects.isNull(eduStaff)) { + log.error("职工信息错误, userId: {}, schoolId: {}", userId, school.getDeptId()); + return; + } + String name = userDetail.getStr("name"); + eduStaff.setName(name); + // 职位 + eduStaff.setPosition(userDetail.getStr("position")); + + // 成员部门信息 + JSONArray departmentList = userDetail.getJSONArray("department"); + JSONArray leaderInDept = userDetail.getJSONArray("is_leader_in_dept"); + // 主部门信息 + String mainDepartment = userDetail.getStr("main_department"); + if (ArrayUtil.isNotEmpty(departmentList)) { + List staffDeptList = new ArrayList<>(); + for (int i = 0; i < departmentList.size(); i++) { + // 部门id + String deptId = String.valueOf(departmentList.get(i)); + // 成员的每个部门信息 + EduStaffDept staffDept = new EduStaffDept(); + staffDept.setStaffName(eduStaff.getName()); + staffDept.setDeptWxId(Long.valueOf(deptId)); + Dept sysDept = ("1".equals(deptId) + ? school + : deptService.getSysDeptByDeptAndWx(Collections.singletonList(school.getDeptId()), staffDept.getDeptWxId())); + staffDept.setDeptId(sysDept.getDeptId()); + staffDept.setDeptName(sysDept.getDeptName()); + staffDept.setIsLeader(Integer.valueOf(String.valueOf(leaderInDept.get(i)))); + staffDept.setIsMain(ObjectUtil.equal(mainDepartment, deptId) ? 0 : 1); + staffDeptList.add(staffDept); + } + eduStaff.setStaffDept(staffDeptList); + } + remoteTeacherService.saveStaffBySchoolAndWx(eduStaff); + } } diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/QywxServiceProviderServiceImpl.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/QywxServiceProviderServiceImpl.java new file mode 100644 index 0000000..28f43bf --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/QywxServiceProviderServiceImpl.java @@ -0,0 +1,371 @@ +package com.yida.data.system.service.impl; + +import cc.mrbird.febs.common.redis.service.RedisService; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.thread.ThreadUtil; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.yida.data.common.core.entity.constant.AppConstant; +import com.yida.data.common.core.entity.constant.CachePrefixConstant; +import com.yida.data.common.core.entity.constant.QywxConstant; +import com.yida.data.common.core.entity.constant.QywxServiceProviderConstant; +import com.yida.data.common.core.entity.notice.qywx.BaseStaffNotice; +import com.yida.data.common.core.entity.notice.qywx.inside.Text; +import com.yida.data.common.core.entity.system.*; +import com.yida.data.common.core.entity.user.EduStaff; +import com.yida.data.common.core.enums.QywxAppTypeEnum; +import com.yida.data.common.core.utils.WxServiceProviderUtil; +import com.yida.data.common.core.utils.WxUtil; +import com.yida.data.common.service.CommonService; +import com.yida.data.system.service.*; +import com.yida.data.user.feign.RemoteStaffService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; + +import java.util.Objects; + +/** + * 企业微信服务商处理方法service + * + * @author ZYJ + * @date 2022/11/3 + */ +@Slf4j +@Service +@RequiredArgsConstructor +@Transactional(rollbackFor = Exception.class) +public class QywxServiceProviderServiceImpl implements QywxServiceProviderService { + + private final QywxService qywxService; + private final IDeptService deptService; + private final EduAppService eduAppService; + private final EduQywxServiceProviderService eduQywxServiceProviderService; + private final EduQywxServiceProviderSchoolService eduQywxServiceProviderSchoolService; + + private final WxUtil wxUtil; + private final RedisService redisService; + private final CommonService commonService; + private final WxServiceProviderUtil wxServiceProviderUtil; + + private final RemoteStaffService remoteStaffService; + + @Value("${febs.authRedirectUrl}") + private String authRedirectUrl; + + @Override + public void installTemplateApp(String suiteId, String authCode, EduQywxServiceProvider serviceProvider) { + Object oSuiteTicket = redisService.get(QywxServiceProviderConstant.SERVICE_SUITE_TICKET + suiteId); + if (Objects.isNull(oSuiteTicket)) { + log.error("安装授权应用失败, suiteId: {}, authCode: {}", suiteId, authCode); + return; + } + // 处理授权的企业微信信息 + handleAuthQywx(suiteId, authCode, String.valueOf(oSuiteTicket), serviceProvider); + } + + /** + * 处理授权的企业微信信息 + */ + @Async + public void handleAuthQywx(String suiteId, String authCode, String suiteTicket, EduQywxServiceProvider serviceProvider) { + // 获取应用模板信息 + EduAppTemplate appTemplate = commonService.getAppTemplateByTemplateId(suiteId, serviceProvider.getCorpId()); + // 获取第三方应用凭证 + String suiteAccessToken = wxServiceProviderUtil.getSuiteAccessToken(appTemplate.getTemplateId(), + appTemplate.getTemplateSecret(), suiteTicket); + // 获取企业永久授权码 + JSONObject jsonObject = wxServiceProviderUtil.getPermanentCode(suiteAccessToken, authCode); + // 获取授权企业微信id密文 + String authCorpId = jsonObject.getJSONObject("auth_corp_info").getStr("corpid"); + // 获取企业微信信息 +// EduQywxServiceProviderSchool providerSchool = (EduQywxServiceProviderSchool) redisService.hget(QywxServiceProviderConstant.PROVIDER_SCHOOL_CORP_DATA, serviceProvider.getCorpId() + "." + authCorpId); + EduQywxServiceProviderSchool providerSchool = commonService.getCorpByEncryptionData(serviceProvider.getCorpId(), authCorpId); + log.info("匹配的corpId信息: {}", providerSchool); + // 查询对应的部门信息 + Dept dept = deptService.getOne(Wrappers.lambdaQuery(new Dept()).eq(Dept::getCorpId, providerSchool.getDeptOriginalCorpId())); + // 生成企业应用信息 + EduApp eduApp = new EduApp(); + eduApp.setDeptId(dept.getDeptId()); + eduApp.setName(appTemplate.getTemplateName()); + eduApp.setCode(appTemplate.getTemplateCode()); + eduApp.setWxCorpId(dept.getCorpId()); + eduApp.setAppType(QywxAppTypeEnum.SERVICE_PROVIDER_APPLICATION_TYPE.getType()); + eduApp.setTemplateId(appTemplate.getTemplateId()); + eduApp.setWxSecret(jsonObject.getStr("permanent_code")); + eduApp.setServiceCorpId(serviceProvider.getCorpId()); + // 应用信息 + JSONArray agentArray = jsonObject.getJSONObject("auth_info").getJSONArray("agent"); + if (CollUtil.isNotEmpty(agentArray)) { + Object object = agentArray.get(0); + JSONObject obj = JSONUtil.parseObj(object); + eduApp.setWxAgentId(obj.getStr("agentid")); + } + eduAppService.save(eduApp); + } + + @Override + public void handleTemplateSuiteTicket(String suiteId, String suiteTicket) { + redisService.set(QywxServiceProviderConstant.SERVICE_SUITE_TICKET + suiteId, suiteTicket); + } + + @Override + public void deleteTemplateApp(String suiteId, String authCorpId, EduQywxServiceProvider serviceProvider) { + // 获取企业微信信息 +// EduQywxServiceProviderSchool providerSchool = (EduQywxServiceProviderSchool) redisService.hget(QywxServiceProviderConstant.PROVIDER_SCHOOL_CORP_DATA, serviceProvider.getCorpId() + "." + authCorpId); + EduQywxServiceProviderSchool providerSchool = commonService.getCorpByEncryptionData(serviceProvider.getCorpId(), authCorpId); + // 查询对应的部门信息 + Dept dept = deptService.getOne(Wrappers.lambdaQuery(new Dept()).eq(Dept::getCorpId, providerSchool.getDeptOriginalCorpId())); + // 查询对应应用信息 + EduApp eduApp = eduAppService.getOne(Wrappers.lambdaQuery(new EduApp()) + .eq(EduApp::getDeptId, dept.getDeptId()) + .eq(EduApp::getWxCorpId, dept.getCorpId()) + .eq(EduApp::getTemplateId, suiteId)); + // 删除对应应用 + eduAppService.removeById(eduApp.getId()); + redisService.hdel(CachePrefixConstant.SYS_APP + dept.getDeptId(), eduApp.getCode()); + } + + @Override + public void resetTemplateAppAuthCode(String suiteId, String resetAuthCode, EduQywxServiceProvider serviceProvider) { + Object oSuiteTicket = redisService.get(QywxServiceProviderConstant.SERVICE_SUITE_TICKET + suiteId); + // 获取应用模板信息 + EduAppTemplate appTemplate = commonService.getAppTemplateByTemplateId(suiteId, serviceProvider.getCorpId()); + // 获取第三方应用凭证 + String suiteAccessToken = wxServiceProviderUtil.getSuiteAccessToken(appTemplate.getTemplateId(), + appTemplate.getTemplateSecret(), String.valueOf(oSuiteTicket)); + // 获取企业永久授权码 + JSONObject jsonObject = wxServiceProviderUtil.getPermanentCode(suiteAccessToken, resetAuthCode); + // 获取授权企业微信id密文 + String authCorpId = jsonObject.getJSONObject("auth_corp_info").getStr("corpid"); + // 获取企业微信信息 +// EduQywxServiceProviderSchool providerSchool = (EduQywxServiceProviderSchool) redisService.hget(QywxServiceProviderConstant.PROVIDER_SCHOOL_CORP_DATA, serviceProvider.getCorpId() + "." + authCorpId); + EduQywxServiceProviderSchool providerSchool = commonService.getCorpByEncryptionData(serviceProvider.getCorpId(), authCorpId); + + eduAppService.update(Wrappers.lambdaUpdate(new EduApp()) + .eq(EduApp::getWxCorpId, providerSchool.getDeptOriginalCorpId()) + .eq(EduApp::getTemplateId, suiteId) + .set(EduApp::getWxSecret, jsonObject.getStr("permanent_code"))); + + // 查询对应的部门信息 + Dept dept = deptService.getOne(Wrappers.lambdaQuery(new Dept()).eq(Dept::getCorpId, providerSchool.getDeptOriginalCorpId())); + // 处理应用缓存 + EduApp eduApp = eduAppService.getOne(Wrappers.lambdaQuery(new EduApp()) + .eq(EduApp::getDeptId, dept.getDeptId()) + .eq(EduApp::getWxCorpId, dept.getCorpId()) + .eq(EduApp::getTemplateId, suiteId)); + redisService.hset(CachePrefixConstant.SYS_APP + dept.getDeptId(), eduApp.getCode(), eduApp); + } + + @Override + public void handleConcat(Element root, EduQywxServiceProvider serviceProvider, String suiteId) { + // 授权企业加密corpId + NodeList nodeListAuthCorpId = root.getElementsByTagName("AuthCorpId"); + String authCorpId = nodeListAuthCorpId.item(0).getTextContent(); + // 获取企业微信信息 + EduQywxServiceProviderSchool providerSchool = commonService.getCorpByEncryptionData(serviceProvider.getCorpId(), authCorpId); + + // 查询对应的学校信息 + Dept school = deptService.getOne(Wrappers.lambdaQuery(new Dept()) + .eq(Dept::getCorpId, providerSchool.getDeptOriginalCorpId())); + // 此处获取对应学校通讯录(人力资源)应用 + EduApp app = commonService.getAppByCodeAndSchool(AppConstant.CONTACT_SELECT, null, school.getDeptId()); + + // 操作通讯录人员 + String userId = null; + if (root.getElementsByTagName("UserID").getLength() != 0) { + userId = root.getElementsByTagName("UserID").item(0).getTextContent(); + } + + // 操作通讯录部门 + String deptId = null; + String deptParentId = null; + if (root.getElementsByTagName("Id").getLength() != 0) { + deptId = root.getElementsByTagName("Id").item(0).getTextContent(); + } + if (root.getElementsByTagName("ParentId").getLength() != 0) { + deptParentId = root.getElementsByTagName("ParentId").item(0).getTextContent(); + } + + // 获取修改类型 + NodeList nodeListChangeType = root.getElementsByTagName("ChangeType"); + String changeType = nodeListChangeType.item(0).getTextContent(); + switch (changeType) { + case QywxConstant.USER_CREATE_TYPE: + // 查询用户数据是否已存在 + EduStaff eduStaff = remoteStaffService.getStaffByWxOrMobileOrOpenId(userId, null, null, school.getDeptId()).getData(); + if (Objects.nonNull(eduStaff)) { + break; + } + String authUrl = commonService.setAuthUrl(school.getCorpId(), authRedirectUrl + "?schoolId=" + school.getDeptId(), app.getWxAgentId()); + // 发送授权消息给创建人员 + BaseStaffNotice textSchoolNotice = new BaseStaffNotice(); + Text text = new Text(); + textSchoolNotice.setText(text); + textSchoolNotice.setAgentid(app.getWxAgentId()); + text.setContent("智慧校园系统信息授权:请点击授权(请务必授权手机号!)"); + textSchoolNotice.setTouser(userId); + wxUtil.pushStaffNotice(wxUtil.getAccessToken(app.getWxCorpId(), app.getWxSecret()), textSchoolNotice); + break; + case QywxConstant.USER_UPDATE_TYPE: + // 仅在成员修改部门时回调 +// qywxService.updateUserInfo(userId, school, app); + break; + case QywxConstant.USER_DELETE_TYPE: + qywxService.deleteUser(userId, school.getDeptId()); + break; + case QywxConstant.DEPT_CREATE_TYPE: + // 获取单个部门详情 + JSONObject deptInfo = wxUtil.getDeptInfo(wxUtil.getAccessToken(app.getWxCorpId(), app.getWxSecret()), deptId); + String deptName = deptInfo.get("name").toString(); + String order = deptInfo.get("order").toString(); + qywxService.createDept(deptId, deptName, deptParentId, order, school); + break; + case QywxConstant.DEPT_UPDATE_TYPE: + // 仅在变更父部门时回调,且部门属性仅回调Id/ParentId两个字段 + // 获取单个部门详情 +// JSONObject updateDeptInfo = wxUtil.getDeptInfo(wxUtil.getAccessToken(app.getWxCorpId(), app.getWxSecret()), deptId); +// qywxService.updateDept(deptId, updateDeptInfo.get("name").toString(), deptParentId, school.getDeptId()); + break; + case QywxConstant.DEPT_DELETE_TYPE: + qywxService.deleteDept(deptId, school.getDeptId()); + break; + default: + break; + } + } + + @Override + public void handleConcat(Element root, EduQywxServiceProviderSchool providerSchool) { + // 查询对应的学校信息 + Dept school = deptService.getOne(Wrappers.lambdaQuery(new Dept()) + .eq(Dept::getCorpId, providerSchool.getDeptOriginalCorpId())); + // 此处获取对应学校通讯录(人力资源)应用 + EduApp app = commonService.getAppByCodeAndSchool(AppConstant.CONTACT_SELECT, null, school.getDeptId()); + + // 操作通讯录人员 + String userId = null; + if (root.getElementsByTagName("UserID").getLength() != 0) { + userId = root.getElementsByTagName("UserID").item(0).getTextContent(); + } + + // 操作通讯录部门 + String deptId = null; + String deptParentId = null; + if (root.getElementsByTagName("Id").getLength() != 0) { + deptId = root.getElementsByTagName("Id").item(0).getTextContent(); + } + if (root.getElementsByTagName("ParentId").getLength() != 0) { + deptParentId = root.getElementsByTagName("ParentId").item(0).getTextContent(); + } + // 获取修改类型 + NodeList nodeListChangeType = root.getElementsByTagName("ChangeType"); + String changeType = nodeListChangeType.item(0).getTextContent(); + switch (changeType) { + case QywxConstant.USER_UPDATE_TYPE: + // 仅在成员修改部门时回调 + qywxService.updateUserInfo(userId, school, app); + break; + case QywxConstant.DEPT_UPDATE_TYPE: + // 仅在变更父部门时回调,且部门属性仅回调Id/ParentId两个字段 + // 获取单个部门详情 + JSONObject updateDeptInfo = wxUtil.getDeptInfo(wxUtil.getAccessToken(app.getWxCorpId(), app.getWxSecret()), deptId); + qywxService.updateDept(deptId, updateDeptInfo.get("name").toString(), deptParentId, school.getDeptId()); + break; + default: + break; + } + } + + @Override + public void handleSchoolConcat(Element root, EduQywxServiceProviderSchool providerSchool, Dept school) { + // 获取修改类型 + NodeList nodeListChangeType = root.getElementsByTagName("ChangeType"); + String changeType = nodeListChangeType.item(0).getTextContent(); + // 此处获取对应学校家校通讯录应用 + EduApp app = commonService.getAppByCodeAndSchool(AppConstant.CONTACT_SCHOOL, null, school.getDeptId()); + String id = root.getElementsByTagName("Id").item(0).getTextContent(); + // 学校对应corpId + String corpId = providerSchool.getDeptOriginalCorpId(); + + switch (changeType) { + case QywxConstant.SCHOOL_DEPT_CREATE_TYPE: + qywxService.createSchoolDept(corpId, wxUtil.getAccessToken(app.getWxCorpId(), + app.getWxSecret()), Long.valueOf(id), school); + break; + case QywxConstant.SCHOOL_DEPT_UPDATE_TYPE: + qywxService.updateSchoolDept(wxUtil.getAccessToken(app.getWxCorpId(), + app.getWxSecret()), Long.valueOf(id), school); + break; + case QywxConstant.SCHOOL_DEPT_DELETE_TYPE: + qywxService.deleteSchoolDept(Long.valueOf(id), school); + break; + case QywxConstant.STUDENT_CREATE_TYPE: + case QywxConstant.STUDENT_UPDATE_TYPE: + // 判断是否为修改学生唯一键. 修改id会返回NewId字段作为唯一键 + if (root.getElementsByTagName("NewId").getLength() != 0) { + id = root.getElementsByTagName("NewId").item(0).getTextContent(); + } + qywxService.changeStudent(wxUtil.getAccessToken(app.getWxCorpId(), + app.getWxSecret()), id, school); + break; + case QywxConstant.STUDENT_DELETE_TYPE: + qywxService.deleteStudent(id, school.getDeptId()); + break; + case QywxConstant.PARENT_CREATE_TYPE: + // 新增家长可能是创建学生时创建,等待2s确保学生创建完成 + ThreadUtil.sleep(2000); + case QywxConstant.PARENT_UPDATE_TYPE: + qywxService.updateParent(wxUtil.getAccessToken(app.getWxCorpId(), + app.getWxSecret()), id, school.getDeptId()); + break; + case QywxConstant.PARENT_DELETE_TYPE: + qywxService.deleteParent(id, school.getDeptId()); + break; + case QywxConstant.PARENT_SUBSCRIBE_TYPE: + log.info("进入家长关注事件回调"); + // 调用家长关注发送通知方法 + qywxService.sendParentSubscribeMessage(id, school.getDeptId()); + break; + case QywxConstant.PARENT_UNSUBSCRIBE_TYPE: + log.info("进入家长取消关注事件回调"); + break; + default: + break; + } + } + + @Override + public void changeCorpId(String providerCorpId, String corpId) { + // 查询是否有关联数据 + EduQywxServiceProviderSchool providerSchool = eduQywxServiceProviderSchoolService.getOne(Wrappers.lambdaQuery(new EduQywxServiceProviderSchool()) + .eq(EduQywxServiceProviderSchool::getProviderCorpId, providerCorpId) + .eq(EduQywxServiceProviderSchool::getDeptOriginalCorpId, corpId)); + if (Objects.isNull(providerSchool)) { + providerSchool = new EduQywxServiceProviderSchool(); + providerSchool.setProviderCorpId(providerCorpId); + providerSchool.setDeptOriginalCorpId(corpId); + + EduQywxServiceProvider provider = eduQywxServiceProviderService.getOne(Wrappers.lambdaQuery(new EduQywxServiceProvider()) + .eq(EduQywxServiceProvider::getCorpId, providerCorpId)); + + // 转换corpId + String providerToken = wxServiceProviderUtil.getProviderToken(provider.getCorpId(), provider.getServiceProviderSecret()); + String convertCorpId = wxServiceProviderUtil.convertCorpId(providerToken, corpId); + providerSchool.setDeptEncryptionCorpId(convertCorpId); + eduQywxServiceProviderSchoolService.save(providerSchool); + + redisService.hset(QywxServiceProviderConstant.PROVIDER_SCHOOL_CORP_DATA, + provider.getCorpId() + "." + providerSchool.getDeptEncryptionCorpId(), providerSchool); + redisService.hset(QywxServiceProviderConstant.PROVIDER_SCHOOL_CORP_ORIGINAL_DATA, + provider.getCorpId() + "." + providerSchool.getDeptOriginalCorpId(), providerSchool); + } + } +} diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/RoleServiceImpl.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/RoleServiceImpl.java index 670bbf8..b1fc92e 100644 --- a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/RoleServiceImpl.java +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/RoleServiceImpl.java @@ -69,7 +69,7 @@ public class RoleServiceImpl extends ServiceImpl implements IR } else { // 查询下级部门信息 List childIdList = this.deptService.findListByParent(Collections.singletonList(currentUser.getDeptId()), 0) - .stream().map(Dept::getDeptId).collect(Collectors.toList()); + .stream().map(Dept::getDeptId).collect(Collectors.toList()); // 查询自己创建的角色+当前登陆账号部门以下的角色 return this.baseMapper.findRoleCheckPage(page, role, childIdList, currentUser); } @@ -90,7 +90,7 @@ public class RoleServiceImpl extends ServiceImpl implements IR if (!RoleEnum.ROLE_ADMIN.equals(roleEnum)) { // 查询下级部门信息 List childIdList = this.deptService.findListByParent(Collections.singletonList(currentUser.getDeptId()), 0) - .stream().map(Dept::getDeptId).collect(Collectors.toList()); + .stream().map(Dept::getDeptId).collect(Collectors.toList()); // 学校、教育局、代理商及以下具有创建账号的数据 自己创建的角色+当前登陆账号部门以下的角色 if (CollectionUtils.isNotEmpty(childIdList)) { queryWrapper.in(Role::getCreateDeptId, childIdList).or(); @@ -142,6 +142,9 @@ public class RoleServiceImpl extends ServiceImpl implements IR String[] menuIds = StringUtils.splitByWholeSeparatorPreserveAllTokens(role.getMenuIds(), StringConstant.COMMA); setRoleMenus(role, menuIds); } + + //TODO 变更用户对应菜单权限 + } @Override diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/SystemUserMenuServiceImpl.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/SystemUserMenuServiceImpl.java index 76d60d1..6ff3d25 100644 --- a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/SystemUserMenuServiceImpl.java +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/SystemUserMenuServiceImpl.java @@ -1,21 +1,28 @@ package com.yida.data.system.service.impl; +import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.system.Menu; +import com.yida.data.common.core.entity.system.SystemUser; import com.yida.data.common.core.entity.system.SystemUserMenu; +import com.yida.data.common.core.enums.system.MenuShowType; import com.yida.data.system.dto.MenuForUserDTO; +import com.yida.data.system.mapper.MenuMapper; import com.yida.data.system.mapper.SystemUserMenuMapper; +import com.yida.data.system.mapper.UserMapper; import com.yida.data.system.service.IMenuService; import com.yida.data.system.service.SystemUserMenuService; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.stream.Collectors; +import javax.annotation.Resource; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import javax.annotation.Resource; -import java.util.ArrayList; -import java.util.List; - /** * @author ccl */ @@ -23,18 +30,43 @@ import java.util.List; @Service("systemUserMenuService") @RequiredArgsConstructor @Transactional(rollbackFor = Exception.class) -public class SystemUserMenuServiceImpl extends ServiceImpl implements SystemUserMenuService { +public class SystemUserMenuServiceImpl extends ServiceImpl implements + SystemUserMenuService { @Resource private IMenuService menuService; + private final UserMapper userMapper; + private final MenuMapper menuMapper; + @Override public void saveUserMenu(MenuForUserDTO dto) { + + // 查询用户信息 + SystemUser systemUser = userMapper.selectById(dto.getUserId()); + // 查询用户角色权限信息 + List menuList = menuMapper.findUserPermissions(systemUser.getUsername()); + // 用户角色权限id信息 + List roleMenuIds = menuList.stream().map(Menu::getMenuId).collect(Collectors.toList()); + Collection all = CollUtil.unionAll(roleMenuIds, dto.getMenuId()); + // 需要添加的 + List addMenuIds = all.stream().filter(x -> !roleMenuIds.contains(x)).collect(Collectors.toList()); + // 需要删除的 + List removeMenuIds = all.stream().filter(x -> !dto.getMenuId().contains(x)).collect(Collectors.toList()); + // 保存数据 List menus = new ArrayList<>(); - for (Long menuId : dto.getMenuId()) { + for (Long menuId : addMenuIds) { SystemUserMenu systemUserMenu = new SystemUserMenu(); systemUserMenu.setMenuId(menuId); systemUserMenu.setUserId(dto.getUserId()); + systemUserMenu.setType(MenuShowType.ADD_TYPE.getType()); + menus.add(systemUserMenu); + } + for (Long menuId : removeMenuIds) { + SystemUserMenu systemUserMenu = new SystemUserMenu(); + systemUserMenu.setMenuId(menuId); + systemUserMenu.setUserId(dto.getUserId()); + systemUserMenu.setType(MenuShowType.REMOVE_TYPE.getType()); menus.add(systemUserMenu); } saveBatch(menus); @@ -43,18 +75,23 @@ public class SystemUserMenuServiceImpl extends ServiceImpl findUserMenu(Long userId) { - List userMenuList = list(Wrappers.lambdaQuery(new SystemUserMenu()) - .eq(SystemUserMenu::getUserId, userId)); - List menuIds = new ArrayList<>(); - for (SystemUserMenu systemUserMenu : userMenuList) { - menuIds.add(systemUserMenu.getMenuId()); + SystemUser systemUser = userMapper.selectById(userId); + List menuIds = menuMapper.findUserPermissions(systemUser.getUsername()).stream().map(Menu::getMenuId) + .collect(Collectors.toList()); + List userMenuList = list( + Wrappers.lambdaQuery(new SystemUserMenu()).eq(SystemUserMenu::getUserId, userId)); + for (Long excludeMenuId : userMenuList.stream().filter(x -> x.getType() == 1).map(SystemUserMenu::getMenuId) + .collect(Collectors.toList())) { + menuIds.remove(excludeMenuId); } + menuIds.addAll( + userMenuList.stream().filter(x -> x.getType() == 0).map(SystemUserMenu::getMenuId).collect(Collectors.toList())); return menuIds; } } diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/UPayConfigServiceImpl.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/UPayConfigServiceImpl.java new file mode 100644 index 0000000..795ccd7 --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/UPayConfigServiceImpl.java @@ -0,0 +1,25 @@ +package com.yida.data.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.system.UPayConfig; +import com.yida.data.system.mapper.UPayConfigMapper; +import com.yida.data.system.service.UPayConfigService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * 收钱吧学校信息配置Service实现 + * + * @author ZYJ + * @date 2023-03-20 17:53:13 + */ +@Slf4j +@Service +@RequiredArgsConstructor +@Transactional(rollbackFor = Exception.class) +public class UPayConfigServiceImpl extends ServiceImpl + implements UPayConfigService { + +} diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/UserServiceImpl.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/UserServiceImpl.java index 1f84b86..756f800 100644 --- a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/UserServiceImpl.java +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/UserServiceImpl.java @@ -3,7 +3,10 @@ package com.yida.data.system.service.impl; import cc.mrbird.febs.common.redis.service.RedisService; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -16,14 +19,18 @@ import com.yida.data.common.core.common.ResultBean; import com.yida.data.common.core.common.ResultMsgType; import com.yida.data.common.core.entity.CurrentUser; import com.yida.data.common.core.entity.QueryRequest; +import com.yida.data.common.core.entity.constant.AppConstant; import com.yida.data.common.core.entity.constant.CachePrefixConstant; import com.yida.data.common.core.entity.constant.FebsConstant; import com.yida.data.common.core.entity.constant.StringConstant; import com.yida.data.common.core.entity.school.EduYidaAppAccount; import com.yida.data.common.core.entity.system.*; import com.yida.data.common.core.entity.system.enums.RoleEnum; +import com.yida.data.common.core.entity.user.EduStaff; +import com.yida.data.common.core.entity.user.EduStaffDept; import com.yida.data.common.core.exception.FebsException; import com.yida.data.common.core.utils.*; +import com.yida.data.common.service.CommonService; import com.yida.data.rabbit.util.RabbitUtil; import com.yida.data.system.dto.MenuForUserDTO; import com.yida.data.system.dto.SchoolAdminAccountSaveDTO; @@ -33,6 +40,8 @@ import com.yida.data.system.mapper.RoleMapper; import com.yida.data.system.mapper.UserMapper; import com.yida.data.system.service.*; import com.yida.data.system.vo.SchoolAdminAccountSelectPageVO; +import com.yida.data.user.feign.RemoteStaffService; +import com.yida.data.user.feign.RemoteTeacherService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -60,13 +69,20 @@ public class UserServiceImpl extends ServiceImpl impleme private final IUserRoleService userRoleService; private final IUserDataPermissionService userDataPermissionService; private final PasswordEncoder passwordEncoder; - private final RemoteAuthService remoteAuthService; private final IRoleService roleService; - private final RedisService redisService; private final EduAppAccountService eduAppAccountService; private final EduYidaAppMapper eduYidaAppMapper; + + private final RemoteAuthService remoteAuthService; + private final RemoteStaffService remoteStaffService; + private final RemoteTeacherService remoteTeacherService; + + private final WxUtil wxUtil; private final RabbitUtil rabbitUtil; + private final RedisService redisService; + private final CommonService commonService; + private final static String AUTH_CLIENT_ID = "febs"; @Lazy @Resource @@ -77,6 +93,11 @@ public class UserServiceImpl extends ServiceImpl impleme return this.baseMapper.findUserByUsername(username); } + @Override + public SystemUser findByMobile(String mobile) { + return baseMapper.findUserByMobile(mobile); + } + @Override public IPage findUserDetailList(SystemUser user, QueryRequest request) { Page page = new Page<>(request.getPageNum(), request.getPageSize()); @@ -210,18 +231,18 @@ public class UserServiceImpl extends ServiceImpl impleme if (ArrayUtil.isNotEmpty(deptIds)) { setUserDataPermissions(user, deptIds); } - // 保存用户对应菜单 - String[] roles = StringUtils.splitByWholeSeparatorPreserveAllTokens(user.getRoleId(), StringConstant.COMMA); - List list = Arrays.asList(roles); - List menuId = baseMapper.findRoleId(list); - List userMenuList = new ArrayList<>(); - for (Long aLong : menuId) { - SystemUserMenu systemUserMenu = new SystemUserMenu(); - systemUserMenu.setUserId(user.getUserId()); - systemUserMenu.setMenuId(aLong); - userMenuList.add(systemUserMenu); - } - systemUserMenuService.saveBatch(userMenuList); +// // 保存用户对应菜单 +// String[] roles = StringUtils.splitByWholeSeparatorPreserveAllTokens(user.getRoleId(), StringConstant.COMMA); +// List list = Arrays.asList(roles); +// List menuId = baseMapper.findRoleId(list); +// List userMenuList = new ArrayList<>(); +// for (Long aLong : menuId) { +// SystemUserMenu systemUserMenu = new SystemUserMenu(); +// systemUserMenu.setUserId(user.getUserId()); +// systemUserMenu.setMenuId(aLong); +// userMenuList.add(systemUserMenu); +// } +// systemUserMenuService.saveBatch(userMenuList); return user; } @@ -259,16 +280,16 @@ public class UserServiceImpl extends ServiceImpl impleme // 删除用户对应权限数据 systemUserMenuService.remove(Wrappers.lambdaQuery(new SystemUserMenu()) .in(SystemUserMenu::getUserId, user.getUserId())); - // 保存用户对应权限数据 - List menuId = baseMapper.findRoleId(Arrays.asList(roles)); - List userMenuList = new ArrayList<>(); - for (Long aLong : menuId) { - SystemUserMenu systemUserMenu = new SystemUserMenu(); - systemUserMenu.setUserId(user.getUserId()); - systemUserMenu.setMenuId(aLong); - userMenuList.add(systemUserMenu); - } - systemUserMenuService.saveBatch(userMenuList); +// // 保存用户对应权限数据 +// List menuId = baseMapper.findRoleId(Arrays.asList(roles)); +// List userMenuList = new ArrayList<>(); +// for (Long aLong : menuId) { +// SystemUserMenu systemUserMenu = new SystemUserMenu(); +// systemUserMenu.setUserId(user.getUserId()); +// systemUserMenu.setMenuId(aLong); +// userMenuList.add(systemUserMenu); +// } +// systemUserMenuService.saveBatch(userMenuList); } @Override @@ -515,5 +536,104 @@ public class UserServiceImpl extends ServiceImpl impleme userRoleService.saveBatch(saveList); } } + + @Override + public void createStaff(Long schoolId, String code) { + // 学校信息 + Dept school = deptService.getById(schoolId); + // 此处获取对应学校通讯录(人力资源)应用 + EduApp app = commonService.getAppByCodeAndSchool(AppConstant.CONTACT_SELECT, null, schoolId); + // 获取access token + String accessToken = wxUtil.getAccessToken(school.getCorpId(), app.getWxSecret()); + // 获取访问用户身份 + JSONObject userInfo = wxUtil.getUserInfo(accessToken, code); + // 获取访问用户敏感信息 + JSONObject sensitiveInfo = wxUtil.getUserSensitiveInfo(accessToken, userInfo.getStr("user_ticket")); + String mobile = sensitiveInfo.getStr("mobile"); + if (StrUtil.isEmpty(mobile)) { + throw new FebsException("请授权手机号码!"); + } + // 成员UserID + String userId = sensitiveInfo.getStr("userid"); + // 查询用户详细信息 + JSONObject userDetail = wxUtil.getUserDetail(wxUtil.getAccessToken(app.getWxCorpId(), app.getWxSecret()), userId); + String name = userDetail.getStr("name"); + String avatar = sensitiveInfo.getStr("avatar"); + String email = sensitiveInfo.getStr("email"); + // 企业微信性别 0表示未定义,1表示男性,2表示女性 + String gender = sensitiveInfo.getStr("gender"); + // 主部门信息 + String mainDepartment = userDetail.getStr("main_department"); + + // 查询是否有职工数据 +// EduStaff eduStaff = remoteStaffService.getStaffByWxOrMobileOrOpenId(userId, null, null, school.getDeptId()).getData(); + EduStaff eduStaff = remoteStaffService.getStaffByWxOrMobileOrOpenId(null, mobile, null, school.getDeptId()).getData(); + if (Objects.isNull(eduStaff)) { + eduStaff = new EduStaff(); + eduStaff.setName(name); + eduStaff.setMobile(mobile); + eduStaff.setAvatar(avatar); + eduStaff.setEmail(email); + eduStaff.setSex("1".equals(gender) ? "0" : "2".equals(gender) ? "1" : "2"); + eduStaff.setWxId(userId); + eduStaff.setSchoolId(school.getDeptId()); + eduStaff.setSchoolName(school.getDeptName()); + eduStaff.setPosition(userDetail.getStr("position")); + } else { + // 修改不创建到企业微信的职工数据 + if (eduStaff.getWxPath() == 1) { + // 修改手机号码、用户id + eduStaff.setWxId(userId); + eduStaff.setWxPath(0); + } + } + + // 判断是否存在登录用户信息 + SystemUser user = findUserDetail(mobile); + if (user == null) { + user = new SystemUser(); + user.setAvatar(avatar); + user.setMobile(mobile); + user.setEmail(email); + user.setUsername(mobile); + user.setNickname(name); + user.setDeptId(school.getDeptId()); + user.setStatus("1"); + // 用户性别 0男, 1女, 2保密 + user.setSex("1".equals(gender) ? "0" : "2".equals(gender) ? "1" : "2"); + user.setUserOrigin(0); + user.setUserType(1); + createUser(user); + eduStaff.setYidaAppUserId(user.getYidaAppUserId()); + eduStaff.setSysUserId(user.getUserId()); + } else { + eduStaff.setSysUserId(user.getUserId()); + } + + // 成员部门信息 + JSONArray departmentList = userDetail.getJSONArray("department"); + JSONArray leaderInDept = userDetail.getJSONArray("is_leader_in_dept"); + if (ArrayUtil.isNotEmpty(departmentList)) { + List staffDeptList = new ArrayList<>(); + for (int i = 0; i < departmentList.size(); i++) { + // 部门id + String deptId = String.valueOf(departmentList.get(i)); + // 成员的每个部门信息 + EduStaffDept staffDept = new EduStaffDept(); + staffDept.setStaffName(eduStaff.getName()); + staffDept.setDeptWxId(Long.valueOf(deptId)); + Dept sysDept = ("1".equals(deptId) + ? school + : deptService.getSysDeptByDeptAndWx(Collections.singletonList(school.getDeptId()), staffDept.getDeptWxId())); + staffDept.setDeptId(sysDept.getDeptId()); + staffDept.setDeptName(sysDept.getDeptName()); + staffDept.setIsLeader(Integer.valueOf(String.valueOf(leaderInDept.get(i)))); + staffDept.setIsMain(ObjectUtil.equal(mainDepartment, deptId) ? 0 : 1); + staffDeptList.add(staffDept); + } + eduStaff.setStaffDept(staffDeptList); + } + remoteTeacherService.saveStaffBySchoolAndWx(eduStaff); + } } diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/WhiteListServiceImpl.java b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/WhiteListServiceImpl.java new file mode 100644 index 0000000..c7b1a97 --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/java/com/yida/data/system/service/impl/WhiteListServiceImpl.java @@ -0,0 +1,25 @@ +package com.yida.data.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yida.data.common.core.entity.system.WhiteList; +import com.yida.data.system.mapper.WhiteListMapper; +import com.yida.data.system.service.WhiteListService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +/** + * 白名单Service实现 + * + * @author ZYJ + * @date 2023-02-20 14:15:49 + */ +@Service +@RequiredArgsConstructor +@Transactional(propagation = Propagation.SUPPORTS, readOnly = true) +public class WhiteListServiceImpl extends ServiceImpl + implements WhiteListService { + + +} diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/resources/mapper/DeptSchoolInformationMapper.xml b/febs-server/febs-server-system/febs-server-system-biz/src/main/resources/mapper/DeptSchoolInformationMapper.xml index 2a6b617..7dabe20 100644 --- a/febs-server/febs-server-system/febs-server-system-biz/src/main/resources/mapper/DeptSchoolInformationMapper.xml +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/resources/mapper/DeptSchoolInformationMapper.xml @@ -2,277 +2,259 @@ - - - - + SELECT distinct + a.id, + a.school_id, + a.school_name, + a.school_type, + a.school_profit_nature, + a.school_ownership, + a.logo_url, + a.phone, + a.introduction, + a.shunt_situation, + a.address, + a.zip_code, + a.email, + a.student_range, + GROUP_CONCAT(DISTINCT e.nature) as school_nature + FROM + `t_dept_school_information` a + LEFT JOIN t_dept_school_relate b ON a.school_id = b.school_id + LEFT JOIN t_dept_school_student_range d ON a.id = d.dept_school_id + LEFT JOIN t_dept_school_label c on c.dept_school_id = a.id + LEFT JOIN t_dept_school_information_nature e on a.id = e.information_id + WHERE + b.del_flag = 0 + + and c.label = #{tag} + + + AND b.dept_id = #{deptId} - FIND_IN_SET( - #{item}, - GROUP_CONCAT( label ) - ) - - - - - + + and a.address like concat ('%',#{address},'%') + + + AND a.school_type = #{schoolType} + + + and e.nature = #{natureType} + + + and a.school_ownership =#{schoolOwnership} + + + AND a.school_name LIKE CONCAT('%',#{schoolName},'%') + + GROUP BY a.id + order by a.id - - + + + + + + + + diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/resources/mapper/EduBaseAppMapper.xml b/febs-server/febs-server-system/febs-server-system-biz/src/main/resources/mapper/EduBaseAppMapper.xml new file mode 100644 index 0000000..88675a7 --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/resources/mapper/EduBaseAppMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/resources/mapper/EduConsumeConfigMapper.xml b/febs-server/febs-server-system/febs-server-system-biz/src/main/resources/mapper/EduConsumeConfigMapper.xml new file mode 100644 index 0000000..254bd3c --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/resources/mapper/EduConsumeConfigMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/resources/mapper/EduDeptFunctionMapper.xml b/febs-server/febs-server-system/febs-server-system-biz/src/main/resources/mapper/EduDeptFunctionMapper.xml new file mode 100644 index 0000000..07353ff --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/resources/mapper/EduDeptFunctionMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/resources/mapper/EduSchoolInquireCommonQuestionMapper.xml b/febs-server/febs-server-system/febs-server-system-biz/src/main/resources/mapper/EduSchoolInquireCommonQuestionMapper.xml index 9c8f1cd..c1a9448 100644 --- a/febs-server/febs-server-system/febs-server-system-biz/src/main/resources/mapper/EduSchoolInquireCommonQuestionMapper.xml +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/resources/mapper/EduSchoolInquireCommonQuestionMapper.xml @@ -2,57 +2,57 @@ - - + + diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/resources/mapper/MenuMapper.xml b/febs-server/febs-server-system/febs-server-system-biz/src/main/resources/mapper/MenuMapper.xml index b9b6503..85c4fa6 100644 --- a/febs-server/febs-server-system/febs-server-system-biz/src/main/resources/mapper/MenuMapper.xml +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/resources/mapper/MenuMapper.xml @@ -1,37 +1,61 @@ - + - - + + + + + \ No newline at end of file diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/resources/mapper/UPayConfigMapper.xml b/febs-server/febs-server-system/febs-server-system-biz/src/main/resources/mapper/UPayConfigMapper.xml new file mode 100644 index 0000000..0d208ad --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/resources/mapper/UPayConfigMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/resources/mapper/UserMapper.xml b/febs-server/febs-server-system/febs-server-system-biz/src/main/resources/mapper/UserMapper.xml index 926e3b2..00ae53a 100644 --- a/febs-server/febs-server-system/febs-server-system-biz/src/main/resources/mapper/UserMapper.xml +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/resources/mapper/UserMapper.xml @@ -121,6 +121,14 @@ group by a.USER_ID + + - + - + - + diff --git a/febs-server/febs-server-system/febs-server-system-biz/src/main/resources/mapper/WhiteListMapper.xml b/febs-server/febs-server-system/febs-server-system-biz/src/main/resources/mapper/WhiteListMapper.xml new file mode 100644 index 0000000..64bf220 --- /dev/null +++ b/febs-server/febs-server-system/febs-server-system-biz/src/main/resources/mapper/WhiteListMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/febs-server/pom.xml b/febs-server/pom.xml index 429a270..a3bcc9a 100644 --- a/febs-server/pom.xml +++ b/febs-server/pom.xml @@ -18,6 +18,7 @@ febs-server-system + febs-server-generator febs-server-job edu-user edu-device @@ -27,6 +28,8 @@ edu-card-server edu-mall edu-websocket + attendance +